Mii rendering and parsing library

Compare changes

Choose any two refs to compare.

+3
.gitignore
··· 4 4 *.glb 5 5 *.charinfo 6 6 *.png 7 + *.hexproj 8 + *.rdc 7 9 .DS_Store 10 + .idea
+49 -44
Cargo.lock
··· 1425 1425 "binrw", 1426 1426 "futures", 1427 1427 "image 0.25.6", 1428 - "vee", 1428 + "vfl", 1429 1429 ] 1430 1430 1431 1431 [[package]] ··· 2660 2660 source = "registry+https://github.com/rust-lang/crates.io-index" 2661 2661 checksum = "6b46b9ca4690308844c644e7c634d68792467260e051c8543e0c7871662b3ba7" 2662 2662 dependencies = [ 2663 + "bytemuck", 2663 2664 "mint", 2664 2665 ] 2665 2666 ··· 3022 3023 ] 3023 3024 3024 3025 [[package]] 3026 + name = "image-compare" 3027 + version = "0.4.1" 3028 + source = "registry+https://github.com/rust-lang/crates.io-index" 3029 + checksum = "96cd73af13ae2e7220a1c02fe7d6bb53be50612ba7fabbb5c88e7753645f1f3c" 3030 + dependencies = [ 3031 + "image 0.25.6", 3032 + "itertools 0.12.1", 3033 + "rayon", 3034 + "thiserror 1.0.69", 3035 + ] 3036 + 3037 + [[package]] 3025 3038 name = "image-webp" 3026 3039 version = "0.2.1" 3027 3040 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3291 3304 ] 3292 3305 3293 3306 [[package]] 3307 + name = "lightweight_viewer" 3308 + version = "0.1.0" 3309 + dependencies = [ 3310 + "bytemuck", 3311 + "glam 0.30.3", 3312 + "image 0.25.6", 3313 + "nalgebra 0.33.2", 3314 + "pollster", 3315 + "vfl", 3316 + "wgpu 25.0.0", 3317 + "winit", 3318 + ] 3319 + 3320 + [[package]] 3294 3321 name = "linux-raw-sys" 3295 3322 version = "0.4.15" 3296 3323 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3465 3492 "pp-rs", 3466 3493 "rustc-hash", 3467 3494 "spirv", 3468 - "strum 0.26.3", 3495 + "strum", 3469 3496 "termcolor", 3470 3497 "thiserror 2.0.12", 3471 3498 "unicode-xid", ··· 3491 3518 "once_cell", 3492 3519 "rustc-hash", 3493 3520 "spirv", 3494 - "strum 0.26.3", 3521 + "strum", 3495 3522 "thiserror 2.0.12", 3496 3523 "unicode-ident", 3497 3524 ] ··· 4989 5016 source = "registry+https://github.com/rust-lang/crates.io-index" 4990 5017 checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 4991 5018 dependencies = [ 4992 - "strum_macros 0.26.4", 4993 - ] 4994 - 4995 - [[package]] 4996 - name = "strum" 4997 - version = "0.27.1" 4998 - source = "registry+https://github.com/rust-lang/crates.io-index" 4999 - checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" 5000 - dependencies = [ 5001 - "strum_macros 0.27.1", 5019 + "strum_macros", 5002 5020 ] 5003 5021 5004 5022 [[package]] ··· 5015 5033 ] 5016 5034 5017 5035 [[package]] 5018 - name = "strum_macros" 5019 - version = "0.27.1" 5020 - source = "registry+https://github.com/rust-lang/crates.io-index" 5021 - checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" 5022 - dependencies = [ 5023 - "heck", 5024 - "proc-macro2", 5025 - "quote", 5026 - "rustversion", 5027 - "syn 2.0.101", 5028 - ] 5029 - 5030 - [[package]] 5031 5036 name = "svg_fmt" 5032 5037 version = "0.4.5" 5033 5038 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5546 5551 checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 5547 5552 5548 5553 [[package]] 5549 - name = "vee" 5550 - version = "0.1.0" 5554 + name = "version-compare" 5555 + version = "0.2.0" 5556 + source = "registry+https://github.com/rust-lang/crates.io-index" 5557 + checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 5558 + 5559 + [[package]] 5560 + name = "version_check" 5561 + version = "0.9.5" 5562 + source = "registry+https://github.com/rust-lang/crates.io-index" 5563 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 5564 + 5565 + [[package]] 5566 + name = "vfl" 5567 + version = "0.0.1" 5551 5568 dependencies = [ 5552 5569 "binrw", 5553 5570 "bytemuck", ··· 5556 5573 "glam 0.30.3", 5557 5574 "half", 5558 5575 "image 0.25.6", 5576 + "image-compare", 5559 5577 "itertools 0.14.0", 5560 5578 "mesh-tools", 5561 5579 "mint", 5562 5580 "nalgebra 0.33.2", 5581 + "num_enum", 5563 5582 "pollster", 5564 - "strum 0.27.1", 5565 - "strum_macros 0.27.1", 5566 5583 "tegra_swizzle", 5567 5584 "texture2ddecoder", 5568 5585 "wgpu 25.0.0", 5569 5586 ] 5570 - 5571 - [[package]] 5572 - name = "version-compare" 5573 - version = "0.2.0" 5574 - source = "registry+https://github.com/rust-lang/crates.io-index" 5575 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 5576 - 5577 - [[package]] 5578 - name = "version_check" 5579 - version = "0.9.5" 5580 - source = "registry+https://github.com/rust-lang/crates.io-index" 5581 - checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 5582 5587 5583 5588 [[package]] 5584 5589 name = "walkdir" ··· 6571 6576 6572 6577 [[package]] 6573 6578 name = "winit" 6574 - version = "0.30.10" 6579 + version = "0.30.11" 6575 6580 source = "registry+https://github.com/rust-lang/crates.io-index" 6576 - checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e" 6581 + checksum = "a4409c10174df8779dc29a4788cac85ed84024ccbc1743b776b21a520ee1aaf4" 6577 6582 dependencies = [ 6578 6583 "ahash", 6579 6584 "android-activity",
+5 -5
Cargo.toml
··· 1 1 [workspace] 2 2 resolver = "2" 3 - members = [ "bevy_viewer", "vee" ] 3 + members = ["bevy_viewer", "lightweight_viewer", "vfl"] 4 4 5 5 # Enable a small amount of optimization in the dev profile. 6 - [profile.dev] 7 - opt-level = 1 6 + #[profile.dev] 7 + #opt-level = 1 8 8 9 9 # Enable a large amount of optimization in the dev profile for dependencies. 10 - [profile.dev.package."*"] 11 - opt-level = 3 10 + #[profile.dev.package."*"] 11 + #opt-level = 3
+176
LICENSE-APACHE
··· 1 + Apache License 2 + Version 2.0, January 2004 3 + http://www.apache.org/licenses/ 4 + 5 + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 + 7 + 1. Definitions. 8 + 9 + "License" shall mean the terms and conditions for use, reproduction, 10 + and distribution as defined by Sections 1 through 9 of this document. 11 + 12 + "Licensor" shall mean the copyright owner or entity authorized by 13 + the copyright owner that is granting the License. 14 + 15 + "Legal Entity" shall mean the union of the acting entity and all 16 + other entities that control, are controlled by, or are under common 17 + control with that entity. For the purposes of this definition, 18 + "control" means (i) the power, direct or indirect, to cause the 19 + direction or management of such entity, whether by contract or 20 + otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 + outstanding shares, or (iii) beneficial ownership of such entity. 22 + 23 + "You" (or "Your") shall mean an individual or Legal Entity 24 + exercising permissions granted by this License. 25 + 26 + "Source" form shall mean the preferred form for making modifications, 27 + including but not limited to software source code, documentation 28 + source, and configuration files. 29 + 30 + "Object" form shall mean any form resulting from mechanical 31 + transformation or translation of a Source form, including but 32 + not limited to compiled object code, generated documentation, 33 + and conversions to other media types. 34 + 35 + "Work" shall mean the work of authorship, whether in Source or 36 + Object form, made available under the License, as indicated by a 37 + copyright notice that is included in or attached to the work 38 + (an example is provided in the Appendix below). 39 + 40 + "Derivative Works" shall mean any work, whether in Source or Object 41 + form, that is based on (or derived from) the Work and for which the 42 + editorial revisions, annotations, elaborations, or other modifications 43 + represent, as a whole, an original work of authorship. For the purposes 44 + of this License, Derivative Works shall not include works that remain 45 + separable from, or merely link (or bind by name) to the interfaces of, 46 + the Work and Derivative Works thereof. 47 + 48 + "Contribution" shall mean any work of authorship, including 49 + the original version of the Work and any modifications or additions 50 + to that Work or Derivative Works thereof, that is intentionally 51 + submitted to Licensor for inclusion in the Work by the copyright owner 52 + or by an individual or Legal Entity authorized to submit on behalf of 53 + the copyright owner. For the purposes of this definition, "submitted" 54 + means any form of electronic, verbal, or written communication sent 55 + to the Licensor or its representatives, including but not limited to 56 + communication on electronic mailing lists, source code control systems, 57 + and issue tracking systems that are managed by, or on behalf of, the 58 + Licensor for the purpose of discussing and improving the Work, but 59 + excluding communication that is conspicuously marked or otherwise 60 + designated in writing by the copyright owner as "Not a Contribution." 61 + 62 + "Contributor" shall mean Licensor and any individual or Legal Entity 63 + on behalf of whom a Contribution has been received by Licensor and 64 + subsequently incorporated within the Work. 65 + 66 + 2. Grant of Copyright License. Subject to the terms and conditions of 67 + this License, each Contributor hereby grants to You a perpetual, 68 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 + copyright license to reproduce, prepare Derivative Works of, 70 + publicly display, publicly perform, sublicense, and distribute the 71 + Work and such Derivative Works in Source or Object form. 72 + 73 + 3. Grant of Patent License. Subject to the terms and conditions of 74 + this License, each Contributor hereby grants to You a perpetual, 75 + worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 + (except as stated in this section) patent license to make, have made, 77 + use, offer to sell, sell, import, and otherwise transfer the Work, 78 + where such license applies only to those patent claims licensable 79 + by such Contributor that are necessarily infringed by their 80 + Contribution(s) alone or by combination of their Contribution(s) 81 + with the Work to which such Contribution(s) was submitted. If You 82 + institute patent litigation against any entity (including a 83 + cross-claim or counterclaim in a lawsuit) alleging that the Work 84 + or a Contribution incorporated within the Work constitutes direct 85 + or contributory patent infringement, then any patent licenses 86 + granted to You under this License for that Work shall terminate 87 + as of the date such litigation is filed. 88 + 89 + 4. Redistribution. You may reproduce and distribute copies of the 90 + Work or Derivative Works thereof in any medium, with or without 91 + modifications, and in Source or Object form, provided that You 92 + meet the following conditions: 93 + 94 + (a) You must give any other recipients of the Work or 95 + Derivative Works a copy of this License; and 96 + 97 + (b) You must cause any modified files to carry prominent notices 98 + stating that You changed the files; and 99 + 100 + (c) You must retain, in the Source form of any Derivative Works 101 + that You distribute, all copyright, patent, trademark, and 102 + attribution notices from the Source form of the Work, 103 + excluding those notices that do not pertain to any part of 104 + the Derivative Works; and 105 + 106 + (d) If the Work includes a "NOTICE" text file as part of its 107 + distribution, then any Derivative Works that You distribute must 108 + include a readable copy of the attribution notices contained 109 + within such NOTICE file, excluding those notices that do not 110 + pertain to any part of the Derivative Works, in at least one 111 + of the following places: within a NOTICE text file distributed 112 + as part of the Derivative Works; within the Source form or 113 + documentation, if provided along with the Derivative Works; or, 114 + within a display generated by the Derivative Works, if and 115 + wherever such third-party notices normally appear. The contents 116 + of the NOTICE file are for informational purposes only and 117 + do not modify the License. You may add Your own attribution 118 + notices within Derivative Works that You distribute, alongside 119 + or as an addendum to the NOTICE text from the Work, provided 120 + that such additional attribution notices cannot be construed 121 + as modifying the License. 122 + 123 + You may add Your own copyright statement to Your modifications and 124 + may provide additional or different license terms and conditions 125 + for use, reproduction, or distribution of Your modifications, or 126 + for any such Derivative Works as a whole, provided Your use, 127 + reproduction, and distribution of the Work otherwise complies with 128 + the conditions stated in this License. 129 + 130 + 5. Submission of Contributions. Unless You explicitly state otherwise, 131 + any Contribution intentionally submitted for inclusion in the Work 132 + by You to the Licensor shall be under the terms and conditions of 133 + this License, without any additional terms or conditions. 134 + Notwithstanding the above, nothing herein shall supersede or modify 135 + the terms of any separate license agreement you may have executed 136 + with Licensor regarding such Contributions. 137 + 138 + 6. Trademarks. This License does not grant permission to use the trade 139 + names, trademarks, service marks, or product names of the Licensor, 140 + except as required for reasonable and customary use in describing the 141 + origin of the Work and reproducing the content of the NOTICE file. 142 + 143 + 7. Disclaimer of Warranty. Unless required by applicable law or 144 + agreed to in writing, Licensor provides the Work (and each 145 + Contributor provides its Contributions) on an "AS IS" BASIS, 146 + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 + implied, including, without limitation, any warranties or conditions 148 + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 + PARTICULAR PURPOSE. You are solely responsible for determining the 150 + appropriateness of using or redistributing the Work and assume any 151 + risks associated with Your exercise of permissions under this License. 152 + 153 + 8. Limitation of Liability. In no event and under no legal theory, 154 + whether in tort (including negligence), contract, or otherwise, 155 + unless required by applicable law (such as deliberate and grossly 156 + negligent acts) or agreed to in writing, shall any Contributor be 157 + liable to You for damages, including any direct, indirect, special, 158 + incidental, or consequential damages of any character arising as a 159 + result of this License or out of the use or inability to use the 160 + Work (including but not limited to damages for loss of goodwill, 161 + work stoppage, computer failure or malfunction, or any and all 162 + other commercial damages or losses), even if such Contributor 163 + has been advised of the possibility of such damages. 164 + 165 + 9. Accepting Warranty or Additional Liability. While redistributing 166 + the Work or Derivative Works thereof, You may choose to offer, 167 + and charge a fee for, acceptance of support, warranty, indemnity, 168 + or other liability obligations and/or rights consistent with this 169 + License. However, in accepting such obligations, You may act only 170 + on Your own behalf and on Your sole responsibility, not on behalf 171 + of any other Contributor, and only if You agree to indemnify, 172 + defend, and hold each Contributor harmless for any liability 173 + incurred by, or claims asserted against, such Contributor by reason 174 + of your accepting any such warranty or additional liability. 175 + 176 + END OF TERMS AND CONDITIONS
+25
LICENSE-MIT
··· 1 + Copyright (c) Jo Null 2 + 3 + Permission is hereby granted, free of charge, to any 4 + person obtaining a copy of this software and associated 5 + documentation files (the "Software"), to deal in the 6 + Software without restriction, including without 7 + limitation the rights to use, copy, modify, merge, 8 + publish, distribute, sublicense, and/or sell copies of 9 + the Software, and to permit persons to whom the Software 10 + is furnished to do so, subject to the following 11 + conditions: 12 + 13 + The above copyright notice and this permission notice 14 + shall be included in all copies or substantial portions 15 + of the Software. 16 + 17 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 18 + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 19 + TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 20 + PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 21 + SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 22 + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23 + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 24 + IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 + DEALINGS IN THE SOFTWARE.
+20 -3
README.md
··· 1 - # vee 1 + # VFL โ€” Vee Face Library 2 + 3 + Research library for replicating Mii functionality from decompilations in a more modern language & runtime. Ideally, this library will replicate functionality accurately from these targets: 4 + - Cafe (WUP) 5 + - Centrair (CTR) <sup><sub>Why did they name it after an airportโ€ฝ</sub></sup> 6 + - Nx (NX) 7 + 8 + Targets not currently aimed for: 9 + - Revolution (RFL) 10 + - Nitro (NTR) 11 + 2 12 3 - Mii library. Features are limited, currently. 13 + Features are limited, currently. 4 14 5 15 6 16 ## bevy_viewer 7 17 8 18 Setup: 9 - - Obtain `ShapeMid.dat` and place in `./vee/` 19 + - Dump shape and texture resources from your hardware and place in `./vee/` 10 20 - `cargo run` 11 21 12 22 Web build: 13 23 - Install [`wasm-server-runner`](https://github.com/jakobhellermann/wasm-server-runner) 14 24 - `cargo run --target wasm32-unknown-unknown` 25 + 26 + ## Acknowledgements 27 + - Arian Kordi @ariankordi for help and guidance through terse decompiled C++ 28 + - https://github.com/ariankordi/FFL-Testing 29 + - @aboood40091 for [FFL Decomp](https://github.com/aboood40091/ffl) 30 + - Petari team @SMGCommunity for the [RFL Decomp](https://github.com/SMGCommunity/Petari/tree/master/src/RVLFaceLib) 31 + - Probably other people too
Untitled.hexproj

This is a binary file and will not be displayed.

+2 -1
bevy_viewer/Cargo.toml
··· 2 2 name = "bevy_viewer" 3 3 version = "0.1.0" 4 4 edition = "2024" 5 + license = "MIT OR Apache-2.0" 5 6 6 7 [dependencies] 7 - vee = { path = "../vee" } 8 + vfl = { path = "../vfl", features = ["res", "draw"] } 8 9 bevy_egui = "0.34.1" 9 10 bevy = { version = "0.16.0", features = ["bevy_picking", "bevy_dev_tools"] } 10 11 binrw = "0.15.0"
+50 -8
bevy_viewer/src/char.rs
··· 1 1 use crate::load::{load_mesh, setup_image, shape_bundle, shape_tex_bundle}; 2 - use crate::{CharDataRes, load}; 2 + use crate::{CHAR_TRANSFORM, CHARINFO, CharDataRes, CharMesh, load}; 3 3 use bevy::prelude::*; 4 4 use binrw::BinRead; 5 5 use std::{fs::File, io::BufReader}; 6 - use vee::{ 6 + use vfl::color::cafe::{FACELINE_COLOR, HAIR_COLOR}; 7 + use vfl::res::shape::nx::{ResourceShape, SHAPE_MID_DAT}; 8 + use vfl::{ 7 9 charinfo::nx::NxCharInfo, 8 - shape_load::nx::Shape, 9 - tex_load::nx::{ResourceTexture, TEXTURE_MID_SRGB_DAT}, 10 + res::shape::nx::Shape, 11 + res::tex::nx::{ResourceTexture, TEXTURE_MID_SRGB_DAT}, 10 12 }; 11 13 12 14 pub fn setup_char( ··· 18 20 ) { 19 21 res.0 = Some(load::get_res().unwrap()); 20 22 21 - let mut char = File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../Jasmine.charinfo")).unwrap(); 23 + let mut char = File::open(CHARINFO).unwrap(); 22 24 23 25 let char = NxCharInfo::read(&mut char).unwrap(); 24 26 ··· 27 29 &mut meshes, 28 30 &res.0.unwrap(), 29 31 char.faceline_type as usize, 30 - 4, 32 + char.faceline_color as usize, 31 33 dbg!(Shape::FaceLine), 32 34 )); 33 35 ··· 35 37 &mut materials, 36 38 &mut meshes, 37 39 &res.0.unwrap(), 38 - char.faceline_type as usize, 39 - 4, 40 + char.hair_type as usize, 41 + char.faceline_color as usize, 40 42 dbg!(Shape::ForeheadNormal), 41 43 )); 44 + 45 + // TODO: offset nose 46 + println!("Nose needs offsetting"); 47 + 48 + let nose = false; 49 + if nose { 50 + let mut shape_file = BufReader::new(File::open(SHAPE_MID_DAT).unwrap()); 51 + let res_shape = ResourceShape::read(&mut shape_file).unwrap(); 52 + let nose_translate = 53 + res_shape.face_line_transform[char.faceline_type as usize].nose_translate; 54 + 55 + let shape_translation = vec3( 56 + nose_translate[0], 57 + 5.0 + nose_translate[1] + -1.5 * f32::from(char.glass_y), 58 + 2.0 + nose_translate[2], 59 + ); 60 + let shape_scale = 0.15 * f32::from(char.glass_scale); 61 + 62 + commands.spawn({ 63 + let materials: &mut ResMut<Assets<StandardMaterial>> = &mut materials; 64 + let meshes: &mut ResMut<Assets<Mesh>> = &mut meshes; 65 + let res: &ResourceShape = &res.0.unwrap(); 66 + let hair_num = char.nose_type as usize; 67 + let color_num = char.faceline_color as usize; 68 + let shape = dbg!(Shape::Nose); 69 + let [r, g, b, _a] = match shape { 70 + Shape::HairNormal => HAIR_COLOR[color_num], 71 + Shape::FaceLine | Shape::ForeheadNormal | Shape::Nose => FACELINE_COLOR[color_num], 72 + _ => [0.4, 0.2, 0.6, 1.0], 73 + }; 74 + 75 + ( 76 + Mesh3d(meshes.add(load_mesh(*res, shape, hair_num).unwrap())), 77 + MeshMaterial3d(materials.add(Color::srgb(r, g, b))), 78 + Transform::from_translation(shape_translation * 0.05) 79 + .with_scale(Vec3::splat(shape_scale) * 0.05), 80 + CharMesh, 81 + ) 82 + }); 83 + } 42 84 43 85 // Create and save a handle to the mesh. 44 86 // Render the mesh with the custom texture, and add the marker.
+14 -9
bevy_viewer/src/load.rs
··· 1 - use crate::CharMesh; 1 + use crate::{CHAR_TRANSFORM, CharMesh}; 2 2 use bevy::{ 3 3 asset::RenderAssetUsages, 4 4 prelude::*, ··· 7 7 use binrw::{BinRead, io::BufReader}; 8 8 use image::{DynamicImage, RgbaImage}; 9 9 use std::fs::File; 10 - use vee::{ 11 - color::cafe::HAIR_COLOR, 12 - shape_load::nx::{GenericResourceShape, ResourceShape, SHAPE_MID_DAT, Shape, ShapeData}, 10 + use vfl::{ 11 + color::cafe::{FACELINE_COLOR, HAIR_COLOR}, 12 + res::shape::nx::{GenericResourceShape, ResourceShape, SHAPE_MID_DAT, Shape, ShapeData}, 13 13 }; 14 14 15 15 fn shape_data_to_mesh(data: ShapeData) -> Mesh { ··· 55 55 mesh 56 56 } 57 57 pub fn load_mesh(res: ResourceShape, shape: Shape, hair_num: usize) -> Result<Mesh> { 58 - let GenericResourceShape::Element(mut shape) = res.fetch_shape(shape, hair_num).unwrap() else { 58 + let GenericResourceShape::Element(mut shape) = res.index_by_shape(shape, hair_num).unwrap() 59 + else { 59 60 panic!("wah") 60 61 }; 61 62 ··· 96 97 color_num: usize, 97 98 shape: Shape, 98 99 ) -> impl Bundle { 99 - let [r, g, b, _a] = HAIR_COLOR[color_num]; 100 + let [r, g, b, _a] = match shape { 101 + Shape::HairNormal => vfl::color::nx::linear::COMMON_COLOR[color_num], 102 + Shape::FaceLine | Shape::ForeheadNormal => FACELINE_COLOR[color_num], 103 + _ => [1.0, 0.0, 1.0, 1.0], 104 + }; 100 105 101 106 ( 102 107 Mesh3d(meshes.add(load_mesh(*res, shape, hair_num).unwrap())), 103 - MeshMaterial3d(materials.add(Color::srgb_from_array([r, g, b]))), 104 - Transform::from_translation(Vec3::ZERO).with_scale(Vec3::splat(0.05)), 108 + MeshMaterial3d(materials.add(Color::srgb(r, g, b))), 109 + CHAR_TRANSFORM, 105 110 CharMesh, 106 111 ) 107 112 } ··· 117 122 ( 118 123 Mesh3d(meshes.add(load_mesh(*res, shape, hair_num).unwrap())), 119 124 MeshMaterial3d(materials.add(StandardMaterial::from(tex))), 120 - Transform::from_translation(Vec3::ZERO).with_scale(Vec3::splat(0.05)), 125 + CHAR_TRANSFORM, 121 126 CharMesh, 122 127 ) 123 128 }
+14 -9
bevy_viewer/src/main.rs
··· 14 14 use char::setup_char; 15 15 use egui_blocking_plugin::{EguiBlockInputState, EguiBlockingPlugin}; 16 16 use mask::{setup_glasses, setup_mask}; 17 - use std::f32::consts::*; 18 - use vee::{ 17 + use std::{ 18 + f32::consts::*, 19 + path::{Path, PathBuf}, 20 + str::FromStr, 21 + }; 22 + use vfl::{ 19 23 color::cafe::HAIR_COLOR, 20 - shape_load::nx::{ResourceShape, Shape}, 24 + res::shape::nx::{ResourceShape, Shape}, 21 25 }; 22 26 23 27 mod char; 24 28 mod load; 25 29 mod mask; 26 30 31 + const CHARINFO: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/../soyun.charinfo"); 32 + static CHAR_TRANSFORM: Transform = Transform::from_scale(Vec3::splat(0.05)); 27 33 #[derive(Component)] 28 34 struct MainPassCamera; 29 35 ··· 58 64 }), 59 65 EguiBlockingPlugin, 60 66 )) 61 - .add_systems( 62 - Startup, 63 - (setup, setup_mask, setup_char, setup_glasses).chain(), 64 - ) 67 + .add_systems(Startup, (setup, setup_mask, setup_char).chain()) 65 68 .add_systems(Update, (cursor_ungrab, orbit)) 66 69 .add_plugins(EguiPlugin { 67 70 enable_multipass_for_primary_context: true, ··· 136 139 Transform::from_xyz(50.0, 50.0, 50.0).looking_at(Vec3::ZERO, Vec3::Y), 137 140 MainPassCamera, 138 141 )); 142 + 143 + // commands.spawn((PointLight::default(), Transform::from_xyz(0.0, 1.0, 0.0))); 139 144 commands.spawn(( 140 145 Name::new("Light"), 141 146 PointLight { 142 147 shadows_enabled: false, 143 - intensity: 3_000_000.0, 148 + // intensity: 1_000_000.0, 144 149 ..default() 145 150 }, 146 - Transform::from_xyz(0.0, 0.0, 8.0), 151 + Transform::from_xyz(0.0, 5.0, 3.0), 147 152 )); 148 153 149 154 // circular base
+40 -17
bevy_viewer/src/mask.rs
··· 1 1 use bevy::{ 2 2 asset::RenderAssetUsages, 3 + color::palettes::css::REBECCA_PURPLE, 3 4 prelude::*, 4 5 render::{ 5 6 render_resource::{Extent3d, TextureDimension, TextureFormat, TextureUsages}, ··· 7 8 }, 8 9 }; 9 10 use binrw::BinRead; 10 - use std::{fs::File, io::BufReader}; 11 - use vee::{ 11 + use std::{fs::File, io::BufReader, path::PathBuf, str::FromStr}; 12 + use vfl::{ 12 13 charinfo::nx::NxCharInfo, 13 - mask::wgpu_render::{RenderContext, render_context_wgpu}, 14 - shape_load::nx::{ResourceShape, SHAPE_MID_DAT, Shape}, 15 - tex_load::nx::TEXTURE_MID_SRGB_DAT, 14 + draw::wgpu_render::{FACE_OUTPUT_SIZE, RenderContext, render_context_wgpu}, 15 + res::shape::nx::{ResourceShape, SHAPE_MID_DAT, Shape}, 16 + res::tex::nx::{ResourceTexture, TEXTURE_MID_SRGB_DAT}, 16 17 }; 17 18 18 19 use crate::{ 19 - CharDataRes, 20 + CHAR_TRANSFORM, CHARINFO, CharDataRes, 20 21 load::{self, load_mesh, setup_image}, 21 22 }; 22 23 ··· 28 29 let mut tex_file = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT).unwrap()); 29 30 let mut tex_shape = BufReader::new(File::open(SHAPE_MID_DAT).unwrap()); 30 31 31 - let mut char = File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../Jasmine.charinfo")).unwrap(); 32 + let mut char = File::open(CHARINFO).unwrap(); 32 33 let char = NxCharInfo::read(&mut char).unwrap(); 33 34 34 35 let image = futures::executor::block_on(render_context_wgpu( ··· 61 62 res.0 = Some(load::get_res().unwrap()); 62 63 63 64 let size = Extent3d { 64 - width: 256, 65 - height: 256, 65 + width: FACE_OUTPUT_SIZE.into(), 66 + height: FACE_OUTPUT_SIZE.into(), 66 67 ..default() 67 68 }; 68 69 ··· 112 113 ( 113 114 Mesh3d(meshes.add(load_mesh(*res, shape, 1).unwrap())), 114 115 MeshMaterial3d(material_handle), 115 - Transform::from_translation(Vec3::ZERO).with_scale(Vec3::splat(0.05)), 116 + CHAR_TRANSFORM, 116 117 ) 117 118 }); 118 119 } 119 120 121 + type ShapeTransform = Transform; 122 + 123 + #[must_use] 120 124 fn draw_char_glasses( 121 125 images: &mut ResMut<Assets<Image>>, 122 126 commands: &mut Commands, 123 127 render_layer: RenderLayers, 124 - ) { 128 + ) -> ShapeTransform { 125 129 let mut tex_file = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT).unwrap()); 126 - let mut tex_shape = BufReader::new(File::open(SHAPE_MID_DAT).unwrap()); 130 + let mut shape_file = BufReader::new(File::open(SHAPE_MID_DAT).unwrap()); 127 131 128 - let mut char = File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../Jasmine.charinfo")).unwrap(); 132 + let mut char = File::open(CHARINFO).unwrap(); 129 133 let char = NxCharInfo::read(&mut char).unwrap(); 130 134 131 135 let image = futures::executor::block_on(render_context_wgpu( 132 136 RenderContext::new_glasses( 133 137 // &FaceParts::init_glasses(&char, 256.0), 134 138 &char, 135 - (&mut tex_shape, &mut tex_file), 139 + (&mut shape_file, &mut tex_file), 136 140 ) 137 141 .unwrap(), 138 142 )) ··· 146 150 render_layer, 147 151 Transform::from_scale(vec3(1.0, -1.0, 1.0)), 148 152 )); 153 + 154 + let mut shape_file = BufReader::new(File::open(SHAPE_MID_DAT).unwrap()); 155 + let res_shape = ResourceShape::read(&mut shape_file).unwrap(); 156 + let nose_translate = res_shape.face_line_transform[char.faceline_type as usize].nose_translate; 157 + 158 + let shape_translation = vec3( 159 + nose_translate[0], 160 + 5.0 + nose_translate[1] + -1.5 * f32::from(char.glass_y), 161 + 2.0 + nose_translate[2], 162 + ); 163 + let shape_scale = 0.15 * f32::from(char.glass_scale); 164 + 165 + Transform::from_translation(shape_translation).with_scale(Vec3::splat(shape_scale)) 166 + 167 + // (shape_translation, shape_scale) 149 168 } 150 169 151 170 pub fn setup_glasses( ··· 180 199 // This specifies the layer used for the first pass, which will be attached to the first pass camera and cube. 181 200 let first_pass_layer = RenderLayers::layer(2); 182 201 183 - draw_char_glasses(&mut images, &mut commands, first_pass_layer.clone()); 202 + let mut glasses_shape_transform = 203 + draw_char_glasses(&mut images, &mut commands, first_pass_layer.clone()); 204 + 205 + // glasses_shape_transform.scale *= 0.05; // todo fix this resizing 206 + // glasses_shape_transform.translation *= 0.05; // todo fix this resizing 184 207 185 208 commands.spawn(( 186 209 Camera2d, 187 210 Camera { 188 211 target: image_handle.clone().into(), 189 - clear_color: Color::NONE.into(), 212 + clear_color: Color::from(REBECCA_PURPLE).into(), 190 213 ..default() 191 214 }, 192 215 first_pass_layer.clone(), ··· 209 232 ( 210 233 Mesh3d(meshes.add(load_mesh(*res, shape, 0).unwrap())), 211 234 MeshMaterial3d(material_handle), 212 - Transform::from_translation(Vec3::ZERO).with_scale(Vec3::splat(0.05)), 235 + glasses_shape_transform, 213 236 ) 214 237 }); 215 238 }
+28
justfile
··· 1 + # This justfile is for my convenience only. 2 + # Please don't use this unless you need to. 3 + 4 + # Yeah, idk. 5 + xcode: 6 + cargo build --bin lightweight_viewer 7 + open /private/var/folders/sl/mys5xs454210crk192gs9sk00000gn/T/BED4E4F3-9BCC-436E-992A-9352729F3DFA/lightweight_viewer.xcworkspace 8 + 9 + profile: 10 + just profile-instrument 11 + 12 + # Requires samply. 13 + profile-samply: 14 + cargo build --bin lightweight_viewer --profile profiling 15 + BROWSER=/Applications/Firefox\ Nightly.app/Contents/MacOS/firefox samply record ./target/profiling/lightweight_viewer 16 + profile-samply-debug: 17 + cargo build --bin lightweight_viewer 18 + BROWSER=/Applications/Firefox\ Nightly.app/Contents/MacOS/firefox samply record ./target/debug/lightweight_viewer 19 + 20 + # Requires Xcode (Instruments). 21 + profile-instrument: 22 + cargo build --bin lightweight_viewer --profile profiling 23 + rm -rf /tmp/tracefile.trace 24 + xcrun xctrace record \ 25 + --template "Time Profiler" \ 26 + --output /tmp/tracefile.trace \ 27 + --launch -- ./target/profiling/lightweight_viewer 28 + open /tmp/tracefile.trace
+14
lightweight_viewer/Cargo.toml
··· 1 + [package] 2 + name = "lightweight_viewer" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + pollster = "0.4" 8 + wgpu = "25.0.0" 9 + winit = { version = "0.30.11" } 10 + vfl = { path = "../vfl", features = ["res", "draw"] } 11 + glam = { version = "0.30.3", features = ["bytemuck"] } 12 + bytemuck = "1.23.0" 13 + image = "0.25.6" 14 + nalgebra = "0.33.2"
+274
lightweight_viewer/src/char.rs
··· 1 + use crate::State; 2 + use crate::render::shape_data_to_render_3d_shape; 3 + use glam::{Vec3, uvec2}; 4 + use image::DynamicImage; 5 + use vfl::color::nx::ModulationIntent; 6 + use vfl::draw::render_2d::texture_format_to_wgpu; 7 + use vfl::draw::render_3d::Rendered3dShape; 8 + use vfl::draw::wgpu_render::texture::TextureBundle; 9 + use vfl::res::tex::nx::{RawTexture, ResourceTexture, TextureElement}; 10 + use vfl::{ 11 + color::nx::{ColorModulated, modulate}, 12 + draw::{ 13 + render_2d::Rendered2dShape, 14 + wgpu_render::{RenderContext, texture}, 15 + }, 16 + res::shape::nx::{GenericResourceShape, Shape}, 17 + }; 18 + use wgpu::{CommandEncoder, TextureView}; 19 + 20 + pub fn draw_noseline( 21 + st: &mut State, 22 + texture_view: Option<TextureBundle>, 23 + encoder: &mut CommandEncoder, 24 + ) -> texture::TextureBundle { 25 + let res_texture = &st.resources.texture_header; 26 + let file_texture = &st.resources.texture_data; 27 + 28 + let noseline_num = usize::from(st.char_info.nose_type); 29 + 30 + let tex = res_texture.noseline[noseline_num] 31 + .get_uncompressed_bytes(file_texture) 32 + .unwrap() 33 + .unwrap(); 34 + 35 + let output_texture = if let Some(texture_view) = texture_view { 36 + texture_view 37 + } else { 38 + texture::TextureBundle::create_texture(&st.device, &uvec2(256, 256), "noselinetex") 39 + }; 40 + 41 + Rendered2dShape::render_texture_trivial( 42 + tex, 43 + modulate(ColorModulated::NoseLineShape, &st.char_info), 44 + None, 45 + st, 46 + &output_texture.view, 47 + encoder, 48 + ); 49 + 50 + output_texture 51 + } 52 + 53 + pub fn draw_mask(st: &mut State, texture_view: &TextureView, encoder: &mut CommandEncoder) { 54 + let res_shape = &st.resources.shape_header; 55 + let res_texture = &st.resources.texture_header; 56 + let file_texture = &st.resources.texture_data; 57 + 58 + let render_context = 59 + RenderContext::new(&st.char_info.clone(), res_texture, res_shape, file_texture).unwrap(); 60 + 61 + for shape in render_context.shape { 62 + shape.render(st, texture_view, encoder); 63 + } 64 + } 65 + 66 + // Looks up a TextureElement, and returns the texture with any modulation that needs to be done. 67 + // Returns an Option<T> because the texture could not exist (e.g. CharInfo w/o Beard) 68 + fn load_faceline_texture( 69 + st: &mut State, 70 + texture_element: TextureElement, 71 + modulated: ColorModulated, 72 + ) -> Option<(RawTexture, ModulationIntent)> { 73 + texture_element 74 + .get_uncompressed_bytes(&st.resources.texture_data) 75 + .unwrap() 76 + .map(|bytes| (bytes, modulate(modulated, &st.char_info))) 77 + } 78 + 79 + // Load faceline textures in order [wrinkle, makeup, beard], and removes any that don't exist 80 + fn get_faceline_textures( 81 + st: &mut State, 82 + res_texture: &ResourceTexture, 83 + ) -> Vec<(RawTexture, ModulationIntent)> { 84 + vec![ 85 + load_faceline_texture( 86 + st, 87 + res_texture.wrinkle[st.char_info.faceline_wrinkle as usize], 88 + ColorModulated::FacelineWrinkle, 89 + ), 90 + load_faceline_texture( 91 + st, 92 + res_texture.makeup[st.char_info.faceline_make as usize], 93 + ColorModulated::FacelineMakeup, 94 + ), 95 + { 96 + // We need to do a smarter check here. 97 + if st.char_info.beard_type >= 4 { 98 + load_faceline_texture(st, res_texture.beard[1], ColorModulated::BeardTexture) 99 + } else { 100 + None 101 + } 102 + }, 103 + ] 104 + .into_iter() 105 + .flatten() 106 + .collect() 107 + } 108 + 109 + fn draw_faceline(st: &mut State, texture_view: &TextureView, encoder: &mut CommandEncoder) { 110 + let res_texture = st.resources.texture_header; 111 + 112 + let textures = get_faceline_textures(st, &res_texture); 113 + 114 + for (i, (rendered_texture, modulation)) in textures.iter().enumerate() { 115 + // Check if we are the first to be rendered out, then add an opaque background. 116 + // We don't want an opaque redraw happening over our other faceline textures. 117 + let opaque = (i == 0).then_some( 118 + vfl::color::nx::srgb::FACELINE_COLOR[usize::from(st.char_info.faceline_color)], 119 + ); 120 + 121 + Rendered2dShape::render_texture_trivial( 122 + rendered_texture.to_owned(), 123 + modulation.to_owned(), 124 + None, 125 + st, 126 + texture_view, 127 + encoder, 128 + ); 129 + } 130 + } 131 + 132 + pub fn draw_char(st: &mut State, texture_view: &TextureView, encoder: &mut CommandEncoder) { 133 + let shapes = get_char_shapes(st, encoder); 134 + 135 + for mut shape in shapes { 136 + shape.render(st, texture_view, encoder); 137 + } 138 + } 139 + 140 + pub(crate) fn load_shape( 141 + shape_kind: Shape, 142 + shape_index: u8, 143 + shape_color: u8, 144 + st: &mut State, 145 + encoder: &mut CommandEncoder, 146 + ) -> Option<Rendered3dShape> { 147 + let res_shape = &st.resources.shape_header; 148 + 149 + // println!("Loading shp {shape_kind:?}[{shape_index:?}] col#{shape_color:?}"); 150 + 151 + let GenericResourceShape::FaceLineTransform(faceline_transform) = res_shape 152 + .index_by_shape( 153 + Shape::FaceLineTransform, 154 + usize::from(st.char_info.faceline_type), 155 + ) 156 + .unwrap() 157 + else { 158 + panic!() 159 + }; 160 + 161 + let GenericResourceShape::Element(mut shape_element) = res_shape 162 + .index_by_shape(shape_kind, usize::from(shape_index)) 163 + .unwrap() 164 + else { 165 + panic!() 166 + }; 167 + 168 + // For some reason there are just empty gaps in the shape data. 169 + // To validate this you just have to check that the size is 0? Who knows why. 170 + if shape_element.common.size == 0 { 171 + return None; 172 + } 173 + let position = match shape_kind { 174 + Shape::Nose | Shape::NoseLine | Shape::Glasses => { 175 + Vec3::from_array(faceline_transform.nose_translate) 176 + } 177 + _ => Vec3::ZERO, 178 + }; 179 + 180 + // Draw out any textures we need. 181 + let projected_texture = match shape_kind { 182 + Shape::NoseLine => { 183 + // let tex = res_texture.noseline[1] 184 + // .get_image(&mut BufReader::new( 185 + // File::open(TEXTURE_MID_SRGB_DAT).unwrap(), 186 + // )) 187 + // .unwrap() 188 + // .unwrap(); 189 + 190 + // let tex = DynamicImage::ImageRgba8(tex); 191 + 192 + // let noseline_texture = 193 + // texture::Texture::from_image(&st.device, &st.queue, &tex, None).unwrap(); 194 + // // let noseline_texture = crate::texture::Texture::create_texture( 195 + // // &st.device, 196 + // // &PhysicalSize::<u32>::new(128, 128), 197 + // // "noselinetex", 198 + // // ); 199 + 200 + // let noseline_texture = 201 + // texture::TextureBundle::create_texture(&st.device, &uvec2(256, 256), "noselinetex"); 202 + 203 + let noseline_texture = draw_noseline(st, None, encoder); 204 + 205 + Some(noseline_texture) 206 + } 207 + Shape::Mask => { 208 + let mask_texture = 209 + texture::TextureBundle::create_texture(&st.device, &uvec2(512, 512), "masktex"); 210 + 211 + draw_mask(st, &mask_texture.view, encoder); 212 + 213 + Some(mask_texture) 214 + } 215 + Shape::FaceLine => { 216 + let faceline_texture = 217 + texture::TextureBundle::create_texture(&st.device, &uvec2(512, 512), "facelinetex"); 218 + 219 + draw_faceline(st, &faceline_texture.view, encoder); 220 + 221 + Some(faceline_texture) 222 + } 223 + _ => None, 224 + }; 225 + 226 + let file_shape = &st.resources.shape_data[..]; 227 + 228 + Some(shape_data_to_render_3d_shape( 229 + shape_element.shape_data(file_shape).unwrap(), 230 + shape_kind, 231 + usize::from(shape_color), 232 + position, 233 + projected_texture, 234 + )) 235 + } 236 + 237 + fn get_char_shapes(st: &mut State, encoder: &mut CommandEncoder) -> Vec<Rendered3dShape> { 238 + // Order DOES matter for back-to-front sorting. It's not a perfect science, though. 239 + vec![ 240 + load_shape( 241 + Shape::FaceLine, 242 + st.char_info.faceline_type, 243 + st.char_info.faceline_color, 244 + st, 245 + encoder, 246 + ), 247 + load_shape( 248 + Shape::HairNormal, 249 + st.char_info.hair_type, 250 + st.char_info.hair_color, 251 + st, 252 + encoder, 253 + ), 254 + load_shape( 255 + Shape::Nose, 256 + st.char_info.nose_type, 257 + st.char_info.faceline_color, 258 + st, 259 + encoder, 260 + ), 261 + load_shape(Shape::NoseLine, st.char_info.nose_type, 0, st, encoder), 262 + { 263 + if st.char_info.glass_type != 0 { 264 + load_shape(Shape::Glasses, 0, st.char_info.glass_color, st, encoder) 265 + } else { 266 + None 267 + } 268 + }, 269 + load_shape(Shape::Mask, st.char_info.faceline_type, 0, st, encoder), 270 + ] 271 + .into_iter() 272 + .flatten() 273 + .collect() 274 + }
+70
lightweight_viewer/src/char_model.rs
··· 1 + use vfl::{draw::render_3d::Rendered3dShape, res::shape::nx::Shape}; 2 + use wgpu::{CommandEncoder, TextureView}; 3 + 4 + use crate::{State, char::load_shape}; 5 + 6 + type Model = Rendered3dShape; 7 + type ModelOpt = Option<Rendered3dShape>; 8 + 9 + #[derive(Debug)] 10 + pub struct CharModel { 11 + pub face_line: Model, 12 + pub mask: Model, 13 + pub hair: ModelOpt, 14 + pub nose: ModelOpt, 15 + pub nose_line: Model, 16 + } 17 + impl CharModel { 18 + pub fn new(st: &mut State, encoder: &mut CommandEncoder) -> CharModel { 19 + CharModel { 20 + face_line: face_line(st, encoder).unwrap(), 21 + mask: mask(st, encoder).unwrap(), 22 + hair: hair(st, encoder), 23 + nose: None, 24 + nose_line: nose_line(st, encoder).unwrap(), 25 + } 26 + } 27 + 28 + pub fn render( 29 + &mut self, 30 + st: &mut State, 31 + texture_view: &TextureView, 32 + encoder: &mut CommandEncoder, 33 + ) { 34 + self.face_line.render(st, texture_view, encoder); 35 + // if let Some(hair) = self.hair.as_mut() { 36 + // hair.render(st, texture_view, encoder); 37 + // } 38 + // self.mask.render(st, texture_view, encoder); 39 + 40 + // self.nose_line.render(st, texture_view, encoder); 41 + } 42 + } 43 + 44 + fn face_line(st: &mut State, encoder: &mut CommandEncoder) -> ModelOpt { 45 + load_shape( 46 + Shape::FaceLine, 47 + st.char_info.faceline_type, 48 + st.char_info.faceline_color, 49 + st, 50 + encoder, 51 + ) 52 + } 53 + 54 + fn hair(st: &mut State, encoder: &mut CommandEncoder) -> ModelOpt { 55 + load_shape( 56 + Shape::HairNormal, 57 + st.char_info.hair_type, 58 + st.char_info.hair_color, 59 + st, 60 + encoder, 61 + ) 62 + } 63 + 64 + fn mask(st: &mut State, encoder: &mut CommandEncoder) -> ModelOpt { 65 + load_shape(Shape::Mask, st.char_info.faceline_type, 0, st, encoder) 66 + } 67 + 68 + fn nose_line(st: &mut State, encoder: &mut CommandEncoder) -> ModelOpt { 69 + load_shape(Shape::NoseLine, st.char_info.nose_type, 0, st, encoder) 70 + }
+670
lightweight_viewer/src/main.rs
··· 1 + use camera::{Camera, CameraUniform}; 2 + use char_model::CharModel; 3 + use glam::{UVec2, Vec3, Vec4, uvec2, vec4}; 4 + use std::sync::{Mutex, OnceLock}; 5 + use std::{f32::consts::FRAC_PI_2, fs::File, sync::Arc}; 6 + use vfl::res::shape::nx::ResourceShape; 7 + use vfl::res::tex::nx::ResourceTexture; 8 + use vfl::{ 9 + charinfo::nx::{BinRead, NxCharInfo}, 10 + draw::{render_3d::ProgramState, wgpu_render::texture}, 11 + res::{shape::nx::SHAPE_MID_DAT, tex::nx::TEXTURE_MID_SRGB_DAT}, 12 + }; 13 + use wgpu::Features; 14 + use wgpu::{Backends, util::DeviceExt}; 15 + use winit::{ 16 + application::ApplicationHandler, 17 + event::WindowEvent, 18 + event_loop::{ActiveEventLoop, ControlFlow, EventLoop}, 19 + window::{Window, WindowId}, 20 + }; 21 + 22 + static CHAR_MODEL: OnceLock<Mutex<CharModel>> = OnceLock::new(); 23 + 24 + pub mod char; 25 + pub mod char_model; 26 + pub mod render; 27 + 28 + #[allow(unused)] 29 + const OVERLAY_REBECCA_PURPLE: wgpu::Color = wgpu::Color { 30 + r: 0.1, 31 + g: 0.12, 32 + b: 0.1, 33 + a: 0.3, 34 + }; 35 + const DARK_REBECCA_PURPLE: wgpu::Color = wgpu::Color { 36 + r: 0.2, 37 + g: 0.1, 38 + b: 0.3, 39 + a: 1.0, 40 + }; 41 + 42 + pub const fn wgpu_color_to_vec4(color: wgpu::Color) -> Vec4 { 43 + vec4( 44 + color.r as f32, 45 + color.g as f32, 46 + color.b as f32, 47 + color.a as f32, 48 + ) 49 + } 50 + 51 + const FACES: [&str; 5] = [ 52 + "testguy.charinfo", 53 + "j0.charinfo", 54 + "charline.charinfo", 55 + "Jasmine.charinfo", 56 + "soyun.charinfo", 57 + ]; 58 + 59 + pub struct ResourceData { 60 + texture_header: ResourceTexture, 61 + shape_header: ResourceShape, 62 + texture_data: Vec<u8>, 63 + shape_data: Vec<u8>, 64 + } 65 + 66 + pub struct State { 67 + window: Arc<Window>, 68 + device: wgpu::Device, 69 + queue: wgpu::Queue, 70 + size: UVec2, 71 + surface: wgpu::Surface<'static>, 72 + surface_format: wgpu::TextureFormat, 73 + char_info: NxCharInfo, 74 + char_remake: bool, 75 + camera: Camera, 76 + camera_buffer: wgpu::Buffer, 77 + camera_bind_group: wgpu::BindGroup, 78 + camera_uniform: CameraUniform, 79 + camera_bind_group_layout: wgpu::BindGroupLayout, 80 + depth_texture: texture::TextureBundle, 81 + camera_rotations: usize, 82 + resources: ResourceData, 83 + } 84 + 85 + impl ProgramState for State { 86 + fn device(&self) -> wgpu::Device { 87 + self.device.clone() 88 + } 89 + 90 + fn queue(&self) -> wgpu::Queue { 91 + self.queue.clone() 92 + } 93 + 94 + fn camera_bgl(&self) -> &wgpu::BindGroupLayout { 95 + &self.camera_bind_group_layout 96 + } 97 + 98 + fn camera_bg(&self) -> &wgpu::BindGroup { 99 + &self.camera_bind_group 100 + } 101 + 102 + fn surface_fmt(&self) -> wgpu::TextureFormat { 103 + self.surface_format 104 + } 105 + 106 + fn depth_texture(&self) -> &vfl::draw::wgpu_render::texture::TextureBundle { 107 + &self.depth_texture 108 + } 109 + } 110 + 111 + impl State { 112 + async fn new(window: Arc<Window>) -> State { 113 + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { 114 + backends: Backends::PRIMARY | Backends::SECONDARY, 115 + ..Default::default() 116 + }); 117 + let adapter = instance 118 + .request_adapter(&wgpu::RequestAdapterOptions::default()) 119 + .await 120 + .unwrap(); 121 + 122 + dbg!( 123 + adapter.get_texture_format_features(wgpu::TextureFormat::Astc { 124 + block: wgpu::AstcBlock::B4x4, 125 + channel: wgpu::AstcChannel::Unorm 126 + }) 127 + ); 128 + let device_descriptor = wgpu::DeviceDescriptor { 129 + required_features: Features::TEXTURE_COMPRESSION_ASTC 130 + | Features::TEXTURE_COMPRESSION_BC, 131 + ..Default::default() 132 + }; 133 + let (device, queue) = adapter.request_device(&device_descriptor).await.unwrap(); 134 + 135 + let size = window.inner_size(); 136 + let size = uvec2(size.width, size.height); 137 + 138 + let surface = instance.create_surface(window.clone()).unwrap(); 139 + let cap = surface.get_capabilities(&adapter); 140 + let surface_format = cap.formats[0]; 141 + 142 + let depth_texture = 143 + texture::TextureBundle::create_depth_texture(&device, &size, "depth_texture"); 144 + 145 + let mut char_info = 146 + File::open(format!("{}/../{}", env!("CARGO_MANIFEST_DIR"), FACES[0])).unwrap(); 147 + let char_info = NxCharInfo::read(&mut char_info).unwrap(); 148 + 149 + let camera = Camera { 150 + eye: (0.0, 25.0, 100.0).into(), 151 + target: (0.0, 25.0, 0.0).into(), 152 + up: Vec3::Y, 153 + aspect: size.x as f32 / size.y as f32, 154 + fov_y_radians: FRAC_PI_2, 155 + znear: 0.1, 156 + zfar: 10000.0, 157 + }; 158 + 159 + let mut camera_uniform = CameraUniform::new(); 160 + camera_uniform.update_view_proj(&camera); 161 + 162 + let camera_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { 163 + label: Some("Camera Buffer"), 164 + contents: bytemuck::cast_slice(&[camera_uniform]), 165 + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, 166 + }); 167 + 168 + let camera_bind_group_layout = 169 + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 170 + entries: &[wgpu::BindGroupLayoutEntry { 171 + binding: 0, 172 + visibility: wgpu::ShaderStages::VERTEX, 173 + ty: wgpu::BindingType::Buffer { 174 + ty: wgpu::BufferBindingType::Uniform, 175 + has_dynamic_offset: false, 176 + min_binding_size: None, 177 + }, 178 + count: None, 179 + }], 180 + label: Some("camera_bind_group_layout"), 181 + }); 182 + 183 + let camera_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { 184 + layout: &camera_bind_group_layout, 185 + entries: &[wgpu::BindGroupEntry { 186 + binding: 0, 187 + resource: camera_buffer.as_entire_binding(), 188 + }], 189 + label: Some("camera_bind_group"), 190 + }); 191 + 192 + let camera_rotations = 0; 193 + 194 + let shape_header = ResourceShape::read(&mut File::open(SHAPE_MID_DAT).unwrap()).unwrap(); 195 + let texture_header = 196 + ResourceTexture::read(&mut File::open(TEXTURE_MID_SRGB_DAT).unwrap()).unwrap(); 197 + let shape_data = std::fs::read(SHAPE_MID_DAT).unwrap(); 198 + let texture_data = std::fs::read(TEXTURE_MID_SRGB_DAT).unwrap(); 199 + 200 + let resources = ResourceData { 201 + shape_header, 202 + texture_header, 203 + shape_data, 204 + texture_data, 205 + }; 206 + 207 + let state = State { 208 + window, 209 + device, 210 + queue, 211 + size, 212 + surface, 213 + surface_format, 214 + char_info, 215 + camera, 216 + camera_buffer, 217 + camera_bind_group, 218 + camera_uniform, 219 + camera_bind_group_layout, 220 + depth_texture, 221 + camera_rotations, 222 + resources, 223 + char_remake: true, 224 + }; 225 + 226 + // Configure surface for the first time 227 + state.configure_surface(); 228 + 229 + state 230 + } 231 + 232 + fn get_window(&self) -> &Window { 233 + &self.window 234 + } 235 + 236 + fn configure_surface(&self) { 237 + let surface_config = wgpu::SurfaceConfiguration { 238 + usage: wgpu::TextureUsages::RENDER_ATTACHMENT, 239 + format: self.surface_format, 240 + // Request compatibility with the sRGB-format texture view weโ€˜re going to create later. 241 + view_formats: vec![self.surface_format.add_srgb_suffix()], 242 + alpha_mode: wgpu::CompositeAlphaMode::Auto, 243 + width: self.size.x, 244 + height: self.size.y, 245 + desired_maximum_frame_latency: 2, 246 + present_mode: wgpu::PresentMode::AutoVsync, 247 + }; 248 + self.surface.configure(&self.device, &surface_config); 249 + } 250 + 251 + fn resize(&mut self, new_size: winit::dpi::PhysicalSize<u32>) { 252 + self.size = uvec2(new_size.width, new_size.height); 253 + 254 + // reconfigure the surface 255 + self.configure_surface(); 256 + 257 + self.depth_texture = 258 + texture::TextureBundle::create_depth_texture(&self.device, &self.size, "depth_texture"); 259 + } 260 + 261 + fn render(&mut self) { 262 + // Create texture view 263 + let surface_texture = self 264 + .surface 265 + .get_current_texture() 266 + .expect("failed to acquire next swapchain texture"); 267 + let texture_view = surface_texture 268 + .texture 269 + .create_view(&wgpu::TextureViewDescriptor { 270 + // Without add_srgb_suffix() the image we will be working with 271 + // might not be "gamma correct". 272 + format: Some(self.surface_format.add_srgb_suffix()), 273 + ..Default::default() 274 + }); 275 + 276 + // Clear the screen, so we can layer a BUNCH of render passes... 277 + 278 + let mut encoder = self.device.create_command_encoder(&Default::default()); 279 + // Create the renderpass which will clear the screen. 280 + let renderpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { 281 + label: None, 282 + color_attachments: &[Some(wgpu::RenderPassColorAttachment { 283 + view: &texture_view, 284 + resolve_target: None, 285 + ops: wgpu::Operations { 286 + load: wgpu::LoadOp::Clear(DARK_REBECCA_PURPLE), 287 + store: wgpu::StoreOp::Store, 288 + }, 289 + })], 290 + // Clear the depth buffer, too. 291 + depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment { 292 + view: &self.depth_texture.view, 293 + depth_ops: Some(wgpu::Operations { 294 + load: wgpu::LoadOp::Clear(1.0), 295 + store: wgpu::StoreOp::Store, 296 + }), 297 + stencil_ops: None, 298 + }), 299 + timestamp_writes: None, 300 + occlusion_query_set: None, 301 + }); 302 + 303 + // If you wanted to call any drawing commands, they would go here. 304 + 305 + // End the renderpass. 306 + drop(renderpass); 307 + 308 + // If you wanted to call any drawing commands, they would go here. 309 + // draw_mask(self, &texture_view, &mut encoder); 310 + 311 + if CHAR_MODEL.get().is_none() { 312 + let new_model = CharModel::new(self, &mut encoder); 313 + CHAR_MODEL.set(Mutex::new(new_model)).unwrap(); 314 + } 315 + 316 + // For profiling: 317 + // self.char_remake = true; 318 + 319 + if self.char_remake { 320 + self.char_remake = false; 321 + // let mut encoder = self.device.create_command_encoder(&Default::default()); 322 + 323 + let new_model = CharModel::new(self, &mut encoder); 324 + 325 + let mut state = CHAR_MODEL.get().unwrap().lock().unwrap(); 326 + *state = new_model; 327 + } 328 + 329 + CHAR_MODEL 330 + .get() 331 + .unwrap() 332 + .lock() 333 + .unwrap() 334 + .render(self, &texture_view, &mut encoder); 335 + 336 + // Submit the command in the queue to execute 337 + self.queue.submit([encoder.finish()]); 338 + self.window.pre_present_notify(); 339 + surface_texture.present(); 340 + } 341 + 342 + fn update(&mut self) { 343 + let forward = self.camera.target - self.camera.eye; 344 + let forward_norm = forward.normalize(); 345 + let forward_mag = forward.length(); 346 + 347 + let right = forward_norm.cross(self.camera.up); 348 + 349 + const CAMERA_ROTATE_SPEED: f32 = 2.0; 350 + self.camera.eye = 351 + self.camera.target - (forward + right * CAMERA_ROTATE_SPEED).normalize() * forward_mag; 352 + 353 + let forward_new = self.camera.target - self.camera.eye; 354 + let forward_new_norm = forward_new.normalize(); 355 + 356 + const ROTATION_POINT: f32 = 0.0; 357 + if forward_norm.x < ROTATION_POINT && forward_new_norm.x >= ROTATION_POINT { 358 + self.camera_rotations += 1; 359 + 360 + let mut char_info = File::open(format!( 361 + "{}/../{}", 362 + env!("CARGO_MANIFEST_DIR"), 363 + FACES[self.camera_rotations % FACES.len()] 364 + )) 365 + .unwrap(); 366 + self.char_info = NxCharInfo::read(&mut char_info).unwrap(); 367 + 368 + self.char_remake = true; 369 + // if CHAR_MODEL.get().is_none() { 370 + // let new_model = CharModel::new(self, &mut encoder); 371 + // CHAR_MODEL.set(Mutex::new(new_model)).unwrap(); 372 + // } 373 + } 374 + 375 + self.camera_uniform.update_view_proj(&self.camera); 376 + self.queue.write_buffer( 377 + &self.camera_buffer, 378 + 0, 379 + bytemuck::cast_slice(&[self.camera_uniform]), 380 + ); 381 + } 382 + } 383 + 384 + #[derive(Default)] 385 + struct App { 386 + state: Option<State>, 387 + } 388 + 389 + impl ApplicationHandler for App { 390 + fn resumed(&mut self, event_loop: &ActiveEventLoop) { 391 + // Create window object 392 + let window = Arc::new( 393 + event_loop 394 + .create_window(Window::default_attributes().with_title("Vee(FL)-Testing")) 395 + .unwrap(), 396 + ); 397 + 398 + let state = pollster::block_on(State::new(window.clone())); 399 + self.state = Some(state); 400 + 401 + window.request_redraw(); 402 + } 403 + 404 + fn window_event(&mut self, event_loop: &ActiveEventLoop, _id: WindowId, event: WindowEvent) { 405 + let state = self.state.as_mut().unwrap(); 406 + match event { 407 + WindowEvent::CloseRequested => { 408 + println!("The close button was pressed; stopping"); 409 + event_loop.exit(); 410 + } 411 + WindowEvent::RedrawRequested => { 412 + state.update(); 413 + state.render(); 414 + // Emits a new redraw requested event. 415 + state.get_window().request_redraw(); 416 + } 417 + WindowEvent::Resized(size) => { 418 + // Reconfigures the size of the surface. We do not re-render 419 + // here as this event is always followed up by redraw request. 420 + state.resize(size); 421 + } 422 + _ => (), 423 + } 424 + } 425 + } 426 + 427 + fn main() { 428 + // wgpu uses `log` for all of our logging, so we initialize a logger with the `env_logger` crate. 429 + // 430 + // To change the log level, set the `RUST_LOG` environment variable. See the `env_logger` 431 + // documentation for more information. 432 + // env_logger::init(); 433 + 434 + let event_loop = EventLoop::new().unwrap(); 435 + 436 + // When the current loop iteration finishes, immediately begin a new 437 + // iteration regardless of whether or not new events are available to 438 + // process. Preferred for applications that want to render as fast as 439 + // possible, like games. 440 + event_loop.set_control_flow(ControlFlow::Poll); 441 + 442 + // When the current loop iteration finishes, suspend the thread until 443 + // another event arrives. Helps keeping CPU utilization low if nothing 444 + // is happening, which is preferred if the application might be idling in 445 + // the background. 446 + // event_loop.set_control_flow(ControlFlow::Wait); 447 + 448 + let mut app = App::default(); 449 + event_loop.run_app(&mut app).unwrap(); 450 + } 451 + 452 + mod camera { 453 + use glam::{Mat4, Vec3}; 454 + 455 + pub struct Camera { 456 + pub eye: Vec3, 457 + pub target: Vec3, 458 + pub up: Vec3, 459 + pub aspect: f32, 460 + pub fov_y_radians: f32, 461 + pub znear: f32, 462 + pub zfar: f32, 463 + } 464 + 465 + impl Camera { 466 + pub fn build_view_projection_matrix(&self) -> Mat4 { 467 + let view = Mat4::look_at_rh(self.eye, self.target, self.up); 468 + let proj = Mat4::perspective_rh(self.fov_y_radians, self.aspect, self.znear, self.zfar); 469 + proj * view 470 + } 471 + } 472 + 473 + #[repr(C)] 474 + #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] 475 + pub struct CameraUniform { 476 + view_proj: [[f32; 4]; 4], 477 + } 478 + 479 + impl CameraUniform { 480 + pub fn new() -> Self { 481 + Self { 482 + view_proj: Mat4::IDENTITY.to_cols_array_2d(), 483 + } 484 + } 485 + 486 + pub fn update_view_proj(&mut self, camera: &Camera) { 487 + self.view_proj = camera.build_view_projection_matrix().to_cols_array_2d(); 488 + } 489 + } 490 + } 491 + 492 + // mod texture { 493 + // use std::error::Error; 494 + 495 + // use image::GenericImageView; 496 + // use wgpu::TextureFormat; 497 + // use winit::dpi::PhysicalSize; 498 + 499 + // pub struct Texture { 500 + // #[allow(unused)] 501 + // pub texture: wgpu::Texture, 502 + // pub view: wgpu::TextureView, 503 + // pub sampler: wgpu::Sampler, 504 + // } 505 + 506 + // #[allow(unused)] 507 + // impl Texture { 508 + // pub fn from_bytes( 509 + // device: &wgpu::Device, 510 + // queue: &wgpu::Queue, 511 + // bytes: &[u8], 512 + // label: &str, 513 + // ) -> Result<Self, Box<dyn Error>> { 514 + // let img = image::load_from_memory(bytes)?; 515 + // Self::from_image(device, queue, &img, Some(label)) 516 + // } 517 + 518 + // pub fn from_image( 519 + // device: &wgpu::Device, 520 + // queue: &wgpu::Queue, 521 + // img: &image::DynamicImage, 522 + // label: Option<&str>, 523 + // ) -> Result<Self, Box<dyn Error>> { 524 + // let rgba = img.to_rgba8(); 525 + // let dimensions = img.dimensions(); 526 + 527 + // let size = wgpu::Extent3d { 528 + // width: dimensions.0, 529 + // height: dimensions.1, 530 + // depth_or_array_layers: 1, 531 + // }; 532 + // let texture = device.create_texture(&wgpu::TextureDescriptor { 533 + // label, 534 + // size, 535 + // mip_level_count: 1, 536 + // sample_count: 1, 537 + // dimension: wgpu::TextureDimension::D2, 538 + // format: wgpu::TextureFormat::Rgba8UnormSrgb, 539 + // usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, 540 + // view_formats: &[], 541 + // }); 542 + 543 + // queue.write_texture( 544 + // wgpu::TexelCopyTextureInfo { 545 + // aspect: wgpu::TextureAspect::All, 546 + // texture: &texture, 547 + // mip_level: 0, 548 + // origin: wgpu::Origin3d::ZERO, 549 + // }, 550 + // &rgba, 551 + // wgpu::TexelCopyBufferLayout { 552 + // offset: 0, 553 + // bytes_per_row: Some(4 * dimensions.0), 554 + // rows_per_image: Some(dimensions.1), 555 + // }, 556 + // size, 557 + // ); 558 + 559 + // let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); 560 + // let sampler = device.create_sampler(&wgpu::SamplerDescriptor { 561 + // address_mode_u: wgpu::AddressMode::ClampToEdge, 562 + // address_mode_v: wgpu::AddressMode::ClampToEdge, 563 + // address_mode_w: wgpu::AddressMode::ClampToEdge, 564 + // mag_filter: wgpu::FilterMode::Linear, 565 + // min_filter: wgpu::FilterMode::Nearest, 566 + // mipmap_filter: wgpu::FilterMode::Nearest, 567 + // ..Default::default() 568 + // }); 569 + 570 + // Ok(Self { 571 + // texture, 572 + // view, 573 + // sampler, 574 + // }) 575 + // } 576 + 577 + // pub const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float; // 1. 578 + 579 + // pub fn create_depth_texture( 580 + // device: &wgpu::Device, 581 + // size: &PhysicalSize<u32>, 582 + // label: &str, 583 + // ) -> Self { 584 + // let size = wgpu::Extent3d { 585 + // // 2. 586 + // width: size.width.max(1), 587 + // height: size.height.max(1), 588 + // depth_or_array_layers: 1, 589 + // }; 590 + // let desc = wgpu::TextureDescriptor { 591 + // label: Some(label), 592 + // size, 593 + // mip_level_count: 1, 594 + // sample_count: 1, 595 + // dimension: wgpu::TextureDimension::D2, 596 + // format: Self::DEPTH_FORMAT, 597 + // usage: wgpu::TextureUsages::RENDER_ATTACHMENT // 3. 598 + // | wgpu::TextureUsages::TEXTURE_BINDING, 599 + // view_formats: &[], 600 + // }; 601 + // let texture = device.create_texture(&desc); 602 + 603 + // let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); 604 + // let sampler = device.create_sampler(&wgpu::SamplerDescriptor { 605 + // // 4. 606 + // address_mode_u: wgpu::AddressMode::ClampToEdge, 607 + // address_mode_v: wgpu::AddressMode::ClampToEdge, 608 + // address_mode_w: wgpu::AddressMode::ClampToEdge, 609 + // mag_filter: wgpu::FilterMode::Linear, 610 + // min_filter: wgpu::FilterMode::Linear, 611 + // mipmap_filter: wgpu::FilterMode::Nearest, 612 + // compare: Some(wgpu::CompareFunction::LessEqual), // 5. 613 + // lod_min_clamp: 0.0, 614 + // lod_max_clamp: 100.0, 615 + // ..Default::default() 616 + // }); 617 + 618 + // Self { 619 + // texture, 620 + // view, 621 + // sampler, 622 + // } 623 + // } 624 + 625 + // pub fn create_texture( 626 + // device: &wgpu::Device, 627 + // size: &PhysicalSize<u32>, 628 + // label: &str, 629 + // ) -> Self { 630 + // let size = wgpu::Extent3d { 631 + // // 2. 632 + // width: size.width.max(1), 633 + // height: size.height.max(1), 634 + // depth_or_array_layers: 1, 635 + // }; 636 + // let desc = wgpu::TextureDescriptor { 637 + // label: Some(label), 638 + // size, 639 + // mip_level_count: 1, 640 + // sample_count: 1, 641 + // dimension: wgpu::TextureDimension::D2, 642 + // format: TextureFormat::Bgra8UnormSrgb, 643 + // usage: wgpu::TextureUsages::RENDER_ATTACHMENT // 3. 644 + // | wgpu::TextureUsages::TEXTURE_BINDING, 645 + // view_formats: &[], 646 + // }; 647 + // let texture = device.create_texture(&desc); 648 + 649 + // let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); 650 + // let sampler = device.create_sampler(&wgpu::SamplerDescriptor { 651 + // // 4. 652 + // address_mode_u: wgpu::AddressMode::MirrorRepeat, 653 + // address_mode_v: wgpu::AddressMode::MirrorRepeat, 654 + // address_mode_w: wgpu::AddressMode::MirrorRepeat, 655 + // mag_filter: wgpu::FilterMode::Linear, 656 + // min_filter: wgpu::FilterMode::Linear, 657 + // mipmap_filter: wgpu::FilterMode::Nearest, 658 + // lod_min_clamp: 0.0, 659 + // lod_max_clamp: 100.0, 660 + // ..Default::default() 661 + // }); 662 + 663 + // Self { 664 + // texture, 665 + // view, 666 + // sampler, 667 + // } 668 + // } 669 + // } 670 + // }
+47
lightweight_viewer/src/render.rs
··· 1 + use glam::{Vec3, vec4}; 2 + use vfl::draw::render_3d::Rendered3dShape; 3 + use vfl::draw::wgpu_render::texture; 4 + use vfl::{ 5 + color::nx::linear::FACELINE_COLOR, 6 + draw::wgpu_render::Vertex, 7 + res::shape::nx::{Shape, ShapeData}, 8 + }; 9 + 10 + // I'm in a fucking horror of my own design 11 + pub fn shape_data_to_render_3d_shape( 12 + d: ShapeData, 13 + shape: Shape, 14 + color: usize, 15 + position: Vec3, 16 + projected_texture: Option<texture::TextureBundle>, 17 + ) -> Rendered3dShape { 18 + let mut vertices: Vec<Vertex> = vec![]; 19 + let tex_coords = d 20 + .uvs 21 + .unwrap_or(vec![[f32::NAN, f32::NAN]; d.positions.len()]); // Go on, return NULL. See if I care. 22 + let normals = d.normals.unwrap(); 23 + 24 + for i in 0..d.positions.len() { 25 + vertices.push(Vertex { 26 + position: d.positions[i], 27 + tex_coords: tex_coords[i], 28 + normal: normals[i], 29 + }) 30 + } 31 + 32 + let indices = d.indices.iter().map(|x| u32::from(*x)).collect(); 33 + 34 + Rendered3dShape { 35 + vertices, 36 + indices, 37 + color: match shape { 38 + Shape::HairNormal => vfl::color::nx::linear::COMMON_COLOR[color].into(), 39 + Shape::FaceLine | Shape::ForeheadNormal | Shape::Nose => FACELINE_COLOR[color].into(), 40 + Shape::Glasses => vec4(1.0, 0.0, 0.0, 0.0), 41 + _ => vec4(0.0, 0.0, 0.0, 0.0), 42 + // _ => wgpu_color_to_vec4(OVERLAY_REBECCA_PURPLE), 43 + }, 44 + texture: projected_texture, 45 + position, 46 + } 47 + }
+39
lightweight_viewer/src/shader-face.wgsl
··· 1 + struct TransformUniform { 2 + mtx: mat4x4<f32>, 3 + color_r: vec4<f32>, 4 + color_g: vec4<f32>, 5 + color_b: vec4<f32>, 6 + texture_format: u32, 7 + }; 8 + 9 + struct VertexOutput { 10 + @builtin(position) clip_position: vec4<f32>, 11 + @location(0) tex_coords: vec2<f32>, 12 + } 13 + 14 + @vertex 15 + fn vs_main( 16 + @location(0) position: vec3<f32>, 17 + @location(1) tex_coords: vec2<f32> 18 + ) -> VertexOutput { 19 + var out: VertexOutput; 20 + out.tex_coords = tex_coords; 21 + out.clip_position = vec4<f32>(position, 1.0); 22 + return out; 23 + } 24 + 25 + @group(0) @binding(0) 26 + var t_diffuse: texture_2d<f32>; 27 + @group(0) @binding(1) 28 + var s_diffuse: sampler; 29 + 30 + @fragment 31 + fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 32 + let color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords - vec2(1.0, 0.0)); 33 + 34 + if color.a == 0.0 { 35 + discard; 36 + } 37 + 38 + return color; 39 + }
+60
lightweight_viewer/src/shader-texture.wgsl
··· 1 + struct CameraUniform { 2 + view_proj: mat4x4<f32>, 3 + }; 4 + @group(0) @binding(0) 5 + var<uniform> camera: CameraUniform; 6 + 7 + struct CharShapeUniform { 8 + color: vec4<f32> 9 + } 10 + @group(1) @binding(0) 11 + var<uniform> char_shape: CharShapeUniform; 12 + 13 + @group(2) @binding(0) 14 + var t_diffuse: texture_2d<f32>; 15 + @group(2) @binding(1) 16 + var s_diffuse: sampler; 17 + 18 + struct VertexInput { 19 + @location(0) position: vec3<f32>, 20 + @location(1) tex_coords: vec2<f32>, 21 + @location(2) normal: vec3<f32>, 22 + } 23 + 24 + struct VertexOutput { 25 + @builtin(position) clip_position: vec4<f32>, 26 + @location(0) tex_coords: vec2<f32>, 27 + @location(1) world_normal: vec3<f32>, 28 + @location(2) world_position: vec3<f32>, 29 + } 30 + 31 + @vertex 32 + fn vs_main( 33 + model: VertexInput, 34 + // instance: InstanceInput, 35 + ) -> VertexOutput { 36 + var out: VertexOutput; 37 + out.tex_coords = model.tex_coords; 38 + out.world_normal = model.normal; 39 + var world_position: vec4<f32> = vec4<f32>(model.position, 1.0); 40 + out.world_position = world_position.xyz; 41 + out.clip_position = camera.view_proj * world_position; 42 + return out; 43 + } 44 + 45 + @fragment 46 + fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 47 + 48 + // Sampler AddressMode::MirrorRepeat + Move down one tex = Free Y-flip! 49 + let sample_position = in.tex_coords; 50 + let tex_color = textureSample(t_diffuse, s_diffuse, sample_position); 51 + 52 + // if tex_color.a == 0.0 { 53 + // discard; 54 + // } 55 + 56 + // return tex_color; 57 + 58 + return mix(char_shape.color, tex_color, tex_color.a); 59 + 60 + }
+71
lightweight_viewer/src/shader.wgsl
··· 1 + struct CameraUniform { 2 + view_proj: mat4x4<f32>, 3 + }; 4 + @group(0) @binding(0) 5 + var<uniform> camera: CameraUniform; 6 + 7 + struct CharShapeUniform { 8 + color: vec4<f32>, 9 + position: vec3<f32> 10 + } 11 + @group(1) @binding(0) 12 + var<uniform> char_shape: CharShapeUniform; 13 + 14 + struct VertexInput { 15 + @location(0) position: vec3<f32>, 16 + @location(1) tex_coords: vec2<f32>, 17 + @location(2) normal: vec3<f32>, 18 + } 19 + 20 + struct VertexOutput { 21 + @builtin(position) clip_position: vec4<f32>, 22 + @location(0) tex_coords: vec2<f32>, 23 + @location(1) world_normal: vec3<f32>, 24 + @location(2) world_position: vec3<f32>, 25 + } 26 + 27 + @vertex 28 + fn vs_main( 29 + model: VertexInput, 30 + // instance: InstanceInput, 31 + ) -> VertexOutput { 32 + var out: VertexOutput; 33 + out.tex_coords = model.tex_coords; 34 + out.world_normal = model.normal; 35 + var world_position: vec4<f32> = vec4<f32>(model.position + char_shape.position, 1.0); 36 + out.world_position = world_position.xyz; 37 + out.clip_position = camera.view_proj * world_position; 38 + return out; 39 + } 40 + 41 + // Fragment shader 42 + 43 + @fragment 44 + fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 45 + 46 + let color = char_shape.color; 47 + 48 + if color.a == 0.0 { 49 + discard; 50 + } 51 + return color; 52 + // let object_color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords); 53 + 54 + // // We don't need (or want) much ambient light, so 0.1 is fine 55 + // let ambient_strength = 0.1; 56 + // let ambient_color = light.color * ambient_strength; 57 + 58 + // let light_dir = normalize(light.position - in.world_position); 59 + // let view_dir = normalize(camera.view_pos.xyz - in.world_position); 60 + // let half_dir = normalize(view_dir + light_dir); 61 + 62 + // let diffuse_strength = max(dot(in.world_normal, light_dir), 0.0); 63 + // let diffuse_color = light.color * diffuse_strength; 64 + 65 + // let specular_strength = pow(max(dot(in.world_normal, half_dir), 0.0), 32.0); 66 + // let specular_color = specular_strength * light.color; 67 + 68 + // let result = (ambient_color + diffuse_color + specular_color) * object_color.xyz; 69 + 70 + // return vec4<f32>(result, object_color.a); 71 + }
testbed/Formats.hexproj

This is a binary file and will not be displayed.

-6450
vee/Cargo.lock
··· 1 - # This file is automatically @generated by Cargo. 2 - # It is not intended for manual editing. 3 - version = 4 4 - 5 - [[package]] 6 - name = "ab_glyph" 7 - version = "0.2.29" 8 - source = "registry+https://github.com/rust-lang/crates.io-index" 9 - checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" 10 - dependencies = [ 11 - "ab_glyph_rasterizer", 12 - "owned_ttf_parser", 13 - ] 14 - 15 - [[package]] 16 - name = "ab_glyph_rasterizer" 17 - version = "0.1.8" 18 - source = "registry+https://github.com/rust-lang/crates.io-index" 19 - checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 - 21 - [[package]] 22 - name = "accesskit" 23 - version = "0.18.0" 24 - source = "registry+https://github.com/rust-lang/crates.io-index" 25 - checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529" 26 - 27 - [[package]] 28 - name = "accesskit_consumer" 29 - version = "0.27.0" 30 - source = "registry+https://github.com/rust-lang/crates.io-index" 31 - checksum = "d0bf66a7bf0b7ea4fd7742d50b64782a88f99217cf246b3f93b4162528dde520" 32 - dependencies = [ 33 - "accesskit", 34 - "hashbrown", 35 - "immutable-chunkmap", 36 - ] 37 - 38 - [[package]] 39 - name = "accesskit_macos" 40 - version = "0.19.0" 41 - source = "registry+https://github.com/rust-lang/crates.io-index" 42 - checksum = "09e230718177753b4e4ad9e1d9f6cfc2f4921212d4c1c480b253f526babb258d" 43 - dependencies = [ 44 - "accesskit", 45 - "accesskit_consumer", 46 - "hashbrown", 47 - "objc2 0.5.2", 48 - "objc2-app-kit 0.2.2", 49 - "objc2-foundation 0.2.2", 50 - ] 51 - 52 - [[package]] 53 - name = "accesskit_windows" 54 - version = "0.25.0" 55 - source = "registry+https://github.com/rust-lang/crates.io-index" 56 - checksum = "65178f3df98a51e4238e584fcb255cb1a4f9111820848eeddd37663be40a625f" 57 - dependencies = [ 58 - "accesskit", 59 - "accesskit_consumer", 60 - "hashbrown", 61 - "paste", 62 - "static_assertions", 63 - "windows 0.58.0", 64 - "windows-core 0.58.0", 65 - ] 66 - 67 - [[package]] 68 - name = "accesskit_winit" 69 - version = "0.25.0" 70 - source = "registry+https://github.com/rust-lang/crates.io-index" 71 - checksum = "34d941bb8c414caba6e206de669c7dc0dbeb305640ea890772ee422a40e6b89f" 72 - dependencies = [ 73 - "accesskit", 74 - "accesskit_macos", 75 - "accesskit_windows", 76 - "raw-window-handle", 77 - "winit", 78 - ] 79 - 80 - [[package]] 81 - name = "adler2" 82 - version = "2.0.0" 83 - source = "registry+https://github.com/rust-lang/crates.io-index" 84 - checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 85 - 86 - [[package]] 87 - name = "ahash" 88 - version = "0.8.12" 89 - source = "registry+https://github.com/rust-lang/crates.io-index" 90 - checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 91 - dependencies = [ 92 - "cfg-if", 93 - "getrandom 0.3.3", 94 - "once_cell", 95 - "version_check", 96 - "zerocopy", 97 - ] 98 - 99 - [[package]] 100 - name = "aho-corasick" 101 - version = "1.1.3" 102 - source = "registry+https://github.com/rust-lang/crates.io-index" 103 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 104 - dependencies = [ 105 - "memchr", 106 - ] 107 - 108 - [[package]] 109 - name = "aligned-vec" 110 - version = "0.5.0" 111 - source = "registry+https://github.com/rust-lang/crates.io-index" 112 - checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" 113 - 114 - [[package]] 115 - name = "alsa" 116 - version = "0.9.1" 117 - source = "registry+https://github.com/rust-lang/crates.io-index" 118 - checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" 119 - dependencies = [ 120 - "alsa-sys", 121 - "bitflags 2.9.0", 122 - "cfg-if", 123 - "libc", 124 - ] 125 - 126 - [[package]] 127 - name = "alsa-sys" 128 - version = "0.3.1" 129 - source = "registry+https://github.com/rust-lang/crates.io-index" 130 - checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 131 - dependencies = [ 132 - "libc", 133 - "pkg-config", 134 - ] 135 - 136 - [[package]] 137 - name = "android-activity" 138 - version = "0.6.0" 139 - source = "registry+https://github.com/rust-lang/crates.io-index" 140 - checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 141 - dependencies = [ 142 - "android-properties", 143 - "bitflags 2.9.0", 144 - "cc", 145 - "cesu8", 146 - "jni", 147 - "jni-sys", 148 - "libc", 149 - "log", 150 - "ndk 0.9.0", 151 - "ndk-context", 152 - "ndk-sys 0.6.0+11769913", 153 - "num_enum", 154 - "thiserror 1.0.69", 155 - ] 156 - 157 - [[package]] 158 - name = "android-properties" 159 - version = "0.2.2" 160 - source = "registry+https://github.com/rust-lang/crates.io-index" 161 - checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 162 - 163 - [[package]] 164 - name = "android_log-sys" 165 - version = "0.3.2" 166 - source = "registry+https://github.com/rust-lang/crates.io-index" 167 - checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" 168 - 169 - [[package]] 170 - name = "android_system_properties" 171 - version = "0.1.5" 172 - source = "registry+https://github.com/rust-lang/crates.io-index" 173 - checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 174 - dependencies = [ 175 - "libc", 176 - ] 177 - 178 - [[package]] 179 - name = "anyhow" 180 - version = "1.0.98" 181 - source = "registry+https://github.com/rust-lang/crates.io-index" 182 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 183 - 184 - [[package]] 185 - name = "approx" 186 - version = "0.5.1" 187 - source = "registry+https://github.com/rust-lang/crates.io-index" 188 - checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" 189 - dependencies = [ 190 - "num-traits", 191 - ] 192 - 193 - [[package]] 194 - name = "arbitrary" 195 - version = "1.4.1" 196 - source = "registry+https://github.com/rust-lang/crates.io-index" 197 - checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" 198 - 199 - [[package]] 200 - name = "arboard" 201 - version = "3.5.0" 202 - source = "registry+https://github.com/rust-lang/crates.io-index" 203 - checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" 204 - dependencies = [ 205 - "clipboard-win", 206 - "image 0.25.6", 207 - "log", 208 - "objc2 0.6.1", 209 - "objc2-app-kit 0.3.1", 210 - "objc2-core-foundation", 211 - "objc2-core-graphics", 212 - "objc2-foundation 0.3.1", 213 - "parking_lot", 214 - "percent-encoding", 215 - "windows-sys 0.59.0", 216 - "x11rb", 217 - ] 218 - 219 - [[package]] 220 - name = "arg_enum_proc_macro" 221 - version = "0.3.4" 222 - source = "registry+https://github.com/rust-lang/crates.io-index" 223 - checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" 224 - dependencies = [ 225 - "proc-macro2", 226 - "quote", 227 - "syn 2.0.101", 228 - ] 229 - 230 - [[package]] 231 - name = "array-init" 232 - version = "2.1.0" 233 - source = "registry+https://github.com/rust-lang/crates.io-index" 234 - checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" 235 - 236 - [[package]] 237 - name = "arrayref" 238 - version = "0.3.9" 239 - source = "registry+https://github.com/rust-lang/crates.io-index" 240 - checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 241 - 242 - [[package]] 243 - name = "arrayvec" 244 - version = "0.7.6" 245 - source = "registry+https://github.com/rust-lang/crates.io-index" 246 - checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 247 - 248 - [[package]] 249 - name = "as-raw-xcb-connection" 250 - version = "1.0.1" 251 - source = "registry+https://github.com/rust-lang/crates.io-index" 252 - checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 253 - 254 - [[package]] 255 - name = "ash" 256 - version = "0.38.0+1.3.281" 257 - source = "registry+https://github.com/rust-lang/crates.io-index" 258 - checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" 259 - dependencies = [ 260 - "libloading", 261 - ] 262 - 263 - [[package]] 264 - name = "assert_type_match" 265 - version = "0.1.1" 266 - source = "registry+https://github.com/rust-lang/crates.io-index" 267 - checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" 268 - dependencies = [ 269 - "proc-macro2", 270 - "quote", 271 - "syn 2.0.101", 272 - ] 273 - 274 - [[package]] 275 - name = "async-broadcast" 276 - version = "0.7.2" 277 - source = "registry+https://github.com/rust-lang/crates.io-index" 278 - checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 279 - dependencies = [ 280 - "event-listener", 281 - "event-listener-strategy", 282 - "futures-core", 283 - "pin-project-lite", 284 - ] 285 - 286 - [[package]] 287 - name = "async-channel" 288 - version = "2.3.1" 289 - source = "registry+https://github.com/rust-lang/crates.io-index" 290 - checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 291 - dependencies = [ 292 - "concurrent-queue", 293 - "event-listener-strategy", 294 - "futures-core", 295 - "pin-project-lite", 296 - ] 297 - 298 - [[package]] 299 - name = "async-executor" 300 - version = "1.13.2" 301 - source = "registry+https://github.com/rust-lang/crates.io-index" 302 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 303 - dependencies = [ 304 - "async-task", 305 - "concurrent-queue", 306 - "fastrand", 307 - "futures-lite", 308 - "pin-project-lite", 309 - "slab", 310 - ] 311 - 312 - [[package]] 313 - name = "async-fs" 314 - version = "2.1.2" 315 - source = "registry+https://github.com/rust-lang/crates.io-index" 316 - checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" 317 - dependencies = [ 318 - "async-lock", 319 - "blocking", 320 - "futures-lite", 321 - ] 322 - 323 - [[package]] 324 - name = "async-lock" 325 - version = "3.4.0" 326 - source = "registry+https://github.com/rust-lang/crates.io-index" 327 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 328 - dependencies = [ 329 - "event-listener", 330 - "event-listener-strategy", 331 - "pin-project-lite", 332 - ] 333 - 334 - [[package]] 335 - name = "async-task" 336 - version = "4.7.1" 337 - source = "registry+https://github.com/rust-lang/crates.io-index" 338 - checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 339 - dependencies = [ 340 - "portable-atomic", 341 - ] 342 - 343 - [[package]] 344 - name = "atomic-waker" 345 - version = "1.1.2" 346 - source = "registry+https://github.com/rust-lang/crates.io-index" 347 - checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 348 - dependencies = [ 349 - "portable-atomic", 350 - ] 351 - 352 - [[package]] 353 - name = "atomicow" 354 - version = "1.1.0" 355 - source = "registry+https://github.com/rust-lang/crates.io-index" 356 - checksum = "f52e8890bb9844440d0c412fa74b67fd2f14e85248b6e00708059b6da9e5f8bf" 357 - dependencies = [ 358 - "portable-atomic", 359 - "portable-atomic-util", 360 - ] 361 - 362 - [[package]] 363 - name = "autocfg" 364 - version = "1.4.0" 365 - source = "registry+https://github.com/rust-lang/crates.io-index" 366 - checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 367 - 368 - [[package]] 369 - name = "av1-grain" 370 - version = "0.2.3" 371 - source = "registry+https://github.com/rust-lang/crates.io-index" 372 - checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" 373 - dependencies = [ 374 - "anyhow", 375 - "arrayvec", 376 - "log", 377 - "nom", 378 - "num-rational", 379 - "v_frame", 380 - ] 381 - 382 - [[package]] 383 - name = "avif-serialize" 384 - version = "0.8.3" 385 - source = "registry+https://github.com/rust-lang/crates.io-index" 386 - checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" 387 - dependencies = [ 388 - "arrayvec", 389 - ] 390 - 391 - [[package]] 392 - name = "base64" 393 - version = "0.13.1" 394 - source = "registry+https://github.com/rust-lang/crates.io-index" 395 - checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 396 - 397 - [[package]] 398 - name = "base64" 399 - version = "0.21.7" 400 - source = "registry+https://github.com/rust-lang/crates.io-index" 401 - checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 402 - 403 - [[package]] 404 - name = "base64" 405 - version = "0.22.1" 406 - source = "registry+https://github.com/rust-lang/crates.io-index" 407 - checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 408 - 409 - [[package]] 410 - name = "bevy" 411 - version = "0.16.0" 412 - source = "registry+https://github.com/rust-lang/crates.io-index" 413 - checksum = "2a5cd3b24a5adb7c7378da7b3eea47639877643d11b6b087fc8a8094f2528615" 414 - dependencies = [ 415 - "bevy_internal", 416 - ] 417 - 418 - [[package]] 419 - name = "bevy_a11y" 420 - version = "0.16.0" 421 - source = "registry+https://github.com/rust-lang/crates.io-index" 422 - checksum = "91ed969a58fbe449ef35ebec58ab19578302537f34ee8a35d04e5a038b3c40f5" 423 - dependencies = [ 424 - "accesskit", 425 - "bevy_app", 426 - "bevy_derive", 427 - "bevy_ecs", 428 - "bevy_reflect", 429 - ] 430 - 431 - [[package]] 432 - name = "bevy_animation" 433 - version = "0.16.0" 434 - source = "registry+https://github.com/rust-lang/crates.io-index" 435 - checksum = "3647b67c6bfd456922b2720ccef980dec01742d155d0eb454dc3d8fdc65e7aff" 436 - dependencies = [ 437 - "bevy_app", 438 - "bevy_asset", 439 - "bevy_color", 440 - "bevy_derive", 441 - "bevy_ecs", 442 - "bevy_log", 443 - "bevy_math", 444 - "bevy_mesh", 445 - "bevy_platform", 446 - "bevy_reflect", 447 - "bevy_render", 448 - "bevy_time", 449 - "bevy_transform", 450 - "bevy_utils", 451 - "blake3", 452 - "derive_more", 453 - "downcast-rs 2.0.1", 454 - "either", 455 - "petgraph", 456 - "ron", 457 - "serde", 458 - "smallvec", 459 - "thiserror 2.0.12", 460 - "thread_local", 461 - "tracing", 462 - "uuid", 463 - ] 464 - 465 - [[package]] 466 - name = "bevy_app" 467 - version = "0.16.0" 468 - source = "registry+https://github.com/rust-lang/crates.io-index" 469 - checksum = "a2b6267ac23a9947d5b2725ff047a1e1add70076d85fa9fb73d044ab9bea1f3c" 470 - dependencies = [ 471 - "bevy_derive", 472 - "bevy_ecs", 473 - "bevy_platform", 474 - "bevy_reflect", 475 - "bevy_tasks", 476 - "bevy_utils", 477 - "cfg-if", 478 - "console_error_panic_hook", 479 - "ctrlc", 480 - "downcast-rs 2.0.1", 481 - "log", 482 - "thiserror 2.0.12", 483 - "variadics_please", 484 - "wasm-bindgen", 485 - "web-sys", 486 - ] 487 - 488 - [[package]] 489 - name = "bevy_asset" 490 - version = "0.16.0" 491 - source = "registry+https://github.com/rust-lang/crates.io-index" 492 - checksum = "0698040d63199391ea77fd02e039630748e3e335c3070c6d932fd96cbf80f5d6" 493 - dependencies = [ 494 - "async-broadcast", 495 - "async-fs", 496 - "async-lock", 497 - "atomicow", 498 - "bevy_app", 499 - "bevy_asset_macros", 500 - "bevy_ecs", 501 - "bevy_platform", 502 - "bevy_reflect", 503 - "bevy_tasks", 504 - "bevy_utils", 505 - "bevy_window", 506 - "bitflags 2.9.0", 507 - "blake3", 508 - "crossbeam-channel", 509 - "derive_more", 510 - "disqualified", 511 - "downcast-rs 2.0.1", 512 - "either", 513 - "futures-io", 514 - "futures-lite", 515 - "js-sys", 516 - "parking_lot", 517 - "ron", 518 - "serde", 519 - "stackfuture", 520 - "thiserror 2.0.12", 521 - "tracing", 522 - "uuid", 523 - "wasm-bindgen", 524 - "wasm-bindgen-futures", 525 - "web-sys", 526 - ] 527 - 528 - [[package]] 529 - name = "bevy_asset_macros" 530 - version = "0.16.0" 531 - source = "registry+https://github.com/rust-lang/crates.io-index" 532 - checksum = "0bf8c00b5d532f8e5ac7b49af10602f9f7774a2d522cf0638323b5dfeee7b31c" 533 - dependencies = [ 534 - "bevy_macro_utils", 535 - "proc-macro2", 536 - "quote", 537 - "syn 2.0.101", 538 - ] 539 - 540 - [[package]] 541 - name = "bevy_audio" 542 - version = "0.16.0" 543 - source = "registry+https://github.com/rust-lang/crates.io-index" 544 - checksum = "74e54154e6369abdbaf5098e20424d59197c9b701d4f79fe8d0d2bde03d25f12" 545 - dependencies = [ 546 - "bevy_app", 547 - "bevy_asset", 548 - "bevy_derive", 549 - "bevy_ecs", 550 - "bevy_math", 551 - "bevy_reflect", 552 - "bevy_transform", 553 - "cpal", 554 - "rodio", 555 - "tracing", 556 - ] 557 - 558 - [[package]] 559 - name = "bevy_color" 560 - version = "0.16.1" 561 - source = "registry+https://github.com/rust-lang/crates.io-index" 562 - checksum = "ddf6a5ad35496bbc41713efbcf06ab72b9a310fabcab0f9db1debb56e8488c6e" 563 - dependencies = [ 564 - "bevy_math", 565 - "bevy_reflect", 566 - "bytemuck", 567 - "derive_more", 568 - "encase", 569 - "serde", 570 - "thiserror 2.0.12", 571 - "wgpu-types", 572 - ] 573 - 574 - [[package]] 575 - name = "bevy_core_pipeline" 576 - version = "0.16.0" 577 - source = "registry+https://github.com/rust-lang/crates.io-index" 578 - checksum = "55c2310717b9794e4a45513ee5946a7be0838852a4c1e185884195e1a8688ff3" 579 - dependencies = [ 580 - "bevy_app", 581 - "bevy_asset", 582 - "bevy_color", 583 - "bevy_derive", 584 - "bevy_diagnostic", 585 - "bevy_ecs", 586 - "bevy_image", 587 - "bevy_math", 588 - "bevy_platform", 589 - "bevy_reflect", 590 - "bevy_render", 591 - "bevy_transform", 592 - "bevy_utils", 593 - "bevy_window", 594 - "bitflags 2.9.0", 595 - "bytemuck", 596 - "nonmax", 597 - "radsort", 598 - "serde", 599 - "smallvec", 600 - "thiserror 2.0.12", 601 - "tracing", 602 - ] 603 - 604 - [[package]] 605 - name = "bevy_derive" 606 - version = "0.16.0" 607 - source = "registry+https://github.com/rust-lang/crates.io-index" 608 - checksum = "f626531b9c05c25a758ede228727bd11c2c2c8498ecbed9925044386d525a2a3" 609 - dependencies = [ 610 - "bevy_macro_utils", 611 - "quote", 612 - "syn 2.0.101", 613 - ] 614 - 615 - [[package]] 616 - name = "bevy_diagnostic" 617 - version = "0.16.0" 618 - source = "registry+https://github.com/rust-lang/crates.io-index" 619 - checksum = "048a1ff3944a534b8472516866284181eef0a75b6dd4d39b6e5925715e350766" 620 - dependencies = [ 621 - "bevy_app", 622 - "bevy_ecs", 623 - "bevy_platform", 624 - "bevy_tasks", 625 - "bevy_time", 626 - "bevy_utils", 627 - "const-fnv1a-hash", 628 - "log", 629 - "serde", 630 - "sysinfo", 631 - ] 632 - 633 - [[package]] 634 - name = "bevy_ecs" 635 - version = "0.16.0" 636 - source = "registry+https://github.com/rust-lang/crates.io-index" 637 - checksum = "d9e807b5d9aab3bb8dfe47e7a44c9ff088bad2ceefe299b80ac77609a87fe9d4" 638 - dependencies = [ 639 - "arrayvec", 640 - "bevy_ecs_macros", 641 - "bevy_platform", 642 - "bevy_ptr", 643 - "bevy_reflect", 644 - "bevy_tasks", 645 - "bevy_utils", 646 - "bitflags 2.9.0", 647 - "bumpalo", 648 - "concurrent-queue", 649 - "derive_more", 650 - "disqualified", 651 - "fixedbitset", 652 - "indexmap", 653 - "log", 654 - "nonmax", 655 - "serde", 656 - "smallvec", 657 - "thiserror 2.0.12", 658 - "variadics_please", 659 - ] 660 - 661 - [[package]] 662 - name = "bevy_ecs_macros" 663 - version = "0.16.0" 664 - source = "registry+https://github.com/rust-lang/crates.io-index" 665 - checksum = "467d7bb98aeb8dd30f36e6a773000c12a891d4f1bee2adc3841ec89cc8eaf54e" 666 - dependencies = [ 667 - "bevy_macro_utils", 668 - "proc-macro2", 669 - "quote", 670 - "syn 2.0.101", 671 - ] 672 - 673 - [[package]] 674 - name = "bevy_egui" 675 - version = "0.34.1" 676 - source = "registry+https://github.com/rust-lang/crates.io-index" 677 - checksum = "3a3d58a8afdb6100bca50251043a85320391742cae125d559f6cca3a16b84cdd" 678 - dependencies = [ 679 - "arboard", 680 - "bevy_app", 681 - "bevy_asset", 682 - "bevy_derive", 683 - "bevy_ecs", 684 - "bevy_image", 685 - "bevy_input", 686 - "bevy_log", 687 - "bevy_math", 688 - "bevy_picking", 689 - "bevy_platform", 690 - "bevy_reflect", 691 - "bevy_render", 692 - "bevy_time", 693 - "bevy_window", 694 - "bevy_winit", 695 - "bytemuck", 696 - "crossbeam-channel", 697 - "egui", 698 - "encase", 699 - "image 0.25.6", 700 - "js-sys", 701 - "thread_local", 702 - "wasm-bindgen", 703 - "wasm-bindgen-futures", 704 - "web-sys", 705 - "webbrowser", 706 - "wgpu-types", 707 - "winit", 708 - ] 709 - 710 - [[package]] 711 - name = "bevy_encase_derive" 712 - version = "0.16.0" 713 - source = "registry+https://github.com/rust-lang/crates.io-index" 714 - checksum = "b8bb31dc1090c6f8fabbf6b21994d19a12766e786885ee48ffc547f0f1fa7863" 715 - dependencies = [ 716 - "bevy_macro_utils", 717 - "encase_derive_impl", 718 - ] 719 - 720 - [[package]] 721 - name = "bevy_gilrs" 722 - version = "0.16.0" 723 - source = "registry+https://github.com/rust-lang/crates.io-index" 724 - checksum = "950c84596dbff8a9691a050c37bb610ef9398af56369c2c2dd6dc41ef7b717a5" 725 - dependencies = [ 726 - "bevy_app", 727 - "bevy_ecs", 728 - "bevy_input", 729 - "bevy_platform", 730 - "bevy_time", 731 - "bevy_utils", 732 - "gilrs", 733 - "thiserror 2.0.12", 734 - "tracing", 735 - ] 736 - 737 - [[package]] 738 - name = "bevy_gizmos" 739 - version = "0.16.0" 740 - source = "registry+https://github.com/rust-lang/crates.io-index" 741 - checksum = "54af8145b35ab2a830a6dd1058e23c1e1ddc4b893db79d295259ef82f51c7520" 742 - dependencies = [ 743 - "bevy_app", 744 - "bevy_asset", 745 - "bevy_color", 746 - "bevy_core_pipeline", 747 - "bevy_ecs", 748 - "bevy_gizmos_macros", 749 - "bevy_image", 750 - "bevy_math", 751 - "bevy_pbr", 752 - "bevy_reflect", 753 - "bevy_render", 754 - "bevy_sprite", 755 - "bevy_time", 756 - "bevy_transform", 757 - "bevy_utils", 758 - "bytemuck", 759 - "tracing", 760 - ] 761 - 762 - [[package]] 763 - name = "bevy_gizmos_macros" 764 - version = "0.16.0" 765 - source = "registry+https://github.com/rust-lang/crates.io-index" 766 - checksum = "40137ace61f092b7a09eba41d7d1e6aef941f53a7818b06ef86dcce7b6a1fd3f" 767 - dependencies = [ 768 - "bevy_macro_utils", 769 - "proc-macro2", 770 - "quote", 771 - "syn 2.0.101", 772 - ] 773 - 774 - [[package]] 775 - name = "bevy_gltf" 776 - version = "0.16.0" 777 - source = "registry+https://github.com/rust-lang/crates.io-index" 778 - checksum = "aa25b809ee024ef2682bafc1ca22ca8275552edb549dc6f69a030fdffd976c63" 779 - dependencies = [ 780 - "base64 0.22.1", 781 - "bevy_animation", 782 - "bevy_app", 783 - "bevy_asset", 784 - "bevy_color", 785 - "bevy_core_pipeline", 786 - "bevy_ecs", 787 - "bevy_image", 788 - "bevy_math", 789 - "bevy_mesh", 790 - "bevy_pbr", 791 - "bevy_platform", 792 - "bevy_reflect", 793 - "bevy_render", 794 - "bevy_scene", 795 - "bevy_tasks", 796 - "bevy_transform", 797 - "bevy_utils", 798 - "fixedbitset", 799 - "gltf", 800 - "itertools 0.14.0", 801 - "percent-encoding", 802 - "serde", 803 - "serde_json", 804 - "smallvec", 805 - "thiserror 2.0.12", 806 - "tracing", 807 - ] 808 - 809 - [[package]] 810 - name = "bevy_image" 811 - version = "0.16.0" 812 - source = "registry+https://github.com/rust-lang/crates.io-index" 813 - checksum = "840b25f7f58894c641739f756959028a04f519c448db7e2cd3e2e29fc5fd188d" 814 - dependencies = [ 815 - "bevy_app", 816 - "bevy_asset", 817 - "bevy_color", 818 - "bevy_math", 819 - "bevy_platform", 820 - "bevy_reflect", 821 - "bevy_utils", 822 - "bitflags 2.9.0", 823 - "bytemuck", 824 - "futures-lite", 825 - "guillotiere", 826 - "half", 827 - "image 0.25.6", 828 - "ktx2", 829 - "rectangle-pack", 830 - "ruzstd", 831 - "serde", 832 - "thiserror 2.0.12", 833 - "tracing", 834 - "wgpu-types", 835 - ] 836 - 837 - [[package]] 838 - name = "bevy_input" 839 - version = "0.16.0" 840 - source = "registry+https://github.com/rust-lang/crates.io-index" 841 - checksum = "763410715714f3d4d2dcdf077af276e2e4ea93fd8081b183d446d060ea95baaa" 842 - dependencies = [ 843 - "bevy_app", 844 - "bevy_ecs", 845 - "bevy_math", 846 - "bevy_platform", 847 - "bevy_reflect", 848 - "bevy_utils", 849 - "derive_more", 850 - "log", 851 - "smol_str", 852 - "thiserror 2.0.12", 853 - ] 854 - 855 - [[package]] 856 - name = "bevy_input_focus" 857 - version = "0.16.0" 858 - source = "registry+https://github.com/rust-lang/crates.io-index" 859 - checksum = "d7e7b4ed65e10927a39a987cf85ef98727dd319aafb6e6835f2cb05b883c6d66" 860 - dependencies = [ 861 - "bevy_app", 862 - "bevy_ecs", 863 - "bevy_input", 864 - "bevy_math", 865 - "bevy_reflect", 866 - "bevy_window", 867 - "log", 868 - "thiserror 2.0.12", 869 - ] 870 - 871 - [[package]] 872 - name = "bevy_internal" 873 - version = "0.16.0" 874 - source = "registry+https://github.com/rust-lang/crates.io-index" 875 - checksum = "526ffd64c58004cb97308826e896c07d0e23dc056c243b97492e31cdf72e2830" 876 - dependencies = [ 877 - "bevy_a11y", 878 - "bevy_animation", 879 - "bevy_app", 880 - "bevy_asset", 881 - "bevy_audio", 882 - "bevy_color", 883 - "bevy_core_pipeline", 884 - "bevy_derive", 885 - "bevy_diagnostic", 886 - "bevy_ecs", 887 - "bevy_gilrs", 888 - "bevy_gizmos", 889 - "bevy_gltf", 890 - "bevy_image", 891 - "bevy_input", 892 - "bevy_input_focus", 893 - "bevy_log", 894 - "bevy_math", 895 - "bevy_pbr", 896 - "bevy_picking", 897 - "bevy_platform", 898 - "bevy_ptr", 899 - "bevy_reflect", 900 - "bevy_render", 901 - "bevy_scene", 902 - "bevy_sprite", 903 - "bevy_state", 904 - "bevy_tasks", 905 - "bevy_text", 906 - "bevy_time", 907 - "bevy_transform", 908 - "bevy_ui", 909 - "bevy_utils", 910 - "bevy_window", 911 - "bevy_winit", 912 - ] 913 - 914 - [[package]] 915 - name = "bevy_log" 916 - version = "0.16.0" 917 - source = "registry+https://github.com/rust-lang/crates.io-index" 918 - checksum = "7156df8d2f11135cf71c03eb4c11132b65201fd4f51648571e59e39c9c9ee2f6" 919 - dependencies = [ 920 - "android_log-sys", 921 - "bevy_app", 922 - "bevy_ecs", 923 - "bevy_utils", 924 - "tracing", 925 - "tracing-log", 926 - "tracing-oslog", 927 - "tracing-subscriber", 928 - "tracing-wasm", 929 - ] 930 - 931 - [[package]] 932 - name = "bevy_macro_utils" 933 - version = "0.16.0" 934 - source = "registry+https://github.com/rust-lang/crates.io-index" 935 - checksum = "7a2473db70d8785b5c75d6dd951a2e51e9be2c2311122db9692c79c9d887517b" 936 - dependencies = [ 937 - "parking_lot", 938 - "proc-macro2", 939 - "quote", 940 - "syn 2.0.101", 941 - "toml_edit", 942 - ] 943 - 944 - [[package]] 945 - name = "bevy_math" 946 - version = "0.16.0" 947 - source = "registry+https://github.com/rust-lang/crates.io-index" 948 - checksum = "f1a3a926d02dc501c6156a047510bdb538dcb1fa744eeba13c824b73ba88de55" 949 - dependencies = [ 950 - "approx", 951 - "bevy_reflect", 952 - "derive_more", 953 - "glam 0.29.3", 954 - "itertools 0.14.0", 955 - "libm", 956 - "rand", 957 - "rand_distr", 958 - "serde", 959 - "smallvec", 960 - "thiserror 2.0.12", 961 - "variadics_please", 962 - ] 963 - 964 - [[package]] 965 - name = "bevy_mesh" 966 - version = "0.16.0" 967 - source = "registry+https://github.com/rust-lang/crates.io-index" 968 - checksum = "12af58280c7453e32e2f083d86eaa4c9b9d03ea8683977108ded8f1930c539f2" 969 - dependencies = [ 970 - "bevy_asset", 971 - "bevy_derive", 972 - "bevy_ecs", 973 - "bevy_image", 974 - "bevy_math", 975 - "bevy_mikktspace", 976 - "bevy_platform", 977 - "bevy_reflect", 978 - "bevy_transform", 979 - "bevy_utils", 980 - "bitflags 2.9.0", 981 - "bytemuck", 982 - "hexasphere", 983 - "serde", 984 - "thiserror 2.0.12", 985 - "tracing", 986 - "wgpu-types", 987 - ] 988 - 989 - [[package]] 990 - name = "bevy_mikktspace" 991 - version = "0.16.0" 992 - source = "registry+https://github.com/rust-lang/crates.io-index" 993 - checksum = "75e0258423c689f764556e36b5d9eebdbf624b29a1fd5b33cd9f6c42dcc4d5f3" 994 - dependencies = [ 995 - "glam 0.29.3", 996 - ] 997 - 998 - [[package]] 999 - name = "bevy_pbr" 1000 - version = "0.16.0" 1001 - source = "registry+https://github.com/rust-lang/crates.io-index" 1002 - checksum = "d9fe0de43b68bf9e5090a33efc963f125e9d3f9d97be9ebece7bcfdde1b6da80" 1003 - dependencies = [ 1004 - "bevy_app", 1005 - "bevy_asset", 1006 - "bevy_color", 1007 - "bevy_core_pipeline", 1008 - "bevy_derive", 1009 - "bevy_diagnostic", 1010 - "bevy_ecs", 1011 - "bevy_image", 1012 - "bevy_math", 1013 - "bevy_platform", 1014 - "bevy_reflect", 1015 - "bevy_render", 1016 - "bevy_transform", 1017 - "bevy_utils", 1018 - "bevy_window", 1019 - "bitflags 2.9.0", 1020 - "bytemuck", 1021 - "derive_more", 1022 - "fixedbitset", 1023 - "nonmax", 1024 - "offset-allocator", 1025 - "radsort", 1026 - "smallvec", 1027 - "static_assertions", 1028 - "thiserror 2.0.12", 1029 - "tracing", 1030 - ] 1031 - 1032 - [[package]] 1033 - name = "bevy_picking" 1034 - version = "0.16.0" 1035 - source = "registry+https://github.com/rust-lang/crates.io-index" 1036 - checksum = "f73674f62b1033006bd75c89033f5d3516386cfd7d43bb9f7665012c0ab14d22" 1037 - dependencies = [ 1038 - "bevy_app", 1039 - "bevy_asset", 1040 - "bevy_derive", 1041 - "bevy_ecs", 1042 - "bevy_input", 1043 - "bevy_math", 1044 - "bevy_mesh", 1045 - "bevy_platform", 1046 - "bevy_reflect", 1047 - "bevy_render", 1048 - "bevy_time", 1049 - "bevy_transform", 1050 - "bevy_utils", 1051 - "bevy_window", 1052 - "crossbeam-channel", 1053 - "tracing", 1054 - "uuid", 1055 - ] 1056 - 1057 - [[package]] 1058 - name = "bevy_platform" 1059 - version = "0.16.0" 1060 - source = "registry+https://github.com/rust-lang/crates.io-index" 1061 - checksum = "704db2c11b7bc31093df4fbbdd3769f9606a6a5287149f4b51f2680f25834ebc" 1062 - dependencies = [ 1063 - "cfg-if", 1064 - "critical-section", 1065 - "foldhash", 1066 - "getrandom 0.2.16", 1067 - "hashbrown", 1068 - "portable-atomic", 1069 - "portable-atomic-util", 1070 - "serde", 1071 - "spin", 1072 - "web-time", 1073 - ] 1074 - 1075 - [[package]] 1076 - name = "bevy_ptr" 1077 - version = "0.16.0" 1078 - source = "registry+https://github.com/rust-lang/crates.io-index" 1079 - checksum = "86f1275dfb4cfef4ffc90c3fa75408964864facf833acc932413d52aa5364ba4" 1080 - 1081 - [[package]] 1082 - name = "bevy_reflect" 1083 - version = "0.16.0" 1084 - source = "registry+https://github.com/rust-lang/crates.io-index" 1085 - checksum = "607ebacc31029cf2f39ac330eabf1d4bc411b159528ec08dbe6b0593eaccfd41" 1086 - dependencies = [ 1087 - "assert_type_match", 1088 - "bevy_platform", 1089 - "bevy_ptr", 1090 - "bevy_reflect_derive", 1091 - "bevy_utils", 1092 - "derive_more", 1093 - "disqualified", 1094 - "downcast-rs 2.0.1", 1095 - "erased-serde", 1096 - "foldhash", 1097 - "glam 0.29.3", 1098 - "petgraph", 1099 - "serde", 1100 - "smallvec", 1101 - "smol_str", 1102 - "thiserror 2.0.12", 1103 - "uuid", 1104 - "variadics_please", 1105 - "wgpu-types", 1106 - ] 1107 - 1108 - [[package]] 1109 - name = "bevy_reflect_derive" 1110 - version = "0.16.0" 1111 - source = "registry+https://github.com/rust-lang/crates.io-index" 1112 - checksum = "cf35e45e4eb239018369f63f2adc2107a54c329f9276d020e01eee1625b0238b" 1113 - dependencies = [ 1114 - "bevy_macro_utils", 1115 - "proc-macro2", 1116 - "quote", 1117 - "syn 2.0.101", 1118 - "uuid", 1119 - ] 1120 - 1121 - [[package]] 1122 - name = "bevy_render" 1123 - version = "0.16.0" 1124 - source = "registry+https://github.com/rust-lang/crates.io-index" 1125 - checksum = "85a7306235b3343b032801504f3e884b93abfb7ba58179fc555c479df509f349" 1126 - dependencies = [ 1127 - "async-channel", 1128 - "bevy_app", 1129 - "bevy_asset", 1130 - "bevy_color", 1131 - "bevy_derive", 1132 - "bevy_diagnostic", 1133 - "bevy_ecs", 1134 - "bevy_encase_derive", 1135 - "bevy_image", 1136 - "bevy_math", 1137 - "bevy_mesh", 1138 - "bevy_platform", 1139 - "bevy_reflect", 1140 - "bevy_render_macros", 1141 - "bevy_tasks", 1142 - "bevy_time", 1143 - "bevy_transform", 1144 - "bevy_utils", 1145 - "bevy_window", 1146 - "bitflags 2.9.0", 1147 - "bytemuck", 1148 - "codespan-reporting", 1149 - "derive_more", 1150 - "downcast-rs 2.0.1", 1151 - "encase", 1152 - "fixedbitset", 1153 - "futures-lite", 1154 - "image 0.25.6", 1155 - "indexmap", 1156 - "js-sys", 1157 - "ktx2", 1158 - "naga", 1159 - "naga_oil", 1160 - "nonmax", 1161 - "offset-allocator", 1162 - "send_wrapper", 1163 - "serde", 1164 - "smallvec", 1165 - "thiserror 2.0.12", 1166 - "tracing", 1167 - "variadics_please", 1168 - "wasm-bindgen", 1169 - "web-sys", 1170 - "wgpu", 1171 - ] 1172 - 1173 - [[package]] 1174 - name = "bevy_render_macros" 1175 - version = "0.16.0" 1176 - source = "registry+https://github.com/rust-lang/crates.io-index" 1177 - checksum = "b85c4fb26b66d3a257b655485d11b9b6df9d3c85026493ba8092767a5edfc1b2" 1178 - dependencies = [ 1179 - "bevy_macro_utils", 1180 - "proc-macro2", 1181 - "quote", 1182 - "syn 2.0.101", 1183 - ] 1184 - 1185 - [[package]] 1186 - name = "bevy_scene" 1187 - version = "0.16.0" 1188 - source = "registry+https://github.com/rust-lang/crates.io-index" 1189 - checksum = "e7b628f560f2d2fe9f35ecd4526627ba3992f082de03fd745536e4053a0266fe" 1190 - dependencies = [ 1191 - "bevy_app", 1192 - "bevy_asset", 1193 - "bevy_derive", 1194 - "bevy_ecs", 1195 - "bevy_platform", 1196 - "bevy_reflect", 1197 - "bevy_render", 1198 - "bevy_transform", 1199 - "bevy_utils", 1200 - "derive_more", 1201 - "serde", 1202 - "thiserror 2.0.12", 1203 - "uuid", 1204 - ] 1205 - 1206 - [[package]] 1207 - name = "bevy_sprite" 1208 - version = "0.16.0" 1209 - source = "registry+https://github.com/rust-lang/crates.io-index" 1210 - checksum = "01f97bf54fb1c37a1077139b59bb32bc77f7ca53149cfcaa512adbb69a2d492c" 1211 - dependencies = [ 1212 - "bevy_app", 1213 - "bevy_asset", 1214 - "bevy_color", 1215 - "bevy_core_pipeline", 1216 - "bevy_derive", 1217 - "bevy_ecs", 1218 - "bevy_image", 1219 - "bevy_math", 1220 - "bevy_picking", 1221 - "bevy_platform", 1222 - "bevy_reflect", 1223 - "bevy_render", 1224 - "bevy_transform", 1225 - "bevy_utils", 1226 - "bevy_window", 1227 - "bitflags 2.9.0", 1228 - "bytemuck", 1229 - "derive_more", 1230 - "fixedbitset", 1231 - "nonmax", 1232 - "radsort", 1233 - "tracing", 1234 - ] 1235 - 1236 - [[package]] 1237 - name = "bevy_state" 1238 - version = "0.16.0" 1239 - source = "registry+https://github.com/rust-lang/crates.io-index" 1240 - checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" 1241 - dependencies = [ 1242 - "bevy_app", 1243 - "bevy_ecs", 1244 - "bevy_platform", 1245 - "bevy_reflect", 1246 - "bevy_state_macros", 1247 - "bevy_utils", 1248 - "log", 1249 - "variadics_please", 1250 - ] 1251 - 1252 - [[package]] 1253 - name = "bevy_state_macros" 1254 - version = "0.16.0" 1255 - source = "registry+https://github.com/rust-lang/crates.io-index" 1256 - checksum = "55b4bf3970c4f0e60572901df4641656722172c222d71a80c430d36b0e31426c" 1257 - dependencies = [ 1258 - "bevy_macro_utils", 1259 - "proc-macro2", 1260 - "quote", 1261 - "syn 2.0.101", 1262 - ] 1263 - 1264 - [[package]] 1265 - name = "bevy_tasks" 1266 - version = "0.16.0" 1267 - source = "registry+https://github.com/rust-lang/crates.io-index" 1268 - checksum = "444c450b65e108855f42ecb6db0c041a56ea7d7f10cc6222f0ca95e9536a7d19" 1269 - dependencies = [ 1270 - "async-channel", 1271 - "async-executor", 1272 - "async-task", 1273 - "atomic-waker", 1274 - "bevy_platform", 1275 - "cfg-if", 1276 - "concurrent-queue", 1277 - "crossbeam-queue", 1278 - "derive_more", 1279 - "futures-channel", 1280 - "futures-lite", 1281 - "heapless", 1282 - "pin-project", 1283 - "wasm-bindgen-futures", 1284 - ] 1285 - 1286 - [[package]] 1287 - name = "bevy_text" 1288 - version = "0.16.0" 1289 - source = "registry+https://github.com/rust-lang/crates.io-index" 1290 - checksum = "8ef071262c5a9afbc39caba4c0b282c7d045fbb5cf33bdab1924bd2343403833" 1291 - dependencies = [ 1292 - "bevy_app", 1293 - "bevy_asset", 1294 - "bevy_color", 1295 - "bevy_derive", 1296 - "bevy_ecs", 1297 - "bevy_image", 1298 - "bevy_log", 1299 - "bevy_math", 1300 - "bevy_platform", 1301 - "bevy_reflect", 1302 - "bevy_render", 1303 - "bevy_sprite", 1304 - "bevy_transform", 1305 - "bevy_utils", 1306 - "bevy_window", 1307 - "cosmic-text", 1308 - "serde", 1309 - "smallvec", 1310 - "sys-locale", 1311 - "thiserror 2.0.12", 1312 - "tracing", 1313 - "unicode-bidi", 1314 - ] 1315 - 1316 - [[package]] 1317 - name = "bevy_time" 1318 - version = "0.16.0" 1319 - source = "registry+https://github.com/rust-lang/crates.io-index" 1320 - checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" 1321 - dependencies = [ 1322 - "bevy_app", 1323 - "bevy_ecs", 1324 - "bevy_platform", 1325 - "bevy_reflect", 1326 - "crossbeam-channel", 1327 - "log", 1328 - "serde", 1329 - ] 1330 - 1331 - [[package]] 1332 - name = "bevy_transform" 1333 - version = "0.16.0" 1334 - source = "registry+https://github.com/rust-lang/crates.io-index" 1335 - checksum = "8479cdd5461246943956a7c8347e4e5d6ff857e57add889fb50eee0b5c26ab48" 1336 - dependencies = [ 1337 - "bevy_app", 1338 - "bevy_ecs", 1339 - "bevy_log", 1340 - "bevy_math", 1341 - "bevy_reflect", 1342 - "bevy_tasks", 1343 - "bevy_utils", 1344 - "derive_more", 1345 - "serde", 1346 - "thiserror 2.0.12", 1347 - ] 1348 - 1349 - [[package]] 1350 - name = "bevy_ui" 1351 - version = "0.16.0" 1352 - source = "registry+https://github.com/rust-lang/crates.io-index" 1353 - checksum = "110dc5d0059f112263512be8cd7bfe0466dfb7c26b9bf4c74529355249fd23f9" 1354 - dependencies = [ 1355 - "accesskit", 1356 - "bevy_a11y", 1357 - "bevy_app", 1358 - "bevy_asset", 1359 - "bevy_color", 1360 - "bevy_core_pipeline", 1361 - "bevy_derive", 1362 - "bevy_ecs", 1363 - "bevy_image", 1364 - "bevy_input", 1365 - "bevy_math", 1366 - "bevy_picking", 1367 - "bevy_platform", 1368 - "bevy_reflect", 1369 - "bevy_render", 1370 - "bevy_sprite", 1371 - "bevy_text", 1372 - "bevy_transform", 1373 - "bevy_utils", 1374 - "bevy_window", 1375 - "bytemuck", 1376 - "derive_more", 1377 - "nonmax", 1378 - "smallvec", 1379 - "taffy", 1380 - "thiserror 2.0.12", 1381 - "tracing", 1382 - ] 1383 - 1384 - [[package]] 1385 - name = "bevy_utils" 1386 - version = "0.16.0" 1387 - source = "registry+https://github.com/rust-lang/crates.io-index" 1388 - checksum = "ac2da3b3c1f94dadefcbe837aaa4aa119fcea37f7bdc5307eb05b4ede1921e24" 1389 - dependencies = [ 1390 - "bevy_platform", 1391 - "thread_local", 1392 - ] 1393 - 1394 - [[package]] 1395 - name = "bevy_window" 1396 - version = "0.16.0" 1397 - source = "registry+https://github.com/rust-lang/crates.io-index" 1398 - checksum = "0d83327cc5584da463d12b7a88ddb97f9e006828832287e1564531171fffdeb4" 1399 - dependencies = [ 1400 - "android-activity", 1401 - "bevy_app", 1402 - "bevy_ecs", 1403 - "bevy_input", 1404 - "bevy_math", 1405 - "bevy_platform", 1406 - "bevy_reflect", 1407 - "bevy_utils", 1408 - "log", 1409 - "raw-window-handle", 1410 - "serde", 1411 - "smol_str", 1412 - ] 1413 - 1414 - [[package]] 1415 - name = "bevy_winit" 1416 - version = "0.16.0" 1417 - source = "registry+https://github.com/rust-lang/crates.io-index" 1418 - checksum = "57b14928923ae4274f4b867dce3d0e7b2c8a31bebcb0f6e65a4261c3e0765064" 1419 - dependencies = [ 1420 - "accesskit", 1421 - "accesskit_winit", 1422 - "approx", 1423 - "bevy_a11y", 1424 - "bevy_app", 1425 - "bevy_asset", 1426 - "bevy_derive", 1427 - "bevy_ecs", 1428 - "bevy_image", 1429 - "bevy_input", 1430 - "bevy_input_focus", 1431 - "bevy_log", 1432 - "bevy_math", 1433 - "bevy_platform", 1434 - "bevy_reflect", 1435 - "bevy_tasks", 1436 - "bevy_utils", 1437 - "bevy_window", 1438 - "bytemuck", 1439 - "cfg-if", 1440 - "crossbeam-channel", 1441 - "raw-window-handle", 1442 - "tracing", 1443 - "wasm-bindgen", 1444 - "web-sys", 1445 - "wgpu-types", 1446 - "winit", 1447 - ] 1448 - 1449 - [[package]] 1450 - name = "bindgen" 1451 - version = "0.70.1" 1452 - source = "registry+https://github.com/rust-lang/crates.io-index" 1453 - checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 1454 - dependencies = [ 1455 - "bitflags 2.9.0", 1456 - "cexpr", 1457 - "clang-sys", 1458 - "itertools 0.13.0", 1459 - "log", 1460 - "prettyplease", 1461 - "proc-macro2", 1462 - "quote", 1463 - "regex", 1464 - "rustc-hash", 1465 - "shlex", 1466 - "syn 2.0.101", 1467 - ] 1468 - 1469 - [[package]] 1470 - name = "binrw" 1471 - version = "0.15.0" 1472 - source = "registry+https://github.com/rust-lang/crates.io-index" 1473 - checksum = "81419ff39e6ed10a92a7f125290859776ced35d9a08a665ae40b23e7ca702f30" 1474 - dependencies = [ 1475 - "array-init", 1476 - "binrw_derive", 1477 - "bytemuck", 1478 - ] 1479 - 1480 - [[package]] 1481 - name = "binrw_derive" 1482 - version = "0.15.0" 1483 - source = "registry+https://github.com/rust-lang/crates.io-index" 1484 - checksum = "376404e55ec40d0d6f8b4b7df3f87b87954bd987f0cf9a7207ea3b6ea5c9add4" 1485 - dependencies = [ 1486 - "either", 1487 - "owo-colors", 1488 - "proc-macro2", 1489 - "quote", 1490 - "syn 2.0.101", 1491 - ] 1492 - 1493 - [[package]] 1494 - name = "bit-set" 1495 - version = "0.5.3" 1496 - source = "registry+https://github.com/rust-lang/crates.io-index" 1497 - checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 1498 - dependencies = [ 1499 - "bit-vec 0.6.3", 1500 - ] 1501 - 1502 - [[package]] 1503 - name = "bit-set" 1504 - version = "0.8.0" 1505 - source = "registry+https://github.com/rust-lang/crates.io-index" 1506 - checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 1507 - dependencies = [ 1508 - "bit-vec 0.8.0", 1509 - ] 1510 - 1511 - [[package]] 1512 - name = "bit-vec" 1513 - version = "0.6.3" 1514 - source = "registry+https://github.com/rust-lang/crates.io-index" 1515 - checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 1516 - 1517 - [[package]] 1518 - name = "bit-vec" 1519 - version = "0.8.0" 1520 - source = "registry+https://github.com/rust-lang/crates.io-index" 1521 - checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 1522 - 1523 - [[package]] 1524 - name = "bit_field" 1525 - version = "0.10.2" 1526 - source = "registry+https://github.com/rust-lang/crates.io-index" 1527 - checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" 1528 - 1529 - [[package]] 1530 - name = "bitflags" 1531 - version = "1.3.2" 1532 - source = "registry+https://github.com/rust-lang/crates.io-index" 1533 - checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 1534 - 1535 - [[package]] 1536 - name = "bitflags" 1537 - version = "2.9.0" 1538 - source = "registry+https://github.com/rust-lang/crates.io-index" 1539 - checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 1540 - dependencies = [ 1541 - "serde", 1542 - ] 1543 - 1544 - [[package]] 1545 - name = "bitstream-io" 1546 - version = "2.6.0" 1547 - source = "registry+https://github.com/rust-lang/crates.io-index" 1548 - checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" 1549 - 1550 - [[package]] 1551 - name = "blake3" 1552 - version = "1.8.2" 1553 - source = "registry+https://github.com/rust-lang/crates.io-index" 1554 - checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" 1555 - dependencies = [ 1556 - "arrayref", 1557 - "arrayvec", 1558 - "cc", 1559 - "cfg-if", 1560 - "constant_time_eq", 1561 - ] 1562 - 1563 - [[package]] 1564 - name = "block" 1565 - version = "0.1.6" 1566 - source = "registry+https://github.com/rust-lang/crates.io-index" 1567 - checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 1568 - 1569 - [[package]] 1570 - name = "block2" 1571 - version = "0.5.1" 1572 - source = "registry+https://github.com/rust-lang/crates.io-index" 1573 - checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 1574 - dependencies = [ 1575 - "objc2 0.5.2", 1576 - ] 1577 - 1578 - [[package]] 1579 - name = "blocking" 1580 - version = "1.6.1" 1581 - source = "registry+https://github.com/rust-lang/crates.io-index" 1582 - checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 1583 - dependencies = [ 1584 - "async-channel", 1585 - "async-task", 1586 - "futures-io", 1587 - "futures-lite", 1588 - "piper", 1589 - ] 1590 - 1591 - [[package]] 1592 - name = "built" 1593 - version = "0.7.7" 1594 - source = "registry+https://github.com/rust-lang/crates.io-index" 1595 - checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" 1596 - 1597 - [[package]] 1598 - name = "bumpalo" 1599 - version = "3.17.0" 1600 - source = "registry+https://github.com/rust-lang/crates.io-index" 1601 - checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 1602 - 1603 - [[package]] 1604 - name = "bytemuck" 1605 - version = "1.23.0" 1606 - source = "registry+https://github.com/rust-lang/crates.io-index" 1607 - checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" 1608 - dependencies = [ 1609 - "bytemuck_derive", 1610 - ] 1611 - 1612 - [[package]] 1613 - name = "bytemuck_derive" 1614 - version = "1.9.3" 1615 - source = "registry+https://github.com/rust-lang/crates.io-index" 1616 - checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" 1617 - dependencies = [ 1618 - "proc-macro2", 1619 - "quote", 1620 - "syn 2.0.101", 1621 - ] 1622 - 1623 - [[package]] 1624 - name = "byteorder" 1625 - version = "1.5.0" 1626 - source = "registry+https://github.com/rust-lang/crates.io-index" 1627 - checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 1628 - 1629 - [[package]] 1630 - name = "byteorder-lite" 1631 - version = "0.1.0" 1632 - source = "registry+https://github.com/rust-lang/crates.io-index" 1633 - checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 1634 - 1635 - [[package]] 1636 - name = "bytes" 1637 - version = "1.10.1" 1638 - source = "registry+https://github.com/rust-lang/crates.io-index" 1639 - checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 1640 - 1641 - [[package]] 1642 - name = "calloop" 1643 - version = "0.13.0" 1644 - source = "registry+https://github.com/rust-lang/crates.io-index" 1645 - checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" 1646 - dependencies = [ 1647 - "bitflags 2.9.0", 1648 - "log", 1649 - "polling", 1650 - "rustix", 1651 - "slab", 1652 - "thiserror 1.0.69", 1653 - ] 1654 - 1655 - [[package]] 1656 - name = "calloop-wayland-source" 1657 - version = "0.3.0" 1658 - source = "registry+https://github.com/rust-lang/crates.io-index" 1659 - checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" 1660 - dependencies = [ 1661 - "calloop", 1662 - "rustix", 1663 - "wayland-backend", 1664 - "wayland-client", 1665 - ] 1666 - 1667 - [[package]] 1668 - name = "cc" 1669 - version = "1.2.22" 1670 - source = "registry+https://github.com/rust-lang/crates.io-index" 1671 - checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" 1672 - dependencies = [ 1673 - "jobserver", 1674 - "libc", 1675 - "shlex", 1676 - ] 1677 - 1678 - [[package]] 1679 - name = "cesu8" 1680 - version = "1.1.0" 1681 - source = "registry+https://github.com/rust-lang/crates.io-index" 1682 - checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 1683 - 1684 - [[package]] 1685 - name = "cexpr" 1686 - version = "0.6.0" 1687 - source = "registry+https://github.com/rust-lang/crates.io-index" 1688 - checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 1689 - dependencies = [ 1690 - "nom", 1691 - ] 1692 - 1693 - [[package]] 1694 - name = "cfg-expr" 1695 - version = "0.15.8" 1696 - source = "registry+https://github.com/rust-lang/crates.io-index" 1697 - checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 1698 - dependencies = [ 1699 - "smallvec", 1700 - "target-lexicon", 1701 - ] 1702 - 1703 - [[package]] 1704 - name = "cfg-if" 1705 - version = "1.0.0" 1706 - source = "registry+https://github.com/rust-lang/crates.io-index" 1707 - checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 1708 - 1709 - [[package]] 1710 - name = "cfg_aliases" 1711 - version = "0.2.1" 1712 - source = "registry+https://github.com/rust-lang/crates.io-index" 1713 - checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 1714 - 1715 - [[package]] 1716 - name = "clang-sys" 1717 - version = "1.8.1" 1718 - source = "registry+https://github.com/rust-lang/crates.io-index" 1719 - checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 1720 - dependencies = [ 1721 - "glob", 1722 - "libc", 1723 - "libloading", 1724 - ] 1725 - 1726 - [[package]] 1727 - name = "clipboard-win" 1728 - version = "5.4.0" 1729 - source = "registry+https://github.com/rust-lang/crates.io-index" 1730 - checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" 1731 - dependencies = [ 1732 - "error-code", 1733 - ] 1734 - 1735 - [[package]] 1736 - name = "codespan-reporting" 1737 - version = "0.11.1" 1738 - source = "registry+https://github.com/rust-lang/crates.io-index" 1739 - checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 1740 - dependencies = [ 1741 - "termcolor", 1742 - "unicode-width", 1743 - ] 1744 - 1745 - [[package]] 1746 - name = "color_quant" 1747 - version = "1.1.0" 1748 - source = "registry+https://github.com/rust-lang/crates.io-index" 1749 - checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 1750 - 1751 - [[package]] 1752 - name = "combine" 1753 - version = "4.6.7" 1754 - source = "registry+https://github.com/rust-lang/crates.io-index" 1755 - checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 1756 - dependencies = [ 1757 - "bytes", 1758 - "memchr", 1759 - ] 1760 - 1761 - [[package]] 1762 - name = "concurrent-queue" 1763 - version = "2.5.0" 1764 - source = "registry+https://github.com/rust-lang/crates.io-index" 1765 - checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 1766 - dependencies = [ 1767 - "crossbeam-utils", 1768 - "portable-atomic", 1769 - ] 1770 - 1771 - [[package]] 1772 - name = "console_error_panic_hook" 1773 - version = "0.1.7" 1774 - source = "registry+https://github.com/rust-lang/crates.io-index" 1775 - checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 1776 - dependencies = [ 1777 - "cfg-if", 1778 - "wasm-bindgen", 1779 - ] 1780 - 1781 - [[package]] 1782 - name = "const-fnv1a-hash" 1783 - version = "1.1.0" 1784 - source = "registry+https://github.com/rust-lang/crates.io-index" 1785 - checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" 1786 - 1787 - [[package]] 1788 - name = "const_panic" 1789 - version = "0.2.12" 1790 - source = "registry+https://github.com/rust-lang/crates.io-index" 1791 - checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" 1792 - 1793 - [[package]] 1794 - name = "const_soft_float" 1795 - version = "0.1.4" 1796 - source = "registry+https://github.com/rust-lang/crates.io-index" 1797 - checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" 1798 - 1799 - [[package]] 1800 - name = "constant_time_eq" 1801 - version = "0.3.1" 1802 - source = "registry+https://github.com/rust-lang/crates.io-index" 1803 - checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 1804 - 1805 - [[package]] 1806 - name = "constgebra" 1807 - version = "0.1.4" 1808 - source = "registry+https://github.com/rust-lang/crates.io-index" 1809 - checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" 1810 - dependencies = [ 1811 - "const_soft_float", 1812 - ] 1813 - 1814 - [[package]] 1815 - name = "core-foundation" 1816 - version = "0.9.4" 1817 - source = "registry+https://github.com/rust-lang/crates.io-index" 1818 - checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 1819 - dependencies = [ 1820 - "core-foundation-sys", 1821 - "libc", 1822 - ] 1823 - 1824 - [[package]] 1825 - name = "core-foundation" 1826 - version = "0.10.0" 1827 - source = "registry+https://github.com/rust-lang/crates.io-index" 1828 - checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 1829 - dependencies = [ 1830 - "core-foundation-sys", 1831 - "libc", 1832 - ] 1833 - 1834 - [[package]] 1835 - name = "core-foundation-sys" 1836 - version = "0.8.7" 1837 - source = "registry+https://github.com/rust-lang/crates.io-index" 1838 - checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 1839 - 1840 - [[package]] 1841 - name = "core-graphics" 1842 - version = "0.23.2" 1843 - source = "registry+https://github.com/rust-lang/crates.io-index" 1844 - checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 1845 - dependencies = [ 1846 - "bitflags 1.3.2", 1847 - "core-foundation 0.9.4", 1848 - "core-graphics-types", 1849 - "foreign-types", 1850 - "libc", 1851 - ] 1852 - 1853 - [[package]] 1854 - name = "core-graphics-types" 1855 - version = "0.1.3" 1856 - source = "registry+https://github.com/rust-lang/crates.io-index" 1857 - checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 1858 - dependencies = [ 1859 - "bitflags 1.3.2", 1860 - "core-foundation 0.9.4", 1861 - "libc", 1862 - ] 1863 - 1864 - [[package]] 1865 - name = "coreaudio-rs" 1866 - version = "0.11.3" 1867 - source = "registry+https://github.com/rust-lang/crates.io-index" 1868 - checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" 1869 - dependencies = [ 1870 - "bitflags 1.3.2", 1871 - "core-foundation-sys", 1872 - "coreaudio-sys", 1873 - ] 1874 - 1875 - [[package]] 1876 - name = "coreaudio-sys" 1877 - version = "0.2.16" 1878 - source = "registry+https://github.com/rust-lang/crates.io-index" 1879 - checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" 1880 - dependencies = [ 1881 - "bindgen", 1882 - ] 1883 - 1884 - [[package]] 1885 - name = "cosmic-text" 1886 - version = "0.13.2" 1887 - source = "registry+https://github.com/rust-lang/crates.io-index" 1888 - checksum = "e418dd4f5128c3e93eab12246391c54a20c496811131f85754dc8152ee207892" 1889 - dependencies = [ 1890 - "bitflags 2.9.0", 1891 - "fontdb", 1892 - "log", 1893 - "rangemap", 1894 - "rustc-hash", 1895 - "rustybuzz", 1896 - "self_cell", 1897 - "smol_str", 1898 - "swash", 1899 - "sys-locale", 1900 - "ttf-parser 0.21.1", 1901 - "unicode-bidi", 1902 - "unicode-linebreak", 1903 - "unicode-script", 1904 - "unicode-segmentation", 1905 - ] 1906 - 1907 - [[package]] 1908 - name = "cpal" 1909 - version = "0.15.3" 1910 - source = "registry+https://github.com/rust-lang/crates.io-index" 1911 - checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" 1912 - dependencies = [ 1913 - "alsa", 1914 - "core-foundation-sys", 1915 - "coreaudio-rs", 1916 - "dasp_sample", 1917 - "jni", 1918 - "js-sys", 1919 - "libc", 1920 - "mach2", 1921 - "ndk 0.8.0", 1922 - "ndk-context", 1923 - "oboe", 1924 - "wasm-bindgen", 1925 - "wasm-bindgen-futures", 1926 - "web-sys", 1927 - "windows 0.54.0", 1928 - ] 1929 - 1930 - [[package]] 1931 - name = "crc32fast" 1932 - version = "1.4.2" 1933 - source = "registry+https://github.com/rust-lang/crates.io-index" 1934 - checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 1935 - dependencies = [ 1936 - "cfg-if", 1937 - ] 1938 - 1939 - [[package]] 1940 - name = "critical-section" 1941 - version = "1.2.0" 1942 - source = "registry+https://github.com/rust-lang/crates.io-index" 1943 - checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 1944 - 1945 - [[package]] 1946 - name = "crossbeam-channel" 1947 - version = "0.5.15" 1948 - source = "registry+https://github.com/rust-lang/crates.io-index" 1949 - checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 1950 - dependencies = [ 1951 - "crossbeam-utils", 1952 - ] 1953 - 1954 - [[package]] 1955 - name = "crossbeam-deque" 1956 - version = "0.8.6" 1957 - source = "registry+https://github.com/rust-lang/crates.io-index" 1958 - checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 1959 - dependencies = [ 1960 - "crossbeam-epoch", 1961 - "crossbeam-utils", 1962 - ] 1963 - 1964 - [[package]] 1965 - name = "crossbeam-epoch" 1966 - version = "0.9.18" 1967 - source = "registry+https://github.com/rust-lang/crates.io-index" 1968 - checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 1969 - dependencies = [ 1970 - "crossbeam-utils", 1971 - ] 1972 - 1973 - [[package]] 1974 - name = "crossbeam-queue" 1975 - version = "0.3.12" 1976 - source = "registry+https://github.com/rust-lang/crates.io-index" 1977 - checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 1978 - dependencies = [ 1979 - "crossbeam-utils", 1980 - ] 1981 - 1982 - [[package]] 1983 - name = "crossbeam-utils" 1984 - version = "0.8.21" 1985 - source = "registry+https://github.com/rust-lang/crates.io-index" 1986 - checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 1987 - 1988 - [[package]] 1989 - name = "crunchy" 1990 - version = "0.2.3" 1991 - source = "registry+https://github.com/rust-lang/crates.io-index" 1992 - checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" 1993 - 1994 - [[package]] 1995 - name = "ctrlc" 1996 - version = "3.4.6" 1997 - source = "registry+https://github.com/rust-lang/crates.io-index" 1998 - checksum = "697b5419f348fd5ae2478e8018cb016c00a5881c7f46c717de98ffd135a5651c" 1999 - dependencies = [ 2000 - "nix", 2001 - "windows-sys 0.59.0", 2002 - ] 2003 - 2004 - [[package]] 2005 - name = "cursor-icon" 2006 - version = "1.1.0" 2007 - source = "registry+https://github.com/rust-lang/crates.io-index" 2008 - checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" 2009 - 2010 - [[package]] 2011 - name = "dasp_sample" 2012 - version = "0.11.0" 2013 - source = "registry+https://github.com/rust-lang/crates.io-index" 2014 - checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" 2015 - 2016 - [[package]] 2017 - name = "data-encoding" 2018 - version = "2.9.0" 2019 - source = "registry+https://github.com/rust-lang/crates.io-index" 2020 - checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 2021 - 2022 - [[package]] 2023 - name = "derive_more" 2024 - version = "1.0.0" 2025 - source = "registry+https://github.com/rust-lang/crates.io-index" 2026 - checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 2027 - dependencies = [ 2028 - "derive_more-impl", 2029 - ] 2030 - 2031 - [[package]] 2032 - name = "derive_more-impl" 2033 - version = "1.0.0" 2034 - source = "registry+https://github.com/rust-lang/crates.io-index" 2035 - checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 2036 - dependencies = [ 2037 - "proc-macro2", 2038 - "quote", 2039 - "syn 2.0.101", 2040 - "unicode-xid", 2041 - ] 2042 - 2043 - [[package]] 2044 - name = "dispatch" 2045 - version = "0.2.0" 2046 - source = "registry+https://github.com/rust-lang/crates.io-index" 2047 - checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 2048 - 2049 - [[package]] 2050 - name = "dispatch2" 2051 - version = "0.3.0" 2052 - source = "registry+https://github.com/rust-lang/crates.io-index" 2053 - checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 2054 - dependencies = [ 2055 - "bitflags 2.9.0", 2056 - "objc2 0.6.1", 2057 - ] 2058 - 2059 - [[package]] 2060 - name = "displaydoc" 2061 - version = "0.2.5" 2062 - source = "registry+https://github.com/rust-lang/crates.io-index" 2063 - checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 2064 - dependencies = [ 2065 - "proc-macro2", 2066 - "quote", 2067 - "syn 2.0.101", 2068 - ] 2069 - 2070 - [[package]] 2071 - name = "disqualified" 2072 - version = "1.0.0" 2073 - source = "registry+https://github.com/rust-lang/crates.io-index" 2074 - checksum = "c9c272297e804878a2a4b707cfcfc6d2328b5bb936944613b4fdf2b9269afdfd" 2075 - 2076 - [[package]] 2077 - name = "dlib" 2078 - version = "0.5.2" 2079 - source = "registry+https://github.com/rust-lang/crates.io-index" 2080 - checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 2081 - dependencies = [ 2082 - "libloading", 2083 - ] 2084 - 2085 - [[package]] 2086 - name = "document-features" 2087 - version = "0.2.11" 2088 - source = "registry+https://github.com/rust-lang/crates.io-index" 2089 - checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" 2090 - dependencies = [ 2091 - "litrs", 2092 - ] 2093 - 2094 - [[package]] 2095 - name = "downcast-rs" 2096 - version = "1.2.1" 2097 - source = "registry+https://github.com/rust-lang/crates.io-index" 2098 - checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 2099 - 2100 - [[package]] 2101 - name = "downcast-rs" 2102 - version = "2.0.1" 2103 - source = "registry+https://github.com/rust-lang/crates.io-index" 2104 - checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" 2105 - 2106 - [[package]] 2107 - name = "dpi" 2108 - version = "0.1.2" 2109 - source = "registry+https://github.com/rust-lang/crates.io-index" 2110 - checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" 2111 - 2112 - [[package]] 2113 - name = "ecolor" 2114 - version = "0.31.1" 2115 - source = "registry+https://github.com/rust-lang/crates.io-index" 2116 - checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" 2117 - dependencies = [ 2118 - "bytemuck", 2119 - "emath", 2120 - ] 2121 - 2122 - [[package]] 2123 - name = "egui" 2124 - version = "0.31.1" 2125 - source = "registry+https://github.com/rust-lang/crates.io-index" 2126 - checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" 2127 - dependencies = [ 2128 - "ahash", 2129 - "bitflags 2.9.0", 2130 - "emath", 2131 - "epaint", 2132 - "nohash-hasher", 2133 - "profiling", 2134 - ] 2135 - 2136 - [[package]] 2137 - name = "either" 2138 - version = "1.15.0" 2139 - source = "registry+https://github.com/rust-lang/crates.io-index" 2140 - checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 2141 - 2142 - [[package]] 2143 - name = "emath" 2144 - version = "0.31.1" 2145 - source = "registry+https://github.com/rust-lang/crates.io-index" 2146 - checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" 2147 - dependencies = [ 2148 - "bytemuck", 2149 - ] 2150 - 2151 - [[package]] 2152 - name = "encase" 2153 - version = "0.10.0" 2154 - source = "registry+https://github.com/rust-lang/crates.io-index" 2155 - checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" 2156 - dependencies = [ 2157 - "const_panic", 2158 - "encase_derive", 2159 - "glam 0.29.3", 2160 - "thiserror 1.0.69", 2161 - ] 2162 - 2163 - [[package]] 2164 - name = "encase_derive" 2165 - version = "0.10.0" 2166 - source = "registry+https://github.com/rust-lang/crates.io-index" 2167 - checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85" 2168 - dependencies = [ 2169 - "encase_derive_impl", 2170 - ] 2171 - 2172 - [[package]] 2173 - name = "encase_derive_impl" 2174 - version = "0.10.0" 2175 - source = "registry+https://github.com/rust-lang/crates.io-index" 2176 - checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" 2177 - dependencies = [ 2178 - "proc-macro2", 2179 - "quote", 2180 - "syn 2.0.101", 2181 - ] 2182 - 2183 - [[package]] 2184 - name = "epaint" 2185 - version = "0.31.1" 2186 - source = "registry+https://github.com/rust-lang/crates.io-index" 2187 - checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" 2188 - dependencies = [ 2189 - "ab_glyph", 2190 - "ahash", 2191 - "bytemuck", 2192 - "ecolor", 2193 - "emath", 2194 - "epaint_default_fonts", 2195 - "nohash-hasher", 2196 - "parking_lot", 2197 - "profiling", 2198 - ] 2199 - 2200 - [[package]] 2201 - name = "epaint_default_fonts" 2202 - version = "0.31.1" 2203 - source = "registry+https://github.com/rust-lang/crates.io-index" 2204 - checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" 2205 - 2206 - [[package]] 2207 - name = "equivalent" 2208 - version = "1.0.2" 2209 - source = "registry+https://github.com/rust-lang/crates.io-index" 2210 - checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 2211 - 2212 - [[package]] 2213 - name = "erased-serde" 2214 - version = "0.4.6" 2215 - source = "registry+https://github.com/rust-lang/crates.io-index" 2216 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 2217 - dependencies = [ 2218 - "serde", 2219 - "typeid", 2220 - ] 2221 - 2222 - [[package]] 2223 - name = "errno" 2224 - version = "0.3.11" 2225 - source = "registry+https://github.com/rust-lang/crates.io-index" 2226 - checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 2227 - dependencies = [ 2228 - "libc", 2229 - "windows-sys 0.59.0", 2230 - ] 2231 - 2232 - [[package]] 2233 - name = "error-code" 2234 - version = "3.3.2" 2235 - source = "registry+https://github.com/rust-lang/crates.io-index" 2236 - checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 2237 - 2238 - [[package]] 2239 - name = "euclid" 2240 - version = "0.22.11" 2241 - source = "registry+https://github.com/rust-lang/crates.io-index" 2242 - checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" 2243 - dependencies = [ 2244 - "num-traits", 2245 - ] 2246 - 2247 - [[package]] 2248 - name = "event-listener" 2249 - version = "5.4.0" 2250 - source = "registry+https://github.com/rust-lang/crates.io-index" 2251 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 2252 - dependencies = [ 2253 - "concurrent-queue", 2254 - "parking", 2255 - "pin-project-lite", 2256 - ] 2257 - 2258 - [[package]] 2259 - name = "event-listener-strategy" 2260 - version = "0.5.4" 2261 - source = "registry+https://github.com/rust-lang/crates.io-index" 2262 - checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 2263 - dependencies = [ 2264 - "event-listener", 2265 - "pin-project-lite", 2266 - ] 2267 - 2268 - [[package]] 2269 - name = "exr" 2270 - version = "1.73.0" 2271 - source = "registry+https://github.com/rust-lang/crates.io-index" 2272 - checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" 2273 - dependencies = [ 2274 - "bit_field", 2275 - "half", 2276 - "lebe", 2277 - "miniz_oxide", 2278 - "rayon-core", 2279 - "smallvec", 2280 - "zune-inflate", 2281 - ] 2282 - 2283 - [[package]] 2284 - name = "fastrand" 2285 - version = "2.3.0" 2286 - source = "registry+https://github.com/rust-lang/crates.io-index" 2287 - checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 2288 - 2289 - [[package]] 2290 - name = "fdeflate" 2291 - version = "0.3.7" 2292 - source = "registry+https://github.com/rust-lang/crates.io-index" 2293 - checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 2294 - dependencies = [ 2295 - "simd-adler32", 2296 - ] 2297 - 2298 - [[package]] 2299 - name = "fixedbitset" 2300 - version = "0.5.7" 2301 - source = "registry+https://github.com/rust-lang/crates.io-index" 2302 - checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 2303 - 2304 - [[package]] 2305 - name = "flate2" 2306 - version = "1.1.1" 2307 - source = "registry+https://github.com/rust-lang/crates.io-index" 2308 - checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 2309 - dependencies = [ 2310 - "crc32fast", 2311 - "libz-rs-sys", 2312 - "miniz_oxide", 2313 - ] 2314 - 2315 - [[package]] 2316 - name = "fnv" 2317 - version = "1.0.7" 2318 - source = "registry+https://github.com/rust-lang/crates.io-index" 2319 - checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 2320 - 2321 - [[package]] 2322 - name = "foldhash" 2323 - version = "0.1.5" 2324 - source = "registry+https://github.com/rust-lang/crates.io-index" 2325 - checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 2326 - 2327 - [[package]] 2328 - name = "font-types" 2329 - version = "0.9.0" 2330 - source = "registry+https://github.com/rust-lang/crates.io-index" 2331 - checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7" 2332 - dependencies = [ 2333 - "bytemuck", 2334 - ] 2335 - 2336 - [[package]] 2337 - name = "fontconfig-parser" 2338 - version = "0.5.7" 2339 - source = "registry+https://github.com/rust-lang/crates.io-index" 2340 - checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" 2341 - dependencies = [ 2342 - "roxmltree", 2343 - ] 2344 - 2345 - [[package]] 2346 - name = "fontdb" 2347 - version = "0.16.2" 2348 - source = "registry+https://github.com/rust-lang/crates.io-index" 2349 - checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" 2350 - dependencies = [ 2351 - "fontconfig-parser", 2352 - "log", 2353 - "memmap2", 2354 - "slotmap", 2355 - "tinyvec", 2356 - "ttf-parser 0.20.0", 2357 - ] 2358 - 2359 - [[package]] 2360 - name = "foreign-types" 2361 - version = "0.5.0" 2362 - source = "registry+https://github.com/rust-lang/crates.io-index" 2363 - checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 2364 - dependencies = [ 2365 - "foreign-types-macros", 2366 - "foreign-types-shared", 2367 - ] 2368 - 2369 - [[package]] 2370 - name = "foreign-types-macros" 2371 - version = "0.2.3" 2372 - source = "registry+https://github.com/rust-lang/crates.io-index" 2373 - checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 2374 - dependencies = [ 2375 - "proc-macro2", 2376 - "quote", 2377 - "syn 2.0.101", 2378 - ] 2379 - 2380 - [[package]] 2381 - name = "foreign-types-shared" 2382 - version = "0.3.1" 2383 - source = "registry+https://github.com/rust-lang/crates.io-index" 2384 - checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 2385 - 2386 - [[package]] 2387 - name = "form_urlencoded" 2388 - version = "1.2.1" 2389 - source = "registry+https://github.com/rust-lang/crates.io-index" 2390 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 2391 - dependencies = [ 2392 - "percent-encoding", 2393 - ] 2394 - 2395 - [[package]] 2396 - name = "futures-channel" 2397 - version = "0.3.31" 2398 - source = "registry+https://github.com/rust-lang/crates.io-index" 2399 - checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 2400 - dependencies = [ 2401 - "futures-core", 2402 - ] 2403 - 2404 - [[package]] 2405 - name = "futures-core" 2406 - version = "0.3.31" 2407 - source = "registry+https://github.com/rust-lang/crates.io-index" 2408 - checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 2409 - 2410 - [[package]] 2411 - name = "futures-io" 2412 - version = "0.3.31" 2413 - source = "registry+https://github.com/rust-lang/crates.io-index" 2414 - checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 2415 - 2416 - [[package]] 2417 - name = "futures-lite" 2418 - version = "2.6.0" 2419 - source = "registry+https://github.com/rust-lang/crates.io-index" 2420 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 2421 - dependencies = [ 2422 - "fastrand", 2423 - "futures-core", 2424 - "futures-io", 2425 - "parking", 2426 - "pin-project-lite", 2427 - ] 2428 - 2429 - [[package]] 2430 - name = "gethostname" 2431 - version = "0.4.3" 2432 - source = "registry+https://github.com/rust-lang/crates.io-index" 2433 - checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 2434 - dependencies = [ 2435 - "libc", 2436 - "windows-targets 0.48.5", 2437 - ] 2438 - 2439 - [[package]] 2440 - name = "getrandom" 2441 - version = "0.2.16" 2442 - source = "registry+https://github.com/rust-lang/crates.io-index" 2443 - checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 2444 - dependencies = [ 2445 - "cfg-if", 2446 - "js-sys", 2447 - "libc", 2448 - "wasi 0.11.0+wasi-snapshot-preview1", 2449 - "wasm-bindgen", 2450 - ] 2451 - 2452 - [[package]] 2453 - name = "getrandom" 2454 - version = "0.3.3" 2455 - source = "registry+https://github.com/rust-lang/crates.io-index" 2456 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 2457 - dependencies = [ 2458 - "cfg-if", 2459 - "libc", 2460 - "r-efi", 2461 - "wasi 0.14.2+wasi-0.2.4", 2462 - ] 2463 - 2464 - [[package]] 2465 - name = "gif" 2466 - version = "0.13.1" 2467 - source = "registry+https://github.com/rust-lang/crates.io-index" 2468 - checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" 2469 - dependencies = [ 2470 - "color_quant", 2471 - "weezl", 2472 - ] 2473 - 2474 - [[package]] 2475 - name = "gilrs" 2476 - version = "0.11.0" 2477 - source = "registry+https://github.com/rust-lang/crates.io-index" 2478 - checksum = "bbb2c998745a3c1ac90f64f4f7b3a54219fd3612d7705e7798212935641ed18f" 2479 - dependencies = [ 2480 - "fnv", 2481 - "gilrs-core", 2482 - "log", 2483 - "uuid", 2484 - "vec_map", 2485 - ] 2486 - 2487 - [[package]] 2488 - name = "gilrs-core" 2489 - version = "0.6.4" 2490 - source = "registry+https://github.com/rust-lang/crates.io-index" 2491 - checksum = "a6d95ae10ce5aa99543a28cf74e41c11f3b9e3c14f0452bbde46024753cd683e" 2492 - dependencies = [ 2493 - "core-foundation 0.10.0", 2494 - "inotify", 2495 - "io-kit-sys", 2496 - "js-sys", 2497 - "libc", 2498 - "libudev-sys", 2499 - "log", 2500 - "nix", 2501 - "uuid", 2502 - "vec_map", 2503 - "wasm-bindgen", 2504 - "web-sys", 2505 - "windows 0.61.1", 2506 - ] 2507 - 2508 - [[package]] 2509 - name = "gl_generator" 2510 - version = "0.14.0" 2511 - source = "registry+https://github.com/rust-lang/crates.io-index" 2512 - checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 2513 - dependencies = [ 2514 - "khronos_api", 2515 - "log", 2516 - "xml-rs", 2517 - ] 2518 - 2519 - [[package]] 2520 - name = "glam" 2521 - version = "0.29.3" 2522 - source = "registry+https://github.com/rust-lang/crates.io-index" 2523 - checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" 2524 - dependencies = [ 2525 - "bytemuck", 2526 - "libm", 2527 - "rand", 2528 - "serde", 2529 - ] 2530 - 2531 - [[package]] 2532 - name = "glam" 2533 - version = "0.30.3" 2534 - source = "registry+https://github.com/rust-lang/crates.io-index" 2535 - checksum = "6b46b9ca4690308844c644e7c634d68792467260e051c8543e0c7871662b3ba7" 2536 - 2537 - [[package]] 2538 - name = "glob" 2539 - version = "0.3.2" 2540 - source = "registry+https://github.com/rust-lang/crates.io-index" 2541 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 2542 - 2543 - [[package]] 2544 - name = "glow" 2545 - version = "0.16.0" 2546 - source = "registry+https://github.com/rust-lang/crates.io-index" 2547 - checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" 2548 - dependencies = [ 2549 - "js-sys", 2550 - "slotmap", 2551 - "wasm-bindgen", 2552 - "web-sys", 2553 - ] 2554 - 2555 - [[package]] 2556 - name = "gltf" 2557 - version = "1.4.1" 2558 - source = "registry+https://github.com/rust-lang/crates.io-index" 2559 - checksum = "e3ce1918195723ce6ac74e80542c5a96a40c2b26162c1957a5cd70799b8cacf7" 2560 - dependencies = [ 2561 - "byteorder", 2562 - "gltf-json", 2563 - "lazy_static", 2564 - "serde_json", 2565 - ] 2566 - 2567 - [[package]] 2568 - name = "gltf-derive" 2569 - version = "1.4.1" 2570 - source = "registry+https://github.com/rust-lang/crates.io-index" 2571 - checksum = "14070e711538afba5d6c807edb74bcb84e5dbb9211a3bf5dea0dfab5b24f4c51" 2572 - dependencies = [ 2573 - "inflections", 2574 - "proc-macro2", 2575 - "quote", 2576 - "syn 2.0.101", 2577 - ] 2578 - 2579 - [[package]] 2580 - name = "gltf-json" 2581 - version = "1.4.1" 2582 - source = "registry+https://github.com/rust-lang/crates.io-index" 2583 - checksum = "e6176f9d60a7eab0a877e8e96548605dedbde9190a7ae1e80bbcc1c9af03ab14" 2584 - dependencies = [ 2585 - "gltf-derive", 2586 - "serde", 2587 - "serde_derive", 2588 - "serde_json", 2589 - ] 2590 - 2591 - [[package]] 2592 - name = "glutin_wgl_sys" 2593 - version = "0.6.1" 2594 - source = "registry+https://github.com/rust-lang/crates.io-index" 2595 - checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" 2596 - dependencies = [ 2597 - "gl_generator", 2598 - ] 2599 - 2600 - [[package]] 2601 - name = "gpu-alloc" 2602 - version = "0.6.0" 2603 - source = "registry+https://github.com/rust-lang/crates.io-index" 2604 - checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 2605 - dependencies = [ 2606 - "bitflags 2.9.0", 2607 - "gpu-alloc-types", 2608 - ] 2609 - 2610 - [[package]] 2611 - name = "gpu-alloc-types" 2612 - version = "0.3.0" 2613 - source = "registry+https://github.com/rust-lang/crates.io-index" 2614 - checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 2615 - dependencies = [ 2616 - "bitflags 2.9.0", 2617 - ] 2618 - 2619 - [[package]] 2620 - name = "gpu-allocator" 2621 - version = "0.27.0" 2622 - source = "registry+https://github.com/rust-lang/crates.io-index" 2623 - checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" 2624 - dependencies = [ 2625 - "log", 2626 - "presser", 2627 - "thiserror 1.0.69", 2628 - "windows 0.58.0", 2629 - ] 2630 - 2631 - [[package]] 2632 - name = "gpu-descriptor" 2633 - version = "0.3.1" 2634 - source = "registry+https://github.com/rust-lang/crates.io-index" 2635 - checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" 2636 - dependencies = [ 2637 - "bitflags 2.9.0", 2638 - "gpu-descriptor-types", 2639 - "hashbrown", 2640 - ] 2641 - 2642 - [[package]] 2643 - name = "gpu-descriptor-types" 2644 - version = "0.2.0" 2645 - source = "registry+https://github.com/rust-lang/crates.io-index" 2646 - checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 2647 - dependencies = [ 2648 - "bitflags 2.9.0", 2649 - ] 2650 - 2651 - [[package]] 2652 - name = "grid" 2653 - version = "0.15.0" 2654 - source = "registry+https://github.com/rust-lang/crates.io-index" 2655 - checksum = "36119f3a540b086b4e436bb2b588cf98a68863470e0e880f4d0842f112a3183a" 2656 - 2657 - [[package]] 2658 - name = "guillotiere" 2659 - version = "0.6.2" 2660 - source = "registry+https://github.com/rust-lang/crates.io-index" 2661 - checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" 2662 - dependencies = [ 2663 - "euclid", 2664 - "svg_fmt", 2665 - ] 2666 - 2667 - [[package]] 2668 - name = "half" 2669 - version = "2.6.0" 2670 - source = "registry+https://github.com/rust-lang/crates.io-index" 2671 - checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" 2672 - dependencies = [ 2673 - "cfg-if", 2674 - "crunchy", 2675 - ] 2676 - 2677 - [[package]] 2678 - name = "hash32" 2679 - version = "0.3.1" 2680 - source = "registry+https://github.com/rust-lang/crates.io-index" 2681 - checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" 2682 - dependencies = [ 2683 - "byteorder", 2684 - ] 2685 - 2686 - [[package]] 2687 - name = "hashbrown" 2688 - version = "0.15.3" 2689 - source = "registry+https://github.com/rust-lang/crates.io-index" 2690 - checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 2691 - dependencies = [ 2692 - "equivalent", 2693 - "foldhash", 2694 - "serde", 2695 - ] 2696 - 2697 - [[package]] 2698 - name = "heapless" 2699 - version = "0.8.0" 2700 - source = "registry+https://github.com/rust-lang/crates.io-index" 2701 - checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" 2702 - dependencies = [ 2703 - "hash32", 2704 - "portable-atomic", 2705 - "stable_deref_trait", 2706 - ] 2707 - 2708 - [[package]] 2709 - name = "heck" 2710 - version = "0.5.0" 2711 - source = "registry+https://github.com/rust-lang/crates.io-index" 2712 - checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 2713 - 2714 - [[package]] 2715 - name = "hermit-abi" 2716 - version = "0.4.0" 2717 - source = "registry+https://github.com/rust-lang/crates.io-index" 2718 - checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 2719 - 2720 - [[package]] 2721 - name = "hexasphere" 2722 - version = "15.1.0" 2723 - source = "registry+https://github.com/rust-lang/crates.io-index" 2724 - checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" 2725 - dependencies = [ 2726 - "constgebra", 2727 - "glam 0.29.3", 2728 - "tinyvec", 2729 - ] 2730 - 2731 - [[package]] 2732 - name = "hexf-parse" 2733 - version = "0.2.1" 2734 - source = "registry+https://github.com/rust-lang/crates.io-index" 2735 - checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 2736 - 2737 - [[package]] 2738 - name = "home" 2739 - version = "0.5.11" 2740 - source = "registry+https://github.com/rust-lang/crates.io-index" 2741 - checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 2742 - dependencies = [ 2743 - "windows-sys 0.59.0", 2744 - ] 2745 - 2746 - [[package]] 2747 - name = "icu_collections" 2748 - version = "2.0.0" 2749 - source = "registry+https://github.com/rust-lang/crates.io-index" 2750 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 2751 - dependencies = [ 2752 - "displaydoc", 2753 - "potential_utf", 2754 - "yoke", 2755 - "zerofrom", 2756 - "zerovec", 2757 - ] 2758 - 2759 - [[package]] 2760 - name = "icu_locale_core" 2761 - version = "2.0.0" 2762 - source = "registry+https://github.com/rust-lang/crates.io-index" 2763 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 2764 - dependencies = [ 2765 - "displaydoc", 2766 - "litemap", 2767 - "tinystr", 2768 - "writeable", 2769 - "zerovec", 2770 - ] 2771 - 2772 - [[package]] 2773 - name = "icu_normalizer" 2774 - version = "2.0.0" 2775 - source = "registry+https://github.com/rust-lang/crates.io-index" 2776 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 2777 - dependencies = [ 2778 - "displaydoc", 2779 - "icu_collections", 2780 - "icu_normalizer_data", 2781 - "icu_properties", 2782 - "icu_provider", 2783 - "smallvec", 2784 - "zerovec", 2785 - ] 2786 - 2787 - [[package]] 2788 - name = "icu_normalizer_data" 2789 - version = "2.0.0" 2790 - source = "registry+https://github.com/rust-lang/crates.io-index" 2791 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 2792 - 2793 - [[package]] 2794 - name = "icu_properties" 2795 - version = "2.0.0" 2796 - source = "registry+https://github.com/rust-lang/crates.io-index" 2797 - checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" 2798 - dependencies = [ 2799 - "displaydoc", 2800 - "icu_collections", 2801 - "icu_locale_core", 2802 - "icu_properties_data", 2803 - "icu_provider", 2804 - "potential_utf", 2805 - "zerotrie", 2806 - "zerovec", 2807 - ] 2808 - 2809 - [[package]] 2810 - name = "icu_properties_data" 2811 - version = "2.0.0" 2812 - source = "registry+https://github.com/rust-lang/crates.io-index" 2813 - checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" 2814 - 2815 - [[package]] 2816 - name = "icu_provider" 2817 - version = "2.0.0" 2818 - source = "registry+https://github.com/rust-lang/crates.io-index" 2819 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 2820 - dependencies = [ 2821 - "displaydoc", 2822 - "icu_locale_core", 2823 - "stable_deref_trait", 2824 - "tinystr", 2825 - "writeable", 2826 - "yoke", 2827 - "zerofrom", 2828 - "zerotrie", 2829 - "zerovec", 2830 - ] 2831 - 2832 - [[package]] 2833 - name = "idna" 2834 - version = "1.0.3" 2835 - source = "registry+https://github.com/rust-lang/crates.io-index" 2836 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 2837 - dependencies = [ 2838 - "idna_adapter", 2839 - "smallvec", 2840 - "utf8_iter", 2841 - ] 2842 - 2843 - [[package]] 2844 - name = "idna_adapter" 2845 - version = "1.2.1" 2846 - source = "registry+https://github.com/rust-lang/crates.io-index" 2847 - checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 2848 - dependencies = [ 2849 - "icu_normalizer", 2850 - "icu_properties", 2851 - ] 2852 - 2853 - [[package]] 2854 - name = "image" 2855 - version = "0.24.9" 2856 - source = "registry+https://github.com/rust-lang/crates.io-index" 2857 - checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 2858 - dependencies = [ 2859 - "bytemuck", 2860 - "byteorder", 2861 - "color_quant", 2862 - "exr", 2863 - "gif", 2864 - "jpeg-decoder", 2865 - "num-traits", 2866 - "png", 2867 - "qoi", 2868 - "tiff", 2869 - ] 2870 - 2871 - [[package]] 2872 - name = "image" 2873 - version = "0.25.6" 2874 - source = "registry+https://github.com/rust-lang/crates.io-index" 2875 - checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" 2876 - dependencies = [ 2877 - "bytemuck", 2878 - "byteorder-lite", 2879 - "color_quant", 2880 - "exr", 2881 - "gif", 2882 - "image-webp", 2883 - "num-traits", 2884 - "png", 2885 - "qoi", 2886 - "ravif", 2887 - "rayon", 2888 - "rgb", 2889 - "tiff", 2890 - "zune-core", 2891 - "zune-jpeg", 2892 - ] 2893 - 2894 - [[package]] 2895 - name = "image-webp" 2896 - version = "0.2.1" 2897 - source = "registry+https://github.com/rust-lang/crates.io-index" 2898 - checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" 2899 - dependencies = [ 2900 - "byteorder-lite", 2901 - "quick-error", 2902 - ] 2903 - 2904 - [[package]] 2905 - name = "imgref" 2906 - version = "1.11.0" 2907 - source = "registry+https://github.com/rust-lang/crates.io-index" 2908 - checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" 2909 - 2910 - [[package]] 2911 - name = "immutable-chunkmap" 2912 - version = "2.0.6" 2913 - source = "registry+https://github.com/rust-lang/crates.io-index" 2914 - checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" 2915 - dependencies = [ 2916 - "arrayvec", 2917 - ] 2918 - 2919 - [[package]] 2920 - name = "indexmap" 2921 - version = "2.9.0" 2922 - source = "registry+https://github.com/rust-lang/crates.io-index" 2923 - checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 2924 - dependencies = [ 2925 - "equivalent", 2926 - "hashbrown", 2927 - "serde", 2928 - ] 2929 - 2930 - [[package]] 2931 - name = "inflections" 2932 - version = "1.1.1" 2933 - source = "registry+https://github.com/rust-lang/crates.io-index" 2934 - checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" 2935 - 2936 - [[package]] 2937 - name = "inotify" 2938 - version = "0.11.0" 2939 - source = "registry+https://github.com/rust-lang/crates.io-index" 2940 - checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" 2941 - dependencies = [ 2942 - "bitflags 2.9.0", 2943 - "inotify-sys", 2944 - "libc", 2945 - ] 2946 - 2947 - [[package]] 2948 - name = "inotify-sys" 2949 - version = "0.1.5" 2950 - source = "registry+https://github.com/rust-lang/crates.io-index" 2951 - checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" 2952 - dependencies = [ 2953 - "libc", 2954 - ] 2955 - 2956 - [[package]] 2957 - name = "interpolate_name" 2958 - version = "0.2.4" 2959 - source = "registry+https://github.com/rust-lang/crates.io-index" 2960 - checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" 2961 - dependencies = [ 2962 - "proc-macro2", 2963 - "quote", 2964 - "syn 2.0.101", 2965 - ] 2966 - 2967 - [[package]] 2968 - name = "io-kit-sys" 2969 - version = "0.4.1" 2970 - source = "registry+https://github.com/rust-lang/crates.io-index" 2971 - checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" 2972 - dependencies = [ 2973 - "core-foundation-sys", 2974 - "mach2", 2975 - ] 2976 - 2977 - [[package]] 2978 - name = "itertools" 2979 - version = "0.12.1" 2980 - source = "registry+https://github.com/rust-lang/crates.io-index" 2981 - checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 2982 - dependencies = [ 2983 - "either", 2984 - ] 2985 - 2986 - [[package]] 2987 - name = "itertools" 2988 - version = "0.13.0" 2989 - source = "registry+https://github.com/rust-lang/crates.io-index" 2990 - checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 2991 - dependencies = [ 2992 - "either", 2993 - ] 2994 - 2995 - [[package]] 2996 - name = "itertools" 2997 - version = "0.14.0" 2998 - source = "registry+https://github.com/rust-lang/crates.io-index" 2999 - checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 3000 - dependencies = [ 3001 - "either", 3002 - ] 3003 - 3004 - [[package]] 3005 - name = "itoa" 3006 - version = "1.0.15" 3007 - source = "registry+https://github.com/rust-lang/crates.io-index" 3008 - checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 3009 - 3010 - [[package]] 3011 - name = "jni" 3012 - version = "0.21.1" 3013 - source = "registry+https://github.com/rust-lang/crates.io-index" 3014 - checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 3015 - dependencies = [ 3016 - "cesu8", 3017 - "cfg-if", 3018 - "combine", 3019 - "jni-sys", 3020 - "log", 3021 - "thiserror 1.0.69", 3022 - "walkdir", 3023 - "windows-sys 0.45.0", 3024 - ] 3025 - 3026 - [[package]] 3027 - name = "jni-sys" 3028 - version = "0.3.0" 3029 - source = "registry+https://github.com/rust-lang/crates.io-index" 3030 - checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 3031 - 3032 - [[package]] 3033 - name = "jobserver" 3034 - version = "0.1.33" 3035 - source = "registry+https://github.com/rust-lang/crates.io-index" 3036 - checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 3037 - dependencies = [ 3038 - "getrandom 0.3.3", 3039 - "libc", 3040 - ] 3041 - 3042 - [[package]] 3043 - name = "jpeg-decoder" 3044 - version = "0.3.1" 3045 - source = "registry+https://github.com/rust-lang/crates.io-index" 3046 - checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 3047 - dependencies = [ 3048 - "rayon", 3049 - ] 3050 - 3051 - [[package]] 3052 - name = "js-sys" 3053 - version = "0.3.77" 3054 - source = "registry+https://github.com/rust-lang/crates.io-index" 3055 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 3056 - dependencies = [ 3057 - "once_cell", 3058 - "wasm-bindgen", 3059 - ] 3060 - 3061 - [[package]] 3062 - name = "khronos-egl" 3063 - version = "6.0.0" 3064 - source = "registry+https://github.com/rust-lang/crates.io-index" 3065 - checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 3066 - dependencies = [ 3067 - "libc", 3068 - "libloading", 3069 - "pkg-config", 3070 - ] 3071 - 3072 - [[package]] 3073 - name = "khronos_api" 3074 - version = "3.1.0" 3075 - source = "registry+https://github.com/rust-lang/crates.io-index" 3076 - checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 3077 - 3078 - [[package]] 3079 - name = "ktx2" 3080 - version = "0.3.0" 3081 - source = "registry+https://github.com/rust-lang/crates.io-index" 3082 - checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" 3083 - dependencies = [ 3084 - "bitflags 1.3.2", 3085 - ] 3086 - 3087 - [[package]] 3088 - name = "lazy_static" 3089 - version = "1.5.0" 3090 - source = "registry+https://github.com/rust-lang/crates.io-index" 3091 - checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 3092 - 3093 - [[package]] 3094 - name = "lebe" 3095 - version = "0.5.2" 3096 - source = "registry+https://github.com/rust-lang/crates.io-index" 3097 - checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" 3098 - 3099 - [[package]] 3100 - name = "lewton" 3101 - version = "0.10.2" 3102 - source = "registry+https://github.com/rust-lang/crates.io-index" 3103 - checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" 3104 - dependencies = [ 3105 - "byteorder", 3106 - "ogg", 3107 - "tinyvec", 3108 - ] 3109 - 3110 - [[package]] 3111 - name = "libc" 3112 - version = "0.2.172" 3113 - source = "registry+https://github.com/rust-lang/crates.io-index" 3114 - checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 3115 - 3116 - [[package]] 3117 - name = "libfuzzer-sys" 3118 - version = "0.4.9" 3119 - source = "registry+https://github.com/rust-lang/crates.io-index" 3120 - checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" 3121 - dependencies = [ 3122 - "arbitrary", 3123 - "cc", 3124 - ] 3125 - 3126 - [[package]] 3127 - name = "libloading" 3128 - version = "0.8.6" 3129 - source = "registry+https://github.com/rust-lang/crates.io-index" 3130 - checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 3131 - dependencies = [ 3132 - "cfg-if", 3133 - "windows-targets 0.52.6", 3134 - ] 3135 - 3136 - [[package]] 3137 - name = "libm" 3138 - version = "0.2.15" 3139 - source = "registry+https://github.com/rust-lang/crates.io-index" 3140 - checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 3141 - 3142 - [[package]] 3143 - name = "libredox" 3144 - version = "0.1.3" 3145 - source = "registry+https://github.com/rust-lang/crates.io-index" 3146 - checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 3147 - dependencies = [ 3148 - "bitflags 2.9.0", 3149 - "libc", 3150 - "redox_syscall 0.5.12", 3151 - ] 3152 - 3153 - [[package]] 3154 - name = "libudev-sys" 3155 - version = "0.1.4" 3156 - source = "registry+https://github.com/rust-lang/crates.io-index" 3157 - checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" 3158 - dependencies = [ 3159 - "libc", 3160 - "pkg-config", 3161 - ] 3162 - 3163 - [[package]] 3164 - name = "libz-rs-sys" 3165 - version = "0.5.0" 3166 - source = "registry+https://github.com/rust-lang/crates.io-index" 3167 - checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" 3168 - dependencies = [ 3169 - "zlib-rs", 3170 - ] 3171 - 3172 - [[package]] 3173 - name = "linux-raw-sys" 3174 - version = "0.4.15" 3175 - source = "registry+https://github.com/rust-lang/crates.io-index" 3176 - checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 3177 - 3178 - [[package]] 3179 - name = "litemap" 3180 - version = "0.8.0" 3181 - source = "registry+https://github.com/rust-lang/crates.io-index" 3182 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 3183 - 3184 - [[package]] 3185 - name = "litrs" 3186 - version = "0.4.1" 3187 - source = "registry+https://github.com/rust-lang/crates.io-index" 3188 - checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 3189 - 3190 - [[package]] 3191 - name = "lock_api" 3192 - version = "0.4.12" 3193 - source = "registry+https://github.com/rust-lang/crates.io-index" 3194 - checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 3195 - dependencies = [ 3196 - "autocfg", 3197 - "scopeguard", 3198 - ] 3199 - 3200 - [[package]] 3201 - name = "log" 3202 - version = "0.4.27" 3203 - source = "registry+https://github.com/rust-lang/crates.io-index" 3204 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 3205 - 3206 - [[package]] 3207 - name = "loop9" 3208 - version = "0.1.5" 3209 - source = "registry+https://github.com/rust-lang/crates.io-index" 3210 - checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" 3211 - dependencies = [ 3212 - "imgref", 3213 - ] 3214 - 3215 - [[package]] 3216 - name = "mach2" 3217 - version = "0.4.2" 3218 - source = "registry+https://github.com/rust-lang/crates.io-index" 3219 - checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 3220 - dependencies = [ 3221 - "libc", 3222 - ] 3223 - 3224 - [[package]] 3225 - name = "malloc_buf" 3226 - version = "0.0.6" 3227 - source = "registry+https://github.com/rust-lang/crates.io-index" 3228 - checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 3229 - dependencies = [ 3230 - "libc", 3231 - ] 3232 - 3233 - [[package]] 3234 - name = "matchers" 3235 - version = "0.1.0" 3236 - source = "registry+https://github.com/rust-lang/crates.io-index" 3237 - checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 3238 - dependencies = [ 3239 - "regex-automata 0.1.10", 3240 - ] 3241 - 3242 - [[package]] 3243 - name = "matrixmultiply" 3244 - version = "0.3.9" 3245 - source = "registry+https://github.com/rust-lang/crates.io-index" 3246 - checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" 3247 - dependencies = [ 3248 - "autocfg", 3249 - "rawpointer", 3250 - ] 3251 - 3252 - [[package]] 3253 - name = "maybe-rayon" 3254 - version = "0.1.1" 3255 - source = "registry+https://github.com/rust-lang/crates.io-index" 3256 - checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" 3257 - dependencies = [ 3258 - "cfg-if", 3259 - "rayon", 3260 - ] 3261 - 3262 - [[package]] 3263 - name = "memchr" 3264 - version = "2.7.4" 3265 - source = "registry+https://github.com/rust-lang/crates.io-index" 3266 - checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 3267 - 3268 - [[package]] 3269 - name = "memmap2" 3270 - version = "0.9.5" 3271 - source = "registry+https://github.com/rust-lang/crates.io-index" 3272 - checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 3273 - dependencies = [ 3274 - "libc", 3275 - ] 3276 - 3277 - [[package]] 3278 - name = "mesh-tools" 3279 - version = "0.1.0" 3280 - source = "registry+https://github.com/rust-lang/crates.io-index" 3281 - checksum = "9b07c5e96a6080555d650321a81c7e3cd68b08261f63ee5db2b069a50f5ce7db" 3282 - dependencies = [ 3283 - "base64 0.13.1", 3284 - "byteorder", 3285 - "image 0.24.9", 3286 - "nalgebra", 3287 - "serde", 3288 - "serde_json", 3289 - "thiserror 1.0.69", 3290 - "uuid", 3291 - ] 3292 - 3293 - [[package]] 3294 - name = "metal" 3295 - version = "0.31.0" 3296 - source = "registry+https://github.com/rust-lang/crates.io-index" 3297 - checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" 3298 - dependencies = [ 3299 - "bitflags 2.9.0", 3300 - "block", 3301 - "core-graphics-types", 3302 - "foreign-types", 3303 - "log", 3304 - "objc", 3305 - "paste", 3306 - ] 3307 - 3308 - [[package]] 3309 - name = "minimal-lexical" 3310 - version = "0.2.1" 3311 - source = "registry+https://github.com/rust-lang/crates.io-index" 3312 - checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 3313 - 3314 - [[package]] 3315 - name = "miniz_oxide" 3316 - version = "0.8.8" 3317 - source = "registry+https://github.com/rust-lang/crates.io-index" 3318 - checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 3319 - dependencies = [ 3320 - "adler2", 3321 - "simd-adler32", 3322 - ] 3323 - 3324 - [[package]] 3325 - name = "naga" 3326 - version = "24.0.0" 3327 - source = "registry+https://github.com/rust-lang/crates.io-index" 3328 - checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" 3329 - dependencies = [ 3330 - "arrayvec", 3331 - "bit-set 0.8.0", 3332 - "bitflags 2.9.0", 3333 - "cfg_aliases", 3334 - "codespan-reporting", 3335 - "hexf-parse", 3336 - "indexmap", 3337 - "log", 3338 - "pp-rs", 3339 - "rustc-hash", 3340 - "spirv", 3341 - "strum", 3342 - "termcolor", 3343 - "thiserror 2.0.12", 3344 - "unicode-xid", 3345 - ] 3346 - 3347 - [[package]] 3348 - name = "naga_oil" 3349 - version = "0.17.0" 3350 - source = "registry+https://github.com/rust-lang/crates.io-index" 3351 - checksum = "0ca507a365f886f95f74420361b75442a3709c747a8a6e8b6c45b8667f45a82c" 3352 - dependencies = [ 3353 - "bit-set 0.5.3", 3354 - "codespan-reporting", 3355 - "data-encoding", 3356 - "indexmap", 3357 - "naga", 3358 - "once_cell", 3359 - "regex", 3360 - "regex-syntax 0.8.5", 3361 - "rustc-hash", 3362 - "thiserror 1.0.69", 3363 - "tracing", 3364 - "unicode-ident", 3365 - ] 3366 - 3367 - [[package]] 3368 - name = "nalgebra" 3369 - version = "0.31.4" 3370 - source = "registry+https://github.com/rust-lang/crates.io-index" 3371 - checksum = "20bd243ab3dbb395b39ee730402d2e5405e448c75133ec49cc977762c4cba3d1" 3372 - dependencies = [ 3373 - "approx", 3374 - "matrixmultiply", 3375 - "nalgebra-macros", 3376 - "num-complex", 3377 - "num-rational", 3378 - "num-traits", 3379 - "simba", 3380 - "typenum", 3381 - ] 3382 - 3383 - [[package]] 3384 - name = "nalgebra-macros" 3385 - version = "0.1.0" 3386 - source = "registry+https://github.com/rust-lang/crates.io-index" 3387 - checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" 3388 - dependencies = [ 3389 - "proc-macro2", 3390 - "quote", 3391 - "syn 1.0.109", 3392 - ] 3393 - 3394 - [[package]] 3395 - name = "ndk" 3396 - version = "0.8.0" 3397 - source = "registry+https://github.com/rust-lang/crates.io-index" 3398 - checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 3399 - dependencies = [ 3400 - "bitflags 2.9.0", 3401 - "jni-sys", 3402 - "log", 3403 - "ndk-sys 0.5.0+25.2.9519653", 3404 - "num_enum", 3405 - "thiserror 1.0.69", 3406 - ] 3407 - 3408 - [[package]] 3409 - name = "ndk" 3410 - version = "0.9.0" 3411 - source = "registry+https://github.com/rust-lang/crates.io-index" 3412 - checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 3413 - dependencies = [ 3414 - "bitflags 2.9.0", 3415 - "jni-sys", 3416 - "log", 3417 - "ndk-sys 0.6.0+11769913", 3418 - "num_enum", 3419 - "raw-window-handle", 3420 - "thiserror 1.0.69", 3421 - ] 3422 - 3423 - [[package]] 3424 - name = "ndk-context" 3425 - version = "0.1.1" 3426 - source = "registry+https://github.com/rust-lang/crates.io-index" 3427 - checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 3428 - 3429 - [[package]] 3430 - name = "ndk-sys" 3431 - version = "0.5.0+25.2.9519653" 3432 - source = "registry+https://github.com/rust-lang/crates.io-index" 3433 - checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 3434 - dependencies = [ 3435 - "jni-sys", 3436 - ] 3437 - 3438 - [[package]] 3439 - name = "ndk-sys" 3440 - version = "0.6.0+11769913" 3441 - source = "registry+https://github.com/rust-lang/crates.io-index" 3442 - checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" 3443 - dependencies = [ 3444 - "jni-sys", 3445 - ] 3446 - 3447 - [[package]] 3448 - name = "new_debug_unreachable" 3449 - version = "1.0.6" 3450 - source = "registry+https://github.com/rust-lang/crates.io-index" 3451 - checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 3452 - 3453 - [[package]] 3454 - name = "nix" 3455 - version = "0.29.0" 3456 - source = "registry+https://github.com/rust-lang/crates.io-index" 3457 - checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 3458 - dependencies = [ 3459 - "bitflags 2.9.0", 3460 - "cfg-if", 3461 - "cfg_aliases", 3462 - "libc", 3463 - ] 3464 - 3465 - [[package]] 3466 - name = "nohash-hasher" 3467 - version = "0.2.0" 3468 - source = "registry+https://github.com/rust-lang/crates.io-index" 3469 - checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 3470 - 3471 - [[package]] 3472 - name = "nom" 3473 - version = "7.1.3" 3474 - source = "registry+https://github.com/rust-lang/crates.io-index" 3475 - checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 3476 - dependencies = [ 3477 - "memchr", 3478 - "minimal-lexical", 3479 - ] 3480 - 3481 - [[package]] 3482 - name = "nonmax" 3483 - version = "0.5.5" 3484 - source = "registry+https://github.com/rust-lang/crates.io-index" 3485 - checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" 3486 - 3487 - [[package]] 3488 - name = "noop_proc_macro" 3489 - version = "0.3.0" 3490 - source = "registry+https://github.com/rust-lang/crates.io-index" 3491 - checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 3492 - 3493 - [[package]] 3494 - name = "ntapi" 3495 - version = "0.4.1" 3496 - source = "registry+https://github.com/rust-lang/crates.io-index" 3497 - checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 3498 - dependencies = [ 3499 - "winapi", 3500 - ] 3501 - 3502 - [[package]] 3503 - name = "nu-ansi-term" 3504 - version = "0.46.0" 3505 - source = "registry+https://github.com/rust-lang/crates.io-index" 3506 - checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 3507 - dependencies = [ 3508 - "overload", 3509 - "winapi", 3510 - ] 3511 - 3512 - [[package]] 3513 - name = "num-bigint" 3514 - version = "0.4.6" 3515 - source = "registry+https://github.com/rust-lang/crates.io-index" 3516 - checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 3517 - dependencies = [ 3518 - "num-integer", 3519 - "num-traits", 3520 - ] 3521 - 3522 - [[package]] 3523 - name = "num-complex" 3524 - version = "0.4.6" 3525 - source = "registry+https://github.com/rust-lang/crates.io-index" 3526 - checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 3527 - dependencies = [ 3528 - "num-traits", 3529 - ] 3530 - 3531 - [[package]] 3532 - name = "num-derive" 3533 - version = "0.4.2" 3534 - source = "registry+https://github.com/rust-lang/crates.io-index" 3535 - checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 3536 - dependencies = [ 3537 - "proc-macro2", 3538 - "quote", 3539 - "syn 2.0.101", 3540 - ] 3541 - 3542 - [[package]] 3543 - name = "num-integer" 3544 - version = "0.1.46" 3545 - source = "registry+https://github.com/rust-lang/crates.io-index" 3546 - checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 3547 - dependencies = [ 3548 - "num-traits", 3549 - ] 3550 - 3551 - [[package]] 3552 - name = "num-rational" 3553 - version = "0.4.2" 3554 - source = "registry+https://github.com/rust-lang/crates.io-index" 3555 - checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 3556 - dependencies = [ 3557 - "num-bigint", 3558 - "num-integer", 3559 - "num-traits", 3560 - ] 3561 - 3562 - [[package]] 3563 - name = "num-traits" 3564 - version = "0.2.19" 3565 - source = "registry+https://github.com/rust-lang/crates.io-index" 3566 - checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 3567 - dependencies = [ 3568 - "autocfg", 3569 - "libm", 3570 - ] 3571 - 3572 - [[package]] 3573 - name = "num_enum" 3574 - version = "0.7.3" 3575 - source = "registry+https://github.com/rust-lang/crates.io-index" 3576 - checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 3577 - dependencies = [ 3578 - "num_enum_derive", 3579 - ] 3580 - 3581 - [[package]] 3582 - name = "num_enum_derive" 3583 - version = "0.7.3" 3584 - source = "registry+https://github.com/rust-lang/crates.io-index" 3585 - checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 3586 - dependencies = [ 3587 - "proc-macro-crate", 3588 - "proc-macro2", 3589 - "quote", 3590 - "syn 2.0.101", 3591 - ] 3592 - 3593 - [[package]] 3594 - name = "objc" 3595 - version = "0.2.7" 3596 - source = "registry+https://github.com/rust-lang/crates.io-index" 3597 - checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 3598 - dependencies = [ 3599 - "malloc_buf", 3600 - ] 3601 - 3602 - [[package]] 3603 - name = "objc-sys" 3604 - version = "0.3.5" 3605 - source = "registry+https://github.com/rust-lang/crates.io-index" 3606 - checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 3607 - 3608 - [[package]] 3609 - name = "objc2" 3610 - version = "0.5.2" 3611 - source = "registry+https://github.com/rust-lang/crates.io-index" 3612 - checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 3613 - dependencies = [ 3614 - "objc-sys", 3615 - "objc2-encode", 3616 - ] 3617 - 3618 - [[package]] 3619 - name = "objc2" 3620 - version = "0.6.1" 3621 - source = "registry+https://github.com/rust-lang/crates.io-index" 3622 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 3623 - dependencies = [ 3624 - "objc2-encode", 3625 - ] 3626 - 3627 - [[package]] 3628 - name = "objc2-app-kit" 3629 - version = "0.2.2" 3630 - source = "registry+https://github.com/rust-lang/crates.io-index" 3631 - checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 3632 - dependencies = [ 3633 - "bitflags 2.9.0", 3634 - "block2", 3635 - "libc", 3636 - "objc2 0.5.2", 3637 - "objc2-core-data", 3638 - "objc2-core-image", 3639 - "objc2-foundation 0.2.2", 3640 - "objc2-quartz-core", 3641 - ] 3642 - 3643 - [[package]] 3644 - name = "objc2-app-kit" 3645 - version = "0.3.1" 3646 - source = "registry+https://github.com/rust-lang/crates.io-index" 3647 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 3648 - dependencies = [ 3649 - "bitflags 2.9.0", 3650 - "objc2 0.6.1", 3651 - "objc2-core-graphics", 3652 - "objc2-foundation 0.3.1", 3653 - ] 3654 - 3655 - [[package]] 3656 - name = "objc2-cloud-kit" 3657 - version = "0.2.2" 3658 - source = "registry+https://github.com/rust-lang/crates.io-index" 3659 - checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" 3660 - dependencies = [ 3661 - "bitflags 2.9.0", 3662 - "block2", 3663 - "objc2 0.5.2", 3664 - "objc2-core-location", 3665 - "objc2-foundation 0.2.2", 3666 - ] 3667 - 3668 - [[package]] 3669 - name = "objc2-contacts" 3670 - version = "0.2.2" 3671 - source = "registry+https://github.com/rust-lang/crates.io-index" 3672 - checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" 3673 - dependencies = [ 3674 - "block2", 3675 - "objc2 0.5.2", 3676 - "objc2-foundation 0.2.2", 3677 - ] 3678 - 3679 - [[package]] 3680 - name = "objc2-core-data" 3681 - version = "0.2.2" 3682 - source = "registry+https://github.com/rust-lang/crates.io-index" 3683 - checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 3684 - dependencies = [ 3685 - "bitflags 2.9.0", 3686 - "block2", 3687 - "objc2 0.5.2", 3688 - "objc2-foundation 0.2.2", 3689 - ] 3690 - 3691 - [[package]] 3692 - name = "objc2-core-foundation" 3693 - version = "0.3.1" 3694 - source = "registry+https://github.com/rust-lang/crates.io-index" 3695 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 3696 - dependencies = [ 3697 - "bitflags 2.9.0", 3698 - "dispatch2", 3699 - "objc2 0.6.1", 3700 - ] 3701 - 3702 - [[package]] 3703 - name = "objc2-core-graphics" 3704 - version = "0.3.1" 3705 - source = "registry+https://github.com/rust-lang/crates.io-index" 3706 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 3707 - dependencies = [ 3708 - "bitflags 2.9.0", 3709 - "dispatch2", 3710 - "objc2 0.6.1", 3711 - "objc2-core-foundation", 3712 - "objc2-io-surface", 3713 - ] 3714 - 3715 - [[package]] 3716 - name = "objc2-core-image" 3717 - version = "0.2.2" 3718 - source = "registry+https://github.com/rust-lang/crates.io-index" 3719 - checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 3720 - dependencies = [ 3721 - "block2", 3722 - "objc2 0.5.2", 3723 - "objc2-foundation 0.2.2", 3724 - "objc2-metal", 3725 - ] 3726 - 3727 - [[package]] 3728 - name = "objc2-core-location" 3729 - version = "0.2.2" 3730 - source = "registry+https://github.com/rust-lang/crates.io-index" 3731 - checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" 3732 - dependencies = [ 3733 - "block2", 3734 - "objc2 0.5.2", 3735 - "objc2-contacts", 3736 - "objc2-foundation 0.2.2", 3737 - ] 3738 - 3739 - [[package]] 3740 - name = "objc2-encode" 3741 - version = "4.1.0" 3742 - source = "registry+https://github.com/rust-lang/crates.io-index" 3743 - checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 3744 - 3745 - [[package]] 3746 - name = "objc2-foundation" 3747 - version = "0.2.2" 3748 - source = "registry+https://github.com/rust-lang/crates.io-index" 3749 - checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 3750 - dependencies = [ 3751 - "bitflags 2.9.0", 3752 - "block2", 3753 - "dispatch", 3754 - "libc", 3755 - "objc2 0.5.2", 3756 - ] 3757 - 3758 - [[package]] 3759 - name = "objc2-foundation" 3760 - version = "0.3.1" 3761 - source = "registry+https://github.com/rust-lang/crates.io-index" 3762 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 3763 - dependencies = [ 3764 - "bitflags 2.9.0", 3765 - "objc2 0.6.1", 3766 - "objc2-core-foundation", 3767 - ] 3768 - 3769 - [[package]] 3770 - name = "objc2-io-surface" 3771 - version = "0.3.1" 3772 - source = "registry+https://github.com/rust-lang/crates.io-index" 3773 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 3774 - dependencies = [ 3775 - "bitflags 2.9.0", 3776 - "objc2 0.6.1", 3777 - "objc2-core-foundation", 3778 - ] 3779 - 3780 - [[package]] 3781 - name = "objc2-link-presentation" 3782 - version = "0.2.2" 3783 - source = "registry+https://github.com/rust-lang/crates.io-index" 3784 - checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" 3785 - dependencies = [ 3786 - "block2", 3787 - "objc2 0.5.2", 3788 - "objc2-app-kit 0.2.2", 3789 - "objc2-foundation 0.2.2", 3790 - ] 3791 - 3792 - [[package]] 3793 - name = "objc2-metal" 3794 - version = "0.2.2" 3795 - source = "registry+https://github.com/rust-lang/crates.io-index" 3796 - checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 3797 - dependencies = [ 3798 - "bitflags 2.9.0", 3799 - "block2", 3800 - "objc2 0.5.2", 3801 - "objc2-foundation 0.2.2", 3802 - ] 3803 - 3804 - [[package]] 3805 - name = "objc2-quartz-core" 3806 - version = "0.2.2" 3807 - source = "registry+https://github.com/rust-lang/crates.io-index" 3808 - checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 3809 - dependencies = [ 3810 - "bitflags 2.9.0", 3811 - "block2", 3812 - "objc2 0.5.2", 3813 - "objc2-foundation 0.2.2", 3814 - "objc2-metal", 3815 - ] 3816 - 3817 - [[package]] 3818 - name = "objc2-symbols" 3819 - version = "0.2.2" 3820 - source = "registry+https://github.com/rust-lang/crates.io-index" 3821 - checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" 3822 - dependencies = [ 3823 - "objc2 0.5.2", 3824 - "objc2-foundation 0.2.2", 3825 - ] 3826 - 3827 - [[package]] 3828 - name = "objc2-ui-kit" 3829 - version = "0.2.2" 3830 - source = "registry+https://github.com/rust-lang/crates.io-index" 3831 - checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" 3832 - dependencies = [ 3833 - "bitflags 2.9.0", 3834 - "block2", 3835 - "objc2 0.5.2", 3836 - "objc2-cloud-kit", 3837 - "objc2-core-data", 3838 - "objc2-core-image", 3839 - "objc2-core-location", 3840 - "objc2-foundation 0.2.2", 3841 - "objc2-link-presentation", 3842 - "objc2-quartz-core", 3843 - "objc2-symbols", 3844 - "objc2-uniform-type-identifiers", 3845 - "objc2-user-notifications", 3846 - ] 3847 - 3848 - [[package]] 3849 - name = "objc2-uniform-type-identifiers" 3850 - version = "0.2.2" 3851 - source = "registry+https://github.com/rust-lang/crates.io-index" 3852 - checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" 3853 - dependencies = [ 3854 - "block2", 3855 - "objc2 0.5.2", 3856 - "objc2-foundation 0.2.2", 3857 - ] 3858 - 3859 - [[package]] 3860 - name = "objc2-user-notifications" 3861 - version = "0.2.2" 3862 - source = "registry+https://github.com/rust-lang/crates.io-index" 3863 - checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" 3864 - dependencies = [ 3865 - "bitflags 2.9.0", 3866 - "block2", 3867 - "objc2 0.5.2", 3868 - "objc2-core-location", 3869 - "objc2-foundation 0.2.2", 3870 - ] 3871 - 3872 - [[package]] 3873 - name = "oboe" 3874 - version = "0.6.1" 3875 - source = "registry+https://github.com/rust-lang/crates.io-index" 3876 - checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" 3877 - dependencies = [ 3878 - "jni", 3879 - "ndk 0.8.0", 3880 - "ndk-context", 3881 - "num-derive", 3882 - "num-traits", 3883 - "oboe-sys", 3884 - ] 3885 - 3886 - [[package]] 3887 - name = "oboe-sys" 3888 - version = "0.6.1" 3889 - source = "registry+https://github.com/rust-lang/crates.io-index" 3890 - checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" 3891 - dependencies = [ 3892 - "cc", 3893 - ] 3894 - 3895 - [[package]] 3896 - name = "offset-allocator" 3897 - version = "0.2.0" 3898 - source = "registry+https://github.com/rust-lang/crates.io-index" 3899 - checksum = "e234d535da3521eb95106f40f0b73483d80bfb3aacf27c40d7e2b72f1a3e00a2" 3900 - dependencies = [ 3901 - "log", 3902 - "nonmax", 3903 - ] 3904 - 3905 - [[package]] 3906 - name = "ogg" 3907 - version = "0.8.0" 3908 - source = "registry+https://github.com/rust-lang/crates.io-index" 3909 - checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" 3910 - dependencies = [ 3911 - "byteorder", 3912 - ] 3913 - 3914 - [[package]] 3915 - name = "once_cell" 3916 - version = "1.21.3" 3917 - source = "registry+https://github.com/rust-lang/crates.io-index" 3918 - checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 3919 - 3920 - [[package]] 3921 - name = "orbclient" 3922 - version = "0.3.48" 3923 - source = "registry+https://github.com/rust-lang/crates.io-index" 3924 - checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" 3925 - dependencies = [ 3926 - "libredox", 3927 - ] 3928 - 3929 - [[package]] 3930 - name = "ordered-float" 3931 - version = "4.6.0" 3932 - source = "registry+https://github.com/rust-lang/crates.io-index" 3933 - checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" 3934 - dependencies = [ 3935 - "num-traits", 3936 - ] 3937 - 3938 - [[package]] 3939 - name = "overload" 3940 - version = "0.1.1" 3941 - source = "registry+https://github.com/rust-lang/crates.io-index" 3942 - checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 3943 - 3944 - [[package]] 3945 - name = "owned_ttf_parser" 3946 - version = "0.25.0" 3947 - source = "registry+https://github.com/rust-lang/crates.io-index" 3948 - checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" 3949 - dependencies = [ 3950 - "ttf-parser 0.25.1", 3951 - ] 3952 - 3953 - [[package]] 3954 - name = "owo-colors" 3955 - version = "4.2.0" 3956 - source = "registry+https://github.com/rust-lang/crates.io-index" 3957 - checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" 3958 - 3959 - [[package]] 3960 - name = "parking" 3961 - version = "2.2.1" 3962 - source = "registry+https://github.com/rust-lang/crates.io-index" 3963 - checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 3964 - 3965 - [[package]] 3966 - name = "parking_lot" 3967 - version = "0.12.3" 3968 - source = "registry+https://github.com/rust-lang/crates.io-index" 3969 - checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 3970 - dependencies = [ 3971 - "lock_api", 3972 - "parking_lot_core", 3973 - ] 3974 - 3975 - [[package]] 3976 - name = "parking_lot_core" 3977 - version = "0.9.10" 3978 - source = "registry+https://github.com/rust-lang/crates.io-index" 3979 - checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 3980 - dependencies = [ 3981 - "cfg-if", 3982 - "libc", 3983 - "redox_syscall 0.5.12", 3984 - "smallvec", 3985 - "windows-targets 0.52.6", 3986 - ] 3987 - 3988 - [[package]] 3989 - name = "paste" 3990 - version = "1.0.15" 3991 - source = "registry+https://github.com/rust-lang/crates.io-index" 3992 - checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 3993 - 3994 - [[package]] 3995 - name = "percent-encoding" 3996 - version = "2.3.1" 3997 - source = "registry+https://github.com/rust-lang/crates.io-index" 3998 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 3999 - 4000 - [[package]] 4001 - name = "petgraph" 4002 - version = "0.7.1" 4003 - source = "registry+https://github.com/rust-lang/crates.io-index" 4004 - checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" 4005 - dependencies = [ 4006 - "fixedbitset", 4007 - "indexmap", 4008 - "serde", 4009 - "serde_derive", 4010 - ] 4011 - 4012 - [[package]] 4013 - name = "pin-project" 4014 - version = "1.1.10" 4015 - source = "registry+https://github.com/rust-lang/crates.io-index" 4016 - checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 4017 - dependencies = [ 4018 - "pin-project-internal", 4019 - ] 4020 - 4021 - [[package]] 4022 - name = "pin-project-internal" 4023 - version = "1.1.10" 4024 - source = "registry+https://github.com/rust-lang/crates.io-index" 4025 - checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 4026 - dependencies = [ 4027 - "proc-macro2", 4028 - "quote", 4029 - "syn 2.0.101", 4030 - ] 4031 - 4032 - [[package]] 4033 - name = "pin-project-lite" 4034 - version = "0.2.16" 4035 - source = "registry+https://github.com/rust-lang/crates.io-index" 4036 - checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 4037 - 4038 - [[package]] 4039 - name = "piper" 4040 - version = "0.2.4" 4041 - source = "registry+https://github.com/rust-lang/crates.io-index" 4042 - checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 4043 - dependencies = [ 4044 - "atomic-waker", 4045 - "fastrand", 4046 - "futures-io", 4047 - ] 4048 - 4049 - [[package]] 4050 - name = "pkg-config" 4051 - version = "0.3.32" 4052 - source = "registry+https://github.com/rust-lang/crates.io-index" 4053 - checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 4054 - 4055 - [[package]] 4056 - name = "png" 4057 - version = "0.17.16" 4058 - source = "registry+https://github.com/rust-lang/crates.io-index" 4059 - checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 4060 - dependencies = [ 4061 - "bitflags 1.3.2", 4062 - "crc32fast", 4063 - "fdeflate", 4064 - "flate2", 4065 - "miniz_oxide", 4066 - ] 4067 - 4068 - [[package]] 4069 - name = "polling" 4070 - version = "3.7.4" 4071 - source = "registry+https://github.com/rust-lang/crates.io-index" 4072 - checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" 4073 - dependencies = [ 4074 - "cfg-if", 4075 - "concurrent-queue", 4076 - "hermit-abi", 4077 - "pin-project-lite", 4078 - "rustix", 4079 - "tracing", 4080 - "windows-sys 0.59.0", 4081 - ] 4082 - 4083 - [[package]] 4084 - name = "portable-atomic" 4085 - version = "1.11.0" 4086 - source = "registry+https://github.com/rust-lang/crates.io-index" 4087 - checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" 4088 - 4089 - [[package]] 4090 - name = "portable-atomic-util" 4091 - version = "0.2.4" 4092 - source = "registry+https://github.com/rust-lang/crates.io-index" 4093 - checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 4094 - dependencies = [ 4095 - "portable-atomic", 4096 - ] 4097 - 4098 - [[package]] 4099 - name = "potential_utf" 4100 - version = "0.1.2" 4101 - source = "registry+https://github.com/rust-lang/crates.io-index" 4102 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 4103 - dependencies = [ 4104 - "zerovec", 4105 - ] 4106 - 4107 - [[package]] 4108 - name = "pp-rs" 4109 - version = "0.2.1" 4110 - source = "registry+https://github.com/rust-lang/crates.io-index" 4111 - checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" 4112 - dependencies = [ 4113 - "unicode-xid", 4114 - ] 4115 - 4116 - [[package]] 4117 - name = "ppv-lite86" 4118 - version = "0.2.21" 4119 - source = "registry+https://github.com/rust-lang/crates.io-index" 4120 - checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 4121 - dependencies = [ 4122 - "zerocopy", 4123 - ] 4124 - 4125 - [[package]] 4126 - name = "presser" 4127 - version = "0.3.1" 4128 - source = "registry+https://github.com/rust-lang/crates.io-index" 4129 - checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 4130 - 4131 - [[package]] 4132 - name = "prettyplease" 4133 - version = "0.2.32" 4134 - source = "registry+https://github.com/rust-lang/crates.io-index" 4135 - checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" 4136 - dependencies = [ 4137 - "proc-macro2", 4138 - "syn 2.0.101", 4139 - ] 4140 - 4141 - [[package]] 4142 - name = "proc-macro-crate" 4143 - version = "3.3.0" 4144 - source = "registry+https://github.com/rust-lang/crates.io-index" 4145 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 4146 - dependencies = [ 4147 - "toml_edit", 4148 - ] 4149 - 4150 - [[package]] 4151 - name = "proc-macro2" 4152 - version = "1.0.95" 4153 - source = "registry+https://github.com/rust-lang/crates.io-index" 4154 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 4155 - dependencies = [ 4156 - "unicode-ident", 4157 - ] 4158 - 4159 - [[package]] 4160 - name = "profiling" 4161 - version = "1.0.16" 4162 - source = "registry+https://github.com/rust-lang/crates.io-index" 4163 - checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 4164 - dependencies = [ 4165 - "profiling-procmacros", 4166 - ] 4167 - 4168 - [[package]] 4169 - name = "profiling-procmacros" 4170 - version = "1.0.16" 4171 - source = "registry+https://github.com/rust-lang/crates.io-index" 4172 - checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" 4173 - dependencies = [ 4174 - "quote", 4175 - "syn 2.0.101", 4176 - ] 4177 - 4178 - [[package]] 4179 - name = "qoi" 4180 - version = "0.4.1" 4181 - source = "registry+https://github.com/rust-lang/crates.io-index" 4182 - checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" 4183 - dependencies = [ 4184 - "bytemuck", 4185 - ] 4186 - 4187 - [[package]] 4188 - name = "quick-error" 4189 - version = "2.0.1" 4190 - source = "registry+https://github.com/rust-lang/crates.io-index" 4191 - checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 4192 - 4193 - [[package]] 4194 - name = "quick-xml" 4195 - version = "0.37.5" 4196 - source = "registry+https://github.com/rust-lang/crates.io-index" 4197 - checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 4198 - dependencies = [ 4199 - "memchr", 4200 - ] 4201 - 4202 - [[package]] 4203 - name = "quote" 4204 - version = "1.0.40" 4205 - source = "registry+https://github.com/rust-lang/crates.io-index" 4206 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 4207 - dependencies = [ 4208 - "proc-macro2", 4209 - ] 4210 - 4211 - [[package]] 4212 - name = "r-efi" 4213 - version = "5.2.0" 4214 - source = "registry+https://github.com/rust-lang/crates.io-index" 4215 - checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 4216 - 4217 - [[package]] 4218 - name = "radsort" 4219 - version = "0.1.1" 4220 - source = "registry+https://github.com/rust-lang/crates.io-index" 4221 - checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" 4222 - 4223 - [[package]] 4224 - name = "rand" 4225 - version = "0.8.5" 4226 - source = "registry+https://github.com/rust-lang/crates.io-index" 4227 - checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 4228 - dependencies = [ 4229 - "libc", 4230 - "rand_chacha", 4231 - "rand_core", 4232 - ] 4233 - 4234 - [[package]] 4235 - name = "rand_chacha" 4236 - version = "0.3.1" 4237 - source = "registry+https://github.com/rust-lang/crates.io-index" 4238 - checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 4239 - dependencies = [ 4240 - "ppv-lite86", 4241 - "rand_core", 4242 - ] 4243 - 4244 - [[package]] 4245 - name = "rand_core" 4246 - version = "0.6.4" 4247 - source = "registry+https://github.com/rust-lang/crates.io-index" 4248 - checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 4249 - dependencies = [ 4250 - "getrandom 0.2.16", 4251 - ] 4252 - 4253 - [[package]] 4254 - name = "rand_distr" 4255 - version = "0.4.3" 4256 - source = "registry+https://github.com/rust-lang/crates.io-index" 4257 - checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 4258 - dependencies = [ 4259 - "num-traits", 4260 - "rand", 4261 - ] 4262 - 4263 - [[package]] 4264 - name = "range-alloc" 4265 - version = "0.1.4" 4266 - source = "registry+https://github.com/rust-lang/crates.io-index" 4267 - checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" 4268 - 4269 - [[package]] 4270 - name = "rangemap" 4271 - version = "1.5.1" 4272 - source = "registry+https://github.com/rust-lang/crates.io-index" 4273 - checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" 4274 - 4275 - [[package]] 4276 - name = "rav1e" 4277 - version = "0.7.1" 4278 - source = "registry+https://github.com/rust-lang/crates.io-index" 4279 - checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" 4280 - dependencies = [ 4281 - "arbitrary", 4282 - "arg_enum_proc_macro", 4283 - "arrayvec", 4284 - "av1-grain", 4285 - "bitstream-io", 4286 - "built", 4287 - "cfg-if", 4288 - "interpolate_name", 4289 - "itertools 0.12.1", 4290 - "libc", 4291 - "libfuzzer-sys", 4292 - "log", 4293 - "maybe-rayon", 4294 - "new_debug_unreachable", 4295 - "noop_proc_macro", 4296 - "num-derive", 4297 - "num-traits", 4298 - "once_cell", 4299 - "paste", 4300 - "profiling", 4301 - "rand", 4302 - "rand_chacha", 4303 - "simd_helpers", 4304 - "system-deps", 4305 - "thiserror 1.0.69", 4306 - "v_frame", 4307 - "wasm-bindgen", 4308 - ] 4309 - 4310 - [[package]] 4311 - name = "ravif" 4312 - version = "0.11.12" 4313 - source = "registry+https://github.com/rust-lang/crates.io-index" 4314 - checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" 4315 - dependencies = [ 4316 - "avif-serialize", 4317 - "imgref", 4318 - "loop9", 4319 - "quick-error", 4320 - "rav1e", 4321 - "rayon", 4322 - "rgb", 4323 - ] 4324 - 4325 - [[package]] 4326 - name = "raw-window-handle" 4327 - version = "0.6.2" 4328 - source = "registry+https://github.com/rust-lang/crates.io-index" 4329 - checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 4330 - 4331 - [[package]] 4332 - name = "rawpointer" 4333 - version = "0.2.1" 4334 - source = "registry+https://github.com/rust-lang/crates.io-index" 4335 - checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" 4336 - 4337 - [[package]] 4338 - name = "rayon" 4339 - version = "1.10.0" 4340 - source = "registry+https://github.com/rust-lang/crates.io-index" 4341 - checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 4342 - dependencies = [ 4343 - "either", 4344 - "rayon-core", 4345 - ] 4346 - 4347 - [[package]] 4348 - name = "rayon-core" 4349 - version = "1.12.1" 4350 - source = "registry+https://github.com/rust-lang/crates.io-index" 4351 - checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 4352 - dependencies = [ 4353 - "crossbeam-deque", 4354 - "crossbeam-utils", 4355 - ] 4356 - 4357 - [[package]] 4358 - name = "read-fonts" 4359 - version = "0.29.0" 4360 - source = "registry+https://github.com/rust-lang/crates.io-index" 4361 - checksum = "5ce8e2ca6b24313587a03ca61bb74c384e2a815bd90cf2866cfc9f5fb7a11fa0" 4362 - dependencies = [ 4363 - "bytemuck", 4364 - "font-types", 4365 - ] 4366 - 4367 - [[package]] 4368 - name = "rectangle-pack" 4369 - version = "0.4.2" 4370 - source = "registry+https://github.com/rust-lang/crates.io-index" 4371 - checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" 4372 - 4373 - [[package]] 4374 - name = "redox_syscall" 4375 - version = "0.4.1" 4376 - source = "registry+https://github.com/rust-lang/crates.io-index" 4377 - checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 4378 - dependencies = [ 4379 - "bitflags 1.3.2", 4380 - ] 4381 - 4382 - [[package]] 4383 - name = "redox_syscall" 4384 - version = "0.5.12" 4385 - source = "registry+https://github.com/rust-lang/crates.io-index" 4386 - checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 4387 - dependencies = [ 4388 - "bitflags 2.9.0", 4389 - ] 4390 - 4391 - [[package]] 4392 - name = "regex" 4393 - version = "1.11.1" 4394 - source = "registry+https://github.com/rust-lang/crates.io-index" 4395 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 4396 - dependencies = [ 4397 - "aho-corasick", 4398 - "memchr", 4399 - "regex-automata 0.4.9", 4400 - "regex-syntax 0.8.5", 4401 - ] 4402 - 4403 - [[package]] 4404 - name = "regex-automata" 4405 - version = "0.1.10" 4406 - source = "registry+https://github.com/rust-lang/crates.io-index" 4407 - checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 4408 - dependencies = [ 4409 - "regex-syntax 0.6.29", 4410 - ] 4411 - 4412 - [[package]] 4413 - name = "regex-automata" 4414 - version = "0.4.9" 4415 - source = "registry+https://github.com/rust-lang/crates.io-index" 4416 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 4417 - dependencies = [ 4418 - "aho-corasick", 4419 - "memchr", 4420 - "regex-syntax 0.8.5", 4421 - ] 4422 - 4423 - [[package]] 4424 - name = "regex-syntax" 4425 - version = "0.6.29" 4426 - source = "registry+https://github.com/rust-lang/crates.io-index" 4427 - checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 4428 - 4429 - [[package]] 4430 - name = "regex-syntax" 4431 - version = "0.8.5" 4432 - source = "registry+https://github.com/rust-lang/crates.io-index" 4433 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 4434 - 4435 - [[package]] 4436 - name = "renderdoc-sys" 4437 - version = "1.1.0" 4438 - source = "registry+https://github.com/rust-lang/crates.io-index" 4439 - checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 4440 - 4441 - [[package]] 4442 - name = "rgb" 4443 - version = "0.8.50" 4444 - source = "registry+https://github.com/rust-lang/crates.io-index" 4445 - checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" 4446 - 4447 - [[package]] 4448 - name = "rodio" 4449 - version = "0.20.1" 4450 - source = "registry+https://github.com/rust-lang/crates.io-index" 4451 - checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" 4452 - dependencies = [ 4453 - "cpal", 4454 - "lewton", 4455 - ] 4456 - 4457 - [[package]] 4458 - name = "ron" 4459 - version = "0.8.1" 4460 - source = "registry+https://github.com/rust-lang/crates.io-index" 4461 - checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" 4462 - dependencies = [ 4463 - "base64 0.21.7", 4464 - "bitflags 2.9.0", 4465 - "serde", 4466 - "serde_derive", 4467 - ] 4468 - 4469 - [[package]] 4470 - name = "roxmltree" 4471 - version = "0.20.0" 4472 - source = "registry+https://github.com/rust-lang/crates.io-index" 4473 - checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" 4474 - 4475 - [[package]] 4476 - name = "rustc-hash" 4477 - version = "1.1.0" 4478 - source = "registry+https://github.com/rust-lang/crates.io-index" 4479 - checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 4480 - 4481 - [[package]] 4482 - name = "rustix" 4483 - version = "0.38.44" 4484 - source = "registry+https://github.com/rust-lang/crates.io-index" 4485 - checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 4486 - dependencies = [ 4487 - "bitflags 2.9.0", 4488 - "errno", 4489 - "libc", 4490 - "linux-raw-sys", 4491 - "windows-sys 0.59.0", 4492 - ] 4493 - 4494 - [[package]] 4495 - name = "rustversion" 4496 - version = "1.0.20" 4497 - source = "registry+https://github.com/rust-lang/crates.io-index" 4498 - checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 4499 - 4500 - [[package]] 4501 - name = "rustybuzz" 4502 - version = "0.14.1" 4503 - source = "registry+https://github.com/rust-lang/crates.io-index" 4504 - checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" 4505 - dependencies = [ 4506 - "bitflags 2.9.0", 4507 - "bytemuck", 4508 - "libm", 4509 - "smallvec", 4510 - "ttf-parser 0.21.1", 4511 - "unicode-bidi-mirroring", 4512 - "unicode-ccc", 4513 - "unicode-properties", 4514 - "unicode-script", 4515 - ] 4516 - 4517 - [[package]] 4518 - name = "ruzstd" 4519 - version = "0.8.1" 4520 - source = "registry+https://github.com/rust-lang/crates.io-index" 4521 - checksum = "3640bec8aad418d7d03c72ea2de10d5c646a598f9883c7babc160d91e3c1b26c" 4522 - dependencies = [ 4523 - "twox-hash", 4524 - ] 4525 - 4526 - [[package]] 4527 - name = "ryu" 4528 - version = "1.0.20" 4529 - source = "registry+https://github.com/rust-lang/crates.io-index" 4530 - checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 4531 - 4532 - [[package]] 4533 - name = "safe_arch" 4534 - version = "0.7.4" 4535 - source = "registry+https://github.com/rust-lang/crates.io-index" 4536 - checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" 4537 - dependencies = [ 4538 - "bytemuck", 4539 - ] 4540 - 4541 - [[package]] 4542 - name = "same-file" 4543 - version = "1.0.6" 4544 - source = "registry+https://github.com/rust-lang/crates.io-index" 4545 - checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 4546 - dependencies = [ 4547 - "winapi-util", 4548 - ] 4549 - 4550 - [[package]] 4551 - name = "scoped-tls" 4552 - version = "1.0.1" 4553 - source = "registry+https://github.com/rust-lang/crates.io-index" 4554 - checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 4555 - 4556 - [[package]] 4557 - name = "scopeguard" 4558 - version = "1.2.0" 4559 - source = "registry+https://github.com/rust-lang/crates.io-index" 4560 - checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 4561 - 4562 - [[package]] 4563 - name = "sctk-adwaita" 4564 - version = "0.10.1" 4565 - source = "registry+https://github.com/rust-lang/crates.io-index" 4566 - checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" 4567 - dependencies = [ 4568 - "ab_glyph", 4569 - "log", 4570 - "memmap2", 4571 - "smithay-client-toolkit", 4572 - "tiny-skia", 4573 - ] 4574 - 4575 - [[package]] 4576 - name = "self_cell" 4577 - version = "1.2.0" 4578 - source = "registry+https://github.com/rust-lang/crates.io-index" 4579 - checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" 4580 - 4581 - [[package]] 4582 - name = "send_wrapper" 4583 - version = "0.6.0" 4584 - source = "registry+https://github.com/rust-lang/crates.io-index" 4585 - checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 4586 - 4587 - [[package]] 4588 - name = "serde" 4589 - version = "1.0.219" 4590 - source = "registry+https://github.com/rust-lang/crates.io-index" 4591 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 4592 - dependencies = [ 4593 - "serde_derive", 4594 - ] 4595 - 4596 - [[package]] 4597 - name = "serde_derive" 4598 - version = "1.0.219" 4599 - source = "registry+https://github.com/rust-lang/crates.io-index" 4600 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 4601 - dependencies = [ 4602 - "proc-macro2", 4603 - "quote", 4604 - "syn 2.0.101", 4605 - ] 4606 - 4607 - [[package]] 4608 - name = "serde_json" 4609 - version = "1.0.140" 4610 - source = "registry+https://github.com/rust-lang/crates.io-index" 4611 - checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 4612 - dependencies = [ 4613 - "itoa", 4614 - "memchr", 4615 - "ryu", 4616 - "serde", 4617 - ] 4618 - 4619 - [[package]] 4620 - name = "serde_spanned" 4621 - version = "0.6.8" 4622 - source = "registry+https://github.com/rust-lang/crates.io-index" 4623 - checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 4624 - dependencies = [ 4625 - "serde", 4626 - ] 4627 - 4628 - [[package]] 4629 - name = "sharded-slab" 4630 - version = "0.1.7" 4631 - source = "registry+https://github.com/rust-lang/crates.io-index" 4632 - checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 4633 - dependencies = [ 4634 - "lazy_static", 4635 - ] 4636 - 4637 - [[package]] 4638 - name = "shlex" 4639 - version = "1.3.0" 4640 - source = "registry+https://github.com/rust-lang/crates.io-index" 4641 - checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 4642 - 4643 - [[package]] 4644 - name = "simba" 4645 - version = "0.7.3" 4646 - source = "registry+https://github.com/rust-lang/crates.io-index" 4647 - checksum = "2f3fd720c48c53cace224ae62bef1bbff363a70c68c4802a78b5cc6159618176" 4648 - dependencies = [ 4649 - "approx", 4650 - "num-complex", 4651 - "num-traits", 4652 - "paste", 4653 - "wide", 4654 - ] 4655 - 4656 - [[package]] 4657 - name = "simd-adler32" 4658 - version = "0.3.7" 4659 - source = "registry+https://github.com/rust-lang/crates.io-index" 4660 - checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 4661 - 4662 - [[package]] 4663 - name = "simd_helpers" 4664 - version = "0.1.0" 4665 - source = "registry+https://github.com/rust-lang/crates.io-index" 4666 - checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" 4667 - dependencies = [ 4668 - "quote", 4669 - ] 4670 - 4671 - [[package]] 4672 - name = "skrifa" 4673 - version = "0.31.0" 4674 - source = "registry+https://github.com/rust-lang/crates.io-index" 4675 - checksum = "bbe6666ab11018ab91ff7b03f1a3b9fdbecfb610848436fefa5ce50343d3d913" 4676 - dependencies = [ 4677 - "bytemuck", 4678 - "read-fonts", 4679 - ] 4680 - 4681 - [[package]] 4682 - name = "slab" 4683 - version = "0.4.9" 4684 - source = "registry+https://github.com/rust-lang/crates.io-index" 4685 - checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 4686 - dependencies = [ 4687 - "autocfg", 4688 - ] 4689 - 4690 - [[package]] 4691 - name = "slotmap" 4692 - version = "1.0.7" 4693 - source = "registry+https://github.com/rust-lang/crates.io-index" 4694 - checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 4695 - dependencies = [ 4696 - "version_check", 4697 - ] 4698 - 4699 - [[package]] 4700 - name = "smallvec" 4701 - version = "1.15.0" 4702 - source = "registry+https://github.com/rust-lang/crates.io-index" 4703 - checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 4704 - 4705 - [[package]] 4706 - name = "smithay-client-toolkit" 4707 - version = "0.19.2" 4708 - source = "registry+https://github.com/rust-lang/crates.io-index" 4709 - checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" 4710 - dependencies = [ 4711 - "bitflags 2.9.0", 4712 - "calloop", 4713 - "calloop-wayland-source", 4714 - "cursor-icon", 4715 - "libc", 4716 - "log", 4717 - "memmap2", 4718 - "rustix", 4719 - "thiserror 1.0.69", 4720 - "wayland-backend", 4721 - "wayland-client", 4722 - "wayland-csd-frame", 4723 - "wayland-cursor", 4724 - "wayland-protocols", 4725 - "wayland-protocols-wlr", 4726 - "wayland-scanner", 4727 - "xkeysym", 4728 - ] 4729 - 4730 - [[package]] 4731 - name = "smol_str" 4732 - version = "0.2.2" 4733 - source = "registry+https://github.com/rust-lang/crates.io-index" 4734 - checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" 4735 - dependencies = [ 4736 - "serde", 4737 - ] 4738 - 4739 - [[package]] 4740 - name = "spin" 4741 - version = "0.9.8" 4742 - source = "registry+https://github.com/rust-lang/crates.io-index" 4743 - checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 4744 - dependencies = [ 4745 - "portable-atomic", 4746 - ] 4747 - 4748 - [[package]] 4749 - name = "spirv" 4750 - version = "0.3.0+sdk-1.3.268.0" 4751 - source = "registry+https://github.com/rust-lang/crates.io-index" 4752 - checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 4753 - dependencies = [ 4754 - "bitflags 2.9.0", 4755 - ] 4756 - 4757 - [[package]] 4758 - name = "stable_deref_trait" 4759 - version = "1.2.0" 4760 - source = "registry+https://github.com/rust-lang/crates.io-index" 4761 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 4762 - 4763 - [[package]] 4764 - name = "stackfuture" 4765 - version = "0.3.0" 4766 - source = "registry+https://github.com/rust-lang/crates.io-index" 4767 - checksum = "6eae92052b72ef70dafa16eddbabffc77e5ca3574be2f7bc1127b36f0a7ad7f2" 4768 - 4769 - [[package]] 4770 - name = "static_assertions" 4771 - version = "1.1.0" 4772 - source = "registry+https://github.com/rust-lang/crates.io-index" 4773 - checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 4774 - 4775 - [[package]] 4776 - name = "strict-num" 4777 - version = "0.1.1" 4778 - source = "registry+https://github.com/rust-lang/crates.io-index" 4779 - checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 4780 - 4781 - [[package]] 4782 - name = "strum" 4783 - version = "0.26.3" 4784 - source = "registry+https://github.com/rust-lang/crates.io-index" 4785 - checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 4786 - dependencies = [ 4787 - "strum_macros", 4788 - ] 4789 - 4790 - [[package]] 4791 - name = "strum_macros" 4792 - version = "0.26.4" 4793 - source = "registry+https://github.com/rust-lang/crates.io-index" 4794 - checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 4795 - dependencies = [ 4796 - "heck", 4797 - "proc-macro2", 4798 - "quote", 4799 - "rustversion", 4800 - "syn 2.0.101", 4801 - ] 4802 - 4803 - [[package]] 4804 - name = "svg_fmt" 4805 - version = "0.4.5" 4806 - source = "registry+https://github.com/rust-lang/crates.io-index" 4807 - checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" 4808 - 4809 - [[package]] 4810 - name = "swash" 4811 - version = "0.2.4" 4812 - source = "registry+https://github.com/rust-lang/crates.io-index" 4813 - checksum = "5dce3f0af95643c855cdc449fbaa17d8c2cd08e0b00a49a6babcbe6e71667f3d" 4814 - dependencies = [ 4815 - "skrifa", 4816 - "yazi", 4817 - "zeno", 4818 - ] 4819 - 4820 - [[package]] 4821 - name = "syn" 4822 - version = "1.0.109" 4823 - source = "registry+https://github.com/rust-lang/crates.io-index" 4824 - checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 4825 - dependencies = [ 4826 - "proc-macro2", 4827 - "quote", 4828 - "unicode-ident", 4829 - ] 4830 - 4831 - [[package]] 4832 - name = "syn" 4833 - version = "2.0.101" 4834 - source = "registry+https://github.com/rust-lang/crates.io-index" 4835 - checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 4836 - dependencies = [ 4837 - "proc-macro2", 4838 - "quote", 4839 - "unicode-ident", 4840 - ] 4841 - 4842 - [[package]] 4843 - name = "synstructure" 4844 - version = "0.13.2" 4845 - source = "registry+https://github.com/rust-lang/crates.io-index" 4846 - checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 4847 - dependencies = [ 4848 - "proc-macro2", 4849 - "quote", 4850 - "syn 2.0.101", 4851 - ] 4852 - 4853 - [[package]] 4854 - name = "sys-locale" 4855 - version = "0.3.2" 4856 - source = "registry+https://github.com/rust-lang/crates.io-index" 4857 - checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 4858 - dependencies = [ 4859 - "libc", 4860 - ] 4861 - 4862 - [[package]] 4863 - name = "sysinfo" 4864 - version = "0.34.2" 4865 - source = "registry+https://github.com/rust-lang/crates.io-index" 4866 - checksum = "a4b93974b3d3aeaa036504b8eefd4c039dced109171c1ae973f1dc63b2c7e4b2" 4867 - dependencies = [ 4868 - "libc", 4869 - "memchr", 4870 - "ntapi", 4871 - "objc2-core-foundation", 4872 - "windows 0.57.0", 4873 - ] 4874 - 4875 - [[package]] 4876 - name = "system-deps" 4877 - version = "6.2.2" 4878 - source = "registry+https://github.com/rust-lang/crates.io-index" 4879 - checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 4880 - dependencies = [ 4881 - "cfg-expr", 4882 - "heck", 4883 - "pkg-config", 4884 - "toml", 4885 - "version-compare", 4886 - ] 4887 - 4888 - [[package]] 4889 - name = "taffy" 4890 - version = "0.7.7" 4891 - source = "registry+https://github.com/rust-lang/crates.io-index" 4892 - checksum = "ab4f4d046dd956a47a7e1a2947083d7ac3e6aa3cfaaead36173ceaa5ab11878c" 4893 - dependencies = [ 4894 - "arrayvec", 4895 - "grid", 4896 - "serde", 4897 - "slotmap", 4898 - ] 4899 - 4900 - [[package]] 4901 - name = "target-lexicon" 4902 - version = "0.12.16" 4903 - source = "registry+https://github.com/rust-lang/crates.io-index" 4904 - checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 4905 - 4906 - [[package]] 4907 - name = "termcolor" 4908 - version = "1.4.1" 4909 - source = "registry+https://github.com/rust-lang/crates.io-index" 4910 - checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 4911 - dependencies = [ 4912 - "winapi-util", 4913 - ] 4914 - 4915 - [[package]] 4916 - name = "thiserror" 4917 - version = "1.0.69" 4918 - source = "registry+https://github.com/rust-lang/crates.io-index" 4919 - checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 4920 - dependencies = [ 4921 - "thiserror-impl 1.0.69", 4922 - ] 4923 - 4924 - [[package]] 4925 - name = "thiserror" 4926 - version = "2.0.12" 4927 - source = "registry+https://github.com/rust-lang/crates.io-index" 4928 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4929 - dependencies = [ 4930 - "thiserror-impl 2.0.12", 4931 - ] 4932 - 4933 - [[package]] 4934 - name = "thiserror-impl" 4935 - version = "1.0.69" 4936 - source = "registry+https://github.com/rust-lang/crates.io-index" 4937 - checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 4938 - dependencies = [ 4939 - "proc-macro2", 4940 - "quote", 4941 - "syn 2.0.101", 4942 - ] 4943 - 4944 - [[package]] 4945 - name = "thiserror-impl" 4946 - version = "2.0.12" 4947 - source = "registry+https://github.com/rust-lang/crates.io-index" 4948 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4949 - dependencies = [ 4950 - "proc-macro2", 4951 - "quote", 4952 - "syn 2.0.101", 4953 - ] 4954 - 4955 - [[package]] 4956 - name = "thread_local" 4957 - version = "1.1.8" 4958 - source = "registry+https://github.com/rust-lang/crates.io-index" 4959 - checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 4960 - dependencies = [ 4961 - "cfg-if", 4962 - "once_cell", 4963 - ] 4964 - 4965 - [[package]] 4966 - name = "tiff" 4967 - version = "0.9.1" 4968 - source = "registry+https://github.com/rust-lang/crates.io-index" 4969 - checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 4970 - dependencies = [ 4971 - "flate2", 4972 - "jpeg-decoder", 4973 - "weezl", 4974 - ] 4975 - 4976 - [[package]] 4977 - name = "tiny-skia" 4978 - version = "0.11.4" 4979 - source = "registry+https://github.com/rust-lang/crates.io-index" 4980 - checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" 4981 - dependencies = [ 4982 - "arrayref", 4983 - "arrayvec", 4984 - "bytemuck", 4985 - "cfg-if", 4986 - "log", 4987 - "tiny-skia-path", 4988 - ] 4989 - 4990 - [[package]] 4991 - name = "tiny-skia-path" 4992 - version = "0.11.4" 4993 - source = "registry+https://github.com/rust-lang/crates.io-index" 4994 - checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 4995 - dependencies = [ 4996 - "arrayref", 4997 - "bytemuck", 4998 - "strict-num", 4999 - ] 5000 - 5001 - [[package]] 5002 - name = "tinystr" 5003 - version = "0.8.1" 5004 - source = "registry+https://github.com/rust-lang/crates.io-index" 5005 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 5006 - dependencies = [ 5007 - "displaydoc", 5008 - "zerovec", 5009 - ] 5010 - 5011 - [[package]] 5012 - name = "tinyvec" 5013 - version = "1.9.0" 5014 - source = "registry+https://github.com/rust-lang/crates.io-index" 5015 - checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 5016 - dependencies = [ 5017 - "tinyvec_macros", 5018 - ] 5019 - 5020 - [[package]] 5021 - name = "tinyvec_macros" 5022 - version = "0.1.1" 5023 - source = "registry+https://github.com/rust-lang/crates.io-index" 5024 - checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 5025 - 5026 - [[package]] 5027 - name = "toml" 5028 - version = "0.8.22" 5029 - source = "registry+https://github.com/rust-lang/crates.io-index" 5030 - checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" 5031 - dependencies = [ 5032 - "serde", 5033 - "serde_spanned", 5034 - "toml_datetime", 5035 - "toml_edit", 5036 - ] 5037 - 5038 - [[package]] 5039 - name = "toml_datetime" 5040 - version = "0.6.9" 5041 - source = "registry+https://github.com/rust-lang/crates.io-index" 5042 - checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" 5043 - dependencies = [ 5044 - "serde", 5045 - ] 5046 - 5047 - [[package]] 5048 - name = "toml_edit" 5049 - version = "0.22.26" 5050 - source = "registry+https://github.com/rust-lang/crates.io-index" 5051 - checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" 5052 - dependencies = [ 5053 - "indexmap", 5054 - "serde", 5055 - "serde_spanned", 5056 - "toml_datetime", 5057 - "winnow", 5058 - ] 5059 - 5060 - [[package]] 5061 - name = "tracing" 5062 - version = "0.1.41" 5063 - source = "registry+https://github.com/rust-lang/crates.io-index" 5064 - checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 5065 - dependencies = [ 5066 - "pin-project-lite", 5067 - "tracing-attributes", 5068 - "tracing-core", 5069 - ] 5070 - 5071 - [[package]] 5072 - name = "tracing-attributes" 5073 - version = "0.1.28" 5074 - source = "registry+https://github.com/rust-lang/crates.io-index" 5075 - checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 5076 - dependencies = [ 5077 - "proc-macro2", 5078 - "quote", 5079 - "syn 2.0.101", 5080 - ] 5081 - 5082 - [[package]] 5083 - name = "tracing-core" 5084 - version = "0.1.33" 5085 - source = "registry+https://github.com/rust-lang/crates.io-index" 5086 - checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 5087 - dependencies = [ 5088 - "once_cell", 5089 - "valuable", 5090 - ] 5091 - 5092 - [[package]] 5093 - name = "tracing-log" 5094 - version = "0.2.0" 5095 - source = "registry+https://github.com/rust-lang/crates.io-index" 5096 - checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 5097 - dependencies = [ 5098 - "log", 5099 - "once_cell", 5100 - "tracing-core", 5101 - ] 5102 - 5103 - [[package]] 5104 - name = "tracing-oslog" 5105 - version = "0.2.0" 5106 - source = "registry+https://github.com/rust-lang/crates.io-index" 5107 - checksum = "528bdd1f0e27b5dd9a4ededf154e824b0532731e4af73bb531de46276e0aab1e" 5108 - dependencies = [ 5109 - "bindgen", 5110 - "cc", 5111 - "cfg-if", 5112 - "once_cell", 5113 - "parking_lot", 5114 - "tracing-core", 5115 - "tracing-subscriber", 5116 - ] 5117 - 5118 - [[package]] 5119 - name = "tracing-subscriber" 5120 - version = "0.3.19" 5121 - source = "registry+https://github.com/rust-lang/crates.io-index" 5122 - checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 5123 - dependencies = [ 5124 - "matchers", 5125 - "nu-ansi-term", 5126 - "once_cell", 5127 - "regex", 5128 - "sharded-slab", 5129 - "smallvec", 5130 - "thread_local", 5131 - "tracing", 5132 - "tracing-core", 5133 - "tracing-log", 5134 - ] 5135 - 5136 - [[package]] 5137 - name = "tracing-wasm" 5138 - version = "0.2.1" 5139 - source = "registry+https://github.com/rust-lang/crates.io-index" 5140 - checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" 5141 - dependencies = [ 5142 - "tracing", 5143 - "tracing-subscriber", 5144 - "wasm-bindgen", 5145 - ] 5146 - 5147 - [[package]] 5148 - name = "ttf-parser" 5149 - version = "0.20.0" 5150 - source = "registry+https://github.com/rust-lang/crates.io-index" 5151 - checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 5152 - 5153 - [[package]] 5154 - name = "ttf-parser" 5155 - version = "0.21.1" 5156 - source = "registry+https://github.com/rust-lang/crates.io-index" 5157 - checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" 5158 - 5159 - [[package]] 5160 - name = "ttf-parser" 5161 - version = "0.25.1" 5162 - source = "registry+https://github.com/rust-lang/crates.io-index" 5163 - checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 5164 - 5165 - [[package]] 5166 - name = "twox-hash" 5167 - version = "2.1.0" 5168 - source = "registry+https://github.com/rust-lang/crates.io-index" 5169 - checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" 5170 - 5171 - [[package]] 5172 - name = "typeid" 5173 - version = "1.0.3" 5174 - source = "registry+https://github.com/rust-lang/crates.io-index" 5175 - checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" 5176 - 5177 - [[package]] 5178 - name = "typenum" 5179 - version = "1.18.0" 5180 - source = "registry+https://github.com/rust-lang/crates.io-index" 5181 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 5182 - 5183 - [[package]] 5184 - name = "unicode-bidi" 5185 - version = "0.3.18" 5186 - source = "registry+https://github.com/rust-lang/crates.io-index" 5187 - checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 5188 - 5189 - [[package]] 5190 - name = "unicode-bidi-mirroring" 5191 - version = "0.2.0" 5192 - source = "registry+https://github.com/rust-lang/crates.io-index" 5193 - checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" 5194 - 5195 - [[package]] 5196 - name = "unicode-ccc" 5197 - version = "0.2.0" 5198 - source = "registry+https://github.com/rust-lang/crates.io-index" 5199 - checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" 5200 - 5201 - [[package]] 5202 - name = "unicode-ident" 5203 - version = "1.0.18" 5204 - source = "registry+https://github.com/rust-lang/crates.io-index" 5205 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 5206 - 5207 - [[package]] 5208 - name = "unicode-linebreak" 5209 - version = "0.1.5" 5210 - source = "registry+https://github.com/rust-lang/crates.io-index" 5211 - checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 5212 - 5213 - [[package]] 5214 - name = "unicode-properties" 5215 - version = "0.1.3" 5216 - source = "registry+https://github.com/rust-lang/crates.io-index" 5217 - checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 5218 - 5219 - [[package]] 5220 - name = "unicode-script" 5221 - version = "0.5.7" 5222 - source = "registry+https://github.com/rust-lang/crates.io-index" 5223 - checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" 5224 - 5225 - [[package]] 5226 - name = "unicode-segmentation" 5227 - version = "1.12.0" 5228 - source = "registry+https://github.com/rust-lang/crates.io-index" 5229 - checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 5230 - 5231 - [[package]] 5232 - name = "unicode-width" 5233 - version = "0.1.14" 5234 - source = "registry+https://github.com/rust-lang/crates.io-index" 5235 - checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 5236 - 5237 - [[package]] 5238 - name = "unicode-xid" 5239 - version = "0.2.6" 5240 - source = "registry+https://github.com/rust-lang/crates.io-index" 5241 - checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 5242 - 5243 - [[package]] 5244 - name = "url" 5245 - version = "2.5.4" 5246 - source = "registry+https://github.com/rust-lang/crates.io-index" 5247 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 5248 - dependencies = [ 5249 - "form_urlencoded", 5250 - "idna", 5251 - "percent-encoding", 5252 - ] 5253 - 5254 - [[package]] 5255 - name = "utf8_iter" 5256 - version = "1.0.4" 5257 - source = "registry+https://github.com/rust-lang/crates.io-index" 5258 - checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 5259 - 5260 - [[package]] 5261 - name = "uuid" 5262 - version = "1.16.0" 5263 - source = "registry+https://github.com/rust-lang/crates.io-index" 5264 - checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 5265 - dependencies = [ 5266 - "getrandom 0.3.3", 5267 - "js-sys", 5268 - "serde", 5269 - "wasm-bindgen", 5270 - ] 5271 - 5272 - [[package]] 5273 - name = "v_frame" 5274 - version = "0.3.8" 5275 - source = "registry+https://github.com/rust-lang/crates.io-index" 5276 - checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" 5277 - dependencies = [ 5278 - "aligned-vec", 5279 - "num-traits", 5280 - "wasm-bindgen", 5281 - ] 5282 - 5283 - [[package]] 5284 - name = "valuable" 5285 - version = "0.1.1" 5286 - source = "registry+https://github.com/rust-lang/crates.io-index" 5287 - checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 5288 - 5289 - [[package]] 5290 - name = "variadics_please" 5291 - version = "1.1.0" 5292 - source = "registry+https://github.com/rust-lang/crates.io-index" 5293 - checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" 5294 - dependencies = [ 5295 - "proc-macro2", 5296 - "quote", 5297 - "syn 2.0.101", 5298 - ] 5299 - 5300 - [[package]] 5301 - name = "vec_map" 5302 - version = "0.8.2" 5303 - source = "registry+https://github.com/rust-lang/crates.io-index" 5304 - checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 5305 - 5306 - [[package]] 5307 - name = "vee" 5308 - version = "0.1.0" 5309 - dependencies = [ 5310 - "bevy", 5311 - "bevy_egui", 5312 - "binrw", 5313 - "flate2", 5314 - "glam 0.30.3", 5315 - "half", 5316 - "mesh-tools", 5317 - ] 5318 - 5319 - [[package]] 5320 - name = "version-compare" 5321 - version = "0.2.0" 5322 - source = "registry+https://github.com/rust-lang/crates.io-index" 5323 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 5324 - 5325 - [[package]] 5326 - name = "version_check" 5327 - version = "0.9.5" 5328 - source = "registry+https://github.com/rust-lang/crates.io-index" 5329 - checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 5330 - 5331 - [[package]] 5332 - name = "walkdir" 5333 - version = "2.5.0" 5334 - source = "registry+https://github.com/rust-lang/crates.io-index" 5335 - checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 5336 - dependencies = [ 5337 - "same-file", 5338 - "winapi-util", 5339 - ] 5340 - 5341 - [[package]] 5342 - name = "wasi" 5343 - version = "0.11.0+wasi-snapshot-preview1" 5344 - source = "registry+https://github.com/rust-lang/crates.io-index" 5345 - checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 5346 - 5347 - [[package]] 5348 - name = "wasi" 5349 - version = "0.14.2+wasi-0.2.4" 5350 - source = "registry+https://github.com/rust-lang/crates.io-index" 5351 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 5352 - dependencies = [ 5353 - "wit-bindgen-rt", 5354 - ] 5355 - 5356 - [[package]] 5357 - name = "wasm-bindgen" 5358 - version = "0.2.100" 5359 - source = "registry+https://github.com/rust-lang/crates.io-index" 5360 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 5361 - dependencies = [ 5362 - "cfg-if", 5363 - "once_cell", 5364 - "rustversion", 5365 - "wasm-bindgen-macro", 5366 - ] 5367 - 5368 - [[package]] 5369 - name = "wasm-bindgen-backend" 5370 - version = "0.2.100" 5371 - source = "registry+https://github.com/rust-lang/crates.io-index" 5372 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 5373 - dependencies = [ 5374 - "bumpalo", 5375 - "log", 5376 - "proc-macro2", 5377 - "quote", 5378 - "syn 2.0.101", 5379 - "wasm-bindgen-shared", 5380 - ] 5381 - 5382 - [[package]] 5383 - name = "wasm-bindgen-futures" 5384 - version = "0.4.50" 5385 - source = "registry+https://github.com/rust-lang/crates.io-index" 5386 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 5387 - dependencies = [ 5388 - "cfg-if", 5389 - "js-sys", 5390 - "once_cell", 5391 - "wasm-bindgen", 5392 - "web-sys", 5393 - ] 5394 - 5395 - [[package]] 5396 - name = "wasm-bindgen-macro" 5397 - version = "0.2.100" 5398 - source = "registry+https://github.com/rust-lang/crates.io-index" 5399 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 5400 - dependencies = [ 5401 - "quote", 5402 - "wasm-bindgen-macro-support", 5403 - ] 5404 - 5405 - [[package]] 5406 - name = "wasm-bindgen-macro-support" 5407 - version = "0.2.100" 5408 - source = "registry+https://github.com/rust-lang/crates.io-index" 5409 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 5410 - dependencies = [ 5411 - "proc-macro2", 5412 - "quote", 5413 - "syn 2.0.101", 5414 - "wasm-bindgen-backend", 5415 - "wasm-bindgen-shared", 5416 - ] 5417 - 5418 - [[package]] 5419 - name = "wasm-bindgen-shared" 5420 - version = "0.2.100" 5421 - source = "registry+https://github.com/rust-lang/crates.io-index" 5422 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 5423 - dependencies = [ 5424 - "unicode-ident", 5425 - ] 5426 - 5427 - [[package]] 5428 - name = "wayland-backend" 5429 - version = "0.3.10" 5430 - source = "registry+https://github.com/rust-lang/crates.io-index" 5431 - checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" 5432 - dependencies = [ 5433 - "cc", 5434 - "downcast-rs 1.2.1", 5435 - "rustix", 5436 - "scoped-tls", 5437 - "smallvec", 5438 - "wayland-sys", 5439 - ] 5440 - 5441 - [[package]] 5442 - name = "wayland-client" 5443 - version = "0.31.10" 5444 - source = "registry+https://github.com/rust-lang/crates.io-index" 5445 - checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" 5446 - dependencies = [ 5447 - "bitflags 2.9.0", 5448 - "rustix", 5449 - "wayland-backend", 5450 - "wayland-scanner", 5451 - ] 5452 - 5453 - [[package]] 5454 - name = "wayland-csd-frame" 5455 - version = "0.3.0" 5456 - source = "registry+https://github.com/rust-lang/crates.io-index" 5457 - checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" 5458 - dependencies = [ 5459 - "bitflags 2.9.0", 5460 - "cursor-icon", 5461 - "wayland-backend", 5462 - ] 5463 - 5464 - [[package]] 5465 - name = "wayland-cursor" 5466 - version = "0.31.10" 5467 - source = "registry+https://github.com/rust-lang/crates.io-index" 5468 - checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" 5469 - dependencies = [ 5470 - "rustix", 5471 - "wayland-client", 5472 - "xcursor", 5473 - ] 5474 - 5475 - [[package]] 5476 - name = "wayland-protocols" 5477 - version = "0.32.8" 5478 - source = "registry+https://github.com/rust-lang/crates.io-index" 5479 - checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" 5480 - dependencies = [ 5481 - "bitflags 2.9.0", 5482 - "wayland-backend", 5483 - "wayland-client", 5484 - "wayland-scanner", 5485 - ] 5486 - 5487 - [[package]] 5488 - name = "wayland-protocols-plasma" 5489 - version = "0.3.8" 5490 - source = "registry+https://github.com/rust-lang/crates.io-index" 5491 - checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" 5492 - dependencies = [ 5493 - "bitflags 2.9.0", 5494 - "wayland-backend", 5495 - "wayland-client", 5496 - "wayland-protocols", 5497 - "wayland-scanner", 5498 - ] 5499 - 5500 - [[package]] 5501 - name = "wayland-protocols-wlr" 5502 - version = "0.3.8" 5503 - source = "registry+https://github.com/rust-lang/crates.io-index" 5504 - checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" 5505 - dependencies = [ 5506 - "bitflags 2.9.0", 5507 - "wayland-backend", 5508 - "wayland-client", 5509 - "wayland-protocols", 5510 - "wayland-scanner", 5511 - ] 5512 - 5513 - [[package]] 5514 - name = "wayland-scanner" 5515 - version = "0.31.6" 5516 - source = "registry+https://github.com/rust-lang/crates.io-index" 5517 - checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" 5518 - dependencies = [ 5519 - "proc-macro2", 5520 - "quick-xml", 5521 - "quote", 5522 - ] 5523 - 5524 - [[package]] 5525 - name = "wayland-sys" 5526 - version = "0.31.6" 5527 - source = "registry+https://github.com/rust-lang/crates.io-index" 5528 - checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" 5529 - dependencies = [ 5530 - "dlib", 5531 - "log", 5532 - "once_cell", 5533 - "pkg-config", 5534 - ] 5535 - 5536 - [[package]] 5537 - name = "web-sys" 5538 - version = "0.3.77" 5539 - source = "registry+https://github.com/rust-lang/crates.io-index" 5540 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5541 - dependencies = [ 5542 - "js-sys", 5543 - "wasm-bindgen", 5544 - ] 5545 - 5546 - [[package]] 5547 - name = "web-time" 5548 - version = "1.1.0" 5549 - source = "registry+https://github.com/rust-lang/crates.io-index" 5550 - checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 5551 - dependencies = [ 5552 - "js-sys", 5553 - "wasm-bindgen", 5554 - ] 5555 - 5556 - [[package]] 5557 - name = "webbrowser" 5558 - version = "1.0.4" 5559 - source = "registry+https://github.com/rust-lang/crates.io-index" 5560 - checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e" 5561 - dependencies = [ 5562 - "core-foundation 0.10.0", 5563 - "home", 5564 - "jni", 5565 - "log", 5566 - "ndk-context", 5567 - "objc2 0.6.1", 5568 - "objc2-foundation 0.3.1", 5569 - "url", 5570 - "web-sys", 5571 - ] 5572 - 5573 - [[package]] 5574 - name = "weezl" 5575 - version = "0.1.8" 5576 - source = "registry+https://github.com/rust-lang/crates.io-index" 5577 - checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 5578 - 5579 - [[package]] 5580 - name = "wgpu" 5581 - version = "24.0.3" 5582 - source = "registry+https://github.com/rust-lang/crates.io-index" 5583 - checksum = "35904fb00ba2d2e0a4d002fcbbb6e1b89b574d272a50e5fc95f6e81cf281c245" 5584 - dependencies = [ 5585 - "arrayvec", 5586 - "bitflags 2.9.0", 5587 - "cfg_aliases", 5588 - "document-features", 5589 - "js-sys", 5590 - "log", 5591 - "naga", 5592 - "parking_lot", 5593 - "profiling", 5594 - "raw-window-handle", 5595 - "smallvec", 5596 - "static_assertions", 5597 - "wasm-bindgen", 5598 - "wasm-bindgen-futures", 5599 - "web-sys", 5600 - "wgpu-core", 5601 - "wgpu-hal", 5602 - "wgpu-types", 5603 - ] 5604 - 5605 - [[package]] 5606 - name = "wgpu-core" 5607 - version = "24.0.2" 5608 - source = "registry+https://github.com/rust-lang/crates.io-index" 5609 - checksum = "671c25545d479b47d3f0a8e373aceb2060b67c6eb841b24ac8c32348151c7a0c" 5610 - dependencies = [ 5611 - "arrayvec", 5612 - "bit-vec 0.8.0", 5613 - "bitflags 2.9.0", 5614 - "cfg_aliases", 5615 - "document-features", 5616 - "indexmap", 5617 - "log", 5618 - "naga", 5619 - "once_cell", 5620 - "parking_lot", 5621 - "profiling", 5622 - "raw-window-handle", 5623 - "rustc-hash", 5624 - "smallvec", 5625 - "thiserror 2.0.12", 5626 - "wgpu-hal", 5627 - "wgpu-types", 5628 - ] 5629 - 5630 - [[package]] 5631 - name = "wgpu-hal" 5632 - version = "24.0.4" 5633 - source = "registry+https://github.com/rust-lang/crates.io-index" 5634 - checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" 5635 - dependencies = [ 5636 - "android_system_properties", 5637 - "arrayvec", 5638 - "ash", 5639 - "bit-set 0.8.0", 5640 - "bitflags 2.9.0", 5641 - "block", 5642 - "bytemuck", 5643 - "cfg_aliases", 5644 - "core-graphics-types", 5645 - "glow", 5646 - "glutin_wgl_sys", 5647 - "gpu-alloc", 5648 - "gpu-allocator", 5649 - "gpu-descriptor", 5650 - "js-sys", 5651 - "khronos-egl", 5652 - "libc", 5653 - "libloading", 5654 - "log", 5655 - "metal", 5656 - "naga", 5657 - "ndk-sys 0.5.0+25.2.9519653", 5658 - "objc", 5659 - "once_cell", 5660 - "ordered-float", 5661 - "parking_lot", 5662 - "profiling", 5663 - "range-alloc", 5664 - "raw-window-handle", 5665 - "renderdoc-sys", 5666 - "rustc-hash", 5667 - "smallvec", 5668 - "thiserror 2.0.12", 5669 - "wasm-bindgen", 5670 - "web-sys", 5671 - "wgpu-types", 5672 - "windows 0.58.0", 5673 - "windows-core 0.58.0", 5674 - ] 5675 - 5676 - [[package]] 5677 - name = "wgpu-types" 5678 - version = "24.0.0" 5679 - source = "registry+https://github.com/rust-lang/crates.io-index" 5680 - checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" 5681 - dependencies = [ 5682 - "bitflags 2.9.0", 5683 - "js-sys", 5684 - "log", 5685 - "serde", 5686 - "web-sys", 5687 - ] 5688 - 5689 - [[package]] 5690 - name = "wide" 5691 - version = "0.7.32" 5692 - source = "registry+https://github.com/rust-lang/crates.io-index" 5693 - checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" 5694 - dependencies = [ 5695 - "bytemuck", 5696 - "safe_arch", 5697 - ] 5698 - 5699 - [[package]] 5700 - name = "winapi" 5701 - version = "0.3.9" 5702 - source = "registry+https://github.com/rust-lang/crates.io-index" 5703 - checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 5704 - dependencies = [ 5705 - "winapi-i686-pc-windows-gnu", 5706 - "winapi-x86_64-pc-windows-gnu", 5707 - ] 5708 - 5709 - [[package]] 5710 - name = "winapi-i686-pc-windows-gnu" 5711 - version = "0.4.0" 5712 - source = "registry+https://github.com/rust-lang/crates.io-index" 5713 - checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 5714 - 5715 - [[package]] 5716 - name = "winapi-util" 5717 - version = "0.1.9" 5718 - source = "registry+https://github.com/rust-lang/crates.io-index" 5719 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5720 - dependencies = [ 5721 - "windows-sys 0.59.0", 5722 - ] 5723 - 5724 - [[package]] 5725 - name = "winapi-x86_64-pc-windows-gnu" 5726 - version = "0.4.0" 5727 - source = "registry+https://github.com/rust-lang/crates.io-index" 5728 - checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 5729 - 5730 - [[package]] 5731 - name = "windows" 5732 - version = "0.54.0" 5733 - source = "registry+https://github.com/rust-lang/crates.io-index" 5734 - checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 5735 - dependencies = [ 5736 - "windows-core 0.54.0", 5737 - "windows-targets 0.52.6", 5738 - ] 5739 - 5740 - [[package]] 5741 - name = "windows" 5742 - version = "0.57.0" 5743 - source = "registry+https://github.com/rust-lang/crates.io-index" 5744 - checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" 5745 - dependencies = [ 5746 - "windows-core 0.57.0", 5747 - "windows-targets 0.52.6", 5748 - ] 5749 - 5750 - [[package]] 5751 - name = "windows" 5752 - version = "0.58.0" 5753 - source = "registry+https://github.com/rust-lang/crates.io-index" 5754 - checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 5755 - dependencies = [ 5756 - "windows-core 0.58.0", 5757 - "windows-targets 0.52.6", 5758 - ] 5759 - 5760 - [[package]] 5761 - name = "windows" 5762 - version = "0.61.1" 5763 - source = "registry+https://github.com/rust-lang/crates.io-index" 5764 - checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" 5765 - dependencies = [ 5766 - "windows-collections", 5767 - "windows-core 0.61.0", 5768 - "windows-future", 5769 - "windows-link", 5770 - "windows-numerics", 5771 - ] 5772 - 5773 - [[package]] 5774 - name = "windows-collections" 5775 - version = "0.2.0" 5776 - source = "registry+https://github.com/rust-lang/crates.io-index" 5777 - checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5778 - dependencies = [ 5779 - "windows-core 0.61.0", 5780 - ] 5781 - 5782 - [[package]] 5783 - name = "windows-core" 5784 - version = "0.54.0" 5785 - source = "registry+https://github.com/rust-lang/crates.io-index" 5786 - checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 5787 - dependencies = [ 5788 - "windows-result 0.1.2", 5789 - "windows-targets 0.52.6", 5790 - ] 5791 - 5792 - [[package]] 5793 - name = "windows-core" 5794 - version = "0.57.0" 5795 - source = "registry+https://github.com/rust-lang/crates.io-index" 5796 - checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" 5797 - dependencies = [ 5798 - "windows-implement 0.57.0", 5799 - "windows-interface 0.57.0", 5800 - "windows-result 0.1.2", 5801 - "windows-targets 0.52.6", 5802 - ] 5803 - 5804 - [[package]] 5805 - name = "windows-core" 5806 - version = "0.58.0" 5807 - source = "registry+https://github.com/rust-lang/crates.io-index" 5808 - checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 5809 - dependencies = [ 5810 - "windows-implement 0.58.0", 5811 - "windows-interface 0.58.0", 5812 - "windows-result 0.2.0", 5813 - "windows-strings 0.1.0", 5814 - "windows-targets 0.52.6", 5815 - ] 5816 - 5817 - [[package]] 5818 - name = "windows-core" 5819 - version = "0.61.0" 5820 - source = "registry+https://github.com/rust-lang/crates.io-index" 5821 - checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 5822 - dependencies = [ 5823 - "windows-implement 0.60.0", 5824 - "windows-interface 0.59.1", 5825 - "windows-link", 5826 - "windows-result 0.3.2", 5827 - "windows-strings 0.4.0", 5828 - ] 5829 - 5830 - [[package]] 5831 - name = "windows-future" 5832 - version = "0.2.0" 5833 - source = "registry+https://github.com/rust-lang/crates.io-index" 5834 - checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" 5835 - dependencies = [ 5836 - "windows-core 0.61.0", 5837 - "windows-link", 5838 - ] 5839 - 5840 - [[package]] 5841 - name = "windows-implement" 5842 - version = "0.57.0" 5843 - source = "registry+https://github.com/rust-lang/crates.io-index" 5844 - checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" 5845 - dependencies = [ 5846 - "proc-macro2", 5847 - "quote", 5848 - "syn 2.0.101", 5849 - ] 5850 - 5851 - [[package]] 5852 - name = "windows-implement" 5853 - version = "0.58.0" 5854 - source = "registry+https://github.com/rust-lang/crates.io-index" 5855 - checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 5856 - dependencies = [ 5857 - "proc-macro2", 5858 - "quote", 5859 - "syn 2.0.101", 5860 - ] 5861 - 5862 - [[package]] 5863 - name = "windows-implement" 5864 - version = "0.60.0" 5865 - source = "registry+https://github.com/rust-lang/crates.io-index" 5866 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5867 - dependencies = [ 5868 - "proc-macro2", 5869 - "quote", 5870 - "syn 2.0.101", 5871 - ] 5872 - 5873 - [[package]] 5874 - name = "windows-interface" 5875 - version = "0.57.0" 5876 - source = "registry+https://github.com/rust-lang/crates.io-index" 5877 - checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" 5878 - dependencies = [ 5879 - "proc-macro2", 5880 - "quote", 5881 - "syn 2.0.101", 5882 - ] 5883 - 5884 - [[package]] 5885 - name = "windows-interface" 5886 - version = "0.58.0" 5887 - source = "registry+https://github.com/rust-lang/crates.io-index" 5888 - checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" 5889 - dependencies = [ 5890 - "proc-macro2", 5891 - "quote", 5892 - "syn 2.0.101", 5893 - ] 5894 - 5895 - [[package]] 5896 - name = "windows-interface" 5897 - version = "0.59.1" 5898 - source = "registry+https://github.com/rust-lang/crates.io-index" 5899 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5900 - dependencies = [ 5901 - "proc-macro2", 5902 - "quote", 5903 - "syn 2.0.101", 5904 - ] 5905 - 5906 - [[package]] 5907 - name = "windows-link" 5908 - version = "0.1.1" 5909 - source = "registry+https://github.com/rust-lang/crates.io-index" 5910 - checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 5911 - 5912 - [[package]] 5913 - name = "windows-numerics" 5914 - version = "0.2.0" 5915 - source = "registry+https://github.com/rust-lang/crates.io-index" 5916 - checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 5917 - dependencies = [ 5918 - "windows-core 0.61.0", 5919 - "windows-link", 5920 - ] 5921 - 5922 - [[package]] 5923 - name = "windows-result" 5924 - version = "0.1.2" 5925 - source = "registry+https://github.com/rust-lang/crates.io-index" 5926 - checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 5927 - dependencies = [ 5928 - "windows-targets 0.52.6", 5929 - ] 5930 - 5931 - [[package]] 5932 - name = "windows-result" 5933 - version = "0.2.0" 5934 - source = "registry+https://github.com/rust-lang/crates.io-index" 5935 - checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 5936 - dependencies = [ 5937 - "windows-targets 0.52.6", 5938 - ] 5939 - 5940 - [[package]] 5941 - name = "windows-result" 5942 - version = "0.3.2" 5943 - source = "registry+https://github.com/rust-lang/crates.io-index" 5944 - checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 5945 - dependencies = [ 5946 - "windows-link", 5947 - ] 5948 - 5949 - [[package]] 5950 - name = "windows-strings" 5951 - version = "0.1.0" 5952 - source = "registry+https://github.com/rust-lang/crates.io-index" 5953 - checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 5954 - dependencies = [ 5955 - "windows-result 0.2.0", 5956 - "windows-targets 0.52.6", 5957 - ] 5958 - 5959 - [[package]] 5960 - name = "windows-strings" 5961 - version = "0.4.0" 5962 - source = "registry+https://github.com/rust-lang/crates.io-index" 5963 - checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 5964 - dependencies = [ 5965 - "windows-link", 5966 - ] 5967 - 5968 - [[package]] 5969 - name = "windows-sys" 5970 - version = "0.45.0" 5971 - source = "registry+https://github.com/rust-lang/crates.io-index" 5972 - checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5973 - dependencies = [ 5974 - "windows-targets 0.42.2", 5975 - ] 5976 - 5977 - [[package]] 5978 - name = "windows-sys" 5979 - version = "0.52.0" 5980 - source = "registry+https://github.com/rust-lang/crates.io-index" 5981 - checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 5982 - dependencies = [ 5983 - "windows-targets 0.52.6", 5984 - ] 5985 - 5986 - [[package]] 5987 - name = "windows-sys" 5988 - version = "0.59.0" 5989 - source = "registry+https://github.com/rust-lang/crates.io-index" 5990 - checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 5991 - dependencies = [ 5992 - "windows-targets 0.52.6", 5993 - ] 5994 - 5995 - [[package]] 5996 - name = "windows-targets" 5997 - version = "0.42.2" 5998 - source = "registry+https://github.com/rust-lang/crates.io-index" 5999 - checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 6000 - dependencies = [ 6001 - "windows_aarch64_gnullvm 0.42.2", 6002 - "windows_aarch64_msvc 0.42.2", 6003 - "windows_i686_gnu 0.42.2", 6004 - "windows_i686_msvc 0.42.2", 6005 - "windows_x86_64_gnu 0.42.2", 6006 - "windows_x86_64_gnullvm 0.42.2", 6007 - "windows_x86_64_msvc 0.42.2", 6008 - ] 6009 - 6010 - [[package]] 6011 - name = "windows-targets" 6012 - version = "0.48.5" 6013 - source = "registry+https://github.com/rust-lang/crates.io-index" 6014 - checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 6015 - dependencies = [ 6016 - "windows_aarch64_gnullvm 0.48.5", 6017 - "windows_aarch64_msvc 0.48.5", 6018 - "windows_i686_gnu 0.48.5", 6019 - "windows_i686_msvc 0.48.5", 6020 - "windows_x86_64_gnu 0.48.5", 6021 - "windows_x86_64_gnullvm 0.48.5", 6022 - "windows_x86_64_msvc 0.48.5", 6023 - ] 6024 - 6025 - [[package]] 6026 - name = "windows-targets" 6027 - version = "0.52.6" 6028 - source = "registry+https://github.com/rust-lang/crates.io-index" 6029 - checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 6030 - dependencies = [ 6031 - "windows_aarch64_gnullvm 0.52.6", 6032 - "windows_aarch64_msvc 0.52.6", 6033 - "windows_i686_gnu 0.52.6", 6034 - "windows_i686_gnullvm", 6035 - "windows_i686_msvc 0.52.6", 6036 - "windows_x86_64_gnu 0.52.6", 6037 - "windows_x86_64_gnullvm 0.52.6", 6038 - "windows_x86_64_msvc 0.52.6", 6039 - ] 6040 - 6041 - [[package]] 6042 - name = "windows_aarch64_gnullvm" 6043 - version = "0.42.2" 6044 - source = "registry+https://github.com/rust-lang/crates.io-index" 6045 - checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 6046 - 6047 - [[package]] 6048 - name = "windows_aarch64_gnullvm" 6049 - version = "0.48.5" 6050 - source = "registry+https://github.com/rust-lang/crates.io-index" 6051 - checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 6052 - 6053 - [[package]] 6054 - name = "windows_aarch64_gnullvm" 6055 - version = "0.52.6" 6056 - source = "registry+https://github.com/rust-lang/crates.io-index" 6057 - checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 6058 - 6059 - [[package]] 6060 - name = "windows_aarch64_msvc" 6061 - version = "0.42.2" 6062 - source = "registry+https://github.com/rust-lang/crates.io-index" 6063 - checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 6064 - 6065 - [[package]] 6066 - name = "windows_aarch64_msvc" 6067 - version = "0.48.5" 6068 - source = "registry+https://github.com/rust-lang/crates.io-index" 6069 - checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 6070 - 6071 - [[package]] 6072 - name = "windows_aarch64_msvc" 6073 - version = "0.52.6" 6074 - source = "registry+https://github.com/rust-lang/crates.io-index" 6075 - checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 6076 - 6077 - [[package]] 6078 - name = "windows_i686_gnu" 6079 - version = "0.42.2" 6080 - source = "registry+https://github.com/rust-lang/crates.io-index" 6081 - checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 6082 - 6083 - [[package]] 6084 - name = "windows_i686_gnu" 6085 - version = "0.48.5" 6086 - source = "registry+https://github.com/rust-lang/crates.io-index" 6087 - checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 6088 - 6089 - [[package]] 6090 - name = "windows_i686_gnu" 6091 - version = "0.52.6" 6092 - source = "registry+https://github.com/rust-lang/crates.io-index" 6093 - checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 6094 - 6095 - [[package]] 6096 - name = "windows_i686_gnullvm" 6097 - version = "0.52.6" 6098 - source = "registry+https://github.com/rust-lang/crates.io-index" 6099 - checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 6100 - 6101 - [[package]] 6102 - name = "windows_i686_msvc" 6103 - version = "0.42.2" 6104 - source = "registry+https://github.com/rust-lang/crates.io-index" 6105 - checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 6106 - 6107 - [[package]] 6108 - name = "windows_i686_msvc" 6109 - version = "0.48.5" 6110 - source = "registry+https://github.com/rust-lang/crates.io-index" 6111 - checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 6112 - 6113 - [[package]] 6114 - name = "windows_i686_msvc" 6115 - version = "0.52.6" 6116 - source = "registry+https://github.com/rust-lang/crates.io-index" 6117 - checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 6118 - 6119 - [[package]] 6120 - name = "windows_x86_64_gnu" 6121 - version = "0.42.2" 6122 - source = "registry+https://github.com/rust-lang/crates.io-index" 6123 - checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 6124 - 6125 - [[package]] 6126 - name = "windows_x86_64_gnu" 6127 - version = "0.48.5" 6128 - source = "registry+https://github.com/rust-lang/crates.io-index" 6129 - checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 6130 - 6131 - [[package]] 6132 - name = "windows_x86_64_gnu" 6133 - version = "0.52.6" 6134 - source = "registry+https://github.com/rust-lang/crates.io-index" 6135 - checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 6136 - 6137 - [[package]] 6138 - name = "windows_x86_64_gnullvm" 6139 - version = "0.42.2" 6140 - source = "registry+https://github.com/rust-lang/crates.io-index" 6141 - checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 6142 - 6143 - [[package]] 6144 - name = "windows_x86_64_gnullvm" 6145 - version = "0.48.5" 6146 - source = "registry+https://github.com/rust-lang/crates.io-index" 6147 - checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 6148 - 6149 - [[package]] 6150 - name = "windows_x86_64_gnullvm" 6151 - version = "0.52.6" 6152 - source = "registry+https://github.com/rust-lang/crates.io-index" 6153 - checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 6154 - 6155 - [[package]] 6156 - name = "windows_x86_64_msvc" 6157 - version = "0.42.2" 6158 - source = "registry+https://github.com/rust-lang/crates.io-index" 6159 - checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 6160 - 6161 - [[package]] 6162 - name = "windows_x86_64_msvc" 6163 - version = "0.48.5" 6164 - source = "registry+https://github.com/rust-lang/crates.io-index" 6165 - checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 6166 - 6167 - [[package]] 6168 - name = "windows_x86_64_msvc" 6169 - version = "0.52.6" 6170 - source = "registry+https://github.com/rust-lang/crates.io-index" 6171 - checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 6172 - 6173 - [[package]] 6174 - name = "winit" 6175 - version = "0.30.10" 6176 - source = "registry+https://github.com/rust-lang/crates.io-index" 6177 - checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e" 6178 - dependencies = [ 6179 - "ahash", 6180 - "android-activity", 6181 - "atomic-waker", 6182 - "bitflags 2.9.0", 6183 - "block2", 6184 - "bytemuck", 6185 - "calloop", 6186 - "cfg_aliases", 6187 - "concurrent-queue", 6188 - "core-foundation 0.9.4", 6189 - "core-graphics", 6190 - "cursor-icon", 6191 - "dpi", 6192 - "js-sys", 6193 - "libc", 6194 - "memmap2", 6195 - "ndk 0.9.0", 6196 - "objc2 0.5.2", 6197 - "objc2-app-kit 0.2.2", 6198 - "objc2-foundation 0.2.2", 6199 - "objc2-ui-kit", 6200 - "orbclient", 6201 - "percent-encoding", 6202 - "pin-project", 6203 - "raw-window-handle", 6204 - "redox_syscall 0.4.1", 6205 - "rustix", 6206 - "sctk-adwaita", 6207 - "smithay-client-toolkit", 6208 - "smol_str", 6209 - "tracing", 6210 - "unicode-segmentation", 6211 - "wasm-bindgen", 6212 - "wasm-bindgen-futures", 6213 - "wayland-backend", 6214 - "wayland-client", 6215 - "wayland-protocols", 6216 - "wayland-protocols-plasma", 6217 - "web-sys", 6218 - "web-time", 6219 - "windows-sys 0.52.0", 6220 - "x11-dl", 6221 - "x11rb", 6222 - "xkbcommon-dl", 6223 - ] 6224 - 6225 - [[package]] 6226 - name = "winnow" 6227 - version = "0.7.10" 6228 - source = "registry+https://github.com/rust-lang/crates.io-index" 6229 - checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" 6230 - dependencies = [ 6231 - "memchr", 6232 - ] 6233 - 6234 - [[package]] 6235 - name = "wit-bindgen-rt" 6236 - version = "0.39.0" 6237 - source = "registry+https://github.com/rust-lang/crates.io-index" 6238 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 6239 - dependencies = [ 6240 - "bitflags 2.9.0", 6241 - ] 6242 - 6243 - [[package]] 6244 - name = "writeable" 6245 - version = "0.6.1" 6246 - source = "registry+https://github.com/rust-lang/crates.io-index" 6247 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 6248 - 6249 - [[package]] 6250 - name = "x11-dl" 6251 - version = "2.21.0" 6252 - source = "registry+https://github.com/rust-lang/crates.io-index" 6253 - checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 6254 - dependencies = [ 6255 - "libc", 6256 - "once_cell", 6257 - "pkg-config", 6258 - ] 6259 - 6260 - [[package]] 6261 - name = "x11rb" 6262 - version = "0.13.1" 6263 - source = "registry+https://github.com/rust-lang/crates.io-index" 6264 - checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" 6265 - dependencies = [ 6266 - "as-raw-xcb-connection", 6267 - "gethostname", 6268 - "libc", 6269 - "libloading", 6270 - "once_cell", 6271 - "rustix", 6272 - "x11rb-protocol", 6273 - ] 6274 - 6275 - [[package]] 6276 - name = "x11rb-protocol" 6277 - version = "0.13.1" 6278 - source = "registry+https://github.com/rust-lang/crates.io-index" 6279 - checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" 6280 - 6281 - [[package]] 6282 - name = "xcursor" 6283 - version = "0.3.8" 6284 - source = "registry+https://github.com/rust-lang/crates.io-index" 6285 - checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" 6286 - 6287 - [[package]] 6288 - name = "xkbcommon-dl" 6289 - version = "0.4.2" 6290 - source = "registry+https://github.com/rust-lang/crates.io-index" 6291 - checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 6292 - dependencies = [ 6293 - "bitflags 2.9.0", 6294 - "dlib", 6295 - "log", 6296 - "once_cell", 6297 - "xkeysym", 6298 - ] 6299 - 6300 - [[package]] 6301 - name = "xkeysym" 6302 - version = "0.2.1" 6303 - source = "registry+https://github.com/rust-lang/crates.io-index" 6304 - checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 6305 - 6306 - [[package]] 6307 - name = "xml-rs" 6308 - version = "0.8.26" 6309 - source = "registry+https://github.com/rust-lang/crates.io-index" 6310 - checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" 6311 - 6312 - [[package]] 6313 - name = "yazi" 6314 - version = "0.2.1" 6315 - source = "registry+https://github.com/rust-lang/crates.io-index" 6316 - checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" 6317 - 6318 - [[package]] 6319 - name = "yoke" 6320 - version = "0.8.0" 6321 - source = "registry+https://github.com/rust-lang/crates.io-index" 6322 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 6323 - dependencies = [ 6324 - "serde", 6325 - "stable_deref_trait", 6326 - "yoke-derive", 6327 - "zerofrom", 6328 - ] 6329 - 6330 - [[package]] 6331 - name = "yoke-derive" 6332 - version = "0.8.0" 6333 - source = "registry+https://github.com/rust-lang/crates.io-index" 6334 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 6335 - dependencies = [ 6336 - "proc-macro2", 6337 - "quote", 6338 - "syn 2.0.101", 6339 - "synstructure", 6340 - ] 6341 - 6342 - [[package]] 6343 - name = "zeno" 6344 - version = "0.3.3" 6345 - source = "registry+https://github.com/rust-lang/crates.io-index" 6346 - checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" 6347 - 6348 - [[package]] 6349 - name = "zerocopy" 6350 - version = "0.8.25" 6351 - source = "registry+https://github.com/rust-lang/crates.io-index" 6352 - checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 6353 - dependencies = [ 6354 - "zerocopy-derive", 6355 - ] 6356 - 6357 - [[package]] 6358 - name = "zerocopy-derive" 6359 - version = "0.8.25" 6360 - source = "registry+https://github.com/rust-lang/crates.io-index" 6361 - checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 6362 - dependencies = [ 6363 - "proc-macro2", 6364 - "quote", 6365 - "syn 2.0.101", 6366 - ] 6367 - 6368 - [[package]] 6369 - name = "zerofrom" 6370 - version = "0.1.6" 6371 - source = "registry+https://github.com/rust-lang/crates.io-index" 6372 - checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 6373 - dependencies = [ 6374 - "zerofrom-derive", 6375 - ] 6376 - 6377 - [[package]] 6378 - name = "zerofrom-derive" 6379 - version = "0.1.6" 6380 - source = "registry+https://github.com/rust-lang/crates.io-index" 6381 - checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 6382 - dependencies = [ 6383 - "proc-macro2", 6384 - "quote", 6385 - "syn 2.0.101", 6386 - "synstructure", 6387 - ] 6388 - 6389 - [[package]] 6390 - name = "zerotrie" 6391 - version = "0.2.2" 6392 - source = "registry+https://github.com/rust-lang/crates.io-index" 6393 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 6394 - dependencies = [ 6395 - "displaydoc", 6396 - "yoke", 6397 - "zerofrom", 6398 - ] 6399 - 6400 - [[package]] 6401 - name = "zerovec" 6402 - version = "0.11.2" 6403 - source = "registry+https://github.com/rust-lang/crates.io-index" 6404 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 6405 - dependencies = [ 6406 - "yoke", 6407 - "zerofrom", 6408 - "zerovec-derive", 6409 - ] 6410 - 6411 - [[package]] 6412 - name = "zerovec-derive" 6413 - version = "0.11.1" 6414 - source = "registry+https://github.com/rust-lang/crates.io-index" 6415 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 6416 - dependencies = [ 6417 - "proc-macro2", 6418 - "quote", 6419 - "syn 2.0.101", 6420 - ] 6421 - 6422 - [[package]] 6423 - name = "zlib-rs" 6424 - version = "0.5.0" 6425 - source = "registry+https://github.com/rust-lang/crates.io-index" 6426 - checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" 6427 - 6428 - [[package]] 6429 - name = "zune-core" 6430 - version = "0.4.12" 6431 - source = "registry+https://github.com/rust-lang/crates.io-index" 6432 - checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 6433 - 6434 - [[package]] 6435 - name = "zune-inflate" 6436 - version = "0.2.54" 6437 - source = "registry+https://github.com/rust-lang/crates.io-index" 6438 - checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" 6439 - dependencies = [ 6440 - "simd-adler32", 6441 - ] 6442 - 6443 - [[package]] 6444 - name = "zune-jpeg" 6445 - version = "0.4.14" 6446 - source = "registry+https://github.com/rust-lang/crates.io-index" 6447 - checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" 6448 - dependencies = [ 6449 - "zune-core", 6450 - ]
-26
vee/Cargo.toml
··· 1 - [package] 2 - name = "vee" 3 - version = "0.1.0" 4 - edition = "2024" 5 - 6 - [dependencies] 7 - binrw = "0.15.0" 8 - bytemuck = "1.23.0" 9 - flate2 = { version = "1.1.1", features = ["rust_backend"] } 10 - futures-intrusive = "0.5.0" 11 - glam = { version = "0.30.3", features = ["mint"] } 12 - half = "2.6.0" 13 - image = "0.25.6" 14 - itertools = "0.14.0" 15 - mesh-tools = { version = "0.1.0", optional = true } 16 - mint = "0.5.9" 17 - nalgebra = { version = "0.33.2", features = ["mint"] } 18 - pollster = "0.4.0" 19 - strum = { version = "0.27.1", features = ["strum_macros"] } 20 - strum_macros = "0.27.1" 21 - tegra_swizzle = "0.4.0" 22 - texture2ddecoder = "0.1.2" 23 - wgpu = "25.0.0" 24 - 25 - [features] 26 - gltf = ["mesh-tools"]
-1
vee/src/charinfo/mod.rs
··· 1 - pub mod nx;
-87
vee/src/charinfo/nx.rs
··· 1 - use binrw::{NullWideString, binrw}; 2 - 3 - #[derive(Debug)] 4 - #[binrw] 5 - #[brw(little)] 6 - pub struct UuidVer4 { 7 - idc: [u8; 16], 8 - } 9 - #[derive(Debug)] 10 - #[binrw] 11 - #[brw(little, assert(nickname.len() <= 22))] 12 - pub struct NxCharInfo { 13 - create_info: UuidVer4, 14 - #[brw(pad_size_to = 0x16)] 15 - pub nickname: NullWideString, 16 - pub font_region: u8, 17 - pub favorite_color: u8, 18 - pub gender: u8, 19 - pub height: u8, 20 - pub build: u8, 21 - pub is_special: u8, 22 - pub region_move: u8, 23 - pub faceline_type: u8, 24 - pub faceline_color: u8, 25 - pub faceline_wrinkle: u8, 26 - pub faceline_make: u8, 27 - pub hair_type: u8, 28 - pub hair_color: u8, 29 - pub hair_flip: u8, 30 - pub eye_type: u8, 31 - pub eye_color: u8, 32 - pub eye_scale: u8, 33 - pub eye_aspect: u8, 34 - pub eye_rotate: u8, 35 - pub eye_x: u8, 36 - pub eye_y: u8, 37 - pub eyebrow_type: u8, 38 - pub eyebrow_color: u8, 39 - pub eyebrow_scale: u8, 40 - pub eyebrow_aspect: u8, 41 - pub eyebrow_rotate: u8, 42 - pub eyebrow_x: u8, 43 - pub eyebrow_y: u8, 44 - pub nose_type: u8, 45 - pub nose_scale: u8, 46 - pub nose_y: u8, 47 - pub mouth_type: u8, 48 - pub mouth_color: u8, 49 - pub mouth_scale: u8, 50 - pub mouth_aspect: u8, 51 - pub mouth_y: u8, 52 - pub beard_color: u8, 53 - pub beard_type: u8, 54 - pub mustache_type: u8, 55 - pub mustache_scale: u8, 56 - pub mustache_y: u8, 57 - pub glass_type: u8, 58 - pub glass_color: u8, 59 - pub glass_scale: u8, 60 - pub glass_y: u8, 61 - pub mole_type: u8, 62 - pub mole_scale: u8, 63 - pub mole_x: u8, 64 - pub mole_y: u8, 65 - reserved: u8, /* always zero */ 66 - } 67 - 68 - #[cfg(test)] 69 - mod tests { 70 - use super::*; 71 - use binrw::BinRead; 72 - use std::{error::Error, fs::File}; 73 - 74 - type R = Result<(), Box<dyn Error>>; 75 - 76 - #[test] 77 - fn mii_deser() -> R { 78 - let mut mii = File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../j0.charinfo"))?; 79 - 80 - let mii = NxCharInfo::read(&mut mii)?; 81 - 82 - assert_eq!(mii.glass_color, 17); 83 - assert_eq!(mii.reserved, 0); 84 - 85 - Ok(()) 86 - } 87 - }
-12
vee/src/color.rs
··· 1 - pub mod cafe { 2 - pub const HAIR_COLOR: [[f32; 4]; 8] = [ 3 - [0.118, 0.102, 0.094, 1.000], 4 - [0.251, 0.125, 0.063, 1.000], 5 - [0.361, 0.094, 0.039, 1.000], 6 - [0.486, 0.227, 0.078, 1.000], 7 - [0.471, 0.471, 0.502, 1.000], 8 - [0.306, 0.243, 0.063, 1.000], 9 - [0.533, 0.345, 0.094, 1.000], 10 - [0.816, 0.627, 0.290, 1.000], 11 - ]; 12 - }
-8
vee/src/lib.rs
··· 1 - #![warn(clippy::all, clippy::pedantic)] 2 - #![allow(dead_code)] 3 - pub mod charinfo; 4 - pub mod color; 5 - pub mod mask; 6 - pub mod shape_load; 7 - pub mod tex_load; 8 - mod utils;
-372
vee/src/mask/mod.rs
··· 1 - use crate::{ 2 - charinfo::{self, nx::NxCharInfo}, 3 - shape_load::nx::{ResourceShape, SHAPE_MID_DAT}, 4 - tex_load::nx::{ResourceTexture, TEXTURE_MID_SRGB_DAT}, 5 - }; 6 - use binrw::BinRead; 7 - use image::RgbaImage; 8 - use nalgebra::{Matrix3x4, Matrix4, Rotation3, Scale2, Vector2, Vector3, matrix, stack}; 9 - use std::{fs::File, io::BufReader}; 10 - 11 - pub mod wgpu_render; 12 - 13 - const fn tex_scale2dim(scale: f32) -> f32 { 14 - 1.0 + 0.4 * scale 15 - } 16 - 17 - // i16 to not lose precision 18 - const fn tex_rotate2ang(rotate: i16) -> f32 { 19 - (360.0 / 32.0) * (rotate % 32) as f32 20 - } 21 - 22 - const fn tex_unit(x: f32) -> f32 { 23 - x / 64.0 24 - } 25 - const TEX_SCALE_X: f32 = 0.889_614_64; 26 - const TEX_SCALE_Y: f32 = 0.927_667_5; 27 - 28 - const TEX_EYE_BASE_X: f32 = tex_unit(0.0); 29 - const TEX_EYE_BASE_Y: f32 = 18.451_525; 30 - const TEX_EYE_BASE_W: f32 = tex_unit(342.0); 31 - const TEX_EYE_BASE_H: f32 = tex_unit(288.0); 32 - 33 - const TEX_EYEBROW_BASE_X: f32 = tex_unit(0.0); 34 - const TEX_EYEBROW_BASE_Y: f32 = 16.549_807; 35 - const TEX_EYEBROW_BASE_W: f32 = tex_unit(324.0); 36 - const TEX_EYEBROW_BASE_H: f32 = tex_unit(288.0); 37 - 38 - const TEX_MOUTH_BASE_Y: f32 = 29.25885; 39 - const TEX_MOUTH_BASE_W: f32 = tex_unit(396.0); 40 - const TEX_MOUTH_BASE_H: f32 = tex_unit(288.0); 41 - 42 - const TEX_MUSTACHE_BASE_Y: f32 = 31.763_554; 43 - const TEX_MUSTACHE_BASE_W: f32 = tex_unit(288.0); 44 - const TEX_MUSTACHE_BASE_H: f32 = tex_unit(576.0); 45 - 46 - const TEX_MOLE_BASE_X: f32 = 17.766_165; 47 - const TEX_MOLE_BASE_Y: f32 = 17.95986; 48 - const TEX_MOLE_BASE_W: f32 = tex_unit(0.0); 49 - const TEX_MOLE_BASE_H: f32 = tex_unit(0.0); 50 - 51 - const EYE_ROT_OFFSET: [u8; 50] = [ 52 - 29, 28, 28, 28, 29, 28, 28, 28, 29, 28, 28, 28, 28, 29, 29, 28, 28, 28, 29, 29, 28, 29, 28, 29, 53 - 29, 28, 29, 28, 28, 29, 28, 28, 28, 29, 29, 29, 28, 28, 29, 29, 29, 28, 28, 29, 29, 29, 29, 29, 54 - 28, 28, 55 - ]; 56 - 57 - // Found in RFL, no idea what it is 58 - const RFL_MAGIC_Y_OFFSET: f32 = 1.160_000_1; 59 - 60 - // pub struct Masks { 61 - // eye: [RawMaskPartsDesc; 2], 62 - // eyebrow: [RawMaskPartsDesc; 2], 63 - // mouth: RawMaskPartsDesc, 64 - // moustache: [RawMaskPartsDesc; 2], 65 - // mole: RawMaskPartsDesc, 66 - // } 67 - // impl Masks { 68 - // fn calc( 69 - // &self, 70 - // char_info: NxCharInfo, 71 - // resolution: i32, 72 - // left_eye_index: i32, 73 - // right_eye_index: i32, 74 - // ) { 75 - // unimplemented!(); 76 - // } 77 - // } 78 - 79 - // pub struct RawMaskPartsDesc { 80 - // scale: Vector2<f32>, 81 - // pos: Vector2<f32>, 82 - // rotation_rads: f32, 83 - // } 84 - 85 - // impl RawMaskPartsDesc {} 86 - 87 - // struct FFLiRawMaskPartsDrawParam {} 88 - // struct FFLiRawMaskDrawParam { 89 - // eye: [FFLiRawMaskPartsDrawParam; 2], 90 - // eyebrow: [FFLiRawMaskPartsDrawParam; 2], 91 - // mouth: FFLiRawMaskPartsDrawParam, 92 - // moustache: [FFLiRawMaskPartsDrawParam; 2], 93 - // mole: FFLiRawMaskPartsDrawParam, 94 - // fill: FFLiRawMaskPartsDrawParam, 95 - // } 96 - 97 - // struct GX2Texture {} 98 - // struct FFLiRawMaskTextureDesc { 99 - // eye: [GX2Texture; 2], 100 - // eyebrow: [GX2Texture; 2], 101 - // mouth: GX2Texture, 102 - // moustache: [GX2Texture; 2], 103 - // mole: GX2Texture, 104 - // } 105 - 106 - // //void FFLiInitDrawParamRawMask(FFLiRawMaskDrawParam* pDrawParam, const FFLiCharInfo* pCharInfo, s32 resolution, s32 leftEyeIndex, s32 rightEyeIndex, const FFLiRawMaskTextureDesc* pDesc, FFLiBufferAllocator* pAllocator); 107 - // fn init_draw_param_raw_mask( 108 - // draw_parameters: (), 109 - // char_info: NxCharInfo, 110 - // resolution: i32, 111 - // left_eye_index: i32, 112 - // right_eye_index: i32, 113 - // texture_desc: (), 114 - // allocator: (), 115 - // ) { 116 - // unimplemented!() 117 - // } 118 - 119 - // //void FFLiInvalidateRawMask(FFLiRawMaskDrawParam* pDrawParam); 120 - // fn invalidate_raw_mask(draw_parameters: ()) { 121 - // unimplemented!() 122 - // } 123 - 124 - // //void FFLiDrawRawMask(const FFLiRawMaskDrawParam* pDrawParam, const FFLiShaderCallback* pCallback); 125 - // fn draw_raw_mask(draw_parameters: (), shader_callback: ()) { 126 - // unimplemented!() 127 - // } 128 - 129 - // type Mat34 = Matrix3x4<f32>; 130 - 131 - // pub fn transformation_matrix( 132 - // scale: Vector2<f32>, 133 - // translation: Vector2<f32>, 134 - // rotation_rads: f32, 135 - // ) -> Matrix4<f32> { 136 - // let rotation = Rotation3::from_axis_angle(&Vector3::z_axis(), rotation_rads); 137 - // let rotation = rotation.matrix(); 138 - 139 - // let scale = Scale2::new(scale.x, scale.y).to_homogeneous(); 140 - 141 - // let rot_and_scale = rotation * scale; 142 - 143 - // let translation = matrix![translation.x; translation.y; 1.0]; 144 - 145 - // let one = matrix![1.0]; 146 - // let mtx = stack![rot_and_scale, translation; 0, one]; 147 - 148 - // mtx 149 - // } 150 - 151 - // /// CalcMVMatrix 152 - // pub fn calc_mv_matrix(p_mv_matrix: &mut Mat34, p_desc: &RawMaskPartsDesc) { 153 - // // Mat34 m; 154 - 155 - // // MAT34Scale(pMVMatrix, pDesc->scale.x, pDesc->scale.y, 1.0f); 156 - // p_mv_matrix.row_mut(0).scale_mut(p_desc.scale.x); 157 - // p_mv_matrix.row_mut(1).scale_mut(p_desc.scale.y); 158 - 159 - // let transform_matrix = transformation_matrix( 160 - // Vector2::<f32>::new(0.889_614_64, 0.927_667_5), 161 - // p_desc.pos, 162 - // p_desc.rotation_rads, 163 - // ); 164 - 165 - // *p_mv_matrix *= transform_matrix; 166 - // } 167 - 168 - #[derive(Clone, Copy, Debug, PartialEq, Eq)] 169 - pub enum ImageOrigin { 170 - Center, 171 - Left, 172 - Right, 173 - } 174 - 175 - #[derive(Clone, Copy, Debug)] 176 - pub struct FacePart { 177 - pub x: f32, 178 - pub y: f32, 179 - pub width: f32, 180 - pub height: f32, 181 - pub angle_deg: f32, 182 - pub origin: ImageOrigin, 183 - } 184 - 185 - #[derive(Clone, Copy, Debug)] 186 - pub struct FaceParts { 187 - pub eye: [FacePart; 2], 188 - pub eyebrow: [FacePart; 2], 189 - pub mouth: FacePart, 190 - pub mustache: [FacePart; 2], 191 - pub mole: FacePart, 192 - } 193 - 194 - impl FaceParts { 195 - pub fn init_glasses(info: &NxCharInfo, resolution: f32) -> [FacePart; 2] { 196 - let resolution = resolution / 64.0; 197 - 198 - let glass_y = TEX_EYE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.glass_y); 199 - let glass_w = TEX_EYE_BASE_W * tex_scale2dim(info.glass_scale.into()); 200 - let glass_h = TEX_EYE_BASE_H * tex_scale2dim(info.glass_scale.into()); 201 - // let eye_a = 202 - // tex_rotate2ang((info + EYE_ROT_OFFSET[info.glass_type as usize]).into()); 203 - 204 - let eye_l = FacePart { 205 - x: resolution * (32.0), 206 - y: glass_y * resolution, 207 - width: glass_w * resolution, 208 - height: glass_h * resolution, 209 - angle_deg: 360.0 - 0.0, 210 - origin: ImageOrigin::Left, 211 - }; 212 - let eye_r = FacePart { 213 - x: resolution * (32.0), 214 - y: glass_y * resolution, 215 - width: glass_w * resolution, 216 - height: glass_h * resolution, 217 - angle_deg: 0.0, 218 - origin: ImageOrigin::Right, 219 - }; 220 - 221 - [eye_l, eye_r] 222 - } 223 - pub fn init(info: &NxCharInfo, resolution: f32) -> FaceParts { 224 - // RFLi_TEX_UNIT 225 - let resolution = resolution / 64.0; 226 - 227 - let eye_spacing_x = TEX_EYE_BASE_X + TEX_SCALE_X * f32::from(info.eye_x); 228 - let eye_y = TEX_EYE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.eye_y); 229 - let eye_w = TEX_EYE_BASE_W * tex_scale2dim(info.eye_scale.into()); 230 - let eye_h = TEX_EYE_BASE_H * tex_scale2dim(info.eye_scale.into()); 231 - let eye_a = 232 - tex_rotate2ang((info.eye_rotate + EYE_ROT_OFFSET[info.eye_type as usize]).into()); 233 - 234 - let eye_l = FacePart { 235 - x: resolution * (32.0 + eye_spacing_x), 236 - y: eye_y * resolution, 237 - width: eye_w * resolution, 238 - height: eye_h * resolution, 239 - angle_deg: 360.0 - eye_a, 240 - origin: ImageOrigin::Left, 241 - }; 242 - let eye_r = FacePart { 243 - x: resolution * (32.0 - eye_spacing_x), 244 - y: eye_y * resolution, 245 - width: eye_w * resolution, 246 - height: eye_h * resolution, 247 - angle_deg: eye_a, 248 - origin: ImageOrigin::Right, 249 - }; 250 - 251 - let eb_spacing_x = TEX_EYEBROW_BASE_X + TEX_SCALE_X * f32::from(info.eyebrow_x); 252 - let eb_y = 253 - TEX_EYEBROW_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.eyebrow_y); 254 - let eb_w = TEX_EYEBROW_BASE_W * tex_scale2dim(info.eyebrow_scale.into()); 255 - let eb_h = TEX_EYEBROW_BASE_H * tex_scale2dim(info.eyebrow_scale.into()); 256 - let eb_a = tex_rotate2ang( 257 - (info.eyebrow_rotate + EYE_ROT_OFFSET[info.eyebrow_type as usize]).into(), 258 - ); 259 - let eb_l = FacePart { 260 - x: resolution * (32.0 + eb_spacing_x), 261 - y: eb_y * resolution, 262 - width: eb_w * resolution, 263 - height: eb_h * resolution, 264 - angle_deg: 360.0 - eb_a, 265 - origin: ImageOrigin::Left, 266 - }; 267 - let eb_r = FacePart { 268 - x: resolution * (32.0 - eb_spacing_x), 269 - y: eb_y * resolution, 270 - width: eb_w * resolution, 271 - height: eb_h * resolution, 272 - angle_deg: eb_a, 273 - origin: ImageOrigin::Right, 274 - }; 275 - 276 - let mouth_y = TEX_MOUTH_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.mouth_y); 277 - let mouth_w = TEX_MOUTH_BASE_W * tex_scale2dim(info.mouth_scale.into()); 278 - let mouth_h = TEX_MOUTH_BASE_H * tex_scale2dim(info.mouth_scale.into()); 279 - 280 - let mouth = FacePart { 281 - x: resolution * 32.0, 282 - y: mouth_y * resolution, 283 - width: mouth_w * resolution, 284 - height: mouth_h * resolution, 285 - angle_deg: 0.0, 286 - origin: ImageOrigin::Center, 287 - }; 288 - 289 - let mus_y = 290 - TEX_MUSTACHE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.mustache_y); 291 - let mus_w = TEX_MUSTACHE_BASE_W * tex_scale2dim(info.mustache_scale.into()); 292 - let mus_h = TEX_MUSTACHE_BASE_H * tex_scale2dim(info.mustache_scale.into()); 293 - 294 - let mus_l = FacePart { 295 - x: resolution * 32.0, 296 - y: mus_y * resolution, 297 - width: mus_w * resolution, 298 - height: mus_h * resolution, 299 - angle_deg: 0.0, 300 - origin: ImageOrigin::Left, 301 - }; 302 - let mus_r = FacePart { 303 - x: resolution * 32.0, 304 - y: mus_y * resolution, 305 - width: mus_w * resolution, 306 - height: mus_h * resolution, 307 - angle_deg: 0.0, 308 - origin: ImageOrigin::Right, 309 - }; 310 - 311 - let mole_x = TEX_MOLE_BASE_X + 2.0 * TEX_SCALE_X * f32::from(info.mole_x); 312 - let mole_y = TEX_MOLE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.mole_y); 313 - let mole_w = TEX_MOLE_BASE_W * tex_scale2dim(info.mole_scale.into()); 314 - let mole_h = TEX_MOLE_BASE_H * tex_scale2dim(info.mole_scale.into()); 315 - 316 - let mole = FacePart { 317 - x: mole_x * resolution, 318 - y: mole_y * resolution, 319 - width: mole_w * resolution, 320 - height: mole_h * resolution, 321 - angle_deg: 0.0, 322 - origin: ImageOrigin::Center, 323 - }; 324 - 325 - FaceParts { 326 - eye: [eye_l, eye_r], 327 - eyebrow: [eb_l, eb_r], 328 - mouth, 329 - mustache: [mus_l, mus_r], 330 - mole, 331 - } 332 - } 333 - } 334 - 335 - #[cfg(test)] 336 - mod tests { 337 - use super::*; 338 - use std::{error::Error, f32::consts::PI}; 339 - 340 - type R = Result<(), Box<dyn Error>>; 341 - 342 - // #[test] 343 - // fn scale_test() { 344 - // let mut mtx = Matrix3x4::identity(); 345 - 346 - // calc_mv_matrix( 347 - // &mut mtx, 348 - // &RawMaskPartsDesc { 349 - // scale: Vector2::<f32>::new(1.0, 1.0), 350 - // pos: Vector2::zeros(), 351 - // rotation_rads: PI, 352 - // }, 353 - // ); 354 - // } 355 - // 356 - #[test] 357 - fn mask_shape() -> R { 358 - let mut bin = BufReader::new(File::open(SHAPE_MID_DAT)?); 359 - 360 - let res = ResourceShape::read(&mut bin)?; 361 - 362 - let mut shape = res.mask[1]; 363 - let mut shape = shape.shape_data(&mut bin)?; 364 - 365 - // let mut file = File::open(SHAPE_MID_DAT)?; 366 - 367 - // let gltf = shape.gltf(&mut file)?; 368 - // gltf.export_glb("jas.glb")?; 369 - // 370 - Ok(()) 371 - } 372 - }
-739
vee/src/mask/wgpu_render.rs
··· 1 - use super::{FacePart, FaceParts, ImageOrigin, TEX_SCALE_X, TEX_SCALE_Y}; 2 - use crate::{ 3 - charinfo::nx::NxCharInfo, 4 - shape_load::nx::{ResourceShape, ShapeData}, 5 - tex_load::nx::ResourceTexture, 6 - }; 7 - use binrw::BinRead; 8 - use glam::{UVec2, Vec2, Vec3, uvec2, vec3}; 9 - use image::{DynamicImage, GenericImageView, RgbaImage}; 10 - use nalgebra::{Matrix3, Matrix4, Vector3}; 11 - use std::{error::Error, fs::File, io::BufReader, mem}; 12 - use wgpu::{DeviceDescriptor, TexelCopyTextureInfo, util::DeviceExt}; 13 - 14 - const SHADER: &str = r" 15 - 16 - struct MvpUniform { 17 - mtx: mat4x4<f32>, 18 - }; 19 - @group(1) @binding(0) // 1. 20 - var<uniform> mvp: MvpUniform; 21 - 22 - 23 - struct VertexOutput { 24 - @builtin(position) clip_position: vec4<f32>, 25 - @location(0) tex_coords: vec2<f32>, 26 - } 27 - 28 - @vertex 29 - fn vs_main( 30 - @location(0) position: vec3<f32>, 31 - @location(1) tex_coords: vec2<f32> 32 - ) -> VertexOutput { 33 - var out: VertexOutput; 34 - out.tex_coords = tex_coords; 35 - out.clip_position = mvp.mtx * vec4<f32>(position, 1.0); 36 - return out; 37 - } 38 - 39 - @group(0) @binding(0) 40 - var t_diffuse: texture_2d<f32>; 41 - @group(0) @binding(1) 42 - var s_diffuse: sampler; 43 - 44 - @fragment 45 - fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 46 - let color = textureSample(t_diffuse, s_diffuse, in.tex_coords); 47 - 48 - if (color.a == 0.0) { 49 - discard; 50 - } 51 - 52 - return color; 53 - } 54 - "; 55 - 56 - #[repr(C)] 57 - #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] 58 - struct MvpMatrixUniform { 59 - mvp_matrix: [[f32; 4]; 4], 60 - } 61 - 62 - pub struct RenderContext { 63 - size: UVec2, 64 - shape: Vec<RenderShape>, 65 - } 66 - 67 - impl RenderContext { 68 - pub fn new( 69 - char: &NxCharInfo, 70 - (file_shape, file_texture): (&mut BufReader<File>, &mut BufReader<File>), 71 - ) -> Result<Self, Box<dyn Error>> { 72 - let res_shape = ResourceShape::read(file_shape)?; 73 - let res_texture = ResourceTexture::read(file_texture)?; 74 - 75 - let mask = FaceParts::init(&char, 256.0); 76 - let part = mask.eye[0]; 77 - let tex = res_texture.eye[char.eye_type as usize]; 78 - 79 - let (vertices, indices, mtx) = quad( 80 - part.x, 81 - part.y, 82 - part.width, 83 - part.height, 84 - part.angle_deg, 85 - part.origin, 86 - 256.0, 87 - ); 88 - 89 - let tex = tex.get_image(file_texture)?.unwrap(); 90 - 91 - let eye_render_shape = RenderShape { 92 - vertices, 93 - indices, 94 - tex: image::DynamicImage::ImageRgba8(tex), 95 - mvp_matrix: mtx, 96 - }; 97 - 98 - let part = mask.eye[1]; 99 - let tex = res_texture.eye[char.eye_type as usize]; 100 - 101 - let (vertices, indices, mtx) = quad( 102 - part.x, 103 - part.y, 104 - part.width, 105 - part.height, 106 - part.angle_deg, 107 - part.origin, 108 - 256.0, 109 - ); 110 - 111 - let tex = tex.get_image(file_texture)?.unwrap(); 112 - 113 - let eye_1_render_shape = RenderShape { 114 - vertices, 115 - indices, 116 - tex: image::DynamicImage::ImageRgba8(tex), 117 - mvp_matrix: mtx, 118 - }; 119 - 120 - // brows 121 - 122 - let part = mask.eyebrow[0]; 123 - let tex = res_texture.eyebrow[char.eyebrow_type as usize]; 124 - 125 - let (vertices, indices, mtx) = quad( 126 - part.x, 127 - part.y, 128 - part.width, 129 - part.height, 130 - part.angle_deg, 131 - part.origin, 132 - 256.0, 133 - ); 134 - 135 - let tex = tex.get_image(file_texture)?.unwrap(); 136 - 137 - let eyebrow_render_shape = RenderShape { 138 - vertices, 139 - indices, 140 - tex: image::DynamicImage::ImageRgba8(tex), 141 - mvp_matrix: mtx, 142 - }; 143 - 144 - let part = mask.eyebrow[1]; 145 - let tex = res_texture.eyebrow[char.eyebrow_type as usize]; 146 - 147 - let (vertices, indices, mtx) = quad( 148 - part.x, 149 - part.y, 150 - part.width, 151 - part.height, 152 - part.angle_deg, 153 - part.origin, 154 - 256.0, 155 - ); 156 - 157 - let tex = tex.get_image(file_texture)?.unwrap(); 158 - 159 - let eyebrow_1_render_shape = RenderShape { 160 - vertices, 161 - indices, 162 - tex: image::DynamicImage::ImageRgba8(tex), 163 - mvp_matrix: mtx, 164 - }; 165 - 166 - // mouth 167 - let part = mask.mouth; 168 - let tex = res_texture.mouth[char.mouth_type as usize]; 169 - 170 - let (vertices, indices, mtx) = quad( 171 - part.x, 172 - part.y, 173 - part.width, 174 - part.height, 175 - part.angle_deg, 176 - part.origin, 177 - 256.0, 178 - ); 179 - 180 - let tex = tex.get_image(file_texture)?.unwrap(); 181 - 182 - let mouth_render_shape = RenderShape { 183 - vertices, 184 - indices, 185 - tex: image::DynamicImage::ImageRgba8(tex), 186 - mvp_matrix: mtx, 187 - }; 188 - 189 - Ok(RenderContext { 190 - size: uvec2(256, 256), 191 - shape: vec![ 192 - eye_render_shape, 193 - eye_1_render_shape, 194 - eyebrow_render_shape, 195 - eyebrow_1_render_shape, 196 - mouth_render_shape, 197 - ], 198 - }) 199 - } 200 - 201 - pub fn new_glasses( 202 - char: &NxCharInfo, 203 - (file_shape, file_texture): (&mut BufReader<File>, &mut BufReader<File>), 204 - ) -> Result<Self, Box<dyn Error>> { 205 - let res_shape = ResourceShape::read(file_shape)?; 206 - let res_texture = ResourceTexture::read(file_texture)?; 207 - 208 - let glasses = FaceParts::init_glasses(char, 256.0); 209 - 210 - // let mask = FaceParts::init(&char, 256.0); 211 - // let part = mask[0]; 212 - let tex = res_texture.glass[char.glass_type as usize]; 213 - let glass_l = glasses[0]; 214 - 215 - let (vertices, indices, mtx) = quad( 216 - glass_l.x, 217 - glass_l.y, 218 - glass_l.width, 219 - glass_l.height, 220 - glass_l.angle_deg, 221 - glass_l.origin, 222 - 256.0, 223 - ); 224 - 225 - let tex = tex.get_image(file_texture)?.unwrap(); 226 - 227 - let glass_l_render_shape = RenderShape { 228 - vertices, 229 - indices, 230 - tex: image::DynamicImage::ImageRgba8(tex.clone()), 231 - mvp_matrix: mtx, 232 - }; 233 - 234 - let glass_r = glasses[1]; 235 - 236 - let (vertices, indices, mtx) = quad( 237 - glass_r.x, 238 - glass_r.y, 239 - glass_r.width, 240 - glass_r.height, 241 - glass_r.angle_deg, 242 - glass_r.origin, 243 - 256.0, 244 - ); 245 - 246 - let glass_r_render_shape = RenderShape { 247 - vertices, 248 - indices, 249 - tex: image::DynamicImage::ImageRgba8(tex), 250 - mvp_matrix: mtx, 251 - }; 252 - 253 - Ok(RenderContext { 254 - size: uvec2(512, 256), 255 - shape: vec![glass_l_render_shape, glass_r_render_shape], 256 - }) 257 - } 258 - } 259 - 260 - struct RenderShape { 261 - vertices: Vec<Vertex>, 262 - indices: Vec<u32>, 263 - tex: DynamicImage, 264 - mvp_matrix: Matrix4<f32>, 265 - } 266 - 267 - #[repr(C)] 268 - #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] 269 - struct Vertex { 270 - position: [f32; 3], 271 - tex_coords: [f32; 2], 272 - } 273 - 274 - impl Vertex { 275 - const ATTRIBS: [wgpu::VertexAttribute; 2] = 276 - wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2]; 277 - 278 - fn desc() -> wgpu::VertexBufferLayout<'static> { 279 - use std::mem; 280 - wgpu::VertexBufferLayout { 281 - array_stride: mem::size_of::<Vertex>() as wgpu::BufferAddress, 282 - step_mode: wgpu::VertexStepMode::Vertex, 283 - attributes: &Self::ATTRIBS, 284 - } 285 - } 286 - } 287 - 288 - fn model_view_matrix( 289 - translation: mint::Vector3<f32>, 290 - scale: mint::Vector3<f32>, 291 - rot_z: f32, 292 - ) -> nalgebra::Matrix4<f32> { 293 - let mut scale = nalgebra::Vector3::<f32>::from(scale); 294 - let translation = nalgebra::Vector3::<f32>::from(translation); 295 - 296 - let mut mtx = nalgebra::Matrix4::identity(); 297 - mtx.append_nonuniform_scaling_mut(&scale); 298 - mtx *= nalgebra::Rotation3::from_euler_angles(0.0, 0.0, rot_z.to_radians()).to_homogeneous(); 299 - mtx.append_nonuniform_scaling_mut(&nalgebra::Vector3::new(TEX_SCALE_X, TEX_SCALE_Y, 1.0)); 300 - mtx.append_translation_mut(&translation); 301 - 302 - mtx 303 - } 304 - 305 - fn v2(x: f32, y: f32) -> [f32; 3] { 306 - [x, y, 0.0] 307 - } 308 - 309 - // https://github.com/SMGCommunity/Petari/blob/6e9ae741a99bb32e6ffbb230a88c976f539dde70/src/RVLFaceLib/RFL_MakeTex.c#L817 310 - fn quad( 311 - x: f32, 312 - y: f32, 313 - width: f32, 314 - height: f32, 315 - rot_z: f32, 316 - origin: ImageOrigin, 317 - resolution: f32, 318 - ) -> (Vec<Vertex>, Vec<u32>, nalgebra::Matrix4<f32>) { 319 - // Mtx rot; 320 - // Mtx pos; 321 - // f32 baseX; 322 - // s16 s0; 323 - // s16 s1; 324 - let base_x: f32; 325 - let s0: f32; 326 - let s1: f32; 327 - 328 - let mv_mtx = model_view_matrix( 329 - vec3(x, y, 0.0).into(), 330 - vec3(width, height, 1.0).into(), 331 - rot_z, 332 - ); 333 - 334 - let p_mtx = Matrix4::new_orthographic(0.0, resolution, 0.0, resolution, -200.0, 200.0); 335 - let mvp_mtx = p_mtx * mv_mtx; 336 - 337 - match origin { 338 - ImageOrigin::Center => { 339 - base_x = -0.5; 340 - s0 = 1.0; 341 - s1 = 0.0; 342 - } 343 - ImageOrigin::Right => { 344 - base_x = -1.0; 345 - s0 = 1.0; 346 - s1 = 0.0; 347 - } 348 - ImageOrigin::Left => { 349 - base_x = 0.0; 350 - s0 = 0.0; 351 - s1 = 1.0; 352 - } 353 - } 354 - 355 - ( 356 - vec![ 357 - Vertex { 358 - position: v2(1.0 + base_x, -0.5), 359 - tex_coords: [s0, 0.0], 360 - }, 361 - Vertex { 362 - position: v2(1.0 + base_x, 0.5), 363 - tex_coords: [s0, 1.0], 364 - }, 365 - Vertex { 366 - position: v2(base_x, 0.5), 367 - tex_coords: [s1, 1.0], 368 - }, 369 - Vertex { 370 - position: v2(base_x, -0.5), 371 - tex_coords: [s1, 0.0], 372 - }, 373 - ], 374 - vec![0, 1, 2, 0, 2, 3], 375 - mvp_mtx, 376 - ) 377 - } 378 - 379 - #[allow(clippy::too_many_lines)] 380 - pub async fn render_context_wgpu(render_context: RenderContext) -> DynamicImage { 381 - let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { 382 - backends: wgpu::Backends::all(), 383 - ..Default::default() 384 - }); 385 - let adapter = instance 386 - .request_adapter(&wgpu::RequestAdapterOptions { 387 - power_preference: wgpu::PowerPreference::default(), 388 - compatible_surface: None, 389 - force_fallback_adapter: false, 390 - }) 391 - .await 392 - .unwrap(); 393 - let (device, queue) = adapter 394 - .request_device(&DeviceDescriptor::default()) 395 - .await 396 - .unwrap(); 397 - 398 - let texture_desc = wgpu::TextureDescriptor { 399 - size: wgpu::Extent3d { 400 - width: render_context.size.x, 401 - height: render_context.size.y, 402 - depth_or_array_layers: 1, 403 - }, 404 - mip_level_count: 1, 405 - sample_count: 1, 406 - dimension: wgpu::TextureDimension::D2, 407 - format: wgpu::TextureFormat::Rgba8UnormSrgb, 408 - usage: wgpu::TextureUsages::COPY_SRC | wgpu::TextureUsages::RENDER_ATTACHMENT, 409 - label: None, 410 - view_formats: &[wgpu::TextureFormat::Rgba8UnormSrgb], 411 - }; 412 - let texture = device.create_texture(&texture_desc); 413 - let texture_view = texture.create_view(&Default::default()); 414 - let u32_size = std::mem::size_of::<u32>() as u32; 415 - let output_buffer_size = 416 - wgpu::BufferAddress::from(u32_size * render_context.size.x * render_context.size.y); 417 - let output_buffer_desc = wgpu::BufferDescriptor { 418 - size: output_buffer_size, 419 - usage: wgpu::BufferUsages::COPY_DST 420 - // this tells wpgu that we want to read this buffer from the cpu 421 - | wgpu::BufferUsages::MAP_READ, 422 - label: None, 423 - mapped_at_creation: false, 424 - }; 425 - let output_buffer = device.create_buffer(&output_buffer_desc); 426 - 427 - let mut encoder = 428 - device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); 429 - 430 - for shape in render_context.shape { 431 - let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { 432 - label: Some("Vertex Buffer"), 433 - contents: bytemuck::cast_slice(&shape.vertices), 434 - usage: wgpu::BufferUsages::VERTEX, 435 - }); 436 - 437 - let index_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { 438 - label: Some("Index Buffer"), 439 - contents: bytemuck::cast_slice(&shape.indices), 440 - usage: wgpu::BufferUsages::INDEX, 441 - }); 442 - 443 - let shape_texture_rgba = shape.tex.to_rgba8(); 444 - let shape_texture_dimensions = shape_texture_rgba.dimensions(); 445 - let shape_texture_size = wgpu::Extent3d { 446 - width: shape_texture_dimensions.0, 447 - height: shape_texture_dimensions.1, 448 - // All textures are stored as 3D, we represent our 2D texture 449 - // by setting depth to 1. 450 - depth_or_array_layers: 1, 451 - }; 452 - let shape_diffuse_texture = device.create_texture(&wgpu::TextureDescriptor { 453 - size: shape_texture_size, 454 - mip_level_count: 1, // We'll talk about this a little later 455 - sample_count: 1, 456 - dimension: wgpu::TextureDimension::D2, 457 - // Most images are stored using sRGB, so we need to reflect that here. 458 - format: wgpu::TextureFormat::Rgba8UnormSrgb, 459 - // TEXTURE_BINDING tells wgpu that we want to use this texture in shaders 460 - // COPY_DST means that we want to copy data to this texture 461 - usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, 462 - label: Some("diffuse_texture"), 463 - // This is the same as with the SurfaceConfig. It 464 - // specifies what texture formats can be used to 465 - // create TextureViews for this texture. The base 466 - // texture format (Rgba8UnormSrgb in this case) is 467 - // always supported. Note that using a different 468 - // texture format is not supported on the WebGL2 469 - // backend. 470 - view_formats: &[], 471 - }); 472 - 473 - queue.write_texture( 474 - TexelCopyTextureInfo { 475 - texture: &shape_diffuse_texture, 476 - mip_level: 0, 477 - origin: wgpu::Origin3d::ZERO, 478 - aspect: wgpu::TextureAspect::All, 479 - }, 480 - &shape_texture_rgba, 481 - wgpu::TexelCopyBufferLayout { 482 - offset: 0, 483 - bytes_per_row: Some(4 * shape_texture_dimensions.0), 484 - rows_per_image: Some(shape_texture_dimensions.1), 485 - }, 486 - shape_texture_size, 487 - ); 488 - 489 - let shape_diffuse_texture_view = 490 - shape_diffuse_texture.create_view(&wgpu::TextureViewDescriptor::default()); 491 - let shape_diffuse_sampler = device.create_sampler(&wgpu::SamplerDescriptor { 492 - address_mode_u: wgpu::AddressMode::ClampToEdge, 493 - address_mode_v: wgpu::AddressMode::ClampToEdge, 494 - address_mode_w: wgpu::AddressMode::ClampToEdge, 495 - mag_filter: wgpu::FilterMode::Linear, 496 - min_filter: wgpu::FilterMode::Nearest, 497 - mipmap_filter: wgpu::FilterMode::Nearest, 498 - ..Default::default() 499 - }); 500 - 501 - let texture_bind_group_layout = 502 - device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 503 - entries: &[ 504 - wgpu::BindGroupLayoutEntry { 505 - binding: 0, 506 - visibility: wgpu::ShaderStages::FRAGMENT, 507 - ty: wgpu::BindingType::Texture { 508 - multisampled: false, 509 - view_dimension: wgpu::TextureViewDimension::D2, 510 - sample_type: wgpu::TextureSampleType::Float { filterable: true }, 511 - }, 512 - count: None, 513 - }, 514 - wgpu::BindGroupLayoutEntry { 515 - binding: 1, 516 - visibility: wgpu::ShaderStages::FRAGMENT, 517 - // This should match the filterable field of the 518 - // corresponding Texture entry above. 519 - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), 520 - count: None, 521 - }, 522 - ], 523 - label: Some("texture_bind_group_layout"), 524 - }); 525 - 526 - let shape_diffuse_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { 527 - layout: &texture_bind_group_layout, 528 - entries: &[ 529 - wgpu::BindGroupEntry { 530 - binding: 0, 531 - resource: wgpu::BindingResource::TextureView(&shape_diffuse_texture_view), 532 - }, 533 - wgpu::BindGroupEntry { 534 - binding: 1, 535 - resource: wgpu::BindingResource::Sampler(&shape_diffuse_sampler), 536 - }, 537 - ], 538 - label: Some("diffuse_bind_group"), 539 - }); 540 - 541 - let mvp_matrix = shape.mvp_matrix.into(); 542 - let mvp_uniform = MvpMatrixUniform { mvp_matrix }; 543 - 544 - let mvp_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { 545 - label: Some("MvpMatrix Buffer"), 546 - contents: bytemuck::cast_slice(&[mvp_uniform]), 547 - usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, 548 - }); 549 - 550 - let mvp_bind_group_layout = 551 - device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 552 - entries: &[wgpu::BindGroupLayoutEntry { 553 - binding: 0, 554 - visibility: wgpu::ShaderStages::VERTEX, 555 - ty: wgpu::BindingType::Buffer { 556 - ty: wgpu::BufferBindingType::Uniform, 557 - has_dynamic_offset: false, 558 - min_binding_size: None, 559 - }, 560 - count: None, 561 - }], 562 - label: Some("mvp_bind_group_layout"), 563 - }); 564 - 565 - let mvp_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { 566 - layout: &mvp_bind_group_layout, 567 - entries: &[wgpu::BindGroupEntry { 568 - binding: 0, 569 - resource: mvp_buffer.as_entire_binding(), 570 - }], 571 - label: Some("mvp_bind_group"), 572 - }); 573 - 574 - let shader = wgpu::ShaderSource::Wgsl(SHADER.into()); 575 - let shader_module = device.create_shader_module(wgpu::ShaderModuleDescriptor { 576 - label: Some("Shader"), 577 - source: shader, 578 - }); 579 - let render_pipeline_layout = 580 - device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { 581 - label: Some("Render Pipeline Layout"), 582 - bind_group_layouts: &[&texture_bind_group_layout, &mvp_bind_group_layout], 583 - push_constant_ranges: &[], 584 - }); 585 - let render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { 586 - label: Some("Render Pipeline"), 587 - layout: Some(&render_pipeline_layout), 588 - vertex: wgpu::VertexState { 589 - module: &shader_module, 590 - entry_point: Some("vs_main"), 591 - buffers: &[Vertex::desc()], 592 - compilation_options: Default::default(), 593 - }, 594 - fragment: Some(wgpu::FragmentState { 595 - module: &shader_module, 596 - entry_point: Some("fs_main"), 597 - targets: &[Some(wgpu::ColorTargetState { 598 - format: texture_desc.format, 599 - blend: Some(wgpu::BlendState::ALPHA_BLENDING), 600 - write_mask: wgpu::ColorWrites::ALL, 601 - })], 602 - compilation_options: Default::default(), 603 - }), 604 - primitive: wgpu::PrimitiveState { 605 - topology: wgpu::PrimitiveTopology::TriangleList, 606 - strip_index_format: None, 607 - front_face: wgpu::FrontFace::Ccw, 608 - cull_mode: Some(wgpu::Face::Back), 609 - // Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE 610 - polygon_mode: wgpu::PolygonMode::Fill, 611 - // Requires Features::DEPTH_CLIP_CONTROL 612 - unclipped_depth: false, 613 - // Requires Features::CONSERVATIVE_RASTERIZATION 614 - conservative: false, 615 - }, 616 - depth_stencil: None, 617 - multisample: wgpu::MultisampleState { 618 - count: 1, 619 - mask: !0, 620 - alpha_to_coverage_enabled: false, 621 - }, 622 - // If the pipeline will be used with a multiview render pass, this 623 - // indicates how many array layers the attachments will have. 624 - multiview: None, 625 - cache: None, 626 - }); 627 - 628 - { 629 - let render_pass_desc = wgpu::RenderPassDescriptor { 630 - label: Some("Render Pass"), 631 - color_attachments: &[Some(wgpu::RenderPassColorAttachment { 632 - view: &texture_view, 633 - resolve_target: None, 634 - ops: wgpu::Operations { 635 - load: wgpu::LoadOp::Load, 636 - store: wgpu::StoreOp::Store, 637 - }, 638 - })], 639 - depth_stencil_attachment: None, 640 - occlusion_query_set: None, 641 - timestamp_writes: None, 642 - }; 643 - let mut render_pass = encoder.begin_render_pass(&render_pass_desc); 644 - 645 - render_pass.set_pipeline(&render_pipeline); 646 - render_pass.set_bind_group(0, &shape_diffuse_bind_group, &[]); 647 - render_pass.set_bind_group(1, &mvp_bind_group, &[]); 648 - render_pass.set_vertex_buffer(0, vertex_buffer.slice(..)); 649 - render_pass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); 650 - 651 - render_pass.draw_indexed(0..shape.indices.len() as u32, 0, 0..1); 652 - } 653 - } 654 - encoder.copy_texture_to_buffer( 655 - wgpu::TexelCopyTextureInfo { 656 - aspect: wgpu::TextureAspect::All, 657 - texture: &texture, 658 - mip_level: 0, 659 - origin: wgpu::Origin3d::ZERO, 660 - }, 661 - wgpu::TexelCopyBufferInfo { 662 - buffer: &output_buffer, 663 - layout: wgpu::TexelCopyBufferLayout { 664 - offset: 0, 665 - bytes_per_row: Some(u32_size * render_context.size.x), 666 - rows_per_image: Some(render_context.size.x), 667 - }, 668 - }, 669 - texture_desc.size, 670 - ); 671 - 672 - queue.submit(Some(encoder.finish())); 673 - 674 - let mut image = None; 675 - // We need to scope the mapping variables so that we can 676 - // unmap the buffer 677 - { 678 - let buffer_slice = output_buffer.slice(..); 679 - 680 - // NOTE: We have to create the mapping THEN device.poll() before await 681 - // the future. Otherwise the application will freeze. 682 - let (tx, rx) = futures_intrusive::channel::shared::oneshot_channel(); 683 - buffer_slice.map_async(wgpu::MapMode::Read, move |result| { 684 - tx.send(result).unwrap(); 685 - }); 686 - device.poll(wgpu::PollType::Wait).unwrap(); 687 - rx.receive().await.unwrap().unwrap(); 688 - 689 - let data = &buffer_slice.get_mapped_range()[..]; 690 - 691 - use image::{ImageBuffer, Rgba}; 692 - let buffer: RgbaImage = ImageBuffer::<Rgba<u8>, _>::from_raw( 693 - render_context.size.x, 694 - render_context.size.y, 695 - data.to_owned(), 696 - ) 697 - .unwrap(); 698 - // buffer.save("image.png").unwrap(); 699 - image = Some(DynamicImage::ImageRgba8(buffer)); 700 - } 701 - output_buffer.unmap(); 702 - 703 - image.unwrap() 704 - } 705 - 706 - #[cfg(test)] 707 - mod tests { 708 - use crate::mask::{FaceParts, NxCharInfo}; 709 - use crate::shape_load::nx::{ResourceShape, SHAPE_MID_DAT}; 710 - use crate::tex_load::nx::{ResourceTexture, TEXTURE_MID_SRGB_DAT}; 711 - use binrw::BinRead; 712 - use glam::uvec2; 713 - 714 - use super::*; 715 - use std::{error::Error, fs::File, io::BufReader}; 716 - 717 - type R = Result<(), Box<dyn Error>>; 718 - 719 - #[test] 720 - #[allow(clippy::too_many_lines)] 721 - fn test_render() -> R { 722 - let mut tex_file = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 723 - let mut tex_shape = BufReader::new(File::open(SHAPE_MID_DAT)?); 724 - 725 - let mut char = 726 - File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../Jasmine.charinfo")).unwrap(); 727 - let char = NxCharInfo::read(&mut char).unwrap(); 728 - 729 - let image = pollster::block_on(render_context_wgpu(RenderContext::new( 730 - // &FaceParts::init(&char, 256.0), 731 - &char, 732 - (&mut tex_shape, &mut tex_file), 733 - )?)); 734 - 735 - image.save("image.png")?; 736 - 737 - Ok(()) 738 - } 739 - }
-1
vee/src/shape_load/mod.rs
··· 1 - pub mod nx;
-387
vee/src/shape_load/nx.rs
··· 1 - use crate::utils::{ReadSeek, Vec3PackedSnorm, inflate_bytes, read_byte_slice, u16_to_f32}; 2 - use binrw::{BinRead, Endian}; 3 - use std::fs::File; 4 - use std::{ 5 - error::Error, 6 - io::{Cursor, Read, Seek, SeekFrom}, 7 - }; 8 - 9 - pub const SHAPE_MID_DAT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/ShapeMid.dat"); 10 - #[cfg(target_family = "wasm")] 11 - pub const SHAPE_MID_DAT_LOADED: &[u8] = include_bytes!("../../../ShapeMid.dat"); 12 - 13 - #[cfg(feature = "gltf")] 14 - use mesh_tools::GltfBuilder; 15 - 16 - enum AttributeType { 17 - /// Vertex positions. Format: `AttributeFormat_16_16_16_16_Float` 18 - Position = 0, // `AttributeFormat_16_16_16_16_Float` 19 - Normal = 1, // `AttributeFormat_10_10_10_2_Snorm` 20 - Uv = 2, // `AttributeFormat_16_16_Float` 21 - Tangent = 3, // `AttributeFormat_8_8_8_8_Snorm` 22 - Param = 4, // `AttributeFormat_8_8_8_8_Unorm` 23 - } 24 - 25 - #[derive(Debug, Clone)] 26 - pub struct ShapeData { 27 - pub positions: Vec<[f32; 3]>, 28 - pub indices: Vec<u16>, 29 - pub normals: Option<Vec<[f32; 3]>>, 30 - pub uvs: Option<Vec<[f32; 2]>>, 31 - pub color_params: Option<Vec<u8>>, 32 - } 33 - impl ShapeData { 34 - #[cfg(feature = "gltf")] 35 - fn gltf(&self, _bounding_box: [[f32; 3]; 2]) -> GltfBuilder { 36 - let mut builder = GltfBuilder::new(); 37 - 38 - let ShapeData { 39 - positions, 40 - indices, 41 - normals: _, 42 - uvs: _, 43 - color_params: _, 44 - } = self; 45 - 46 - let material = builder.create_basic_material( 47 - Some("Hair texture".to_string()), 48 - [0.118, 0.102, 0.094, 1.000], 49 - ); 50 - 51 - let mesh = builder.create_simple_mesh( 52 - Some("Mii Shape".to_string()), 53 - positions.as_flattened(), 54 - indices, 55 - // normals.clone().map(|v| v.into_flattened()).as_deref(), 56 - // uvs.clone().map(|v| v.into_flattened()).as_deref(), 57 - None, 58 - None, 59 - Some(material), 60 - ); 61 - 62 - let mii_shape_node = builder.add_node( 63 - Some("Mii Node".to_string()), 64 - Some(mesh), 65 - Some([0.0, 0.0, 0.0]), 66 - None, 67 - None, 68 - ); 69 - 70 - builder.add_scene(Some("Mii Scene".to_string()), Some(vec![mii_shape_node])); 71 - 72 - builder 73 - } 74 - } 75 - 76 - impl BinRead for ShapeData { 77 - type Args<'a> = ResourceShapeAttribute; 78 - 79 - fn read_options<R: Read + Seek>( 80 - reader: &mut R, 81 - endian: binrw::Endian, 82 - args: Self::Args<'_>, 83 - ) -> binrw::BinResult<Self> { 84 - const PER_VERTEX_SIZE: u32 = 8; 85 - const PER_INDEX_SIZE: u32 = 2; 86 - 87 - // let offset = u32::read_options(reader, endian, ())?; 88 - // let saved_position = reader.stream_position()?; 89 - 90 - // Read positions 91 - reader.seek(SeekFrom::Start(u64::from( 92 - args.attr_offset[AttributeType::Position as usize], 93 - )))?; 94 - 95 - let vertex_count = args.attr_size[AttributeType::Position as usize] / PER_VERTEX_SIZE; 96 - 97 - let mut positions = vec![]; 98 - for _vertex in 0..vertex_count { 99 - positions.push({ 100 - let positions = <[u16; 3]>::read_options(reader, endian, ())?; 101 - let _ = <u16>::read_options(reader, endian, ())?; 102 - 103 - // Skip 2 bytes for padding 104 - // let _ = reader.take(2); 105 - 106 - positions.map(u16_to_f32) 107 - }); 108 - } 109 - 110 - // Read indices 111 - reader.seek(SeekFrom::Start(u64::from(args.index_offset)))?; 112 - 113 - let index_count = args.index_size / PER_INDEX_SIZE; 114 - 115 - let mut indices = vec![]; 116 - for _index in 0..index_count { 117 - let value = <u16>::read_options(reader, endian, ())?; 118 - indices.push(value); 119 - } 120 - 121 - // Read normals 122 - let normals = if args.is_valid_attribute(AttributeType::Normal) { 123 - reader.seek(SeekFrom::Start(u64::from( 124 - args.attr_offset[AttributeType::Normal as usize], 125 - )))?; 126 - 127 - let mut normals = vec![]; 128 - for _vertex in 0..vertex_count { 129 - let packed = <u32>::read_options(reader, endian, ())?; 130 - normals.push(Vec3PackedSnorm(packed).unpack()); 131 - } 132 - 133 - Some(normals) 134 - } else { 135 - None 136 - }; 137 - 138 - // Read UVs 139 - let uvs = if args.is_valid_attribute(AttributeType::Uv) { 140 - reader.seek(SeekFrom::Start(u64::from( 141 - args.attr_offset[AttributeType::Uv as usize], 142 - )))?; 143 - 144 - let mut uvs = vec![]; 145 - for _vertex in 0..vertex_count { 146 - uvs.push(<[u16; 2]>::read_options(reader, endian, ())?.map(u16_to_f32)); 147 - } 148 - 149 - Some(uvs) 150 - } else { 151 - None 152 - }; 153 - 154 - // Read Params (Colors) 155 - let color_params = if args.is_valid_attribute(AttributeType::Param) { 156 - reader.seek(SeekFrom::Start(u64::from( 157 - args.attr_offset[AttributeType::Param as usize], 158 - )))?; 159 - 160 - let color_count = args.attr_size[AttributeType::Param as usize] / PER_VERTEX_SIZE; 161 - 162 - let mut color_params = vec![]; 163 - for _color in 0..color_count { 164 - color_params.push(<u8>::read_options(reader, endian, ())?); 165 - } 166 - 167 - Some(color_params) 168 - } else { 169 - None 170 - }; 171 - 172 - // // Read from an offset with a provided base offset. 173 - // reader.seek(SeekFrom::Start(args + offset as u64))?; 174 - // let value = u16::read_options(reader, endian, ())?; 175 - 176 - // reader.seek(SeekFrom::Start(saved_position))?; 177 - 178 - Ok(ShapeData { 179 - positions, 180 - indices, 181 - normals, 182 - uvs, 183 - color_params, 184 - }) 185 - } 186 - } 187 - #[derive(BinRead, Debug, Clone, Copy)] 188 - pub struct ResourceCommonAttribute { 189 - pub(crate) offset: u32, 190 - pub(crate) size: u32, 191 - pub(crate) size_compressed: u32, 192 - pub(crate) compression_level: u8, 193 - pub(crate) memory_level: u8, 194 - pad: u16, 195 - } 196 - #[derive(BinRead, Default, Debug, Clone, Copy)] 197 - pub struct ResourceShapeAttribute { 198 - pub attr_offset: [u32; 5], 199 - pub attr_size: [u32; 5], 200 - pub index_offset: u32, 201 - pub index_size: u32, 202 - pub bounding_box: [[f32; 3]; 2], 203 - } 204 - impl ResourceShapeAttribute { 205 - fn is_valid_attribute(&self, attr_type: AttributeType) -> bool { 206 - // assert!(attr_type as usize < AttributeType::End as usize); 207 - self.attr_size[attr_type as usize] != 0 208 - } 209 - } 210 - 211 - #[derive(BinRead, Debug, Clone, Copy)] 212 - pub struct ShapeElement { 213 - pub common: ResourceCommonAttribute, 214 - pub shape: ResourceShapeAttribute, 215 - } 216 - 217 - impl ShapeElement { 218 - /// # Errors 219 - /// Can error if: 220 - /// - Shape data is in a malformed zlib format 221 - /// - Writing out shape data file errors 222 - /// - Parsing vertices and etc from data fails 223 - pub fn shape_data(&mut self, file: &mut dyn ReadSeek) -> Result<ShapeData, Box<dyn Error>> { 224 - // exporter set boundingbox 225 - 226 - let shape_data = read_byte_slice( 227 - file, 228 - self.common.offset.into(), 229 - self.common.size.try_into()?, 230 - )?; 231 - 232 - let shape_data = inflate_bytes(&shape_data)?; 233 - 234 - if !cfg!(target_family = "wasm") { 235 - std::fs::write("./shape.dat", shape_data.clone())?; 236 - } 237 - 238 - let data = 239 - ShapeData::read_options(&mut Cursor::new(shape_data), Endian::Little, self.shape)?; 240 - 241 - Ok(data) 242 - } 243 - 244 - /// # Errors 245 - /// Can error if: 246 - /// - Shape data cannot be parsed 247 - #[cfg(feature = "gltf")] 248 - pub fn gltf(&mut self, file: &mut File) -> Result<GltfBuilder, Box<dyn Error>> { 249 - let data = self.shape_data(file)?; 250 - 251 - Ok(data.gltf(self.shape.bounding_box)) 252 - } 253 - } 254 - 255 - #[derive(BinRead, Debug, Clone, Copy)] 256 - pub struct ResourceShapeHairTransform { 257 - front_translate: [f32; 3], 258 - front_rotate: [f32; 3], 259 - side_translate: [f32; 3], 260 - side_rotate: [f32; 3], 261 - top_translate: [f32; 3], 262 - top_rotate: [f32; 3], 263 - } 264 - 265 - #[derive(BinRead, Debug, Clone, Copy)] 266 - pub struct ResourceShapeFacelineTransform { 267 - hair_translate: [f32; 3], 268 - nose_translate: [f32; 3], 269 - beard_translate: [f32; 3], 270 - } 271 - 272 - #[derive(Clone, Copy, Debug)] 273 - pub enum Shape { 274 - Beard, 275 - FaceLine, 276 - Mask, 277 - HatNormal, 278 - HatCap, 279 - ForeheadNormal, 280 - ForeheadCap, 281 - HairNormal, 282 - HairCap, 283 - Glasses, 284 - Nose, 285 - NoseLine, 286 - HairTransform, 287 - FaceLineTransform, 288 - } 289 - #[derive(Clone, Copy)] 290 - pub enum GenericResourceShape { 291 - Element(ShapeElement), 292 - HairTransform(ResourceShapeHairTransform), 293 - FaceLineTransform(ResourceShapeFacelineTransform), 294 - } 295 - 296 - #[derive(BinRead, Debug, Clone, Copy)] 297 - #[br(little, magic = b"NFSR")] 298 - pub struct ResourceShape { 299 - ver: u32, 300 - file_size: u32, 301 - max_size: [u32; 12], 302 - max_alignment: [u32; 12], 303 - pub beard: [ShapeElement; 4], 304 - pub face_line: [ShapeElement; 12], 305 - pub mask: [ShapeElement; 12], 306 - pub hat_normal: [ShapeElement; 132], 307 - pub hat_cap: [ShapeElement; 132], 308 - pub forehead_normal: [ShapeElement; 132], 309 - pub forehead_cap: [ShapeElement; 132], 310 - pub hair_normal: [ShapeElement; 132], 311 - pub hair_cap: [ShapeElement; 132], 312 - 313 - pub glasses: [ShapeElement; 1], 314 - 315 - pub nose: [ShapeElement; 18], 316 - pub nose_line: [ShapeElement; 18], 317 - 318 - pub hair_transform: [ResourceShapeHairTransform; 132], 319 - pub face_line_transform: [ResourceShapeFacelineTransform; 12], 320 - } 321 - 322 - impl ResourceShape { 323 - #[allow(clippy::must_use_candidate)] 324 - pub fn fetch_shape(&self, shape: Shape, index: usize) -> Option<GenericResourceShape> { 325 - let shape_el = |x: &ShapeElement| GenericResourceShape::Element(*x); 326 - let hair_t = |x: &ResourceShapeHairTransform| GenericResourceShape::HairTransform(*x); 327 - let fl_t = |x: &ResourceShapeFacelineTransform| GenericResourceShape::FaceLineTransform(*x); 328 - 329 - match shape { 330 - Shape::Beard => self.beard.get(index).map(shape_el), 331 - Shape::FaceLine => self.face_line.get(index).map(shape_el), 332 - Shape::Mask => self.mask.get(index).map(shape_el), 333 - Shape::HatNormal => self.hat_normal.get(index).map(shape_el), 334 - Shape::HatCap => self.hat_cap.get(index).map(shape_el), 335 - Shape::ForeheadNormal => self.forehead_normal.get(index).map(shape_el), 336 - Shape::ForeheadCap => self.forehead_cap.get(index).map(shape_el), 337 - Shape::HairNormal => self.hair_normal.get(index).map(shape_el), 338 - Shape::HairCap => self.hair_cap.get(index).map(shape_el), 339 - Shape::Glasses => self.glasses.get(index).map(shape_el), 340 - Shape::Nose => self.nose.get(index).map(shape_el), 341 - Shape::NoseLine => self.nose_line.get(index).map(shape_el), 342 - Shape::HairTransform => self.hair_transform.get(index).map(hair_t), 343 - Shape::FaceLineTransform => self.face_line_transform.get(index).map(fl_t), 344 - } 345 - } 346 - } 347 - 348 - #[cfg(test)] 349 - mod tests { 350 - use super::*; 351 - use half::f16; 352 - use std::{error::Error, fs::File, io::BufReader}; 353 - 354 - type R = Result<(), Box<dyn Error>>; 355 - 356 - #[test] 357 - fn read() -> R { 358 - let mut bin = BufReader::new(File::open(SHAPE_MID_DAT)?); 359 - 360 - let _ = ResourceShape::read(&mut bin)?; 361 - 362 - Ok(()) 363 - } 364 - 365 - #[test] 366 - #[cfg(feature = "gltf")] 367 - fn jas() -> R { 368 - let mut bin = BufReader::new(File::open(SHAPE_MID_DAT)?); 369 - 370 - let res = ResourceShape::read(&mut bin)?; 371 - 372 - let mut shape = res.hair_normal[123]; 373 - 374 - let mut file = File::open(SHAPE_MID_DAT)?; 375 - 376 - let gltf = shape.gltf(&mut file)?; 377 - gltf.export_glb("jas.glb")?; 378 - 379 - Ok(()) 380 - } 381 - 382 - #[test] 383 - fn u16_to_f16_to_f32() { 384 - let within_tolerance = (1.0 - f16::from_bits(15360).to_f32()).abs() < 1.0; 385 - assert!(within_tolerance); 386 - } 387 - }
-1
vee/src/tex_load/mod.rs
··· 1 - pub mod nx;
-251
vee/src/tex_load/nx.rs
··· 1 - use std::error::Error; 2 - 3 - use crate::{ 4 - shape_load::nx::ResourceCommonAttribute, 5 - utils::{ReadSeek, inflate_bytes, read_byte_slice}, 6 - }; 7 - use binrw::BinRead; 8 - use image::{ImageBuffer, Rgba, RgbaImage}; 9 - 10 - pub const TEXTURE_MID_SRGB_DAT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/NXTextureMidSRGB.dat"); 11 - 12 - #[derive(BinRead, Debug, Clone, Copy)] 13 - pub struct ResourceTextureAttribute { 14 - alignment: u32, 15 - pub width: u16, 16 - pub height: u16, 17 - format: u8, 18 - mip_count: u8, 19 - tile_mode: u8, 20 - pad: [u8; 1], 21 - } 22 - 23 - #[derive(BinRead, Debug, Clone, Copy)] 24 - pub struct TextureElement { 25 - pub common: ResourceCommonAttribute, 26 - pub texture: ResourceTextureAttribute, 27 - } 28 - use strum_macros::FromRepr; 29 - use tegra_swizzle::{block_height_mip0, div_round_up, swizzle::deswizzle_block_linear}; 30 - 31 - // Format rundown: 32 - // https://www.reedbeta.com/blog/understanding-bcn-texture-compression-formats/#comparison-table 33 - #[derive(FromRepr, Debug)] 34 - enum ResourceTextureFormat { 35 - R = 0, // R8Unorm (Ffl Name) 36 - Rb = 1, // R8B8Unorm 37 - Rgba = 2, // R8B8G8A8Unorm 38 - Bc4 = 3, // Bc4Unorm (Compressed R) 39 - Bc5 = 4, // Bc5Unorm (Compressed Rb) 40 - Bc7 = 5, // Bc7Unorm (Compressed Rgba) 41 - Astc4x4 = 6, // Astc4x4Unorm (Compressed Rgba) 42 - } 43 - 44 - impl TextureElement { 45 - pub fn get_texture_bytes(&self, file: &mut dyn ReadSeek) -> Result<Vec<u8>, Box<dyn Error>> { 46 - let tex_data = read_byte_slice( 47 - file, 48 - self.common.offset.into(), 49 - self.common.size_compressed.try_into()?, 50 - )?; 51 - 52 - let tex_data = inflate_bytes(&tex_data)?; 53 - 54 - let needs_swizzling = self.texture.tile_mode == 0; 55 - 56 - let tex_data = if needs_swizzling { 57 - let block_size = 58 - match ResourceTextureFormat::from_repr(self.texture.format as usize).unwrap() { 59 - ResourceTextureFormat::R 60 - | ResourceTextureFormat::Rb 61 - | ResourceTextureFormat::Rgba => 1, 62 - ResourceTextureFormat::Bc4 63 - | ResourceTextureFormat::Bc5 64 - | ResourceTextureFormat::Bc7 65 - | ResourceTextureFormat::Astc4x4 => 4, 66 - }; 67 - 68 - let bytes_per_pixel = 69 - match ResourceTextureFormat::from_repr(self.texture.format as usize).unwrap() { 70 - ResourceTextureFormat::R 71 - | ResourceTextureFormat::Rb 72 - | ResourceTextureFormat::Rgba => 1, 73 - ResourceTextureFormat::Bc4 => 8, 74 - ResourceTextureFormat::Bc5 75 - | ResourceTextureFormat::Bc7 76 - | ResourceTextureFormat::Astc4x4 => 16, 77 - }; 78 - 79 - let height = self.texture.height.into(); 80 - let block_height = block_height_mip0(div_round_up(height, block_size)); 81 - 82 - // panic!("{}", tex_data.len()); 83 - deswizzle_block_linear( 84 - div_round_up(self.texture.width.into(), block_size), 85 - div_round_up(self.texture.height.into(), block_size), 86 - 1, 87 - &tex_data, 88 - block_height, 89 - bytes_per_pixel, 90 - )? 91 - } else { 92 - tex_data 93 - }; 94 - 95 - Ok(tex_data) 96 - } 97 - 98 - pub fn get_uncompressed_bytes( 99 - &self, 100 - file: &mut dyn ReadSeek, 101 - ) -> Result<Option<Vec<u8>>, Box<dyn Error>> { 102 - if self.texture.width == 0 || self.texture.height == 0 { 103 - return Ok(None); 104 - } 105 - 106 - let tex_data = self.get_texture_bytes(file)?; 107 - assert!(!tex_data.is_empty()); 108 - 109 - let mut tex_data_decoded = 110 - vec![0; (u32::from(self.texture.width) * u32::from(self.texture.height)) as usize]; 111 - match ResourceTextureFormat::from_repr(self.texture.format as usize).unwrap() { 112 - ResourceTextureFormat::Bc7 => { 113 - texture2ddecoder::decode_bc7( 114 - &tex_data, 115 - self.texture.width.into(), 116 - self.texture.height.into(), 117 - &mut tex_data_decoded, 118 - )?; 119 - } 120 - ResourceTextureFormat::Bc4 => { 121 - texture2ddecoder::decode_bc4( 122 - &tex_data, 123 - self.texture.width.into(), 124 - self.texture.height.into(), 125 - &mut tex_data_decoded, 126 - )?; 127 - 128 - // Convert R to Rgba 129 - tex_data_decoded = tex_data_decoded 130 - .iter() 131 - .map(|x| { 132 - let [_, _, w, _] = x.to_le_bytes(); 133 - u32::from_le_bytes([w, w, w, w]) 134 - }) 135 - .collect(); 136 - } 137 - ResourceTextureFormat::Bc5 => { 138 - texture2ddecoder::decode_bc5( 139 - &tex_data, 140 - self.texture.width.into(), 141 - self.texture.height.into(), 142 - &mut tex_data_decoded, 143 - )?; 144 - 145 - // Convert Rb to Rgba 146 - tex_data_decoded = tex_data_decoded 147 - .iter() 148 - .map(|x| { 149 - let [w, a, _, _] = x.to_le_bytes(); 150 - u32::from_le_bytes([w, w, w, a]) 151 - }) 152 - .collect(); 153 - } 154 - ResourceTextureFormat::R => { 155 - tex_data_decoded = tex_data 156 - .iter() 157 - .map(|x| u32::from_le_bytes([*x, *x, *x, 255])) 158 - .collect(); 159 - } 160 - ResourceTextureFormat::Astc4x4 => { 161 - texture2ddecoder::decode_astc_4_4( 162 - &tex_data, 163 - self.texture.width.into(), 164 - self.texture.height.into(), 165 - &mut tex_data_decoded, 166 - )?; 167 - } 168 - e => unimplemented!("{e:?} is not decoded yet"), 169 - } 170 - 171 - // U32 to 4x U8 172 - let tex_data_decoded: Vec<u8> = tex_data_decoded 173 - .iter() 174 - .flat_map(|x| { 175 - let [b, g, r, a] = x.to_le_bytes(); 176 - [r, g, b, a] 177 - }) 178 - .collect(); 179 - 180 - Ok(Some(tex_data_decoded)) 181 - } 182 - pub fn get_image(&self, file: &mut dyn ReadSeek) -> Result<Option<RgbaImage>, Box<dyn Error>> { 183 - let bytes = match self.get_uncompressed_bytes(file) { 184 - Ok(Some(bytes)) => bytes, 185 - Ok(None) => return Ok(None), 186 - Err(e) => return Err(e), 187 - }; 188 - 189 - let img: ImageBuffer<Rgba<u8>, Vec<u8>> = image::RgbaImage::from_raw( 190 - self.texture.width.into(), 191 - self.texture.height.into(), 192 - bytes, 193 - ) 194 - .unwrap(); 195 - 196 - Ok(Some(img)) 197 - } 198 - } 199 - 200 - #[derive(BinRead, Clone, Copy)] 201 - #[br(little, magic = b"NFTR")] 202 - pub struct ResourceTexture { 203 - ver: u32, 204 - file_size: u32, 205 - max_size: [u32; 11], 206 - max_alignment: [u32; 11], 207 - pub hat: [TextureElement; 132], 208 - pub eye: [TextureElement; 62], 209 - pub eyebrow: [TextureElement; 24], 210 - pub beard: [TextureElement; 2], 211 - pub wrinkle: [TextureElement; 12], 212 - pub makeup: [TextureElement; 12], 213 - pub glass: [TextureElement; 20], 214 - pub mole: [TextureElement; 2], 215 - pub mouth: [TextureElement; 37], 216 - pub mustache: [TextureElement; 6], 217 - pub noseline: [TextureElement; 18], 218 - } 219 - 220 - #[cfg(test)] 221 - mod tests { 222 - use super::*; 223 - use std::{error::Error, fs::File, io::BufReader}; 224 - 225 - type R = Result<(), Box<dyn Error>>; 226 - 227 - #[test] 228 - fn read() -> R { 229 - let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 230 - 231 - let _ = ResourceTexture::read(&mut bin)?; 232 - 233 - Ok(()) 234 - } 235 - 236 - #[test] 237 - fn eye_tex() -> R { 238 - let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 239 - 240 - let res = ResourceTexture::read(&mut bin)?; 241 - 242 - let res = res.eye[0]; 243 - 244 - let tex = res.get_image(&mut BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?))?; 245 - 246 - if let Some(tex) = tex { 247 - tex.save("./tex.png")?; 248 - } 249 - Ok(()) 250 - } 251 - }
-65
vee/src/utils.rs
··· 1 - use flate2::read::ZlibDecoder; 2 - use std::{ 3 - error::Error, 4 - io::{self, Read, SeekFrom}, 5 - }; 6 - 7 - pub fn u16_to_f32(num: u16) -> f32 { 8 - half::f16::from_bits(num).to_f32() 9 - } 10 - 11 - /// Signed, normalized Vec3 + w component packed in a u32. 12 - /// [x: 10; y: 10; z: 10; w: 2] 13 - pub struct Vec3PackedSnorm(pub u32); 14 - 15 - impl Vec3PackedSnorm { 16 - /// The w component is discarded. 17 - #[allow(clippy::cast_precision_loss, clippy::cast_possible_wrap)] 18 - pub fn unpack(self) -> [f32; 3] { 19 - let packed = self.0; 20 - 21 - let nx = (packed << 22) as i32 >> 22; 22 - let ny = (packed << 12) as i32 >> 22; 23 - let nz = (packed << 2) as i32 >> 22; 24 - 25 - [nx as f32 / 511.0, ny as f32 / 511.0, nz as f32 / 511.0] 26 - } 27 - } 28 - 29 - /// Abstraction over anything that can be read as Seek or Read 30 - pub trait ReadSeek: std::io::Seek + std::io::Read {} 31 - impl<T: ?Sized> ReadSeek for T where T: std::io::Seek + std::io::Read {} 32 - 33 - pub(crate) fn read_byte_slice( 34 - file: &mut dyn ReadSeek, // Dynamic param: Anything that impl's Read + Seek 35 - start: u64, 36 - count: usize, 37 - ) -> Result<Vec<u8>, Box<dyn Error>> { 38 - file.seek(SeekFrom::Start(start))?; 39 - let mut buf = vec![0; count]; 40 - file.read_exact(&mut buf)?; 41 - 42 - Ok(buf) 43 - } 44 - 45 - pub(crate) fn inflate_bytes(bytes: &[u8]) -> io::Result<Vec<u8>> { 46 - let mut z = ZlibDecoder::new(bytes); 47 - // z.read_to_string(&mut s)?; 48 - let mut vec = Vec::new(); 49 - z.read_to_end(&mut vec)?; 50 - Ok(vec) 51 - } 52 - 53 - #[cfg(test)] 54 - mod tests { 55 - use super::Vec3PackedSnorm; 56 - 57 - #[test] 58 - fn vec3_packed_snorm_test() { 59 - for test in [0x567a_67ca, 0x567_a6436, 0x5675_9fca, 0x5675_9c36] { 60 - for x in Vec3PackedSnorm(test).unpack() { 61 - assert!(x.abs() <= 1.0, "Not normalised!"); 62 - } 63 - } 64 - } 65 - }
vee/tex.png

This is a binary file and will not be displayed.

+6450
vfl/Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "ab_glyph" 7 + version = "0.2.29" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" 10 + dependencies = [ 11 + "ab_glyph_rasterizer", 12 + "owned_ttf_parser", 13 + ] 14 + 15 + [[package]] 16 + name = "ab_glyph_rasterizer" 17 + version = "0.1.8" 18 + source = "registry+https://github.com/rust-lang/crates.io-index" 19 + checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 + 21 + [[package]] 22 + name = "accesskit" 23 + version = "0.18.0" 24 + source = "registry+https://github.com/rust-lang/crates.io-index" 25 + checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529" 26 + 27 + [[package]] 28 + name = "accesskit_consumer" 29 + version = "0.27.0" 30 + source = "registry+https://github.com/rust-lang/crates.io-index" 31 + checksum = "d0bf66a7bf0b7ea4fd7742d50b64782a88f99217cf246b3f93b4162528dde520" 32 + dependencies = [ 33 + "accesskit", 34 + "hashbrown", 35 + "immutable-chunkmap", 36 + ] 37 + 38 + [[package]] 39 + name = "accesskit_macos" 40 + version = "0.19.0" 41 + source = "registry+https://github.com/rust-lang/crates.io-index" 42 + checksum = "09e230718177753b4e4ad9e1d9f6cfc2f4921212d4c1c480b253f526babb258d" 43 + dependencies = [ 44 + "accesskit", 45 + "accesskit_consumer", 46 + "hashbrown", 47 + "objc2 0.5.2", 48 + "objc2-app-kit 0.2.2", 49 + "objc2-foundation 0.2.2", 50 + ] 51 + 52 + [[package]] 53 + name = "accesskit_windows" 54 + version = "0.25.0" 55 + source = "registry+https://github.com/rust-lang/crates.io-index" 56 + checksum = "65178f3df98a51e4238e584fcb255cb1a4f9111820848eeddd37663be40a625f" 57 + dependencies = [ 58 + "accesskit", 59 + "accesskit_consumer", 60 + "hashbrown", 61 + "paste", 62 + "static_assertions", 63 + "windows 0.58.0", 64 + "windows-core 0.58.0", 65 + ] 66 + 67 + [[package]] 68 + name = "accesskit_winit" 69 + version = "0.25.0" 70 + source = "registry+https://github.com/rust-lang/crates.io-index" 71 + checksum = "34d941bb8c414caba6e206de669c7dc0dbeb305640ea890772ee422a40e6b89f" 72 + dependencies = [ 73 + "accesskit", 74 + "accesskit_macos", 75 + "accesskit_windows", 76 + "raw-window-handle", 77 + "winit", 78 + ] 79 + 80 + [[package]] 81 + name = "adler2" 82 + version = "2.0.0" 83 + source = "registry+https://github.com/rust-lang/crates.io-index" 84 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 85 + 86 + [[package]] 87 + name = "ahash" 88 + version = "0.8.12" 89 + source = "registry+https://github.com/rust-lang/crates.io-index" 90 + checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 91 + dependencies = [ 92 + "cfg-if", 93 + "getrandom 0.3.3", 94 + "once_cell", 95 + "version_check", 96 + "zerocopy", 97 + ] 98 + 99 + [[package]] 100 + name = "aho-corasick" 101 + version = "1.1.3" 102 + source = "registry+https://github.com/rust-lang/crates.io-index" 103 + checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 104 + dependencies = [ 105 + "memchr", 106 + ] 107 + 108 + [[package]] 109 + name = "aligned-vec" 110 + version = "0.5.0" 111 + source = "registry+https://github.com/rust-lang/crates.io-index" 112 + checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" 113 + 114 + [[package]] 115 + name = "alsa" 116 + version = "0.9.1" 117 + source = "registry+https://github.com/rust-lang/crates.io-index" 118 + checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" 119 + dependencies = [ 120 + "alsa-sys", 121 + "bitflags 2.9.0", 122 + "cfg-if", 123 + "libc", 124 + ] 125 + 126 + [[package]] 127 + name = "alsa-sys" 128 + version = "0.3.1" 129 + source = "registry+https://github.com/rust-lang/crates.io-index" 130 + checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" 131 + dependencies = [ 132 + "libc", 133 + "pkg-config", 134 + ] 135 + 136 + [[package]] 137 + name = "android-activity" 138 + version = "0.6.0" 139 + source = "registry+https://github.com/rust-lang/crates.io-index" 140 + checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 141 + dependencies = [ 142 + "android-properties", 143 + "bitflags 2.9.0", 144 + "cc", 145 + "cesu8", 146 + "jni", 147 + "jni-sys", 148 + "libc", 149 + "log", 150 + "ndk 0.9.0", 151 + "ndk-context", 152 + "ndk-sys 0.6.0+11769913", 153 + "num_enum", 154 + "thiserror 1.0.69", 155 + ] 156 + 157 + [[package]] 158 + name = "android-properties" 159 + version = "0.2.2" 160 + source = "registry+https://github.com/rust-lang/crates.io-index" 161 + checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 162 + 163 + [[package]] 164 + name = "android_log-sys" 165 + version = "0.3.2" 166 + source = "registry+https://github.com/rust-lang/crates.io-index" 167 + checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" 168 + 169 + [[package]] 170 + name = "android_system_properties" 171 + version = "0.1.5" 172 + source = "registry+https://github.com/rust-lang/crates.io-index" 173 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 174 + dependencies = [ 175 + "libc", 176 + ] 177 + 178 + [[package]] 179 + name = "anyhow" 180 + version = "1.0.98" 181 + source = "registry+https://github.com/rust-lang/crates.io-index" 182 + checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 183 + 184 + [[package]] 185 + name = "approx" 186 + version = "0.5.1" 187 + source = "registry+https://github.com/rust-lang/crates.io-index" 188 + checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" 189 + dependencies = [ 190 + "num-traits", 191 + ] 192 + 193 + [[package]] 194 + name = "arbitrary" 195 + version = "1.4.1" 196 + source = "registry+https://github.com/rust-lang/crates.io-index" 197 + checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" 198 + 199 + [[package]] 200 + name = "arboard" 201 + version = "3.5.0" 202 + source = "registry+https://github.com/rust-lang/crates.io-index" 203 + checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" 204 + dependencies = [ 205 + "clipboard-win", 206 + "image 0.25.6", 207 + "log", 208 + "objc2 0.6.1", 209 + "objc2-app-kit 0.3.1", 210 + "objc2-core-foundation", 211 + "objc2-core-graphics", 212 + "objc2-foundation 0.3.1", 213 + "parking_lot", 214 + "percent-encoding", 215 + "windows-sys 0.59.0", 216 + "x11rb", 217 + ] 218 + 219 + [[package]] 220 + name = "arg_enum_proc_macro" 221 + version = "0.3.4" 222 + source = "registry+https://github.com/rust-lang/crates.io-index" 223 + checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" 224 + dependencies = [ 225 + "proc-macro2", 226 + "quote", 227 + "syn 2.0.101", 228 + ] 229 + 230 + [[package]] 231 + name = "array-init" 232 + version = "2.1.0" 233 + source = "registry+https://github.com/rust-lang/crates.io-index" 234 + checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" 235 + 236 + [[package]] 237 + name = "arrayref" 238 + version = "0.3.9" 239 + source = "registry+https://github.com/rust-lang/crates.io-index" 240 + checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 241 + 242 + [[package]] 243 + name = "arrayvec" 244 + version = "0.7.6" 245 + source = "registry+https://github.com/rust-lang/crates.io-index" 246 + checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 247 + 248 + [[package]] 249 + name = "as-raw-xcb-connection" 250 + version = "1.0.1" 251 + source = "registry+https://github.com/rust-lang/crates.io-index" 252 + checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 253 + 254 + [[package]] 255 + name = "ash" 256 + version = "0.38.0+1.3.281" 257 + source = "registry+https://github.com/rust-lang/crates.io-index" 258 + checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" 259 + dependencies = [ 260 + "libloading", 261 + ] 262 + 263 + [[package]] 264 + name = "assert_type_match" 265 + version = "0.1.1" 266 + source = "registry+https://github.com/rust-lang/crates.io-index" 267 + checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" 268 + dependencies = [ 269 + "proc-macro2", 270 + "quote", 271 + "syn 2.0.101", 272 + ] 273 + 274 + [[package]] 275 + name = "async-broadcast" 276 + version = "0.7.2" 277 + source = "registry+https://github.com/rust-lang/crates.io-index" 278 + checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 279 + dependencies = [ 280 + "event-listener", 281 + "event-listener-strategy", 282 + "futures-core", 283 + "pin-project-lite", 284 + ] 285 + 286 + [[package]] 287 + name = "async-channel" 288 + version = "2.3.1" 289 + source = "registry+https://github.com/rust-lang/crates.io-index" 290 + checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 291 + dependencies = [ 292 + "concurrent-queue", 293 + "event-listener-strategy", 294 + "futures-core", 295 + "pin-project-lite", 296 + ] 297 + 298 + [[package]] 299 + name = "async-executor" 300 + version = "1.13.2" 301 + source = "registry+https://github.com/rust-lang/crates.io-index" 302 + checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 303 + dependencies = [ 304 + "async-task", 305 + "concurrent-queue", 306 + "fastrand", 307 + "futures-lite", 308 + "pin-project-lite", 309 + "slab", 310 + ] 311 + 312 + [[package]] 313 + name = "async-fs" 314 + version = "2.1.2" 315 + source = "registry+https://github.com/rust-lang/crates.io-index" 316 + checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" 317 + dependencies = [ 318 + "async-lock", 319 + "blocking", 320 + "futures-lite", 321 + ] 322 + 323 + [[package]] 324 + name = "async-lock" 325 + version = "3.4.0" 326 + source = "registry+https://github.com/rust-lang/crates.io-index" 327 + checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 328 + dependencies = [ 329 + "event-listener", 330 + "event-listener-strategy", 331 + "pin-project-lite", 332 + ] 333 + 334 + [[package]] 335 + name = "async-task" 336 + version = "4.7.1" 337 + source = "registry+https://github.com/rust-lang/crates.io-index" 338 + checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 339 + dependencies = [ 340 + "portable-atomic", 341 + ] 342 + 343 + [[package]] 344 + name = "atomic-waker" 345 + version = "1.1.2" 346 + source = "registry+https://github.com/rust-lang/crates.io-index" 347 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 348 + dependencies = [ 349 + "portable-atomic", 350 + ] 351 + 352 + [[package]] 353 + name = "atomicow" 354 + version = "1.1.0" 355 + source = "registry+https://github.com/rust-lang/crates.io-index" 356 + checksum = "f52e8890bb9844440d0c412fa74b67fd2f14e85248b6e00708059b6da9e5f8bf" 357 + dependencies = [ 358 + "portable-atomic", 359 + "portable-atomic-util", 360 + ] 361 + 362 + [[package]] 363 + name = "autocfg" 364 + version = "1.4.0" 365 + source = "registry+https://github.com/rust-lang/crates.io-index" 366 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 367 + 368 + [[package]] 369 + name = "av1-grain" 370 + version = "0.2.3" 371 + source = "registry+https://github.com/rust-lang/crates.io-index" 372 + checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" 373 + dependencies = [ 374 + "anyhow", 375 + "arrayvec", 376 + "log", 377 + "nom", 378 + "num-rational", 379 + "v_frame", 380 + ] 381 + 382 + [[package]] 383 + name = "avif-serialize" 384 + version = "0.8.3" 385 + source = "registry+https://github.com/rust-lang/crates.io-index" 386 + checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" 387 + dependencies = [ 388 + "arrayvec", 389 + ] 390 + 391 + [[package]] 392 + name = "base64" 393 + version = "0.13.1" 394 + source = "registry+https://github.com/rust-lang/crates.io-index" 395 + checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" 396 + 397 + [[package]] 398 + name = "base64" 399 + version = "0.21.7" 400 + source = "registry+https://github.com/rust-lang/crates.io-index" 401 + checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 402 + 403 + [[package]] 404 + name = "base64" 405 + version = "0.22.1" 406 + source = "registry+https://github.com/rust-lang/crates.io-index" 407 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 408 + 409 + [[package]] 410 + name = "bevy" 411 + version = "0.16.0" 412 + source = "registry+https://github.com/rust-lang/crates.io-index" 413 + checksum = "2a5cd3b24a5adb7c7378da7b3eea47639877643d11b6b087fc8a8094f2528615" 414 + dependencies = [ 415 + "bevy_internal", 416 + ] 417 + 418 + [[package]] 419 + name = "bevy_a11y" 420 + version = "0.16.0" 421 + source = "registry+https://github.com/rust-lang/crates.io-index" 422 + checksum = "91ed969a58fbe449ef35ebec58ab19578302537f34ee8a35d04e5a038b3c40f5" 423 + dependencies = [ 424 + "accesskit", 425 + "bevy_app", 426 + "bevy_derive", 427 + "bevy_ecs", 428 + "bevy_reflect", 429 + ] 430 + 431 + [[package]] 432 + name = "bevy_animation" 433 + version = "0.16.0" 434 + source = "registry+https://github.com/rust-lang/crates.io-index" 435 + checksum = "3647b67c6bfd456922b2720ccef980dec01742d155d0eb454dc3d8fdc65e7aff" 436 + dependencies = [ 437 + "bevy_app", 438 + "bevy_asset", 439 + "bevy_color", 440 + "bevy_derive", 441 + "bevy_ecs", 442 + "bevy_log", 443 + "bevy_math", 444 + "bevy_mesh", 445 + "bevy_platform", 446 + "bevy_reflect", 447 + "bevy_render", 448 + "bevy_time", 449 + "bevy_transform", 450 + "bevy_utils", 451 + "blake3", 452 + "derive_more", 453 + "downcast-rs 2.0.1", 454 + "either", 455 + "petgraph", 456 + "ron", 457 + "serde", 458 + "smallvec", 459 + "thiserror 2.0.12", 460 + "thread_local", 461 + "tracing", 462 + "uuid", 463 + ] 464 + 465 + [[package]] 466 + name = "bevy_app" 467 + version = "0.16.0" 468 + source = "registry+https://github.com/rust-lang/crates.io-index" 469 + checksum = "a2b6267ac23a9947d5b2725ff047a1e1add70076d85fa9fb73d044ab9bea1f3c" 470 + dependencies = [ 471 + "bevy_derive", 472 + "bevy_ecs", 473 + "bevy_platform", 474 + "bevy_reflect", 475 + "bevy_tasks", 476 + "bevy_utils", 477 + "cfg-if", 478 + "console_error_panic_hook", 479 + "ctrlc", 480 + "downcast-rs 2.0.1", 481 + "log", 482 + "thiserror 2.0.12", 483 + "variadics_please", 484 + "wasm-bindgen", 485 + "web-sys", 486 + ] 487 + 488 + [[package]] 489 + name = "bevy_asset" 490 + version = "0.16.0" 491 + source = "registry+https://github.com/rust-lang/crates.io-index" 492 + checksum = "0698040d63199391ea77fd02e039630748e3e335c3070c6d932fd96cbf80f5d6" 493 + dependencies = [ 494 + "async-broadcast", 495 + "async-fs", 496 + "async-lock", 497 + "atomicow", 498 + "bevy_app", 499 + "bevy_asset_macros", 500 + "bevy_ecs", 501 + "bevy_platform", 502 + "bevy_reflect", 503 + "bevy_tasks", 504 + "bevy_utils", 505 + "bevy_window", 506 + "bitflags 2.9.0", 507 + "blake3", 508 + "crossbeam-channel", 509 + "derive_more", 510 + "disqualified", 511 + "downcast-rs 2.0.1", 512 + "either", 513 + "futures-io", 514 + "futures-lite", 515 + "js-sys", 516 + "parking_lot", 517 + "ron", 518 + "serde", 519 + "stackfuture", 520 + "thiserror 2.0.12", 521 + "tracing", 522 + "uuid", 523 + "wasm-bindgen", 524 + "wasm-bindgen-futures", 525 + "web-sys", 526 + ] 527 + 528 + [[package]] 529 + name = "bevy_asset_macros" 530 + version = "0.16.0" 531 + source = "registry+https://github.com/rust-lang/crates.io-index" 532 + checksum = "0bf8c00b5d532f8e5ac7b49af10602f9f7774a2d522cf0638323b5dfeee7b31c" 533 + dependencies = [ 534 + "bevy_macro_utils", 535 + "proc-macro2", 536 + "quote", 537 + "syn 2.0.101", 538 + ] 539 + 540 + [[package]] 541 + name = "bevy_audio" 542 + version = "0.16.0" 543 + source = "registry+https://github.com/rust-lang/crates.io-index" 544 + checksum = "74e54154e6369abdbaf5098e20424d59197c9b701d4f79fe8d0d2bde03d25f12" 545 + dependencies = [ 546 + "bevy_app", 547 + "bevy_asset", 548 + "bevy_derive", 549 + "bevy_ecs", 550 + "bevy_math", 551 + "bevy_reflect", 552 + "bevy_transform", 553 + "cpal", 554 + "rodio", 555 + "tracing", 556 + ] 557 + 558 + [[package]] 559 + name = "bevy_color" 560 + version = "0.16.1" 561 + source = "registry+https://github.com/rust-lang/crates.io-index" 562 + checksum = "ddf6a5ad35496bbc41713efbcf06ab72b9a310fabcab0f9db1debb56e8488c6e" 563 + dependencies = [ 564 + "bevy_math", 565 + "bevy_reflect", 566 + "bytemuck", 567 + "derive_more", 568 + "encase", 569 + "serde", 570 + "thiserror 2.0.12", 571 + "wgpu-types", 572 + ] 573 + 574 + [[package]] 575 + name = "bevy_core_pipeline" 576 + version = "0.16.0" 577 + source = "registry+https://github.com/rust-lang/crates.io-index" 578 + checksum = "55c2310717b9794e4a45513ee5946a7be0838852a4c1e185884195e1a8688ff3" 579 + dependencies = [ 580 + "bevy_app", 581 + "bevy_asset", 582 + "bevy_color", 583 + "bevy_derive", 584 + "bevy_diagnostic", 585 + "bevy_ecs", 586 + "bevy_image", 587 + "bevy_math", 588 + "bevy_platform", 589 + "bevy_reflect", 590 + "bevy_render", 591 + "bevy_transform", 592 + "bevy_utils", 593 + "bevy_window", 594 + "bitflags 2.9.0", 595 + "bytemuck", 596 + "nonmax", 597 + "radsort", 598 + "serde", 599 + "smallvec", 600 + "thiserror 2.0.12", 601 + "tracing", 602 + ] 603 + 604 + [[package]] 605 + name = "bevy_derive" 606 + version = "0.16.0" 607 + source = "registry+https://github.com/rust-lang/crates.io-index" 608 + checksum = "f626531b9c05c25a758ede228727bd11c2c2c8498ecbed9925044386d525a2a3" 609 + dependencies = [ 610 + "bevy_macro_utils", 611 + "quote", 612 + "syn 2.0.101", 613 + ] 614 + 615 + [[package]] 616 + name = "bevy_diagnostic" 617 + version = "0.16.0" 618 + source = "registry+https://github.com/rust-lang/crates.io-index" 619 + checksum = "048a1ff3944a534b8472516866284181eef0a75b6dd4d39b6e5925715e350766" 620 + dependencies = [ 621 + "bevy_app", 622 + "bevy_ecs", 623 + "bevy_platform", 624 + "bevy_tasks", 625 + "bevy_time", 626 + "bevy_utils", 627 + "const-fnv1a-hash", 628 + "log", 629 + "serde", 630 + "sysinfo", 631 + ] 632 + 633 + [[package]] 634 + name = "bevy_ecs" 635 + version = "0.16.0" 636 + source = "registry+https://github.com/rust-lang/crates.io-index" 637 + checksum = "d9e807b5d9aab3bb8dfe47e7a44c9ff088bad2ceefe299b80ac77609a87fe9d4" 638 + dependencies = [ 639 + "arrayvec", 640 + "bevy_ecs_macros", 641 + "bevy_platform", 642 + "bevy_ptr", 643 + "bevy_reflect", 644 + "bevy_tasks", 645 + "bevy_utils", 646 + "bitflags 2.9.0", 647 + "bumpalo", 648 + "concurrent-queue", 649 + "derive_more", 650 + "disqualified", 651 + "fixedbitset", 652 + "indexmap", 653 + "log", 654 + "nonmax", 655 + "serde", 656 + "smallvec", 657 + "thiserror 2.0.12", 658 + "variadics_please", 659 + ] 660 + 661 + [[package]] 662 + name = "bevy_ecs_macros" 663 + version = "0.16.0" 664 + source = "registry+https://github.com/rust-lang/crates.io-index" 665 + checksum = "467d7bb98aeb8dd30f36e6a773000c12a891d4f1bee2adc3841ec89cc8eaf54e" 666 + dependencies = [ 667 + "bevy_macro_utils", 668 + "proc-macro2", 669 + "quote", 670 + "syn 2.0.101", 671 + ] 672 + 673 + [[package]] 674 + name = "bevy_egui" 675 + version = "0.34.1" 676 + source = "registry+https://github.com/rust-lang/crates.io-index" 677 + checksum = "3a3d58a8afdb6100bca50251043a85320391742cae125d559f6cca3a16b84cdd" 678 + dependencies = [ 679 + "arboard", 680 + "bevy_app", 681 + "bevy_asset", 682 + "bevy_derive", 683 + "bevy_ecs", 684 + "bevy_image", 685 + "bevy_input", 686 + "bevy_log", 687 + "bevy_math", 688 + "bevy_picking", 689 + "bevy_platform", 690 + "bevy_reflect", 691 + "bevy_render", 692 + "bevy_time", 693 + "bevy_window", 694 + "bevy_winit", 695 + "bytemuck", 696 + "crossbeam-channel", 697 + "egui", 698 + "encase", 699 + "image 0.25.6", 700 + "js-sys", 701 + "thread_local", 702 + "wasm-bindgen", 703 + "wasm-bindgen-futures", 704 + "web-sys", 705 + "webbrowser", 706 + "wgpu-types", 707 + "winit", 708 + ] 709 + 710 + [[package]] 711 + name = "bevy_encase_derive" 712 + version = "0.16.0" 713 + source = "registry+https://github.com/rust-lang/crates.io-index" 714 + checksum = "b8bb31dc1090c6f8fabbf6b21994d19a12766e786885ee48ffc547f0f1fa7863" 715 + dependencies = [ 716 + "bevy_macro_utils", 717 + "encase_derive_impl", 718 + ] 719 + 720 + [[package]] 721 + name = "bevy_gilrs" 722 + version = "0.16.0" 723 + source = "registry+https://github.com/rust-lang/crates.io-index" 724 + checksum = "950c84596dbff8a9691a050c37bb610ef9398af56369c2c2dd6dc41ef7b717a5" 725 + dependencies = [ 726 + "bevy_app", 727 + "bevy_ecs", 728 + "bevy_input", 729 + "bevy_platform", 730 + "bevy_time", 731 + "bevy_utils", 732 + "gilrs", 733 + "thiserror 2.0.12", 734 + "tracing", 735 + ] 736 + 737 + [[package]] 738 + name = "bevy_gizmos" 739 + version = "0.16.0" 740 + source = "registry+https://github.com/rust-lang/crates.io-index" 741 + checksum = "54af8145b35ab2a830a6dd1058e23c1e1ddc4b893db79d295259ef82f51c7520" 742 + dependencies = [ 743 + "bevy_app", 744 + "bevy_asset", 745 + "bevy_color", 746 + "bevy_core_pipeline", 747 + "bevy_ecs", 748 + "bevy_gizmos_macros", 749 + "bevy_image", 750 + "bevy_math", 751 + "bevy_pbr", 752 + "bevy_reflect", 753 + "bevy_render", 754 + "bevy_sprite", 755 + "bevy_time", 756 + "bevy_transform", 757 + "bevy_utils", 758 + "bytemuck", 759 + "tracing", 760 + ] 761 + 762 + [[package]] 763 + name = "bevy_gizmos_macros" 764 + version = "0.16.0" 765 + source = "registry+https://github.com/rust-lang/crates.io-index" 766 + checksum = "40137ace61f092b7a09eba41d7d1e6aef941f53a7818b06ef86dcce7b6a1fd3f" 767 + dependencies = [ 768 + "bevy_macro_utils", 769 + "proc-macro2", 770 + "quote", 771 + "syn 2.0.101", 772 + ] 773 + 774 + [[package]] 775 + name = "bevy_gltf" 776 + version = "0.16.0" 777 + source = "registry+https://github.com/rust-lang/crates.io-index" 778 + checksum = "aa25b809ee024ef2682bafc1ca22ca8275552edb549dc6f69a030fdffd976c63" 779 + dependencies = [ 780 + "base64 0.22.1", 781 + "bevy_animation", 782 + "bevy_app", 783 + "bevy_asset", 784 + "bevy_color", 785 + "bevy_core_pipeline", 786 + "bevy_ecs", 787 + "bevy_image", 788 + "bevy_math", 789 + "bevy_mesh", 790 + "bevy_pbr", 791 + "bevy_platform", 792 + "bevy_reflect", 793 + "bevy_render", 794 + "bevy_scene", 795 + "bevy_tasks", 796 + "bevy_transform", 797 + "bevy_utils", 798 + "fixedbitset", 799 + "gltf", 800 + "itertools 0.14.0", 801 + "percent-encoding", 802 + "serde", 803 + "serde_json", 804 + "smallvec", 805 + "thiserror 2.0.12", 806 + "tracing", 807 + ] 808 + 809 + [[package]] 810 + name = "bevy_image" 811 + version = "0.16.0" 812 + source = "registry+https://github.com/rust-lang/crates.io-index" 813 + checksum = "840b25f7f58894c641739f756959028a04f519c448db7e2cd3e2e29fc5fd188d" 814 + dependencies = [ 815 + "bevy_app", 816 + "bevy_asset", 817 + "bevy_color", 818 + "bevy_math", 819 + "bevy_platform", 820 + "bevy_reflect", 821 + "bevy_utils", 822 + "bitflags 2.9.0", 823 + "bytemuck", 824 + "futures-lite", 825 + "guillotiere", 826 + "half", 827 + "image 0.25.6", 828 + "ktx2", 829 + "rectangle-pack", 830 + "ruzstd", 831 + "serde", 832 + "thiserror 2.0.12", 833 + "tracing", 834 + "wgpu-types", 835 + ] 836 + 837 + [[package]] 838 + name = "bevy_input" 839 + version = "0.16.0" 840 + source = "registry+https://github.com/rust-lang/crates.io-index" 841 + checksum = "763410715714f3d4d2dcdf077af276e2e4ea93fd8081b183d446d060ea95baaa" 842 + dependencies = [ 843 + "bevy_app", 844 + "bevy_ecs", 845 + "bevy_math", 846 + "bevy_platform", 847 + "bevy_reflect", 848 + "bevy_utils", 849 + "derive_more", 850 + "log", 851 + "smol_str", 852 + "thiserror 2.0.12", 853 + ] 854 + 855 + [[package]] 856 + name = "bevy_input_focus" 857 + version = "0.16.0" 858 + source = "registry+https://github.com/rust-lang/crates.io-index" 859 + checksum = "d7e7b4ed65e10927a39a987cf85ef98727dd319aafb6e6835f2cb05b883c6d66" 860 + dependencies = [ 861 + "bevy_app", 862 + "bevy_ecs", 863 + "bevy_input", 864 + "bevy_math", 865 + "bevy_reflect", 866 + "bevy_window", 867 + "log", 868 + "thiserror 2.0.12", 869 + ] 870 + 871 + [[package]] 872 + name = "bevy_internal" 873 + version = "0.16.0" 874 + source = "registry+https://github.com/rust-lang/crates.io-index" 875 + checksum = "526ffd64c58004cb97308826e896c07d0e23dc056c243b97492e31cdf72e2830" 876 + dependencies = [ 877 + "bevy_a11y", 878 + "bevy_animation", 879 + "bevy_app", 880 + "bevy_asset", 881 + "bevy_audio", 882 + "bevy_color", 883 + "bevy_core_pipeline", 884 + "bevy_derive", 885 + "bevy_diagnostic", 886 + "bevy_ecs", 887 + "bevy_gilrs", 888 + "bevy_gizmos", 889 + "bevy_gltf", 890 + "bevy_image", 891 + "bevy_input", 892 + "bevy_input_focus", 893 + "bevy_log", 894 + "bevy_math", 895 + "bevy_pbr", 896 + "bevy_picking", 897 + "bevy_platform", 898 + "bevy_ptr", 899 + "bevy_reflect", 900 + "bevy_render", 901 + "bevy_scene", 902 + "bevy_sprite", 903 + "bevy_state", 904 + "bevy_tasks", 905 + "bevy_text", 906 + "bevy_time", 907 + "bevy_transform", 908 + "bevy_ui", 909 + "bevy_utils", 910 + "bevy_window", 911 + "bevy_winit", 912 + ] 913 + 914 + [[package]] 915 + name = "bevy_log" 916 + version = "0.16.0" 917 + source = "registry+https://github.com/rust-lang/crates.io-index" 918 + checksum = "7156df8d2f11135cf71c03eb4c11132b65201fd4f51648571e59e39c9c9ee2f6" 919 + dependencies = [ 920 + "android_log-sys", 921 + "bevy_app", 922 + "bevy_ecs", 923 + "bevy_utils", 924 + "tracing", 925 + "tracing-log", 926 + "tracing-oslog", 927 + "tracing-subscriber", 928 + "tracing-wasm", 929 + ] 930 + 931 + [[package]] 932 + name = "bevy_macro_utils" 933 + version = "0.16.0" 934 + source = "registry+https://github.com/rust-lang/crates.io-index" 935 + checksum = "7a2473db70d8785b5c75d6dd951a2e51e9be2c2311122db9692c79c9d887517b" 936 + dependencies = [ 937 + "parking_lot", 938 + "proc-macro2", 939 + "quote", 940 + "syn 2.0.101", 941 + "toml_edit", 942 + ] 943 + 944 + [[package]] 945 + name = "bevy_math" 946 + version = "0.16.0" 947 + source = "registry+https://github.com/rust-lang/crates.io-index" 948 + checksum = "f1a3a926d02dc501c6156a047510bdb538dcb1fa744eeba13c824b73ba88de55" 949 + dependencies = [ 950 + "approx", 951 + "bevy_reflect", 952 + "derive_more", 953 + "glam 0.29.3", 954 + "itertools 0.14.0", 955 + "libm", 956 + "rand", 957 + "rand_distr", 958 + "serde", 959 + "smallvec", 960 + "thiserror 2.0.12", 961 + "variadics_please", 962 + ] 963 + 964 + [[package]] 965 + name = "bevy_mesh" 966 + version = "0.16.0" 967 + source = "registry+https://github.com/rust-lang/crates.io-index" 968 + checksum = "12af58280c7453e32e2f083d86eaa4c9b9d03ea8683977108ded8f1930c539f2" 969 + dependencies = [ 970 + "bevy_asset", 971 + "bevy_derive", 972 + "bevy_ecs", 973 + "bevy_image", 974 + "bevy_math", 975 + "bevy_mikktspace", 976 + "bevy_platform", 977 + "bevy_reflect", 978 + "bevy_transform", 979 + "bevy_utils", 980 + "bitflags 2.9.0", 981 + "bytemuck", 982 + "hexasphere", 983 + "serde", 984 + "thiserror 2.0.12", 985 + "tracing", 986 + "wgpu-types", 987 + ] 988 + 989 + [[package]] 990 + name = "bevy_mikktspace" 991 + version = "0.16.0" 992 + source = "registry+https://github.com/rust-lang/crates.io-index" 993 + checksum = "75e0258423c689f764556e36b5d9eebdbf624b29a1fd5b33cd9f6c42dcc4d5f3" 994 + dependencies = [ 995 + "glam 0.29.3", 996 + ] 997 + 998 + [[package]] 999 + name = "bevy_pbr" 1000 + version = "0.16.0" 1001 + source = "registry+https://github.com/rust-lang/crates.io-index" 1002 + checksum = "d9fe0de43b68bf9e5090a33efc963f125e9d3f9d97be9ebece7bcfdde1b6da80" 1003 + dependencies = [ 1004 + "bevy_app", 1005 + "bevy_asset", 1006 + "bevy_color", 1007 + "bevy_core_pipeline", 1008 + "bevy_derive", 1009 + "bevy_diagnostic", 1010 + "bevy_ecs", 1011 + "bevy_image", 1012 + "bevy_math", 1013 + "bevy_platform", 1014 + "bevy_reflect", 1015 + "bevy_render", 1016 + "bevy_transform", 1017 + "bevy_utils", 1018 + "bevy_window", 1019 + "bitflags 2.9.0", 1020 + "bytemuck", 1021 + "derive_more", 1022 + "fixedbitset", 1023 + "nonmax", 1024 + "offset-allocator", 1025 + "radsort", 1026 + "smallvec", 1027 + "static_assertions", 1028 + "thiserror 2.0.12", 1029 + "tracing", 1030 + ] 1031 + 1032 + [[package]] 1033 + name = "bevy_picking" 1034 + version = "0.16.0" 1035 + source = "registry+https://github.com/rust-lang/crates.io-index" 1036 + checksum = "f73674f62b1033006bd75c89033f5d3516386cfd7d43bb9f7665012c0ab14d22" 1037 + dependencies = [ 1038 + "bevy_app", 1039 + "bevy_asset", 1040 + "bevy_derive", 1041 + "bevy_ecs", 1042 + "bevy_input", 1043 + "bevy_math", 1044 + "bevy_mesh", 1045 + "bevy_platform", 1046 + "bevy_reflect", 1047 + "bevy_render", 1048 + "bevy_time", 1049 + "bevy_transform", 1050 + "bevy_utils", 1051 + "bevy_window", 1052 + "crossbeam-channel", 1053 + "tracing", 1054 + "uuid", 1055 + ] 1056 + 1057 + [[package]] 1058 + name = "bevy_platform" 1059 + version = "0.16.0" 1060 + source = "registry+https://github.com/rust-lang/crates.io-index" 1061 + checksum = "704db2c11b7bc31093df4fbbdd3769f9606a6a5287149f4b51f2680f25834ebc" 1062 + dependencies = [ 1063 + "cfg-if", 1064 + "critical-section", 1065 + "foldhash", 1066 + "getrandom 0.2.16", 1067 + "hashbrown", 1068 + "portable-atomic", 1069 + "portable-atomic-util", 1070 + "serde", 1071 + "spin", 1072 + "web-time", 1073 + ] 1074 + 1075 + [[package]] 1076 + name = "bevy_ptr" 1077 + version = "0.16.0" 1078 + source = "registry+https://github.com/rust-lang/crates.io-index" 1079 + checksum = "86f1275dfb4cfef4ffc90c3fa75408964864facf833acc932413d52aa5364ba4" 1080 + 1081 + [[package]] 1082 + name = "bevy_reflect" 1083 + version = "0.16.0" 1084 + source = "registry+https://github.com/rust-lang/crates.io-index" 1085 + checksum = "607ebacc31029cf2f39ac330eabf1d4bc411b159528ec08dbe6b0593eaccfd41" 1086 + dependencies = [ 1087 + "assert_type_match", 1088 + "bevy_platform", 1089 + "bevy_ptr", 1090 + "bevy_reflect_derive", 1091 + "bevy_utils", 1092 + "derive_more", 1093 + "disqualified", 1094 + "downcast-rs 2.0.1", 1095 + "erased-serde", 1096 + "foldhash", 1097 + "glam 0.29.3", 1098 + "petgraph", 1099 + "serde", 1100 + "smallvec", 1101 + "smol_str", 1102 + "thiserror 2.0.12", 1103 + "uuid", 1104 + "variadics_please", 1105 + "wgpu-types", 1106 + ] 1107 + 1108 + [[package]] 1109 + name = "bevy_reflect_derive" 1110 + version = "0.16.0" 1111 + source = "registry+https://github.com/rust-lang/crates.io-index" 1112 + checksum = "cf35e45e4eb239018369f63f2adc2107a54c329f9276d020e01eee1625b0238b" 1113 + dependencies = [ 1114 + "bevy_macro_utils", 1115 + "proc-macro2", 1116 + "quote", 1117 + "syn 2.0.101", 1118 + "uuid", 1119 + ] 1120 + 1121 + [[package]] 1122 + name = "bevy_render" 1123 + version = "0.16.0" 1124 + source = "registry+https://github.com/rust-lang/crates.io-index" 1125 + checksum = "85a7306235b3343b032801504f3e884b93abfb7ba58179fc555c479df509f349" 1126 + dependencies = [ 1127 + "async-channel", 1128 + "bevy_app", 1129 + "bevy_asset", 1130 + "bevy_color", 1131 + "bevy_derive", 1132 + "bevy_diagnostic", 1133 + "bevy_ecs", 1134 + "bevy_encase_derive", 1135 + "bevy_image", 1136 + "bevy_math", 1137 + "bevy_mesh", 1138 + "bevy_platform", 1139 + "bevy_reflect", 1140 + "bevy_render_macros", 1141 + "bevy_tasks", 1142 + "bevy_time", 1143 + "bevy_transform", 1144 + "bevy_utils", 1145 + "bevy_window", 1146 + "bitflags 2.9.0", 1147 + "bytemuck", 1148 + "codespan-reporting", 1149 + "derive_more", 1150 + "downcast-rs 2.0.1", 1151 + "encase", 1152 + "fixedbitset", 1153 + "futures-lite", 1154 + "image 0.25.6", 1155 + "indexmap", 1156 + "js-sys", 1157 + "ktx2", 1158 + "naga", 1159 + "naga_oil", 1160 + "nonmax", 1161 + "offset-allocator", 1162 + "send_wrapper", 1163 + "serde", 1164 + "smallvec", 1165 + "thiserror 2.0.12", 1166 + "tracing", 1167 + "variadics_please", 1168 + "wasm-bindgen", 1169 + "web-sys", 1170 + "wgpu", 1171 + ] 1172 + 1173 + [[package]] 1174 + name = "bevy_render_macros" 1175 + version = "0.16.0" 1176 + source = "registry+https://github.com/rust-lang/crates.io-index" 1177 + checksum = "b85c4fb26b66d3a257b655485d11b9b6df9d3c85026493ba8092767a5edfc1b2" 1178 + dependencies = [ 1179 + "bevy_macro_utils", 1180 + "proc-macro2", 1181 + "quote", 1182 + "syn 2.0.101", 1183 + ] 1184 + 1185 + [[package]] 1186 + name = "bevy_scene" 1187 + version = "0.16.0" 1188 + source = "registry+https://github.com/rust-lang/crates.io-index" 1189 + checksum = "e7b628f560f2d2fe9f35ecd4526627ba3992f082de03fd745536e4053a0266fe" 1190 + dependencies = [ 1191 + "bevy_app", 1192 + "bevy_asset", 1193 + "bevy_derive", 1194 + "bevy_ecs", 1195 + "bevy_platform", 1196 + "bevy_reflect", 1197 + "bevy_render", 1198 + "bevy_transform", 1199 + "bevy_utils", 1200 + "derive_more", 1201 + "serde", 1202 + "thiserror 2.0.12", 1203 + "uuid", 1204 + ] 1205 + 1206 + [[package]] 1207 + name = "bevy_sprite" 1208 + version = "0.16.0" 1209 + source = "registry+https://github.com/rust-lang/crates.io-index" 1210 + checksum = "01f97bf54fb1c37a1077139b59bb32bc77f7ca53149cfcaa512adbb69a2d492c" 1211 + dependencies = [ 1212 + "bevy_app", 1213 + "bevy_asset", 1214 + "bevy_color", 1215 + "bevy_core_pipeline", 1216 + "bevy_derive", 1217 + "bevy_ecs", 1218 + "bevy_image", 1219 + "bevy_math", 1220 + "bevy_picking", 1221 + "bevy_platform", 1222 + "bevy_reflect", 1223 + "bevy_render", 1224 + "bevy_transform", 1225 + "bevy_utils", 1226 + "bevy_window", 1227 + "bitflags 2.9.0", 1228 + "bytemuck", 1229 + "derive_more", 1230 + "fixedbitset", 1231 + "nonmax", 1232 + "radsort", 1233 + "tracing", 1234 + ] 1235 + 1236 + [[package]] 1237 + name = "bevy_state" 1238 + version = "0.16.0" 1239 + source = "registry+https://github.com/rust-lang/crates.io-index" 1240 + checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" 1241 + dependencies = [ 1242 + "bevy_app", 1243 + "bevy_ecs", 1244 + "bevy_platform", 1245 + "bevy_reflect", 1246 + "bevy_state_macros", 1247 + "bevy_utils", 1248 + "log", 1249 + "variadics_please", 1250 + ] 1251 + 1252 + [[package]] 1253 + name = "bevy_state_macros" 1254 + version = "0.16.0" 1255 + source = "registry+https://github.com/rust-lang/crates.io-index" 1256 + checksum = "55b4bf3970c4f0e60572901df4641656722172c222d71a80c430d36b0e31426c" 1257 + dependencies = [ 1258 + "bevy_macro_utils", 1259 + "proc-macro2", 1260 + "quote", 1261 + "syn 2.0.101", 1262 + ] 1263 + 1264 + [[package]] 1265 + name = "bevy_tasks" 1266 + version = "0.16.0" 1267 + source = "registry+https://github.com/rust-lang/crates.io-index" 1268 + checksum = "444c450b65e108855f42ecb6db0c041a56ea7d7f10cc6222f0ca95e9536a7d19" 1269 + dependencies = [ 1270 + "async-channel", 1271 + "async-executor", 1272 + "async-task", 1273 + "atomic-waker", 1274 + "bevy_platform", 1275 + "cfg-if", 1276 + "concurrent-queue", 1277 + "crossbeam-queue", 1278 + "derive_more", 1279 + "futures-channel", 1280 + "futures-lite", 1281 + "heapless", 1282 + "pin-project", 1283 + "wasm-bindgen-futures", 1284 + ] 1285 + 1286 + [[package]] 1287 + name = "bevy_text" 1288 + version = "0.16.0" 1289 + source = "registry+https://github.com/rust-lang/crates.io-index" 1290 + checksum = "8ef071262c5a9afbc39caba4c0b282c7d045fbb5cf33bdab1924bd2343403833" 1291 + dependencies = [ 1292 + "bevy_app", 1293 + "bevy_asset", 1294 + "bevy_color", 1295 + "bevy_derive", 1296 + "bevy_ecs", 1297 + "bevy_image", 1298 + "bevy_log", 1299 + "bevy_math", 1300 + "bevy_platform", 1301 + "bevy_reflect", 1302 + "bevy_render", 1303 + "bevy_sprite", 1304 + "bevy_transform", 1305 + "bevy_utils", 1306 + "bevy_window", 1307 + "cosmic-text", 1308 + "serde", 1309 + "smallvec", 1310 + "sys-locale", 1311 + "thiserror 2.0.12", 1312 + "tracing", 1313 + "unicode-bidi", 1314 + ] 1315 + 1316 + [[package]] 1317 + name = "bevy_time" 1318 + version = "0.16.0" 1319 + source = "registry+https://github.com/rust-lang/crates.io-index" 1320 + checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" 1321 + dependencies = [ 1322 + "bevy_app", 1323 + "bevy_ecs", 1324 + "bevy_platform", 1325 + "bevy_reflect", 1326 + "crossbeam-channel", 1327 + "log", 1328 + "serde", 1329 + ] 1330 + 1331 + [[package]] 1332 + name = "bevy_transform" 1333 + version = "0.16.0" 1334 + source = "registry+https://github.com/rust-lang/crates.io-index" 1335 + checksum = "8479cdd5461246943956a7c8347e4e5d6ff857e57add889fb50eee0b5c26ab48" 1336 + dependencies = [ 1337 + "bevy_app", 1338 + "bevy_ecs", 1339 + "bevy_log", 1340 + "bevy_math", 1341 + "bevy_reflect", 1342 + "bevy_tasks", 1343 + "bevy_utils", 1344 + "derive_more", 1345 + "serde", 1346 + "thiserror 2.0.12", 1347 + ] 1348 + 1349 + [[package]] 1350 + name = "bevy_ui" 1351 + version = "0.16.0" 1352 + source = "registry+https://github.com/rust-lang/crates.io-index" 1353 + checksum = "110dc5d0059f112263512be8cd7bfe0466dfb7c26b9bf4c74529355249fd23f9" 1354 + dependencies = [ 1355 + "accesskit", 1356 + "bevy_a11y", 1357 + "bevy_app", 1358 + "bevy_asset", 1359 + "bevy_color", 1360 + "bevy_core_pipeline", 1361 + "bevy_derive", 1362 + "bevy_ecs", 1363 + "bevy_image", 1364 + "bevy_input", 1365 + "bevy_math", 1366 + "bevy_picking", 1367 + "bevy_platform", 1368 + "bevy_reflect", 1369 + "bevy_render", 1370 + "bevy_sprite", 1371 + "bevy_text", 1372 + "bevy_transform", 1373 + "bevy_utils", 1374 + "bevy_window", 1375 + "bytemuck", 1376 + "derive_more", 1377 + "nonmax", 1378 + "smallvec", 1379 + "taffy", 1380 + "thiserror 2.0.12", 1381 + "tracing", 1382 + ] 1383 + 1384 + [[package]] 1385 + name = "bevy_utils" 1386 + version = "0.16.0" 1387 + source = "registry+https://github.com/rust-lang/crates.io-index" 1388 + checksum = "ac2da3b3c1f94dadefcbe837aaa4aa119fcea37f7bdc5307eb05b4ede1921e24" 1389 + dependencies = [ 1390 + "bevy_platform", 1391 + "thread_local", 1392 + ] 1393 + 1394 + [[package]] 1395 + name = "bevy_window" 1396 + version = "0.16.0" 1397 + source = "registry+https://github.com/rust-lang/crates.io-index" 1398 + checksum = "0d83327cc5584da463d12b7a88ddb97f9e006828832287e1564531171fffdeb4" 1399 + dependencies = [ 1400 + "android-activity", 1401 + "bevy_app", 1402 + "bevy_ecs", 1403 + "bevy_input", 1404 + "bevy_math", 1405 + "bevy_platform", 1406 + "bevy_reflect", 1407 + "bevy_utils", 1408 + "log", 1409 + "raw-window-handle", 1410 + "serde", 1411 + "smol_str", 1412 + ] 1413 + 1414 + [[package]] 1415 + name = "bevy_winit" 1416 + version = "0.16.0" 1417 + source = "registry+https://github.com/rust-lang/crates.io-index" 1418 + checksum = "57b14928923ae4274f4b867dce3d0e7b2c8a31bebcb0f6e65a4261c3e0765064" 1419 + dependencies = [ 1420 + "accesskit", 1421 + "accesskit_winit", 1422 + "approx", 1423 + "bevy_a11y", 1424 + "bevy_app", 1425 + "bevy_asset", 1426 + "bevy_derive", 1427 + "bevy_ecs", 1428 + "bevy_image", 1429 + "bevy_input", 1430 + "bevy_input_focus", 1431 + "bevy_log", 1432 + "bevy_math", 1433 + "bevy_platform", 1434 + "bevy_reflect", 1435 + "bevy_tasks", 1436 + "bevy_utils", 1437 + "bevy_window", 1438 + "bytemuck", 1439 + "cfg-if", 1440 + "crossbeam-channel", 1441 + "raw-window-handle", 1442 + "tracing", 1443 + "wasm-bindgen", 1444 + "web-sys", 1445 + "wgpu-types", 1446 + "winit", 1447 + ] 1448 + 1449 + [[package]] 1450 + name = "bindgen" 1451 + version = "0.70.1" 1452 + source = "registry+https://github.com/rust-lang/crates.io-index" 1453 + checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" 1454 + dependencies = [ 1455 + "bitflags 2.9.0", 1456 + "cexpr", 1457 + "clang-sys", 1458 + "itertools 0.13.0", 1459 + "log", 1460 + "prettyplease", 1461 + "proc-macro2", 1462 + "quote", 1463 + "regex", 1464 + "rustc-hash", 1465 + "shlex", 1466 + "syn 2.0.101", 1467 + ] 1468 + 1469 + [[package]] 1470 + name = "binrw" 1471 + version = "0.15.0" 1472 + source = "registry+https://github.com/rust-lang/crates.io-index" 1473 + checksum = "81419ff39e6ed10a92a7f125290859776ced35d9a08a665ae40b23e7ca702f30" 1474 + dependencies = [ 1475 + "array-init", 1476 + "binrw_derive", 1477 + "bytemuck", 1478 + ] 1479 + 1480 + [[package]] 1481 + name = "binrw_derive" 1482 + version = "0.15.0" 1483 + source = "registry+https://github.com/rust-lang/crates.io-index" 1484 + checksum = "376404e55ec40d0d6f8b4b7df3f87b87954bd987f0cf9a7207ea3b6ea5c9add4" 1485 + dependencies = [ 1486 + "either", 1487 + "owo-colors", 1488 + "proc-macro2", 1489 + "quote", 1490 + "syn 2.0.101", 1491 + ] 1492 + 1493 + [[package]] 1494 + name = "bit-set" 1495 + version = "0.5.3" 1496 + source = "registry+https://github.com/rust-lang/crates.io-index" 1497 + checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" 1498 + dependencies = [ 1499 + "bit-vec 0.6.3", 1500 + ] 1501 + 1502 + [[package]] 1503 + name = "bit-set" 1504 + version = "0.8.0" 1505 + source = "registry+https://github.com/rust-lang/crates.io-index" 1506 + checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 1507 + dependencies = [ 1508 + "bit-vec 0.8.0", 1509 + ] 1510 + 1511 + [[package]] 1512 + name = "bit-vec" 1513 + version = "0.6.3" 1514 + source = "registry+https://github.com/rust-lang/crates.io-index" 1515 + checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" 1516 + 1517 + [[package]] 1518 + name = "bit-vec" 1519 + version = "0.8.0" 1520 + source = "registry+https://github.com/rust-lang/crates.io-index" 1521 + checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 1522 + 1523 + [[package]] 1524 + name = "bit_field" 1525 + version = "0.10.2" 1526 + source = "registry+https://github.com/rust-lang/crates.io-index" 1527 + checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" 1528 + 1529 + [[package]] 1530 + name = "bitflags" 1531 + version = "1.3.2" 1532 + source = "registry+https://github.com/rust-lang/crates.io-index" 1533 + checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 1534 + 1535 + [[package]] 1536 + name = "bitflags" 1537 + version = "2.9.0" 1538 + source = "registry+https://github.com/rust-lang/crates.io-index" 1539 + checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 1540 + dependencies = [ 1541 + "serde", 1542 + ] 1543 + 1544 + [[package]] 1545 + name = "bitstream-io" 1546 + version = "2.6.0" 1547 + source = "registry+https://github.com/rust-lang/crates.io-index" 1548 + checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" 1549 + 1550 + [[package]] 1551 + name = "blake3" 1552 + version = "1.8.2" 1553 + source = "registry+https://github.com/rust-lang/crates.io-index" 1554 + checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" 1555 + dependencies = [ 1556 + "arrayref", 1557 + "arrayvec", 1558 + "cc", 1559 + "cfg-if", 1560 + "constant_time_eq", 1561 + ] 1562 + 1563 + [[package]] 1564 + name = "block" 1565 + version = "0.1.6" 1566 + source = "registry+https://github.com/rust-lang/crates.io-index" 1567 + checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 1568 + 1569 + [[package]] 1570 + name = "block2" 1571 + version = "0.5.1" 1572 + source = "registry+https://github.com/rust-lang/crates.io-index" 1573 + checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 1574 + dependencies = [ 1575 + "objc2 0.5.2", 1576 + ] 1577 + 1578 + [[package]] 1579 + name = "blocking" 1580 + version = "1.6.1" 1581 + source = "registry+https://github.com/rust-lang/crates.io-index" 1582 + checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 1583 + dependencies = [ 1584 + "async-channel", 1585 + "async-task", 1586 + "futures-io", 1587 + "futures-lite", 1588 + "piper", 1589 + ] 1590 + 1591 + [[package]] 1592 + name = "built" 1593 + version = "0.7.7" 1594 + source = "registry+https://github.com/rust-lang/crates.io-index" 1595 + checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" 1596 + 1597 + [[package]] 1598 + name = "bumpalo" 1599 + version = "3.17.0" 1600 + source = "registry+https://github.com/rust-lang/crates.io-index" 1601 + checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 1602 + 1603 + [[package]] 1604 + name = "bytemuck" 1605 + version = "1.23.0" 1606 + source = "registry+https://github.com/rust-lang/crates.io-index" 1607 + checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" 1608 + dependencies = [ 1609 + "bytemuck_derive", 1610 + ] 1611 + 1612 + [[package]] 1613 + name = "bytemuck_derive" 1614 + version = "1.9.3" 1615 + source = "registry+https://github.com/rust-lang/crates.io-index" 1616 + checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" 1617 + dependencies = [ 1618 + "proc-macro2", 1619 + "quote", 1620 + "syn 2.0.101", 1621 + ] 1622 + 1623 + [[package]] 1624 + name = "byteorder" 1625 + version = "1.5.0" 1626 + source = "registry+https://github.com/rust-lang/crates.io-index" 1627 + checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 1628 + 1629 + [[package]] 1630 + name = "byteorder-lite" 1631 + version = "0.1.0" 1632 + source = "registry+https://github.com/rust-lang/crates.io-index" 1633 + checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 1634 + 1635 + [[package]] 1636 + name = "bytes" 1637 + version = "1.10.1" 1638 + source = "registry+https://github.com/rust-lang/crates.io-index" 1639 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 1640 + 1641 + [[package]] 1642 + name = "calloop" 1643 + version = "0.13.0" 1644 + source = "registry+https://github.com/rust-lang/crates.io-index" 1645 + checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" 1646 + dependencies = [ 1647 + "bitflags 2.9.0", 1648 + "log", 1649 + "polling", 1650 + "rustix", 1651 + "slab", 1652 + "thiserror 1.0.69", 1653 + ] 1654 + 1655 + [[package]] 1656 + name = "calloop-wayland-source" 1657 + version = "0.3.0" 1658 + source = "registry+https://github.com/rust-lang/crates.io-index" 1659 + checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" 1660 + dependencies = [ 1661 + "calloop", 1662 + "rustix", 1663 + "wayland-backend", 1664 + "wayland-client", 1665 + ] 1666 + 1667 + [[package]] 1668 + name = "cc" 1669 + version = "1.2.22" 1670 + source = "registry+https://github.com/rust-lang/crates.io-index" 1671 + checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" 1672 + dependencies = [ 1673 + "jobserver", 1674 + "libc", 1675 + "shlex", 1676 + ] 1677 + 1678 + [[package]] 1679 + name = "cesu8" 1680 + version = "1.1.0" 1681 + source = "registry+https://github.com/rust-lang/crates.io-index" 1682 + checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 1683 + 1684 + [[package]] 1685 + name = "cexpr" 1686 + version = "0.6.0" 1687 + source = "registry+https://github.com/rust-lang/crates.io-index" 1688 + checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 1689 + dependencies = [ 1690 + "nom", 1691 + ] 1692 + 1693 + [[package]] 1694 + name = "cfg-expr" 1695 + version = "0.15.8" 1696 + source = "registry+https://github.com/rust-lang/crates.io-index" 1697 + checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 1698 + dependencies = [ 1699 + "smallvec", 1700 + "target-lexicon", 1701 + ] 1702 + 1703 + [[package]] 1704 + name = "cfg-if" 1705 + version = "1.0.0" 1706 + source = "registry+https://github.com/rust-lang/crates.io-index" 1707 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 1708 + 1709 + [[package]] 1710 + name = "cfg_aliases" 1711 + version = "0.2.1" 1712 + source = "registry+https://github.com/rust-lang/crates.io-index" 1713 + checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 1714 + 1715 + [[package]] 1716 + name = "clang-sys" 1717 + version = "1.8.1" 1718 + source = "registry+https://github.com/rust-lang/crates.io-index" 1719 + checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 1720 + dependencies = [ 1721 + "glob", 1722 + "libc", 1723 + "libloading", 1724 + ] 1725 + 1726 + [[package]] 1727 + name = "clipboard-win" 1728 + version = "5.4.0" 1729 + source = "registry+https://github.com/rust-lang/crates.io-index" 1730 + checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" 1731 + dependencies = [ 1732 + "error-code", 1733 + ] 1734 + 1735 + [[package]] 1736 + name = "codespan-reporting" 1737 + version = "0.11.1" 1738 + source = "registry+https://github.com/rust-lang/crates.io-index" 1739 + checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 1740 + dependencies = [ 1741 + "termcolor", 1742 + "unicode-width", 1743 + ] 1744 + 1745 + [[package]] 1746 + name = "color_quant" 1747 + version = "1.1.0" 1748 + source = "registry+https://github.com/rust-lang/crates.io-index" 1749 + checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 1750 + 1751 + [[package]] 1752 + name = "combine" 1753 + version = "4.6.7" 1754 + source = "registry+https://github.com/rust-lang/crates.io-index" 1755 + checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 1756 + dependencies = [ 1757 + "bytes", 1758 + "memchr", 1759 + ] 1760 + 1761 + [[package]] 1762 + name = "concurrent-queue" 1763 + version = "2.5.0" 1764 + source = "registry+https://github.com/rust-lang/crates.io-index" 1765 + checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 1766 + dependencies = [ 1767 + "crossbeam-utils", 1768 + "portable-atomic", 1769 + ] 1770 + 1771 + [[package]] 1772 + name = "console_error_panic_hook" 1773 + version = "0.1.7" 1774 + source = "registry+https://github.com/rust-lang/crates.io-index" 1775 + checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 1776 + dependencies = [ 1777 + "cfg-if", 1778 + "wasm-bindgen", 1779 + ] 1780 + 1781 + [[package]] 1782 + name = "const-fnv1a-hash" 1783 + version = "1.1.0" 1784 + source = "registry+https://github.com/rust-lang/crates.io-index" 1785 + checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" 1786 + 1787 + [[package]] 1788 + name = "const_panic" 1789 + version = "0.2.12" 1790 + source = "registry+https://github.com/rust-lang/crates.io-index" 1791 + checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" 1792 + 1793 + [[package]] 1794 + name = "const_soft_float" 1795 + version = "0.1.4" 1796 + source = "registry+https://github.com/rust-lang/crates.io-index" 1797 + checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" 1798 + 1799 + [[package]] 1800 + name = "constant_time_eq" 1801 + version = "0.3.1" 1802 + source = "registry+https://github.com/rust-lang/crates.io-index" 1803 + checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 1804 + 1805 + [[package]] 1806 + name = "constgebra" 1807 + version = "0.1.4" 1808 + source = "registry+https://github.com/rust-lang/crates.io-index" 1809 + checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" 1810 + dependencies = [ 1811 + "const_soft_float", 1812 + ] 1813 + 1814 + [[package]] 1815 + name = "core-foundation" 1816 + version = "0.9.4" 1817 + source = "registry+https://github.com/rust-lang/crates.io-index" 1818 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 1819 + dependencies = [ 1820 + "core-foundation-sys", 1821 + "libc", 1822 + ] 1823 + 1824 + [[package]] 1825 + name = "core-foundation" 1826 + version = "0.10.0" 1827 + source = "registry+https://github.com/rust-lang/crates.io-index" 1828 + checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 1829 + dependencies = [ 1830 + "core-foundation-sys", 1831 + "libc", 1832 + ] 1833 + 1834 + [[package]] 1835 + name = "core-foundation-sys" 1836 + version = "0.8.7" 1837 + source = "registry+https://github.com/rust-lang/crates.io-index" 1838 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 1839 + 1840 + [[package]] 1841 + name = "core-graphics" 1842 + version = "0.23.2" 1843 + source = "registry+https://github.com/rust-lang/crates.io-index" 1844 + checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 1845 + dependencies = [ 1846 + "bitflags 1.3.2", 1847 + "core-foundation 0.9.4", 1848 + "core-graphics-types", 1849 + "foreign-types", 1850 + "libc", 1851 + ] 1852 + 1853 + [[package]] 1854 + name = "core-graphics-types" 1855 + version = "0.1.3" 1856 + source = "registry+https://github.com/rust-lang/crates.io-index" 1857 + checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 1858 + dependencies = [ 1859 + "bitflags 1.3.2", 1860 + "core-foundation 0.9.4", 1861 + "libc", 1862 + ] 1863 + 1864 + [[package]] 1865 + name = "coreaudio-rs" 1866 + version = "0.11.3" 1867 + source = "registry+https://github.com/rust-lang/crates.io-index" 1868 + checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" 1869 + dependencies = [ 1870 + "bitflags 1.3.2", 1871 + "core-foundation-sys", 1872 + "coreaudio-sys", 1873 + ] 1874 + 1875 + [[package]] 1876 + name = "coreaudio-sys" 1877 + version = "0.2.16" 1878 + source = "registry+https://github.com/rust-lang/crates.io-index" 1879 + checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" 1880 + dependencies = [ 1881 + "bindgen", 1882 + ] 1883 + 1884 + [[package]] 1885 + name = "cosmic-text" 1886 + version = "0.13.2" 1887 + source = "registry+https://github.com/rust-lang/crates.io-index" 1888 + checksum = "e418dd4f5128c3e93eab12246391c54a20c496811131f85754dc8152ee207892" 1889 + dependencies = [ 1890 + "bitflags 2.9.0", 1891 + "fontdb", 1892 + "log", 1893 + "rangemap", 1894 + "rustc-hash", 1895 + "rustybuzz", 1896 + "self_cell", 1897 + "smol_str", 1898 + "swash", 1899 + "sys-locale", 1900 + "ttf-parser 0.21.1", 1901 + "unicode-bidi", 1902 + "unicode-linebreak", 1903 + "unicode-script", 1904 + "unicode-segmentation", 1905 + ] 1906 + 1907 + [[package]] 1908 + name = "cpal" 1909 + version = "0.15.3" 1910 + source = "registry+https://github.com/rust-lang/crates.io-index" 1911 + checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" 1912 + dependencies = [ 1913 + "alsa", 1914 + "core-foundation-sys", 1915 + "coreaudio-rs", 1916 + "dasp_sample", 1917 + "jni", 1918 + "js-sys", 1919 + "libc", 1920 + "mach2", 1921 + "ndk 0.8.0", 1922 + "ndk-context", 1923 + "oboe", 1924 + "wasm-bindgen", 1925 + "wasm-bindgen-futures", 1926 + "web-sys", 1927 + "windows 0.54.0", 1928 + ] 1929 + 1930 + [[package]] 1931 + name = "crc32fast" 1932 + version = "1.4.2" 1933 + source = "registry+https://github.com/rust-lang/crates.io-index" 1934 + checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 1935 + dependencies = [ 1936 + "cfg-if", 1937 + ] 1938 + 1939 + [[package]] 1940 + name = "critical-section" 1941 + version = "1.2.0" 1942 + source = "registry+https://github.com/rust-lang/crates.io-index" 1943 + checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" 1944 + 1945 + [[package]] 1946 + name = "crossbeam-channel" 1947 + version = "0.5.15" 1948 + source = "registry+https://github.com/rust-lang/crates.io-index" 1949 + checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" 1950 + dependencies = [ 1951 + "crossbeam-utils", 1952 + ] 1953 + 1954 + [[package]] 1955 + name = "crossbeam-deque" 1956 + version = "0.8.6" 1957 + source = "registry+https://github.com/rust-lang/crates.io-index" 1958 + checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 1959 + dependencies = [ 1960 + "crossbeam-epoch", 1961 + "crossbeam-utils", 1962 + ] 1963 + 1964 + [[package]] 1965 + name = "crossbeam-epoch" 1966 + version = "0.9.18" 1967 + source = "registry+https://github.com/rust-lang/crates.io-index" 1968 + checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 1969 + dependencies = [ 1970 + "crossbeam-utils", 1971 + ] 1972 + 1973 + [[package]] 1974 + name = "crossbeam-queue" 1975 + version = "0.3.12" 1976 + source = "registry+https://github.com/rust-lang/crates.io-index" 1977 + checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" 1978 + dependencies = [ 1979 + "crossbeam-utils", 1980 + ] 1981 + 1982 + [[package]] 1983 + name = "crossbeam-utils" 1984 + version = "0.8.21" 1985 + source = "registry+https://github.com/rust-lang/crates.io-index" 1986 + checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 1987 + 1988 + [[package]] 1989 + name = "crunchy" 1990 + version = "0.2.3" 1991 + source = "registry+https://github.com/rust-lang/crates.io-index" 1992 + checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" 1993 + 1994 + [[package]] 1995 + name = "ctrlc" 1996 + version = "3.4.6" 1997 + source = "registry+https://github.com/rust-lang/crates.io-index" 1998 + checksum = "697b5419f348fd5ae2478e8018cb016c00a5881c7f46c717de98ffd135a5651c" 1999 + dependencies = [ 2000 + "nix", 2001 + "windows-sys 0.59.0", 2002 + ] 2003 + 2004 + [[package]] 2005 + name = "cursor-icon" 2006 + version = "1.1.0" 2007 + source = "registry+https://github.com/rust-lang/crates.io-index" 2008 + checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" 2009 + 2010 + [[package]] 2011 + name = "dasp_sample" 2012 + version = "0.11.0" 2013 + source = "registry+https://github.com/rust-lang/crates.io-index" 2014 + checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" 2015 + 2016 + [[package]] 2017 + name = "data-encoding" 2018 + version = "2.9.0" 2019 + source = "registry+https://github.com/rust-lang/crates.io-index" 2020 + checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 2021 + 2022 + [[package]] 2023 + name = "derive_more" 2024 + version = "1.0.0" 2025 + source = "registry+https://github.com/rust-lang/crates.io-index" 2026 + checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" 2027 + dependencies = [ 2028 + "derive_more-impl", 2029 + ] 2030 + 2031 + [[package]] 2032 + name = "derive_more-impl" 2033 + version = "1.0.0" 2034 + source = "registry+https://github.com/rust-lang/crates.io-index" 2035 + checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" 2036 + dependencies = [ 2037 + "proc-macro2", 2038 + "quote", 2039 + "syn 2.0.101", 2040 + "unicode-xid", 2041 + ] 2042 + 2043 + [[package]] 2044 + name = "dispatch" 2045 + version = "0.2.0" 2046 + source = "registry+https://github.com/rust-lang/crates.io-index" 2047 + checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 2048 + 2049 + [[package]] 2050 + name = "dispatch2" 2051 + version = "0.3.0" 2052 + source = "registry+https://github.com/rust-lang/crates.io-index" 2053 + checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 2054 + dependencies = [ 2055 + "bitflags 2.9.0", 2056 + "objc2 0.6.1", 2057 + ] 2058 + 2059 + [[package]] 2060 + name = "displaydoc" 2061 + version = "0.2.5" 2062 + source = "registry+https://github.com/rust-lang/crates.io-index" 2063 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 2064 + dependencies = [ 2065 + "proc-macro2", 2066 + "quote", 2067 + "syn 2.0.101", 2068 + ] 2069 + 2070 + [[package]] 2071 + name = "disqualified" 2072 + version = "1.0.0" 2073 + source = "registry+https://github.com/rust-lang/crates.io-index" 2074 + checksum = "c9c272297e804878a2a4b707cfcfc6d2328b5bb936944613b4fdf2b9269afdfd" 2075 + 2076 + [[package]] 2077 + name = "dlib" 2078 + version = "0.5.2" 2079 + source = "registry+https://github.com/rust-lang/crates.io-index" 2080 + checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 2081 + dependencies = [ 2082 + "libloading", 2083 + ] 2084 + 2085 + [[package]] 2086 + name = "document-features" 2087 + version = "0.2.11" 2088 + source = "registry+https://github.com/rust-lang/crates.io-index" 2089 + checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" 2090 + dependencies = [ 2091 + "litrs", 2092 + ] 2093 + 2094 + [[package]] 2095 + name = "downcast-rs" 2096 + version = "1.2.1" 2097 + source = "registry+https://github.com/rust-lang/crates.io-index" 2098 + checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 2099 + 2100 + [[package]] 2101 + name = "downcast-rs" 2102 + version = "2.0.1" 2103 + source = "registry+https://github.com/rust-lang/crates.io-index" 2104 + checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" 2105 + 2106 + [[package]] 2107 + name = "dpi" 2108 + version = "0.1.2" 2109 + source = "registry+https://github.com/rust-lang/crates.io-index" 2110 + checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" 2111 + 2112 + [[package]] 2113 + name = "ecolor" 2114 + version = "0.31.1" 2115 + source = "registry+https://github.com/rust-lang/crates.io-index" 2116 + checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" 2117 + dependencies = [ 2118 + "bytemuck", 2119 + "emath", 2120 + ] 2121 + 2122 + [[package]] 2123 + name = "egui" 2124 + version = "0.31.1" 2125 + source = "registry+https://github.com/rust-lang/crates.io-index" 2126 + checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" 2127 + dependencies = [ 2128 + "ahash", 2129 + "bitflags 2.9.0", 2130 + "emath", 2131 + "epaint", 2132 + "nohash-hasher", 2133 + "profiling", 2134 + ] 2135 + 2136 + [[package]] 2137 + name = "either" 2138 + version = "1.15.0" 2139 + source = "registry+https://github.com/rust-lang/crates.io-index" 2140 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 2141 + 2142 + [[package]] 2143 + name = "emath" 2144 + version = "0.31.1" 2145 + source = "registry+https://github.com/rust-lang/crates.io-index" 2146 + checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" 2147 + dependencies = [ 2148 + "bytemuck", 2149 + ] 2150 + 2151 + [[package]] 2152 + name = "encase" 2153 + version = "0.10.0" 2154 + source = "registry+https://github.com/rust-lang/crates.io-index" 2155 + checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" 2156 + dependencies = [ 2157 + "const_panic", 2158 + "encase_derive", 2159 + "glam 0.29.3", 2160 + "thiserror 1.0.69", 2161 + ] 2162 + 2163 + [[package]] 2164 + name = "encase_derive" 2165 + version = "0.10.0" 2166 + source = "registry+https://github.com/rust-lang/crates.io-index" 2167 + checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85" 2168 + dependencies = [ 2169 + "encase_derive_impl", 2170 + ] 2171 + 2172 + [[package]] 2173 + name = "encase_derive_impl" 2174 + version = "0.10.0" 2175 + source = "registry+https://github.com/rust-lang/crates.io-index" 2176 + checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" 2177 + dependencies = [ 2178 + "proc-macro2", 2179 + "quote", 2180 + "syn 2.0.101", 2181 + ] 2182 + 2183 + [[package]] 2184 + name = "epaint" 2185 + version = "0.31.1" 2186 + source = "registry+https://github.com/rust-lang/crates.io-index" 2187 + checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" 2188 + dependencies = [ 2189 + "ab_glyph", 2190 + "ahash", 2191 + "bytemuck", 2192 + "ecolor", 2193 + "emath", 2194 + "epaint_default_fonts", 2195 + "nohash-hasher", 2196 + "parking_lot", 2197 + "profiling", 2198 + ] 2199 + 2200 + [[package]] 2201 + name = "epaint_default_fonts" 2202 + version = "0.31.1" 2203 + source = "registry+https://github.com/rust-lang/crates.io-index" 2204 + checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" 2205 + 2206 + [[package]] 2207 + name = "equivalent" 2208 + version = "1.0.2" 2209 + source = "registry+https://github.com/rust-lang/crates.io-index" 2210 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 2211 + 2212 + [[package]] 2213 + name = "erased-serde" 2214 + version = "0.4.6" 2215 + source = "registry+https://github.com/rust-lang/crates.io-index" 2216 + checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 2217 + dependencies = [ 2218 + "serde", 2219 + "typeid", 2220 + ] 2221 + 2222 + [[package]] 2223 + name = "errno" 2224 + version = "0.3.11" 2225 + source = "registry+https://github.com/rust-lang/crates.io-index" 2226 + checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 2227 + dependencies = [ 2228 + "libc", 2229 + "windows-sys 0.59.0", 2230 + ] 2231 + 2232 + [[package]] 2233 + name = "error-code" 2234 + version = "3.3.2" 2235 + source = "registry+https://github.com/rust-lang/crates.io-index" 2236 + checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 2237 + 2238 + [[package]] 2239 + name = "euclid" 2240 + version = "0.22.11" 2241 + source = "registry+https://github.com/rust-lang/crates.io-index" 2242 + checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" 2243 + dependencies = [ 2244 + "num-traits", 2245 + ] 2246 + 2247 + [[package]] 2248 + name = "event-listener" 2249 + version = "5.4.0" 2250 + source = "registry+https://github.com/rust-lang/crates.io-index" 2251 + checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 2252 + dependencies = [ 2253 + "concurrent-queue", 2254 + "parking", 2255 + "pin-project-lite", 2256 + ] 2257 + 2258 + [[package]] 2259 + name = "event-listener-strategy" 2260 + version = "0.5.4" 2261 + source = "registry+https://github.com/rust-lang/crates.io-index" 2262 + checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 2263 + dependencies = [ 2264 + "event-listener", 2265 + "pin-project-lite", 2266 + ] 2267 + 2268 + [[package]] 2269 + name = "exr" 2270 + version = "1.73.0" 2271 + source = "registry+https://github.com/rust-lang/crates.io-index" 2272 + checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" 2273 + dependencies = [ 2274 + "bit_field", 2275 + "half", 2276 + "lebe", 2277 + "miniz_oxide", 2278 + "rayon-core", 2279 + "smallvec", 2280 + "zune-inflate", 2281 + ] 2282 + 2283 + [[package]] 2284 + name = "fastrand" 2285 + version = "2.3.0" 2286 + source = "registry+https://github.com/rust-lang/crates.io-index" 2287 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 2288 + 2289 + [[package]] 2290 + name = "fdeflate" 2291 + version = "0.3.7" 2292 + source = "registry+https://github.com/rust-lang/crates.io-index" 2293 + checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 2294 + dependencies = [ 2295 + "simd-adler32", 2296 + ] 2297 + 2298 + [[package]] 2299 + name = "fixedbitset" 2300 + version = "0.5.7" 2301 + source = "registry+https://github.com/rust-lang/crates.io-index" 2302 + checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 2303 + 2304 + [[package]] 2305 + name = "flate2" 2306 + version = "1.1.1" 2307 + source = "registry+https://github.com/rust-lang/crates.io-index" 2308 + checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" 2309 + dependencies = [ 2310 + "crc32fast", 2311 + "libz-rs-sys", 2312 + "miniz_oxide", 2313 + ] 2314 + 2315 + [[package]] 2316 + name = "fnv" 2317 + version = "1.0.7" 2318 + source = "registry+https://github.com/rust-lang/crates.io-index" 2319 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 2320 + 2321 + [[package]] 2322 + name = "foldhash" 2323 + version = "0.1.5" 2324 + source = "registry+https://github.com/rust-lang/crates.io-index" 2325 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 2326 + 2327 + [[package]] 2328 + name = "font-types" 2329 + version = "0.9.0" 2330 + source = "registry+https://github.com/rust-lang/crates.io-index" 2331 + checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7" 2332 + dependencies = [ 2333 + "bytemuck", 2334 + ] 2335 + 2336 + [[package]] 2337 + name = "fontconfig-parser" 2338 + version = "0.5.7" 2339 + source = "registry+https://github.com/rust-lang/crates.io-index" 2340 + checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" 2341 + dependencies = [ 2342 + "roxmltree", 2343 + ] 2344 + 2345 + [[package]] 2346 + name = "fontdb" 2347 + version = "0.16.2" 2348 + source = "registry+https://github.com/rust-lang/crates.io-index" 2349 + checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" 2350 + dependencies = [ 2351 + "fontconfig-parser", 2352 + "log", 2353 + "memmap2", 2354 + "slotmap", 2355 + "tinyvec", 2356 + "ttf-parser 0.20.0", 2357 + ] 2358 + 2359 + [[package]] 2360 + name = "foreign-types" 2361 + version = "0.5.0" 2362 + source = "registry+https://github.com/rust-lang/crates.io-index" 2363 + checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 2364 + dependencies = [ 2365 + "foreign-types-macros", 2366 + "foreign-types-shared", 2367 + ] 2368 + 2369 + [[package]] 2370 + name = "foreign-types-macros" 2371 + version = "0.2.3" 2372 + source = "registry+https://github.com/rust-lang/crates.io-index" 2373 + checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 2374 + dependencies = [ 2375 + "proc-macro2", 2376 + "quote", 2377 + "syn 2.0.101", 2378 + ] 2379 + 2380 + [[package]] 2381 + name = "foreign-types-shared" 2382 + version = "0.3.1" 2383 + source = "registry+https://github.com/rust-lang/crates.io-index" 2384 + checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 2385 + 2386 + [[package]] 2387 + name = "form_urlencoded" 2388 + version = "1.2.1" 2389 + source = "registry+https://github.com/rust-lang/crates.io-index" 2390 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 2391 + dependencies = [ 2392 + "percent-encoding", 2393 + ] 2394 + 2395 + [[package]] 2396 + name = "futures-channel" 2397 + version = "0.3.31" 2398 + source = "registry+https://github.com/rust-lang/crates.io-index" 2399 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 2400 + dependencies = [ 2401 + "futures-core", 2402 + ] 2403 + 2404 + [[package]] 2405 + name = "futures-core" 2406 + version = "0.3.31" 2407 + source = "registry+https://github.com/rust-lang/crates.io-index" 2408 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 2409 + 2410 + [[package]] 2411 + name = "futures-io" 2412 + version = "0.3.31" 2413 + source = "registry+https://github.com/rust-lang/crates.io-index" 2414 + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 2415 + 2416 + [[package]] 2417 + name = "futures-lite" 2418 + version = "2.6.0" 2419 + source = "registry+https://github.com/rust-lang/crates.io-index" 2420 + checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 2421 + dependencies = [ 2422 + "fastrand", 2423 + "futures-core", 2424 + "futures-io", 2425 + "parking", 2426 + "pin-project-lite", 2427 + ] 2428 + 2429 + [[package]] 2430 + name = "gethostname" 2431 + version = "0.4.3" 2432 + source = "registry+https://github.com/rust-lang/crates.io-index" 2433 + checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 2434 + dependencies = [ 2435 + "libc", 2436 + "windows-targets 0.48.5", 2437 + ] 2438 + 2439 + [[package]] 2440 + name = "getrandom" 2441 + version = "0.2.16" 2442 + source = "registry+https://github.com/rust-lang/crates.io-index" 2443 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 2444 + dependencies = [ 2445 + "cfg-if", 2446 + "js-sys", 2447 + "libc", 2448 + "wasi 0.11.0+wasi-snapshot-preview1", 2449 + "wasm-bindgen", 2450 + ] 2451 + 2452 + [[package]] 2453 + name = "getrandom" 2454 + version = "0.3.3" 2455 + source = "registry+https://github.com/rust-lang/crates.io-index" 2456 + checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 2457 + dependencies = [ 2458 + "cfg-if", 2459 + "libc", 2460 + "r-efi", 2461 + "wasi 0.14.2+wasi-0.2.4", 2462 + ] 2463 + 2464 + [[package]] 2465 + name = "gif" 2466 + version = "0.13.1" 2467 + source = "registry+https://github.com/rust-lang/crates.io-index" 2468 + checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" 2469 + dependencies = [ 2470 + "color_quant", 2471 + "weezl", 2472 + ] 2473 + 2474 + [[package]] 2475 + name = "gilrs" 2476 + version = "0.11.0" 2477 + source = "registry+https://github.com/rust-lang/crates.io-index" 2478 + checksum = "bbb2c998745a3c1ac90f64f4f7b3a54219fd3612d7705e7798212935641ed18f" 2479 + dependencies = [ 2480 + "fnv", 2481 + "gilrs-core", 2482 + "log", 2483 + "uuid", 2484 + "vec_map", 2485 + ] 2486 + 2487 + [[package]] 2488 + name = "gilrs-core" 2489 + version = "0.6.4" 2490 + source = "registry+https://github.com/rust-lang/crates.io-index" 2491 + checksum = "a6d95ae10ce5aa99543a28cf74e41c11f3b9e3c14f0452bbde46024753cd683e" 2492 + dependencies = [ 2493 + "core-foundation 0.10.0", 2494 + "inotify", 2495 + "io-kit-sys", 2496 + "js-sys", 2497 + "libc", 2498 + "libudev-sys", 2499 + "log", 2500 + "nix", 2501 + "uuid", 2502 + "vec_map", 2503 + "wasm-bindgen", 2504 + "web-sys", 2505 + "windows 0.61.1", 2506 + ] 2507 + 2508 + [[package]] 2509 + name = "gl_generator" 2510 + version = "0.14.0" 2511 + source = "registry+https://github.com/rust-lang/crates.io-index" 2512 + checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 2513 + dependencies = [ 2514 + "khronos_api", 2515 + "log", 2516 + "xml-rs", 2517 + ] 2518 + 2519 + [[package]] 2520 + name = "glam" 2521 + version = "0.29.3" 2522 + source = "registry+https://github.com/rust-lang/crates.io-index" 2523 + checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" 2524 + dependencies = [ 2525 + "bytemuck", 2526 + "libm", 2527 + "rand", 2528 + "serde", 2529 + ] 2530 + 2531 + [[package]] 2532 + name = "glam" 2533 + version = "0.30.3" 2534 + source = "registry+https://github.com/rust-lang/crates.io-index" 2535 + checksum = "6b46b9ca4690308844c644e7c634d68792467260e051c8543e0c7871662b3ba7" 2536 + 2537 + [[package]] 2538 + name = "glob" 2539 + version = "0.3.2" 2540 + source = "registry+https://github.com/rust-lang/crates.io-index" 2541 + checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 2542 + 2543 + [[package]] 2544 + name = "glow" 2545 + version = "0.16.0" 2546 + source = "registry+https://github.com/rust-lang/crates.io-index" 2547 + checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" 2548 + dependencies = [ 2549 + "js-sys", 2550 + "slotmap", 2551 + "wasm-bindgen", 2552 + "web-sys", 2553 + ] 2554 + 2555 + [[package]] 2556 + name = "gltf" 2557 + version = "1.4.1" 2558 + source = "registry+https://github.com/rust-lang/crates.io-index" 2559 + checksum = "e3ce1918195723ce6ac74e80542c5a96a40c2b26162c1957a5cd70799b8cacf7" 2560 + dependencies = [ 2561 + "byteorder", 2562 + "gltf-json", 2563 + "lazy_static", 2564 + "serde_json", 2565 + ] 2566 + 2567 + [[package]] 2568 + name = "gltf-derive" 2569 + version = "1.4.1" 2570 + source = "registry+https://github.com/rust-lang/crates.io-index" 2571 + checksum = "14070e711538afba5d6c807edb74bcb84e5dbb9211a3bf5dea0dfab5b24f4c51" 2572 + dependencies = [ 2573 + "inflections", 2574 + "proc-macro2", 2575 + "quote", 2576 + "syn 2.0.101", 2577 + ] 2578 + 2579 + [[package]] 2580 + name = "gltf-json" 2581 + version = "1.4.1" 2582 + source = "registry+https://github.com/rust-lang/crates.io-index" 2583 + checksum = "e6176f9d60a7eab0a877e8e96548605dedbde9190a7ae1e80bbcc1c9af03ab14" 2584 + dependencies = [ 2585 + "gltf-derive", 2586 + "serde", 2587 + "serde_derive", 2588 + "serde_json", 2589 + ] 2590 + 2591 + [[package]] 2592 + name = "glutin_wgl_sys" 2593 + version = "0.6.1" 2594 + source = "registry+https://github.com/rust-lang/crates.io-index" 2595 + checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" 2596 + dependencies = [ 2597 + "gl_generator", 2598 + ] 2599 + 2600 + [[package]] 2601 + name = "gpu-alloc" 2602 + version = "0.6.0" 2603 + source = "registry+https://github.com/rust-lang/crates.io-index" 2604 + checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 2605 + dependencies = [ 2606 + "bitflags 2.9.0", 2607 + "gpu-alloc-types", 2608 + ] 2609 + 2610 + [[package]] 2611 + name = "gpu-alloc-types" 2612 + version = "0.3.0" 2613 + source = "registry+https://github.com/rust-lang/crates.io-index" 2614 + checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 2615 + dependencies = [ 2616 + "bitflags 2.9.0", 2617 + ] 2618 + 2619 + [[package]] 2620 + name = "gpu-allocator" 2621 + version = "0.27.0" 2622 + source = "registry+https://github.com/rust-lang/crates.io-index" 2623 + checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" 2624 + dependencies = [ 2625 + "log", 2626 + "presser", 2627 + "thiserror 1.0.69", 2628 + "windows 0.58.0", 2629 + ] 2630 + 2631 + [[package]] 2632 + name = "gpu-descriptor" 2633 + version = "0.3.1" 2634 + source = "registry+https://github.com/rust-lang/crates.io-index" 2635 + checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" 2636 + dependencies = [ 2637 + "bitflags 2.9.0", 2638 + "gpu-descriptor-types", 2639 + "hashbrown", 2640 + ] 2641 + 2642 + [[package]] 2643 + name = "gpu-descriptor-types" 2644 + version = "0.2.0" 2645 + source = "registry+https://github.com/rust-lang/crates.io-index" 2646 + checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 2647 + dependencies = [ 2648 + "bitflags 2.9.0", 2649 + ] 2650 + 2651 + [[package]] 2652 + name = "grid" 2653 + version = "0.15.0" 2654 + source = "registry+https://github.com/rust-lang/crates.io-index" 2655 + checksum = "36119f3a540b086b4e436bb2b588cf98a68863470e0e880f4d0842f112a3183a" 2656 + 2657 + [[package]] 2658 + name = "guillotiere" 2659 + version = "0.6.2" 2660 + source = "registry+https://github.com/rust-lang/crates.io-index" 2661 + checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" 2662 + dependencies = [ 2663 + "euclid", 2664 + "svg_fmt", 2665 + ] 2666 + 2667 + [[package]] 2668 + name = "half" 2669 + version = "2.6.0" 2670 + source = "registry+https://github.com/rust-lang/crates.io-index" 2671 + checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" 2672 + dependencies = [ 2673 + "cfg-if", 2674 + "crunchy", 2675 + ] 2676 + 2677 + [[package]] 2678 + name = "hash32" 2679 + version = "0.3.1" 2680 + source = "registry+https://github.com/rust-lang/crates.io-index" 2681 + checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" 2682 + dependencies = [ 2683 + "byteorder", 2684 + ] 2685 + 2686 + [[package]] 2687 + name = "hashbrown" 2688 + version = "0.15.3" 2689 + source = "registry+https://github.com/rust-lang/crates.io-index" 2690 + checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" 2691 + dependencies = [ 2692 + "equivalent", 2693 + "foldhash", 2694 + "serde", 2695 + ] 2696 + 2697 + [[package]] 2698 + name = "heapless" 2699 + version = "0.8.0" 2700 + source = "registry+https://github.com/rust-lang/crates.io-index" 2701 + checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" 2702 + dependencies = [ 2703 + "hash32", 2704 + "portable-atomic", 2705 + "stable_deref_trait", 2706 + ] 2707 + 2708 + [[package]] 2709 + name = "heck" 2710 + version = "0.5.0" 2711 + source = "registry+https://github.com/rust-lang/crates.io-index" 2712 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 2713 + 2714 + [[package]] 2715 + name = "hermit-abi" 2716 + version = "0.4.0" 2717 + source = "registry+https://github.com/rust-lang/crates.io-index" 2718 + checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 2719 + 2720 + [[package]] 2721 + name = "hexasphere" 2722 + version = "15.1.0" 2723 + source = "registry+https://github.com/rust-lang/crates.io-index" 2724 + checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" 2725 + dependencies = [ 2726 + "constgebra", 2727 + "glam 0.29.3", 2728 + "tinyvec", 2729 + ] 2730 + 2731 + [[package]] 2732 + name = "hexf-parse" 2733 + version = "0.2.1" 2734 + source = "registry+https://github.com/rust-lang/crates.io-index" 2735 + checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 2736 + 2737 + [[package]] 2738 + name = "home" 2739 + version = "0.5.11" 2740 + source = "registry+https://github.com/rust-lang/crates.io-index" 2741 + checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 2742 + dependencies = [ 2743 + "windows-sys 0.59.0", 2744 + ] 2745 + 2746 + [[package]] 2747 + name = "icu_collections" 2748 + version = "2.0.0" 2749 + source = "registry+https://github.com/rust-lang/crates.io-index" 2750 + checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 2751 + dependencies = [ 2752 + "displaydoc", 2753 + "potential_utf", 2754 + "yoke", 2755 + "zerofrom", 2756 + "zerovec", 2757 + ] 2758 + 2759 + [[package]] 2760 + name = "icu_locale_core" 2761 + version = "2.0.0" 2762 + source = "registry+https://github.com/rust-lang/crates.io-index" 2763 + checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 2764 + dependencies = [ 2765 + "displaydoc", 2766 + "litemap", 2767 + "tinystr", 2768 + "writeable", 2769 + "zerovec", 2770 + ] 2771 + 2772 + [[package]] 2773 + name = "icu_normalizer" 2774 + version = "2.0.0" 2775 + source = "registry+https://github.com/rust-lang/crates.io-index" 2776 + checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 2777 + dependencies = [ 2778 + "displaydoc", 2779 + "icu_collections", 2780 + "icu_normalizer_data", 2781 + "icu_properties", 2782 + "icu_provider", 2783 + "smallvec", 2784 + "zerovec", 2785 + ] 2786 + 2787 + [[package]] 2788 + name = "icu_normalizer_data" 2789 + version = "2.0.0" 2790 + source = "registry+https://github.com/rust-lang/crates.io-index" 2791 + checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 2792 + 2793 + [[package]] 2794 + name = "icu_properties" 2795 + version = "2.0.0" 2796 + source = "registry+https://github.com/rust-lang/crates.io-index" 2797 + checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" 2798 + dependencies = [ 2799 + "displaydoc", 2800 + "icu_collections", 2801 + "icu_locale_core", 2802 + "icu_properties_data", 2803 + "icu_provider", 2804 + "potential_utf", 2805 + "zerotrie", 2806 + "zerovec", 2807 + ] 2808 + 2809 + [[package]] 2810 + name = "icu_properties_data" 2811 + version = "2.0.0" 2812 + source = "registry+https://github.com/rust-lang/crates.io-index" 2813 + checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" 2814 + 2815 + [[package]] 2816 + name = "icu_provider" 2817 + version = "2.0.0" 2818 + source = "registry+https://github.com/rust-lang/crates.io-index" 2819 + checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 2820 + dependencies = [ 2821 + "displaydoc", 2822 + "icu_locale_core", 2823 + "stable_deref_trait", 2824 + "tinystr", 2825 + "writeable", 2826 + "yoke", 2827 + "zerofrom", 2828 + "zerotrie", 2829 + "zerovec", 2830 + ] 2831 + 2832 + [[package]] 2833 + name = "idna" 2834 + version = "1.0.3" 2835 + source = "registry+https://github.com/rust-lang/crates.io-index" 2836 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 2837 + dependencies = [ 2838 + "idna_adapter", 2839 + "smallvec", 2840 + "utf8_iter", 2841 + ] 2842 + 2843 + [[package]] 2844 + name = "idna_adapter" 2845 + version = "1.2.1" 2846 + source = "registry+https://github.com/rust-lang/crates.io-index" 2847 + checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 2848 + dependencies = [ 2849 + "icu_normalizer", 2850 + "icu_properties", 2851 + ] 2852 + 2853 + [[package]] 2854 + name = "image" 2855 + version = "0.24.9" 2856 + source = "registry+https://github.com/rust-lang/crates.io-index" 2857 + checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 2858 + dependencies = [ 2859 + "bytemuck", 2860 + "byteorder", 2861 + "color_quant", 2862 + "exr", 2863 + "gif", 2864 + "jpeg-decoder", 2865 + "num-traits", 2866 + "png", 2867 + "qoi", 2868 + "tiff", 2869 + ] 2870 + 2871 + [[package]] 2872 + name = "image" 2873 + version = "0.25.6" 2874 + source = "registry+https://github.com/rust-lang/crates.io-index" 2875 + checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" 2876 + dependencies = [ 2877 + "bytemuck", 2878 + "byteorder-lite", 2879 + "color_quant", 2880 + "exr", 2881 + "gif", 2882 + "image-webp", 2883 + "num-traits", 2884 + "png", 2885 + "qoi", 2886 + "ravif", 2887 + "rayon", 2888 + "rgb", 2889 + "tiff", 2890 + "zune-core", 2891 + "zune-jpeg", 2892 + ] 2893 + 2894 + [[package]] 2895 + name = "image-webp" 2896 + version = "0.2.1" 2897 + source = "registry+https://github.com/rust-lang/crates.io-index" 2898 + checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" 2899 + dependencies = [ 2900 + "byteorder-lite", 2901 + "quick-error", 2902 + ] 2903 + 2904 + [[package]] 2905 + name = "imgref" 2906 + version = "1.11.0" 2907 + source = "registry+https://github.com/rust-lang/crates.io-index" 2908 + checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" 2909 + 2910 + [[package]] 2911 + name = "immutable-chunkmap" 2912 + version = "2.0.6" 2913 + source = "registry+https://github.com/rust-lang/crates.io-index" 2914 + checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" 2915 + dependencies = [ 2916 + "arrayvec", 2917 + ] 2918 + 2919 + [[package]] 2920 + name = "indexmap" 2921 + version = "2.9.0" 2922 + source = "registry+https://github.com/rust-lang/crates.io-index" 2923 + checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 2924 + dependencies = [ 2925 + "equivalent", 2926 + "hashbrown", 2927 + "serde", 2928 + ] 2929 + 2930 + [[package]] 2931 + name = "inflections" 2932 + version = "1.1.1" 2933 + source = "registry+https://github.com/rust-lang/crates.io-index" 2934 + checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" 2935 + 2936 + [[package]] 2937 + name = "inotify" 2938 + version = "0.11.0" 2939 + source = "registry+https://github.com/rust-lang/crates.io-index" 2940 + checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" 2941 + dependencies = [ 2942 + "bitflags 2.9.0", 2943 + "inotify-sys", 2944 + "libc", 2945 + ] 2946 + 2947 + [[package]] 2948 + name = "inotify-sys" 2949 + version = "0.1.5" 2950 + source = "registry+https://github.com/rust-lang/crates.io-index" 2951 + checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" 2952 + dependencies = [ 2953 + "libc", 2954 + ] 2955 + 2956 + [[package]] 2957 + name = "interpolate_name" 2958 + version = "0.2.4" 2959 + source = "registry+https://github.com/rust-lang/crates.io-index" 2960 + checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" 2961 + dependencies = [ 2962 + "proc-macro2", 2963 + "quote", 2964 + "syn 2.0.101", 2965 + ] 2966 + 2967 + [[package]] 2968 + name = "io-kit-sys" 2969 + version = "0.4.1" 2970 + source = "registry+https://github.com/rust-lang/crates.io-index" 2971 + checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" 2972 + dependencies = [ 2973 + "core-foundation-sys", 2974 + "mach2", 2975 + ] 2976 + 2977 + [[package]] 2978 + name = "itertools" 2979 + version = "0.12.1" 2980 + source = "registry+https://github.com/rust-lang/crates.io-index" 2981 + checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" 2982 + dependencies = [ 2983 + "either", 2984 + ] 2985 + 2986 + [[package]] 2987 + name = "itertools" 2988 + version = "0.13.0" 2989 + source = "registry+https://github.com/rust-lang/crates.io-index" 2990 + checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 2991 + dependencies = [ 2992 + "either", 2993 + ] 2994 + 2995 + [[package]] 2996 + name = "itertools" 2997 + version = "0.14.0" 2998 + source = "registry+https://github.com/rust-lang/crates.io-index" 2999 + checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 3000 + dependencies = [ 3001 + "either", 3002 + ] 3003 + 3004 + [[package]] 3005 + name = "itoa" 3006 + version = "1.0.15" 3007 + source = "registry+https://github.com/rust-lang/crates.io-index" 3008 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 3009 + 3010 + [[package]] 3011 + name = "jni" 3012 + version = "0.21.1" 3013 + source = "registry+https://github.com/rust-lang/crates.io-index" 3014 + checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 3015 + dependencies = [ 3016 + "cesu8", 3017 + "cfg-if", 3018 + "combine", 3019 + "jni-sys", 3020 + "log", 3021 + "thiserror 1.0.69", 3022 + "walkdir", 3023 + "windows-sys 0.45.0", 3024 + ] 3025 + 3026 + [[package]] 3027 + name = "jni-sys" 3028 + version = "0.3.0" 3029 + source = "registry+https://github.com/rust-lang/crates.io-index" 3030 + checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 3031 + 3032 + [[package]] 3033 + name = "jobserver" 3034 + version = "0.1.33" 3035 + source = "registry+https://github.com/rust-lang/crates.io-index" 3036 + checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" 3037 + dependencies = [ 3038 + "getrandom 0.3.3", 3039 + "libc", 3040 + ] 3041 + 3042 + [[package]] 3043 + name = "jpeg-decoder" 3044 + version = "0.3.1" 3045 + source = "registry+https://github.com/rust-lang/crates.io-index" 3046 + checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 3047 + dependencies = [ 3048 + "rayon", 3049 + ] 3050 + 3051 + [[package]] 3052 + name = "js-sys" 3053 + version = "0.3.77" 3054 + source = "registry+https://github.com/rust-lang/crates.io-index" 3055 + checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 3056 + dependencies = [ 3057 + "once_cell", 3058 + "wasm-bindgen", 3059 + ] 3060 + 3061 + [[package]] 3062 + name = "khronos-egl" 3063 + version = "6.0.0" 3064 + source = "registry+https://github.com/rust-lang/crates.io-index" 3065 + checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 3066 + dependencies = [ 3067 + "libc", 3068 + "libloading", 3069 + "pkg-config", 3070 + ] 3071 + 3072 + [[package]] 3073 + name = "khronos_api" 3074 + version = "3.1.0" 3075 + source = "registry+https://github.com/rust-lang/crates.io-index" 3076 + checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 3077 + 3078 + [[package]] 3079 + name = "ktx2" 3080 + version = "0.3.0" 3081 + source = "registry+https://github.com/rust-lang/crates.io-index" 3082 + checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" 3083 + dependencies = [ 3084 + "bitflags 1.3.2", 3085 + ] 3086 + 3087 + [[package]] 3088 + name = "lazy_static" 3089 + version = "1.5.0" 3090 + source = "registry+https://github.com/rust-lang/crates.io-index" 3091 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 3092 + 3093 + [[package]] 3094 + name = "lebe" 3095 + version = "0.5.2" 3096 + source = "registry+https://github.com/rust-lang/crates.io-index" 3097 + checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" 3098 + 3099 + [[package]] 3100 + name = "lewton" 3101 + version = "0.10.2" 3102 + source = "registry+https://github.com/rust-lang/crates.io-index" 3103 + checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" 3104 + dependencies = [ 3105 + "byteorder", 3106 + "ogg", 3107 + "tinyvec", 3108 + ] 3109 + 3110 + [[package]] 3111 + name = "libc" 3112 + version = "0.2.172" 3113 + source = "registry+https://github.com/rust-lang/crates.io-index" 3114 + checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 3115 + 3116 + [[package]] 3117 + name = "libfuzzer-sys" 3118 + version = "0.4.9" 3119 + source = "registry+https://github.com/rust-lang/crates.io-index" 3120 + checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" 3121 + dependencies = [ 3122 + "arbitrary", 3123 + "cc", 3124 + ] 3125 + 3126 + [[package]] 3127 + name = "libloading" 3128 + version = "0.8.6" 3129 + source = "registry+https://github.com/rust-lang/crates.io-index" 3130 + checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 3131 + dependencies = [ 3132 + "cfg-if", 3133 + "windows-targets 0.52.6", 3134 + ] 3135 + 3136 + [[package]] 3137 + name = "libm" 3138 + version = "0.2.15" 3139 + source = "registry+https://github.com/rust-lang/crates.io-index" 3140 + checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 3141 + 3142 + [[package]] 3143 + name = "libredox" 3144 + version = "0.1.3" 3145 + source = "registry+https://github.com/rust-lang/crates.io-index" 3146 + checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 3147 + dependencies = [ 3148 + "bitflags 2.9.0", 3149 + "libc", 3150 + "redox_syscall 0.5.12", 3151 + ] 3152 + 3153 + [[package]] 3154 + name = "libudev-sys" 3155 + version = "0.1.4" 3156 + source = "registry+https://github.com/rust-lang/crates.io-index" 3157 + checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" 3158 + dependencies = [ 3159 + "libc", 3160 + "pkg-config", 3161 + ] 3162 + 3163 + [[package]] 3164 + name = "libz-rs-sys" 3165 + version = "0.5.0" 3166 + source = "registry+https://github.com/rust-lang/crates.io-index" 3167 + checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" 3168 + dependencies = [ 3169 + "zlib-rs", 3170 + ] 3171 + 3172 + [[package]] 3173 + name = "linux-raw-sys" 3174 + version = "0.4.15" 3175 + source = "registry+https://github.com/rust-lang/crates.io-index" 3176 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 3177 + 3178 + [[package]] 3179 + name = "litemap" 3180 + version = "0.8.0" 3181 + source = "registry+https://github.com/rust-lang/crates.io-index" 3182 + checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 3183 + 3184 + [[package]] 3185 + name = "litrs" 3186 + version = "0.4.1" 3187 + source = "registry+https://github.com/rust-lang/crates.io-index" 3188 + checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 3189 + 3190 + [[package]] 3191 + name = "lock_api" 3192 + version = "0.4.12" 3193 + source = "registry+https://github.com/rust-lang/crates.io-index" 3194 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 3195 + dependencies = [ 3196 + "autocfg", 3197 + "scopeguard", 3198 + ] 3199 + 3200 + [[package]] 3201 + name = "log" 3202 + version = "0.4.27" 3203 + source = "registry+https://github.com/rust-lang/crates.io-index" 3204 + checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 3205 + 3206 + [[package]] 3207 + name = "loop9" 3208 + version = "0.1.5" 3209 + source = "registry+https://github.com/rust-lang/crates.io-index" 3210 + checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" 3211 + dependencies = [ 3212 + "imgref", 3213 + ] 3214 + 3215 + [[package]] 3216 + name = "mach2" 3217 + version = "0.4.2" 3218 + source = "registry+https://github.com/rust-lang/crates.io-index" 3219 + checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" 3220 + dependencies = [ 3221 + "libc", 3222 + ] 3223 + 3224 + [[package]] 3225 + name = "malloc_buf" 3226 + version = "0.0.6" 3227 + source = "registry+https://github.com/rust-lang/crates.io-index" 3228 + checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 3229 + dependencies = [ 3230 + "libc", 3231 + ] 3232 + 3233 + [[package]] 3234 + name = "matchers" 3235 + version = "0.1.0" 3236 + source = "registry+https://github.com/rust-lang/crates.io-index" 3237 + checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 3238 + dependencies = [ 3239 + "regex-automata 0.1.10", 3240 + ] 3241 + 3242 + [[package]] 3243 + name = "matrixmultiply" 3244 + version = "0.3.9" 3245 + source = "registry+https://github.com/rust-lang/crates.io-index" 3246 + checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" 3247 + dependencies = [ 3248 + "autocfg", 3249 + "rawpointer", 3250 + ] 3251 + 3252 + [[package]] 3253 + name = "maybe-rayon" 3254 + version = "0.1.1" 3255 + source = "registry+https://github.com/rust-lang/crates.io-index" 3256 + checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" 3257 + dependencies = [ 3258 + "cfg-if", 3259 + "rayon", 3260 + ] 3261 + 3262 + [[package]] 3263 + name = "memchr" 3264 + version = "2.7.4" 3265 + source = "registry+https://github.com/rust-lang/crates.io-index" 3266 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 3267 + 3268 + [[package]] 3269 + name = "memmap2" 3270 + version = "0.9.5" 3271 + source = "registry+https://github.com/rust-lang/crates.io-index" 3272 + checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 3273 + dependencies = [ 3274 + "libc", 3275 + ] 3276 + 3277 + [[package]] 3278 + name = "mesh-tools" 3279 + version = "0.1.0" 3280 + source = "registry+https://github.com/rust-lang/crates.io-index" 3281 + checksum = "9b07c5e96a6080555d650321a81c7e3cd68b08261f63ee5db2b069a50f5ce7db" 3282 + dependencies = [ 3283 + "base64 0.13.1", 3284 + "byteorder", 3285 + "image 0.24.9", 3286 + "nalgebra", 3287 + "serde", 3288 + "serde_json", 3289 + "thiserror 1.0.69", 3290 + "uuid", 3291 + ] 3292 + 3293 + [[package]] 3294 + name = "metal" 3295 + version = "0.31.0" 3296 + source = "registry+https://github.com/rust-lang/crates.io-index" 3297 + checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" 3298 + dependencies = [ 3299 + "bitflags 2.9.0", 3300 + "block", 3301 + "core-graphics-types", 3302 + "foreign-types", 3303 + "log", 3304 + "objc", 3305 + "paste", 3306 + ] 3307 + 3308 + [[package]] 3309 + name = "minimal-lexical" 3310 + version = "0.2.1" 3311 + source = "registry+https://github.com/rust-lang/crates.io-index" 3312 + checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 3313 + 3314 + [[package]] 3315 + name = "miniz_oxide" 3316 + version = "0.8.8" 3317 + source = "registry+https://github.com/rust-lang/crates.io-index" 3318 + checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 3319 + dependencies = [ 3320 + "adler2", 3321 + "simd-adler32", 3322 + ] 3323 + 3324 + [[package]] 3325 + name = "naga" 3326 + version = "24.0.0" 3327 + source = "registry+https://github.com/rust-lang/crates.io-index" 3328 + checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" 3329 + dependencies = [ 3330 + "arrayvec", 3331 + "bit-set 0.8.0", 3332 + "bitflags 2.9.0", 3333 + "cfg_aliases", 3334 + "codespan-reporting", 3335 + "hexf-parse", 3336 + "indexmap", 3337 + "log", 3338 + "pp-rs", 3339 + "rustc-hash", 3340 + "spirv", 3341 + "strum", 3342 + "termcolor", 3343 + "thiserror 2.0.12", 3344 + "unicode-xid", 3345 + ] 3346 + 3347 + [[package]] 3348 + name = "naga_oil" 3349 + version = "0.17.0" 3350 + source = "registry+https://github.com/rust-lang/crates.io-index" 3351 + checksum = "0ca507a365f886f95f74420361b75442a3709c747a8a6e8b6c45b8667f45a82c" 3352 + dependencies = [ 3353 + "bit-set 0.5.3", 3354 + "codespan-reporting", 3355 + "data-encoding", 3356 + "indexmap", 3357 + "naga", 3358 + "once_cell", 3359 + "regex", 3360 + "regex-syntax 0.8.5", 3361 + "rustc-hash", 3362 + "thiserror 1.0.69", 3363 + "tracing", 3364 + "unicode-ident", 3365 + ] 3366 + 3367 + [[package]] 3368 + name = "nalgebra" 3369 + version = "0.31.4" 3370 + source = "registry+https://github.com/rust-lang/crates.io-index" 3371 + checksum = "20bd243ab3dbb395b39ee730402d2e5405e448c75133ec49cc977762c4cba3d1" 3372 + dependencies = [ 3373 + "approx", 3374 + "matrixmultiply", 3375 + "nalgebra-macros", 3376 + "num-complex", 3377 + "num-rational", 3378 + "num-traits", 3379 + "simba", 3380 + "typenum", 3381 + ] 3382 + 3383 + [[package]] 3384 + name = "nalgebra-macros" 3385 + version = "0.1.0" 3386 + source = "registry+https://github.com/rust-lang/crates.io-index" 3387 + checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218" 3388 + dependencies = [ 3389 + "proc-macro2", 3390 + "quote", 3391 + "syn 1.0.109", 3392 + ] 3393 + 3394 + [[package]] 3395 + name = "ndk" 3396 + version = "0.8.0" 3397 + source = "registry+https://github.com/rust-lang/crates.io-index" 3398 + checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" 3399 + dependencies = [ 3400 + "bitflags 2.9.0", 3401 + "jni-sys", 3402 + "log", 3403 + "ndk-sys 0.5.0+25.2.9519653", 3404 + "num_enum", 3405 + "thiserror 1.0.69", 3406 + ] 3407 + 3408 + [[package]] 3409 + name = "ndk" 3410 + version = "0.9.0" 3411 + source = "registry+https://github.com/rust-lang/crates.io-index" 3412 + checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 3413 + dependencies = [ 3414 + "bitflags 2.9.0", 3415 + "jni-sys", 3416 + "log", 3417 + "ndk-sys 0.6.0+11769913", 3418 + "num_enum", 3419 + "raw-window-handle", 3420 + "thiserror 1.0.69", 3421 + ] 3422 + 3423 + [[package]] 3424 + name = "ndk-context" 3425 + version = "0.1.1" 3426 + source = "registry+https://github.com/rust-lang/crates.io-index" 3427 + checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 3428 + 3429 + [[package]] 3430 + name = "ndk-sys" 3431 + version = "0.5.0+25.2.9519653" 3432 + source = "registry+https://github.com/rust-lang/crates.io-index" 3433 + checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 3434 + dependencies = [ 3435 + "jni-sys", 3436 + ] 3437 + 3438 + [[package]] 3439 + name = "ndk-sys" 3440 + version = "0.6.0+11769913" 3441 + source = "registry+https://github.com/rust-lang/crates.io-index" 3442 + checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" 3443 + dependencies = [ 3444 + "jni-sys", 3445 + ] 3446 + 3447 + [[package]] 3448 + name = "new_debug_unreachable" 3449 + version = "1.0.6" 3450 + source = "registry+https://github.com/rust-lang/crates.io-index" 3451 + checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 3452 + 3453 + [[package]] 3454 + name = "nix" 3455 + version = "0.29.0" 3456 + source = "registry+https://github.com/rust-lang/crates.io-index" 3457 + checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 3458 + dependencies = [ 3459 + "bitflags 2.9.0", 3460 + "cfg-if", 3461 + "cfg_aliases", 3462 + "libc", 3463 + ] 3464 + 3465 + [[package]] 3466 + name = "nohash-hasher" 3467 + version = "0.2.0" 3468 + source = "registry+https://github.com/rust-lang/crates.io-index" 3469 + checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 3470 + 3471 + [[package]] 3472 + name = "nom" 3473 + version = "7.1.3" 3474 + source = "registry+https://github.com/rust-lang/crates.io-index" 3475 + checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 3476 + dependencies = [ 3477 + "memchr", 3478 + "minimal-lexical", 3479 + ] 3480 + 3481 + [[package]] 3482 + name = "nonmax" 3483 + version = "0.5.5" 3484 + source = "registry+https://github.com/rust-lang/crates.io-index" 3485 + checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" 3486 + 3487 + [[package]] 3488 + name = "noop_proc_macro" 3489 + version = "0.3.0" 3490 + source = "registry+https://github.com/rust-lang/crates.io-index" 3491 + checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" 3492 + 3493 + [[package]] 3494 + name = "ntapi" 3495 + version = "0.4.1" 3496 + source = "registry+https://github.com/rust-lang/crates.io-index" 3497 + checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" 3498 + dependencies = [ 3499 + "winapi", 3500 + ] 3501 + 3502 + [[package]] 3503 + name = "nu-ansi-term" 3504 + version = "0.46.0" 3505 + source = "registry+https://github.com/rust-lang/crates.io-index" 3506 + checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 3507 + dependencies = [ 3508 + "overload", 3509 + "winapi", 3510 + ] 3511 + 3512 + [[package]] 3513 + name = "num-bigint" 3514 + version = "0.4.6" 3515 + source = "registry+https://github.com/rust-lang/crates.io-index" 3516 + checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 3517 + dependencies = [ 3518 + "num-integer", 3519 + "num-traits", 3520 + ] 3521 + 3522 + [[package]] 3523 + name = "num-complex" 3524 + version = "0.4.6" 3525 + source = "registry+https://github.com/rust-lang/crates.io-index" 3526 + checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 3527 + dependencies = [ 3528 + "num-traits", 3529 + ] 3530 + 3531 + [[package]] 3532 + name = "num-derive" 3533 + version = "0.4.2" 3534 + source = "registry+https://github.com/rust-lang/crates.io-index" 3535 + checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 3536 + dependencies = [ 3537 + "proc-macro2", 3538 + "quote", 3539 + "syn 2.0.101", 3540 + ] 3541 + 3542 + [[package]] 3543 + name = "num-integer" 3544 + version = "0.1.46" 3545 + source = "registry+https://github.com/rust-lang/crates.io-index" 3546 + checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 3547 + dependencies = [ 3548 + "num-traits", 3549 + ] 3550 + 3551 + [[package]] 3552 + name = "num-rational" 3553 + version = "0.4.2" 3554 + source = "registry+https://github.com/rust-lang/crates.io-index" 3555 + checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 3556 + dependencies = [ 3557 + "num-bigint", 3558 + "num-integer", 3559 + "num-traits", 3560 + ] 3561 + 3562 + [[package]] 3563 + name = "num-traits" 3564 + version = "0.2.19" 3565 + source = "registry+https://github.com/rust-lang/crates.io-index" 3566 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 3567 + dependencies = [ 3568 + "autocfg", 3569 + "libm", 3570 + ] 3571 + 3572 + [[package]] 3573 + name = "num_enum" 3574 + version = "0.7.3" 3575 + source = "registry+https://github.com/rust-lang/crates.io-index" 3576 + checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 3577 + dependencies = [ 3578 + "num_enum_derive", 3579 + ] 3580 + 3581 + [[package]] 3582 + name = "num_enum_derive" 3583 + version = "0.7.3" 3584 + source = "registry+https://github.com/rust-lang/crates.io-index" 3585 + checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 3586 + dependencies = [ 3587 + "proc-macro-crate", 3588 + "proc-macro2", 3589 + "quote", 3590 + "syn 2.0.101", 3591 + ] 3592 + 3593 + [[package]] 3594 + name = "objc" 3595 + version = "0.2.7" 3596 + source = "registry+https://github.com/rust-lang/crates.io-index" 3597 + checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 3598 + dependencies = [ 3599 + "malloc_buf", 3600 + ] 3601 + 3602 + [[package]] 3603 + name = "objc-sys" 3604 + version = "0.3.5" 3605 + source = "registry+https://github.com/rust-lang/crates.io-index" 3606 + checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 3607 + 3608 + [[package]] 3609 + name = "objc2" 3610 + version = "0.5.2" 3611 + source = "registry+https://github.com/rust-lang/crates.io-index" 3612 + checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 3613 + dependencies = [ 3614 + "objc-sys", 3615 + "objc2-encode", 3616 + ] 3617 + 3618 + [[package]] 3619 + name = "objc2" 3620 + version = "0.6.1" 3621 + source = "registry+https://github.com/rust-lang/crates.io-index" 3622 + checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 3623 + dependencies = [ 3624 + "objc2-encode", 3625 + ] 3626 + 3627 + [[package]] 3628 + name = "objc2-app-kit" 3629 + version = "0.2.2" 3630 + source = "registry+https://github.com/rust-lang/crates.io-index" 3631 + checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 3632 + dependencies = [ 3633 + "bitflags 2.9.0", 3634 + "block2", 3635 + "libc", 3636 + "objc2 0.5.2", 3637 + "objc2-core-data", 3638 + "objc2-core-image", 3639 + "objc2-foundation 0.2.2", 3640 + "objc2-quartz-core", 3641 + ] 3642 + 3643 + [[package]] 3644 + name = "objc2-app-kit" 3645 + version = "0.3.1" 3646 + source = "registry+https://github.com/rust-lang/crates.io-index" 3647 + checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 3648 + dependencies = [ 3649 + "bitflags 2.9.0", 3650 + "objc2 0.6.1", 3651 + "objc2-core-graphics", 3652 + "objc2-foundation 0.3.1", 3653 + ] 3654 + 3655 + [[package]] 3656 + name = "objc2-cloud-kit" 3657 + version = "0.2.2" 3658 + source = "registry+https://github.com/rust-lang/crates.io-index" 3659 + checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" 3660 + dependencies = [ 3661 + "bitflags 2.9.0", 3662 + "block2", 3663 + "objc2 0.5.2", 3664 + "objc2-core-location", 3665 + "objc2-foundation 0.2.2", 3666 + ] 3667 + 3668 + [[package]] 3669 + name = "objc2-contacts" 3670 + version = "0.2.2" 3671 + source = "registry+https://github.com/rust-lang/crates.io-index" 3672 + checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" 3673 + dependencies = [ 3674 + "block2", 3675 + "objc2 0.5.2", 3676 + "objc2-foundation 0.2.2", 3677 + ] 3678 + 3679 + [[package]] 3680 + name = "objc2-core-data" 3681 + version = "0.2.2" 3682 + source = "registry+https://github.com/rust-lang/crates.io-index" 3683 + checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 3684 + dependencies = [ 3685 + "bitflags 2.9.0", 3686 + "block2", 3687 + "objc2 0.5.2", 3688 + "objc2-foundation 0.2.2", 3689 + ] 3690 + 3691 + [[package]] 3692 + name = "objc2-core-foundation" 3693 + version = "0.3.1" 3694 + source = "registry+https://github.com/rust-lang/crates.io-index" 3695 + checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 3696 + dependencies = [ 3697 + "bitflags 2.9.0", 3698 + "dispatch2", 3699 + "objc2 0.6.1", 3700 + ] 3701 + 3702 + [[package]] 3703 + name = "objc2-core-graphics" 3704 + version = "0.3.1" 3705 + source = "registry+https://github.com/rust-lang/crates.io-index" 3706 + checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 3707 + dependencies = [ 3708 + "bitflags 2.9.0", 3709 + "dispatch2", 3710 + "objc2 0.6.1", 3711 + "objc2-core-foundation", 3712 + "objc2-io-surface", 3713 + ] 3714 + 3715 + [[package]] 3716 + name = "objc2-core-image" 3717 + version = "0.2.2" 3718 + source = "registry+https://github.com/rust-lang/crates.io-index" 3719 + checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 3720 + dependencies = [ 3721 + "block2", 3722 + "objc2 0.5.2", 3723 + "objc2-foundation 0.2.2", 3724 + "objc2-metal", 3725 + ] 3726 + 3727 + [[package]] 3728 + name = "objc2-core-location" 3729 + version = "0.2.2" 3730 + source = "registry+https://github.com/rust-lang/crates.io-index" 3731 + checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" 3732 + dependencies = [ 3733 + "block2", 3734 + "objc2 0.5.2", 3735 + "objc2-contacts", 3736 + "objc2-foundation 0.2.2", 3737 + ] 3738 + 3739 + [[package]] 3740 + name = "objc2-encode" 3741 + version = "4.1.0" 3742 + source = "registry+https://github.com/rust-lang/crates.io-index" 3743 + checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 3744 + 3745 + [[package]] 3746 + name = "objc2-foundation" 3747 + version = "0.2.2" 3748 + source = "registry+https://github.com/rust-lang/crates.io-index" 3749 + checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 3750 + dependencies = [ 3751 + "bitflags 2.9.0", 3752 + "block2", 3753 + "dispatch", 3754 + "libc", 3755 + "objc2 0.5.2", 3756 + ] 3757 + 3758 + [[package]] 3759 + name = "objc2-foundation" 3760 + version = "0.3.1" 3761 + source = "registry+https://github.com/rust-lang/crates.io-index" 3762 + checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 3763 + dependencies = [ 3764 + "bitflags 2.9.0", 3765 + "objc2 0.6.1", 3766 + "objc2-core-foundation", 3767 + ] 3768 + 3769 + [[package]] 3770 + name = "objc2-io-surface" 3771 + version = "0.3.1" 3772 + source = "registry+https://github.com/rust-lang/crates.io-index" 3773 + checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 3774 + dependencies = [ 3775 + "bitflags 2.9.0", 3776 + "objc2 0.6.1", 3777 + "objc2-core-foundation", 3778 + ] 3779 + 3780 + [[package]] 3781 + name = "objc2-link-presentation" 3782 + version = "0.2.2" 3783 + source = "registry+https://github.com/rust-lang/crates.io-index" 3784 + checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" 3785 + dependencies = [ 3786 + "block2", 3787 + "objc2 0.5.2", 3788 + "objc2-app-kit 0.2.2", 3789 + "objc2-foundation 0.2.2", 3790 + ] 3791 + 3792 + [[package]] 3793 + name = "objc2-metal" 3794 + version = "0.2.2" 3795 + source = "registry+https://github.com/rust-lang/crates.io-index" 3796 + checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 3797 + dependencies = [ 3798 + "bitflags 2.9.0", 3799 + "block2", 3800 + "objc2 0.5.2", 3801 + "objc2-foundation 0.2.2", 3802 + ] 3803 + 3804 + [[package]] 3805 + name = "objc2-quartz-core" 3806 + version = "0.2.2" 3807 + source = "registry+https://github.com/rust-lang/crates.io-index" 3808 + checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 3809 + dependencies = [ 3810 + "bitflags 2.9.0", 3811 + "block2", 3812 + "objc2 0.5.2", 3813 + "objc2-foundation 0.2.2", 3814 + "objc2-metal", 3815 + ] 3816 + 3817 + [[package]] 3818 + name = "objc2-symbols" 3819 + version = "0.2.2" 3820 + source = "registry+https://github.com/rust-lang/crates.io-index" 3821 + checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" 3822 + dependencies = [ 3823 + "objc2 0.5.2", 3824 + "objc2-foundation 0.2.2", 3825 + ] 3826 + 3827 + [[package]] 3828 + name = "objc2-ui-kit" 3829 + version = "0.2.2" 3830 + source = "registry+https://github.com/rust-lang/crates.io-index" 3831 + checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" 3832 + dependencies = [ 3833 + "bitflags 2.9.0", 3834 + "block2", 3835 + "objc2 0.5.2", 3836 + "objc2-cloud-kit", 3837 + "objc2-core-data", 3838 + "objc2-core-image", 3839 + "objc2-core-location", 3840 + "objc2-foundation 0.2.2", 3841 + "objc2-link-presentation", 3842 + "objc2-quartz-core", 3843 + "objc2-symbols", 3844 + "objc2-uniform-type-identifiers", 3845 + "objc2-user-notifications", 3846 + ] 3847 + 3848 + [[package]] 3849 + name = "objc2-uniform-type-identifiers" 3850 + version = "0.2.2" 3851 + source = "registry+https://github.com/rust-lang/crates.io-index" 3852 + checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" 3853 + dependencies = [ 3854 + "block2", 3855 + "objc2 0.5.2", 3856 + "objc2-foundation 0.2.2", 3857 + ] 3858 + 3859 + [[package]] 3860 + name = "objc2-user-notifications" 3861 + version = "0.2.2" 3862 + source = "registry+https://github.com/rust-lang/crates.io-index" 3863 + checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" 3864 + dependencies = [ 3865 + "bitflags 2.9.0", 3866 + "block2", 3867 + "objc2 0.5.2", 3868 + "objc2-core-location", 3869 + "objc2-foundation 0.2.2", 3870 + ] 3871 + 3872 + [[package]] 3873 + name = "oboe" 3874 + version = "0.6.1" 3875 + source = "registry+https://github.com/rust-lang/crates.io-index" 3876 + checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" 3877 + dependencies = [ 3878 + "jni", 3879 + "ndk 0.8.0", 3880 + "ndk-context", 3881 + "num-derive", 3882 + "num-traits", 3883 + "oboe-sys", 3884 + ] 3885 + 3886 + [[package]] 3887 + name = "oboe-sys" 3888 + version = "0.6.1" 3889 + source = "registry+https://github.com/rust-lang/crates.io-index" 3890 + checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" 3891 + dependencies = [ 3892 + "cc", 3893 + ] 3894 + 3895 + [[package]] 3896 + name = "offset-allocator" 3897 + version = "0.2.0" 3898 + source = "registry+https://github.com/rust-lang/crates.io-index" 3899 + checksum = "e234d535da3521eb95106f40f0b73483d80bfb3aacf27c40d7e2b72f1a3e00a2" 3900 + dependencies = [ 3901 + "log", 3902 + "nonmax", 3903 + ] 3904 + 3905 + [[package]] 3906 + name = "ogg" 3907 + version = "0.8.0" 3908 + source = "registry+https://github.com/rust-lang/crates.io-index" 3909 + checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" 3910 + dependencies = [ 3911 + "byteorder", 3912 + ] 3913 + 3914 + [[package]] 3915 + name = "once_cell" 3916 + version = "1.21.3" 3917 + source = "registry+https://github.com/rust-lang/crates.io-index" 3918 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 3919 + 3920 + [[package]] 3921 + name = "orbclient" 3922 + version = "0.3.48" 3923 + source = "registry+https://github.com/rust-lang/crates.io-index" 3924 + checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" 3925 + dependencies = [ 3926 + "libredox", 3927 + ] 3928 + 3929 + [[package]] 3930 + name = "ordered-float" 3931 + version = "4.6.0" 3932 + source = "registry+https://github.com/rust-lang/crates.io-index" 3933 + checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" 3934 + dependencies = [ 3935 + "num-traits", 3936 + ] 3937 + 3938 + [[package]] 3939 + name = "overload" 3940 + version = "0.1.1" 3941 + source = "registry+https://github.com/rust-lang/crates.io-index" 3942 + checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 3943 + 3944 + [[package]] 3945 + name = "owned_ttf_parser" 3946 + version = "0.25.0" 3947 + source = "registry+https://github.com/rust-lang/crates.io-index" 3948 + checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" 3949 + dependencies = [ 3950 + "ttf-parser 0.25.1", 3951 + ] 3952 + 3953 + [[package]] 3954 + name = "owo-colors" 3955 + version = "4.2.0" 3956 + source = "registry+https://github.com/rust-lang/crates.io-index" 3957 + checksum = "1036865bb9422d3300cf723f657c2851d0e9ab12567854b1f4eba3d77decf564" 3958 + 3959 + [[package]] 3960 + name = "parking" 3961 + version = "2.2.1" 3962 + source = "registry+https://github.com/rust-lang/crates.io-index" 3963 + checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 3964 + 3965 + [[package]] 3966 + name = "parking_lot" 3967 + version = "0.12.3" 3968 + source = "registry+https://github.com/rust-lang/crates.io-index" 3969 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 3970 + dependencies = [ 3971 + "lock_api", 3972 + "parking_lot_core", 3973 + ] 3974 + 3975 + [[package]] 3976 + name = "parking_lot_core" 3977 + version = "0.9.10" 3978 + source = "registry+https://github.com/rust-lang/crates.io-index" 3979 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 3980 + dependencies = [ 3981 + "cfg-if", 3982 + "libc", 3983 + "redox_syscall 0.5.12", 3984 + "smallvec", 3985 + "windows-targets 0.52.6", 3986 + ] 3987 + 3988 + [[package]] 3989 + name = "paste" 3990 + version = "1.0.15" 3991 + source = "registry+https://github.com/rust-lang/crates.io-index" 3992 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 3993 + 3994 + [[package]] 3995 + name = "percent-encoding" 3996 + version = "2.3.1" 3997 + source = "registry+https://github.com/rust-lang/crates.io-index" 3998 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 3999 + 4000 + [[package]] 4001 + name = "petgraph" 4002 + version = "0.7.1" 4003 + source = "registry+https://github.com/rust-lang/crates.io-index" 4004 + checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" 4005 + dependencies = [ 4006 + "fixedbitset", 4007 + "indexmap", 4008 + "serde", 4009 + "serde_derive", 4010 + ] 4011 + 4012 + [[package]] 4013 + name = "pin-project" 4014 + version = "1.1.10" 4015 + source = "registry+https://github.com/rust-lang/crates.io-index" 4016 + checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 4017 + dependencies = [ 4018 + "pin-project-internal", 4019 + ] 4020 + 4021 + [[package]] 4022 + name = "pin-project-internal" 4023 + version = "1.1.10" 4024 + source = "registry+https://github.com/rust-lang/crates.io-index" 4025 + checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 4026 + dependencies = [ 4027 + "proc-macro2", 4028 + "quote", 4029 + "syn 2.0.101", 4030 + ] 4031 + 4032 + [[package]] 4033 + name = "pin-project-lite" 4034 + version = "0.2.16" 4035 + source = "registry+https://github.com/rust-lang/crates.io-index" 4036 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 4037 + 4038 + [[package]] 4039 + name = "piper" 4040 + version = "0.2.4" 4041 + source = "registry+https://github.com/rust-lang/crates.io-index" 4042 + checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 4043 + dependencies = [ 4044 + "atomic-waker", 4045 + "fastrand", 4046 + "futures-io", 4047 + ] 4048 + 4049 + [[package]] 4050 + name = "pkg-config" 4051 + version = "0.3.32" 4052 + source = "registry+https://github.com/rust-lang/crates.io-index" 4053 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 4054 + 4055 + [[package]] 4056 + name = "png" 4057 + version = "0.17.16" 4058 + source = "registry+https://github.com/rust-lang/crates.io-index" 4059 + checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 4060 + dependencies = [ 4061 + "bitflags 1.3.2", 4062 + "crc32fast", 4063 + "fdeflate", 4064 + "flate2", 4065 + "miniz_oxide", 4066 + ] 4067 + 4068 + [[package]] 4069 + name = "polling" 4070 + version = "3.7.4" 4071 + source = "registry+https://github.com/rust-lang/crates.io-index" 4072 + checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" 4073 + dependencies = [ 4074 + "cfg-if", 4075 + "concurrent-queue", 4076 + "hermit-abi", 4077 + "pin-project-lite", 4078 + "rustix", 4079 + "tracing", 4080 + "windows-sys 0.59.0", 4081 + ] 4082 + 4083 + [[package]] 4084 + name = "portable-atomic" 4085 + version = "1.11.0" 4086 + source = "registry+https://github.com/rust-lang/crates.io-index" 4087 + checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" 4088 + 4089 + [[package]] 4090 + name = "portable-atomic-util" 4091 + version = "0.2.4" 4092 + source = "registry+https://github.com/rust-lang/crates.io-index" 4093 + checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 4094 + dependencies = [ 4095 + "portable-atomic", 4096 + ] 4097 + 4098 + [[package]] 4099 + name = "potential_utf" 4100 + version = "0.1.2" 4101 + source = "registry+https://github.com/rust-lang/crates.io-index" 4102 + checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 4103 + dependencies = [ 4104 + "zerovec", 4105 + ] 4106 + 4107 + [[package]] 4108 + name = "pp-rs" 4109 + version = "0.2.1" 4110 + source = "registry+https://github.com/rust-lang/crates.io-index" 4111 + checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" 4112 + dependencies = [ 4113 + "unicode-xid", 4114 + ] 4115 + 4116 + [[package]] 4117 + name = "ppv-lite86" 4118 + version = "0.2.21" 4119 + source = "registry+https://github.com/rust-lang/crates.io-index" 4120 + checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 4121 + dependencies = [ 4122 + "zerocopy", 4123 + ] 4124 + 4125 + [[package]] 4126 + name = "presser" 4127 + version = "0.3.1" 4128 + source = "registry+https://github.com/rust-lang/crates.io-index" 4129 + checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" 4130 + 4131 + [[package]] 4132 + name = "prettyplease" 4133 + version = "0.2.32" 4134 + source = "registry+https://github.com/rust-lang/crates.io-index" 4135 + checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" 4136 + dependencies = [ 4137 + "proc-macro2", 4138 + "syn 2.0.101", 4139 + ] 4140 + 4141 + [[package]] 4142 + name = "proc-macro-crate" 4143 + version = "3.3.0" 4144 + source = "registry+https://github.com/rust-lang/crates.io-index" 4145 + checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 4146 + dependencies = [ 4147 + "toml_edit", 4148 + ] 4149 + 4150 + [[package]] 4151 + name = "proc-macro2" 4152 + version = "1.0.95" 4153 + source = "registry+https://github.com/rust-lang/crates.io-index" 4154 + checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 4155 + dependencies = [ 4156 + "unicode-ident", 4157 + ] 4158 + 4159 + [[package]] 4160 + name = "profiling" 4161 + version = "1.0.16" 4162 + source = "registry+https://github.com/rust-lang/crates.io-index" 4163 + checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 4164 + dependencies = [ 4165 + "profiling-procmacros", 4166 + ] 4167 + 4168 + [[package]] 4169 + name = "profiling-procmacros" 4170 + version = "1.0.16" 4171 + source = "registry+https://github.com/rust-lang/crates.io-index" 4172 + checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" 4173 + dependencies = [ 4174 + "quote", 4175 + "syn 2.0.101", 4176 + ] 4177 + 4178 + [[package]] 4179 + name = "qoi" 4180 + version = "0.4.1" 4181 + source = "registry+https://github.com/rust-lang/crates.io-index" 4182 + checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" 4183 + dependencies = [ 4184 + "bytemuck", 4185 + ] 4186 + 4187 + [[package]] 4188 + name = "quick-error" 4189 + version = "2.0.1" 4190 + source = "registry+https://github.com/rust-lang/crates.io-index" 4191 + checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 4192 + 4193 + [[package]] 4194 + name = "quick-xml" 4195 + version = "0.37.5" 4196 + source = "registry+https://github.com/rust-lang/crates.io-index" 4197 + checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" 4198 + dependencies = [ 4199 + "memchr", 4200 + ] 4201 + 4202 + [[package]] 4203 + name = "quote" 4204 + version = "1.0.40" 4205 + source = "registry+https://github.com/rust-lang/crates.io-index" 4206 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 4207 + dependencies = [ 4208 + "proc-macro2", 4209 + ] 4210 + 4211 + [[package]] 4212 + name = "r-efi" 4213 + version = "5.2.0" 4214 + source = "registry+https://github.com/rust-lang/crates.io-index" 4215 + checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 4216 + 4217 + [[package]] 4218 + name = "radsort" 4219 + version = "0.1.1" 4220 + source = "registry+https://github.com/rust-lang/crates.io-index" 4221 + checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" 4222 + 4223 + [[package]] 4224 + name = "rand" 4225 + version = "0.8.5" 4226 + source = "registry+https://github.com/rust-lang/crates.io-index" 4227 + checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 4228 + dependencies = [ 4229 + "libc", 4230 + "rand_chacha", 4231 + "rand_core", 4232 + ] 4233 + 4234 + [[package]] 4235 + name = "rand_chacha" 4236 + version = "0.3.1" 4237 + source = "registry+https://github.com/rust-lang/crates.io-index" 4238 + checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 4239 + dependencies = [ 4240 + "ppv-lite86", 4241 + "rand_core", 4242 + ] 4243 + 4244 + [[package]] 4245 + name = "rand_core" 4246 + version = "0.6.4" 4247 + source = "registry+https://github.com/rust-lang/crates.io-index" 4248 + checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 4249 + dependencies = [ 4250 + "getrandom 0.2.16", 4251 + ] 4252 + 4253 + [[package]] 4254 + name = "rand_distr" 4255 + version = "0.4.3" 4256 + source = "registry+https://github.com/rust-lang/crates.io-index" 4257 + checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" 4258 + dependencies = [ 4259 + "num-traits", 4260 + "rand", 4261 + ] 4262 + 4263 + [[package]] 4264 + name = "range-alloc" 4265 + version = "0.1.4" 4266 + source = "registry+https://github.com/rust-lang/crates.io-index" 4267 + checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" 4268 + 4269 + [[package]] 4270 + name = "rangemap" 4271 + version = "1.5.1" 4272 + source = "registry+https://github.com/rust-lang/crates.io-index" 4273 + checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" 4274 + 4275 + [[package]] 4276 + name = "rav1e" 4277 + version = "0.7.1" 4278 + source = "registry+https://github.com/rust-lang/crates.io-index" 4279 + checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" 4280 + dependencies = [ 4281 + "arbitrary", 4282 + "arg_enum_proc_macro", 4283 + "arrayvec", 4284 + "av1-grain", 4285 + "bitstream-io", 4286 + "built", 4287 + "cfg-if", 4288 + "interpolate_name", 4289 + "itertools 0.12.1", 4290 + "libc", 4291 + "libfuzzer-sys", 4292 + "log", 4293 + "maybe-rayon", 4294 + "new_debug_unreachable", 4295 + "noop_proc_macro", 4296 + "num-derive", 4297 + "num-traits", 4298 + "once_cell", 4299 + "paste", 4300 + "profiling", 4301 + "rand", 4302 + "rand_chacha", 4303 + "simd_helpers", 4304 + "system-deps", 4305 + "thiserror 1.0.69", 4306 + "v_frame", 4307 + "wasm-bindgen", 4308 + ] 4309 + 4310 + [[package]] 4311 + name = "ravif" 4312 + version = "0.11.12" 4313 + source = "registry+https://github.com/rust-lang/crates.io-index" 4314 + checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" 4315 + dependencies = [ 4316 + "avif-serialize", 4317 + "imgref", 4318 + "loop9", 4319 + "quick-error", 4320 + "rav1e", 4321 + "rayon", 4322 + "rgb", 4323 + ] 4324 + 4325 + [[package]] 4326 + name = "raw-window-handle" 4327 + version = "0.6.2" 4328 + source = "registry+https://github.com/rust-lang/crates.io-index" 4329 + checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 4330 + 4331 + [[package]] 4332 + name = "rawpointer" 4333 + version = "0.2.1" 4334 + source = "registry+https://github.com/rust-lang/crates.io-index" 4335 + checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" 4336 + 4337 + [[package]] 4338 + name = "rayon" 4339 + version = "1.10.0" 4340 + source = "registry+https://github.com/rust-lang/crates.io-index" 4341 + checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 4342 + dependencies = [ 4343 + "either", 4344 + "rayon-core", 4345 + ] 4346 + 4347 + [[package]] 4348 + name = "rayon-core" 4349 + version = "1.12.1" 4350 + source = "registry+https://github.com/rust-lang/crates.io-index" 4351 + checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 4352 + dependencies = [ 4353 + "crossbeam-deque", 4354 + "crossbeam-utils", 4355 + ] 4356 + 4357 + [[package]] 4358 + name = "read-fonts" 4359 + version = "0.29.0" 4360 + source = "registry+https://github.com/rust-lang/crates.io-index" 4361 + checksum = "5ce8e2ca6b24313587a03ca61bb74c384e2a815bd90cf2866cfc9f5fb7a11fa0" 4362 + dependencies = [ 4363 + "bytemuck", 4364 + "font-types", 4365 + ] 4366 + 4367 + [[package]] 4368 + name = "rectangle-pack" 4369 + version = "0.4.2" 4370 + source = "registry+https://github.com/rust-lang/crates.io-index" 4371 + checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" 4372 + 4373 + [[package]] 4374 + name = "redox_syscall" 4375 + version = "0.4.1" 4376 + source = "registry+https://github.com/rust-lang/crates.io-index" 4377 + checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 4378 + dependencies = [ 4379 + "bitflags 1.3.2", 4380 + ] 4381 + 4382 + [[package]] 4383 + name = "redox_syscall" 4384 + version = "0.5.12" 4385 + source = "registry+https://github.com/rust-lang/crates.io-index" 4386 + checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" 4387 + dependencies = [ 4388 + "bitflags 2.9.0", 4389 + ] 4390 + 4391 + [[package]] 4392 + name = "regex" 4393 + version = "1.11.1" 4394 + source = "registry+https://github.com/rust-lang/crates.io-index" 4395 + checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 4396 + dependencies = [ 4397 + "aho-corasick", 4398 + "memchr", 4399 + "regex-automata 0.4.9", 4400 + "regex-syntax 0.8.5", 4401 + ] 4402 + 4403 + [[package]] 4404 + name = "regex-automata" 4405 + version = "0.1.10" 4406 + source = "registry+https://github.com/rust-lang/crates.io-index" 4407 + checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 4408 + dependencies = [ 4409 + "regex-syntax 0.6.29", 4410 + ] 4411 + 4412 + [[package]] 4413 + name = "regex-automata" 4414 + version = "0.4.9" 4415 + source = "registry+https://github.com/rust-lang/crates.io-index" 4416 + checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 4417 + dependencies = [ 4418 + "aho-corasick", 4419 + "memchr", 4420 + "regex-syntax 0.8.5", 4421 + ] 4422 + 4423 + [[package]] 4424 + name = "regex-syntax" 4425 + version = "0.6.29" 4426 + source = "registry+https://github.com/rust-lang/crates.io-index" 4427 + checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 4428 + 4429 + [[package]] 4430 + name = "regex-syntax" 4431 + version = "0.8.5" 4432 + source = "registry+https://github.com/rust-lang/crates.io-index" 4433 + checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 4434 + 4435 + [[package]] 4436 + name = "renderdoc-sys" 4437 + version = "1.1.0" 4438 + source = "registry+https://github.com/rust-lang/crates.io-index" 4439 + checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 4440 + 4441 + [[package]] 4442 + name = "rgb" 4443 + version = "0.8.50" 4444 + source = "registry+https://github.com/rust-lang/crates.io-index" 4445 + checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" 4446 + 4447 + [[package]] 4448 + name = "rodio" 4449 + version = "0.20.1" 4450 + source = "registry+https://github.com/rust-lang/crates.io-index" 4451 + checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1" 4452 + dependencies = [ 4453 + "cpal", 4454 + "lewton", 4455 + ] 4456 + 4457 + [[package]] 4458 + name = "ron" 4459 + version = "0.8.1" 4460 + source = "registry+https://github.com/rust-lang/crates.io-index" 4461 + checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" 4462 + dependencies = [ 4463 + "base64 0.21.7", 4464 + "bitflags 2.9.0", 4465 + "serde", 4466 + "serde_derive", 4467 + ] 4468 + 4469 + [[package]] 4470 + name = "roxmltree" 4471 + version = "0.20.0" 4472 + source = "registry+https://github.com/rust-lang/crates.io-index" 4473 + checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" 4474 + 4475 + [[package]] 4476 + name = "rustc-hash" 4477 + version = "1.1.0" 4478 + source = "registry+https://github.com/rust-lang/crates.io-index" 4479 + checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 4480 + 4481 + [[package]] 4482 + name = "rustix" 4483 + version = "0.38.44" 4484 + source = "registry+https://github.com/rust-lang/crates.io-index" 4485 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 4486 + dependencies = [ 4487 + "bitflags 2.9.0", 4488 + "errno", 4489 + "libc", 4490 + "linux-raw-sys", 4491 + "windows-sys 0.59.0", 4492 + ] 4493 + 4494 + [[package]] 4495 + name = "rustversion" 4496 + version = "1.0.20" 4497 + source = "registry+https://github.com/rust-lang/crates.io-index" 4498 + checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 4499 + 4500 + [[package]] 4501 + name = "rustybuzz" 4502 + version = "0.14.1" 4503 + source = "registry+https://github.com/rust-lang/crates.io-index" 4504 + checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" 4505 + dependencies = [ 4506 + "bitflags 2.9.0", 4507 + "bytemuck", 4508 + "libm", 4509 + "smallvec", 4510 + "ttf-parser 0.21.1", 4511 + "unicode-bidi-mirroring", 4512 + "unicode-ccc", 4513 + "unicode-properties", 4514 + "unicode-script", 4515 + ] 4516 + 4517 + [[package]] 4518 + name = "ruzstd" 4519 + version = "0.8.1" 4520 + source = "registry+https://github.com/rust-lang/crates.io-index" 4521 + checksum = "3640bec8aad418d7d03c72ea2de10d5c646a598f9883c7babc160d91e3c1b26c" 4522 + dependencies = [ 4523 + "twox-hash", 4524 + ] 4525 + 4526 + [[package]] 4527 + name = "ryu" 4528 + version = "1.0.20" 4529 + source = "registry+https://github.com/rust-lang/crates.io-index" 4530 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 4531 + 4532 + [[package]] 4533 + name = "safe_arch" 4534 + version = "0.7.4" 4535 + source = "registry+https://github.com/rust-lang/crates.io-index" 4536 + checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" 4537 + dependencies = [ 4538 + "bytemuck", 4539 + ] 4540 + 4541 + [[package]] 4542 + name = "same-file" 4543 + version = "1.0.6" 4544 + source = "registry+https://github.com/rust-lang/crates.io-index" 4545 + checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 4546 + dependencies = [ 4547 + "winapi-util", 4548 + ] 4549 + 4550 + [[package]] 4551 + name = "scoped-tls" 4552 + version = "1.0.1" 4553 + source = "registry+https://github.com/rust-lang/crates.io-index" 4554 + checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 4555 + 4556 + [[package]] 4557 + name = "scopeguard" 4558 + version = "1.2.0" 4559 + source = "registry+https://github.com/rust-lang/crates.io-index" 4560 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 4561 + 4562 + [[package]] 4563 + name = "sctk-adwaita" 4564 + version = "0.10.1" 4565 + source = "registry+https://github.com/rust-lang/crates.io-index" 4566 + checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" 4567 + dependencies = [ 4568 + "ab_glyph", 4569 + "log", 4570 + "memmap2", 4571 + "smithay-client-toolkit", 4572 + "tiny-skia", 4573 + ] 4574 + 4575 + [[package]] 4576 + name = "self_cell" 4577 + version = "1.2.0" 4578 + source = "registry+https://github.com/rust-lang/crates.io-index" 4579 + checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" 4580 + 4581 + [[package]] 4582 + name = "send_wrapper" 4583 + version = "0.6.0" 4584 + source = "registry+https://github.com/rust-lang/crates.io-index" 4585 + checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" 4586 + 4587 + [[package]] 4588 + name = "serde" 4589 + version = "1.0.219" 4590 + source = "registry+https://github.com/rust-lang/crates.io-index" 4591 + checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 4592 + dependencies = [ 4593 + "serde_derive", 4594 + ] 4595 + 4596 + [[package]] 4597 + name = "serde_derive" 4598 + version = "1.0.219" 4599 + source = "registry+https://github.com/rust-lang/crates.io-index" 4600 + checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 4601 + dependencies = [ 4602 + "proc-macro2", 4603 + "quote", 4604 + "syn 2.0.101", 4605 + ] 4606 + 4607 + [[package]] 4608 + name = "serde_json" 4609 + version = "1.0.140" 4610 + source = "registry+https://github.com/rust-lang/crates.io-index" 4611 + checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 4612 + dependencies = [ 4613 + "itoa", 4614 + "memchr", 4615 + "ryu", 4616 + "serde", 4617 + ] 4618 + 4619 + [[package]] 4620 + name = "serde_spanned" 4621 + version = "0.6.8" 4622 + source = "registry+https://github.com/rust-lang/crates.io-index" 4623 + checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 4624 + dependencies = [ 4625 + "serde", 4626 + ] 4627 + 4628 + [[package]] 4629 + name = "sharded-slab" 4630 + version = "0.1.7" 4631 + source = "registry+https://github.com/rust-lang/crates.io-index" 4632 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 4633 + dependencies = [ 4634 + "lazy_static", 4635 + ] 4636 + 4637 + [[package]] 4638 + name = "shlex" 4639 + version = "1.3.0" 4640 + source = "registry+https://github.com/rust-lang/crates.io-index" 4641 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 4642 + 4643 + [[package]] 4644 + name = "simba" 4645 + version = "0.7.3" 4646 + source = "registry+https://github.com/rust-lang/crates.io-index" 4647 + checksum = "2f3fd720c48c53cace224ae62bef1bbff363a70c68c4802a78b5cc6159618176" 4648 + dependencies = [ 4649 + "approx", 4650 + "num-complex", 4651 + "num-traits", 4652 + "paste", 4653 + "wide", 4654 + ] 4655 + 4656 + [[package]] 4657 + name = "simd-adler32" 4658 + version = "0.3.7" 4659 + source = "registry+https://github.com/rust-lang/crates.io-index" 4660 + checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 4661 + 4662 + [[package]] 4663 + name = "simd_helpers" 4664 + version = "0.1.0" 4665 + source = "registry+https://github.com/rust-lang/crates.io-index" 4666 + checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" 4667 + dependencies = [ 4668 + "quote", 4669 + ] 4670 + 4671 + [[package]] 4672 + name = "skrifa" 4673 + version = "0.31.0" 4674 + source = "registry+https://github.com/rust-lang/crates.io-index" 4675 + checksum = "bbe6666ab11018ab91ff7b03f1a3b9fdbecfb610848436fefa5ce50343d3d913" 4676 + dependencies = [ 4677 + "bytemuck", 4678 + "read-fonts", 4679 + ] 4680 + 4681 + [[package]] 4682 + name = "slab" 4683 + version = "0.4.9" 4684 + source = "registry+https://github.com/rust-lang/crates.io-index" 4685 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 4686 + dependencies = [ 4687 + "autocfg", 4688 + ] 4689 + 4690 + [[package]] 4691 + name = "slotmap" 4692 + version = "1.0.7" 4693 + source = "registry+https://github.com/rust-lang/crates.io-index" 4694 + checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 4695 + dependencies = [ 4696 + "version_check", 4697 + ] 4698 + 4699 + [[package]] 4700 + name = "smallvec" 4701 + version = "1.15.0" 4702 + source = "registry+https://github.com/rust-lang/crates.io-index" 4703 + checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 4704 + 4705 + [[package]] 4706 + name = "smithay-client-toolkit" 4707 + version = "0.19.2" 4708 + source = "registry+https://github.com/rust-lang/crates.io-index" 4709 + checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" 4710 + dependencies = [ 4711 + "bitflags 2.9.0", 4712 + "calloop", 4713 + "calloop-wayland-source", 4714 + "cursor-icon", 4715 + "libc", 4716 + "log", 4717 + "memmap2", 4718 + "rustix", 4719 + "thiserror 1.0.69", 4720 + "wayland-backend", 4721 + "wayland-client", 4722 + "wayland-csd-frame", 4723 + "wayland-cursor", 4724 + "wayland-protocols", 4725 + "wayland-protocols-wlr", 4726 + "wayland-scanner", 4727 + "xkeysym", 4728 + ] 4729 + 4730 + [[package]] 4731 + name = "smol_str" 4732 + version = "0.2.2" 4733 + source = "registry+https://github.com/rust-lang/crates.io-index" 4734 + checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" 4735 + dependencies = [ 4736 + "serde", 4737 + ] 4738 + 4739 + [[package]] 4740 + name = "spin" 4741 + version = "0.9.8" 4742 + source = "registry+https://github.com/rust-lang/crates.io-index" 4743 + checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 4744 + dependencies = [ 4745 + "portable-atomic", 4746 + ] 4747 + 4748 + [[package]] 4749 + name = "spirv" 4750 + version = "0.3.0+sdk-1.3.268.0" 4751 + source = "registry+https://github.com/rust-lang/crates.io-index" 4752 + checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 4753 + dependencies = [ 4754 + "bitflags 2.9.0", 4755 + ] 4756 + 4757 + [[package]] 4758 + name = "stable_deref_trait" 4759 + version = "1.2.0" 4760 + source = "registry+https://github.com/rust-lang/crates.io-index" 4761 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 4762 + 4763 + [[package]] 4764 + name = "stackfuture" 4765 + version = "0.3.0" 4766 + source = "registry+https://github.com/rust-lang/crates.io-index" 4767 + checksum = "6eae92052b72ef70dafa16eddbabffc77e5ca3574be2f7bc1127b36f0a7ad7f2" 4768 + 4769 + [[package]] 4770 + name = "static_assertions" 4771 + version = "1.1.0" 4772 + source = "registry+https://github.com/rust-lang/crates.io-index" 4773 + checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 4774 + 4775 + [[package]] 4776 + name = "strict-num" 4777 + version = "0.1.1" 4778 + source = "registry+https://github.com/rust-lang/crates.io-index" 4779 + checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 4780 + 4781 + [[package]] 4782 + name = "strum" 4783 + version = "0.26.3" 4784 + source = "registry+https://github.com/rust-lang/crates.io-index" 4785 + checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 4786 + dependencies = [ 4787 + "strum_macros", 4788 + ] 4789 + 4790 + [[package]] 4791 + name = "strum_macros" 4792 + version = "0.26.4" 4793 + source = "registry+https://github.com/rust-lang/crates.io-index" 4794 + checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 4795 + dependencies = [ 4796 + "heck", 4797 + "proc-macro2", 4798 + "quote", 4799 + "rustversion", 4800 + "syn 2.0.101", 4801 + ] 4802 + 4803 + [[package]] 4804 + name = "svg_fmt" 4805 + version = "0.4.5" 4806 + source = "registry+https://github.com/rust-lang/crates.io-index" 4807 + checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" 4808 + 4809 + [[package]] 4810 + name = "swash" 4811 + version = "0.2.4" 4812 + source = "registry+https://github.com/rust-lang/crates.io-index" 4813 + checksum = "5dce3f0af95643c855cdc449fbaa17d8c2cd08e0b00a49a6babcbe6e71667f3d" 4814 + dependencies = [ 4815 + "skrifa", 4816 + "yazi", 4817 + "zeno", 4818 + ] 4819 + 4820 + [[package]] 4821 + name = "syn" 4822 + version = "1.0.109" 4823 + source = "registry+https://github.com/rust-lang/crates.io-index" 4824 + checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 4825 + dependencies = [ 4826 + "proc-macro2", 4827 + "quote", 4828 + "unicode-ident", 4829 + ] 4830 + 4831 + [[package]] 4832 + name = "syn" 4833 + version = "2.0.101" 4834 + source = "registry+https://github.com/rust-lang/crates.io-index" 4835 + checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 4836 + dependencies = [ 4837 + "proc-macro2", 4838 + "quote", 4839 + "unicode-ident", 4840 + ] 4841 + 4842 + [[package]] 4843 + name = "synstructure" 4844 + version = "0.13.2" 4845 + source = "registry+https://github.com/rust-lang/crates.io-index" 4846 + checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 4847 + dependencies = [ 4848 + "proc-macro2", 4849 + "quote", 4850 + "syn 2.0.101", 4851 + ] 4852 + 4853 + [[package]] 4854 + name = "sys-locale" 4855 + version = "0.3.2" 4856 + source = "registry+https://github.com/rust-lang/crates.io-index" 4857 + checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" 4858 + dependencies = [ 4859 + "libc", 4860 + ] 4861 + 4862 + [[package]] 4863 + name = "sysinfo" 4864 + version = "0.34.2" 4865 + source = "registry+https://github.com/rust-lang/crates.io-index" 4866 + checksum = "a4b93974b3d3aeaa036504b8eefd4c039dced109171c1ae973f1dc63b2c7e4b2" 4867 + dependencies = [ 4868 + "libc", 4869 + "memchr", 4870 + "ntapi", 4871 + "objc2-core-foundation", 4872 + "windows 0.57.0", 4873 + ] 4874 + 4875 + [[package]] 4876 + name = "system-deps" 4877 + version = "6.2.2" 4878 + source = "registry+https://github.com/rust-lang/crates.io-index" 4879 + checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 4880 + dependencies = [ 4881 + "cfg-expr", 4882 + "heck", 4883 + "pkg-config", 4884 + "toml", 4885 + "version-compare", 4886 + ] 4887 + 4888 + [[package]] 4889 + name = "taffy" 4890 + version = "0.7.7" 4891 + source = "registry+https://github.com/rust-lang/crates.io-index" 4892 + checksum = "ab4f4d046dd956a47a7e1a2947083d7ac3e6aa3cfaaead36173ceaa5ab11878c" 4893 + dependencies = [ 4894 + "arrayvec", 4895 + "grid", 4896 + "serde", 4897 + "slotmap", 4898 + ] 4899 + 4900 + [[package]] 4901 + name = "target-lexicon" 4902 + version = "0.12.16" 4903 + source = "registry+https://github.com/rust-lang/crates.io-index" 4904 + checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 4905 + 4906 + [[package]] 4907 + name = "termcolor" 4908 + version = "1.4.1" 4909 + source = "registry+https://github.com/rust-lang/crates.io-index" 4910 + checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 4911 + dependencies = [ 4912 + "winapi-util", 4913 + ] 4914 + 4915 + [[package]] 4916 + name = "thiserror" 4917 + version = "1.0.69" 4918 + source = "registry+https://github.com/rust-lang/crates.io-index" 4919 + checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 4920 + dependencies = [ 4921 + "thiserror-impl 1.0.69", 4922 + ] 4923 + 4924 + [[package]] 4925 + name = "thiserror" 4926 + version = "2.0.12" 4927 + source = "registry+https://github.com/rust-lang/crates.io-index" 4928 + checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 4929 + dependencies = [ 4930 + "thiserror-impl 2.0.12", 4931 + ] 4932 + 4933 + [[package]] 4934 + name = "thiserror-impl" 4935 + version = "1.0.69" 4936 + source = "registry+https://github.com/rust-lang/crates.io-index" 4937 + checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 4938 + dependencies = [ 4939 + "proc-macro2", 4940 + "quote", 4941 + "syn 2.0.101", 4942 + ] 4943 + 4944 + [[package]] 4945 + name = "thiserror-impl" 4946 + version = "2.0.12" 4947 + source = "registry+https://github.com/rust-lang/crates.io-index" 4948 + checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 4949 + dependencies = [ 4950 + "proc-macro2", 4951 + "quote", 4952 + "syn 2.0.101", 4953 + ] 4954 + 4955 + [[package]] 4956 + name = "thread_local" 4957 + version = "1.1.8" 4958 + source = "registry+https://github.com/rust-lang/crates.io-index" 4959 + checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 4960 + dependencies = [ 4961 + "cfg-if", 4962 + "once_cell", 4963 + ] 4964 + 4965 + [[package]] 4966 + name = "tiff" 4967 + version = "0.9.1" 4968 + source = "registry+https://github.com/rust-lang/crates.io-index" 4969 + checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 4970 + dependencies = [ 4971 + "flate2", 4972 + "jpeg-decoder", 4973 + "weezl", 4974 + ] 4975 + 4976 + [[package]] 4977 + name = "tiny-skia" 4978 + version = "0.11.4" 4979 + source = "registry+https://github.com/rust-lang/crates.io-index" 4980 + checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" 4981 + dependencies = [ 4982 + "arrayref", 4983 + "arrayvec", 4984 + "bytemuck", 4985 + "cfg-if", 4986 + "log", 4987 + "tiny-skia-path", 4988 + ] 4989 + 4990 + [[package]] 4991 + name = "tiny-skia-path" 4992 + version = "0.11.4" 4993 + source = "registry+https://github.com/rust-lang/crates.io-index" 4994 + checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 4995 + dependencies = [ 4996 + "arrayref", 4997 + "bytemuck", 4998 + "strict-num", 4999 + ] 5000 + 5001 + [[package]] 5002 + name = "tinystr" 5003 + version = "0.8.1" 5004 + source = "registry+https://github.com/rust-lang/crates.io-index" 5005 + checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 5006 + dependencies = [ 5007 + "displaydoc", 5008 + "zerovec", 5009 + ] 5010 + 5011 + [[package]] 5012 + name = "tinyvec" 5013 + version = "1.9.0" 5014 + source = "registry+https://github.com/rust-lang/crates.io-index" 5015 + checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 5016 + dependencies = [ 5017 + "tinyvec_macros", 5018 + ] 5019 + 5020 + [[package]] 5021 + name = "tinyvec_macros" 5022 + version = "0.1.1" 5023 + source = "registry+https://github.com/rust-lang/crates.io-index" 5024 + checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 5025 + 5026 + [[package]] 5027 + name = "toml" 5028 + version = "0.8.22" 5029 + source = "registry+https://github.com/rust-lang/crates.io-index" 5030 + checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" 5031 + dependencies = [ 5032 + "serde", 5033 + "serde_spanned", 5034 + "toml_datetime", 5035 + "toml_edit", 5036 + ] 5037 + 5038 + [[package]] 5039 + name = "toml_datetime" 5040 + version = "0.6.9" 5041 + source = "registry+https://github.com/rust-lang/crates.io-index" 5042 + checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" 5043 + dependencies = [ 5044 + "serde", 5045 + ] 5046 + 5047 + [[package]] 5048 + name = "toml_edit" 5049 + version = "0.22.26" 5050 + source = "registry+https://github.com/rust-lang/crates.io-index" 5051 + checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" 5052 + dependencies = [ 5053 + "indexmap", 5054 + "serde", 5055 + "serde_spanned", 5056 + "toml_datetime", 5057 + "winnow", 5058 + ] 5059 + 5060 + [[package]] 5061 + name = "tracing" 5062 + version = "0.1.41" 5063 + source = "registry+https://github.com/rust-lang/crates.io-index" 5064 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 5065 + dependencies = [ 5066 + "pin-project-lite", 5067 + "tracing-attributes", 5068 + "tracing-core", 5069 + ] 5070 + 5071 + [[package]] 5072 + name = "tracing-attributes" 5073 + version = "0.1.28" 5074 + source = "registry+https://github.com/rust-lang/crates.io-index" 5075 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 5076 + dependencies = [ 5077 + "proc-macro2", 5078 + "quote", 5079 + "syn 2.0.101", 5080 + ] 5081 + 5082 + [[package]] 5083 + name = "tracing-core" 5084 + version = "0.1.33" 5085 + source = "registry+https://github.com/rust-lang/crates.io-index" 5086 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 5087 + dependencies = [ 5088 + "once_cell", 5089 + "valuable", 5090 + ] 5091 + 5092 + [[package]] 5093 + name = "tracing-log" 5094 + version = "0.2.0" 5095 + source = "registry+https://github.com/rust-lang/crates.io-index" 5096 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 5097 + dependencies = [ 5098 + "log", 5099 + "once_cell", 5100 + "tracing-core", 5101 + ] 5102 + 5103 + [[package]] 5104 + name = "tracing-oslog" 5105 + version = "0.2.0" 5106 + source = "registry+https://github.com/rust-lang/crates.io-index" 5107 + checksum = "528bdd1f0e27b5dd9a4ededf154e824b0532731e4af73bb531de46276e0aab1e" 5108 + dependencies = [ 5109 + "bindgen", 5110 + "cc", 5111 + "cfg-if", 5112 + "once_cell", 5113 + "parking_lot", 5114 + "tracing-core", 5115 + "tracing-subscriber", 5116 + ] 5117 + 5118 + [[package]] 5119 + name = "tracing-subscriber" 5120 + version = "0.3.19" 5121 + source = "registry+https://github.com/rust-lang/crates.io-index" 5122 + checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 5123 + dependencies = [ 5124 + "matchers", 5125 + "nu-ansi-term", 5126 + "once_cell", 5127 + "regex", 5128 + "sharded-slab", 5129 + "smallvec", 5130 + "thread_local", 5131 + "tracing", 5132 + "tracing-core", 5133 + "tracing-log", 5134 + ] 5135 + 5136 + [[package]] 5137 + name = "tracing-wasm" 5138 + version = "0.2.1" 5139 + source = "registry+https://github.com/rust-lang/crates.io-index" 5140 + checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" 5141 + dependencies = [ 5142 + "tracing", 5143 + "tracing-subscriber", 5144 + "wasm-bindgen", 5145 + ] 5146 + 5147 + [[package]] 5148 + name = "ttf-parser" 5149 + version = "0.20.0" 5150 + source = "registry+https://github.com/rust-lang/crates.io-index" 5151 + checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" 5152 + 5153 + [[package]] 5154 + name = "ttf-parser" 5155 + version = "0.21.1" 5156 + source = "registry+https://github.com/rust-lang/crates.io-index" 5157 + checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" 5158 + 5159 + [[package]] 5160 + name = "ttf-parser" 5161 + version = "0.25.1" 5162 + source = "registry+https://github.com/rust-lang/crates.io-index" 5163 + checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 5164 + 5165 + [[package]] 5166 + name = "twox-hash" 5167 + version = "2.1.0" 5168 + source = "registry+https://github.com/rust-lang/crates.io-index" 5169 + checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" 5170 + 5171 + [[package]] 5172 + name = "typeid" 5173 + version = "1.0.3" 5174 + source = "registry+https://github.com/rust-lang/crates.io-index" 5175 + checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" 5176 + 5177 + [[package]] 5178 + name = "typenum" 5179 + version = "1.18.0" 5180 + source = "registry+https://github.com/rust-lang/crates.io-index" 5181 + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 5182 + 5183 + [[package]] 5184 + name = "unicode-bidi" 5185 + version = "0.3.18" 5186 + source = "registry+https://github.com/rust-lang/crates.io-index" 5187 + checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 5188 + 5189 + [[package]] 5190 + name = "unicode-bidi-mirroring" 5191 + version = "0.2.0" 5192 + source = "registry+https://github.com/rust-lang/crates.io-index" 5193 + checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" 5194 + 5195 + [[package]] 5196 + name = "unicode-ccc" 5197 + version = "0.2.0" 5198 + source = "registry+https://github.com/rust-lang/crates.io-index" 5199 + checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" 5200 + 5201 + [[package]] 5202 + name = "unicode-ident" 5203 + version = "1.0.18" 5204 + source = "registry+https://github.com/rust-lang/crates.io-index" 5205 + checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 5206 + 5207 + [[package]] 5208 + name = "unicode-linebreak" 5209 + version = "0.1.5" 5210 + source = "registry+https://github.com/rust-lang/crates.io-index" 5211 + checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" 5212 + 5213 + [[package]] 5214 + name = "unicode-properties" 5215 + version = "0.1.3" 5216 + source = "registry+https://github.com/rust-lang/crates.io-index" 5217 + checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 5218 + 5219 + [[package]] 5220 + name = "unicode-script" 5221 + version = "0.5.7" 5222 + source = "registry+https://github.com/rust-lang/crates.io-index" 5223 + checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" 5224 + 5225 + [[package]] 5226 + name = "unicode-segmentation" 5227 + version = "1.12.0" 5228 + source = "registry+https://github.com/rust-lang/crates.io-index" 5229 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 5230 + 5231 + [[package]] 5232 + name = "unicode-width" 5233 + version = "0.1.14" 5234 + source = "registry+https://github.com/rust-lang/crates.io-index" 5235 + checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 5236 + 5237 + [[package]] 5238 + name = "unicode-xid" 5239 + version = "0.2.6" 5240 + source = "registry+https://github.com/rust-lang/crates.io-index" 5241 + checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 5242 + 5243 + [[package]] 5244 + name = "url" 5245 + version = "2.5.4" 5246 + source = "registry+https://github.com/rust-lang/crates.io-index" 5247 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 5248 + dependencies = [ 5249 + "form_urlencoded", 5250 + "idna", 5251 + "percent-encoding", 5252 + ] 5253 + 5254 + [[package]] 5255 + name = "utf8_iter" 5256 + version = "1.0.4" 5257 + source = "registry+https://github.com/rust-lang/crates.io-index" 5258 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 5259 + 5260 + [[package]] 5261 + name = "uuid" 5262 + version = "1.16.0" 5263 + source = "registry+https://github.com/rust-lang/crates.io-index" 5264 + checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" 5265 + dependencies = [ 5266 + "getrandom 0.3.3", 5267 + "js-sys", 5268 + "serde", 5269 + "wasm-bindgen", 5270 + ] 5271 + 5272 + [[package]] 5273 + name = "v_frame" 5274 + version = "0.3.8" 5275 + source = "registry+https://github.com/rust-lang/crates.io-index" 5276 + checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" 5277 + dependencies = [ 5278 + "aligned-vec", 5279 + "num-traits", 5280 + "wasm-bindgen", 5281 + ] 5282 + 5283 + [[package]] 5284 + name = "valuable" 5285 + version = "0.1.1" 5286 + source = "registry+https://github.com/rust-lang/crates.io-index" 5287 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 5288 + 5289 + [[package]] 5290 + name = "variadics_please" 5291 + version = "1.1.0" 5292 + source = "registry+https://github.com/rust-lang/crates.io-index" 5293 + checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" 5294 + dependencies = [ 5295 + "proc-macro2", 5296 + "quote", 5297 + "syn 2.0.101", 5298 + ] 5299 + 5300 + [[package]] 5301 + name = "vec_map" 5302 + version = "0.8.2" 5303 + source = "registry+https://github.com/rust-lang/crates.io-index" 5304 + checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 5305 + 5306 + [[package]] 5307 + name = "vee" 5308 + version = "0.1.0" 5309 + dependencies = [ 5310 + "bevy", 5311 + "bevy_egui", 5312 + "binrw", 5313 + "flate2", 5314 + "glam 0.30.3", 5315 + "half", 5316 + "mesh-tools", 5317 + ] 5318 + 5319 + [[package]] 5320 + name = "version-compare" 5321 + version = "0.2.0" 5322 + source = "registry+https://github.com/rust-lang/crates.io-index" 5323 + checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 5324 + 5325 + [[package]] 5326 + name = "version_check" 5327 + version = "0.9.5" 5328 + source = "registry+https://github.com/rust-lang/crates.io-index" 5329 + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 5330 + 5331 + [[package]] 5332 + name = "walkdir" 5333 + version = "2.5.0" 5334 + source = "registry+https://github.com/rust-lang/crates.io-index" 5335 + checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 5336 + dependencies = [ 5337 + "same-file", 5338 + "winapi-util", 5339 + ] 5340 + 5341 + [[package]] 5342 + name = "wasi" 5343 + version = "0.11.0+wasi-snapshot-preview1" 5344 + source = "registry+https://github.com/rust-lang/crates.io-index" 5345 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 5346 + 5347 + [[package]] 5348 + name = "wasi" 5349 + version = "0.14.2+wasi-0.2.4" 5350 + source = "registry+https://github.com/rust-lang/crates.io-index" 5351 + checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 5352 + dependencies = [ 5353 + "wit-bindgen-rt", 5354 + ] 5355 + 5356 + [[package]] 5357 + name = "wasm-bindgen" 5358 + version = "0.2.100" 5359 + source = "registry+https://github.com/rust-lang/crates.io-index" 5360 + checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 5361 + dependencies = [ 5362 + "cfg-if", 5363 + "once_cell", 5364 + "rustversion", 5365 + "wasm-bindgen-macro", 5366 + ] 5367 + 5368 + [[package]] 5369 + name = "wasm-bindgen-backend" 5370 + version = "0.2.100" 5371 + source = "registry+https://github.com/rust-lang/crates.io-index" 5372 + checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 5373 + dependencies = [ 5374 + "bumpalo", 5375 + "log", 5376 + "proc-macro2", 5377 + "quote", 5378 + "syn 2.0.101", 5379 + "wasm-bindgen-shared", 5380 + ] 5381 + 5382 + [[package]] 5383 + name = "wasm-bindgen-futures" 5384 + version = "0.4.50" 5385 + source = "registry+https://github.com/rust-lang/crates.io-index" 5386 + checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 5387 + dependencies = [ 5388 + "cfg-if", 5389 + "js-sys", 5390 + "once_cell", 5391 + "wasm-bindgen", 5392 + "web-sys", 5393 + ] 5394 + 5395 + [[package]] 5396 + name = "wasm-bindgen-macro" 5397 + version = "0.2.100" 5398 + source = "registry+https://github.com/rust-lang/crates.io-index" 5399 + checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 5400 + dependencies = [ 5401 + "quote", 5402 + "wasm-bindgen-macro-support", 5403 + ] 5404 + 5405 + [[package]] 5406 + name = "wasm-bindgen-macro-support" 5407 + version = "0.2.100" 5408 + source = "registry+https://github.com/rust-lang/crates.io-index" 5409 + checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 5410 + dependencies = [ 5411 + "proc-macro2", 5412 + "quote", 5413 + "syn 2.0.101", 5414 + "wasm-bindgen-backend", 5415 + "wasm-bindgen-shared", 5416 + ] 5417 + 5418 + [[package]] 5419 + name = "wasm-bindgen-shared" 5420 + version = "0.2.100" 5421 + source = "registry+https://github.com/rust-lang/crates.io-index" 5422 + checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 5423 + dependencies = [ 5424 + "unicode-ident", 5425 + ] 5426 + 5427 + [[package]] 5428 + name = "wayland-backend" 5429 + version = "0.3.10" 5430 + source = "registry+https://github.com/rust-lang/crates.io-index" 5431 + checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" 5432 + dependencies = [ 5433 + "cc", 5434 + "downcast-rs 1.2.1", 5435 + "rustix", 5436 + "scoped-tls", 5437 + "smallvec", 5438 + "wayland-sys", 5439 + ] 5440 + 5441 + [[package]] 5442 + name = "wayland-client" 5443 + version = "0.31.10" 5444 + source = "registry+https://github.com/rust-lang/crates.io-index" 5445 + checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" 5446 + dependencies = [ 5447 + "bitflags 2.9.0", 5448 + "rustix", 5449 + "wayland-backend", 5450 + "wayland-scanner", 5451 + ] 5452 + 5453 + [[package]] 5454 + name = "wayland-csd-frame" 5455 + version = "0.3.0" 5456 + source = "registry+https://github.com/rust-lang/crates.io-index" 5457 + checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" 5458 + dependencies = [ 5459 + "bitflags 2.9.0", 5460 + "cursor-icon", 5461 + "wayland-backend", 5462 + ] 5463 + 5464 + [[package]] 5465 + name = "wayland-cursor" 5466 + version = "0.31.10" 5467 + source = "registry+https://github.com/rust-lang/crates.io-index" 5468 + checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" 5469 + dependencies = [ 5470 + "rustix", 5471 + "wayland-client", 5472 + "xcursor", 5473 + ] 5474 + 5475 + [[package]] 5476 + name = "wayland-protocols" 5477 + version = "0.32.8" 5478 + source = "registry+https://github.com/rust-lang/crates.io-index" 5479 + checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" 5480 + dependencies = [ 5481 + "bitflags 2.9.0", 5482 + "wayland-backend", 5483 + "wayland-client", 5484 + "wayland-scanner", 5485 + ] 5486 + 5487 + [[package]] 5488 + name = "wayland-protocols-plasma" 5489 + version = "0.3.8" 5490 + source = "registry+https://github.com/rust-lang/crates.io-index" 5491 + checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" 5492 + dependencies = [ 5493 + "bitflags 2.9.0", 5494 + "wayland-backend", 5495 + "wayland-client", 5496 + "wayland-protocols", 5497 + "wayland-scanner", 5498 + ] 5499 + 5500 + [[package]] 5501 + name = "wayland-protocols-wlr" 5502 + version = "0.3.8" 5503 + source = "registry+https://github.com/rust-lang/crates.io-index" 5504 + checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" 5505 + dependencies = [ 5506 + "bitflags 2.9.0", 5507 + "wayland-backend", 5508 + "wayland-client", 5509 + "wayland-protocols", 5510 + "wayland-scanner", 5511 + ] 5512 + 5513 + [[package]] 5514 + name = "wayland-scanner" 5515 + version = "0.31.6" 5516 + source = "registry+https://github.com/rust-lang/crates.io-index" 5517 + checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" 5518 + dependencies = [ 5519 + "proc-macro2", 5520 + "quick-xml", 5521 + "quote", 5522 + ] 5523 + 5524 + [[package]] 5525 + name = "wayland-sys" 5526 + version = "0.31.6" 5527 + source = "registry+https://github.com/rust-lang/crates.io-index" 5528 + checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" 5529 + dependencies = [ 5530 + "dlib", 5531 + "log", 5532 + "once_cell", 5533 + "pkg-config", 5534 + ] 5535 + 5536 + [[package]] 5537 + name = "web-sys" 5538 + version = "0.3.77" 5539 + source = "registry+https://github.com/rust-lang/crates.io-index" 5540 + checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 5541 + dependencies = [ 5542 + "js-sys", 5543 + "wasm-bindgen", 5544 + ] 5545 + 5546 + [[package]] 5547 + name = "web-time" 5548 + version = "1.1.0" 5549 + source = "registry+https://github.com/rust-lang/crates.io-index" 5550 + checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 5551 + dependencies = [ 5552 + "js-sys", 5553 + "wasm-bindgen", 5554 + ] 5555 + 5556 + [[package]] 5557 + name = "webbrowser" 5558 + version = "1.0.4" 5559 + source = "registry+https://github.com/rust-lang/crates.io-index" 5560 + checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e" 5561 + dependencies = [ 5562 + "core-foundation 0.10.0", 5563 + "home", 5564 + "jni", 5565 + "log", 5566 + "ndk-context", 5567 + "objc2 0.6.1", 5568 + "objc2-foundation 0.3.1", 5569 + "url", 5570 + "web-sys", 5571 + ] 5572 + 5573 + [[package]] 5574 + name = "weezl" 5575 + version = "0.1.8" 5576 + source = "registry+https://github.com/rust-lang/crates.io-index" 5577 + checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 5578 + 5579 + [[package]] 5580 + name = "wgpu" 5581 + version = "24.0.3" 5582 + source = "registry+https://github.com/rust-lang/crates.io-index" 5583 + checksum = "35904fb00ba2d2e0a4d002fcbbb6e1b89b574d272a50e5fc95f6e81cf281c245" 5584 + dependencies = [ 5585 + "arrayvec", 5586 + "bitflags 2.9.0", 5587 + "cfg_aliases", 5588 + "document-features", 5589 + "js-sys", 5590 + "log", 5591 + "naga", 5592 + "parking_lot", 5593 + "profiling", 5594 + "raw-window-handle", 5595 + "smallvec", 5596 + "static_assertions", 5597 + "wasm-bindgen", 5598 + "wasm-bindgen-futures", 5599 + "web-sys", 5600 + "wgpu-core", 5601 + "wgpu-hal", 5602 + "wgpu-types", 5603 + ] 5604 + 5605 + [[package]] 5606 + name = "wgpu-core" 5607 + version = "24.0.2" 5608 + source = "registry+https://github.com/rust-lang/crates.io-index" 5609 + checksum = "671c25545d479b47d3f0a8e373aceb2060b67c6eb841b24ac8c32348151c7a0c" 5610 + dependencies = [ 5611 + "arrayvec", 5612 + "bit-vec 0.8.0", 5613 + "bitflags 2.9.0", 5614 + "cfg_aliases", 5615 + "document-features", 5616 + "indexmap", 5617 + "log", 5618 + "naga", 5619 + "once_cell", 5620 + "parking_lot", 5621 + "profiling", 5622 + "raw-window-handle", 5623 + "rustc-hash", 5624 + "smallvec", 5625 + "thiserror 2.0.12", 5626 + "wgpu-hal", 5627 + "wgpu-types", 5628 + ] 5629 + 5630 + [[package]] 5631 + name = "wgpu-hal" 5632 + version = "24.0.4" 5633 + source = "registry+https://github.com/rust-lang/crates.io-index" 5634 + checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" 5635 + dependencies = [ 5636 + "android_system_properties", 5637 + "arrayvec", 5638 + "ash", 5639 + "bit-set 0.8.0", 5640 + "bitflags 2.9.0", 5641 + "block", 5642 + "bytemuck", 5643 + "cfg_aliases", 5644 + "core-graphics-types", 5645 + "glow", 5646 + "glutin_wgl_sys", 5647 + "gpu-alloc", 5648 + "gpu-allocator", 5649 + "gpu-descriptor", 5650 + "js-sys", 5651 + "khronos-egl", 5652 + "libc", 5653 + "libloading", 5654 + "log", 5655 + "metal", 5656 + "naga", 5657 + "ndk-sys 0.5.0+25.2.9519653", 5658 + "objc", 5659 + "once_cell", 5660 + "ordered-float", 5661 + "parking_lot", 5662 + "profiling", 5663 + "range-alloc", 5664 + "raw-window-handle", 5665 + "renderdoc-sys", 5666 + "rustc-hash", 5667 + "smallvec", 5668 + "thiserror 2.0.12", 5669 + "wasm-bindgen", 5670 + "web-sys", 5671 + "wgpu-types", 5672 + "windows 0.58.0", 5673 + "windows-core 0.58.0", 5674 + ] 5675 + 5676 + [[package]] 5677 + name = "wgpu-types" 5678 + version = "24.0.0" 5679 + source = "registry+https://github.com/rust-lang/crates.io-index" 5680 + checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" 5681 + dependencies = [ 5682 + "bitflags 2.9.0", 5683 + "js-sys", 5684 + "log", 5685 + "serde", 5686 + "web-sys", 5687 + ] 5688 + 5689 + [[package]] 5690 + name = "wide" 5691 + version = "0.7.32" 5692 + source = "registry+https://github.com/rust-lang/crates.io-index" 5693 + checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" 5694 + dependencies = [ 5695 + "bytemuck", 5696 + "safe_arch", 5697 + ] 5698 + 5699 + [[package]] 5700 + name = "winapi" 5701 + version = "0.3.9" 5702 + source = "registry+https://github.com/rust-lang/crates.io-index" 5703 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 5704 + dependencies = [ 5705 + "winapi-i686-pc-windows-gnu", 5706 + "winapi-x86_64-pc-windows-gnu", 5707 + ] 5708 + 5709 + [[package]] 5710 + name = "winapi-i686-pc-windows-gnu" 5711 + version = "0.4.0" 5712 + source = "registry+https://github.com/rust-lang/crates.io-index" 5713 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 5714 + 5715 + [[package]] 5716 + name = "winapi-util" 5717 + version = "0.1.9" 5718 + source = "registry+https://github.com/rust-lang/crates.io-index" 5719 + checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 5720 + dependencies = [ 5721 + "windows-sys 0.59.0", 5722 + ] 5723 + 5724 + [[package]] 5725 + name = "winapi-x86_64-pc-windows-gnu" 5726 + version = "0.4.0" 5727 + source = "registry+https://github.com/rust-lang/crates.io-index" 5728 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 5729 + 5730 + [[package]] 5731 + name = "windows" 5732 + version = "0.54.0" 5733 + source = "registry+https://github.com/rust-lang/crates.io-index" 5734 + checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" 5735 + dependencies = [ 5736 + "windows-core 0.54.0", 5737 + "windows-targets 0.52.6", 5738 + ] 5739 + 5740 + [[package]] 5741 + name = "windows" 5742 + version = "0.57.0" 5743 + source = "registry+https://github.com/rust-lang/crates.io-index" 5744 + checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" 5745 + dependencies = [ 5746 + "windows-core 0.57.0", 5747 + "windows-targets 0.52.6", 5748 + ] 5749 + 5750 + [[package]] 5751 + name = "windows" 5752 + version = "0.58.0" 5753 + source = "registry+https://github.com/rust-lang/crates.io-index" 5754 + checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 5755 + dependencies = [ 5756 + "windows-core 0.58.0", 5757 + "windows-targets 0.52.6", 5758 + ] 5759 + 5760 + [[package]] 5761 + name = "windows" 5762 + version = "0.61.1" 5763 + source = "registry+https://github.com/rust-lang/crates.io-index" 5764 + checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" 5765 + dependencies = [ 5766 + "windows-collections", 5767 + "windows-core 0.61.0", 5768 + "windows-future", 5769 + "windows-link", 5770 + "windows-numerics", 5771 + ] 5772 + 5773 + [[package]] 5774 + name = "windows-collections" 5775 + version = "0.2.0" 5776 + source = "registry+https://github.com/rust-lang/crates.io-index" 5777 + checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 5778 + dependencies = [ 5779 + "windows-core 0.61.0", 5780 + ] 5781 + 5782 + [[package]] 5783 + name = "windows-core" 5784 + version = "0.54.0" 5785 + source = "registry+https://github.com/rust-lang/crates.io-index" 5786 + checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" 5787 + dependencies = [ 5788 + "windows-result 0.1.2", 5789 + "windows-targets 0.52.6", 5790 + ] 5791 + 5792 + [[package]] 5793 + name = "windows-core" 5794 + version = "0.57.0" 5795 + source = "registry+https://github.com/rust-lang/crates.io-index" 5796 + checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" 5797 + dependencies = [ 5798 + "windows-implement 0.57.0", 5799 + "windows-interface 0.57.0", 5800 + "windows-result 0.1.2", 5801 + "windows-targets 0.52.6", 5802 + ] 5803 + 5804 + [[package]] 5805 + name = "windows-core" 5806 + version = "0.58.0" 5807 + source = "registry+https://github.com/rust-lang/crates.io-index" 5808 + checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 5809 + dependencies = [ 5810 + "windows-implement 0.58.0", 5811 + "windows-interface 0.58.0", 5812 + "windows-result 0.2.0", 5813 + "windows-strings 0.1.0", 5814 + "windows-targets 0.52.6", 5815 + ] 5816 + 5817 + [[package]] 5818 + name = "windows-core" 5819 + version = "0.61.0" 5820 + source = "registry+https://github.com/rust-lang/crates.io-index" 5821 + checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 5822 + dependencies = [ 5823 + "windows-implement 0.60.0", 5824 + "windows-interface 0.59.1", 5825 + "windows-link", 5826 + "windows-result 0.3.2", 5827 + "windows-strings 0.4.0", 5828 + ] 5829 + 5830 + [[package]] 5831 + name = "windows-future" 5832 + version = "0.2.0" 5833 + source = "registry+https://github.com/rust-lang/crates.io-index" 5834 + checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" 5835 + dependencies = [ 5836 + "windows-core 0.61.0", 5837 + "windows-link", 5838 + ] 5839 + 5840 + [[package]] 5841 + name = "windows-implement" 5842 + version = "0.57.0" 5843 + source = "registry+https://github.com/rust-lang/crates.io-index" 5844 + checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" 5845 + dependencies = [ 5846 + "proc-macro2", 5847 + "quote", 5848 + "syn 2.0.101", 5849 + ] 5850 + 5851 + [[package]] 5852 + name = "windows-implement" 5853 + version = "0.58.0" 5854 + source = "registry+https://github.com/rust-lang/crates.io-index" 5855 + checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 5856 + dependencies = [ 5857 + "proc-macro2", 5858 + "quote", 5859 + "syn 2.0.101", 5860 + ] 5861 + 5862 + [[package]] 5863 + name = "windows-implement" 5864 + version = "0.60.0" 5865 + source = "registry+https://github.com/rust-lang/crates.io-index" 5866 + checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 5867 + dependencies = [ 5868 + "proc-macro2", 5869 + "quote", 5870 + "syn 2.0.101", 5871 + ] 5872 + 5873 + [[package]] 5874 + name = "windows-interface" 5875 + version = "0.57.0" 5876 + source = "registry+https://github.com/rust-lang/crates.io-index" 5877 + checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" 5878 + dependencies = [ 5879 + "proc-macro2", 5880 + "quote", 5881 + "syn 2.0.101", 5882 + ] 5883 + 5884 + [[package]] 5885 + name = "windows-interface" 5886 + version = "0.58.0" 5887 + source = "registry+https://github.com/rust-lang/crates.io-index" 5888 + checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" 5889 + dependencies = [ 5890 + "proc-macro2", 5891 + "quote", 5892 + "syn 2.0.101", 5893 + ] 5894 + 5895 + [[package]] 5896 + name = "windows-interface" 5897 + version = "0.59.1" 5898 + source = "registry+https://github.com/rust-lang/crates.io-index" 5899 + checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 5900 + dependencies = [ 5901 + "proc-macro2", 5902 + "quote", 5903 + "syn 2.0.101", 5904 + ] 5905 + 5906 + [[package]] 5907 + name = "windows-link" 5908 + version = "0.1.1" 5909 + source = "registry+https://github.com/rust-lang/crates.io-index" 5910 + checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 5911 + 5912 + [[package]] 5913 + name = "windows-numerics" 5914 + version = "0.2.0" 5915 + source = "registry+https://github.com/rust-lang/crates.io-index" 5916 + checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 5917 + dependencies = [ 5918 + "windows-core 0.61.0", 5919 + "windows-link", 5920 + ] 5921 + 5922 + [[package]] 5923 + name = "windows-result" 5924 + version = "0.1.2" 5925 + source = "registry+https://github.com/rust-lang/crates.io-index" 5926 + checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" 5927 + dependencies = [ 5928 + "windows-targets 0.52.6", 5929 + ] 5930 + 5931 + [[package]] 5932 + name = "windows-result" 5933 + version = "0.2.0" 5934 + source = "registry+https://github.com/rust-lang/crates.io-index" 5935 + checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 5936 + dependencies = [ 5937 + "windows-targets 0.52.6", 5938 + ] 5939 + 5940 + [[package]] 5941 + name = "windows-result" 5942 + version = "0.3.2" 5943 + source = "registry+https://github.com/rust-lang/crates.io-index" 5944 + checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 5945 + dependencies = [ 5946 + "windows-link", 5947 + ] 5948 + 5949 + [[package]] 5950 + name = "windows-strings" 5951 + version = "0.1.0" 5952 + source = "registry+https://github.com/rust-lang/crates.io-index" 5953 + checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 5954 + dependencies = [ 5955 + "windows-result 0.2.0", 5956 + "windows-targets 0.52.6", 5957 + ] 5958 + 5959 + [[package]] 5960 + name = "windows-strings" 5961 + version = "0.4.0" 5962 + source = "registry+https://github.com/rust-lang/crates.io-index" 5963 + checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 5964 + dependencies = [ 5965 + "windows-link", 5966 + ] 5967 + 5968 + [[package]] 5969 + name = "windows-sys" 5970 + version = "0.45.0" 5971 + source = "registry+https://github.com/rust-lang/crates.io-index" 5972 + checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 5973 + dependencies = [ 5974 + "windows-targets 0.42.2", 5975 + ] 5976 + 5977 + [[package]] 5978 + name = "windows-sys" 5979 + version = "0.52.0" 5980 + source = "registry+https://github.com/rust-lang/crates.io-index" 5981 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 5982 + dependencies = [ 5983 + "windows-targets 0.52.6", 5984 + ] 5985 + 5986 + [[package]] 5987 + name = "windows-sys" 5988 + version = "0.59.0" 5989 + source = "registry+https://github.com/rust-lang/crates.io-index" 5990 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 5991 + dependencies = [ 5992 + "windows-targets 0.52.6", 5993 + ] 5994 + 5995 + [[package]] 5996 + name = "windows-targets" 5997 + version = "0.42.2" 5998 + source = "registry+https://github.com/rust-lang/crates.io-index" 5999 + checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 6000 + dependencies = [ 6001 + "windows_aarch64_gnullvm 0.42.2", 6002 + "windows_aarch64_msvc 0.42.2", 6003 + "windows_i686_gnu 0.42.2", 6004 + "windows_i686_msvc 0.42.2", 6005 + "windows_x86_64_gnu 0.42.2", 6006 + "windows_x86_64_gnullvm 0.42.2", 6007 + "windows_x86_64_msvc 0.42.2", 6008 + ] 6009 + 6010 + [[package]] 6011 + name = "windows-targets" 6012 + version = "0.48.5" 6013 + source = "registry+https://github.com/rust-lang/crates.io-index" 6014 + checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 6015 + dependencies = [ 6016 + "windows_aarch64_gnullvm 0.48.5", 6017 + "windows_aarch64_msvc 0.48.5", 6018 + "windows_i686_gnu 0.48.5", 6019 + "windows_i686_msvc 0.48.5", 6020 + "windows_x86_64_gnu 0.48.5", 6021 + "windows_x86_64_gnullvm 0.48.5", 6022 + "windows_x86_64_msvc 0.48.5", 6023 + ] 6024 + 6025 + [[package]] 6026 + name = "windows-targets" 6027 + version = "0.52.6" 6028 + source = "registry+https://github.com/rust-lang/crates.io-index" 6029 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 6030 + dependencies = [ 6031 + "windows_aarch64_gnullvm 0.52.6", 6032 + "windows_aarch64_msvc 0.52.6", 6033 + "windows_i686_gnu 0.52.6", 6034 + "windows_i686_gnullvm", 6035 + "windows_i686_msvc 0.52.6", 6036 + "windows_x86_64_gnu 0.52.6", 6037 + "windows_x86_64_gnullvm 0.52.6", 6038 + "windows_x86_64_msvc 0.52.6", 6039 + ] 6040 + 6041 + [[package]] 6042 + name = "windows_aarch64_gnullvm" 6043 + version = "0.42.2" 6044 + source = "registry+https://github.com/rust-lang/crates.io-index" 6045 + checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 6046 + 6047 + [[package]] 6048 + name = "windows_aarch64_gnullvm" 6049 + version = "0.48.5" 6050 + source = "registry+https://github.com/rust-lang/crates.io-index" 6051 + checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 6052 + 6053 + [[package]] 6054 + name = "windows_aarch64_gnullvm" 6055 + version = "0.52.6" 6056 + source = "registry+https://github.com/rust-lang/crates.io-index" 6057 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 6058 + 6059 + [[package]] 6060 + name = "windows_aarch64_msvc" 6061 + version = "0.42.2" 6062 + source = "registry+https://github.com/rust-lang/crates.io-index" 6063 + checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 6064 + 6065 + [[package]] 6066 + name = "windows_aarch64_msvc" 6067 + version = "0.48.5" 6068 + source = "registry+https://github.com/rust-lang/crates.io-index" 6069 + checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 6070 + 6071 + [[package]] 6072 + name = "windows_aarch64_msvc" 6073 + version = "0.52.6" 6074 + source = "registry+https://github.com/rust-lang/crates.io-index" 6075 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 6076 + 6077 + [[package]] 6078 + name = "windows_i686_gnu" 6079 + version = "0.42.2" 6080 + source = "registry+https://github.com/rust-lang/crates.io-index" 6081 + checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 6082 + 6083 + [[package]] 6084 + name = "windows_i686_gnu" 6085 + version = "0.48.5" 6086 + source = "registry+https://github.com/rust-lang/crates.io-index" 6087 + checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 6088 + 6089 + [[package]] 6090 + name = "windows_i686_gnu" 6091 + version = "0.52.6" 6092 + source = "registry+https://github.com/rust-lang/crates.io-index" 6093 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 6094 + 6095 + [[package]] 6096 + name = "windows_i686_gnullvm" 6097 + version = "0.52.6" 6098 + source = "registry+https://github.com/rust-lang/crates.io-index" 6099 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 6100 + 6101 + [[package]] 6102 + name = "windows_i686_msvc" 6103 + version = "0.42.2" 6104 + source = "registry+https://github.com/rust-lang/crates.io-index" 6105 + checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 6106 + 6107 + [[package]] 6108 + name = "windows_i686_msvc" 6109 + version = "0.48.5" 6110 + source = "registry+https://github.com/rust-lang/crates.io-index" 6111 + checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 6112 + 6113 + [[package]] 6114 + name = "windows_i686_msvc" 6115 + version = "0.52.6" 6116 + source = "registry+https://github.com/rust-lang/crates.io-index" 6117 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 6118 + 6119 + [[package]] 6120 + name = "windows_x86_64_gnu" 6121 + version = "0.42.2" 6122 + source = "registry+https://github.com/rust-lang/crates.io-index" 6123 + checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 6124 + 6125 + [[package]] 6126 + name = "windows_x86_64_gnu" 6127 + version = "0.48.5" 6128 + source = "registry+https://github.com/rust-lang/crates.io-index" 6129 + checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 6130 + 6131 + [[package]] 6132 + name = "windows_x86_64_gnu" 6133 + version = "0.52.6" 6134 + source = "registry+https://github.com/rust-lang/crates.io-index" 6135 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 6136 + 6137 + [[package]] 6138 + name = "windows_x86_64_gnullvm" 6139 + version = "0.42.2" 6140 + source = "registry+https://github.com/rust-lang/crates.io-index" 6141 + checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 6142 + 6143 + [[package]] 6144 + name = "windows_x86_64_gnullvm" 6145 + version = "0.48.5" 6146 + source = "registry+https://github.com/rust-lang/crates.io-index" 6147 + checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 6148 + 6149 + [[package]] 6150 + name = "windows_x86_64_gnullvm" 6151 + version = "0.52.6" 6152 + source = "registry+https://github.com/rust-lang/crates.io-index" 6153 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 6154 + 6155 + [[package]] 6156 + name = "windows_x86_64_msvc" 6157 + version = "0.42.2" 6158 + source = "registry+https://github.com/rust-lang/crates.io-index" 6159 + checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 6160 + 6161 + [[package]] 6162 + name = "windows_x86_64_msvc" 6163 + version = "0.48.5" 6164 + source = "registry+https://github.com/rust-lang/crates.io-index" 6165 + checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 6166 + 6167 + [[package]] 6168 + name = "windows_x86_64_msvc" 6169 + version = "0.52.6" 6170 + source = "registry+https://github.com/rust-lang/crates.io-index" 6171 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 6172 + 6173 + [[package]] 6174 + name = "winit" 6175 + version = "0.30.10" 6176 + source = "registry+https://github.com/rust-lang/crates.io-index" 6177 + checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e" 6178 + dependencies = [ 6179 + "ahash", 6180 + "android-activity", 6181 + "atomic-waker", 6182 + "bitflags 2.9.0", 6183 + "block2", 6184 + "bytemuck", 6185 + "calloop", 6186 + "cfg_aliases", 6187 + "concurrent-queue", 6188 + "core-foundation 0.9.4", 6189 + "core-graphics", 6190 + "cursor-icon", 6191 + "dpi", 6192 + "js-sys", 6193 + "libc", 6194 + "memmap2", 6195 + "ndk 0.9.0", 6196 + "objc2 0.5.2", 6197 + "objc2-app-kit 0.2.2", 6198 + "objc2-foundation 0.2.2", 6199 + "objc2-ui-kit", 6200 + "orbclient", 6201 + "percent-encoding", 6202 + "pin-project", 6203 + "raw-window-handle", 6204 + "redox_syscall 0.4.1", 6205 + "rustix", 6206 + "sctk-adwaita", 6207 + "smithay-client-toolkit", 6208 + "smol_str", 6209 + "tracing", 6210 + "unicode-segmentation", 6211 + "wasm-bindgen", 6212 + "wasm-bindgen-futures", 6213 + "wayland-backend", 6214 + "wayland-client", 6215 + "wayland-protocols", 6216 + "wayland-protocols-plasma", 6217 + "web-sys", 6218 + "web-time", 6219 + "windows-sys 0.52.0", 6220 + "x11-dl", 6221 + "x11rb", 6222 + "xkbcommon-dl", 6223 + ] 6224 + 6225 + [[package]] 6226 + name = "winnow" 6227 + version = "0.7.10" 6228 + source = "registry+https://github.com/rust-lang/crates.io-index" 6229 + checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" 6230 + dependencies = [ 6231 + "memchr", 6232 + ] 6233 + 6234 + [[package]] 6235 + name = "wit-bindgen-rt" 6236 + version = "0.39.0" 6237 + source = "registry+https://github.com/rust-lang/crates.io-index" 6238 + checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 6239 + dependencies = [ 6240 + "bitflags 2.9.0", 6241 + ] 6242 + 6243 + [[package]] 6244 + name = "writeable" 6245 + version = "0.6.1" 6246 + source = "registry+https://github.com/rust-lang/crates.io-index" 6247 + checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 6248 + 6249 + [[package]] 6250 + name = "x11-dl" 6251 + version = "2.21.0" 6252 + source = "registry+https://github.com/rust-lang/crates.io-index" 6253 + checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 6254 + dependencies = [ 6255 + "libc", 6256 + "once_cell", 6257 + "pkg-config", 6258 + ] 6259 + 6260 + [[package]] 6261 + name = "x11rb" 6262 + version = "0.13.1" 6263 + source = "registry+https://github.com/rust-lang/crates.io-index" 6264 + checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" 6265 + dependencies = [ 6266 + "as-raw-xcb-connection", 6267 + "gethostname", 6268 + "libc", 6269 + "libloading", 6270 + "once_cell", 6271 + "rustix", 6272 + "x11rb-protocol", 6273 + ] 6274 + 6275 + [[package]] 6276 + name = "x11rb-protocol" 6277 + version = "0.13.1" 6278 + source = "registry+https://github.com/rust-lang/crates.io-index" 6279 + checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" 6280 + 6281 + [[package]] 6282 + name = "xcursor" 6283 + version = "0.3.8" 6284 + source = "registry+https://github.com/rust-lang/crates.io-index" 6285 + checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" 6286 + 6287 + [[package]] 6288 + name = "xkbcommon-dl" 6289 + version = "0.4.2" 6290 + source = "registry+https://github.com/rust-lang/crates.io-index" 6291 + checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 6292 + dependencies = [ 6293 + "bitflags 2.9.0", 6294 + "dlib", 6295 + "log", 6296 + "once_cell", 6297 + "xkeysym", 6298 + ] 6299 + 6300 + [[package]] 6301 + name = "xkeysym" 6302 + version = "0.2.1" 6303 + source = "registry+https://github.com/rust-lang/crates.io-index" 6304 + checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 6305 + 6306 + [[package]] 6307 + name = "xml-rs" 6308 + version = "0.8.26" 6309 + source = "registry+https://github.com/rust-lang/crates.io-index" 6310 + checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" 6311 + 6312 + [[package]] 6313 + name = "yazi" 6314 + version = "0.2.1" 6315 + source = "registry+https://github.com/rust-lang/crates.io-index" 6316 + checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" 6317 + 6318 + [[package]] 6319 + name = "yoke" 6320 + version = "0.8.0" 6321 + source = "registry+https://github.com/rust-lang/crates.io-index" 6322 + checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 6323 + dependencies = [ 6324 + "serde", 6325 + "stable_deref_trait", 6326 + "yoke-derive", 6327 + "zerofrom", 6328 + ] 6329 + 6330 + [[package]] 6331 + name = "yoke-derive" 6332 + version = "0.8.0" 6333 + source = "registry+https://github.com/rust-lang/crates.io-index" 6334 + checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 6335 + dependencies = [ 6336 + "proc-macro2", 6337 + "quote", 6338 + "syn 2.0.101", 6339 + "synstructure", 6340 + ] 6341 + 6342 + [[package]] 6343 + name = "zeno" 6344 + version = "0.3.3" 6345 + source = "registry+https://github.com/rust-lang/crates.io-index" 6346 + checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" 6347 + 6348 + [[package]] 6349 + name = "zerocopy" 6350 + version = "0.8.25" 6351 + source = "registry+https://github.com/rust-lang/crates.io-index" 6352 + checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" 6353 + dependencies = [ 6354 + "zerocopy-derive", 6355 + ] 6356 + 6357 + [[package]] 6358 + name = "zerocopy-derive" 6359 + version = "0.8.25" 6360 + source = "registry+https://github.com/rust-lang/crates.io-index" 6361 + checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" 6362 + dependencies = [ 6363 + "proc-macro2", 6364 + "quote", 6365 + "syn 2.0.101", 6366 + ] 6367 + 6368 + [[package]] 6369 + name = "zerofrom" 6370 + version = "0.1.6" 6371 + source = "registry+https://github.com/rust-lang/crates.io-index" 6372 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 6373 + dependencies = [ 6374 + "zerofrom-derive", 6375 + ] 6376 + 6377 + [[package]] 6378 + name = "zerofrom-derive" 6379 + version = "0.1.6" 6380 + source = "registry+https://github.com/rust-lang/crates.io-index" 6381 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 6382 + dependencies = [ 6383 + "proc-macro2", 6384 + "quote", 6385 + "syn 2.0.101", 6386 + "synstructure", 6387 + ] 6388 + 6389 + [[package]] 6390 + name = "zerotrie" 6391 + version = "0.2.2" 6392 + source = "registry+https://github.com/rust-lang/crates.io-index" 6393 + checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 6394 + dependencies = [ 6395 + "displaydoc", 6396 + "yoke", 6397 + "zerofrom", 6398 + ] 6399 + 6400 + [[package]] 6401 + name = "zerovec" 6402 + version = "0.11.2" 6403 + source = "registry+https://github.com/rust-lang/crates.io-index" 6404 + checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 6405 + dependencies = [ 6406 + "yoke", 6407 + "zerofrom", 6408 + "zerovec-derive", 6409 + ] 6410 + 6411 + [[package]] 6412 + name = "zerovec-derive" 6413 + version = "0.11.1" 6414 + source = "registry+https://github.com/rust-lang/crates.io-index" 6415 + checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 6416 + dependencies = [ 6417 + "proc-macro2", 6418 + "quote", 6419 + "syn 2.0.101", 6420 + ] 6421 + 6422 + [[package]] 6423 + name = "zlib-rs" 6424 + version = "0.5.0" 6425 + source = "registry+https://github.com/rust-lang/crates.io-index" 6426 + checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" 6427 + 6428 + [[package]] 6429 + name = "zune-core" 6430 + version = "0.4.12" 6431 + source = "registry+https://github.com/rust-lang/crates.io-index" 6432 + checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 6433 + 6434 + [[package]] 6435 + name = "zune-inflate" 6436 + version = "0.2.54" 6437 + source = "registry+https://github.com/rust-lang/crates.io-index" 6438 + checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" 6439 + dependencies = [ 6440 + "simd-adler32", 6441 + ] 6442 + 6443 + [[package]] 6444 + name = "zune-jpeg" 6445 + version = "0.4.14" 6446 + source = "registry+https://github.com/rust-lang/crates.io-index" 6447 + checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" 6448 + dependencies = [ 6449 + "zune-core", 6450 + ]
+53
vfl/Cargo.toml
··· 1 + [package] 2 + name = "vfl" 3 + version = "0.0.1" 4 + edition = "2024" 5 + authors = ["Jo Null <me@j0.lol>"] 6 + exclude = ["*.png", "*.glb", "*.dat"] 7 + license = "MIT OR Apache-2.0" 8 + keywords = ["rendering", "decompilation"] 9 + categories = ["rendering"] 10 + repository = "https://github.com/j0lol/vee" 11 + readme = "../README.md" 12 + description = "Mii parsing and rendering research library" 13 + 14 + [dependencies] 15 + binrw = "0.15.0" 16 + bytemuck = "1.23.0" 17 + half = "2.6.0" 18 + itertools = "0.14.0" 19 + num_enum = "0.7.3" 20 + 21 + # feat: res 22 + image = { version = "0.25.6", optional = true } 23 + flate2 = { version = "1.1.1", features = ["rust_backend"], optional = true } 24 + 25 + # feat: draw 26 + glam = { version = "0.30.3", features = ["mint"], optional = true } 27 + mint = { version = "0.5.9", optional = true } 28 + nalgebra = { version = "0.33.2", features = ["mint"], optional = true } 29 + pollster = { version = "0.4.0", optional = true } 30 + tegra_swizzle = { version = "0.4.0", optional = true } 31 + texture2ddecoder = { version = "0.1.2", optional = true } 32 + wgpu = { version = "25", optional = true } 33 + futures-intrusive = { version = "0.5.0", optional = true } 34 + 35 + # feat: gltf 36 + mesh-tools = { version = "0.1.0", optional = true } 37 + 38 + [dev-dependencies] 39 + image-compare = "0.4.1" 40 + 41 + [features] 42 + res = ["dep:image", "dep:tegra_swizzle", "dep:flate2"] 43 + draw = [ 44 + "res", 45 + "dep:wgpu", 46 + "dep:futures-intrusive", 47 + "dep:texture2ddecoder", 48 + "dep:pollster", 49 + "dep:glam", 50 + "dep:mint", 51 + "dep:nalgebra", 52 + ] 53 + gltf = ["res", "dep:mesh-tools"]
+1
vfl/src/charinfo/mod.rs
··· 1 + pub mod nx;
+87
vfl/src/charinfo/nx.rs
··· 1 + pub use binrw::{BinRead, NullWideString, binrw}; 2 + 3 + #[derive(Debug, Copy, Clone)] 4 + #[binrw] 5 + #[brw(little)] 6 + pub struct UuidVer4 { 7 + idc: [u8; 16], 8 + } 9 + #[derive(Debug, Clone)] 10 + #[binrw] 11 + #[brw(little, assert(nickname.len() <= 22))] 12 + pub struct NxCharInfo { 13 + create_info: UuidVer4, 14 + #[brw(pad_size_to = 0x16)] 15 + pub nickname: NullWideString, 16 + pub font_region: u8, 17 + pub favorite_color: u8, 18 + pub gender: u8, 19 + pub height: u8, 20 + pub build: u8, 21 + pub is_special: u8, 22 + pub region_move: u8, 23 + pub faceline_type: u8, 24 + pub faceline_color: u8, 25 + pub faceline_wrinkle: u8, 26 + pub faceline_make: u8, 27 + pub hair_type: u8, 28 + pub hair_color: u8, 29 + pub hair_flip: u8, 30 + pub eye_type: u8, 31 + pub eye_color: u8, 32 + pub eye_scale: u8, 33 + pub eye_aspect: u8, 34 + pub eye_rotate: u8, 35 + pub eye_x: u8, 36 + pub eye_y: u8, 37 + pub eyebrow_type: u8, 38 + pub eyebrow_color: u8, 39 + pub eyebrow_scale: u8, 40 + pub eyebrow_aspect: u8, 41 + pub eyebrow_rotate: u8, 42 + pub eyebrow_x: u8, 43 + pub eyebrow_y: u8, 44 + pub nose_type: u8, 45 + pub nose_scale: u8, 46 + pub nose_y: u8, 47 + pub mouth_type: u8, 48 + pub mouth_color: u8, 49 + pub mouth_scale: u8, 50 + pub mouth_aspect: u8, 51 + pub mouth_y: u8, 52 + pub beard_color: u8, 53 + pub beard_type: u8, 54 + pub mustache_type: u8, 55 + pub mustache_scale: u8, 56 + pub mustache_y: u8, 57 + pub glass_type: u8, 58 + pub glass_color: u8, 59 + pub glass_scale: u8, 60 + pub glass_y: u8, 61 + pub mole_type: u8, 62 + pub mole_scale: u8, 63 + pub mole_x: u8, 64 + pub mole_y: u8, 65 + reserved: u8, /* always zero */ 66 + } 67 + 68 + #[cfg(test)] 69 + mod tests { 70 + use super::*; 71 + use binrw::BinRead; 72 + use std::{error::Error, fs::File}; 73 + 74 + type R = Result<(), Box<dyn Error>>; 75 + 76 + #[test] 77 + fn mii_deser() -> R { 78 + let mut mii = File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../j0.charinfo"))?; 79 + 80 + let mii = NxCharInfo::read(&mut mii)?; 81 + 82 + assert_eq!(mii.glass_color, 17); 83 + assert_eq!(mii.reserved, 0); 84 + 85 + Ok(()) 86 + } 87 + }
+616
vfl/src/color.rs
··· 1 + type Color = [f32; 4]; 2 + 3 + pub mod cafe { 4 + 5 + // No it's not an approximation of 1/pi. You fool. You idiot. 6 + #![allow(clippy::approx_constant)] 7 + 8 + pub const HAIR_COLOR: [[f32; 4]; 8] = [ 9 + [0.118, 0.102, 0.094, 1.000], 10 + [0.251, 0.125, 0.063, 1.000], 11 + [0.361, 0.094, 0.039, 1.000], 12 + [0.486, 0.227, 0.078, 1.000], 13 + [0.471, 0.471, 0.502, 1.000], 14 + [0.306, 0.243, 0.063, 1.000], 15 + [0.533, 0.345, 0.094, 1.000], 16 + [0.816, 0.627, 0.290, 1.000], 17 + ]; 18 + 19 + pub const FACELINE_COLOR: [[f32; 4]; 6] = [ 20 + [1.000, 0.827, 0.678, 1.000], 21 + [1.000, 0.714, 0.420, 1.000], 22 + [0.870, 0.475, 0.259, 1.000], 23 + [1.000, 0.667, 0.549, 1.000], 24 + [0.678, 0.318, 0.161, 1.000], 25 + [0.388, 0.173, 0.094, 1.000], 26 + ]; 27 + 28 + pub const EYE_COLOR_R: [[f32; 4]; 3] = [ 29 + [0.000, 0.000, 0.000, 1.000], 30 + [1.000, 0.510, 0.000, 1.000], 31 + [0.000, 1.000, 1.000, 1.000], 32 + ]; 33 + 34 + pub const EYE_COLOR_G: [[f32; 4]; 1] = [[1.000, 1.000, 1.000, 1.000]]; 35 + 36 + pub const EYE_COLOR_B: [[f32; 4]; 6] = [ 37 + [0.000, 0.000, 0.000, 1.000], 38 + [0.424, 0.439, 0.439, 1.000], 39 + [0.400, 0.235, 0.173, 1.000], 40 + [0.376, 0.369, 0.188, 1.000], 41 + [0.275, 0.329, 0.659, 1.000], 42 + [0.220, 0.439, 0.345, 1.000], 43 + ]; 44 + 45 + pub const MOUTH_COLOR_R: [[f32; 4]; 5] = [ 46 + [0.847, 0.322, 0.031, 1.000], 47 + [0.941, 0.047, 0.031, 1.000], 48 + [0.961, 0.282, 0.282, 1.000], 49 + [0.941, 0.604, 0.455, 1.000], 50 + [0.549, 0.314, 0.251, 1.000], 51 + ]; 52 + 53 + pub const MOUTH_COLOR_G: [[f32; 4]; 5] = [ 54 + [0.510, 0.188, 0.094, 1.000], 55 + [0.471, 0.047, 0.047, 1.000], 56 + [0.533, 0.125, 0.157, 1.000], 57 + [0.863, 0.471, 0.314, 1.000], 58 + [0.275, 0.118, 0.039, 1.000], 59 + ]; 60 + 61 + pub const MOUTH_COLOR_B: [[f32; 4]; 1] = [[1.000, 1.000, 1.000, 1.000]]; 62 + 63 + pub const GLASS_COLOR_R: [[f32; 4]; 6] = [ 64 + [0.094, 0.094, 0.094, 1.000], 65 + [0.376, 0.219, 0.062, 1.000], 66 + [0.658, 0.062, 0.031, 1.000], 67 + [0.125, 0.188, 0.407, 1.000], 68 + [0.658, 0.376, 0.000, 1.000], 69 + [0.470, 0.439, 0.407, 1.000], 70 + ]; 71 + } 72 + 73 + pub mod nx { 74 + // I'm not doing all of that. 75 + #![allow(clippy::unreadable_literal, clippy::excessive_precision)] 76 + 77 + use num_enum::IntoPrimitive; 78 + 79 + use crate::charinfo::nx::NxCharInfo; 80 + 81 + use super::Color; 82 + 83 + #[derive(Copy, Clone)] 84 + pub enum ColorModulated { 85 + Eye, 86 + Eyebrow, 87 + Mouth, 88 + Glass, 89 + BeardTexture, 90 + NoseLineShape, 91 + FacelineMakeup, 92 + FacelineWrinkle, 93 + } 94 + 95 + pub const NON_MODULATION: Color = [f32::NAN, f32::NAN, f32::NAN, f32::NAN]; 96 + const WHITE: Color = linear::COMMON_COLOR[99]; 97 + const BLACK: Color = linear::COMMON_COLOR[8]; 98 + const TRANSPARENT: Color = [0.0, 0.0, 0.0, 0.0]; 99 + 100 + #[repr(u8)] 101 + #[derive(IntoPrimitive, Debug, Clone, Copy)] 102 + pub enum ModulationMode { 103 + SingleColor = 0, 104 + DirectTexture = 1, 105 + LayeredRgbTexture = 2, 106 + AlphaTexture = 3, 107 + LuminanceAlphaTexture = 4, 108 + } 109 + #[derive(Debug, Clone, Copy)] 110 + pub struct ModulationIntent { 111 + pub mode: ModulationMode, 112 + pub channels: [Color; 3], 113 + } 114 + 115 + /// This function will give you color modulations for each needed texture or shape. 116 + /// When a channel is not modulated, it will return [NaN, NaN, NaN, NaN] 117 + /// EG: An "R" format texture does not need G&B modulation 118 + /// Ref: https://github.com/ariankordi/ffl/blob/97eecdf3688f92c4c95cecf5d6ab3e84c0ee42c0/src/FFLiModulate.cpp 119 + #[allow(clippy::must_use_candidate)] 120 + pub fn modulate(class: ColorModulated, char: &NxCharInfo) -> ModulationIntent { 121 + use ModulationMode as M; 122 + match class { 123 + ColorModulated::Eye => ModulationIntent { 124 + mode: M::LayeredRgbTexture, 125 + channels: [ 126 + BLACK, 127 + WHITE, 128 + linear::COMMON_COLOR[usize::from(char.eye_color)], 129 + ], 130 + }, 131 + ColorModulated::Eyebrow => ModulationIntent { 132 + mode: M::AlphaTexture, 133 + channels: [ 134 + linear::COMMON_COLOR[usize::from(char.eyebrow_color)], 135 + NON_MODULATION, 136 + NON_MODULATION, 137 + ], 138 + }, 139 + ColorModulated::Mouth => ModulationIntent { 140 + mode: M::LayeredRgbTexture, 141 + channels: [ 142 + linear::COMMON_COLOR[usize::from(char.mouth_color)], 143 + linear::UPPER_LIP_COLOR[usize::from(char.mouth_color)], 144 + WHITE, 145 + ], 146 + }, 147 + ColorModulated::Glass => ModulationIntent { 148 + mode: M::LuminanceAlphaTexture, 149 + channels: [ 150 + linear::COMMON_COLOR[usize::from(char.glass_color)], 151 + NON_MODULATION, 152 + NON_MODULATION, 153 + ], 154 + }, 155 + ColorModulated::BeardTexture => ModulationIntent { 156 + mode: M::AlphaTexture, 157 + channels: [ 158 + linear::COMMON_COLOR[usize::from(char.beard_color)], 159 + NON_MODULATION, 160 + NON_MODULATION, 161 + ], 162 + }, 163 + ColorModulated::NoseLineShape => ModulationIntent { 164 + mode: M::AlphaTexture, 165 + channels: [BLACK, NON_MODULATION, NON_MODULATION], 166 + }, 167 + // I can't find any information on modulating FacelineWrinkle somehow. 168 + // TODO: Check for accuracy here. 169 + ColorModulated::FacelineWrinkle | ColorModulated::FacelineMakeup => ModulationIntent { 170 + mode: M::DirectTexture, 171 + channels: [NON_MODULATION; 3], 172 + }, 173 + } 174 + } 175 + 176 + pub mod linear { 177 + pub const COMMON_COLOR: [[f32; 4]; 100] = [ 178 + [0.02624122, 0.02121902, 0.02121902, 1.0], 179 + [0.05126946, 0.01444384, 0.00518152, 1.0], 180 + [0.1070232, 0.00913407, 0.00303527, 1.0], 181 + [0.2015563, 0.04231142, 0.00699541, 1.0], 182 + [0.1878208, 0.1878208, 0.2158605, 1.0], 183 + [0.07618541, 0.04817184, 0.00518152, 1.0], 184 + [0.2462014, 0.09758739, 0.00913407, 1.0], 185 + [0.6307572, 0.3515327, 0.06847817, 1.0], 186 + [0.0, 0.0, 0.0, 1.0], 187 + [0.1499599, 0.1620294, 0.1620294, 1.0], 188 + [0.1328683, 0.04518623, 0.02518688, 1.0], 189 + [0.1169707, 0.1119325, 0.02955684, 1.0], 190 + [0.0612461, 0.08865561, 0.3915726, 1.0], 191 + [0.03954626, 0.1620294, 0.09758739, 1.0], 192 + [0.1169707, 0.03954626, 0.00518152, 1.0], 193 + [0.3915726, 0.00518152, 0.00242822, 1.0], 194 + [0.01444384, 0.02955684, 0.1384317, 1.0], 195 + [0.3915726, 0.1169707, 0.0, 1.0], 196 + [0.1878208, 0.1620294, 0.1384317, 1.0], 197 + [0.6866855, 0.08437625, 0.00242822, 1.0], 198 + [0.8713672, 0.00367651, 0.00242822, 1.0], 199 + [0.9130989, 0.0648033, 0.0648033, 1.0], 200 + [0.8713672, 0.3231433, 0.1746474, 1.0], 201 + [0.2622508, 0.08021983, 0.05126946, 1.0], 202 + [0.2307401, 0.01938238, 0.01938238, 1.0], 203 + [1.0, 0.1714411, 0.1328683, 1.0], 204 + [1.0, 0.3813261, 0.3813261, 1.0], 205 + [1.0, 0.5271152, 0.4910209, 1.0], 206 + [0.1714411, 0.0273209, 0.04373505, 1.0], 207 + [0.3185468, 0.0137021, 0.04666509, 1.0], 208 + [0.2541521, 0.00856813, 0.04817184, 1.0], 209 + [0.4620771, 0.04817184, 0.05448031, 1.0], 210 + [0.571125, 0.01298304, 0.09305902, 1.0], 211 + [0.4341537, 0.08650047, 0.2195262, 1.0], 212 + [0.571125, 0.08865561, 0.1559265, 1.0], 213 + [0.9559736, 0.1778885, 0.309469, 1.0], 214 + [0.9734454, 0.4125428, 0.5840785, 1.0], 215 + [1.0, 0.5840785, 0.6866855, 1.0], 216 + [0.03071345, 0.01161226, 0.05126946, 1.0], 217 + [0.03820438, 0.02121902, 0.04666509, 1.0], 218 + [0.07227188, 0.00913407, 0.07421357, 1.0], 219 + [0.1589609, 0.05448031, 0.4507858, 1.0], 220 + [0.2345507, 0.1070232, 0.4793203, 1.0], 221 + [0.5271152, 0.2269659, 0.6038274, 1.0], 222 + [0.3915726, 0.2917707, 0.5840785, 1.0], 223 + [0.5583405, 0.4125428, 0.791298, 1.0], 224 + [0.8549928, 0.5149179, 0.9559736, 1.0], 225 + [0.6444799, 0.5583405, 0.8468735, 1.0], 226 + [0.00972123, 0.0137021, 0.05126946, 1.0], 227 + [0.00604884, 0.0497066, 0.1328683, 1.0], 228 + [0.02315337, 0.2232281, 0.658375, 1.0], 229 + [0.09530749, 0.4564111, 0.8879234, 1.0], 230 + [0.1946179, 0.5583405, 0.7304609, 1.0], 231 + [0.2501584, 0.3813261, 0.9559736, 1.0], 232 + [0.2307401, 0.5088814, 0.9559736, 1.0], 233 + [0.3564002, 0.7681512, 1.0, 1.0], 234 + [0.00334654, 0.0273209, 0.03688948, 1.0], 235 + [0.00030353, 0.04666509, 0.04373505, 1.0], 236 + [0.00402472, 0.07818746, 0.09989879, 1.0], 237 + [0.0168074, 0.1328683, 0.1247718, 1.0], 238 + [0.02955684, 0.2086369, 0.2622508, 1.0], 239 + [0.07818746, 0.4232678, 0.4341537, 1.0], 240 + [0.1946179, 0.5520115, 0.3419146, 1.0], 241 + [0.2122308, 0.658375, 0.5271152, 1.0], 242 + [0.2422812, 0.783538, 0.4677839, 1.0], 243 + [0.00303527, 0.06847817, 0.03560133, 1.0], 244 + [0.05612849, 0.1946179, 0.0, 1.0], 245 + [0.00060706, 0.1778885, 0.1221388, 1.0], 246 + [0.03688948, 0.3185468, 0.1620294, 1.0], 247 + [0.07036012, 0.4178851, 0.01032982, 1.0], 248 + [0.287441, 0.5209957, 0.00303527, 1.0], 249 + [0.1247718, 0.571125, 0.2462014, 1.0], 250 + [0.3419146, 0.7454043, 0.05448031, 1.0], 251 + [0.3049874, 0.7304609, 0.2086369, 1.0], 252 + [0.4969332, 0.8879234, 0.4019778, 1.0], 253 + [0.3185468, 0.2917707, 0.02415765, 1.0], 254 + [0.3813261, 0.3005439, 0.1247718, 1.0], 255 + [0.6038274, 0.5271152, 0.04091523, 1.0], 256 + [0.6038274, 0.48515, 0.2422812, 1.0], 257 + [0.6938719, 0.6038274, 0.2232281, 1.0], 258 + [0.6653875, 0.6938719, 0.1589609, 1.0], 259 + [0.6653875, 0.791298, 0.2269659, 1.0], 260 + [0.6866855, 0.9559736, 0.3371637, 1.0], 261 + [0.2050788, 0.05951127, 0.0, 1.0], 262 + [0.791298, 0.4969332, 0.1946179, 1.0], 263 + [0.9911023, 0.7605247, 0.06847817, 1.0], 264 + [0.9559736, 0.7304609, 0.2232281, 1.0], 265 + [0.9301111, 0.822786, 0.3324517, 1.0], 266 + [0.9559736, 0.938686, 0.3277782, 1.0], 267 + [0.3813261, 0.07421357, 0.01298304, 1.0], 268 + [1.0, 0.3049874, 0.00402472, 1.0], 269 + [0.6375971, 0.3277782, 0.1412634, 1.0], 270 + [1.0, 0.4452013, 0.1328683, 1.0], 271 + [1.0, 0.5394797, 0.2622508, 1.0], 272 + [0.783538, 0.6239606, 0.4396573, 1.0], 273 + [0.05286067, 0.05286067, 0.05286067, 1.0], 274 + [0.3277782, 0.3277782, 0.3277782, 1.0], 275 + [0.5149179, 0.5149179, 0.5149179, 1.0], 276 + [0.7156936, 0.6795427, 0.6104956, 1.0], 277 + [1.0, 1.0, 1.0, 1.0], 278 + ]; 279 + 280 + pub const UPPER_LIP_COLOR: [[f32; 4]; 100] = [ 281 + [0.00856813, 0.00699541, 0.00699541, 1.0], 282 + [0.01444384, 0.00518152, 0.00242822, 1.0], 283 + [0.0273209, 0.00367651, 0.00151764, 1.0], 284 + [0.06847817, 0.0168074, 0.00367651, 1.0], 285 + [0.08865561, 0.08865561, 0.1022417, 1.0], 286 + [0.02028857, 0.0137021, 0.00242822, 1.0], 287 + [0.08437625, 0.03560133, 0.00439145, 1.0], 288 + [0.4396573, 0.2158605, 0.02121902, 1.0], 289 + [0.0, 0.0, 0.0, 1.0], 290 + [0.07227188, 0.07618541, 0.07618541, 1.0], 291 + [0.03310477, 0.01298304, 0.00802321, 1.0], 292 + [0.04231142, 0.03954626, 0.01228649, 1.0], 293 + [0.02315337, 0.03189605, 0.1301365, 1.0], 294 + [0.02028857, 0.07618541, 0.04817184, 1.0], 295 + [0.02955684, 0.01161226, 0.00242822, 1.0], 296 + [0.1301365, 0.00303527, 0.00151764, 1.0], 297 + [0.00518152, 0.00913407, 0.03433982, 1.0], 298 + [0.1811642, 0.05612849, 0.0, 1.0], 299 + [0.08865561, 0.07618541, 0.06662599, 1.0], 300 + [0.2232281, 0.02955684, 0.00913407, 1.0], 301 + [0.1878208, 0.00367651, 0.00367651, 1.0], 302 + [0.2462014, 0.01444384, 0.02121902, 1.0], 303 + [0.7156936, 0.1878208, 0.08021983, 1.0], 304 + [0.0612461, 0.01298304, 0.00303527, 1.0], 305 + [0.07818746, 0.00856813, 0.00856813, 1.0], 306 + [0.3185468, 0.05951127, 0.04666509, 1.0], 307 + [0.791298, 0.2345507, 0.2345507, 1.0], 308 + [0.791298, 0.3564002, 0.3277782, 1.0], 309 + [0.05951127, 0.01161226, 0.0168074, 1.0], 310 + [0.1070232, 0.0065121, 0.01850023, 1.0], 311 + [0.08650047, 0.00439145, 0.01850023, 1.0], 312 + [0.1529262, 0.01850023, 0.02121902, 1.0], 313 + [0.184475, 0.00604884, 0.03433982, 1.0], 314 + [0.1441285, 0.03189605, 0.07421357, 1.0], 315 + [0.184475, 0.03189605, 0.05448031, 1.0], 316 + [0.4286906, 0.08437625, 0.1441285, 1.0], 317 + [0.7681512, 0.2622508, 0.4125428, 1.0], 318 + [0.791298, 0.4072404, 0.4969332, 1.0], 319 + [0.00972123, 0.00439145, 0.01444384, 1.0], 320 + [0.01161226, 0.00699541, 0.0137021, 1.0], 321 + [0.01938238, 0.00367651, 0.02028857, 1.0], 322 + [0.05612849, 0.02121902, 0.1470273, 1.0], 323 + [0.08021983, 0.03820438, 0.1559265, 1.0], 324 + [0.2383976, 0.1070232, 0.2746774, 1.0], 325 + [0.1811642, 0.1356334, 0.2663557, 1.0], 326 + [0.4072404, 0.2788943, 0.6239606, 1.0], 327 + [0.658375, 0.3515327, 0.7529424, 1.0], 328 + [0.4793203, 0.4019778, 0.6653875, 1.0], 329 + [0.00402472, 0.00518152, 0.01444384, 1.0], 330 + [0.00273175, 0.01444384, 0.03310477, 1.0], 331 + [0.01228649, 0.1046165, 0.2961383, 1.0], 332 + [0.03189605, 0.309469, 0.7011021, 1.0], 333 + [0.1070232, 0.4178851, 0.5775806, 1.0], 334 + [0.1356334, 0.2383976, 0.7529424, 1.0], 335 + [0.1221388, 0.3467042, 0.7529424, 1.0], 336 + [0.2158605, 0.571125, 0.791298, 1.0], 337 + [0.00182117, 0.00856813, 0.0109601, 1.0], 338 + [0.00030353, 0.0137021, 0.01298304, 1.0], 339 + [0.00212469, 0.02121902, 0.02624122, 1.0], 340 + [0.00913407, 0.06301002, 0.05951127, 1.0], 341 + [0.01599631, 0.09758739, 0.1221388, 1.0], 342 + [0.02955684, 0.258183, 0.2663557, 1.0], 343 + [0.1169707, 0.4341537, 0.2422812, 1.0], 344 + [0.1247718, 0.5209957, 0.3967553, 1.0], 345 + [0.1412634, 0.6172068, 0.3277782, 1.0], 346 + [0.00151764, 0.01850023, 0.0109601, 1.0], 347 + [0.02121902, 0.06662599, 0.0, 1.0], 348 + [0.00030353, 0.0612461, 0.04373505, 1.0], 349 + [0.01938238, 0.1470273, 0.07618541, 1.0], 350 + [0.02518688, 0.2541521, 0.0, 1.0], 351 + [0.1559265, 0.3185468, 0.0, 1.0], 352 + [0.06301002, 0.4507858, 0.1589609, 1.0], 353 + [0.2232281, 0.5906189, 0.0137021, 1.0], 354 + [0.1946179, 0.5775806, 0.1169707, 1.0], 355 + [0.3419146, 0.7011021, 0.2622508, 1.0], 356 + [0.1470273, 0.1356334, 0.01298304, 1.0], 357 + [0.1746474, 0.1384317, 0.05951127, 1.0], 358 + [0.3662527, 0.3139888, 0.00802321, 1.0], 359 + [0.4793203, 0.3662527, 0.1529262, 1.0], 360 + [0.5457245, 0.4620771, 0.1301365, 1.0], 361 + [0.5209957, 0.5457245, 0.08228273, 1.0], 362 + [0.5088814, 0.6239606, 0.1274377, 1.0], 363 + [0.5028866, 0.7529424, 0.2050788, 1.0], 364 + [0.07036012, 0.0221739, 0.0, 1.0], 365 + [0.6239606, 0.3564002, 0.1022417, 1.0], 366 + [0.783538, 0.5647116, 0.01599631, 1.0], 367 + [0.7529424, 0.5457245, 0.1144354, 1.0], 368 + [0.7304609, 0.6307572, 0.2015563, 1.0], 369 + [0.7529424, 0.7379106, 0.1946179, 1.0], 370 + [0.1274377, 0.0273209, 0.00604884, 1.0], 371 + [0.6038274, 0.1878208, 0.00303527, 1.0], 372 + [0.5028866, 0.2232281, 0.07227188, 1.0], 373 + [0.791298, 0.287441, 0.05126946, 1.0], 374 + [0.791298, 0.3712377, 0.1412634, 1.0], 375 + [0.6172068, 0.4677839, 0.3049874, 1.0], 376 + [0.01520852, 0.01520852, 0.01520852, 1.0], 377 + [0.2015563, 0.2015563, 0.2015563, 1.0], 378 + [0.4072404, 0.4072404, 0.4072404, 1.0], 379 + [0.5647116, 0.5332766, 0.4677839, 1.0], 380 + [0.6938719, 0.6938719, 0.6938719, 1.0], 381 + ]; 382 + 383 + pub const FACELINE_COLOR: [[f32; 4]; 10] = [ 384 + [1.0, 0.6514057, 0.4178851, 1.0], 385 + [1.0, 0.4677839, 0.1470273, 1.0], 386 + [0.7304609, 0.1912018, 0.05448031, 1.0], 387 + [1.0, 0.4019778, 0.2622508, 1.0], 388 + [0.4178851, 0.08228273, 0.0221739, 1.0], 389 + [0.1247718, 0.02518688, 0.00913407, 1.0], 390 + [1.0, 0.5149179, 0.3762622, 1.0], 391 + [1.0, 0.5583405, 0.2746774, 1.0], 392 + [0.2622508, 0.04518623, 0.0168074, 1.0], 393 + [0.04518623, 0.02624122, 0.0168074, 1.0], 394 + ]; 395 + } 396 + pub mod srgb { 397 + pub const COMMON_COLOR: [[f32; 4]; 100] = [ 398 + [0.1764706, 0.1568628, 0.1568628, 1.0], 399 + [0.2509804, 0.1254902, 0.0627451, 1.0], 400 + [0.3607844, 0.0941177, 0.0392157, 1.0], 401 + [0.4862746, 0.2274510, 0.0784314, 1.0], 402 + [0.4705883, 0.4705883, 0.5019608, 1.0], 403 + [0.3058824, 0.2431373, 0.0627451, 1.0], 404 + [0.5333334, 0.3450981, 0.0941177, 1.0], 405 + [0.8156863, 0.6274510, 0.2901961, 1.0], 406 + [0.0000000, 0.0000000, 0.0000000, 1.0], 407 + [0.4235295, 0.4392157, 0.4392157, 1.0], 408 + [0.4000000, 0.2352942, 0.1725491, 1.0], 409 + [0.3764706, 0.3686275, 0.1882353, 1.0], 410 + [0.2745099, 0.3294118, 0.6588236, 1.0], 411 + [0.2196079, 0.4392157, 0.3450981, 1.0], 412 + [0.3764706, 0.2196079, 0.0627451, 1.0], 413 + [0.6588236, 0.0627451, 0.0313726, 1.0], 414 + [0.1254902, 0.1882353, 0.4078432, 1.0], 415 + [0.6588236, 0.3764706, 0.0000000, 1.0], 416 + [0.4705883, 0.4392157, 0.4078432, 1.0], 417 + [0.8470589, 0.3215687, 0.0313726, 1.0], 418 + [0.9411765, 0.0470589, 0.0313726, 1.0], 419 + [0.9607844, 0.2823530, 0.2823530, 1.0], 420 + [0.9411765, 0.6039216, 0.4549020, 1.0], 421 + [0.5490197, 0.3137255, 0.2509804, 1.0], 422 + [0.5176471, 0.1490197, 0.1490197, 1.0], 423 + [1.0000000, 0.4509804, 0.4000000, 1.0], 424 + [1.0000000, 0.6509804, 0.6509804, 1.0], 425 + [1.0000000, 0.7529412, 0.7294118, 1.0], 426 + [0.4509804, 0.1803922, 0.2313726, 1.0], 427 + [0.6000000, 0.1215687, 0.2392157, 1.0], 428 + [0.5411765, 0.0901961, 0.2431373, 1.0], 429 + [0.7098040, 0.2431373, 0.2588236, 1.0], 430 + [0.7803922, 0.1176471, 0.3372550, 1.0], 431 + [0.6901961, 0.3254902, 0.5058824, 1.0], 432 + [0.7803922, 0.3294118, 0.4313726, 1.0], 433 + [0.9803922, 0.4588236, 0.5921569, 1.0], 434 + [0.9882353, 0.6745099, 0.7882353, 1.0], 435 + [1.0000000, 0.7882353, 0.8470589, 1.0], 436 + [0.1921569, 0.1098040, 0.2509804, 1.0], 437 + [0.2156863, 0.1568628, 0.2392157, 1.0], 438 + [0.2980393, 0.0941177, 0.3019608, 1.0], 439 + [0.4352942, 0.2588236, 0.7019608, 1.0], 440 + [0.5215687, 0.3607844, 0.7215687, 1.0], 441 + [0.7529412, 0.5137255, 0.8000000, 1.0], 442 + [0.6588236, 0.5764706, 0.7882353, 1.0], 443 + [0.7725491, 0.6745099, 0.9019608, 1.0], 444 + [0.9333334, 0.7450981, 0.9803922, 1.0], 445 + [0.8235295, 0.7725491, 0.9294118, 1.0], 446 + [0.0980393, 0.1215687, 0.2509804, 1.0], 447 + [0.0705883, 0.2470589, 0.4000000, 1.0], 448 + [0.1647059, 0.5098040, 0.8313726, 1.0], 449 + [0.3411765, 0.7058824, 0.9490197, 1.0], 450 + [0.4784314, 0.7725491, 0.8705883, 1.0], 451 + [0.5372550, 0.6509804, 0.9803922, 1.0], 452 + [0.5176471, 0.7411765, 0.9803922, 1.0], 453 + [0.6313726, 0.8901961, 1.0000000, 1.0], 454 + [0.0431373, 0.1803922, 0.2117648, 1.0], 455 + [0.0039216, 0.2392157, 0.2313726, 1.0], 456 + [0.0509804, 0.3098040, 0.3490197, 1.0], 457 + [0.1372550, 0.4000000, 0.3882353, 1.0], 458 + [0.1882353, 0.4941177, 0.5490197, 1.0], 459 + [0.3098040, 0.6823530, 0.6901961, 1.0], 460 + [0.4784314, 0.7686275, 0.6196079, 1.0], 461 + [0.4980393, 0.8313726, 0.7529412, 1.0], 462 + [0.5294118, 0.8980393, 0.7137255, 1.0], 463 + [0.0392157, 0.2901961, 0.2078432, 1.0], 464 + [0.2627451, 0.4784314, 0.0000000, 1.0], 465 + [0.0078432, 0.4588236, 0.3843138, 1.0], 466 + [0.2117648, 0.6000000, 0.4392157, 1.0], 467 + [0.2941177, 0.6784314, 0.1019608, 1.0], 468 + [0.5725491, 0.7490197, 0.0392157, 1.0], 469 + [0.3882353, 0.7803922, 0.5333334, 1.0], 470 + [0.6196079, 0.8784314, 0.2588236, 1.0], 471 + [0.5882353, 0.8705883, 0.4941177, 1.0], 472 + [0.7333334, 0.9490197, 0.6666667, 1.0], 473 + [0.6000000, 0.5764706, 0.1686275, 1.0], 474 + [0.6509804, 0.5843138, 0.3882353, 1.0], 475 + [0.8000000, 0.7529412, 0.2235295, 1.0], 476 + [0.8000000, 0.7254902, 0.5294118, 1.0], 477 + [0.8509804, 0.8000000, 0.5098040, 1.0], 478 + [0.8352942, 0.8509804, 0.4352942, 1.0], 479 + [0.8352942, 0.9019608, 0.5137255, 1.0], 480 + [0.8470589, 0.9803922, 0.6156863, 1.0], 481 + [0.4901961, 0.2705883, 0.0000000, 1.0], 482 + [0.9019608, 0.7333334, 0.4784314, 1.0], 483 + [0.9960785, 0.8862746, 0.2901961, 1.0], 484 + [0.9803922, 0.8705883, 0.5098040, 1.0], 485 + [0.9686275, 0.9176471, 0.6117648, 1.0], 486 + [0.9803922, 0.9725491, 0.6078432, 1.0], 487 + [0.6509804, 0.3019608, 0.1176471, 1.0], 488 + [1.0000000, 0.5882353, 0.0509804, 1.0], 489 + [0.8196079, 0.6078432, 0.4117648, 1.0], 490 + [1.0000000, 0.6980393, 0.4000000, 1.0], 491 + [1.0000000, 0.7607844, 0.5490197, 1.0], 492 + [0.8980393, 0.8117648, 0.6941177, 1.0], 493 + [0.2549020, 0.2549020, 0.2549020, 1.0], 494 + [0.6078432, 0.6078432, 0.6078432, 1.0], 495 + [0.7450981, 0.7450981, 0.7450981, 1.0], 496 + [0.8627451, 0.8431373, 0.8039216, 1.0], 497 + [1.0000000, 1.0000000, 1.0000000, 1.0], 498 + ]; 499 + 500 + pub const UPPER_LIP_COLOR: [[f32; 4]; 100] = [ 501 + [0.0901961, 0.0784314, 0.0784314, 1.0], 502 + [0.1254902, 0.0627451, 0.0313726, 1.0], 503 + [0.1803922, 0.0470589, 0.0196079, 1.0], 504 + [0.2901961, 0.1372550, 0.0470589, 1.0], 505 + [0.3294118, 0.3294118, 0.3529412, 1.0], 506 + [0.1529412, 0.1215687, 0.0313726, 1.0], 507 + [0.3215687, 0.2078432, 0.0549020, 1.0], 508 + [0.6941177, 0.5019608, 0.1568628, 1.0], 509 + [0.0000000, 0.0000000, 0.0000000, 1.0], 510 + [0.2980393, 0.3058824, 0.3058824, 1.0], 511 + [0.2000000, 0.1176471, 0.0862746, 1.0], 512 + [0.2274510, 0.2196079, 0.1137255, 1.0], 513 + [0.1647059, 0.1960785, 0.3960785, 1.0], 514 + [0.1529412, 0.3058824, 0.2431373, 1.0], 515 + [0.1882353, 0.1098040, 0.0313726, 1.0], 516 + [0.3960785, 0.0392157, 0.0196079, 1.0], 517 + [0.0627451, 0.0941177, 0.2039216, 1.0], 518 + [0.4627451, 0.2627451, 0.0000000, 1.0], 519 + [0.3294118, 0.3058824, 0.2862746, 1.0], 520 + [0.5098040, 0.1882353, 0.0941177, 1.0], 521 + [0.4705883, 0.0470589, 0.0470589, 1.0], 522 + [0.5333334, 0.1254902, 0.1568628, 1.0], 523 + [0.8627451, 0.4705883, 0.3137255, 1.0], 524 + [0.2745099, 0.1176471, 0.0392157, 1.0], 525 + [0.3098040, 0.0901961, 0.0901961, 1.0], 526 + [0.6000000, 0.2705883, 0.2392157, 1.0], 527 + [0.9019608, 0.5215687, 0.5215687, 1.0], 528 + [0.9019608, 0.6313726, 0.6078432, 1.0], 529 + [0.2705883, 0.1098040, 0.1372550, 1.0], 530 + [0.3607844, 0.0745099, 0.1450981, 1.0], 531 + [0.3254902, 0.0549020, 0.1450981, 1.0], 532 + [0.4274510, 0.1450981, 0.1568628, 1.0], 533 + [0.4666667, 0.0705883, 0.2039216, 1.0], 534 + [0.4156863, 0.1960785, 0.3019608, 1.0], 535 + [0.4666667, 0.1960785, 0.2588236, 1.0], 536 + [0.6862746, 0.3215687, 0.4156863, 1.0], 537 + [0.8901961, 0.5490197, 0.6745099, 1.0], 538 + [0.9019608, 0.6705883, 0.7333334, 1.0], 539 + [0.0980393, 0.0549020, 0.1254902, 1.0], 540 + [0.1098040, 0.0784314, 0.1215687, 1.0], 541 + [0.1490197, 0.0470589, 0.1529412, 1.0], 542 + [0.2627451, 0.1568628, 0.4196079, 1.0], 543 + [0.3137255, 0.2156863, 0.4313726, 1.0], 544 + [0.5254902, 0.3607844, 0.5607844, 1.0], 545 + [0.4627451, 0.4039216, 0.5529412, 1.0], 546 + [0.6705883, 0.5647059, 0.8117648, 1.0], 547 + [0.8313726, 0.6274510, 0.8823530, 1.0], 548 + [0.7215687, 0.6666667, 0.8352942, 1.0], 549 + [0.0509804, 0.0627451, 0.1254902, 1.0], 550 + [0.0352942, 0.1254902, 0.2000000, 1.0], 551 + [0.1137255, 0.3568628, 0.5803922, 1.0], 552 + [0.1960785, 0.5921569, 0.8549020, 1.0], 553 + [0.3607844, 0.6784314, 0.7843138, 1.0], 554 + [0.4039216, 0.5254902, 0.8823530, 1.0], 555 + [0.3843138, 0.6235295, 0.8823530, 1.0], 556 + [0.5019608, 0.7803922, 0.9019608, 1.0], 557 + [0.0235295, 0.0901961, 0.1058824, 1.0], 558 + [0.0039216, 0.1215687, 0.1176471, 1.0], 559 + [0.0274510, 0.1568628, 0.1764706, 1.0], 560 + [0.0941177, 0.2784314, 0.2705883, 1.0], 561 + [0.1333334, 0.3450981, 0.3843138, 1.0], 562 + [0.1882353, 0.5450981, 0.5529412, 1.0], 563 + [0.3764706, 0.6901961, 0.5294118, 1.0], 564 + [0.3882353, 0.7490197, 0.6627451, 1.0], 565 + [0.4117648, 0.8078432, 0.6078432, 1.0], 566 + [0.0196079, 0.1450981, 0.1058824, 1.0], 567 + [0.1568628, 0.2862746, 0.0000000, 1.0], 568 + [0.0039216, 0.2745099, 0.2313726, 1.0], 569 + [0.1490197, 0.4196079, 0.3058824, 1.0], 570 + [0.1725491, 0.5411765, 0.0000000, 1.0], 571 + [0.4313726, 0.6000000, 0.0000000, 1.0], 572 + [0.2784314, 0.7019608, 0.4352942, 1.0], 573 + [0.5098040, 0.7921569, 0.1215687, 1.0], 574 + [0.4784314, 0.7843138, 0.3764706, 1.0], 575 + [0.6196079, 0.8549020, 0.5490197, 1.0], 576 + [0.4196079, 0.4039216, 0.1176471, 1.0], 577 + [0.4549020, 0.4078432, 0.2705883, 1.0], 578 + [0.6392157, 0.5960785, 0.0862746, 1.0], 579 + [0.7215687, 0.6392157, 0.4274510, 1.0], 580 + [0.7647059, 0.7098040, 0.3960785, 1.0], 581 + [0.7490197, 0.7647059, 0.3176471, 1.0], 582 + [0.7411765, 0.8117648, 0.3921569, 1.0], 583 + [0.7372550, 0.8823530, 0.4901961, 1.0], 584 + [0.2941177, 0.1607844, 0.0000000, 1.0], 585 + [0.8117648, 0.6313726, 0.3529412, 1.0], 586 + [0.8980393, 0.7764706, 0.1333334, 1.0], 587 + [0.8823530, 0.7647059, 0.3725491, 1.0], 588 + [0.8705883, 0.8156863, 0.4862746, 1.0], 589 + [0.8823530, 0.8745099, 0.4784314, 1.0], 590 + [0.3921569, 0.1803922, 0.0705883, 1.0], 591 + [0.8000000, 0.4705883, 0.0392157, 1.0], 592 + [0.7372550, 0.5098040, 0.2980393, 1.0], 593 + [0.9019608, 0.5725491, 0.2509804, 1.0], 594 + [0.9019608, 0.6431373, 0.4117648, 1.0], 595 + [0.8078432, 0.7137255, 0.5882353, 1.0], 596 + [0.1294118, 0.1294118, 0.1294118, 1.0], 597 + [0.4862746, 0.4862746, 0.4862746, 1.0], 598 + [0.6705883, 0.6705883, 0.6705883, 1.0], 599 + [0.7764706, 0.7568628, 0.7137255, 1.0], 600 + [0.8509804, 0.8509804, 0.8509804, 1.0], 601 + ]; 602 + 603 + pub const FACELINE_COLOR: [[f32; 4]; 10] = [ 604 + [1.0000000, 0.8274510, 0.6784314, 1.0], // cafe 0 605 + [1.0000000, 0.7137255, 0.4196079, 1.0], // cafe 1 606 + [0.8705883, 0.4745099, 0.2588236, 1.0], // cafe 2 607 + [1.0000000, 0.6666667, 0.5490197, 1.0], // cafe 3 608 + [0.6784314, 0.3176471, 0.1607844, 1.0], // cafe 4 609 + [0.3882353, 0.1725491, 0.0941177, 1.0], // cafe 5 610 + [1.0000000, 0.7450981, 0.6470589, 1.0], 611 + [1.0000000, 0.7725491, 0.5607844, 1.0], 612 + [0.5490197, 0.2352942, 0.1372550, 1.0], 613 + [0.2352942, 0.1764706, 0.1372550, 1.0], 614 + ]; 615 + } 616 + }
+132
vfl/src/draw/faceline.rs
··· 1 + use super::wgpu_render::Vertex; 2 + 3 + pub fn trivial_quad() -> (Vec<Vertex>, Vec<u32>) { 4 + ( 5 + vec![ 6 + Vertex { 7 + position: [1.0 - 0.5, 0.0 - 0.5, 0.0], 8 + tex_coords: [0.0, 0.0], 9 + normal: [0.0, 0.0, 0.0], 10 + }, 11 + Vertex { 12 + position: [1.0 - 0.5, 1.0 - 0.5, 0.0], 13 + tex_coords: [0.0, 1.0], 14 + normal: [0.0, 0.0, 0.0], 15 + }, 16 + Vertex { 17 + position: [0.0 - 0.5, 1.0 - 0.5, 0.0], 18 + tex_coords: [1.0, 1.0], 19 + normal: [0.0, 0.0, 0.0], 20 + }, 21 + Vertex { 22 + position: [0.0 - 0.5, 0.0 - 0.5, 0.0], 23 + tex_coords: [1.0, 0.0], 24 + normal: [0.0, 0.0, 0.0], 25 + }, 26 + ], 27 + vec![0, 1, 2, 0, 2, 3], 28 + ) 29 + } 30 + pub fn bgr_to_rgb([b, g, r, a]: [f32; 4]) -> [f32; 4] { 31 + [r, g, b, a] 32 + } 33 + #[cfg(test)] 34 + mod tests { 35 + use crate::charinfo; 36 + use crate::charinfo::nx::NxCharInfo; 37 + use crate::color::nx::modulate; 38 + use crate::draw::faceline::{bgr_to_rgb, trivial_quad}; 39 + use crate::draw::render_2d::Rendered2dShape; 40 + use crate::draw::render_3d::ProgramState; 41 + use crate::draw::wgpu_render::{HeadlessRenderer, Vertex, model_view_matrix, quad, texture}; 42 + use crate::res::shape::nx::{ResourceShape, SHAPE_MID_DAT}; 43 + use crate::res::tex::nx::{ResourceTexture, ResourceTextureFormat, TEXTURE_MID_SRGB_DAT}; 44 + use binrw::BinRead; 45 + use glam::{uvec2, vec3}; 46 + use nalgebra::Matrix4; 47 + use std::error::Error; 48 + use std::{fs::File, io::BufReader}; 49 + use wgpu::CommandEncoder; 50 + 51 + type R = Result<(), Box<dyn Error>>; 52 + 53 + // #[test] 54 + // fn faceline_makeup() -> R { 55 + // let mut headless_renderer = HeadlessRenderer::new(); 56 + // let mut encoder: CommandEncoder = headless_renderer 57 + // .device() 58 + // .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); 59 + 60 + // let char = NxCharInfo::read(&mut File::open("../charline.charinfo").unwrap()).unwrap(); 61 + // let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 62 + 63 + // let res_texture = ResourceTexture::read(&mut bin)?; 64 + 65 + // let tex = res_texture.makeup[char.faceline_make as usize] 66 + // .get_image(&mut BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?))?; 67 + // let tex = image::DynamicImage::ImageRgba8(tex.unwrap()); 68 + 69 + // let target_texture = 70 + // texture::Texture::create_texture(&headless_renderer.device(), &uvec2(256, 512), ""); 71 + 72 + // Rendered2dShape::render_texture_trivial( 73 + // tex, 74 + // modulate(crate::color::nx::ColorModulated::FacelineMakeup, &char), 75 + // Some(bgr_to_rgb( 76 + // crate::color::nx::srgb::FACELINE_COLOR[usize::from(char.faceline_color)], 77 + // )), 78 + // &mut headless_renderer, 79 + // &target_texture.view, 80 + // &mut encoder, 81 + // ); 82 + 83 + // let image = headless_renderer.output_texture(&target_texture, encoder); 84 + 85 + // println!("Done!"); 86 + // image.save(concat!( 87 + // env!("CARGO_MANIFEST_DIR"), 88 + // "/test_output/faceline_makeup.png" 89 + // ))?; 90 + 91 + // Ok(()) 92 + // } 93 + 94 + // #[test] 95 + // fn faceline_beard() -> R { 96 + // let mut headless_renderer = HeadlessRenderer::new(); 97 + // let mut encoder: CommandEncoder = headless_renderer 98 + // .device() 99 + // .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); 100 + 101 + // let char = NxCharInfo::read(&mut File::open("../testguy.charinfo").unwrap()).unwrap(); 102 + // let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 103 + 104 + // let res_texture = ResourceTexture::read(&mut bin)?; 105 + 106 + // let tex = res_texture.beard[0] 107 + // .get_image(&mut BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?))?; 108 + // let tex = image::DynamicImage::ImageRgba8(tex.unwrap()); 109 + 110 + // let target_texture = 111 + // texture::Texture::create_texture(&headless_renderer.device(), &uvec2(256, 512), ""); 112 + 113 + // Rendered2dShape::render_texture_trivial( 114 + // tex, 115 + // modulate(crate::color::nx::ColorModulated::FacelineMakeup, &char), 116 + // None, 117 + // &mut headless_renderer, 118 + // &target_texture.view, 119 + // &mut encoder, 120 + // ); 121 + 122 + // let image = headless_renderer.output_texture(&target_texture, encoder); 123 + 124 + // println!("Done!"); 125 + // image.save(concat!( 126 + // env!("CARGO_MANIFEST_DIR"), 127 + // "/test_output/faceline_beard.png" 128 + // ))?; 129 + 130 + // Ok(()) 131 + // } 132 + }
+252
vfl/src/draw/mask.rs
··· 1 + use crate::charinfo::nx::NxCharInfo; 2 + 3 + use super::{TEX_SCALE_X, TEX_SCALE_Y}; 4 + 5 + const fn tex_scale2dim(scale: f32) -> f32 { 6 + 1.0 + 0.4 * scale 7 + } 8 + 9 + // i16 to not lose precision 10 + const fn tex_rotate2ang(rotate: i16) -> f32 { 11 + (360.0 / 32.0) * (rotate % 32) as f32 12 + } 13 + 14 + const fn tex_unit(x: f32) -> f32 { 15 + x / 64.0 16 + } 17 + 18 + const TEX_EYE_BASE_X: f32 = tex_unit(0.0); 19 + const TEX_EYE_BASE_Y: f32 = 18.451_525; 20 + const TEX_EYE_BASE_W: f32 = tex_unit(342.0); 21 + const TEX_EYE_BASE_H: f32 = tex_unit(288.0); 22 + 23 + const TEX_EYEBROW_BASE_X: f32 = tex_unit(0.0); 24 + const TEX_EYEBROW_BASE_Y: f32 = 16.549_807; 25 + const TEX_EYEBROW_BASE_W: f32 = tex_unit(324.0); 26 + const TEX_EYEBROW_BASE_H: f32 = tex_unit(288.0); 27 + 28 + const TEX_MOUTH_BASE_Y: f32 = 29.25885; 29 + const TEX_MOUTH_BASE_W: f32 = tex_unit(396.0); 30 + const TEX_MOUTH_BASE_H: f32 = tex_unit(288.0); 31 + 32 + const TEX_MUSTACHE_BASE_Y: f32 = 31.763_554; 33 + const TEX_MUSTACHE_BASE_W: f32 = tex_unit(288.0); 34 + const TEX_MUSTACHE_BASE_H: f32 = tex_unit(576.0); 35 + 36 + const TEX_MOLE_BASE_X: f32 = 17.766_165; 37 + const TEX_MOLE_BASE_Y: f32 = 17.95986; 38 + const TEX_MOLE_BASE_W: f32 = tex_unit(0.0); 39 + const TEX_MOLE_BASE_H: f32 = tex_unit(0.0); 40 + 41 + const EYE_ROT_OFFSET: [u8; 50] = [ 42 + 29, 28, 28, 28, 29, 28, 28, 28, 29, 28, 28, 28, 28, 29, 29, 28, 28, 28, 29, 29, 28, 29, 28, 29, 43 + 29, 28, 29, 28, 28, 29, 28, 28, 28, 29, 29, 29, 28, 28, 29, 29, 29, 28, 28, 29, 29, 29, 29, 29, 44 + 28, 28, 45 + ]; 46 + 47 + const EYEBROW_ROT_OFFSET: [u8; 24] = [ 48 + 26, 26, 27, 25, 26, 25, 26, 25, 28, 25, 26, 24, 27, 27, 26, 26, 25, 25, 26, 26, 27, 26, 25, 27, 49 + ]; 50 + 51 + // Found in RFL, no idea what it is 52 + const RFL_MAGIC_Y_OFFSET: f32 = 1.160_000_1; 53 + 54 + #[derive(Clone, Copy, Debug, PartialEq, Eq)] 55 + pub enum ImageOrigin { 56 + Center, 57 + Left, 58 + Right, 59 + Ignore, 60 + } 61 + 62 + #[derive(Clone, Copy, Debug)] 63 + pub struct FacePart { 64 + pub x: f32, 65 + pub y: f32, 66 + pub width: f32, 67 + pub height: f32, 68 + pub angle_deg: f32, 69 + pub origin: ImageOrigin, 70 + } 71 + 72 + /// The positioning of all parts of the face on the mask. 73 + #[derive(Clone, Copy, Debug)] 74 + pub struct MaskFaceParts { 75 + pub eye: [FacePart; 2], 76 + pub eyebrow: [FacePart; 2], 77 + pub mouth: FacePart, 78 + pub mustache: [FacePart; 2], 79 + pub mole: FacePart, 80 + } 81 + 82 + impl MaskFaceParts { 83 + pub fn init_glasses( 84 + info: &NxCharInfo, 85 + resolution: f32, 86 + nose_translate: [f32; 3], 87 + ) -> [FacePart; 2] { 88 + let resolution = resolution / 64.0; 89 + 90 + let glass_y = TEX_EYE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.glass_y); 91 + let glass_w = TEX_EYE_BASE_W * tex_scale2dim(info.glass_scale.into()); 92 + let glass_h = TEX_EYE_BASE_H * tex_scale2dim(info.glass_scale.into()); 93 + // let eye_a = 94 + // tex_rotate2ang((info + EYE_ROT_OFFSET[info.glass_type as usize]).into()); 95 + 96 + let eye_l = FacePart { 97 + x: resolution * (32.0), 98 + y: glass_y * resolution, 99 + width: glass_w * resolution, 100 + height: glass_h * resolution, 101 + angle_deg: 360.0 - 0.0, 102 + origin: ImageOrigin::Left, 103 + }; 104 + let eye_r = FacePart { 105 + x: resolution * (32.0), 106 + y: glass_y * resolution, 107 + width: glass_w * resolution, 108 + height: glass_h * resolution, 109 + angle_deg: 0.0, 110 + origin: ImageOrigin::Right, 111 + }; 112 + 113 + [eye_l, eye_r] 114 + } 115 + pub fn init(info: &NxCharInfo, resolution: f32) -> MaskFaceParts { 116 + // RFLi_TEX_UNIT 117 + let resolution = resolution / 64.0; 118 + 119 + let eye_spacing_x = TEX_EYE_BASE_X + TEX_SCALE_X * f32::from(info.eye_x); 120 + let eye_y = TEX_EYE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.eye_y); 121 + let eye_w = TEX_EYE_BASE_W * tex_scale2dim(info.eye_scale.into()); 122 + let eye_h = TEX_EYE_BASE_H * tex_scale2dim(info.eye_scale.into()); 123 + let eye_a = 124 + tex_rotate2ang((info.eye_rotate + EYE_ROT_OFFSET[info.eye_type as usize]).into()); 125 + 126 + let eye_l = FacePart { 127 + x: resolution * (32.0 + eye_spacing_x), 128 + y: eye_y * resolution, 129 + width: eye_w * resolution, 130 + height: eye_h * resolution, 131 + angle_deg: 360.0 - eye_a, 132 + origin: ImageOrigin::Left, 133 + }; 134 + let eye_r = FacePart { 135 + x: resolution * (32.0 - eye_spacing_x), 136 + y: eye_y * resolution, 137 + width: eye_w * resolution, 138 + height: eye_h * resolution, 139 + angle_deg: eye_a, 140 + origin: ImageOrigin::Right, 141 + }; 142 + 143 + let eb_spacing_x = TEX_EYEBROW_BASE_X + TEX_SCALE_X * f32::from(info.eyebrow_x); 144 + let eb_y = 145 + TEX_EYEBROW_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.eyebrow_y); 146 + let eb_w = TEX_EYEBROW_BASE_W * tex_scale2dim(info.eyebrow_scale.into()); 147 + let eb_h = TEX_EYEBROW_BASE_H * tex_scale2dim(info.eyebrow_scale.into()); 148 + let eb_a = tex_rotate2ang( 149 + (info.eyebrow_rotate + EYEBROW_ROT_OFFSET[info.eyebrow_type as usize]).into(), 150 + ); 151 + let eb_l = FacePart { 152 + x: resolution * (32.0 + eb_spacing_x), 153 + y: eb_y * resolution, 154 + width: eb_w * resolution, 155 + height: eb_h * resolution, 156 + angle_deg: 360.0 - eb_a, 157 + origin: ImageOrigin::Left, 158 + }; 159 + let eb_r = FacePart { 160 + x: resolution * (32.0 - eb_spacing_x), 161 + y: eb_y * resolution, 162 + width: eb_w * resolution, 163 + height: eb_h * resolution, 164 + angle_deg: eb_a, 165 + origin: ImageOrigin::Right, 166 + }; 167 + 168 + let mouth_y = TEX_MOUTH_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.mouth_y); 169 + let mouth_w = TEX_MOUTH_BASE_W * tex_scale2dim(info.mouth_scale.into()); 170 + let mouth_h = TEX_MOUTH_BASE_H * tex_scale2dim(info.mouth_scale.into()); 171 + 172 + let mouth = FacePart { 173 + x: resolution * 32.0, 174 + y: mouth_y * resolution, 175 + width: mouth_w * resolution, 176 + height: mouth_h * resolution, 177 + angle_deg: 0.0, 178 + origin: ImageOrigin::Center, 179 + }; 180 + 181 + let mus_y = 182 + TEX_MUSTACHE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.mustache_y); 183 + let mus_w = TEX_MUSTACHE_BASE_W * tex_scale2dim(info.mustache_scale.into()); 184 + let mus_h = TEX_MUSTACHE_BASE_H * tex_scale2dim(info.mustache_scale.into()); 185 + 186 + let mus_l = FacePart { 187 + x: resolution * 32.0, 188 + y: mus_y * resolution, 189 + width: mus_w * resolution, 190 + height: mus_h * resolution, 191 + angle_deg: 0.0, 192 + origin: ImageOrigin::Left, 193 + }; 194 + let mus_r = FacePart { 195 + x: resolution * 32.0, 196 + y: mus_y * resolution, 197 + width: mus_w * resolution, 198 + height: mus_h * resolution, 199 + angle_deg: 0.0, 200 + origin: ImageOrigin::Right, 201 + }; 202 + 203 + let mole_x = TEX_MOLE_BASE_X + 2.0 * TEX_SCALE_X * f32::from(info.mole_x); 204 + let mole_y = TEX_MOLE_BASE_Y + RFL_MAGIC_Y_OFFSET * TEX_SCALE_Y * f32::from(info.mole_y); 205 + let mole_w = TEX_MOLE_BASE_W * tex_scale2dim(info.mole_scale.into()); 206 + let mole_h = TEX_MOLE_BASE_H * tex_scale2dim(info.mole_scale.into()); 207 + 208 + let mole = FacePart { 209 + x: mole_x * resolution, 210 + y: mole_y * resolution, 211 + width: mole_w * resolution, 212 + height: mole_h * resolution, 213 + angle_deg: 0.0, 214 + origin: ImageOrigin::Center, 215 + }; 216 + 217 + MaskFaceParts { 218 + eye: [eye_l, eye_r], 219 + eyebrow: [eb_l, eb_r], 220 + mouth, 221 + mustache: [mus_l, mus_r], 222 + mole, 223 + } 224 + } 225 + } 226 + 227 + #[cfg(test)] 228 + mod tests { 229 + use crate::res::shape::nx::{ResourceShape, SHAPE_MID_DAT}; 230 + use binrw::BinRead; 231 + use std::error::Error; 232 + use std::{fs::File, io::BufReader}; 233 + 234 + type R = Result<(), Box<dyn Error>>; 235 + 236 + // #[test] 237 + // fn mask_shape() -> R { 238 + // let mut bin = BufReader::new(File::open(SHAPE_MID_DAT)?); 239 + 240 + // let res = ResourceShape::read(&mut bin)?; 241 + 242 + // let mut shape = res.mask[1]; 243 + // let mut shape = shape.shape_data(&mut bin)?; 244 + 245 + // // let mut file = File::open(SHAPE_MID_DAT)?; 246 + 247 + // // let gltf = shape.gltf(&mut file)?; 248 + // // gltf.export_glb("jas.glb")?; 249 + // // 250 + // Ok(()) 251 + // } 252 + }
+12
vfl/src/draw/mod.rs
··· 1 + #[cfg(feature = "draw")] 2 + pub mod render_2d; 3 + #[cfg(feature = "draw")] 4 + pub mod render_3d; 5 + #[cfg(feature = "draw")] 6 + pub mod wgpu_render; 7 + 8 + pub mod faceline; 9 + pub mod mask; 10 + 11 + pub const TEX_SCALE_X: f32 = 0.889_614_64; 12 + pub const TEX_SCALE_Y: f32 = 0.927_667_5;
+353
vfl/src/draw/render_2d.rs
··· 1 + use bytemuck::cast_slice; 2 + use glam::vec3; 3 + use image::DynamicImage; 4 + use nalgebra::Matrix4; 5 + use wgpu::{ 6 + CommandEncoder, PipelineCompilationOptions, TexelCopyTextureInfo, TextureFormat, TextureView, 7 + include_wgsl, util::DeviceExt, 8 + }; 9 + 10 + use crate::{ 11 + color::nx::{ModulationIntent, modulate}, 12 + res::tex::nx::{RawTexture, ResourceTexture, ResourceTextureFormat, TextureElement}, 13 + }; 14 + 15 + use super::{ 16 + faceline::trivial_quad, 17 + render_3d::ProgramState, 18 + wgpu_render::{TextureTransformUniform, Vertex}, 19 + }; 20 + 21 + type Color = [f32; 4]; 22 + 23 + const NON_REPLACEMENT: Color = [f32::NAN, f32::NAN, f32::NAN, f32::NAN]; 24 + #[derive(Debug)] 25 + pub struct Rendered2dShape { 26 + pub vertices: Vec<Vertex>, 27 + pub indices: Vec<u32>, 28 + pub tex: RawTexture, 29 + pub mvp_matrix: Matrix4<f32>, 30 + pub modulation: ModulationIntent, 31 + pub opaque: Option<Color>, 32 + } 33 + 34 + pub fn texture_format_to_wgpu(tex: TextureElement) -> TextureFormat { 35 + use TextureFormat as WgpuTextureFormat; 36 + let format = ResourceTextureFormat::try_from(tex.texture.format).unwrap(); 37 + match format { 38 + ResourceTextureFormat::R => WgpuTextureFormat::R8Unorm, 39 + ResourceTextureFormat::Rg => WgpuTextureFormat::Rg8Unorm, 40 + ResourceTextureFormat::Rgba => WgpuTextureFormat::Rgba8Unorm, 41 + ResourceTextureFormat::Bc4 => WgpuTextureFormat::Bc4RUnorm, 42 + ResourceTextureFormat::Bc5 => WgpuTextureFormat::Bc5RgUnorm, 43 + ResourceTextureFormat::Bc7 => WgpuTextureFormat::Bc7RgbaUnorm, 44 + ResourceTextureFormat::Astc4x4 => WgpuTextureFormat::Astc { 45 + block: wgpu::AstcBlock::B4x4, 46 + channel: wgpu::AstcChannel::Unorm, 47 + }, 48 + } 49 + } 50 + 51 + pub fn texture_format_buffer_layout(tex: TextureElement) -> wgpu::TexelCopyBufferLayout { 52 + use ResourceTextureFormat as Rtf; 53 + const BC3_BYTES_PER_BLOCK: u32 = 16; 54 + const BC3_PIXELS_PER_BLOCK: u32 = 4; 55 + const BC4_BYTES_PER_BLOCK: u32 = 8; 56 + 57 + let format = Rtf::try_from(tex.texture.format).unwrap(); 58 + 59 + match format { 60 + Rtf::R => wgpu::TexelCopyBufferLayout { 61 + offset: 0, 62 + bytes_per_row: Some(u32::from(tex.texture.width)), 63 + rows_per_image: None, 64 + }, 65 + Rtf::Rg => wgpu::TexelCopyBufferLayout { 66 + offset: 0, 67 + bytes_per_row: Some(2 * u32::from(tex.texture.width)), 68 + rows_per_image: None, 69 + }, 70 + Rtf::Astc4x4 | Rtf::Bc7 | Rtf::Bc4 | Rtf::Rgba => wgpu::TexelCopyBufferLayout { 71 + offset: 0, 72 + bytes_per_row: Some((16 / 4) * u32::from(tex.texture.width)), 73 + rows_per_image: None, 74 + }, 75 + Rtf::Bc5 => wgpu::TexelCopyBufferLayout { 76 + offset: 0, 77 + bytes_per_row: Some((32 / 4) * u32::from(tex.texture.width)), 78 + rows_per_image: None, 79 + }, 80 + } 81 + } 82 + 83 + impl Rendered2dShape { 84 + pub fn render_texture_trivial( 85 + rendered_texture: RawTexture, 86 + modulation: ModulationIntent, 87 + opaque: Option<Color>, 88 + st: &mut impl ProgramState, 89 + texture_view: &TextureView, 90 + encoder: &mut CommandEncoder, 91 + ) { 92 + let (vertices, indices) = trivial_quad(); 93 + 94 + let mvp_matrix = { 95 + let scale = vec3(-2.0, -2.0, 1.0); 96 + let scale = nalgebra::Vector3::<f32>::from(Into::<mint::Vector3<f32>>::into(scale)); 97 + 98 + nalgebra::Matrix4::new_nonuniform_scaling(&scale) 99 + }; 100 + 101 + let rendered_2d_shape = Rendered2dShape { 102 + vertices, 103 + indices, 104 + tex: rendered_texture, 105 + mvp_matrix, 106 + modulation, 107 + opaque, 108 + }; 109 + 110 + rendered_2d_shape.render(st, texture_view, encoder); 111 + } 112 + 113 + #[allow(clippy::too_many_lines)] 114 + pub fn render( 115 + self, 116 + st: &mut impl ProgramState, 117 + texture_view: &TextureView, 118 + encoder: &mut CommandEncoder, 119 + ) { 120 + let vertex_buffer = st 121 + .device() 122 + .create_buffer_init(&wgpu::util::BufferInitDescriptor { 123 + label: Some("Vertex Buffer"), 124 + contents: cast_slice(&self.vertices), 125 + usage: wgpu::BufferUsages::VERTEX, 126 + }); 127 + 128 + let index_buffer = st 129 + .device() 130 + .create_buffer_init(&wgpu::util::BufferInitDescriptor { 131 + label: Some("Index Buffer"), 132 + contents: cast_slice(&self.indices), 133 + usage: wgpu::BufferUsages::INDEX, 134 + }); 135 + 136 + let shape_texture_size = wgpu::Extent3d { 137 + width: u32::from(self.tex.metadata.texture.width), 138 + height: u32::from(self.tex.metadata.texture.height), 139 + depth_or_array_layers: 1, 140 + }; 141 + let shape_diffuse_texture = st.device().create_texture(&wgpu::TextureDescriptor { 142 + size: shape_texture_size, 143 + mip_level_count: 1, 144 + sample_count: 1, 145 + dimension: wgpu::TextureDimension::D2, 146 + format: texture_format_to_wgpu(self.tex.metadata), 147 + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, 148 + label: Some("diffuse_texture"), 149 + view_formats: &[ 150 + texture_format_to_wgpu(self.tex.metadata), 151 + texture_format_to_wgpu(self.tex.metadata).add_srgb_suffix(), 152 + ], 153 + }); 154 + 155 + st.queue().write_texture( 156 + TexelCopyTextureInfo { 157 + texture: &shape_diffuse_texture, 158 + mip_level: 0, 159 + origin: wgpu::Origin3d::ZERO, 160 + aspect: wgpu::TextureAspect::All, 161 + }, 162 + &self.tex.bytes, 163 + texture_format_buffer_layout(self.tex.metadata), 164 + shape_texture_size, 165 + ); 166 + 167 + let shape_diffuse_texture_view = 168 + shape_diffuse_texture.create_view(&wgpu::TextureViewDescriptor { 169 + format: Some(texture_format_to_wgpu(self.tex.metadata)), 170 + ..Default::default() 171 + }); 172 + let shape_diffuse_sampler = st.device().create_sampler(&wgpu::SamplerDescriptor { 173 + address_mode_u: wgpu::AddressMode::ClampToEdge, 174 + address_mode_v: wgpu::AddressMode::ClampToEdge, 175 + address_mode_w: wgpu::AddressMode::ClampToEdge, 176 + mag_filter: wgpu::FilterMode::Linear, 177 + min_filter: wgpu::FilterMode::Nearest, 178 + mipmap_filter: wgpu::FilterMode::Nearest, 179 + ..Default::default() 180 + }); 181 + 182 + let texture_bind_group_layout = 183 + st.device() 184 + .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 185 + entries: &[ 186 + wgpu::BindGroupLayoutEntry { 187 + binding: 0, 188 + visibility: wgpu::ShaderStages::FRAGMENT, 189 + ty: wgpu::BindingType::Texture { 190 + multisampled: false, 191 + view_dimension: wgpu::TextureViewDimension::D2, 192 + sample_type: wgpu::TextureSampleType::Float { filterable: true }, 193 + }, 194 + count: None, 195 + }, 196 + wgpu::BindGroupLayoutEntry { 197 + binding: 1, 198 + visibility: wgpu::ShaderStages::FRAGMENT, 199 + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), 200 + count: None, 201 + }, 202 + ], 203 + label: Some("texture_bind_group_layout"), 204 + }); 205 + 206 + let shape_diffuse_bind_group = st.device().create_bind_group(&wgpu::BindGroupDescriptor { 207 + layout: &texture_bind_group_layout, 208 + entries: &[ 209 + wgpu::BindGroupEntry { 210 + binding: 0, 211 + resource: wgpu::BindingResource::TextureView(&shape_diffuse_texture_view), 212 + }, 213 + wgpu::BindGroupEntry { 214 + binding: 1, 215 + resource: wgpu::BindingResource::Sampler(&shape_diffuse_sampler), 216 + }, 217 + ], 218 + label: Some("diffuse_bind_group"), 219 + }); 220 + 221 + let mvp_matrix = self.mvp_matrix.into(); 222 + let mvp_uniform = TextureTransformUniform { 223 + mvp_matrix, 224 + channel_replacements_r: self.modulation.channels[0], 225 + channel_replacements_g: self.modulation.channels[1], 226 + channel_replacements_b: self.modulation.channels[2], 227 + texture_type: (Into::<u8>::into(self.modulation.mode)).into(), 228 + pad: Default::default(), 229 + }; 230 + 231 + let mvp_buffer = st 232 + .device() 233 + .create_buffer_init(&wgpu::util::BufferInitDescriptor { 234 + label: Some("MvpMatrix Buffer"), 235 + contents: cast_slice(&[mvp_uniform]), 236 + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, 237 + }); 238 + 239 + let mvp_bind_group_layout = 240 + st.device() 241 + .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 242 + entries: &[wgpu::BindGroupLayoutEntry { 243 + binding: 0, 244 + visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, 245 + ty: wgpu::BindingType::Buffer { 246 + ty: wgpu::BufferBindingType::Uniform, 247 + has_dynamic_offset: false, 248 + min_binding_size: None, 249 + }, 250 + count: None, 251 + }], 252 + label: Some("mvp_bind_group_layout"), 253 + }); 254 + 255 + let mvp_bind_group = st.device().create_bind_group(&wgpu::BindGroupDescriptor { 256 + layout: &mvp_bind_group_layout, 257 + entries: &[wgpu::BindGroupEntry { 258 + binding: 0, 259 + resource: mvp_buffer.as_entire_binding(), 260 + }], 261 + label: Some("mvp_bind_group"), 262 + }); 263 + 264 + let shader_module = st 265 + .device() 266 + .create_shader_module(include_wgsl!("shader.wgsl")); 267 + let render_pipeline_layout = 268 + st.device() 269 + .create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { 270 + label: Some("Render Pipeline Layout"), 271 + bind_group_layouts: &[&texture_bind_group_layout, &mvp_bind_group_layout], 272 + push_constant_ranges: &[], 273 + }); 274 + let render_pipeline = st 275 + .device() 276 + .create_render_pipeline(&wgpu::RenderPipelineDescriptor { 277 + label: Some("Render Pipeline"), 278 + layout: Some(&render_pipeline_layout), 279 + vertex: wgpu::VertexState { 280 + module: &shader_module, 281 + entry_point: Some("vs_main"), 282 + buffers: &[Vertex::desc()], 283 + compilation_options: PipelineCompilationOptions::default(), 284 + }, 285 + fragment: Some(wgpu::FragmentState { 286 + module: &shader_module, 287 + entry_point: Some("fs_main"), 288 + targets: &[Some(wgpu::ColorTargetState { 289 + format: st.surface_fmt().add_srgb_suffix(), 290 + blend: Some(wgpu::BlendState::ALPHA_BLENDING), 291 + write_mask: wgpu::ColorWrites::ALL, 292 + })], 293 + compilation_options: PipelineCompilationOptions::default(), 294 + }), 295 + primitive: wgpu::PrimitiveState { 296 + topology: wgpu::PrimitiveTopology::TriangleList, 297 + strip_index_format: None, 298 + front_face: wgpu::FrontFace::Ccw, 299 + cull_mode: None, 300 + // Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE 301 + polygon_mode: wgpu::PolygonMode::Fill, 302 + // Requires Features::DEPTH_CLIP_CONTROL 303 + unclipped_depth: false, 304 + // Requires Features::CONSERVATIVE_RASTERIZATION 305 + conservative: false, 306 + }, 307 + depth_stencil: None, 308 + multisample: wgpu::MultisampleState { 309 + count: 1, 310 + mask: !0, 311 + alpha_to_coverage_enabled: false, 312 + }, 313 + // If the pipeline will be used with a multiview render pass, this 314 + // indicates how many array layers the attachments will have. 315 + multiview: None, 316 + cache: None, 317 + }); 318 + 319 + { 320 + let render_pass_desc = wgpu::RenderPassDescriptor { 321 + label: Some("Render Pass"), 322 + color_attachments: &[Some(wgpu::RenderPassColorAttachment { 323 + view: texture_view, 324 + resolve_target: None, 325 + ops: wgpu::Operations { 326 + load: match self.opaque { 327 + Some([r, g, b, a]) => wgpu::LoadOp::Clear(wgpu::Color { 328 + r: r.into(), 329 + g: g.into(), 330 + b: b.into(), 331 + a: a.into(), 332 + }), 333 + None => wgpu::LoadOp::Load, 334 + }, 335 + store: wgpu::StoreOp::Store, 336 + }, 337 + })], 338 + depth_stencil_attachment: None, 339 + occlusion_query_set: None, 340 + timestamp_writes: None, 341 + }; 342 + let mut render_pass = encoder.begin_render_pass(&render_pass_desc); 343 + 344 + render_pass.set_pipeline(&render_pipeline); 345 + render_pass.set_bind_group(0, &shape_diffuse_bind_group, &[]); 346 + render_pass.set_bind_group(1, &mvp_bind_group, &[]); 347 + render_pass.set_vertex_buffer(0, vertex_buffer.slice(..)); 348 + render_pass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); 349 + 350 + render_pass.draw_indexed(0..self.indices.len().try_into().unwrap(), 0, 0..1); 351 + } 352 + } 353 + }
+245
vfl/src/draw/render_3d.rs
··· 1 + use bytemuck::cast_slice; 2 + use glam::{Vec3, Vec4}; 3 + use wgpu::{ 4 + BlendState, CommandEncoder, PipelineCompilationOptions, TextureView, include_wgsl, 5 + util::DeviceExt, 6 + }; 7 + 8 + use super::wgpu_render::{Vertex, texture}; 9 + 10 + #[repr(C)] 11 + #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] 12 + struct CharShapeUniform { 13 + diffuse_color: [f32; 4], 14 + position: [f32; 3], 15 + _pad: f32, 16 + } 17 + 18 + pub trait ProgramState { 19 + fn device(&self) -> wgpu::Device; 20 + fn queue(&self) -> wgpu::Queue; 21 + fn camera_bgl(&self) -> &wgpu::BindGroupLayout; 22 + fn camera_bg(&self) -> &wgpu::BindGroup; 23 + fn surface_fmt(&self) -> wgpu::TextureFormat; 24 + fn depth_texture(&self) -> &texture::TextureBundle; 25 + } 26 + 27 + #[derive(Default, Debug)] 28 + pub struct Rendered3dShape { 29 + pub vertices: Vec<Vertex>, 30 + pub indices: Vec<u32>, 31 + pub color: Vec4, 32 + pub texture: Option<crate::draw::wgpu_render::texture::TextureBundle>, 33 + pub position: Vec3, 34 + } 35 + 36 + impl Rendered3dShape { 37 + #[allow(clippy::too_many_lines)] 38 + pub fn render( 39 + &mut self, 40 + st: &mut impl ProgramState, 41 + texture_view: &TextureView, 42 + encoder: &mut CommandEncoder, 43 + ) { 44 + let vertex_buffer = st 45 + .device() 46 + .create_buffer_init(&wgpu::util::BufferInitDescriptor { 47 + label: Some("Vertex Buffer"), 48 + contents: cast_slice(&self.vertices), 49 + usage: wgpu::BufferUsages::VERTEX, 50 + }); 51 + 52 + let index_buffer = st 53 + .device() 54 + .create_buffer_init(&wgpu::util::BufferInitDescriptor { 55 + label: Some("Index Buffer"), 56 + contents: cast_slice(&self.indices), 57 + usage: wgpu::BufferUsages::INDEX, 58 + }); 59 + 60 + let char_shape_uniform = CharShapeUniform { 61 + diffuse_color: self.color.into(), 62 + position: self.position.into(), 63 + _pad: 0.0, 64 + }; 65 + let char_shape_buffer = st 66 + .device() 67 + .create_buffer_init(&wgpu::util::BufferInitDescriptor { 68 + label: Some("Cs Buffer"), 69 + contents: cast_slice(&[char_shape_uniform]), 70 + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, 71 + }); 72 + let char_shape_bind_group_layout = 73 + st.device() 74 + .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 75 + entries: &[wgpu::BindGroupLayoutEntry { 76 + binding: 0, 77 + visibility: wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT, 78 + ty: wgpu::BindingType::Buffer { 79 + ty: wgpu::BufferBindingType::Uniform, 80 + has_dynamic_offset: false, 81 + min_binding_size: None, 82 + }, 83 + count: None, 84 + }], 85 + label: Some("cs_group_layout"), 86 + }); 87 + 88 + let char_shape_bind_group = st.device().create_bind_group(&wgpu::BindGroupDescriptor { 89 + layout: &char_shape_bind_group_layout, 90 + entries: &[wgpu::BindGroupEntry { 91 + binding: 0, 92 + resource: char_shape_buffer.as_entire_binding(), 93 + }], 94 + label: Some("cs_bind_group"), 95 + }); 96 + 97 + let mut bind_group_layouts = vec![st.camera_bgl(), &char_shape_bind_group_layout]; 98 + 99 + let projected_texture_bind_group_layout = 100 + st.device() 101 + .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 102 + entries: &[ 103 + wgpu::BindGroupLayoutEntry { 104 + binding: 0, 105 + visibility: wgpu::ShaderStages::FRAGMENT, 106 + ty: wgpu::BindingType::Texture { 107 + multisampled: false, 108 + view_dimension: wgpu::TextureViewDimension::D2, 109 + sample_type: wgpu::TextureSampleType::Float { filterable: true }, 110 + }, 111 + count: None, 112 + }, 113 + wgpu::BindGroupLayoutEntry { 114 + binding: 1, 115 + visibility: wgpu::ShaderStages::FRAGMENT, 116 + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), 117 + count: None, 118 + }, 119 + ], 120 + label: Some("texture_bind_group_layout"), 121 + }); 122 + if self.texture.is_some() { 123 + bind_group_layouts.push(&projected_texture_bind_group_layout); 124 + } 125 + 126 + let shader_module = if self.texture.is_some() { 127 + st.device() 128 + .create_shader_module(include_wgsl!("shader-3d-texture.wgsl")) 129 + } else { 130 + st.device() 131 + .create_shader_module(include_wgsl!("shader-3d.wgsl")) 132 + }; 133 + 134 + // Optional projected texture 135 + let projected_texture_bind_group = self.texture.as_ref().map(|texture| { 136 + st.device().create_bind_group(&wgpu::BindGroupDescriptor { 137 + layout: &projected_texture_bind_group_layout, 138 + entries: &[ 139 + wgpu::BindGroupEntry { 140 + binding: 0, 141 + resource: wgpu::BindingResource::TextureView(&texture.view), 142 + }, 143 + wgpu::BindGroupEntry { 144 + binding: 1, 145 + resource: wgpu::BindingResource::Sampler(&texture.sampler), 146 + }, 147 + ], 148 + label: Some("diffuse_bind_group"), 149 + }) 150 + }); 151 + 152 + let render_pipeline_layout = 153 + st.device() 154 + .create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { 155 + label: Some("Render Pipeline Layout"), 156 + bind_group_layouts: &bind_group_layouts, 157 + push_constant_ranges: &[], 158 + }); 159 + let render_pipeline = st 160 + .device() 161 + .create_render_pipeline(&wgpu::RenderPipelineDescriptor { 162 + label: Some("Render Pipeline"), 163 + layout: Some(&render_pipeline_layout), 164 + vertex: wgpu::VertexState { 165 + module: &shader_module, 166 + entry_point: Some("vs_main"), 167 + buffers: &[Vertex::desc()], 168 + compilation_options: PipelineCompilationOptions::default(), 169 + }, 170 + fragment: Some(wgpu::FragmentState { 171 + module: &shader_module, 172 + entry_point: Some("fs_main"), 173 + targets: &[Some(wgpu::ColorTargetState { 174 + format: st.surface_fmt().add_srgb_suffix(), 175 + blend: Some(BlendState::ALPHA_BLENDING), 176 + write_mask: wgpu::ColorWrites::ALL, 177 + })], 178 + compilation_options: PipelineCompilationOptions::default(), 179 + }), 180 + primitive: wgpu::PrimitiveState { 181 + topology: wgpu::PrimitiveTopology::TriangleList, 182 + strip_index_format: None, 183 + front_face: wgpu::FrontFace::Ccw, 184 + cull_mode: None, // TODO toggle 185 + // Setting this to anything other than Fill requires Features::NON_FILL_POLYGON_MODE 186 + polygon_mode: wgpu::PolygonMode::Fill, 187 + // Requires Features::DEPTH_CLIP_CONTROL 188 + unclipped_depth: false, 189 + // Requires Features::CONSERVATIVE_RASTERIZATION 190 + conservative: false, 191 + }, 192 + depth_stencil: Some(wgpu::DepthStencilState { 193 + format: texture::TextureBundle::DEPTH_FORMAT, 194 + depth_write_enabled: true, 195 + depth_compare: wgpu::CompareFunction::Less, // 1. 196 + stencil: wgpu::StencilState::default(), // 2. 197 + bias: wgpu::DepthBiasState::default(), 198 + }), 199 + multisample: wgpu::MultisampleState { 200 + count: 1, 201 + mask: !0, 202 + alpha_to_coverage_enabled: false, 203 + }, 204 + // If the pipeline will be used with a multiview render pass, this 205 + // indicates how many array layers the attachments will have. 206 + multiview: None, 207 + cache: None, 208 + }); 209 + 210 + // Scoped lifetime to drop the render pass 211 + { 212 + let render_pass_desc = wgpu::RenderPassDescriptor { 213 + label: Some("Render Pass"), 214 + color_attachments: &[Some(wgpu::RenderPassColorAttachment { 215 + view: texture_view, 216 + resolve_target: None, 217 + ops: wgpu::Operations { 218 + load: wgpu::LoadOp::Load, 219 + store: wgpu::StoreOp::Store, 220 + }, 221 + })], 222 + depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment { 223 + view: &st.depth_texture().view, 224 + depth_ops: Some(wgpu::Operations { 225 + load: wgpu::LoadOp::Load, 226 + store: wgpu::StoreOp::Store, 227 + }), 228 + stencil_ops: None, 229 + }), 230 + occlusion_query_set: None, 231 + timestamp_writes: None, 232 + }; 233 + let mut render_pass = encoder.begin_render_pass(&render_pass_desc); 234 + 235 + render_pass.set_pipeline(&render_pipeline); 236 + render_pass.set_bind_group(0, st.camera_bg(), &[]); 237 + render_pass.set_bind_group(1, &char_shape_bind_group, &[]); 238 + render_pass.set_bind_group(2, &projected_texture_bind_group, &[]); 239 + render_pass.set_vertex_buffer(0, vertex_buffer.slice(..)); 240 + render_pass.set_index_buffer(index_buffer.slice(..), wgpu::IndexFormat::Uint32); 241 + 242 + render_pass.draw_indexed(0..self.indices.len().try_into().unwrap(), 0, 0..1); 243 + } 244 + } 245 + }
+60
vfl/src/draw/shader-3d-texture.wgsl
··· 1 + struct CameraUniform { 2 + view_proj: mat4x4<f32>, 3 + }; 4 + @group(0) @binding(0) 5 + var<uniform> camera: CameraUniform; 6 + 7 + struct CharShapeUniform { 8 + color: vec4<f32> 9 + } 10 + @group(1) @binding(0) 11 + var<uniform> char_shape: CharShapeUniform; 12 + 13 + @group(2) @binding(0) 14 + var t_diffuse: texture_2d<f32>; 15 + @group(2) @binding(1) 16 + var s_diffuse: sampler; 17 + 18 + struct VertexInput { 19 + @location(0) position: vec3<f32>, 20 + @location(1) tex_coords: vec2<f32>, 21 + @location(2) normal: vec3<f32>, 22 + } 23 + 24 + struct VertexOutput { 25 + @builtin(position) clip_position: vec4<f32>, 26 + @location(0) tex_coords: vec2<f32>, 27 + @location(1) world_normal: vec3<f32>, 28 + @location(2) world_position: vec3<f32>, 29 + } 30 + 31 + @vertex 32 + fn vs_main( 33 + model: VertexInput, 34 + // instance: InstanceInput, 35 + ) -> VertexOutput { 36 + var out: VertexOutput; 37 + out.tex_coords = model.tex_coords; 38 + out.world_normal = model.normal; 39 + var world_position: vec4<f32> = vec4<f32>(model.position, 1.0); 40 + out.world_position = world_position.xyz; 41 + out.clip_position = camera.view_proj * world_position; 42 + return out; 43 + } 44 + 45 + @fragment 46 + fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 47 + 48 + // Sampler AddressMode::MirrorRepeat + Move down one tex = Free Y-flip! 49 + let sample_position = in.tex_coords; 50 + let tex_color = textureSample(t_diffuse, s_diffuse, sample_position); 51 + 52 + // if tex_color.a == 0.0 { 53 + // discard; 54 + // } 55 + 56 + // return tex_color; 57 + 58 + return mix(char_shape.color, tex_color, tex_color.a); 59 + 60 + }
+71
vfl/src/draw/shader-3d.wgsl
··· 1 + struct CameraUniform { 2 + view_proj: mat4x4<f32>, 3 + }; 4 + @group(0) @binding(0) 5 + var<uniform> camera: CameraUniform; 6 + 7 + struct CharShapeUniform { 8 + color: vec4<f32>, 9 + position: vec3<f32> 10 + } 11 + @group(1) @binding(0) 12 + var<uniform> char_shape: CharShapeUniform; 13 + 14 + struct VertexInput { 15 + @location(0) position: vec3<f32>, 16 + @location(1) tex_coords: vec2<f32>, 17 + @location(2) normal: vec3<f32>, 18 + } 19 + 20 + struct VertexOutput { 21 + @builtin(position) clip_position: vec4<f32>, 22 + @location(0) tex_coords: vec2<f32>, 23 + @location(1) world_normal: vec3<f32>, 24 + @location(2) world_position: vec3<f32>, 25 + } 26 + 27 + @vertex 28 + fn vs_main( 29 + model: VertexInput, 30 + // instance: InstanceInput, 31 + ) -> VertexOutput { 32 + var out: VertexOutput; 33 + out.tex_coords = model.tex_coords; 34 + out.world_normal = model.normal; 35 + var world_position: vec4<f32> = vec4<f32>(model.position + char_shape.position, 1.0); 36 + out.world_position = world_position.xyz; 37 + out.clip_position = camera.view_proj * world_position; 38 + return out; 39 + } 40 + 41 + // Fragment shader 42 + 43 + @fragment 44 + fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 45 + 46 + let color = char_shape.color; 47 + 48 + if color.a == 0.0 { 49 + discard; 50 + } 51 + return color; 52 + // let object_color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords); 53 + 54 + // // We don't need (or want) much ambient light, so 0.1 is fine 55 + // let ambient_strength = 0.1; 56 + // let ambient_color = light.color * ambient_strength; 57 + 58 + // let light_dir = normalize(light.position - in.world_position); 59 + // let view_dir = normalize(camera.view_pos.xyz - in.world_position); 60 + // let half_dir = normalize(view_dir + light_dir); 61 + 62 + // let diffuse_strength = max(dot(in.world_normal, light_dir), 0.0); 63 + // let diffuse_color = light.color * diffuse_strength; 64 + 65 + // let specular_strength = pow(max(dot(in.world_normal, half_dir), 0.0), 32.0); 66 + // let specular_color = specular_strength * light.color; 67 + 68 + // let result = (ambient_color + diffuse_color + specular_color) * object_color.xyz; 69 + 70 + // return vec4<f32>(result, object_color.a); 71 + }
+109
vfl/src/draw/shader.wgsl
··· 1 + struct TransformUniform { 2 + mtx: mat4x4<f32>, 3 + color_r: vec4<f32>, 4 + color_g: vec4<f32>, 5 + color_b: vec4<f32>, 6 + modulation_mode: u32, 7 + }; 8 + 9 + @group(1) @binding(0) // 1. 10 + var<uniform> mvp: TransformUniform; 11 + 12 + 13 + struct VertexOutput { 14 + @builtin(position) clip_position: vec4<f32>, 15 + @location(0) tex_coords: vec2<f32>, 16 + @location(1) thirdthing: vec4<f32>, 17 + } 18 + 19 + @vertex 20 + fn vs_main( 21 + @location(0) position: vec3<f32>, 22 + @location(1) tex_coords: vec2<f32> 23 + ) -> VertexOutput { 24 + var out: VertexOutput; 25 + out.tex_coords = tex_coords; 26 + // if mvp.modulation_mode == 1 { 27 + // // Ignore matrix with direct texture output. 28 + // out.clip_position = vec4<f32>(position, 1.0); 29 + // } else { 30 + out.clip_position = mvp.mtx * vec4<f32>(position, 1.0); 31 + // } 32 + return out; 33 + } 34 + 35 + @group(0) @binding(0) 36 + var t_diffuse: texture_2d<f32>; 37 + @group(0) @binding(1) 38 + var s_diffuse: sampler; 39 + 40 + @fragment 41 + fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { 42 + let color: vec4<f32> = textureSample(t_diffuse, s_diffuse, in.tex_coords); 43 + 44 + // if color.a == 0.0 { 45 + // discard; 46 + // } 47 + 48 + // enum vfl::color::nx::ModulationMode { 49 + // SingleColor = 0, 50 + // DirectTexture = 1, 51 + // LayeredRgbTexture = 2, 52 + // AlphaTexture = 3, 53 + // LuminanceAlphaTexture = 4, 54 + // } 55 + if mvp.modulation_mode == 0 { 56 + return modulate_single_color(color); 57 + } 58 + return color; 59 + 60 + // if mvp.modulation_mode == 0 { 61 + // return modulate_single_color(color); 62 + // } else if mvp.modulation_mode == 1 { 63 + // return modulate_direct_texture(color); 64 + // } else if mvp.modulation_mode == 2 { 65 + // return modulate_rgba(color); 66 + // } else if mvp.modulation_mode == 3 { 67 + // return modulate_alpha(color); 68 + // } else if mvp.modulation_mode == 4 { 69 + // return modulate_lum_alpha(color); 70 + // } else { 71 + // // OOB access, return RebeccaPurple 72 + // return vec4f(0.4, 0.2, 0.6, 1.0); 73 + // } 74 + } 75 + 76 + // Two trivial cases 77 + fn modulate_single_color(color: vec4f) -> vec4f { 78 + return mvp.color_r; 79 + } 80 + 81 + fn modulate_direct_texture(color: vec4f) -> vec4f { 82 + return color; 83 + } 84 + 85 + // Texture passes us alpha information, we fill in the rest of the color. 86 + // [a,0,0,0] -> [r,g,b,a] 87 + fn modulate_alpha(color: vec4f) -> vec4f { 88 + let repl = mvp.color_r; 89 + 90 + return vec4(repl.rgb, repl.a * color.r); 91 + } 92 + 93 + // Texture passes luminance + alpha, we colorize it. 94 + // [l,a,0,0] -> [r,g,b,a] 95 + fn modulate_lum_alpha(color: vec4f) -> vec4f { 96 + let repl_lum = mvp.color_r; 97 + 98 + return vec4(color.g * repl_lum.rgb, repl_lum.a * color.r); 99 + } 100 + 101 + 102 + fn modulate_rgba(color: vec4f) -> vec4f { 103 + let repl_r = mvp.color_r; 104 + let repl_g = mvp.color_g; 105 + let repl_b = mvp.color_b; 106 + 107 + return vec4f(color.r * repl_r.rgb + color.g * repl_g.rgb + color.b * repl_b.rgb, color.a * repl_r.a); 108 + 109 + }
+871
vfl/src/draw/wgpu_render.rs
··· 1 + use super::TEX_SCALE_X; 2 + use super::TEX_SCALE_Y; 3 + use super::mask::{FacePart, ImageOrigin, MaskFaceParts}; 4 + use super::render_2d::Rendered2dShape; 5 + use super::render_3d::ProgramState; 6 + use super::render_3d::Rendered3dShape; 7 + use crate::{ 8 + charinfo::nx::NxCharInfo, 9 + color::{ 10 + cafe::{ 11 + EYE_COLOR_B, EYE_COLOR_G, EYE_COLOR_R, GLASS_COLOR_R, HAIR_COLOR, MOUTH_COLOR_B, 12 + MOUTH_COLOR_G, MOUTH_COLOR_R, 13 + }, 14 + nx::{ColorModulated, modulate}, 15 + }, 16 + res::shape::nx::ResourceShape, 17 + res::tex::nx::{ResourceTexture, ResourceTextureFormat, TextureElement}, 18 + }; 19 + use binrw::BinRead; 20 + use camera::Camera; 21 + use camera::CameraUniform; 22 + use glam::Vec3; 23 + use glam::{UVec2, uvec2, vec3}; 24 + use image::{DynamicImage, RgbaImage}; 25 + use nalgebra::Matrix4; 26 + use std::f32::consts::FRAC_PI_2; 27 + use std::f32::consts::PI; 28 + use std::{error::Error, fs::File, io::BufReader}; 29 + use wgpu::CommandEncoder; 30 + use wgpu::{DeviceDescriptor, TexelCopyTextureInfo, util::DeviceExt}; 31 + 32 + pub const FACE_OUTPUT_SIZE: u16 = 512; 33 + pub const SHADER: &str = include_str!("./shader.wgsl"); 34 + pub use bytemuck::cast_slice; 35 + 36 + #[repr(C)] 37 + #[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)] 38 + pub struct Vertex { 39 + pub position: [f32; 3], 40 + pub tex_coords: [f32; 2], 41 + pub normal: [f32; 3], 42 + } 43 + 44 + impl Vertex { 45 + const ATTRIBS: [wgpu::VertexAttribute; 3] = 46 + wgpu::vertex_attr_array![0 => Float32x3, 1 => Float32x2, 2 => Float32x3]; 47 + 48 + pub fn desc() -> wgpu::VertexBufferLayout<'static> { 49 + use std::mem; 50 + wgpu::VertexBufferLayout { 51 + array_stride: mem::size_of::<Vertex>() as wgpu::BufferAddress, 52 + step_mode: wgpu::VertexStepMode::Vertex, 53 + attributes: &Self::ATTRIBS, 54 + } 55 + } 56 + } 57 + 58 + #[repr(C)] 59 + #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] 60 + pub struct TextureTransformUniform { 61 + pub mvp_matrix: [[f32; 4]; 4], 62 + pub channel_replacements_r: [f32; 4], 63 + pub channel_replacements_g: [f32; 4], 64 + pub channel_replacements_b: [f32; 4], 65 + pub texture_type: u32, 66 + pub pad: [u32; 3], 67 + } 68 + 69 + const NON_REPLACEMENT: [f32; 4] = [f32::NAN, f32::NAN, f32::NAN, f32::NAN]; 70 + // #[derive(Debug)] 71 + // #[deprecated] 72 + // pub struct RenderShape { 73 + // pub vertices: Vec<Vertex>, 74 + // pub indices: Vec<u32>, 75 + // pub tex: DynamicImage, 76 + // pub mvp_matrix: Matrix4<f32>, 77 + // pub texture_type: ResourceTextureFormat, 78 + // pub channel_replacements: [[f32; 4]; 3], 79 + // } 80 + 81 + pub struct RenderContext { 82 + pub size: UVec2, 83 + pub shape: Vec<Rendered2dShape>, 84 + } 85 + impl RenderContext { 86 + pub fn from_shapes(shape: Vec<Rendered2dShape>) -> RenderContext { 87 + RenderContext { 88 + size: uvec2(FACE_OUTPUT_SIZE.into(), FACE_OUTPUT_SIZE.into()), 89 + shape, 90 + } 91 + } 92 + } 93 + 94 + impl RenderContext { 95 + #[allow(clippy::too_many_lines)] 96 + pub fn new( 97 + char: &NxCharInfo, 98 + res_texture: &ResourceTexture, 99 + res_shape: &ResourceShape, 100 + file_texture: &Vec<u8>, 101 + ) -> Result<Self, Box<dyn Error>> { 102 + let mask = MaskFaceParts::init(char, 256.0); 103 + 104 + let mut make_shape = 105 + |part: FacePart, modulated: ColorModulated, tex_data: TextureElement| { 106 + let (vertices, indices, mtx) = quad( 107 + part.x, 108 + part.y, 109 + part.width, 110 + part.height, 111 + part.angle_deg, 112 + part.origin, 113 + 256.0, 114 + ); 115 + 116 + let tex = tex_data 117 + .get_uncompressed_bytes(file_texture) 118 + .unwrap() 119 + .unwrap(); 120 + 121 + Rendered2dShape { 122 + vertices, 123 + indices, 124 + tex, 125 + mvp_matrix: mtx, 126 + modulation: modulate(modulated, char), 127 + opaque: None, 128 + } 129 + }; 130 + 131 + let left_eye = make_shape( 132 + mask.eye[0], 133 + ColorModulated::Eye, 134 + res_texture.eye[char.eye_type as usize], 135 + ); 136 + let right_eye = make_shape( 137 + mask.eye[1], 138 + ColorModulated::Eye, 139 + res_texture.eye[char.eye_type as usize], 140 + ); 141 + 142 + let left_brow = make_shape( 143 + mask.eyebrow[0], 144 + ColorModulated::Eyebrow, 145 + res_texture.eyebrow[char.eyebrow_type as usize], 146 + ); 147 + let right_brow = make_shape( 148 + mask.eyebrow[1], 149 + ColorModulated::Eyebrow, 150 + res_texture.eyebrow[char.eyebrow_type as usize], 151 + ); 152 + 153 + let mouth = make_shape( 154 + mask.mouth, 155 + ColorModulated::Mouth, 156 + res_texture.mouth[char.mouth_type as usize], 157 + ); 158 + 159 + Ok(RenderContext { 160 + size: uvec2(FACE_OUTPUT_SIZE.into(), FACE_OUTPUT_SIZE.into()), 161 + shape: vec![left_eye, right_eye, left_brow, right_brow, mouth], 162 + }) 163 + } 164 + 165 + #[allow(clippy::too_many_lines)] 166 + pub fn new_faceline( 167 + char: &NxCharInfo, 168 + res_texture: &ResourceTexture, 169 + res_shape: &ResourceShape, 170 + file_texture: &Vec<u8>, 171 + ) -> Result<Self, Box<dyn Error>> { 172 + let mask = MaskFaceParts::init(char, 256.0); 173 + let makeup = char.faceline_make; 174 + 175 + let mut make_shape = 176 + |part: FacePart, modulated: ColorModulated, tex_data: TextureElement| { 177 + let (vertices, indices, mtx) = quad( 178 + part.x, 179 + part.y, 180 + part.width, 181 + part.height, 182 + part.angle_deg, 183 + part.origin, 184 + 256.0, 185 + ); 186 + 187 + let tex = tex_data 188 + .get_uncompressed_bytes(file_texture) 189 + .unwrap() 190 + .unwrap(); 191 + 192 + Rendered2dShape { 193 + vertices, 194 + indices, 195 + tex, 196 + mvp_matrix: mtx, 197 + modulation: modulate(modulated, char), 198 + opaque: None, 199 + } 200 + }; 201 + 202 + let mouth = make_shape( 203 + mask.mouth, 204 + ColorModulated::Mouth, 205 + res_texture.mouth[char.mouth_type as usize], 206 + ); 207 + 208 + Ok(RenderContext { 209 + size: uvec2(FACE_OUTPUT_SIZE.into(), FACE_OUTPUT_SIZE.into()), 210 + shape: vec![mouth], 211 + }) 212 + } 213 + 214 + pub fn new_glasses( 215 + char: &NxCharInfo, 216 + res_texture: &ResourceTexture, 217 + res_shape: &ResourceShape, 218 + file_texture: &Vec<u8>, 219 + ) -> Result<Self, Box<dyn Error>> { 220 + let nose_translate = 221 + res_shape.face_line_transform[char.faceline_type as usize].nose_translate; 222 + 223 + let glasses = dbg!(MaskFaceParts::init_glasses(char, 256.0, nose_translate)); 224 + 225 + // let mask = FaceParts::init(&char, 256.0); 226 + // let part = mask[0]; 227 + let tex_data = res_texture.glass[char.glass_type as usize]; 228 + let mut glass_l = glasses[0]; 229 + 230 + let (vertices, indices, mtx) = quad( 231 + glass_l.x, 232 + glass_l.y, 233 + glass_l.width, 234 + glass_l.height, 235 + glass_l.angle_deg, 236 + glass_l.origin, 237 + 256.0, 238 + ); 239 + 240 + let tex = tex_data.get_uncompressed_bytes(file_texture)?.unwrap(); 241 + 242 + let glass_l_render_shape = Rendered2dShape { 243 + vertices, 244 + indices, 245 + tex: tex.clone(), 246 + mvp_matrix: mtx, 247 + modulation: modulate(ColorModulated::Glass, &char), 248 + opaque: None, 249 + }; 250 + 251 + let glass_r = glasses[1]; 252 + 253 + let (vertices, indices, mtx) = quad( 254 + glass_r.x, 255 + glass_r.y, 256 + glass_r.width, 257 + glass_r.height, 258 + glass_r.angle_deg, 259 + glass_r.origin, 260 + 256.0, 261 + ); 262 + 263 + let glass_r_render_shape = Rendered2dShape { 264 + vertices, 265 + indices, 266 + tex, 267 + mvp_matrix: mtx, 268 + modulation: modulate(ColorModulated::Glass, &char), 269 + opaque: None, 270 + }; 271 + 272 + Ok(RenderContext { 273 + size: uvec2(512, 256), 274 + shape: vec![glass_l_render_shape, glass_r_render_shape], 275 + }) 276 + } 277 + } 278 + 279 + pub fn model_view_matrix( 280 + translation: mint::Vector3<f32>, 281 + scale: mint::Vector3<f32>, 282 + rot_z: f32, 283 + ) -> nalgebra::Matrix4<f32> { 284 + let mut scale = nalgebra::Vector3::<f32>::from(scale); 285 + let translation = nalgebra::Vector3::<f32>::from(translation); 286 + 287 + let mut mtx = nalgebra::Matrix4::identity(); 288 + mtx.append_nonuniform_scaling_mut(&scale); 289 + mtx *= nalgebra::Rotation3::from_euler_angles(0.0, 0.0, rot_z.to_radians()).to_homogeneous(); 290 + mtx.append_nonuniform_scaling_mut(&nalgebra::Vector3::new(TEX_SCALE_X, TEX_SCALE_Y, 1.0)); 291 + mtx.append_translation_mut(&translation); 292 + 293 + mtx 294 + } 295 + 296 + fn v2(x: f32, y: f32) -> [f32; 3] { 297 + [x, y, 0.0] 298 + } 299 + 300 + // https://github.com/SMGCommunity/Petari/blob/6e9ae741a99bb32e6ffbb230a88c976f539dde70/src/RVLFaceLib/RFL_MakeTex.c#L817 301 + pub fn quad( 302 + x: f32, 303 + y: f32, 304 + width: f32, 305 + height: f32, 306 + rot_z: f32, 307 + origin: ImageOrigin, 308 + resolution: f32, 309 + ) -> (Vec<Vertex>, Vec<u32>, nalgebra::Matrix4<f32>) { 310 + // Mtx rot; 311 + // Mtx pos; 312 + // f32 baseX; 313 + // s16 s0; 314 + // s16 s1; 315 + let base_x: f32; 316 + let s0: f32; 317 + let s1: f32; 318 + 319 + let mv_mtx = model_view_matrix( 320 + vec3(x, resolution - y, 0.0).into(), 321 + vec3(width, height, 1.0).into(), 322 + rot_z, 323 + ); 324 + 325 + let p_mtx = Matrix4::new_orthographic(0.0, resolution, 0.0, resolution, -200.0, 200.0); 326 + let mut mvp_mtx = p_mtx * mv_mtx; 327 + 328 + *mvp_mtx.get_mut((1, 1)).unwrap() *= -1.0; 329 + 330 + match origin { 331 + ImageOrigin::Center => { 332 + base_x = -0.5; 333 + s0 = 1.0; 334 + s1 = 0.0; 335 + } 336 + ImageOrigin::Right => { 337 + base_x = -1.0; 338 + s0 = 1.0; 339 + s1 = 0.0; 340 + } 341 + ImageOrigin::Left => { 342 + base_x = 0.0; 343 + s0 = 0.0; 344 + s1 = 1.0; 345 + } 346 + ImageOrigin::Ignore => { 347 + base_x = 0.0; 348 + s0 = 0.0; 349 + s1 = 1.0; 350 + } 351 + } 352 + 353 + ( 354 + vec![ 355 + Vertex { 356 + position: v2(1.0 + base_x, -0.5), 357 + tex_coords: [s0, 0.0], 358 + normal: [0.0, 0.0, 0.0], 359 + }, 360 + Vertex { 361 + position: v2(1.0 + base_x, 0.5), 362 + tex_coords: [s0, 1.0], 363 + normal: [0.0, 0.0, 0.0], 364 + }, 365 + Vertex { 366 + position: v2(base_x, 0.5), 367 + tex_coords: [s1, 1.0], 368 + normal: [0.0, 0.0, 0.0], 369 + }, 370 + Vertex { 371 + position: v2(base_x, -0.5), 372 + tex_coords: [s1, 0.0], 373 + normal: [0.0, 0.0, 0.0], 374 + }, 375 + ], 376 + vec![0, 1, 2, 0, 2, 3], 377 + mvp_mtx, 378 + ) 379 + } 380 + 381 + pub struct HeadlessRenderer { 382 + device: wgpu::Device, 383 + queue: wgpu::Queue, 384 + camera_bgl: wgpu::BindGroupLayout, 385 + camera_bg: wgpu::BindGroup, 386 + surface_fmt: wgpu::TextureFormat, 387 + depth_texture: texture::TextureBundle, 388 + } 389 + 390 + impl ProgramState for HeadlessRenderer { 391 + fn device(&self) -> wgpu::Device { 392 + self.device.clone() 393 + } 394 + 395 + fn queue(&self) -> wgpu::Queue { 396 + self.queue.clone() 397 + } 398 + 399 + fn camera_bgl(&self) -> &wgpu::BindGroupLayout { 400 + &self.camera_bgl 401 + } 402 + 403 + fn camera_bg(&self) -> &wgpu::BindGroup { 404 + &self.camera_bg 405 + } 406 + 407 + fn surface_fmt(&self) -> wgpu::TextureFormat { 408 + self.surface_fmt 409 + } 410 + 411 + fn depth_texture(&self) -> &texture::TextureBundle { 412 + &self.depth_texture 413 + } 414 + } 415 + 416 + impl Default for HeadlessRenderer { 417 + fn default() -> HeadlessRenderer { 418 + HeadlessRenderer::new() 419 + } 420 + } 421 + impl HeadlessRenderer { 422 + pub fn new() -> HeadlessRenderer { 423 + pollster::block_on(HeadlessRenderer::async_new()) 424 + } 425 + async fn async_new() -> HeadlessRenderer { 426 + const SIZE: UVec2 = uvec2(512, 512); 427 + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { 428 + backends: wgpu::Backends::all(), 429 + ..Default::default() 430 + }); 431 + let adapter = instance 432 + .request_adapter(&wgpu::RequestAdapterOptions { 433 + power_preference: wgpu::PowerPreference::default(), 434 + compatible_surface: None, 435 + force_fallback_adapter: false, 436 + }) 437 + .await 438 + .unwrap(); 439 + let (device, queue) = adapter 440 + .request_device(&DeviceDescriptor::default()) 441 + .await 442 + .unwrap(); 443 + 444 + // let surface = instance.create_surface(window.clone()).unwrap(); 445 + // let cap = surface.get_capabilities(&adapter); 446 + // let surface_fmt = cap.formats[0]; 447 + let surface_fmt = wgpu::TextureFormat::Bgra8Unorm; 448 + 449 + let depth_texture = 450 + texture::TextureBundle::create_depth_texture(&device, &SIZE, "depth_texture"); 451 + 452 + let camera = Camera { 453 + eye: (0.0, 25.0, 100.0).into(), 454 + target: (0.0, 25.0, 0.0).into(), 455 + up: Vec3::Y, 456 + aspect: SIZE.x as f32 / SIZE.y as f32, 457 + fov_y_radians: FRAC_PI_2, 458 + znear: 0.1, 459 + zfar: 10000.0, 460 + }; 461 + 462 + let mut camera_uniform = CameraUniform::new(); 463 + camera_uniform.update_view_proj(&camera); 464 + 465 + let camera_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { 466 + label: Some("Camera Buffer"), 467 + contents: bytemuck::cast_slice(&[camera_uniform]), 468 + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, 469 + }); 470 + 471 + let camera_bgl = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { 472 + entries: &[wgpu::BindGroupLayoutEntry { 473 + binding: 0, 474 + visibility: wgpu::ShaderStages::VERTEX, 475 + ty: wgpu::BindingType::Buffer { 476 + ty: wgpu::BufferBindingType::Uniform, 477 + has_dynamic_offset: false, 478 + min_binding_size: None, 479 + }, 480 + count: None, 481 + }], 482 + label: Some("camera_bind_group_layout"), 483 + }); 484 + 485 + let camera_bg = device.create_bind_group(&wgpu::BindGroupDescriptor { 486 + layout: &camera_bgl, 487 + entries: &[wgpu::BindGroupEntry { 488 + binding: 0, 489 + resource: camera_buffer.as_entire_binding(), 490 + }], 491 + label: Some("camera_bind_group"), 492 + }); 493 + 494 + HeadlessRenderer { 495 + device, 496 + queue, 497 + camera_bgl, 498 + camera_bg, 499 + surface_fmt, 500 + depth_texture, 501 + } 502 + } 503 + 504 + pub fn output_texture( 505 + &mut self, 506 + texture: &texture::TextureBundle, 507 + mut encoder: CommandEncoder, 508 + ) -> DynamicImage { 509 + pollster::block_on(async { 510 + let u32_size = std::mem::size_of::<u32>() as u32; 511 + let output_buffer_size = wgpu::BufferAddress::from( 512 + u32_size * texture.texture.size().width * texture.texture.size().height, 513 + ); 514 + let output_buffer_desc = wgpu::BufferDescriptor { 515 + size: output_buffer_size, 516 + usage: wgpu::BufferUsages::COPY_DST 517 + // this tells wpgu that we want to read this buffer from the cpu 518 + | wgpu::BufferUsages::MAP_READ, 519 + label: None, 520 + mapped_at_creation: false, 521 + }; 522 + let output_buffer = self.device.create_buffer(&output_buffer_desc); 523 + 524 + encoder.copy_texture_to_buffer( 525 + wgpu::TexelCopyTextureInfo { 526 + aspect: wgpu::TextureAspect::All, 527 + texture: &texture.texture, 528 + mip_level: 0, 529 + origin: wgpu::Origin3d::ZERO, 530 + }, 531 + wgpu::TexelCopyBufferInfo { 532 + buffer: &output_buffer, 533 + layout: wgpu::TexelCopyBufferLayout { 534 + offset: 0, 535 + bytes_per_row: Some(u32_size * texture.texture.size().width), 536 + rows_per_image: Some(texture.texture.size().height), 537 + }, 538 + }, 539 + texture.texture.size(), 540 + ); 541 + 542 + self.queue.submit(Some(encoder.finish())); 543 + 544 + let mut image = None; 545 + // We need to scope the mapping variables so that we can 546 + // unmap the buffer 547 + { 548 + let buffer_slice = output_buffer.slice(..); 549 + 550 + // NOTE: We have to create the mapping THEN device.poll() before await 551 + // the future. Otherwise the application will freeze. 552 + let (tx, rx) = futures_intrusive::channel::shared::oneshot_channel(); 553 + buffer_slice.map_async(wgpu::MapMode::Read, move |result| { 554 + tx.send(result).unwrap(); 555 + }); 556 + self.device.poll(wgpu::PollType::Wait).unwrap(); 557 + rx.receive().await.unwrap().unwrap(); 558 + 559 + let data = &buffer_slice.get_mapped_range()[..]; 560 + 561 + use image::{ImageBuffer, Rgba}; 562 + let buffer: RgbaImage = ImageBuffer::<Rgba<u8>, _>::from_raw( 563 + texture.texture.size().width, 564 + texture.texture.size().height, 565 + data.to_owned(), 566 + ) 567 + .unwrap(); 568 + image = Some(DynamicImage::ImageRgba8(buffer)); 569 + } 570 + output_buffer.unmap(); 571 + 572 + image.unwrap() 573 + }) 574 + } 575 + } 576 + 577 + pub mod texture { 578 + use std::error::Error; 579 + use std::fmt::Debug; 580 + 581 + use glam::UVec2; 582 + use image::GenericImageView; 583 + use wgpu::TextureFormat; 584 + 585 + pub struct TextureBundle { 586 + #[allow(unused)] 587 + pub texture: wgpu::Texture, 588 + pub view: wgpu::TextureView, 589 + pub sampler: wgpu::Sampler, 590 + } 591 + impl Debug for TextureBundle { 592 + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 593 + f.debug_struct("Texture").finish() 594 + } 595 + } 596 + 597 + #[allow(unused)] 598 + impl TextureBundle { 599 + pub fn from_bytes( 600 + device: &wgpu::Device, 601 + queue: &wgpu::Queue, 602 + bytes: &[u8], 603 + label: &str, 604 + ) -> Result<Self, Box<dyn Error>> { 605 + let img = image::load_from_memory(bytes)?; 606 + Self::from_image(device, queue, &img, Some(label)) 607 + } 608 + 609 + pub fn from_image( 610 + device: &wgpu::Device, 611 + queue: &wgpu::Queue, 612 + img: &image::DynamicImage, 613 + label: Option<&str>, 614 + ) -> Result<Self, Box<dyn Error>> { 615 + let rgba = img.to_rgba8(); 616 + let dimensions = img.dimensions(); 617 + 618 + let size = wgpu::Extent3d { 619 + width: dimensions.0, 620 + height: dimensions.1, 621 + depth_or_array_layers: 1, 622 + }; 623 + let texture = device.create_texture(&wgpu::TextureDescriptor { 624 + label, 625 + size, 626 + mip_level_count: 1, 627 + sample_count: 1, 628 + dimension: wgpu::TextureDimension::D2, 629 + format: wgpu::TextureFormat::Rgba8UnormSrgb, 630 + usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST, 631 + view_formats: &[], 632 + }); 633 + 634 + queue.write_texture( 635 + wgpu::TexelCopyTextureInfo { 636 + aspect: wgpu::TextureAspect::All, 637 + texture: &texture, 638 + mip_level: 0, 639 + origin: wgpu::Origin3d::ZERO, 640 + }, 641 + &rgba, 642 + wgpu::TexelCopyBufferLayout { 643 + offset: 0, 644 + bytes_per_row: Some(4 * dimensions.0), 645 + rows_per_image: Some(dimensions.1), 646 + }, 647 + size, 648 + ); 649 + 650 + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); 651 + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { 652 + address_mode_u: wgpu::AddressMode::ClampToEdge, 653 + address_mode_v: wgpu::AddressMode::ClampToEdge, 654 + address_mode_w: wgpu::AddressMode::ClampToEdge, 655 + mag_filter: wgpu::FilterMode::Linear, 656 + min_filter: wgpu::FilterMode::Nearest, 657 + mipmap_filter: wgpu::FilterMode::Nearest, 658 + ..Default::default() 659 + }); 660 + 661 + Ok(Self { 662 + texture, 663 + view, 664 + sampler, 665 + }) 666 + } 667 + 668 + pub const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float; // 1. 669 + 670 + pub fn create_depth_texture(device: &wgpu::Device, size: &UVec2, label: &str) -> Self { 671 + let size = wgpu::Extent3d { 672 + // 2. 673 + width: size.x.max(1), 674 + height: size.y.max(1), 675 + depth_or_array_layers: 1, 676 + }; 677 + let desc = wgpu::TextureDescriptor { 678 + label: Some(label), 679 + size, 680 + mip_level_count: 1, 681 + sample_count: 1, 682 + dimension: wgpu::TextureDimension::D2, 683 + format: Self::DEPTH_FORMAT, 684 + usage: wgpu::TextureUsages::RENDER_ATTACHMENT // 3. 685 + | wgpu::TextureUsages::TEXTURE_BINDING, 686 + view_formats: &[], 687 + }; 688 + let texture = device.create_texture(&desc); 689 + 690 + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); 691 + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { 692 + // 4. 693 + address_mode_u: wgpu::AddressMode::ClampToEdge, 694 + address_mode_v: wgpu::AddressMode::ClampToEdge, 695 + address_mode_w: wgpu::AddressMode::ClampToEdge, 696 + mag_filter: wgpu::FilterMode::Linear, 697 + min_filter: wgpu::FilterMode::Linear, 698 + mipmap_filter: wgpu::FilterMode::Nearest, 699 + compare: Some(wgpu::CompareFunction::LessEqual), // 5. 700 + lod_min_clamp: 0.0, 701 + lod_max_clamp: 100.0, 702 + ..Default::default() 703 + }); 704 + 705 + Self { 706 + texture, 707 + view, 708 + sampler, 709 + } 710 + } 711 + 712 + pub fn create_texture(device: &wgpu::Device, size: &UVec2, label: &str) -> Self { 713 + let size = wgpu::Extent3d { 714 + // 2. 715 + width: size.x.max(1), 716 + height: size.y.max(1), 717 + depth_or_array_layers: 1, 718 + }; 719 + let desc = wgpu::TextureDescriptor { 720 + label: Some(label), 721 + size, 722 + mip_level_count: 1, 723 + sample_count: 1, 724 + dimension: wgpu::TextureDimension::D2, 725 + format: TextureFormat::Bgra8UnormSrgb, 726 + usage: wgpu::TextureUsages::RENDER_ATTACHMENT // 3. 727 + | wgpu::TextureUsages::TEXTURE_BINDING 728 + | wgpu::TextureUsages::COPY_SRC, 729 + view_formats: &[], 730 + }; 731 + let texture = device.create_texture(&desc); 732 + 733 + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); 734 + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { 735 + // 4. 736 + address_mode_u: wgpu::AddressMode::MirrorRepeat, 737 + address_mode_v: wgpu::AddressMode::MirrorRepeat, 738 + address_mode_w: wgpu::AddressMode::MirrorRepeat, 739 + mag_filter: wgpu::FilterMode::Linear, 740 + min_filter: wgpu::FilterMode::Linear, 741 + mipmap_filter: wgpu::FilterMode::Nearest, 742 + lod_min_clamp: 0.0, 743 + lod_max_clamp: 100.0, 744 + ..Default::default() 745 + }); 746 + 747 + Self { 748 + texture, 749 + view, 750 + sampler, 751 + } 752 + } 753 + } 754 + } 755 + 756 + #[cfg(test)] 757 + mod tests { 758 + use crate::draw::mask::MaskFaceParts; 759 + use crate::res::shape::nx::{ResourceShape, SHAPE_MID_DAT}; 760 + use crate::res::tex::nx::{ResourceTexture, TEXTURE_MID_SRGB_DAT}; 761 + use binrw::BinRead; 762 + use glam::uvec2; 763 + use image_compare::Algorithm; 764 + 765 + use super::*; 766 + use std::{error::Error, fs::File, io::BufReader}; 767 + 768 + type R = Result<(), Box<dyn Error>>; 769 + 770 + // #[test] 771 + // #[allow(clippy::too_many_lines)] 772 + // fn test_render() -> R { 773 + // let mut tex_file = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 774 + // let mut tex_shape = BufReader::new(File::open(SHAPE_MID_DAT)?); 775 + 776 + // let mut char = 777 + // File::open(concat!(env!("CARGO_MANIFEST_DIR"), "/../Jasmine.charinfo")).unwrap(); 778 + // let char = NxCharInfo::read(&mut char).unwrap(); 779 + 780 + // let image = pollster::block_on(render_context_wgpu(RenderContext::new( 781 + // // &FaceParts::init(&char, 256.0), 782 + // &char, 783 + // (&mut tex_shape, &mut tex_file), 784 + // )?)); 785 + // let image = image.flipv(); 786 + 787 + // image.save(concat!( 788 + // env!("CARGO_MANIFEST_DIR"), 789 + // "/test_output/mask-rendered.png" 790 + // ))?; 791 + 792 + // let reference_image = image::open(concat!( 793 + // env!("CARGO_MANIFEST_DIR"), 794 + // "/test_data/jasmine-mask.png" 795 + // )) 796 + // .unwrap(); 797 + 798 + // let similarity = image_compare::rgb_hybrid_compare( 799 + // &image.clone().into_rgb8(), 800 + // &reference_image.clone().into_rgb8(), 801 + // ) 802 + // .expect("wrong size!"); 803 + 804 + // similarity 805 + // .image 806 + // .to_color_map() 807 + // .save(concat!( 808 + // env!("CARGO_MANIFEST_DIR"), 809 + // "/test_output/mask-similarity.png" 810 + // )) 811 + // .unwrap(); 812 + 813 + // let similarity = image_compare::gray_similarity_structure( 814 + // &Algorithm::MSSIMSimple, 815 + // &image.into_luma8(), 816 + // &reference_image.into_luma8(), 817 + // ) 818 + // .expect("wrong size!"); 819 + 820 + // similarity 821 + // .image 822 + // .to_color_map() 823 + // .save(concat!( 824 + // env!("CARGO_MANIFEST_DIR"), 825 + // "/test_output/mask-similarity-grey.png" 826 + // )) 827 + // .unwrap(); 828 + 829 + // Ok(()) 830 + // } 831 + } 832 + 833 + mod camera { 834 + use glam::{Mat4, Vec3}; 835 + 836 + pub struct Camera { 837 + pub eye: Vec3, 838 + pub target: Vec3, 839 + pub up: Vec3, 840 + pub aspect: f32, 841 + pub fov_y_radians: f32, 842 + pub znear: f32, 843 + pub zfar: f32, 844 + } 845 + 846 + impl Camera { 847 + pub fn build_view_projection_matrix(&self) -> Mat4 { 848 + let view = Mat4::look_at_rh(self.eye, self.target, self.up); 849 + let proj = Mat4::perspective_rh(self.fov_y_radians, self.aspect, self.znear, self.zfar); 850 + proj * view 851 + } 852 + } 853 + 854 + #[repr(C)] 855 + #[derive(Debug, Copy, Clone, bytemuck::Pod, bytemuck::Zeroable)] 856 + pub struct CameraUniform { 857 + view_proj: [[f32; 4]; 4], 858 + } 859 + 860 + impl CameraUniform { 861 + pub fn new() -> Self { 862 + Self { 863 + view_proj: Mat4::IDENTITY.to_cols_array_2d(), 864 + } 865 + } 866 + 867 + pub fn update_view_proj(&mut self, camera: &Camera) { 868 + self.view_proj = camera.build_view_projection_matrix().to_cols_array_2d(); 869 + } 870 + } 871 + }
+11
vfl/src/lib.rs
··· 1 + #![warn(clippy::all, clippy::pedantic)] 2 + #![allow(dead_code)] 3 + pub mod charinfo; 4 + pub mod color; 5 + 6 + #[cfg(feature = "res")] 7 + pub mod draw; 8 + 9 + #[cfg(feature = "res")] 10 + pub mod res; 11 + mod utils;
+2
vfl/src/res/mod.rs
··· 1 + pub mod shape; 2 + pub mod tex;
+1
vfl/src/res/shape/mod.rs
··· 1 + pub mod nx;
+387
vfl/src/res/shape/nx.rs
··· 1 + use crate::utils::{ReadSeek, Vec3PackedSnorm, inflate_bytes, read_byte_slice, u16_to_f32}; 2 + use binrw::{BinRead, Endian}; 3 + use std::fs::File; 4 + use std::{ 5 + error::Error, 6 + io::{Cursor, Read, Seek, SeekFrom}, 7 + }; 8 + 9 + pub const SHAPE_MID_DAT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/ShapeMid.dat"); 10 + #[cfg(target_family = "wasm")] 11 + pub const SHAPE_MID_DAT_LOADED: &[u8] = include_bytes!("../../../ShapeMid.dat"); 12 + 13 + #[cfg(feature = "gltf")] 14 + use mesh_tools::GltfBuilder; 15 + 16 + enum AttributeType { 17 + /// Vertex positions. Format: `AttributeFormat_16_16_16_16_Float` 18 + Position = 0, // `AttributeFormat_16_16_16_16_Float` 19 + Normal = 1, // `AttributeFormat_10_10_10_2_Snorm` 20 + Uv = 2, // `AttributeFormat_16_16_Float` 21 + Tangent = 3, // `AttributeFormat_8_8_8_8_Snorm` 22 + Param = 4, // `AttributeFormat_8_8_8_8_Unorm` 23 + } 24 + 25 + #[derive(Debug, Clone)] 26 + pub struct ShapeData { 27 + pub positions: Vec<[f32; 3]>, 28 + pub indices: Vec<u16>, 29 + pub normals: Option<Vec<[f32; 3]>>, 30 + pub uvs: Option<Vec<[f32; 2]>>, 31 + pub color_params: Option<Vec<u8>>, 32 + } 33 + impl ShapeData { 34 + #[cfg(feature = "gltf")] 35 + fn gltf(&self, _bounding_box: [[f32; 3]; 2]) -> GltfBuilder { 36 + let mut builder = GltfBuilder::new(); 37 + 38 + let ShapeData { 39 + positions, 40 + indices, 41 + normals: _, 42 + uvs: _, 43 + color_params: _, 44 + } = self; 45 + 46 + let material = builder.create_basic_material( 47 + Some("Hair texture".to_string()), 48 + [0.118, 0.102, 0.094, 1.000], 49 + ); 50 + 51 + let mesh = builder.create_simple_mesh( 52 + Some("Mii Shape".to_string()), 53 + positions.as_flattened(), 54 + indices, 55 + // normals.clone().map(|v| v.into_flattened()).as_deref(), 56 + // uvs.clone().map(|v| v.into_flattened()).as_deref(), 57 + None, 58 + None, 59 + Some(material), 60 + ); 61 + 62 + let mii_shape_node = builder.add_node( 63 + Some("Mii Node".to_string()), 64 + Some(mesh), 65 + Some([0.0, 0.0, 0.0]), 66 + None, 67 + None, 68 + ); 69 + 70 + builder.add_scene(Some("Mii Scene".to_string()), Some(vec![mii_shape_node])); 71 + 72 + builder 73 + } 74 + } 75 + 76 + impl BinRead for ShapeData { 77 + type Args<'a> = ResourceShapeAttribute; 78 + 79 + fn read_options<R: Read + Seek>( 80 + reader: &mut R, 81 + endian: binrw::Endian, 82 + args: Self::Args<'_>, 83 + ) -> binrw::BinResult<Self> { 84 + const PER_VERTEX_SIZE: u32 = 8; 85 + const PER_INDEX_SIZE: u32 = 2; 86 + 87 + // let offset = u32::read_options(reader, endian, ())?; 88 + // let saved_position = reader.stream_position()?; 89 + 90 + // Read positions 91 + reader.seek(SeekFrom::Start(u64::from( 92 + args.attr_offset[AttributeType::Position as usize], 93 + )))?; 94 + 95 + let vertex_count = args.attr_size[AttributeType::Position as usize] / PER_VERTEX_SIZE; 96 + 97 + let mut positions = vec![]; 98 + for _vertex in 0..vertex_count { 99 + positions.push({ 100 + let positions = <[u16; 3]>::read_options(reader, endian, ())?; 101 + let _ = <u16>::read_options(reader, endian, ())?; 102 + 103 + // Skip 2 bytes for padding 104 + // let _ = reader.take(2); 105 + 106 + positions.map(u16_to_f32) 107 + }); 108 + } 109 + 110 + // Read indices 111 + reader.seek(SeekFrom::Start(u64::from(args.index_offset)))?; 112 + 113 + let index_count = args.index_size / PER_INDEX_SIZE; 114 + 115 + let mut indices = vec![]; 116 + for _index in 0..index_count { 117 + let value = <u16>::read_options(reader, endian, ())?; 118 + indices.push(value); 119 + } 120 + 121 + // Read normals 122 + let normals = if args.is_valid_attribute(AttributeType::Normal) { 123 + reader.seek(SeekFrom::Start(u64::from( 124 + args.attr_offset[AttributeType::Normal as usize], 125 + )))?; 126 + 127 + let mut normals = vec![]; 128 + for _vertex in 0..vertex_count { 129 + let packed = <u32>::read_options(reader, endian, ())?; 130 + normals.push(Vec3PackedSnorm(packed).unpack()); 131 + } 132 + 133 + Some(normals) 134 + } else { 135 + None 136 + }; 137 + 138 + // Read UVs 139 + let uvs = if args.is_valid_attribute(AttributeType::Uv) { 140 + reader.seek(SeekFrom::Start(u64::from( 141 + args.attr_offset[AttributeType::Uv as usize], 142 + )))?; 143 + 144 + let mut uvs = vec![]; 145 + for _vertex in 0..vertex_count { 146 + uvs.push(<[u16; 2]>::read_options(reader, endian, ())?.map(u16_to_f32)); 147 + } 148 + 149 + Some(uvs) 150 + } else { 151 + None 152 + }; 153 + 154 + // Read Params (Colors) 155 + let color_params = if args.is_valid_attribute(AttributeType::Param) { 156 + reader.seek(SeekFrom::Start(u64::from( 157 + args.attr_offset[AttributeType::Param as usize], 158 + )))?; 159 + 160 + let color_count = args.attr_size[AttributeType::Param as usize] / PER_VERTEX_SIZE; 161 + 162 + let mut color_params = vec![]; 163 + for _color in 0..color_count { 164 + color_params.push(<u8>::read_options(reader, endian, ())?); 165 + } 166 + 167 + Some(color_params) 168 + } else { 169 + None 170 + }; 171 + 172 + // // Read from an offset with a provided base offset. 173 + // reader.seek(SeekFrom::Start(args + offset as u64))?; 174 + // let value = u16::read_options(reader, endian, ())?; 175 + 176 + // reader.seek(SeekFrom::Start(saved_position))?; 177 + 178 + Ok(ShapeData { 179 + positions, 180 + indices, 181 + normals, 182 + uvs, 183 + color_params, 184 + }) 185 + } 186 + } 187 + #[derive(BinRead, Debug, Clone, Copy)] 188 + pub struct ResourceCommonAttribute { 189 + pub offset: u32, 190 + pub size: u32, 191 + pub size_compressed: u32, 192 + pub compression_level: u8, 193 + pub memory_level: u8, 194 + pad: u16, 195 + } 196 + #[derive(BinRead, Default, Debug, Clone, Copy)] 197 + pub struct ResourceShapeAttribute { 198 + pub attr_offset: [u32; 5], 199 + pub attr_size: [u32; 5], 200 + pub index_offset: u32, 201 + pub index_size: u32, 202 + pub bounding_box: [[f32; 3]; 2], 203 + } 204 + impl ResourceShapeAttribute { 205 + fn is_valid_attribute(&self, attr_type: AttributeType) -> bool { 206 + // assert!(attr_type as usize < AttributeType::End as usize); 207 + self.attr_size[attr_type as usize] != 0 208 + } 209 + } 210 + 211 + #[derive(BinRead, Debug, Clone, Copy)] 212 + pub struct ShapeElement { 213 + pub common: ResourceCommonAttribute, 214 + pub shape: ResourceShapeAttribute, 215 + } 216 + 217 + impl ShapeElement { 218 + /// # Errors 219 + /// Can error if: 220 + /// - Shape data is in a malformed zlib format 221 + /// - Writing out shape data file errors 222 + /// - Parsing vertices and etc from data fails 223 + pub fn shape_data(&mut self, file: &[u8]) -> Result<ShapeData, Box<dyn Error>> { 224 + // exporter set boundingbox 225 + 226 + // println!("shapeload"); 227 + let start: usize = self.common.offset as usize; 228 + let end: usize = self.common.offset as usize + self.common.size_compressed as usize; 229 + 230 + let range = start..end; 231 + 232 + let shape_data = inflate_bytes(&file[range])?; 233 + 234 + // if !cfg!(target_family = "wasm") { 235 + // std::fs::write("./shape.dat", shape_data.clone())?; 236 + // } 237 + 238 + let data = 239 + ShapeData::read_options(&mut Cursor::new(shape_data), Endian::Little, self.shape)?; 240 + 241 + Ok(data) 242 + } 243 + 244 + /// # Errors 245 + /// Can error if: 246 + /// - Shape data cannot be parsed 247 + #[cfg(feature = "gltf")] 248 + pub fn gltf(&mut self, file: &[u8]) -> Result<GltfBuilder, Box<dyn Error>> { 249 + let data = self.shape_data(file)?; 250 + 251 + Ok(data.gltf(self.shape.bounding_box)) 252 + } 253 + } 254 + 255 + #[derive(BinRead, Debug, Clone, Copy)] 256 + pub struct ResourceShapeHairTransform { 257 + front_translate: [f32; 3], 258 + front_rotate: [f32; 3], 259 + side_translate: [f32; 3], 260 + side_rotate: [f32; 3], 261 + top_translate: [f32; 3], 262 + top_rotate: [f32; 3], 263 + } 264 + 265 + #[derive(BinRead, Debug, Clone, Copy)] 266 + pub struct ResourceShapeFacelineTransform { 267 + pub hair_translate: [f32; 3], 268 + pub nose_translate: [f32; 3], 269 + pub beard_translate: [f32; 3], 270 + } 271 + 272 + #[derive(Clone, Copy, Debug)] 273 + pub enum Shape { 274 + Beard, 275 + FaceLine, 276 + Mask, 277 + HatNormal, 278 + HatCap, 279 + ForeheadNormal, 280 + ForeheadCap, 281 + HairNormal, 282 + HairCap, 283 + Glasses, 284 + Nose, 285 + NoseLine, 286 + HairTransform, 287 + FaceLineTransform, 288 + } 289 + #[derive(Clone, Copy)] 290 + pub enum GenericResourceShape { 291 + Element(ShapeElement), 292 + HairTransform(ResourceShapeHairTransform), 293 + FaceLineTransform(ResourceShapeFacelineTransform), 294 + } 295 + 296 + #[derive(BinRead, Debug, Clone, Copy)] 297 + #[br(little, magic = b"NFSR")] 298 + pub struct ResourceShape { 299 + ver: u32, 300 + file_size: u32, 301 + max_size: [u32; 12], 302 + max_alignment: [u32; 12], 303 + pub beard: [ShapeElement; 4], 304 + pub face_line: [ShapeElement; 12], 305 + pub mask: [ShapeElement; 12], 306 + pub hat_normal: [ShapeElement; 132], 307 + pub hat_cap: [ShapeElement; 132], 308 + pub forehead_normal: [ShapeElement; 132], 309 + pub forehead_cap: [ShapeElement; 132], 310 + pub hair_normal: [ShapeElement; 132], 311 + pub hair_cap: [ShapeElement; 132], 312 + 313 + pub glasses: [ShapeElement; 1], 314 + 315 + pub nose: [ShapeElement; 18], 316 + pub nose_line: [ShapeElement; 18], 317 + 318 + pub hair_transform: [ResourceShapeHairTransform; 132], 319 + pub face_line_transform: [ResourceShapeFacelineTransform; 12], 320 + } 321 + 322 + impl ResourceShape { 323 + #[allow(clippy::must_use_candidate)] 324 + pub fn index_by_shape(&self, shape: Shape, index: usize) -> Option<GenericResourceShape> { 325 + let shape_el = |x: &ShapeElement| GenericResourceShape::Element(*x); 326 + let hair_t = |x: &ResourceShapeHairTransform| GenericResourceShape::HairTransform(*x); 327 + let fl_t = |x: &ResourceShapeFacelineTransform| GenericResourceShape::FaceLineTransform(*x); 328 + 329 + match shape { 330 + Shape::Beard => self.beard.get(index).map(shape_el), 331 + Shape::FaceLine => self.face_line.get(index).map(shape_el), 332 + Shape::Mask => self.mask.get(index).map(shape_el), 333 + Shape::HatNormal => self.hat_normal.get(index).map(shape_el), 334 + Shape::HatCap => self.hat_cap.get(index).map(shape_el), 335 + Shape::ForeheadNormal => self.forehead_normal.get(index).map(shape_el), 336 + Shape::ForeheadCap => self.forehead_cap.get(index).map(shape_el), 337 + Shape::HairNormal => self.hair_normal.get(index).map(shape_el), 338 + Shape::HairCap => self.hair_cap.get(index).map(shape_el), 339 + Shape::Glasses => self.glasses.get(index).map(shape_el), 340 + Shape::Nose => self.nose.get(index).map(shape_el), 341 + Shape::NoseLine => self.nose_line.get(index).map(shape_el), 342 + Shape::HairTransform => self.hair_transform.get(index).map(hair_t), 343 + Shape::FaceLineTransform => self.face_line_transform.get(index).map(fl_t), 344 + } 345 + } 346 + } 347 + 348 + #[cfg(test)] 349 + mod tests { 350 + use super::*; 351 + use half::f16; 352 + use std::{error::Error, fs::File, io::BufReader}; 353 + 354 + type R = Result<(), Box<dyn Error>>; 355 + 356 + #[test] 357 + fn read() -> R { 358 + let mut bin = BufReader::new(File::open(SHAPE_MID_DAT)?); 359 + 360 + let _ = ResourceShape::read(&mut bin)?; 361 + 362 + Ok(()) 363 + } 364 + 365 + // #[test] 366 + // #[cfg(feature = "gltf")] 367 + // fn jas() -> R { 368 + // let mut bin = BufReader::new(File::open(SHAPE_MID_DAT)?); 369 + 370 + // let res = ResourceShape::read(&mut bin)?; 371 + 372 + // let mut shape = res.hair_normal[123]; 373 + 374 + // let mut file = File::open(SHAPE_MID_DAT)?; 375 + 376 + // let gltf = shape.gltf(&mut file)?; 377 + // gltf.export_glb(concat!(env!("CARGO_MANIFEST_DIR"), "/test_output/jas.glb"))?; 378 + 379 + // Ok(()) 380 + // } 381 + 382 + #[test] 383 + fn u16_to_f16_to_f32() { 384 + let within_tolerance = (1.0 - f16::from_bits(15360).to_f32()).abs() < 1.0; 385 + assert!(within_tolerance); 386 + } 387 + }
+1
vfl/src/res/tex/mod.rs
··· 1 + pub mod nx;
+320
vfl/src/res/tex/nx.rs
··· 1 + use crate::{ 2 + res::shape::nx::ResourceCommonAttribute, 3 + utils::{ReadSeek, inflate_bytes, read_byte_slice}, 4 + }; 5 + use binrw::BinRead; 6 + use image::{ImageBuffer, Rgba, RgbaImage}; 7 + use num_enum::{IntoPrimitive, TryFromPrimitive}; 8 + use std::error::Error; 9 + use tegra_swizzle::{block_height_mip0, div_round_up, swizzle::deswizzle_block_linear}; 10 + 11 + pub const TEXTURE_MID_SRGB_DAT: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/NXTextureMidSRGB.dat"); 12 + 13 + #[derive(BinRead, Debug, Clone, Copy)] 14 + pub struct ResourceTextureAttribute { 15 + alignment: u32, 16 + pub width: u16, 17 + pub height: u16, 18 + pub format: u8, 19 + mip_count: u8, 20 + tile_mode: u8, 21 + pad: [u8; 1], 22 + } 23 + 24 + #[derive(BinRead, Debug, Clone, Copy)] 25 + pub struct TextureElement { 26 + pub common: ResourceCommonAttribute, 27 + pub texture: ResourceTextureAttribute, 28 + } 29 + 30 + // Format rundown: 31 + // https://www.reedbeta.com/blog/understanding-bcn-texture-compression-formats/#comparison-table 32 + 33 + #[derive(IntoPrimitive, TryFromPrimitive, Debug)] 34 + #[repr(u8)] 35 + pub enum ResourceTextureFormat { 36 + R = 0, // R8Unorm (Ffl Name) 37 + Rg = 1, // R8G8Unorm 38 + Rgba = 2, // R8G8B8A8Unorm 39 + Bc4 = 3, // Bc4Unorm (Compressed R) 40 + Bc5 = 4, // Bc5Unorm (Compressed Rb) 41 + Bc7 = 5, // Bc7Unorm (Compressed Rgba) 42 + Astc4x4 = 6, // Astc4x4Unorm (Compressed Rgba) 43 + } 44 + 45 + // pub enum RawTexture { 46 + // R(Vec<u8>), 47 + // Rb(Vec<u8>), 48 + // Rgba(Vec<u8>), 49 + // Bc4(Vec<u8>), 50 + // Bc5(Vec<u8>), 51 + // Bc7(Vec<u8>), 52 + // Astc4x4(Vec<u8>), 53 + // } 54 + 55 + #[derive(Clone, Debug)] 56 + pub struct RawTexture { 57 + pub bytes: Vec<u8>, 58 + pub metadata: TextureElement, 59 + } 60 + 61 + impl TextureElement { 62 + pub fn get_texture_bytes(&self, file: &Vec<u8>) -> Result<Vec<u8>, Box<dyn Error>> { 63 + let start: usize = self.common.offset as usize; 64 + let end: usize = self.common.offset as usize + self.common.size_compressed as usize; 65 + 66 + // println!("texload"); 67 + 68 + let range = start..end; 69 + 70 + // let tex_data = read_byte_slice( 71 + // file, 72 + // self.common.offset.into(), 73 + // self.common.size_compressed.try_into()?, 74 + // )?; 75 + 76 + let tex_data = inflate_bytes(&file[range])?; 77 + 78 + let needs_swizzling = self.texture.tile_mode == 0; 79 + 80 + let tex_data = if needs_swizzling { 81 + let block_size = match ResourceTextureFormat::try_from(self.texture.format).unwrap() { 82 + ResourceTextureFormat::R 83 + | ResourceTextureFormat::Rg 84 + | ResourceTextureFormat::Rgba => 1, 85 + ResourceTextureFormat::Bc4 86 + | ResourceTextureFormat::Bc5 87 + | ResourceTextureFormat::Bc7 88 + | ResourceTextureFormat::Astc4x4 => 4, 89 + }; 90 + 91 + let bytes_per_pixel = 92 + match ResourceTextureFormat::try_from(self.texture.format).unwrap() { 93 + ResourceTextureFormat::R 94 + | ResourceTextureFormat::Rg 95 + | ResourceTextureFormat::Rgba => 1, 96 + ResourceTextureFormat::Bc4 => 8, 97 + ResourceTextureFormat::Bc5 98 + | ResourceTextureFormat::Bc7 99 + | ResourceTextureFormat::Astc4x4 => 16, 100 + }; 101 + 102 + let height = self.texture.height.into(); 103 + let block_height = block_height_mip0(div_round_up(height, block_size)); 104 + 105 + // panic!("{}", tex_data.len()); 106 + deswizzle_block_linear( 107 + div_round_up(self.texture.width.into(), block_size), 108 + div_round_up(self.texture.height.into(), block_size), 109 + 1, 110 + &tex_data, 111 + block_height, 112 + bytes_per_pixel, 113 + )? 114 + } else { 115 + tex_data 116 + }; 117 + 118 + Ok(tex_data) 119 + } 120 + 121 + #[cfg(feature = "draw")] 122 + pub fn get_uncompressed_bytes( 123 + &self, 124 + file: &Vec<u8>, 125 + ) -> Result<Option<RawTexture>, Box<dyn Error>> { 126 + let normalize_textures = false; 127 + 128 + if self.texture.width == 0 || self.texture.height == 0 { 129 + return Ok(None); 130 + } 131 + 132 + let tex_data = self.get_texture_bytes(file)?; 133 + assert!(!tex_data.is_empty()); 134 + 135 + let mut tex_data_decoded = 136 + vec![0; (u32::from(self.texture.width) * u32::from(self.texture.height)) as usize]; 137 + match ResourceTextureFormat::try_from(self.texture.format).unwrap() { 138 + ResourceTextureFormat::Bc7 => { 139 + texture2ddecoder::decode_bc7( 140 + &tex_data, 141 + self.texture.width.into(), 142 + self.texture.height.into(), 143 + &mut tex_data_decoded, 144 + )?; 145 + } 146 + ResourceTextureFormat::Bc4 => { 147 + texture2ddecoder::decode_bc4( 148 + &tex_data, 149 + self.texture.width.into(), 150 + self.texture.height.into(), 151 + &mut tex_data_decoded, 152 + )?; 153 + 154 + // Convert R to Rgba 155 + if normalize_textures { 156 + tex_data_decoded = tex_data_decoded 157 + .iter() 158 + .map(|x| { 159 + let [_, _, w, _] = x.to_le_bytes(); 160 + u32::from_le_bytes([w, w, w, w]) 161 + }) 162 + .collect(); 163 + } 164 + } 165 + ResourceTextureFormat::Bc5 => { 166 + texture2ddecoder::decode_bc5( 167 + &tex_data, 168 + self.texture.width.into(), 169 + self.texture.height.into(), 170 + &mut tex_data_decoded, 171 + )?; 172 + 173 + // Convert Rb to Rgba 174 + if normalize_textures { 175 + tex_data_decoded = tex_data_decoded 176 + .iter() 177 + .map(|x| { 178 + let [w, a, _, _] = x.to_le_bytes(); 179 + u32::from_le_bytes([w, w, w, a]) 180 + }) 181 + .collect(); 182 + } 183 + } 184 + ResourceTextureFormat::R => { 185 + tex_data_decoded = tex_data 186 + .iter() 187 + .map(|x| u32::from_le_bytes([*x, *x, *x, 255])) 188 + .collect(); 189 + } 190 + ResourceTextureFormat::Astc4x4 => { 191 + texture2ddecoder::decode_astc_4_4( 192 + &tex_data, 193 + self.texture.width.into(), 194 + self.texture.height.into(), 195 + &mut tex_data_decoded, 196 + )?; 197 + } 198 + e => unimplemented!("{e:?} is not decoded yet"), 199 + } 200 + 201 + // U32 to 4x U8 202 + let tex_data_decoded: Vec<u8> = tex_data_decoded 203 + .iter() 204 + .flat_map(|x| { 205 + let [b, g, r, a] = x.to_le_bytes(); 206 + [r, g, b, a] 207 + }) 208 + .collect(); 209 + 210 + Ok(Some(RawTexture { 211 + bytes: tex_data_decoded, 212 + metadata: self.clone(), 213 + })) 214 + } 215 + 216 + #[cfg(feature = "draw")] 217 + pub fn get_image(&self, bytes: &Vec<u8>) -> Result<Option<RgbaImage>, Box<dyn Error>> { 218 + let raw_texture = match self.get_uncompressed_bytes(bytes) { 219 + Ok(Some(bytes)) => bytes, 220 + Ok(None) => return Ok(None), 221 + Err(e) => return Err(e), 222 + }; 223 + 224 + let img: ImageBuffer<Rgba<u8>, Vec<u8>> = image::RgbaImage::from_raw( 225 + self.texture.width.into(), 226 + self.texture.height.into(), 227 + raw_texture.bytes, 228 + ) 229 + .unwrap(); 230 + 231 + Ok(Some(img)) 232 + } 233 + } 234 + 235 + #[derive(BinRead, Clone, Copy)] 236 + #[br(little, magic = b"NFTR")] 237 + pub struct ResourceTexture { 238 + ver: u32, 239 + file_size: u32, 240 + max_size: [u32; 11], 241 + max_alignment: [u32; 11], 242 + pub hat: [TextureElement; 132], 243 + pub eye: [TextureElement; 62], 244 + pub eyebrow: [TextureElement; 24], 245 + pub beard: [TextureElement; 2], 246 + pub wrinkle: [TextureElement; 12], 247 + pub makeup: [TextureElement; 12], 248 + pub glass: [TextureElement; 20], 249 + pub mole: [TextureElement; 2], 250 + pub mouth: [TextureElement; 37], 251 + pub mustache: [TextureElement; 6], 252 + pub noseline: [TextureElement; 18], 253 + } 254 + 255 + #[cfg(test)] 256 + mod tests { 257 + use super::*; 258 + use std::{error::Error, fs::File, io::BufReader}; 259 + 260 + type R = Result<(), Box<dyn Error>>; 261 + 262 + #[test] 263 + fn read() -> R { 264 + let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 265 + 266 + let _ = ResourceTexture::read(&mut bin)?; 267 + 268 + Ok(()) 269 + } 270 + 271 + // #[test] 272 + // #[cfg(feature = "draw")] 273 + // fn eye_tex() -> R { 274 + // let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 275 + 276 + // let res = ResourceTexture::read(&mut bin)?; 277 + 278 + // let res = res.eye[0]; 279 + 280 + // let tex = res.get_image(&mut BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?))?; 281 + 282 + // if let Some(tex) = tex { 283 + // tex.save(concat!(env!("CARGO_MANIFEST_DIR"), "/test_output/eye.png"))?; 284 + // } 285 + // Ok(()) 286 + // } 287 + 288 + // #[test] 289 + // #[cfg(feature = "draw")] 290 + // fn face_tex() -> R { 291 + // let mut bin = BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?); 292 + 293 + // let res = ResourceTexture::read(&mut bin)?; 294 + 295 + // // let res = res.makeup[1]; 296 + 297 + // let tex = 298 + // res.makeup[1].get_image(&mut BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?))?; 299 + 300 + // if let Some(tex) = tex { 301 + // tex.save(concat!( 302 + // env!("CARGO_MANIFEST_DIR"), 303 + // "/test_output/makeup.png" 304 + // ))?; 305 + // // tex.save("./tex.png")?; 306 + // } 307 + 308 + // // let res = ResourceTexture::read(&mut bin)?; 309 + // let tex = 310 + // res.noseline[1].get_image(&mut BufReader::new(File::open(TEXTURE_MID_SRGB_DAT)?))?; 311 + 312 + // if let Some(tex) = tex { 313 + // tex.save(concat!( 314 + // env!("CARGO_MANIFEST_DIR"), 315 + // "/test_output/noseline.png" 316 + // ))?; 317 + // } 318 + // Ok(()) 319 + // } 320 + }
+67
vfl/src/utils.rs
··· 1 + use std::{ 2 + error::Error, 3 + io::{self, Read, SeekFrom}, 4 + }; 5 + 6 + pub fn u16_to_f32(num: u16) -> f32 { 7 + half::f16::from_bits(num).to_f32() 8 + } 9 + 10 + /// Signed, normalized Vec3 + w component packed in a u32. 11 + /// [x: 10; y: 10; z: 10; w: 2] 12 + pub struct Vec3PackedSnorm(pub u32); 13 + 14 + impl Vec3PackedSnorm { 15 + /// The w component is discarded. 16 + #[allow(clippy::cast_precision_loss, clippy::cast_possible_wrap)] 17 + pub fn unpack(self) -> [f32; 3] { 18 + let packed = self.0; 19 + 20 + let nx = (packed << 22) as i32 >> 22; 21 + let ny = (packed << 12) as i32 >> 22; 22 + let nz = (packed << 2) as i32 >> 22; 23 + 24 + [nx as f32 / 511.0, ny as f32 / 511.0, nz as f32 / 511.0] 25 + } 26 + } 27 + 28 + /// Abstraction over anything that can be read as Seek or Read 29 + pub trait ReadSeek: std::io::Seek + std::io::Read {} 30 + impl<T: ?Sized> ReadSeek for T where T: std::io::Seek + std::io::Read {} 31 + 32 + pub(crate) fn read_byte_slice( 33 + file: &mut dyn ReadSeek, // Dynamic param: Anything that impl's Read + Seek 34 + start: u64, 35 + count: usize, 36 + ) -> Result<Vec<u8>, Box<dyn Error>> { 37 + file.seek(SeekFrom::Start(start))?; 38 + let mut buf = vec![0; count]; 39 + file.read_exact(&mut buf)?; 40 + 41 + Ok(buf) 42 + } 43 + 44 + #[cfg(feature = "res")] 45 + pub(crate) fn inflate_bytes(bytes: &[u8]) -> io::Result<Vec<u8>> { 46 + use flate2::read::ZlibDecoder; 47 + 48 + let mut z = ZlibDecoder::new(bytes); 49 + // z.read_to_string(&mut s)?; 50 + let mut vec = Vec::new(); 51 + z.read_to_end(&mut vec)?; 52 + Ok(vec) 53 + } 54 + 55 + #[cfg(test)] 56 + mod tests { 57 + use super::Vec3PackedSnorm; 58 + 59 + #[test] 60 + fn vec3_packed_snorm_test() { 61 + for test in [0x567a_67ca, 0x567_a6436, 0x5675_9fca, 0x5675_9c36] { 62 + for x in Vec3PackedSnorm(test).unpack() { 63 + assert!(x.abs() <= 1.0, "Not normalised!"); 64 + } 65 + } 66 + } 67 + }