diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 7182511..0000000 --- a/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -assets/models/* filter=lfs diff=lfs merge=lfs -text -assets/exr/* filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 84b7805..b5d2ef8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ -target/ -*.patch -.idea/ \ No newline at end of file +/target +.aider* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 1927e4f..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 - hooks: - - id: trailing-whitespace - files: "\\.rs$" - - id: end-of-file-fixer - files: "\\.rs$" - - id: mixed-line-ending - args: [--fix=lf] - files: "\\.rs$" diff --git a/Cargo.lock b/Cargo.lock index d36cc29..a227390 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "ab_glyph" -version = "0.2.32" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -14,15 +14,15 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.10" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "addr2line" -version = "0.25.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -40,17 +40,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", ] [[package]] -name = "allocator-api2" -version = "0.2.21" +name = "aligned-vec" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] [[package]] name = "android-activity" @@ -59,7 +62,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.10.0", + "bitflags 2.9.1", "cc", "cesu8", "jni", @@ -70,7 +73,7 @@ dependencies = [ "ndk-context", "ndk-sys", "num_enum", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -81,37 +84,25 @@ checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] -name = "approx" -version = "0.5.1" +name = "arbitrary" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" [[package]] -name = "arboard" -version = "3.6.1" +name = "arg_enum_proc_macro" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ - "clipboard-win", - "image", - "log", - "objc2 0.6.3", - "objc2-app-kit 0.3.2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.2", - "parking_lot", - "percent-encoding", - "windows-sys 0.60.2", - "x11rb", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -145,10 +136,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "backtrace" -version = "0.3.76" +name = "av1-grain" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" +checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -156,7 +170,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-link", + "windows-targets 0.52.6", ] [[package]] @@ -165,17 +179,11 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" -[[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - [[package]] name = "bit_field" -version = "0.10.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" @@ -185,9 +193,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "block2" @@ -199,30 +213,22 @@ dependencies = [ ] [[package]] -name = "bumpalo" -version = "3.19.0" +name = "built" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + +[[package]] +name = "bumpalo" +version = "3.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" [[package]] name = "byteorder" @@ -238,9 +244,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.11.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "calloop" @@ -248,25 +254,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "log", "polling", "rustix 0.38.44", "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" -dependencies = [ - "bitflags 2.10.0", - "polling", - "rustix 1.1.2", - "slab", - "tracing", + "thiserror", ] [[package]] @@ -275,31 +268,18 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ - "calloop 0.13.0", + "calloop", "rustix 0.38.44", "wayland-backend", "wayland-client", ] -[[package]] -name = "calloop-wayland-source" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" -dependencies = [ - "calloop 0.14.3", - "rustix 1.1.2", - "wayland-backend", - "wayland-client", -] - [[package]] name = "cc" -version = "1.2.46" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" dependencies = [ - "find-msvc-tools", "jobserver", "libc", "shlex", @@ -312,10 +292,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "cfg-if" -version = "1.0.4" +name = "cfg-expr" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -333,13 +323,16 @@ dependencies = [ ] [[package]] -name = "clipboard-win" -version = "5.4.1" +name = "chlorine" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" -dependencies = [ - "error-code", -] +checksum = "c00d31b1d19317b4777ec879192d3745bd97d05262b4b19cb1dda284b9d22f19" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "combine" @@ -370,16 +363,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -393,7 +376,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", + "core-foundation", "core-graphics-types", "foreign-types", "libc", @@ -406,15 +389,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", + "core-foundation", "libc", ] [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -446,9 +429,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "cursor-icon" @@ -468,19 +451,8 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.10.0", - "objc2 0.6.3", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", + "bitflags 2.9.1", + "objc2 0.6.1", ] [[package]] @@ -498,81 +470,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" -[[package]] -name = "downcast-rs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" - [[package]] name = "dpi" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" -[[package]] -name = "ecolor" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084980ebede2fb1ad6c4f54285b3e489052ef2b6aa4016e4c19349417adc75c5" -dependencies = [ - "bytemuck", - "emath", -] - -[[package]] -name = "egui" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b75645894de4ca1695ab3ab7201c7953bb95c1725aafeefa6822dc901ad2a81b" -dependencies = [ - "ahash", - "bitflags 2.10.0", - "emath", - "epaint", - "log", - "nohash-hasher", - "profiling", - "smallvec", - "unicode-segmentation", -] - -[[package]] -name = "egui-winit" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4772ed5f16fa8ec2ba295e58f62b58ee83fcf49e67ec13d2b7ddf4e9a2dea34e" -dependencies = [ - "arboard", - "bytemuck", - "egui", - "log", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "profiling", - "raw-window-handle", - "smithay-clipboard", - "web-time", - "webbrowser", - "winit", -] - -[[package]] -name = "egui_glium" -version = "0.31.1" -source = "git+https://github.com/reo6/egui_glium.git#66dbadcb16b3e6c827847eaa51a0ca9bd296d768" -dependencies = [ - "ahash", - "bytemuck", - "egui", - "egui-winit", - "glium", - "log", - "raw-window-handle", - "winit", -] - [[package]] name = "either" version = "1.15.0" @@ -580,47 +483,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "emath" -version = "0.33.2" +name = "equator" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e561352ae95c22ad179fb56c38d6e6eecd86cf4925cf5c70e738dd01df9b620" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" dependencies = [ - "bytemuck", + "equator-macro", ] [[package]] -name = "ena" -version = "0.14.3" +name = "equator-macro" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ - "log", + "proc-macro2", + "quote", + "syn", ] -[[package]] -name = "epaint" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a909ce8cee63e8350fb0c251ad39277a5b24f19add60787e84a3b3ab3f2bd83a" -dependencies = [ - "ab_glyph", - "ahash", - "bytemuck", - "ecolor", - "emath", - "epaint_default_fonts", - "log", - "nohash-hasher", - "parking_lot", - "profiling", -] - -[[package]] -name = "epaint_default_fonts" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9649446c23368ae138716910e3e28143995691b598fbb9de16b42b0722cbcc" - [[package]] name = "equivalent" version = "1.0.2" @@ -629,25 +510,19 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.14" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] -[[package]] -name = "error-code" -version = "3.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" - [[package]] name = "exr" -version = "1.74.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", "half", @@ -658,26 +533,6 @@ dependencies = [ "zune-inflate", ] -[[package]] -name = "fax" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" -dependencies = [ - "fax_derive", -] - -[[package]] -name = "fax_derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "fdeflate" version = "0.3.7" @@ -687,17 +542,11 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "find-msvc-tools" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" - [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -709,18 +558,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - [[package]] name = "foreign-types" version = "0.5.0" @@ -749,41 +586,70 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +name = "fps" +version = "0.1.0" dependencies = [ - "percent-encoding", + "anyhow", + "glam", + "glium", + "gltf", + "glutin", + "hecs", + "image", + "imgui", + "imgui-glium-renderer", + "imgui-winit-support", + "winit", ] [[package]] name = "gethostname" -version = "1.1.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" dependencies = [ - "rustix 1.1.2", - "windows-link", + "libc", + "windows-targets 0.48.5", ] [[package]] name = "getrandom" -version = "0.3.4" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", "r-efi", - "wasip2", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", ] [[package]] name = "gimli" -version = "0.32.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "gl_generator" @@ -798,105 +664,15 @@ dependencies = [ [[package]] name = "glam" -version = "0.14.0" +version = "0.30.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333928d5eb103c5d4050533cec0384302db6be8ef7d3cebd30ec6a35350353da" - -[[package]] -name = "glam" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abb554f8ee44336b72d522e0a7fe86a29e09f839a36022fa869a7dfe941a54b" - -[[package]] -name = "glam" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4126c0479ccf7e8664c36a2d719f5f2c140fbb4f9090008098d2c291fa5b3f16" - -[[package]] -name = "glam" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01732b97afd8508eee3333a541b9f7610f454bb818669e66e90f5f57c93a776" - -[[package]] -name = "glam" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525a3e490ba77b8e326fb67d4b44b4bd2f920f44d4cc73ccec50adc68e3bee34" - -[[package]] -name = "glam" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8509e6791516e81c1a630d0bd7fbac36d2fa8712a9da8662e716b52d5051ca" - -[[package]] -name = "glam" -version = "0.20.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" - -[[package]] -name = "glam" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" - -[[package]] -name = "glam" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774" - -[[package]] -name = "glam" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e4afd9ad95555081e109fe1d21f2a30c691b5f0919c67dfa690a2e1eb6bd51c" - -[[package]] -name = "glam" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" - -[[package]] -name = "glam" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" - -[[package]] -name = "glam" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" - -[[package]] -name = "glam" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" - -[[package]] -name = "glam" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" - -[[package]] -name = "glam" -version = "0.30.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd47b05dddf0005d850e5644cae7f2b14ac3df487979dbfff3b56f20b1a6ae46" +checksum = "50a99dbe56b72736564cfa4b85bf9a33079f16ae8b74983ab06af3b1a3696b11" [[package]] name = "glium" -version = "0.36.0" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf52ce4f5ce1501bb056627f35484a819e812d1d93f0f3da413676421b1bbe0" +checksum = "0a3028d1f135b5395e6e4336916b424bc5dd2b38c6e378ce2704e4b8f4a617ed" dependencies = [ "backtrace", "fnv", @@ -954,7 +730,7 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "cfg_aliases", "cgl", "dispatch2", @@ -962,10 +738,10 @@ dependencies = [ "glutin_glx_sys", "glutin_wgl_sys", "libloading", - "objc2 0.6.3", - "objc2-app-kit 0.3.2", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", "objc2-core-foundation", - "objc2-foundation 0.3.2", + "objc2-foundation 0.3.1", "once_cell", "raw-window-handle", "wayland-sys", @@ -1016,22 +792,12 @@ dependencies = [ [[package]] name = "half" -version = "2.7.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", - "zerocopy", -] - -[[package]] -name = "hash32" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" -dependencies = [ - "byteorder", ] [[package]] @@ -1045,33 +811,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.1.5", -] +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] -name = "hashbrown" -version = "0.16.0" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" -dependencies = [ - "foldhash 0.2.0", -] - -[[package]] -name = "heapless" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" -dependencies = [ - "hash32", - "stable_deref_trait", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hecs" @@ -1089,133 +837,98 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "image" -version = "0.25.9" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", "exr", - "moxcms", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", - "zune-core 0.5.0", - "zune-jpeg 0.5.5", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "imgui" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8addafa5cecf0515812226e806913814e02ce38d10215778082af5174abe5669" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "imgui-sys", + "mint", + "parking_lot", +] + +[[package]] +name = "imgui-glium-renderer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781e53a393214a132c89c62e6e4b817645ad38832d3e334b2ad543f2c3df5106" +dependencies = [ + "glium", + "imgui", +] + +[[package]] +name = "imgui-sys" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ead193f9f4b60398e8b8f4ab1483e2321640d87aeebdaa3e5f44c55633ccd804" +dependencies = [ + "cc", + "cfg-if", + "chlorine", + "mint", +] + +[[package]] +name = "imgui-winit-support" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7fcccfa9efab56c94274c0fec9939bb14149342b49e6a425883a5b7dda6a3f" +dependencies = [ + "imgui", + "winit", ] [[package]] name = "indexmap" -version = "2.12.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.16.0", + "hashbrown 0.15.4", ] [[package]] @@ -1224,6 +937,26 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -1241,7 +974,7 @@ dependencies = [ "combine", "jni-sys", "log", - "thiserror 1.0.69", + "thiserror", "walkdir", "windows-sys 0.45.0", ] @@ -1254,19 +987,25 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ - "getrandom", + "getrandom 0.3.3", "libc", ] [[package]] -name = "js-sys" -version = "0.3.82" +name = "jpeg-decoder" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1286,41 +1025,45 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] -name = "libloading" -version = "0.8.9" +name = "libfuzzer-sys" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" dependencies = [ - "cfg-if", - "windows-link", + "arbitrary", + "cc", ] [[package]] -name = "libm" -version = "0.2.15" +name = "libloading" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.53.2", +] [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.5.13", ] [[package]] @@ -1331,52 +1074,56 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "lock_api" -version = "0.4.14" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.28" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] -name = "matrixmultiply" -version = "0.3.10" +name = "loop9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" dependencies = [ - "autocfg", - "rawpointer", + "imgref", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", ] [[package]] name = "memchr" -version = "2.7.6" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.9" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -1390,6 +1137,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1401,57 +1154,10 @@ dependencies = [ ] [[package]] -name = "moxcms" -version = "0.7.9" +name = "mint" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" -dependencies = [ - "num-traits", - "pxfm", -] - -[[package]] -name = "nalgebra" -version = "0.34.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d5b3eff5cd580f93da45e64715e8c20a3996342f1e466599cf7a267a0c2f5f" -dependencies = [ - "approx", - "glam 0.14.0", - "glam 0.15.2", - "glam 0.16.0", - "glam 0.17.3", - "glam 0.18.0", - "glam 0.19.0", - "glam 0.20.5", - "glam 0.21.3", - "glam 0.22.0", - "glam 0.23.0", - "glam 0.24.2", - "glam 0.25.0", - "glam 0.27.0", - "glam 0.28.0", - "glam 0.29.3", - "glam 0.30.9", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "simba", - "typenum", -] - -[[package]] -name = "nalgebra-macros" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "973e7178a678cfd059ccec50887658d482ce16b0aa9da3888ddeab5cd5eb4889" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" [[package]] name = "ndk" @@ -1459,13 +1165,13 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "jni-sys", "log", "ndk-sys", "num_enum", "raw-window-handle", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -1484,10 +1190,26 @@ dependencies = [ ] [[package]] -name = "nohash-hasher" -version = "0.2.0" +name = "new_debug_unreachable" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "num-bigint" @@ -1499,15 +1221,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - [[package]] name = "num-derive" version = "0.4.2" @@ -1546,14 +1259,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", "rustversion", @@ -1561,9 +1273,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1589,9 +1301,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" dependencies = [ "objc2-encode", ] @@ -1602,7 +1314,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "libc", "objc2 0.5.2", @@ -1614,15 +1326,14 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" dependencies = [ - "bitflags 2.10.0", - "objc2 0.6.3", + "bitflags 2.9.1", + "objc2 0.6.1", "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.2", + "objc2-foundation 0.3.1", ] [[package]] @@ -1631,7 +1342,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "objc2 0.5.2", "objc2-core-location", @@ -1655,7 +1366,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -1663,26 +1374,13 @@ dependencies = [ [[package]] name = "objc2-core-foundation" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "dispatch2", - "objc2 0.6.3", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" -dependencies = [ - "bitflags 2.10.0", - "dispatch2", - "objc2 0.6.3", - "objc2-core-foundation", - "objc2-io-surface", + "objc2 0.6.1", ] [[package]] @@ -1721,7 +1419,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "dispatch", "libc", @@ -1730,23 +1428,12 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ - "bitflags 2.10.0", - "objc2 0.6.3", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" -dependencies = [ - "bitflags 2.10.0", - "objc2 0.6.3", + "bitflags 2.9.1", + "objc2 0.6.1", "objc2-core-foundation", ] @@ -1768,7 +1455,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -1780,7 +1467,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -1803,7 +1490,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "objc2 0.5.2", "objc2-cloud-kit", @@ -1835,7 +1522,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "objc2 0.5.2", "objc2-core-location", @@ -1844,9 +1531,9 @@ dependencies = [ [[package]] name = "object" -version = "0.37.3" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -1859,36 +1546,27 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "orbclient" -version = "0.3.49" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" dependencies = [ "libredox", ] -[[package]] -name = "ordered-float" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" -dependencies = [ - "num-traits", -] - [[package]] name = "owned_ttf_parser" -version = "0.25.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ "ttf-parser", ] [[package]] name = "parking_lot" -version = "0.12.5" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1896,43 +1574,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.12" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall 0.5.13", "smallvec", - "windows-link", -] - -[[package]] -name = "parry3d" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99471b7b6870f7fe406d5611dd4b4c9b07aa3e5436b1d27e1515f9832bb0c6b" -dependencies = [ - "approx", - "arrayvec", - "bitflags 2.10.0", - "downcast-rs 2.0.2", - "either", - "ena", - "foldhash 0.2.0", - "hashbrown 0.16.0", - "log", - "nalgebra", - "num-derive", - "num-traits", - "ordered-float", - "rstar", - "simba", - "slab", - "smallvec", - "spade", - "static_assertions", - "thiserror 2.0.17", + "windows-targets 0.52.6", ] [[package]] @@ -1943,9 +1593,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" -version = "2.3.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" @@ -1981,11 +1631,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" -version = "0.18.0" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ - "bitflags 2.10.0", + "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", @@ -1994,41 +1644,42 @@ dependencies = [ [[package]] name = "polling" -version = "3.11.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.1.2", - "windows-sys 0.61.2", + "rustix 1.0.7", + "tracing", + "windows-sys 0.59.0", ] [[package]] -name = "potential_utf" -version = "0.1.4" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerovec", + "zerocopy", ] [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -2053,12 +1704,12 @@ dependencies = [ ] [[package]] -name = "pxfm" -version = "0.1.25" +name = "qoi" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" dependencies = [ - "num-traits", + "bytemuck", ] [[package]] @@ -2078,9 +1729,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.42" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -2092,134 +1743,83 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "raidillon_app" -version = "0.1.0" -dependencies = [ - "raidillon_assets", - "raidillon_core", - "raidillon_ecs", - "raidillon_engine", - "raidillon_glium", - "raidillon_physics", - "raidillon_platform", -] - -[[package]] -name = "raidillon_assets" -version = "0.1.0" - -[[package]] -name = "raidillon_core" -version = "0.1.0" -dependencies = [ - "egui", - "hecs", - "indexmap", - "raidillon_assets", - "winit", -] - -[[package]] -name = "raidillon_ecs" -version = "0.1.0" -dependencies = [ - "glam 0.30.9", - "raidillon_assets", - "rapier3d", -] - -[[package]] -name = "raidillon_engine" -version = "0.1.0" -dependencies = [ - "egui", - "glam 0.30.9", - "hecs", - "indexmap", - "raidillon_assets", - "raidillon_core", - "raidillon_ecs", - "raidillon_platform", - "winit", -] - -[[package]] -name = "raidillon_game" -version = "0.1.0" -dependencies = [ - "egui", - "glam 0.30.9", - "hecs", - "raidillon_app", - "rapier3d", - "winit", -] - -[[package]] -name = "raidillon_glium" -version = "0.1.0" -dependencies = [ - "anyhow", - "egui", - "egui_glium", - "exr", - "glam 0.30.9", - "glium", - "gltf", - "image", - "indexmap", - "raidillon_assets", - "raidillon_core", - "raidillon_ecs", - "raidillon_engine", - "raidillon_platform", - "winit", -] - -[[package]] -name = "raidillon_physics" -version = "0.1.0" -dependencies = [ - "glam 0.30.9", - "raidillon_ecs", - "rapier3d", -] - -[[package]] -name = "raidillon_platform" -version = "0.1.0" -dependencies = [ - "glam 0.30.9", - "raidillon_assets", - "raidillon_core", - "serde", - "toml", - "winit", -] - -[[package]] -name = "rapier3d" -version = "0.30.1" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd27b8eb36d0833fa0f2aea40164fabfad0fc34b9932286ae9e84f3452f5364" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "approx", + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", "arrayvec", - "bit-vec", - "bitflags 2.10.0", - "downcast-rs 2.0.2", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", "log", - "nalgebra", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", "num-derive", "num-traits", - "ordered-float", - "parry3d", + "once_cell", + "paste", "profiling", - "rustc-hash", - "simba", - "static_assertions", - "thiserror 2.0.17", - "wide", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", ] [[package]] @@ -2229,16 +1829,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] -name = "rawpointer" -version = "0.2.1" +name = "rayon" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] [[package]] name = "rayon-core" -version = "1.13.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2255,41 +1859,24 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", ] [[package]] -name = "robust" -version = "1.2.0" +name = "rgb" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" - -[[package]] -name = "rstar" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" -dependencies = [ - "heapless", - "num-traits", - "smallvec", -] +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustix" @@ -2297,7 +1884,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2306,22 +1893,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.2" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "errno", "libc", - "linux-raw-sys 0.11.0", - "windows-sys 0.61.2", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", ] [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "ryu" @@ -2329,15 +1916,6 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" -[[package]] -name = "safe_arch" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" -dependencies = [ - "bytemuck", -] - [[package]] name = "same-file" version = "1.0.6" @@ -2368,34 +1946,24 @@ dependencies = [ "ab_glyph", "log", "memmap2", - "smithay-client-toolkit 0.19.2", + "smithay-client-toolkit", "tiny-skia", ] [[package]] name = "serde" -version = "1.0.228" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.228" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -2404,24 +1972,23 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", "ryu", "serde", - "serde_core", ] [[package]] name = "serde_spanned" -version = "1.0.3" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ - "serde_core", + "serde", ] [[package]] @@ -2430,19 +1997,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "simba" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simd-adler32" version = "0.3.7" @@ -2450,10 +2004,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] -name = "slab" -version = "0.4.11" +name = "simd_helpers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "slab" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallvec" @@ -2467,15 +2030,15 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.10.0", - "calloop 0.13.0", - "calloop-wayland-source 0.3.0", + "bitflags 2.9.1", + "calloop", + "calloop-wayland-source", "cursor-icon", "libc", "log", "memmap2", "rustix 0.38.44", - "thiserror 1.0.69", + "thiserror", "wayland-backend", "wayland-client", "wayland-csd-frame", @@ -2486,44 +2049,6 @@ dependencies = [ "xkeysym", ] -[[package]] -name = "smithay-client-toolkit" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" -dependencies = [ - "bitflags 2.10.0", - "calloop 0.14.3", - "calloop-wayland-source 0.4.1", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 1.1.2", - "thiserror 2.0.17", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-experimental", - "wayland-protocols-misc", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smithay-clipboard" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" -dependencies = [ - "libc", - "smithay-client-toolkit 0.20.0", - "wayland-backend", -] - [[package]] name = "smol_str" version = "0.2.2" @@ -2533,36 +2058,12 @@ dependencies = [ "serde", ] -[[package]] -name = "spade" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb313e1c8afee5b5647e00ee0fe6855e3d529eb863a0fdae1d60006c4d1e9990" -dependencies = [ - "hashbrown 0.15.5", - "num-traits", - "robust", - "smallvec", -] - [[package]] name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strict-num" version = "0.1.1" @@ -2571,9 +2072,9 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" [[package]] name = "syn" -version = "2.0.110" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -2581,32 +2082,31 @@ dependencies = [ ] [[package]] -name = "synstructure" -version = "0.13.2" +name = "system-deps" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "proc-macro2", - "quote", - "syn", + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", ] +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "thiserror" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl", ] [[package]] @@ -2620,29 +2120,15 @@ dependencies = [ "syn", ] -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "tiff" -version = "0.10.3" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ - "fax", "flate2", - "half", - "quick-error", + "jpeg-decoder", "weezl", - "zune-jpeg 0.4.21", ] [[package]] @@ -2670,74 +2156,46 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "toml" -version = "0.9.8" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ - "indexmap", - "serde_core", + "serde", "serde_spanned", "toml_datetime", - "toml_parser", - "toml_writer", - "winnow", + "toml_edit", ] [[package]] name = "toml_datetime" -version = "0.7.3" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ - "serde_core", + "serde", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", - "toml_parser", "winnow", ] -[[package]] -name = "toml_parser" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_writer" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" - [[package]] name = "tracing" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "log", "pin-project-lite", "tracing-core", ] @@ -2754,17 +2212,11 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" @@ -2772,18 +2224,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - [[package]] name = "urlencoding" version = "2.1.3" @@ -2791,10 +2231,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] -name = "utf8_iter" -version = "1.0.4" +name = "v_frame" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "version_check" @@ -2813,57 +2264,40 @@ dependencies = [ ] [[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ - "wit-bindgen", + "wit-bindgen-rt", ] [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", - "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-futures" -version = "0.4.55" +name = "wasm-bindgen-backend" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.105" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", + "log", "proc-macro2", "quote", "syn", @@ -2871,23 +2305,58 @@ dependencies = [ ] [[package]] -name = "wasm-bindgen-shared" -version = "0.2.105" +name = "wasm-bindgen-futures" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" dependencies = [ "unicode-ident", ] [[package]] name = "wayland-backend" -version = "0.3.11" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" dependencies = [ "cc", - "downcast-rs 1.2.1", - "rustix 1.1.2", + "downcast-rs", + "rustix 0.38.44", "scoped-tls", "smallvec", "wayland-sys", @@ -2895,12 +2364,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.11" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" dependencies = [ - "bitflags 2.10.0", - "rustix 1.1.2", + "bitflags 2.9.1", + "rustix 0.38.44", "wayland-backend", "wayland-scanner", ] @@ -2911,67 +2380,41 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.11" +version = "0.31.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" dependencies = [ - "rustix 1.1.2", + "rustix 0.38.44", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.9" +version = "0.32.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-scanner", ] -[[package]] -name = "wayland-protocols-experimental" -version = "20250721.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-misc" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a6307d19c" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - [[package]] name = "wayland-protocols-plasma" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -2980,11 +2423,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -2993,9 +2436,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.7" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" dependencies = [ "proc-macro2", "quick-xml", @@ -3004,9 +2447,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.7" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" dependencies = [ "dlib", "log", @@ -3016,9 +2459,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -3034,53 +2477,21 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webbrowser" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97" -dependencies = [ - "core-foundation 0.10.1", - "jni", - "log", - "ndk-context", - "objc2 0.6.3", - "objc2-foundation 0.3.2", - "url", - "web-sys", -] - [[package]] name = "weezl" -version = "0.1.12" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" - -[[package]] -name = "wide" -version = "0.7.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" -dependencies = [ - "bytemuck", - "safe_arch", -] +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "winapi-util" -version = "0.1.11" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - [[package]] name = "windows-sys" version = "0.45.0" @@ -3114,16 +2525,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", + "windows-targets 0.53.2", ] [[package]] @@ -3141,6 +2543,21 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -3159,19 +2576,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.5" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -3180,6 +2596,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -3188,9 +2610,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -3198,6 +2620,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -3206,9 +2634,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -3216,6 +2644,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3224,9 +2658,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" @@ -3236,9 +2670,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -3246,6 +2680,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -3254,9 +2694,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -3264,6 +2704,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -3272,9 +2718,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -3282,6 +2728,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -3290,9 +2742,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -3300,6 +2752,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3308,26 +2766,26 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winit" -version = "0.30.12" +version = "0.30.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" +checksum = "a4409c10174df8779dc29a4788cac85ed84024ccbc1743b776b21a520ee1aaf4" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.10.0", + "bitflags 2.9.1", "block2", "bytemuck", - "calloop 0.13.0", + "calloop", "cfg_aliases", "concurrent-queue", - "core-foundation 0.9.4", + "core-foundation", "core-graphics", "cursor-icon", "dpi", @@ -3346,7 +2804,7 @@ dependencies = [ "redox_syscall 0.4.1", "rustix 0.38.44", "sctk-adwaita", - "smithay-client-toolkit 0.19.2", + "smithay-client-toolkit", "smol_str", "tracing", "unicode-segmentation", @@ -3366,24 +2824,21 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen" -version = "0.46.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] [[package]] name = "x11-dl" @@ -3398,30 +2853,30 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", "libloading", "once_cell", - "rustix 1.1.2", + "rustix 0.38.44", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xcursor" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" +checksum = "635887f4315a33cb714eb059bdbd7c1c92bfa71bc5b9d5115460502f788c2ab5" [[package]] name = "xkbcommon-dl" @@ -3429,7 +2884,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.9.1", "dlib", "log", "once_cell", @@ -3444,101 +2899,24 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.28" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "zerocopy" -version = "0.8.27" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.27" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", @@ -3551,12 +2929,6 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" -[[package]] -name = "zune-core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111f7d9820f05fd715df3144e254d6fc02ee4088b0644c0ffd0efc9e6d9d2773" - [[package]] name = "zune-inflate" version = "0.2.54" @@ -3568,18 +2940,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.21" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" dependencies = [ - "zune-core 0.4.12", -] - -[[package]] -name = "zune-jpeg" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fb7703e32e9a07fb3f757360338b3a567a5054f21b5f52a666752e333d58e" -dependencies = [ - "zune-core 0.5.0", + "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index 3741214..d26e25b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,21 @@ -[workspace] -members = [ - "core", - "glium_platform", - "platform", - "asset", - "game", - "ecs", - "engine", - "physics", "app", -] +[package] +name = "fps" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0.98" +glam = "0.30.4" + +glium = { version = "0.35.0", features = ["glutin_backend", "simple_window_builder"] } +gltf = { version = "1.4.1", features = ["import", "utils", "KHR_texture_transform"] } +glutin = { version = "0.32.3", default-features = false } + +hecs = "0.10.5" +image = "0.25.6" + +imgui = "0.12" +imgui-winit-support = "0.13" +imgui-glium-renderer = "0.13" + +winit = "0.30" diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 0ad25db..0000000 --- a/LICENSE +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. diff --git a/README.md b/README.md deleted file mode 100644 index bac9855..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Raidillon rewrite number #23818491847214 - -Starting in 2025-08-03, 17:59 UTC+3 diff --git a/app/Cargo.toml b/app/Cargo.toml deleted file mode 100644 index 081dae0..0000000 --- a/app/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "raidillon_app" -version = "0.1.0" -edition = "2024" - -[dependencies] -raidillon_engine = { path = "../engine" } -raidillon_platform = { path = "../platform" } -raidillon_assets = { path = "../asset" } -raidillon_ecs = { path = "../ecs" } -raidillon_physics = { path = "../physics" } -raidillon_glium = { path = "../glium_platform", optional = true } -raidillon_core = { path = "../core" } - -[features] -glium = ["raidillon_glium"] diff --git a/app/src/lib.rs b/app/src/lib.rs deleted file mode 100644 index a5b875a..0000000 --- a/app/src/lib.rs +++ /dev/null @@ -1,45 +0,0 @@ -pub mod prelude; - -pub use prelude::*; - -pub struct App { - pub engine: Option, -} - -impl App { - pub fn new() -> Self { - let engine = Engine::new(); - Self { engine: Some(engine) } - } - - pub fn add_system(&mut self) -> &mut Self { - self.engine.as_mut().unwrap().system_manager.add::(); - self - } - - pub fn add_scene(&mut self, id: SceneID, scene: Scene) -> &mut Self { - self.engine.as_mut().unwrap().scene_manager.add_scene(id, scene); - self - } - - pub fn set_active_scene(&mut self, id: SceneID) -> &mut Self { - self.engine.as_mut().unwrap().scene_manager.set_active_scene(id); - self - } - - pub fn run(&mut self, title: String, width: u32, height: u32) { - #[cfg(feature = "glium")] - { - let platform = GliumPlatform::initialize( - self.engine.take().unwrap(), - title, - width, - height, - ); - platform.run(); - } - - #[cfg(not(any(feature = "glium")))] - compile_error!("No platform feature enabled."); - } -} diff --git a/app/src/prelude.rs b/app/src/prelude.rs deleted file mode 100644 index fc9cdc1..0000000 --- a/app/src/prelude.rs +++ /dev/null @@ -1,47 +0,0 @@ -pub use raidillon_engine::{ - Engine, - system::System, - EngineResources, - InputState, - system::SystemContext, -}; - -pub use raidillon_platform::{ - Platform, - Camera, - PlatformContext, - TimeContext, - DebugWireframes, - DebugWireframesRef, - DebugWireframeVertex, - settings::{Settings, WindowMode}, -}; - -pub use raidillon_assets::{ - ModelManagerRef, - model_path, -}; - -pub use raidillon_ecs::{ - components::{ - CameraMode, - CharacterBodyComponent, - ModelHandle, - RigidBodyComponent, - Transform, - }, -}; - -pub use raidillon_physics::Physics; - -pub use raidillon_core::{ - scene::{Scene, SceneID}, - EguiQueue, - engine::EngineTrait, -}; - -#[cfg(feature = "glium")] -pub use raidillon_glium::{ - GliumPlatform, - RenderingSystem, -}; diff --git a/asset/Cargo.toml b/asset/Cargo.toml deleted file mode 100644 index 7b35051..0000000 --- a/asset/Cargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[package] -name = "raidillon_assets" -version = "0.1.0" -edition = "2024" diff --git a/asset/src/lib.rs b/asset/src/lib.rs deleted file mode 100644 index 617ced9..0000000 --- a/asset/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -pub mod model_manager; - -use std::path::PathBuf; -pub use crate::model_manager::{ModelManager, ModelManagerRef}; - -pub use crate::model_manager::ModelID; - -#[macro_export] -macro_rules! include_shader { - ($path:expr) => { - include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/../assets/shaders/", $path)) - }; -} - -pub fn model_path(path: &str) -> PathBuf { - let manifest_dir = env!("CARGO_MANIFEST_DIR"); - PathBuf::from(manifest_dir) - .join("..") - .join("assets") - .join("models") - .join(path) -} diff --git a/asset/src/model_manager.rs b/asset/src/model_manager.rs deleted file mode 100644 index 2989a3b..0000000 --- a/asset/src/model_manager.rs +++ /dev/null @@ -1,17 +0,0 @@ -use std::any::Any; -use std::cell::RefCell; -use std::path::{Path, PathBuf}; -use std::rc::Rc; - -pub type ModelManagerRef = Rc>>; -pub type ModelID = &'static str; - -/// The asset manager trait of Raidillon. -pub trait ModelManager: Any { - /// Loads a gltf model to VRAM. - fn load_gltf(&mut self, id: ModelID, path: &Path); - /// Unloads the loaded model from VRAM. - fn unload_model(&mut self, id: ModelID); - - fn get_model(&self, id: &ModelID) -> Option<&dyn Any>; -} diff --git a/assets/exr/citrus_orchard_road_puresky_4k.exr b/assets/exr/citrus_orchard_road_puresky_4k.exr deleted file mode 100644 index c57cb53..0000000 --- a/assets/exr/citrus_orchard_road_puresky_4k.exr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8aa6cc5bb4a5a8f5fa12870cefdd6a6b600072454add837dca45e340c1549d30 -size 70720809 diff --git a/assets/exr/qwantani_sunset_puresky_2k.exr b/assets/exr/qwantani_sunset_puresky_2k.exr deleted file mode 100644 index 86cd3d7..0000000 --- a/assets/exr/qwantani_sunset_puresky_2k.exr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f738ddd35a5e1a291eb45b30eea73b4d296dc4a05a412ae2f187ef5e95dc076a -size 18335204 diff --git a/assets/models/checkered-sphere.glb b/assets/models/checkered-sphere.glb deleted file mode 100644 index ad55283..0000000 --- a/assets/models/checkered-sphere.glb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36498b406df94ee6990c72a932082101fe0427af52260893e299e4d1a44de084 -size 1796992 diff --git a/assets/models/monkey.bin b/assets/models/monkey.bin deleted file mode 100644 index 56f4aa0..0000000 --- a/assets/models/monkey.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2923e6a499c84e4e9ecbccc603d58c05a486e078d510e166e9bc29d650ee04f9 -size 68720 diff --git a/assets/models/monkey.gltf b/assets/models/monkey.gltf deleted file mode 100644 index 2651b01..0000000 --- a/assets/models/monkey.gltf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6513b26c81eb59be818a8ddc0331eccd2e54d8c2e9b0d7edb01b491a16cdc421 -size 1333 diff --git a/assets/models/pink-monkey.bin b/assets/models/pink-monkey.bin deleted file mode 100644 index 627ca3e..0000000 --- a/assets/models/pink-monkey.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fcaf25b1759576258bafee8765fa290e6451c95a2d5c12874ee38d2bc92e896 -size 68720 diff --git a/assets/models/pink-monkey.gltf b/assets/models/pink-monkey.gltf deleted file mode 100644 index d4c6adf..0000000 --- a/assets/models/pink-monkey.gltf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a955cb6bcdcaed40dee676c707ba562f93ca960806107c6e9f328764be49a303 -size 1613 diff --git a/assets/models/plane.glb b/assets/models/plane.glb deleted file mode 100644 index e755152..0000000 --- a/assets/models/plane.glb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b54f00f327a5edc76c03f83d4efa2a4400215d7ca9c961b38537e7f836bca710 -size 1240 diff --git a/assets/models/sphere.glb b/assets/models/sphere.glb deleted file mode 100644 index ea99045..0000000 --- a/assets/models/sphere.glb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78583ec562098f7fa4eaf95c6e21b7d1ced53416eb4c71351e246d53f93aa0a3 -size 24744 diff --git a/assets/models/tree.bin b/assets/models/tree.bin deleted file mode 100644 index 225ddd1..0000000 --- a/assets/models/tree.bin +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35fedb1c88d531e3da9f17c9dc5280d460e823b500dd78ecaa3b66491f2c3ae0 -size 13584 diff --git a/assets/models/tree.gltf b/assets/models/tree.gltf deleted file mode 100644 index 58b4fb9..0000000 --- a/assets/models/tree.gltf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f5b405308b025a6fdc8e5dad59d374350415338102219f5a31562064d3624c8 -size 1846 diff --git a/assets/models/tree_texture.png b/assets/models/tree_texture.png deleted file mode 100644 index 1d2807b..0000000 --- a/assets/models/tree_texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c3ed7b08e15311fb96786cf3f9c268d83a6cf416bf4c91e2ffbf7746ea0e4c9 -size 845 diff --git a/assets/shaders/debug_wireframe.frag b/assets/shaders/debug_wireframe.frag deleted file mode 100644 index 96d53b9..0000000 --- a/assets/shaders/debug_wireframe.frag +++ /dev/null @@ -1,9 +0,0 @@ -#version 330 core - -in vec4 v_color; - -out vec4 frag_color; - -void main() { - frag_color = v_color; -} diff --git a/assets/shaders/debug_wireframe.vert b/assets/shaders/debug_wireframe.vert deleted file mode 100644 index 7a53438..0000000 --- a/assets/shaders/debug_wireframe.vert +++ /dev/null @@ -1,14 +0,0 @@ -#version 330 core - -in vec3 position; -in vec4 color; - -uniform mat4 view; -uniform mat4 projection; - -out vec4 v_color; - -void main() { - v_color = color; - gl_Position = projection * view * vec4(position, 1.0); -} diff --git a/assets/shaders/gl_textured.frag b/assets/shaders/gl_textured.frag deleted file mode 100644 index abfa702..0000000 --- a/assets/shaders/gl_textured.frag +++ /dev/null @@ -1,43 +0,0 @@ -#version 330 core - -in vec3 v_normal; -in vec2 v_tex; -in vec3 v_position; - -out vec4 frag_color; - -uniform vec3 u_light; // direction TO the light (normalized) -uniform sampler2D tex; -uniform vec3 color; // base colour factor (acts as solid colour when no texture) - -void main() { - // Combine base texture (or constant white) with colour factor supplied by CPU. - vec3 base_col = texture(tex, v_tex).rgb * color; - - vec3 N = normalize(v_normal); - vec3 L = normalize(u_light); - - // Classic Blinn-Phong lighting - // Ambient: always present - vec3 ambient = base_col * 0.15; - - // Diffuse: N dot L, clamped - float NdotL = max(dot(N, L), 0.0); - vec3 diffuse = base_col * NdotL * 0.7; - - // Specular: only on surfaces facing the light (NdotL > 0) - float specular = 0.0; - if (NdotL > 0.0) { - vec3 V = normalize(-v_position); // view direction (camera at origin in view space) - vec3 H = normalize(L + V); // half-vector - float NdotH = max(dot(N, H), 0.0); - specular = pow(NdotH, 32.0) * 0.5; // tighter highlight, moderated intensity - } - - vec3 result = ambient + diffuse + vec3(specular); - - // Convert from linear to sRGB for display (approximate gamma correction) - result = pow(result, vec3(1.0 / 2.2)); - - frag_color = vec4(result, 1.0); -} diff --git a/assets_src/blender/plane.blend b/assets_src/blender/plane.blend new file mode 100644 index 0000000..535b755 Binary files /dev/null and b/assets_src/blender/plane.blend differ diff --git a/core/Cargo.lock b/core/Cargo.lock deleted file mode 100644 index 1377fa3..0000000 --- a/core/Cargo.lock +++ /dev/null @@ -1,120 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - -[[package]] -name = "hecs" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cbc675ee8d97b4d206a985137f8ad59666538f56f906474f554467a63c776d" -dependencies = [ - "hashbrown", - "spin", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "raidillon_core" -version = "0.1.0" -dependencies = [ - "hecs", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/core/Cargo.toml b/core/Cargo.toml deleted file mode 100644 index 9b3f82f..0000000 --- a/core/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "raidillon_core" -version = "0.1.0" -edition = "2024" - -[dependencies] -hecs = "0.10.5" -indexmap = "2.10.0" -raidillon_assets = { path = "../asset" } -winit = "0.30.12" -egui = "0.33.2" \ No newline at end of file diff --git a/core/src/egui_queue.rs b/core/src/egui_queue.rs deleted file mode 100644 index fbbb789..0000000 --- a/core/src/egui_queue.rs +++ /dev/null @@ -1,22 +0,0 @@ -pub struct EguiQueue { - pub queue_vec: Vec>, -} - -impl EguiQueue { - pub fn new() -> Self { - Self { queue_vec: Vec::new() } - } - - pub fn queue(&mut self, func: impl FnOnce(&egui::Context) + Send + 'static) { - self.queue_vec.push(Box::new(func)); - } - - pub fn clear(&mut self) { - self.queue_vec.clear() - } - - pub fn run(&mut self, ctx: &egui::Context) { - self.queue_vec.drain(..).for_each(|func| func(ctx)); - self.clear(); - } -} diff --git a/core/src/engine.rs b/core/src/engine.rs deleted file mode 100644 index 5890063..0000000 --- a/core/src/engine.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::scene::Scene; - -pub trait EngineTrait { - type PlatformCtx: Clone; - fn new() -> Self; - fn initialize(&mut self, platform_context: Self::PlatformCtx); - fn frame_update(&mut self, platform_context: Self::PlatformCtx); - fn fixed_update(&mut self, platform_context: Self::PlatformCtx); - fn handle_event(&mut self, platform_context: Self::PlatformCtx); - fn current_scene_mut(&mut self) -> &mut Scene; - fn current_scene(&self) -> &Scene; -} diff --git a/core/src/lib.rs b/core/src/lib.rs deleted file mode 100644 index 759393d..0000000 --- a/core/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod engine; -pub mod time; -pub mod utils; -pub mod scene; -mod egui_queue; - -pub use egui_queue::EguiQueue; diff --git a/core/src/scene.rs b/core/src/scene.rs deleted file mode 100644 index e586be5..0000000 --- a/core/src/scene.rs +++ /dev/null @@ -1,85 +0,0 @@ -use std::collections::HashMap; -use std::path::{Path, PathBuf}; -use crate::{define_typemap}; - -pub struct Scene { - pub title: String, - pub world: hecs::World, - pub skybox_texture_path: Option, - pub resources: SceneResources, -} - -define_typemap!(SceneResources,); - -impl Scene { - pub fn new(title: String, skybox_texture_path: Option) -> Self { - let mut s = Self { - title, - world: hecs::World::new(), - skybox_texture_path, - resources: SceneResources::new(), - }; - s.load_default_resources(); - s - } - - pub fn load_default_resources(&mut self) {} -} - -impl Scene {} - -impl AsRef for Scene { - fn as_ref(&self) -> &Scene { - &self - } -} - -impl AsMut for Scene { - fn as_mut(&mut self) -> &mut Scene { - self - } -} - -pub type SceneID = &'static str; - -pub struct SceneManager { - scenes: HashMap, - active_scene: Option, -} - -impl SceneManager { - pub fn new() -> Self { - let scenes = HashMap::new(); - Self { - scenes, - active_scene: None, - } - } - - pub fn current(&self) -> &Scene { - match &self.active_scene { - Some(id) => self.scenes[id].as_ref(), - None => panic!("No active scene"), - } - - } - - pub fn current_mut(&mut self) -> &mut Scene { - match &mut self.active_scene { - Some(id) => self.scenes.get_mut(id).unwrap().as_mut(), - None => panic!("No active scene"), - } - } - - pub fn set_active_scene(&mut self, scene: SceneID) { - self.active_scene = Some(scene); - } - - pub fn add_scene(&mut self, id: SceneID, scene: Scene) { - self.scenes.insert(id, scene); - } - - pub fn remove_scene(&mut self, id: SceneID) { - self.scenes.remove(&id); - } -} diff --git a/core/src/time.rs b/core/src/time.rs deleted file mode 100644 index c47466d..0000000 --- a/core/src/time.rs +++ /dev/null @@ -1,144 +0,0 @@ -use std::thread; -use std::time::{Duration, Instant}; - -#[derive(Clone, Debug)] -pub struct Config { - pub target_frame_hz: Option, - pub target_update_hz: f64, - pub max_updates_per_frame: u32, - pub max_accumulated_steps: u32, - pub sleep_tolerance: Duration, -} - -impl Default for Config { - fn default() -> Self { - Self { - target_frame_hz: Some(144.0), - target_update_hz: 60.0, - max_updates_per_frame: 5, - max_accumulated_steps: 8, - sleep_tolerance: Duration::from_micros(500), - } - } -} - -#[derive(Debug)] -pub struct Time { - cfg: Config, - last_instant: Instant, - next_frame_due: Instant, - frame_interval: Option, - fixed_dt: Duration, - - // tracking - frame_dt: Duration, - accumulator: Duration, - - // counters - pub frame_count: u64, - pub update_count: u64, -} - -pub struct TickPlan { - /// How many fixed updates to run this frame - pub updates: u32, - /// Interpolation factor for rendering between previous/next sim states - pub alpha: f32, - /// Measured last frame delta (seconds) - pub frame_dt: f32, - /// Fixed timestep (seconds) - pub fixed_dt: f32, -} - -impl Time { - pub fn new(cfg: Config) -> Self { - let now = Instant::now(); - let frame_interval = cfg.target_frame_hz.map(|hz| Duration::from_secs_f64(1.0 / hz)); - let fixed_dt = Duration::from_secs_f64(1.0 / cfg.target_update_hz); - Self { - cfg, - last_instant: now, - next_frame_due: now, - frame_interval, - fixed_dt, - frame_dt: Duration::ZERO, - accumulator: Duration::ZERO, - frame_count: 0, - update_count: 0, - } - } - - pub fn reconfigure(&mut self, cfg: Config) { - self.cfg = cfg.clone(); - self.frame_interval = cfg.target_frame_hz.map(|hz| Duration::from_secs_f64(1.0 / hz)); - self.fixed_dt = Duration::from_secs_f64(1.0 / cfg.target_update_hz); - } - - pub fn begin_frame_blocking(&mut self) -> TickPlan { - // 1) If there's a frame cap, block until next frame deadline - if let Some(interval) = self.frame_interval { - let mut now = Instant::now(); - if now < self.next_frame_due { - // Sleep most of the remainder, then spin the last tiny bit for precision - let total_remaining = self.next_frame_due - now; - if total_remaining > self.cfg.sleep_tolerance { - let sleep_for = total_remaining - self.cfg.sleep_tolerance; - thread::sleep(sleep_for); - } - // Short spin-wait for precision - while Instant::now() < self.next_frame_due { - std::hint::spin_loop(); - } - now = self.next_frame_due; - } - self.next_frame_due = self.next_frame_due + interval; - // In case we fell far behind (e.g., debugger pause), resync. - if self.next_frame_due < now { - self.next_frame_due = now + interval; - } - } - - // 2) Measure frame dt - let now = Instant::now(); - self.frame_dt = now.saturating_duration_since(self.last_instant); - self.last_instant = now; - self.frame_count += 1; - - // 3) Accumulate for fixed updates - self.accumulator += self.frame_dt; - - // Clamp accumulator to avoid doing a huge number of updates after a stall - let max_accumulated = self.fixed_dt * self.cfg.max_accumulated_steps; - if self.accumulator > max_accumulated { - self.accumulator = max_accumulated; - } - - // 4) Determine how many updates to run this frame - let mut updates = 0u32; - while self.accumulator >= self.fixed_dt && updates < self.cfg.max_updates_per_frame { - self.accumulator -= self.fixed_dt; - updates += 1; - self.update_count += 1; - } - - // 5) Compute interpolation factor for rendering (0..1) - let alpha = if self.fixed_dt.is_zero() { - 1.0 - } else { - (self.accumulator.as_secs_f32() / self.fixed_dt.as_secs_f32()).clamp(0.0, 1.0) - }; - - TickPlan { - updates, - alpha, - frame_dt: self.frame_dt.as_secs_f32(), - fixed_dt: self.fixed_dt.as_secs_f32(), - } - } - - pub fn frame_dt_seconds(&self) -> f32 { self.frame_dt.as_secs_f32() } - pub fn fixed_dt_seconds(&self) -> f32 { self.fixed_dt.as_secs_f32() } - pub fn alpha(&self) -> f32 { - if self.fixed_dt.is_zero() { 1.0 } else { (self.accumulator.as_secs_f32() / self.fixed_dt.as_secs_f32()).clamp(0.0, 1.0) } - } -} diff --git a/core/src/utils/managers.rs b/core/src/utils/managers.rs deleted file mode 100644 index aac2ce7..0000000 --- a/core/src/utils/managers.rs +++ /dev/null @@ -1,44 +0,0 @@ -/// Unused as of now. -#[macro_export] -macro_rules! create_manager { - ($manager_name:ident, $trait_name:ident) => { - pub struct $manager_name { - systems: ::indexmap::IndexMap<::std::any::TypeId, Box>, - } - - impl $manager_name { - pub fn new() -> Self { - Self { - systems: ::indexmap::IndexMap::default(), - } - } - - pub fn add(&mut self) { - self.systems - .insert(::std::any::TypeId::of::(), Box::new(S::default())); - } - - pub fn remove(&mut self) { - self.systems.shift_remove(&::std::any::TypeId::of::()); - } - - pub fn for_each_value(&self, mut f: F) - where - F: FnMut(&dyn $trait_name), - { - for value in self.systems.values() { - f(value.as_ref()); - } - } - - pub fn for_each_value_mut(&mut self, mut f: F) - where - F: FnMut(&mut dyn $trait_name), - { - for value in self.systems.values_mut() { - f(value.as_mut()); - } - } - } - }; -} diff --git a/core/src/utils/mod.rs b/core/src/utils/mod.rs deleted file mode 100644 index 4a5eaf5..0000000 --- a/core/src/utils/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod typemap; -mod managers; diff --git a/core/src/utils/typemap.rs b/core/src/utils/typemap.rs deleted file mode 100644 index c04c2c9..0000000 --- a/core/src/utils/typemap.rs +++ /dev/null @@ -1,544 +0,0 @@ -#[macro_export] -macro_rules! define_typemap { - ($name:ident, $($trait_bound:tt)*) => { - pub struct $name { - map: std::collections::HashMap>, - } - - impl $name { - pub fn new() -> Self { - Self { map: std::collections::HashMap::new() } - } - - pub fn insert(&mut self, value: T) -> Option> - where - T: std::any::Any + 'static + $($trait_bound)*, - { - let type_id = std::any::TypeId::of::(); - self.map.insert(type_id, Box::new(value)).and_then(|b| b.downcast().ok()) - } - - pub fn get(&self) -> Option<&T> - where - T: std::any::Any + 'static + $($trait_bound)*, - { - self.map.get(&std::any::TypeId::of::())?.downcast_ref::() - } - - pub fn get_mut(&mut self) -> Option<&mut T> - where - T: std::any::Any + 'static + $($trait_bound)*, - { - self.map.get_mut(&std::any::TypeId::of::())?.downcast_mut::() - } - - pub fn remove(&mut self) -> Option> - where - T: std::any::Any + 'static + $($trait_bound)*, - { - self.map.remove(&std::any::TypeId::of::())?.downcast().ok() - } - - pub fn len(&self) -> usize { self.map.len() } - pub fn is_empty(&self) -> bool { self.map.is_empty() } - pub fn clear(&mut self) { self.map.clear(); } - - pub fn contains(&self) -> bool - where - T: std::any::Any + 'static + $($trait_bound)*, - { - self.map.contains_key(&std::any::TypeId::of::()) - } - - // --- tuple-based multi-get API --- - pub fn get_many<'a, T>(&'a self) -> Option<::Output<'a>> - where - T: __tm_get::GetTuple, - { - ::get_from(&self.map) - } - - pub fn get_many_mut<'a, T>(&'a mut self) -> Option<::Output<'a>> - where - T: __tm_get::GetTupleMut, - { - ::get_from_mut(&mut self.map) - } - } - - impl Default for $name { fn default() -> Self { Self::new() } } - - // Put helper traits/impls in a private module to avoid name clashes. - mod __tm_get { - use std::any::{Any, TypeId}; - use std::collections::HashMap; - - pub trait GetTuple { - type Output<'a>; - fn get_from<'a>(map: &'a HashMap>) -> Option>; - } - - pub trait GetTupleMut { - type Output<'a>; - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option>; - } - - // Manual implementations for arities 1..=8. - impl GetTuple for (A,) - where - A: Any + 'static, - { - type Output<'a> = (&'a A,); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a,)) - } - } - - impl GetTupleMut for (A,) - where - A: Any + 'static, - { - type Output<'a> = (&'a mut A,); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - Some((a,)) - } - } - } - - impl GetTuple for (A, B) - where - A: Any + 'static, - B: Any + 'static, - { - type Output<'a> = (&'a A, &'a B); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::()]; - if ids[0] == ids[1] { return None; } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b)) - } - } - - impl GetTupleMut for (A, B) - where - A: Any + 'static, - B: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::()]; - if ids[0] == ids[1] { return None; } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - Some((a, b)) - } - } - } - - impl GetTuple for (A, B, C) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - { - type Output<'a> = (&'a A, &'a B, &'a C); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::()]; - if ids[0] == ids[1] || ids[0] == ids[2] || ids[1] == ids[2] { return None; } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - let c = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b, c)) - } - } - - impl GetTupleMut for (A, B, C) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B, &'a mut C); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::()]; - if ids[0] == ids[1] || ids[0] == ids[2] || ids[1] == ids[2] { return None; } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_c = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - let c = (&mut *ptr_c).downcast_mut::()?; - Some((a, b, c)) - } - } - } - - impl GetTuple for (A, B, C, D) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - { - type Output<'a> = (&'a A, &'a B, &'a C, &'a D); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - let c = map.get(&TypeId::of::())?.downcast_ref::()?; - let d = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b, c, d)) - } - } - - impl GetTupleMut for (A, B, C, D) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B, &'a mut C, &'a mut D); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_c = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_d = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - let c = (&mut *ptr_c).downcast_mut::()?; - let d = (&mut *ptr_d).downcast_mut::()?; - Some((a, b, c, d)) - } - } - } - - impl GetTuple for (A, B, C, D, E) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - { - type Output<'a> = (&'a A, &'a B, &'a C, &'a D, &'a E); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - let c = map.get(&TypeId::of::())?.downcast_ref::()?; - let d = map.get(&TypeId::of::())?.downcast_ref::()?; - let e = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b, c, d, e)) - } - } - - impl GetTupleMut for (A, B, C, D, E) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B, &'a mut C, &'a mut D, &'a mut E); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_c = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_d = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_e = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - let c = (&mut *ptr_c).downcast_mut::()?; - let d = (&mut *ptr_d).downcast_mut::()?; - let e = (&mut *ptr_e).downcast_mut::()?; - Some((a, b, c, d, e)) - } - } - } - - impl GetTuple for (A, B, C, D, E, F) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - F: Any + 'static, - { - type Output<'a> = (&'a A, &'a B, &'a C, &'a D, &'a E, &'a F); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - let c = map.get(&TypeId::of::())?.downcast_ref::()?; - let d = map.get(&TypeId::of::())?.downcast_ref::()?; - let e = map.get(&TypeId::of::())?.downcast_ref::()?; - let f = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b, c, d, e, f)) - } - } - - impl GetTupleMut for (A, B, C, D, E, F) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - F: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B, &'a mut C, &'a mut D, &'a mut E, &'a mut F); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_c = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_d = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_e = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_f = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - let c = (&mut *ptr_c).downcast_mut::()?; - let d = (&mut *ptr_d).downcast_mut::()?; - let e = (&mut *ptr_e).downcast_mut::()?; - let f = (&mut *ptr_f).downcast_mut::()?; - Some((a, b, c, d, e, f)) - } - } - } - - impl GetTuple for (A, B, C, D, E, F, G) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - F: Any + 'static, - G: Any + 'static, - { - type Output<'a> = (&'a A, &'a B, &'a C, &'a D, &'a E, &'a F, &'a G); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - let c = map.get(&TypeId::of::())?.downcast_ref::()?; - let d = map.get(&TypeId::of::())?.downcast_ref::()?; - let e = map.get(&TypeId::of::())?.downcast_ref::()?; - let f = map.get(&TypeId::of::())?.downcast_ref::()?; - let g = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b, c, d, e, f, g)) - } - } - - impl GetTupleMut for (A, B, C, D, E, F, G) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - F: Any + 'static, - G: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B, &'a mut C, &'a mut D, &'a mut E, &'a mut F, &'a mut G); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_c = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_d = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_e = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_f = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_g = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - let c = (&mut *ptr_c).downcast_mut::()?; - let d = (&mut *ptr_d).downcast_mut::()?; - let e = (&mut *ptr_e).downcast_mut::()?; - let f = (&mut *ptr_f).downcast_mut::()?; - let g = (&mut *ptr_g).downcast_mut::()?; - Some((a, b, c, d, e, f, g)) - } - } - } - - impl GetTuple for (A, B, C, D, E, F, G, H) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - F: Any + 'static, - G: Any + 'static, - H: Any + 'static, - { - type Output<'a> = (&'a A, &'a B, &'a C, &'a D, &'a E, &'a F, &'a G, &'a H); - fn get_from<'a>(map: &'a HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let a = map.get(&TypeId::of::())?.downcast_ref::()?; - let b = map.get(&TypeId::of::())?.downcast_ref::()?; - let c = map.get(&TypeId::of::())?.downcast_ref::()?; - let d = map.get(&TypeId::of::())?.downcast_ref::()?; - let e = map.get(&TypeId::of::())?.downcast_ref::()?; - let f = map.get(&TypeId::of::())?.downcast_ref::()?; - let g = map.get(&TypeId::of::())?.downcast_ref::()?; - let h = map.get(&TypeId::of::())?.downcast_ref::()?; - Some((a, b, c, d, e, f, g, h)) - } - } - - impl GetTupleMut for (A, B, C, D, E, F, G, H) - where - A: Any + 'static, - B: Any + 'static, - C: Any + 'static, - D: Any + 'static, - E: Any + 'static, - F: Any + 'static, - G: Any + 'static, - H: Any + 'static, - { - type Output<'a> = (&'a mut A, &'a mut B, &'a mut C, &'a mut D, &'a mut E, &'a mut F, &'a mut G, &'a mut H); - fn get_from_mut<'a>(map: &'a mut HashMap>) -> Option> { - let ids = [TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::(), TypeId::of::()]; - for i in 0..ids.len() { for j in (i+1)..ids.len() { if ids[i] == ids[j] { return None; } } } - let ptr_a = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_b = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_c = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_d = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_e = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_f = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_g = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - let ptr_h = { map.get_mut(&TypeId::of::()).map(|v| v.as_mut() as *mut dyn Any) }?; - unsafe { - let a = (&mut *ptr_a).downcast_mut::()?; - let b = (&mut *ptr_b).downcast_mut::()?; - let c = (&mut *ptr_c).downcast_mut::()?; - let d = (&mut *ptr_d).downcast_mut::()?; - let e = (&mut *ptr_e).downcast_mut::()?; - let f = (&mut *ptr_f).downcast_mut::()?; - let g = (&mut *ptr_g).downcast_mut::()?; - let h = (&mut *ptr_h).downcast_mut::()?; - Some((a, b, c, d, e, f, g, h)) - } - } - } - } - }; -} - -// pub struct TypeMap { -// map: HashMap>, -// } -// -// impl TypeMap { -// pub fn new() -> Self { -// Self { -// map: HashMap::new(), -// } -// } -// -// pub fn insert(&mut self, value: T) -> Option> { -// let type_id = TypeId::of::(); -// self.map -// .insert(type_id, Box::new(value)) -// .and_then(|boxed| boxed.downcast().ok()) -// } -// -// pub fn get(&self) -> Option<&T> -// where -// T: Any + 'static, -// { -// self.map.get(&TypeId::of::()) -// .and_then(|any| any.downcast_ref::()) -// } -// -// pub fn get_mut(&mut self) -> Option<&mut T> -// where -// T: Any + 'static, -// { -// self.map.get_mut(&TypeId::of::()).and_then(|any| any.downcast_mut::()) -// } -// -// pub fn remove(&mut self) -> Option> { -// unimplemented!() -// } -// } -// -// impl Default for TypeMap { -// fn default() -> Self { -// Self::new() -// } -// } - -#[cfg(test)] -mod tests { - use crate::define_typemap; - - define_typemap!(TestMap,); - - #[test] - fn get_test() { - let mut tm = TestMap::new(); - tm.insert::(42); - let v = tm.get::().expect("value should be present"); - assert_eq!(*v, 42); - } - - #[test] - fn get_many_test() { - let mut tm = TestMap::new(); - tm.insert::(1); - tm.insert::(-2); - tm.insert::(3.5); - - let (a, b, c) = tm - .get_many::<(u32, i32, f32)>() - .expect("all values should be present"); - assert_eq!((*a, *b, *c), (1, -2, 3.5)); - } - - #[test] - fn get_many_mut_test() { - let mut tm = TestMap::new(); - - tm.insert::(-2); - tm.insert::(1); - tm.insert::(3.5); - - let (a, b, c) = tm - .get_many_mut::<(i32, u32, f32)>() - .expect("all values should be present"); - *a = 4; - *b = 5; - *c = 6.5; - } -} diff --git a/ecs/Cargo.toml b/ecs/Cargo.toml deleted file mode 100644 index a47173d..0000000 --- a/ecs/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "raidillon_ecs" -version = "0.1.0" -edition = "2024" - -[dependencies] -glam = "0.30.5" -raidillon_assets = { path = "../asset" } -rapier3d = "0.30.1" diff --git a/ecs/src/components.rs b/ecs/src/components.rs deleted file mode 100644 index 3c20ec7..0000000 --- a/ecs/src/components.rs +++ /dev/null @@ -1,30 +0,0 @@ -use glam::{Vec3, Quat, Mat4}; -pub use raidillon_assets::ModelID; - -#[derive(Copy, Clone)] -pub struct Transform { - pub translation: Vec3, - pub rotation: Quat, - pub scale: Vec3, -} - -impl Transform { - pub fn matrix(&self) -> Mat4 { - Mat4::from_scale_rotation_translation(self.scale, self.rotation, self.translation) - } -} - -pub struct ModelHandle(pub ModelID); - -#[derive(Copy, Clone)] -pub struct RigidBodyComponent(pub rapier3d::dynamics::RigidBodyHandle); - -#[derive(Copy, Clone)] -pub struct CharacterBodyComponent(pub rapier3d::dynamics::RigidBodyHandle); - -#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)] -pub enum CameraMode { - #[default] - Kinematic, - Debug, -} diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs deleted file mode 100644 index d08fe80..0000000 --- a/ecs/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod components; - -pub use components::{Transform, ModelID}; diff --git a/engine/Cargo.toml b/engine/Cargo.toml deleted file mode 100644 index 1264629..0000000 --- a/engine/Cargo.toml +++ /dev/null @@ -1,15 +0,0 @@ -[package] -name = "raidillon_engine" -version = "0.1.0" -edition = "2024" - -[dependencies] -raidillon_assets = { path = "../asset" } -raidillon_core = { path = "../core" } -raidillon_platform = { path = "../platform" } -raidillon_ecs = { path = "../ecs" } -winit = "0.30.12" -hecs = "0.10.5" -indexmap = "2.10.0" -glam = "0.30.8" -egui = "0.33.2" \ No newline at end of file diff --git a/engine/src/engine.rs b/engine/src/engine.rs deleted file mode 100644 index ec9841f..0000000 --- a/engine/src/engine.rs +++ /dev/null @@ -1,88 +0,0 @@ -use std::cell::RefCell; -use std::rc::Rc; -use raidillon_core::scene::{Scene, SceneManager}; -use crate::system::{SystemContext, SystemManager}; -use raidillon_platform::PlatformContext; -use raidillon_core::{define_typemap}; -use raidillon_core::engine::EngineTrait; -use crate::input::InputState; -use crate::resources::EngineResources; - -pub struct Engine { - pub scene_manager: SceneManager, - pub system_manager: SystemManager, - pub resources: EngineResources, -} - -impl Engine { - fn load_default_resources(&mut self) { - let input = InputState::default(); - self.resources.insert(input); - } -} - -impl EngineTrait for Engine { - type PlatformCtx = PlatformContext; - fn new() -> Self { - let scene_manager = SceneManager::new(); - let system_manager = SystemManager::new(); - let mut s = Self { - scene_manager, - system_manager, - resources: EngineResources::new(), - }; - s.load_default_resources(); - s - } - - /// Initialize systems, load the world. - fn initialize(&mut self, platform_context: PlatformContext) { - // Engine Loading Stage 1: initialize systems - for system in self.system_manager.systems.values_mut() { - system.initialize(); - } - self.resources.insert(platform_context); - // Engine Loading Stage 2: load world - for system in self.system_manager.systems.values_mut() { - system.load_world(&mut self.resources, &mut self.scene_manager.current_mut()); - } - } - - /// Update the engine - fn frame_update(&mut self, platform_context: PlatformContext) { - self.resources.insert(platform_context); - - for system in self.system_manager.systems.values_mut() { - system.frame_update(&mut self.resources, &mut self.scene_manager.current_mut()); - } - } - - fn fixed_update(&mut self, platform_context: PlatformContext) { - self.resources.insert(platform_context); - for system in self.system_manager.systems.values_mut() { - system.fixed_update(&mut self.resources, &mut self.scene_manager.current_mut()); - } - } - - fn handle_event(&mut self, platform_context: PlatformContext) { - self.resources.get_mut::().unwrap().handle_event(&platform_context.current_event); - self.resources.insert(platform_context); - for system in self.system_manager.systems.values_mut() { - system.handle_event(&mut self.resources, &mut self.scene_manager.current_mut()); - } - } - - // pub fn build_system_context(&mut self) -> SystemContext { - // SystemContext { - // scene: self.scene_manager.current_mut(), - // } - // } - - fn current_scene_mut(&mut self) -> &mut Scene { - self.scene_manager.current_mut() - } - - fn current_scene(&self) -> &Scene { - self.scene_manager.current() - } -} diff --git a/engine/src/input.rs b/engine/src/input.rs deleted file mode 100644 index 27eb6fc..0000000 --- a/engine/src/input.rs +++ /dev/null @@ -1,69 +0,0 @@ -use std::collections::HashSet; -use winit::event::{ElementState, Event, MouseButton, WindowEvent}; -use winit::keyboard::{KeyCode, PhysicalKey}; - -/// A utility to help with buffering input. -/// Meant to be plugged into systems. -#[derive(Default, Clone, Debug)] -pub struct InputState { - held_keys: HashSet, - held_mouse: HashSet, -} - -impl InputState { - fn new() -> Self { - Default::default() - } - - pub fn handle_event(&mut self, event: &Event<()>) { - if let Event::WindowEvent { event, .. } = event { - match event { - // Keyboard - WindowEvent::KeyboardInput { event: key_event, .. } => { - if let PhysicalKey::Code(code) = key_event.physical_key { - match key_event.state { - ElementState::Pressed => { - self.held_keys.insert(code); - } - ElementState::Released => { - self.held_keys.remove(&code); - } - } - } - } - - // Mouse - WindowEvent::MouseInput { state, button, .. } => { - match state { - ElementState::Pressed => { - self.held_mouse.insert(*button); - } - ElementState::Released => { - self.held_mouse.remove(button); - } - } - } - - WindowEvent::Focused(focused) => { - if !*focused { - self.clear(); - } - } - _ => {} - } - } - } - - pub fn key_held(&self, code: KeyCode) -> bool { - self.held_keys.contains(&code) - } - - pub fn mouse_held(&self, button: MouseButton) -> bool { - self.held_mouse.contains(&button) - } - - pub fn clear(&mut self) { - self.held_keys.clear(); - self.held_mouse.clear(); - } -} diff --git a/engine/src/lib.rs b/engine/src/lib.rs deleted file mode 100644 index a7ad724..0000000 --- a/engine/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub mod engine; -pub mod system; -mod input; -pub mod systems; -mod resources; - -pub use crate::engine::Engine; -pub use crate::resources::EngineResources; -pub use input::InputState; diff --git a/engine/src/resources.rs b/engine/src/resources.rs deleted file mode 100644 index cd4be0b..0000000 --- a/engine/src/resources.rs +++ /dev/null @@ -1,3 +0,0 @@ -use raidillon_core::define_typemap; - -define_typemap!(EngineResources,); diff --git a/engine/src/system.rs b/engine/src/system.rs deleted file mode 100644 index 420da1b..0000000 --- a/engine/src/system.rs +++ /dev/null @@ -1,45 +0,0 @@ -use indexmap::IndexMap; -use raidillon_core::scene::Scene; -use raidillon_platform::PlatformContext; -use std::any::TypeId; -use std::cell::RefCell; -use std::rc::Rc; -use crate::input::InputState; -use crate::resources::EngineResources; - -pub struct SystemContext<'a> { - pub scene: &'a mut Scene, - pub platform_context: PlatformContext, - pub input_state: Rc>, -} - -pub trait System { - /// Initialize the system. - fn initialize(&mut self) {} - /// Spawn the first entities of the world. - fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) {} - fn handle_event(&mut self, res: &mut EngineResources, scene: &mut Scene) {} - fn fixed_update(&mut self, res: &mut EngineResources, scene: &mut Scene) {} - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) {} -} - -pub struct SystemManager { - pub systems: IndexMap>, -} - -impl SystemManager { - pub fn new() -> Self { - Self { - systems: IndexMap::default(), - } - } - - pub fn add(&mut self) { - self.systems - .insert(TypeId::of::(), Box::new(S::default())); - } - - pub fn remove(&mut self) { - self.systems.shift_remove(&TypeId::of::()); - } -} diff --git a/engine/src/systems/mod.rs b/engine/src/systems/mod.rs deleted file mode 100644 index e69de29..0000000 diff --git a/game/Cargo.toml b/game/Cargo.toml deleted file mode 100644 index 0a28217..0000000 --- a/game/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "raidillon_game" -version = "0.1.0" -edition = "2024" - -[dependencies] -raidillon_app = { path = "../app", features = ["glium"] } -glam = "0.30.5" -winit = "0.30.12" -rapier3d = "0.30.1" -hecs = "0.10.5" -egui = "0.33.2" diff --git a/game/src/main.rs b/game/src/main.rs deleted file mode 100644 index a619cb3..0000000 --- a/game/src/main.rs +++ /dev/null @@ -1,140 +0,0 @@ -use raidillon_app::prelude::*; - -mod systems; -use glam::{Quat, Vec3}; -use rapier3d::dynamics::{CoefficientCombineRule, RigidBodyType}; -use rapier3d::prelude::ColliderBuilder; -use winit::event::{Event, WindowEvent}; -use systems::debug_camera::FPSDebugCameraSystem; -use crate::systems::common::should_draw_menu; -use crate::systems::{ - DisplaySettings, KeybindsSystem, KinematicCharacterController, MenuSystem, PhysicsSystem, - PhysicsDebugSystem, -}; - -const TEST_GLTF: &str = "checkered-sphere.glb"; -const PLANE_GLTF: &str = "plane.glb"; -const MAIN_SCENE_ID: &str = "main_scene"; - -#[derive(Default)] -struct UpdateAspectRatioSystem; -impl System for UpdateAspectRatioSystem { - fn handle_event(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let pctx = res.get::().unwrap(); - - if let Event::WindowEvent { event: WindowEvent::Resized(sz), .. } = - pctx.current_event - { - scene.world - .query_mut::<&mut Camera>() - .into_iter() - .for_each(|(_, cam)| { - cam.aspect = sz.width as f32 / sz.height as f32; - }); - } - } -} - -#[derive(Default)] -struct MainSystem; - -impl System for MainSystem { - fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let pctx = res.get::().expect("PlatformContext missing").clone(); - let physics = scene.resources.get_mut::().expect("Physics missing"); - - // Spawn Sphere - { - let tr = Transform { - translation: Vec3::new(0.0, 5.0, 0.0), - rotation: Quat::IDENTITY, - scale: Vec3::new(1.0, 1.0, 1.0), - }; - let collider = ColliderBuilder::ball(1.0) - .restitution(0.7) - .restitution_combine_rule(CoefficientCombineRule::Max) - .build(); - let rb_handle = physics.add_rigid_body(RigidBodyType::Dynamic, tr, collider); - pctx.asset_manager.borrow_mut().load_gltf(TEST_GLTF, &model_path(TEST_GLTF)); - scene.world.spawn(( - tr, - ModelHandle(TEST_GLTF), - RigidBodyComponent(rb_handle), - )); - } - // Spawn Plane - { - let tr = Transform { - translation: Vec3::new(0.0, 0.0, 0.0), - rotation: Quat::IDENTITY, - scale: Vec3::new(10.0, 1.0, 10.0), - }; - let collider = ColliderBuilder::cuboid(10.0, 0.01, 10.0).build(); - let rb_handle = physics.add_rigid_body(RigidBodyType::Fixed, tr, collider); - pctx.asset_manager.borrow_mut().load_gltf(PLANE_GLTF, &model_path(PLANE_GLTF)); - scene.world.spawn(( - tr, - ModelHandle(PLANE_GLTF), - RigidBodyComponent(rb_handle), - )); - } - - scene.world.spawn((Camera { - eye: Vec3::new(0.0, 2.0, 3.0), - center: Vec3::ZERO, - up: Vec3::Y, - fovy: 60_f32.to_radians(), - aspect: pctx.frame_width / pctx.frame_height, - znear: 0.1, - zfar: 100.0}, - CameraMode::default(), - )); - } - - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let ( - pctx, - input, - ) = res.get_many_mut::<( - PlatformContext, - InputState, - )>().unwrap(); - - let mut egui_queue = pctx.egui_queue.borrow_mut(); - let time_ctx = pctx.time_ctx.clone(); - let mut character_pos = Vec3::ZERO; - for (_ent, (tr, ch_component)) in scene.world.query::<(&Transform, &CharacterBodyComponent)>().iter() { - character_pos = tr.translation; - } - egui_queue.queue(move |egui_ctx| { - // disable text selection on all labels. - egui_ctx.style_mut(|style| { - style.interaction.selectable_labels = false; - }); - - egui::Window::new("Debug").show(egui_ctx, |ui| { - ui.label("Hello World!"); - ui.label(format!("Frame Delta: {:.3}", time_ctx.frame_dt)); - ui.label(format!("Fixed Delta: {:.3}", time_ctx.fixed_dt)); - ui.label(format!("FPS: {:.3}", 1.0 / time_ctx.frame_dt)); - ui.label(format!("Character POS: {character_pos:.3}")); - }); - }); - } -} - -fn main() { - raidillon_app::App::new() - .add_system::() - .add_system::() - .add_system::() - .add_system::() - .add_system::() - .add_system::() - .add_system::() - .add_system::() - .add_system::() - .add_scene(MAIN_SCENE_ID, Scene::new(MAIN_SCENE_ID.to_owned(), None)) - .set_active_scene(MAIN_SCENE_ID) - .run("Raidillon".to_string(), 2560, 1080); -} diff --git a/game/src/systems/common.rs b/game/src/systems/common.rs deleted file mode 100644 index 8863f2e..0000000 --- a/game/src/systems/common.rs +++ /dev/null @@ -1,34 +0,0 @@ -use glam::Vec3; -use raidillon_app::prelude::*; -use crate::systems::menu::MenuState; - -pub fn is_camera_mode_valid(scene: &mut Scene, mode: CameraMode) -> bool { - let mut q = scene.world.query::<(&Camera, &CameraMode)>(); - let (cam_ent, (cam, cam_mode)) = q - .iter() - .next() - .unwrap(); - *cam_mode == mode -} - -pub fn is_mouse_look_enabled(scene: &mut Scene) -> bool { - let mut q = scene.world.query::<(&MenuState)>(); - let (_ent, mode) = q.iter().next().unwrap(); - *mode == MenuState::Closed -} - -pub fn camera_front(yaw: f32, pitch: f32) -> Vec3 { - let yaw_rad = yaw.to_radians(); - let pitch_rad = pitch.to_radians(); - Vec3::new( - yaw_rad.cos() * pitch_rad.cos(), - pitch_rad.sin(), - yaw_rad.sin() * pitch_rad.cos(), - ).normalize() -} - -pub fn should_draw_menu(scene: &mut Scene) -> bool { - let mut q = scene.world.query::<(&MenuState)>(); - let (_ent, mode) = q.iter().next().unwrap(); - *mode == MenuState::Open -} diff --git a/game/src/systems/debug_camera.rs b/game/src/systems/debug_camera.rs deleted file mode 100644 index b687e08..0000000 --- a/game/src/systems/debug_camera.rs +++ /dev/null @@ -1,89 +0,0 @@ -use glam::{Quat, Vec3}; -use winit::event::DeviceEvent::MouseMotion; -use winit::event::{ElementState, Event, MouseButton, WindowEvent}; -use winit::keyboard::{KeyCode, PhysicalKey}; -use winit::window::CursorGrabMode; -use raidillon_app::prelude::*; - -use crate::systems::common::{camera_front, is_camera_mode_valid, is_mouse_look_enabled}; -use crate::systems::menu::MenuState; - -pub struct FPSDebugCameraSystem { - mouse_delta: (f64, f64), - position: Vec3, - yaw: f32, - pitch: f32, - speed: f32, - sensitivity: f32, -} - -impl Default for FPSDebugCameraSystem { - fn default() -> Self { - Self { - mouse_delta: Default::default(), - position: Vec3::new(0.0, 0.0, 2.0), - yaw: -90.0, - pitch: 0.0, - speed: 8.0, - sensitivity: 0.1, - } - } -} - -impl System for FPSDebugCameraSystem { - fn handle_event(&mut self, res: &mut EngineResources, scene: &mut Scene) { - if !(is_camera_mode_valid(scene, CameraMode::Debug) && is_mouse_look_enabled(scene)) { - return - } - let pctx = res.get::().unwrap(); - let event2 = pctx.current_event.clone(); - match event2 { - Event::DeviceEvent { device_id, event} => { - match event { - MouseMotion { delta } => { - self.mouse_delta.0 += delta.0; - self.mouse_delta.1 += delta.1; - }, - _ => {} - } - }, - _ => {}, - } - } - - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let (pctx, input) = res.get_many::<(PlatformContext, InputState)>().unwrap(); - - if is_mouse_look_enabled(scene) { - self.yaw += self.mouse_delta.0 as f32 * self.sensitivity; - self.pitch -= self.mouse_delta.1 as f32 * self.sensitivity; - self.pitch = self.pitch.clamp(-89.0, 89.0); - } - - let front = camera_front(self.yaw, self.pitch); - let right_vec = front.cross(Vec3::Y).normalize(); - - if is_mouse_look_enabled(scene) { - if input.key_held(KeyCode::KeyW) { - self.position += front * pctx.time_ctx.frame_dt * self.speed; - } - if input.key_held(KeyCode::KeyS) { - self.position -= front * pctx.time_ctx.frame_dt * self.speed; - } - if input.key_held(KeyCode::KeyA) { - self.position -= right_vec * pctx.time_ctx.frame_dt * self.speed; - } - if input.key_held(KeyCode::KeyD) { - self.position += right_vec * pctx.time_ctx.frame_dt * self.speed; - } - } - - if is_camera_mode_valid(scene, CameraMode::Debug) { - scene.world.query_mut::<&mut Camera>().into_iter().for_each(|(_, camera)| { - camera.eye = self.position; - camera.center = self.position + front; - }); - } - self.mouse_delta = (0.0, 0.0); - } -} diff --git a/game/src/systems/display_settings.rs b/game/src/systems/display_settings.rs deleted file mode 100644 index 5d8455c..0000000 --- a/game/src/systems/display_settings.rs +++ /dev/null @@ -1,94 +0,0 @@ -use std::sync::{Arc, Mutex}; -use raidillon_app::prelude::*; -use crate::systems::common::should_draw_menu; - -#[derive(Clone, Copy, PartialEq, Eq)] -enum SettingsTab { - Display, -} - -impl Default for SettingsTab { - fn default() -> Self { - SettingsTab::Display - } -} - -#[derive(Clone, Default)] -struct DisplaySettingsUiState { - selected_fullscreen_mode: WindowMode, - active_tab: SettingsTab, -} - -#[derive(Default)] -pub struct DisplaySettings { - ui_state: Arc>, -} - -impl System for DisplaySettings { - fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let pctx = res.get_mut::().unwrap(); - - // sync the settings with UI state once - if let (Ok(settings_handle), Ok(mut state)) = (pctx.settings.read(), self.ui_state.lock()) { - state.selected_fullscreen_mode = settings_handle.display_settings.fullscreen_mode; - } - } - - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - if should_draw_menu(scene) { - let pctx = res.get_mut::().unwrap(); - let settings = pctx.settings.clone(); - let ui_state = self.ui_state.clone(); - - pctx.egui_queue.borrow_mut().queue(move |egui_ctx| { - egui::Window::new("Settings").default_open(false).show(egui_ctx, |ui| { - let mut state = ui_state.lock().unwrap(); - - ui.horizontal(|ui| { - ui.selectable_value(&mut state.active_tab, SettingsTab::Display, "Display Settings"); - }); - ui.separator(); - - match state.active_tab { - SettingsTab::Display => { - ui.label("Window Mode"); - egui::ComboBox::from_id_salt("window_mode") - .selected_text(window_mode_label(state.selected_fullscreen_mode)) - .show_ui(ui, |ui| { - for mode in [ - WindowMode::Windowed, - WindowMode::BorderlessFullscreen, - WindowMode::ExclusiveFullscreen, - ] { - ui.selectable_value( - &mut state.selected_fullscreen_mode, - mode, - window_mode_label(mode), - ); - } - }); - - ui.add_space(8.0); - ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { - if ui.button("Apply").clicked() { - if let Ok(mut settings_handle) = settings.write() { - settings_handle.display_settings.fullscreen_mode = state.selected_fullscreen_mode; - settings_handle.display_settings.dirty = true; - } - } - }); - } - } - }); - }); - } - } -} - -fn window_mode_label(mode: WindowMode) -> &'static str { - match mode { - WindowMode::Windowed => "Windowed", - WindowMode::BorderlessFullscreen => "Borderless Fullscreen", - WindowMode::ExclusiveFullscreen => "Exclusive Fullscreen", - } -} diff --git a/game/src/systems/keybinds.rs b/game/src/systems/keybinds.rs deleted file mode 100644 index 5519969..0000000 --- a/game/src/systems/keybinds.rs +++ /dev/null @@ -1,69 +0,0 @@ -use winit::keyboard::KeyCode; -use raidillon_app::prelude::*; - -use crate::systems::{common::should_draw_menu, menu::MenuState}; - -#[derive(Default)] -pub struct KeybindsSystem { - camera_toggle_held: bool, -} - -impl System for KeybindsSystem { - fn fixed_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let input = res.get::().unwrap(); - if input.key_held(KeyCode::F5) { - if self.camera_toggle_held { return } - self.toggle_camera_mode(scene); - self.camera_toggle_held = true; - } else { - self.camera_toggle_held = false; - } - } - - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - if should_draw_menu(scene) { - let pctx = res.get_mut::().unwrap(); - let mut q = scene.world.query::<(&Camera, &CameraMode)>(); - let (cam_ent, (cam, cam_mode)) = q - .iter() - .next() - .unwrap(); - let cam_mode_str = format!("Camera Mode: {:?}", cam_mode); - - let mut q = scene.world.query::<(&MenuState)>(); - let (_ent, menu_state) = q - .iter() - .next() - .unwrap(); - - let menu_state_str = format!("Menu State: {:?}", menu_state); - - pctx.egui_queue.borrow_mut().queue(move |egui_ctx| { - egui::Window::new("Camera").show(egui_ctx, |ui| { - ui.label("F5 to switch camera"); - ui.label(cam_mode_str); - ui.label(menu_state_str) - }); - }); - } - } -} - -impl KeybindsSystem { - fn toggle_camera_mode(&mut self, scene: &mut Scene) { - let q = scene.world.query_mut::<(&mut Camera, &mut CameraMode)>(); - let (cam_ent, (cam, cam_mode)) = q - .into_iter() - .next() - .unwrap(); - - match *cam_mode { - CameraMode::Kinematic => { - *cam_mode = CameraMode::Debug; - } - CameraMode::Debug => { - *cam_mode = CameraMode::Kinematic; - } - } - } -} diff --git a/game/src/systems/kinematic_character_controller.rs b/game/src/systems/kinematic_character_controller.rs deleted file mode 100644 index b27450a..0000000 --- a/game/src/systems/kinematic_character_controller.rs +++ /dev/null @@ -1,187 +0,0 @@ -use glam::{Quat, Vec3}; -use rapier3d::prelude::{nalgebra, ColliderBuilder, QueryFilter, RigidBodyBuilder, RigidBodyType}; -use rapier3d::prelude::vector; -use rapier3d::control::{CharacterCollision, KinematicCharacterController as RapierKinematicCharacterController}; -use rapier3d::na::{Isometry3, Vector3}; -use winit::event::DeviceEvent::MouseMotion; -use winit::event::Event; -use winit::keyboard::KeyCode; -use raidillon_app::prelude::*; - -use crate::systems::common::{camera_front, is_camera_mode_valid, is_mouse_look_enabled}; -use crate::systems::menu::MenuState; - -#[derive(Default)] -pub struct KinematicCharacterController { - character_controller: RapierKinematicCharacterController, - character_collider: ColliderBuilder, - - desired_movement: Vec3, - last_position: Vector3, - yaw: f32, - pitch: f32, - speed: f32, - sensitivity: f32, - mouse_delta: (f64, f64), - - vertical_velocity: f32, - gravity: f32, - max_fall_speed: f32, -} - -impl System for KinematicCharacterController { - fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) { - // create the rigid body, add it to the body set - let p = scene.resources.get_mut::().expect("Physics missing"); - let rb = RigidBodyBuilder::kinematic_position_based().build(); - let rb_handle = p.rigid_body_set.insert(rb); - self.character_collider = ColliderBuilder::capsule_y(1.0, 1.0); - p.collider_set.insert_with_parent(self.character_collider.build(), rb_handle, &mut p.rigid_body_set); - let tr = Transform { - translation: Vec3::new(0.0, 2.0, 3.0), - rotation: Quat::IDENTITY, - scale: Vec3::new(1.0, 1.0, 1.0), - }; - self.last_position = vector![ - tr.translation.x, - tr.translation.y, - tr.translation.z, - ]; - scene.world.spawn(( - tr, - CharacterBodyComponent(rb_handle), - )); - - self.speed = 5.0; - self.sensitivity = 0.05; - self.gravity = -9.81; - self.max_fall_speed = -50.0; - self.vertical_velocity = 0.0; - } - - fn handle_event(&mut self, res: &mut EngineResources, scene: &mut Scene) { - if !is_camera_mode_valid(scene, CameraMode::Kinematic) { - return - } - - let pctx = res.get::().unwrap(); - let event2 = pctx.current_event.clone(); - match event2 { - Event::DeviceEvent { device_id, event } => { - match event { - MouseMotion { delta } => { - self.mouse_delta.0 += delta.0; - self.mouse_delta.1 += delta.1; - }, - _ => {} - } - }, - _ => {}, - } - } - - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let front = camera_front(self.yaw, self.pitch); - let right_vec = front.cross(Vec3::Y).normalize(); - - if is_camera_mode_valid(scene, CameraMode::Kinematic) && is_mouse_look_enabled(scene) { - let (pctx, input) = res.get_many::<(PlatformContext, InputState)>().unwrap(); - - self.yaw += (self.mouse_delta.0 as f32) * self.sensitivity; - self.pitch -= (self.mouse_delta.1 as f32) * self.sensitivity; - self.pitch = self.pitch.clamp(-89.0, 89.0); - - if input.key_held(KeyCode::KeyW) { - self.desired_movement += front * pctx.time_ctx.frame_dt * self.speed; - } - if input.key_held(KeyCode::KeyS) { - self.desired_movement -= front * pctx.time_ctx.frame_dt * self.speed; - } - if input.key_held(KeyCode::KeyA) { - self.desired_movement -= right_vec * pctx.time_ctx.frame_dt * self.speed; - } - if input.key_held(KeyCode::KeyD) { - self.desired_movement += right_vec * pctx.time_ctx.frame_dt * self.speed; - } - } - - if is_camera_mode_valid(scene, CameraMode::Kinematic) { - let pos = Physics::rapier_translation_to_glam(&self.last_position); - - scene.world.query_mut::<&mut Camera>().into_iter().for_each(|(_, camera)| { - // INTERPOLATION NEEDED. - camera.eye = pos; - camera.center = pos + front; - }); - } - - self.mouse_delta = (0.0, 0.0); - } - - fn fixed_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let p = scene.resources.get_mut::().unwrap(); - let (pctx, input) = res.get_many::<(PlatformContext, InputState)>().unwrap(); - - let (ch_ent, (ch_tr, ch_component)) = scene - .world - .query_mut::<(&mut Transform, &mut CharacterBodyComponent)>() - .into_iter() - .next() - .expect("no character entity in world"); - - let query_pipeline = p.broad_phase.as_query_pipeline( - p.narrow_phase.query_dispatcher(), - &p.rigid_body_set, - &p.collider_set, - QueryFilter::default().exclude_rigid_body(ch_component.0), - ); - - self.vertical_velocity = (self.vertical_velocity + self.gravity * pctx.time_ctx.fixed_dt) - .max(self.max_fall_speed); - let mut total_displacement = self.desired_movement; - total_displacement.y += self.vertical_velocity * pctx.time_ctx.fixed_dt; - - let mut collisions: Vec = Vec::new(); - let corrected_movement = self.character_controller.move_shape( - pctx.time_ctx.fixed_dt, - &query_pipeline, - &*self.character_collider.shape, - &Isometry3::from(self.last_position), - vector![total_displacement.x, total_displacement.y, total_displacement.z], - |collision| collisions.push(collision), - ); - - // update character rigid body with the new translation. - if let Some(body) = p.get_rigid_body_mut(ch_component.0) { - self.last_position = vector![ - self.last_position.x + corrected_movement.translation.x, - self.last_position.y + corrected_movement.translation.y, - self.last_position.z + corrected_movement.translation.z, - ]; - body.set_next_kinematic_position(Isometry3::from(self.last_position)); - ch_tr.translation = Physics::rapier_translation_to_glam(&self.last_position); - // reset vertical velocity if grounded - if corrected_movement.grounded { - self.vertical_velocity = 0.0; - } - } - - // apply impulses to dynamic bodies the character collided with - let character_push_force = 50.0; - for collision in collisions { - if let Some(collider) = p.collider_set.get(collision.handle) { - if let Some(rb_handle) = collider.parent() { - if let Some(rb) = p.rigid_body_set.get_mut(rb_handle) { - if rb.body_type() == RigidBodyType::Dynamic { - let push_direction = -collision.hit.normal1.into_inner(); - let impulse = push_direction * character_push_force * pctx.time_ctx.fixed_dt; - rb.apply_impulse(impulse, true); - } - } - } - } - } - - self.desired_movement = Vec3::ZERO; - } -} diff --git a/game/src/systems/menu.rs b/game/src/systems/menu.rs deleted file mode 100644 index 8a4b0d5..0000000 --- a/game/src/systems/menu.rs +++ /dev/null @@ -1,85 +0,0 @@ -use egui::Id; -use raidillon_app::prelude::*; -use winit::{dpi::{LogicalPosition, Position}, keyboard::KeyCode, window::CursorGrabMode}; - -#[derive(Default)] -pub struct MenuSystem { - escape_key_held: bool, - /// Unoptimal solution to fix windows event delay - times_ran_initial_win_event: u32, -} - -#[derive(Default, Eq, PartialEq, Debug)] -pub enum MenuState { - Open, - #[default] - Closed, -} - -impl System for MenuSystem { - fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) { - scene.world.spawn((MenuState::Closed,)); - } - - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - // Windows won't register some events in the first miliseconds after initialization - if self.times_ran_initial_win_event < 20 { - let window = res.get::().unwrap().window.lock().unwrap(); - window.set_cursor_grab(CursorGrabMode::Confined).or_else(|_| window.set_cursor_grab(CursorGrabMode::Locked)); - window.set_cursor_visible(false); - self.times_ran_initial_win_event += 1 - } - - let mut egui_queue = res.get::().unwrap().egui_queue.borrow_mut(); - egui_queue.queue(|egui_ctx| { - egui::Area::new(Id::new("esc to pause")) - .anchor(egui::Align2::RIGHT_TOP, [-10.0, 10.0]) - .show(egui_ctx, |ui| { - ui.label( - egui::RichText::new("ESC to pause").size(24.0).color(egui::Color32::BLACK) - ); - }); - }); - } - - - fn handle_event(&mut self, res: &mut EngineResources, scene: &mut Scene) { - // The menu is toggled by pressing the escape key - let input = res.get::().unwrap(); - if input.key_held(KeyCode::Escape) { - if self.escape_key_held { return } - self.toggle_menu(res, scene); - self.escape_key_held = true; - } else { - self.escape_key_held = false; - } - } -} - -impl MenuSystem { - fn toggle_menu(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let q = scene.world.query_mut::<(&mut MenuState)>(); - let (menu_ent, menu_state) = q - .into_iter() - .next() - .unwrap(); - - let pctx = res.get::().unwrap(); - let window = pctx.window.lock().unwrap(); - - match *menu_state { - MenuState::Open => { - *menu_state = MenuState::Closed; - window.set_cursor_grab(CursorGrabMode::Confined).or_else(|_| window.set_cursor_grab(CursorGrabMode::Locked)); - window.set_cursor_visible(false); - pctx.should_egui_receive_input_events.set(false); - }, - MenuState::Closed => { - *menu_state = MenuState::Open; - window.set_cursor_grab(CursorGrabMode::None); - window.set_cursor_visible(true); - pctx.should_egui_receive_input_events.set(true); - }, - } - } -} diff --git a/game/src/systems/mod.rs b/game/src/systems/mod.rs deleted file mode 100644 index 08c54ab..0000000 --- a/game/src/systems/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -mod physics; -mod physics_debug; -mod kinematic_character_controller; -mod keybinds; -mod menu; -pub mod debug_camera; -pub mod common; -mod display_settings; - -pub use physics::PhysicsSystem; -pub use physics_debug::PhysicsDebugSystem; -pub use kinematic_character_controller::KinematicCharacterController; -pub use keybinds::KeybindsSystem; -pub use menu::MenuSystem; -pub use display_settings::DisplaySettings; diff --git a/game/src/systems/physics.rs b/game/src/systems/physics.rs deleted file mode 100644 index f660526..0000000 --- a/game/src/systems/physics.rs +++ /dev/null @@ -1,30 +0,0 @@ -use raidillon_app::prelude::*; - -/// Do physics calculations and apply to world. -#[derive(Default)] -pub struct PhysicsSystem; - -impl System for PhysicsSystem { - fn load_world(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let p = Physics::default(); - scene.resources.insert(p); - } - - fn fixed_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let pctx = res.get::().expect("PlatformContext missing").clone(); - let physics = scene.resources.get_mut::().expect("Physics missing"); - physics.step(pctx.time_ctx.fixed_dt); - - // apply calculations to dynamic bodies - let mut query = scene.world.query::<(&mut Transform, &RigidBodyComponent)>(); - for (_ent, (tr, rb_component)) in query.iter() { - if let Some(body) = physics.get_rigid_body(rb_component.0) { - let pos = body.position(); - let translation = Physics::rapier_translation_to_glam(&pos.translation.vector); - let rotation = Physics::rapier_rotation_to_glam(&pos.rotation); - tr.translation = translation; - tr.rotation = rotation; - } - } - } -} diff --git a/game/src/systems/physics_debug.rs b/game/src/systems/physics_debug.rs deleted file mode 100644 index 33364d2..0000000 --- a/game/src/systems/physics_debug.rs +++ /dev/null @@ -1,35 +0,0 @@ -use raidillon_app::prelude::*; - -/// renders aabb wireframes for all physics colliders -#[derive(Default)] -pub struct PhysicsDebugSystem; - -impl System for PhysicsDebugSystem { - fn frame_update(&mut self, res: &mut EngineResources, scene: &mut Scene) { - let pctx = res.get::().expect("PlatformContext missing").clone(); - - let mut debug_wireframes = pctx.debug_wireframes.borrow_mut(); - if !debug_wireframes.enabled { - return; - } - - let physics = match scene.resources.get::() { - Some(p) => p, - None => return, - }; - - let color = [1.0, 0.0, 0.0, 1.0]; - - for (_, collider) in physics.collider_set.iter() { - let aabb = collider.compute_aabb(); - let min = aabb.mins; - let max = aabb.maxs; - - debug_wireframes.add_box( - [min.x, min.y, min.z], - [max.x, max.y, max.z], - color, - ); - } - } -} diff --git a/glium_platform/Cargo.lock b/glium_platform/Cargo.lock deleted file mode 100644 index 4606b6a..0000000 --- a/glium_platform/Cargo.lock +++ /dev/null @@ -1,2242 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ab_glyph" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "android-activity" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" -dependencies = [ - "android-properties", - "bitflags 2.9.1", - "cc", - "cesu8", - "jni", - "jni-sys", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "num_enum", - "thiserror", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "backtrace" -version = "0.3.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytemuck" -version = "1.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "byteorder-lite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.9.1", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cc" -version = "1.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "cgl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "cursor-icon" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", -] - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "fdeflate" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "flate2" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "gl_generator" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[package]] -name = "glam" -version = "0.30.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d1aab06663bdce00d6ca5e5ed586ec8d18033a771906c993a1e3755b368d85" - -[[package]] -name = "glium" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a3028d1f135b5395e6e4336916b424bc5dd2b38c6e378ce2704e4b8f4a617ed" -dependencies = [ - "backtrace", - "fnv", - "gl_generator", - "glutin", - "glutin-winit", - "memoffset", - "raw-window-handle", - "smallvec", - "winit", -] - -[[package]] -name = "gltf" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ce1918195723ce6ac74e80542c5a96a40c2b26162c1957a5cd70799b8cacf7" -dependencies = [ - "base64", - "byteorder", - "gltf-json", - "image", - "lazy_static", - "serde_json", - "urlencoding", -] - -[[package]] -name = "gltf-derive" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14070e711538afba5d6c807edb74bcb84e5dbb9211a3bf5dea0dfab5b24f4c51" -dependencies = [ - "inflections", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "gltf-json" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6176f9d60a7eab0a877e8e96548605dedbde9190a7ae1e80bbcc1c9af03ab14" -dependencies = [ - "gltf-derive", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "glutin" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" -dependencies = [ - "bitflags 2.9.1", - "cfg_aliases", - "cgl", - "dispatch2", - "glutin_egl_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "libloading", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "once_cell", - "raw-window-handle", - "wayland-sys", - "windows-sys 0.52.0", - "x11-dl", -] - -[[package]] -name = "glutin-winit" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" -dependencies = [ - "cfg_aliases", - "glutin", - "raw-window-handle", - "winit", -] - -[[package]] -name = "glutin_egl_sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" -dependencies = [ - "gl_generator", - "windows-sys 0.52.0", -] - -[[package]] -name = "glutin_glx_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" -dependencies = [ - "gl_generator", - "x11-dl", -] - -[[package]] -name = "glutin_wgl_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" -dependencies = [ - "gl_generator", -] - -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "image" -version = "0.25.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" -dependencies = [ - "bytemuck", - "byteorder-lite", - "num-traits", - "png", - "zune-core", - "zune-jpeg", -] - -[[package]] -name = "indexmap" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "inflections" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "khronos_api" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.3", -] - -[[package]] -name = "libredox" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" -dependencies = [ - "bitflags 2.9.1", - "libc", - "redox_syscall 0.5.17", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "memmap2" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.9.1", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.9.1", - "block2", - "libc", - "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation 0.2.2", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" -dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" -dependencies = [ - "bitflags 2.9.1", - "dispatch2", - "objc2 0.6.1", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-core-location" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.9.1", - "block2", - "dispatch", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" -dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-link-presentation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.2.2", - "objc2-link-presentation", - "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "orbclient" -version = "0.3.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" -dependencies = [ - "libredox", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "png" -version = "0.17.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "polling" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee9b2fa7a4517d2c91ff5bc6c297a427a96749d15f98fcdbb22c05571a4d4b7" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "raidillon_core" -version = "0.1.0" - -[[package]] -name = "raidillon_glium" -version = "0.1.0" -dependencies = [ - "anyhow", - "glam", - "glium", - "gltf", - "raidillon_core", - "raidillon_platform", - "winit", -] - -[[package]] -name = "raidillon_platform" -version = "0.1.0" -dependencies = [ - "winit", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", -] - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "sctk-adwaita" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.142" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "slab" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.9.1", - "calloop", - "calloop-wayland-source", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.44", - "thiserror", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.0.8", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.9.1", - "rustix 1.0.8", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.9.1", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" -dependencies = [ - "rustix 1.0.8", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.3", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winit" -version = "0.30.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" -dependencies = [ - "ahash", - "android-activity", - "atomic-waker", - "bitflags 2.9.1", - "block2", - "bytemuck", - "calloop", - "cfg_aliases", - "concurrent-queue", - "core-foundation", - "core-graphics", - "cursor-icon", - "dpi", - "js-sys", - "libc", - "memmap2", - "ndk", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "orbclient", - "percent-encoding", - "pin-project", - "raw-window-handle", - "redox_syscall 0.4.1", - "rustix 0.38.44", - "sctk-adwaita", - "smithay-client-toolkit", - "smol_str", - "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time", - "windows-sys 0.52.0", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - -[[package]] -name = "winnow" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix 0.38.44", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.9.1", - "dlib", - "log", - "once_cell", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "xml-rs" -version = "0.8.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - -[[package]] -name = "zune-jpeg" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" -dependencies = [ - "zune-core", -] diff --git a/glium_platform/Cargo.toml b/glium_platform/Cargo.toml deleted file mode 100644 index 109fc57..0000000 --- a/glium_platform/Cargo.toml +++ /dev/null @@ -1,21 +0,0 @@ -[package] -name = "raidillon_glium" -version = "0.1.0" -edition = "2024" - -[dependencies] -anyhow = "1.0.98" -glam = "0.30.5" -glium = { version = "0.36.0", features = ["glutin_backend", "simple_window_builder"] } -gltf = { version = "1.4.1", features = ["import", "utils", "KHR_texture_transform"] } -raidillon_platform = { path = "../platform" } -raidillon_core = { path = "../core" } -raidillon_assets = { path = "../asset" } -raidillon_ecs = { path = "../ecs" } -raidillon_engine = { path = "../engine" } -winit = "0.30.12" -indexmap = "2.10.0" -exr = "1.73.0" -image = { version = "0.25.8", default-features = false, features = ["exr"] } -egui = "0.33.2" -egui_glium = { version = "0.31.1", git = "https://github.com/reo6/egui_glium.git" } diff --git a/glium_platform/src/assets.rs b/glium_platform/src/assets.rs deleted file mode 100644 index c8cb1d4..0000000 --- a/glium_platform/src/assets.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::any::Any; -use std::cell::RefCell; -use raidillon_assets::{ModelManagerRef, ModelManager}; -use crate::model::Model; -use std::path::{Path, PathBuf}; -use crate::gltf_loader::load_gltf; -use glium::backend::Facade; -use std::collections::HashMap; -use std::collections::hash_map::Entry; -use std::rc::Rc; -use raidillon_assets::model_manager::ModelID; - -/// Glium platform asset manager implementation. -pub struct GliumAssetManager { - pub models: HashMap>, - facade: Box, -} - -impl GliumAssetManager { - pub fn new(facade: Box) -> Self { - let models = HashMap::new(); - Self { - models, - facade, - } - } -} - -impl ModelManager for GliumAssetManager { - fn load_gltf(&mut self, id: ModelID, path: &Path) { - let models = load_gltf(path, self.facade.as_ref()).unwrap(); - self.models.insert(id, models); - } - - fn unload_model(&mut self, id: ModelID) { - self.models.remove(&id); - } - - // fn get_model(&mut self, path: &Path) -> &Self::Model { - // let path_buf = path.to_path_buf(); - // match self.models.entry(path_buf) { - // Entry::Occupied(entry) => entry.into_mut(), - // Entry::Vacant(entry) => { - // let model = load_gltf(path, self.facade.as_ref()).unwrap(); - // entry.insert(model) - // } - // } - // } - - fn get_model(&self, id: &ModelID) -> Option<&dyn Any> { - self.models.get(id).map(|models| models as &dyn Any) - } -} diff --git a/glium_platform/src/gltf_loader.rs b/glium_platform/src/gltf_loader.rs deleted file mode 100644 index fe4ec37..0000000 --- a/glium_platform/src/gltf_loader.rs +++ /dev/null @@ -1,183 +0,0 @@ -use anyhow::{bail, Context, Result}; -use glium::{backend::Facade, IndexBuffer, VertexBuffer}; -use glium::index::PrimitiveType; -use std::{fmt::Debug, path::Path}; -use crate::model::{Vertex, Mesh, Material, Model}; -use glium::texture::{RawImage2d, Texture2d, SrgbTexture2d}; -use glium::uniforms::{SamplerWrapFunction, MinifySamplerFilter, MagnifySamplerFilter}; -use gltf::image::Format as GltfFormat; -use glam::Vec2; - -/// Load a glTF 2.0 file from disk and upload all primitives to the GPU. -/// -/// Returns one [`Model`] per glTF primitive (across all meshes). -pub fn load_gltf

(path: P, facade: &dyn Facade) -> Result> -where - P: AsRef + Debug, -{ - // -- parse the asset & bring buffer blobs into memory -- - let (doc, buffers, images) = gltf::import(path.as_ref()).context("failed to import glTF file")?; - - // Helper to update sampler settings from glTF sampler - fn update_sampler(mat: &mut Material, t: &gltf::texture::Texture<'_>) { - let sampler_info = t.sampler(); - mat.sampler.wrap_function.0 = match sampler_info.wrap_s() { - gltf::texture::WrappingMode::ClampToEdge => SamplerWrapFunction::Clamp, - gltf::texture::WrappingMode::MirroredRepeat => SamplerWrapFunction::Mirror, - gltf::texture::WrappingMode::Repeat => SamplerWrapFunction::Repeat, - }; - mat.sampler.wrap_function.1 = match sampler_info.wrap_t() { - gltf::texture::WrappingMode::ClampToEdge => SamplerWrapFunction::Clamp, - gltf::texture::WrappingMode::MirroredRepeat => SamplerWrapFunction::Mirror, - gltf::texture::WrappingMode::Repeat => SamplerWrapFunction::Repeat, - }; - if let Some(f) = sampler_info.mag_filter() { - mat.sampler.magnify_filter = match f { - gltf::texture::MagFilter::Nearest => MagnifySamplerFilter::Nearest, - gltf::texture::MagFilter::Linear => MagnifySamplerFilter::Linear, - }; - } - if let Some(f) = sampler_info.min_filter() { - mat.sampler.minify_filter = match f { - gltf::texture::MinFilter::Nearest => MinifySamplerFilter::Nearest, - gltf::texture::MinFilter::Linear => MinifySamplerFilter::Linear, - gltf::texture::MinFilter::NearestMipmapNearest => MinifySamplerFilter::NearestMipmapNearest, - gltf::texture::MinFilter::NearestMipmapLinear => MinifySamplerFilter::NearestMipmapLinear, - gltf::texture::MinFilter::LinearMipmapNearest => MinifySamplerFilter::LinearMipmapNearest, - gltf::texture::MinFilter::LinearMipmapLinear => MinifySamplerFilter::LinearMipmapLinear, - }; - } - } - - let mut out: Vec = Vec::new(); - - for mesh in doc.meshes() { - for primitive in mesh.primitives() { - // ---------- MATERIAL ---------- - let mut mat = Material::default(); - let material = primitive.material(); - let pbr = material.pbr_metallic_roughness(); - - // Factors -------------------------------------------------- - mat.base_color_factor = pbr.base_color_factor(); - mat.metal_factor = pbr.metallic_factor(); - mat.roughness_factor = pbr.roughness_factor(); - mat.emissive_factor = material.emissive_factor(); - - // Base-color texture (sRGB) - if let Some(info) = pbr.base_color_texture() { - update_sampler(&mut mat, &info.texture()); - let view = info.texture().source().index(); - mat.base_color = Some(glium_srgb_texture(facade, &images[view])?); - } - - // Metallic-Roughness (linear) - if let Some(info) = pbr.metallic_roughness_texture() { - update_sampler(&mut mat, &info.texture()); - let view = info.texture().source().index(); - mat.metallic_roughness = Some(glium_linear_texture(facade, &images[view])?); - } - - // Normal map (linear) - if let Some(info) = material.normal_texture() { - update_sampler(&mut mat, &info.texture()); - let view = info.texture().source().index(); - mat.normal = Some(glium_linear_texture(facade, &images[view])?); - } - - // Occlusion (linear) - if let Some(info) = material.occlusion_texture() { - update_sampler(&mut mat, &info.texture()); - let view = info.texture().source().index(); - mat.occlusion = Some(glium_linear_texture(facade, &images[view])?); - } - - // Emissive (sRGB) - if let Some(info) = material.emissive_texture() { - update_sampler(&mut mat, &info.texture()); - let view = info.texture().source().index(); - mat.emissive = Some(glium_srgb_texture(facade, &images[view])?); - } - - // KHR_texture_transform (base color only, for now) - if let Some(tex) = pbr.base_color_texture() { - if let Some(xform) = tex.texture_transform() { - mat.uv_offset = Vec2::new(xform.offset()[0], xform.offset()[1]); - mat.uv_scale = Vec2::new(xform.scale()[0], xform.scale()[1]); - } - } - - // ---- Vertex/index data ---- - let reader = primitive.reader(|buf| Some(&buffers[buf.index()].0)); - - let positions: Vec<[f32; 3]> = reader.read_positions().context("missing POSITION")?.collect(); - let normals: Vec<[f32; 3]> = reader.read_normals().context("missing NORMAL")?.collect(); - let tex_coords: Vec<[f32; 2]> = reader - .read_tex_coords(0) - .map(|tc| tc.into_f32().collect()) - .unwrap_or_else(|| vec![[0.0, 0.0]; positions.len()]); - let indices: Vec = reader.read_indices().context("missing indices")?.into_u32().collect(); - - // Interleave - let vertices: Vec = (0..positions.len()) - .map(|i| Vertex { position: positions[i], normal: normals[i], tex_coords: tex_coords[i] }) - .collect(); - - let vbuf = VertexBuffer::immutable(facade, &vertices)?; - let ibuf = IndexBuffer::immutable(facade, PrimitiveType::TrianglesList, &indices)?; - - out.push(Model { mesh: Mesh { vbuf, ibuf }, material: mat }); - } - } - - if out.is_empty() { - bail!("glTF has no mesh primitives"); - } - - Ok(out) -} - -/// Linear-space texture (RGBA8) from glTF image data. -fn glium_linear_texture(facade: &dyn Facade, img: &gltf::image::Data) -> Result -{ - let rgba = to_rgba(img); - let raw = RawImage2d::from_raw_rgba(rgba, (img.width, img.height)); - Ok(Texture2d::new(facade, raw)?) -} - -/// sRGB texture from glTF image data. -fn glium_srgb_texture(facade: &dyn Facade, img: &gltf::image::Data) -> Result -{ - let rgba = to_rgba(img); - let raw = RawImage2d::from_raw_rgba(rgba, (img.width, img.height)); - Ok(SrgbTexture2d::new(facade, raw)?) -} - -/// Convert various glTF image formats to RGBA8 as expected by glium. -fn to_rgba(img: &gltf::image::Data) -> Vec { - match img.format { - GltfFormat::R8G8B8A8 => img.pixels.clone(), - GltfFormat::R8G8B8 => { - // Expand RGB to RGBA with alpha=255 - img.pixels - .chunks(3) - .flat_map(|rgb| [rgb[0], rgb[1], rgb[2], 255u8]) - .collect() - } - GltfFormat::R8G8 => { - // Treat RG as luminance+alpha? For simplicity, replicate first channel into RGB, second as alpha. - img.pixels - .chunks(2) - .flat_map(|rg| [rg[0], rg[0], rg[0], rg[1]]) - .collect() - } - GltfFormat::R8 => { - // Grayscale: replicate into RGB, alpha=255 - img.pixels - .iter() - .flat_map(|l| [*l, *l, *l, 255u8]) - .collect() - } - _ => img.pixels.clone(), - } -} diff --git a/glium_platform/src/lib.rs b/glium_platform/src/lib.rs deleted file mode 100644 index 6fd924f..0000000 --- a/glium_platform/src/lib.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub mod platform; -pub mod assets; -pub mod model; -pub mod gltf_loader; -pub mod system; -mod render; - -pub use assets::GliumAssetManager; -pub use platform::GliumPlatform; -pub use system::RenderingSystem; diff --git a/glium_platform/src/platform.rs b/glium_platform/src/platform.rs deleted file mode 100644 index 8f00d92..0000000 --- a/glium_platform/src/platform.rs +++ /dev/null @@ -1,201 +0,0 @@ -use std::cell::{RefCell, Cell}; -use std::rc::Rc; -use std::sync::{Arc, Mutex, RwLock}; -use raidillon_platform::{Platform, PlatformContext, TimeContext, DebugWireframes, DebugWireframesRef}; -use glium::backend::glutin::Display; -use glium::backend::glutin::SimpleWindowBuilder; -use glium::glutin::surface::WindowSurface; -use glium::winit::event_loop::EventLoop; -use glium::winit::window::Window; -use glium::Surface; -use crate::system::{RenderingContext, RenderingSystemManager}; -use winit::event::{DeviceEvent, Event, WindowEvent}; -use raidillon_assets::ModelManagerRef; -use raidillon_core::engine::EngineTrait; -use raidillon_core::time; -use raidillon_core::time::Time; -use crate::render::{BasicMeshRenderingSystem, DebugWireframeRenderingSystem, EguiRenderer, SkyboxRenderingSystem}; -use crate::GliumAssetManager; -use glam::Vec3; -use winit::event::DeviceEvent::MouseMotion; -use raidillon_core::EguiQueue; -use raidillon_platform::settings::{Settings, default_config_path}; - -pub struct GliumPlatform> { - event_loop: EventLoop<()>, - window: Arc>, - display: Display, - rendering_system_manager: RenderingSystemManager, - asset_manager: ModelManagerRef, - engine: E, - time: time::Time, - egui_queue: Rc>, - settings: Arc>, - debug_wireframes: DebugWireframesRef, - should_egui_receive_input_events: Rc>, -} - -impl> Platform for GliumPlatform { - fn initialize(mut engine: E, title: String, width: u32, height: u32) -> Self { - let event_loop = glium::winit::event_loop::EventLoop::builder() - .build() - .expect("create event-loop"); - - let (window, display) = SimpleWindowBuilder::new() - .with_title(title.as_str()) - .with_inner_size(width, height) - .build(&event_loop); - - let asset_manager: ModelManagerRef = Rc::new(RefCell::new(Box::new(GliumAssetManager::new(Box::new(display.clone()))))); - let mut rendering_system_manager = RenderingSystemManager::new(); - - let time_cfg = time::Config::default(); - let time = time::Time::new(time_cfg); - - let window = Arc::new(Mutex::new(window)); - - // Install rendering systems in order - rendering_system_manager.add::(&display, window.clone(), &event_loop); - rendering_system_manager.add::(&display, window.clone(), &event_loop); - rendering_system_manager.add::(&display, window.clone(), &event_loop); - rendering_system_manager.add::(&display, window.clone(), &event_loop); - - let egui_queue = Rc::new(RefCell::new(EguiQueue::new())); - - let settings = Arc::new( - RwLock::new( - Settings::load_or_default(default_config_path()).unwrap() - ) - ); - let debug_wireframes = Rc::new(RefCell::new(DebugWireframes::new())); - let should_egui_receive_input_events = Rc::new(Cell::new(false)); - - Self { - event_loop, - window, - display, - rendering_system_manager, - asset_manager, - engine, - time, - egui_queue, - settings, - debug_wireframes, - should_egui_receive_input_events, - } - } - - fn run(mut self) { - let (w, h): (u32, u32) = match self.window.lock() { - Ok(window) => window.inner_size().into(), - Err(_) => (0, 0), // fallback values - }; - let ctx = PlatformContext { - current_event: Event::AboutToWait, - asset_manager: self.asset_manager.clone(), - frame_width: w as f32, - frame_height: h as f32, - time_ctx: self.construct_time_ctx(), - window: self.window.clone(), - egui_queue: self.egui_queue.clone(), - settings: self.settings.clone(), - debug_wireframes: self.debug_wireframes.clone(), - should_egui_receive_input_events: self.should_egui_receive_input_events.clone(), - }; - self.engine.initialize(ctx.clone()); - self.settings.read().unwrap().display_settings.apply(&*self.window.lock().unwrap()); - - let _ = &self.event_loop.run(move |event, el| { - let settings_handle = self.settings.read().unwrap(); - if settings_handle.display_settings.dirty { - settings_handle.display_settings.apply(&*self.window.lock().unwrap()); - } - drop(settings_handle); - - self.rendering_system_manager - .systems - .values_mut() - .for_each(|system| system.handle_event(self.window.clone(), event.clone())); - - let mut ctx2 = ctx.clone(); - ctx2.current_event = event.clone(); - self.engine.handle_event(ctx2); - - match event { - Event::WindowEvent { event, .. } => match event { - WindowEvent::Resized(size) => { - if size.width > 0 && size.height > 0 { - self.display.resize((size.width, size.height)); - } - }, - WindowEvent::CloseRequested => { - // TODO: Run uninitialize on renderer and engine - self.settings.read().unwrap().save_to_file(default_config_path()); - el.exit(); - }, - WindowEvent::RedrawRequested => { - let mut target = self.display.draw(); - target.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0); - let scene = self.engine.current_scene(); - let mut context = RenderingContext { - scene, - target: &mut target, - display: &self.display, - asset_manager: self.asset_manager.clone(), - window: self.window.clone(), - egui_queue: self.egui_queue.clone(), - debug_wireframes: self.debug_wireframes.clone(), - env_light_dir: Vec3::new(0.0, -1.0, 0.0), - should_egui_receive_input_events: self.should_egui_receive_input_events.clone(), - }; - - self.rendering_system_manager - .systems - .values_mut() - .for_each(|system| system.render(&mut context)); - - // clear debug wireframes after rendering - self.debug_wireframes.borrow_mut().clear(); - - target.finish().unwrap(); - } - _ => {}, - }, - Event::AboutToWait => { - let plan = self.time.begin_frame_blocking(); - - let mut ctx2 = ctx.clone(); - ctx2.time_ctx = TimeContext { - frame_dt: self.time.frame_dt_seconds(), - fixed_dt: self.time.fixed_dt_seconds(), - alpha: self.time.alpha(), - }; - ctx2.current_event = Event::AboutToWait; - - for _ in 0..plan.updates { - self.engine.fixed_update(ctx2.clone()); - } - - self.engine.frame_update(ctx2.clone()); - - self.rendering_system_manager - .systems - .values_mut() - .for_each(|system| system.prepare_frame(self.window.clone())); - self.window.lock().unwrap().request_redraw(); - } - _ => {}, - } - }); - } -} - -impl> GliumPlatform { - fn construct_time_ctx(&self) -> TimeContext { - TimeContext { - frame_dt: self.time.frame_dt_seconds(), - fixed_dt: self.time.fixed_dt_seconds(), - alpha: self.time.alpha(), - } - } -} diff --git a/glium_platform/src/render/basic.rs b/glium_platform/src/render/basic.rs deleted file mode 100644 index 6553cc0..0000000 --- a/glium_platform/src/render/basic.rs +++ /dev/null @@ -1,115 +0,0 @@ -use std::any::Any; -use std::sync::{Arc, Mutex}; -use glium::{uniform, Display, Program, Surface}; -use glium::glutin::surface::WindowSurface; -use glium::texture::{RawImage2d, SrgbTexture2d}; -use crate::{GliumAssetManager, RenderingSystem}; -use crate::system::RenderingContext; -use raidillon_assets::include_shader; -pub use raidillon_platform::Camera; -use glam::Vec3; -use glium::uniforms::{MagnifySamplerFilter, MinifySamplerFilter, SamplerWrapFunction}; -use winit::event::Event; -use winit::event_loop::EventLoop; -use raidillon_ecs::{Transform, ModelID}; -use raidillon_ecs::components::ModelHandle; -use crate::model::Model; - -/// A basic renderer pipeline step. -pub struct BasicMeshRenderingSystem { - program: Program, - white_tex: SrgbTexture2d, - params: glium::DrawParameters<'static>, -} - -impl RenderingSystem for BasicMeshRenderingSystem { - fn initialize(display: &Display, _window: Arc>, event_loop: &EventLoop<()>) -> Self { - const VERT_SRC: &str = include_shader!("gl_textured.vert"); - const FRAG_SRC: &str = include_shader!("gl_textured.frag"); - - let program = Program::from_source(display, VERT_SRC, FRAG_SRC, None).unwrap(); - - let white_tex = { - let data = vec![255u8, 255u8, 255u8, 255u8]; - let raw = RawImage2d::from_raw_rgba(data, (1, 1)); - SrgbTexture2d::new(display, raw).unwrap() - }; - - let params = glium::DrawParameters { - depth: glium::Depth { - test: glium::draw_parameters::DepthTest::IfLess, - write: true, - .. Default::default() - }, - .. Default::default() - }; - - Self { - program, white_tex, params - } - } - - fn render(&mut self, ctx: &mut RenderingContext) { - let cam = match ctx.scene.world.query::<&Camera>().iter().next() { - Some((_, cam)) => *cam, - None => { - eprintln!("[renderer] No camera component found. Skipping frame"); - return; - } - }; - - // Use HDR-derived environment light direction if provided, otherwise default to downward - let light_dir_world: Vec3 = if ctx.env_light_dir.length_squared() > 0.0 { ctx.env_light_dir.normalize() } else { Vec3::new(0.0, -1.0, 0.0) }; - - // Transform light direction to view space (normals/positions are in view space) - let view_mat3 = glam::Mat3::from_mat4(cam.view()); - let light_dir_view = (view_mat3 * light_dir_world).normalize(); - - let asset_manager = ctx.asset_manager.borrow(); - - for (_, (tr, mh)) in ctx.scene.world.query::<(&Transform, &ModelHandle)>().iter() { - let model = match asset_manager.get_model(&mh.0) { - Some(model) => model, - _ => continue, - }; - - let models = match model.downcast_ref::>() { - Some(models) => models, - None => continue, - }; - - for model in models { - let mesh = &model.mesh; - let mat = &model.material; - - let tex_ref: &SrgbTexture2d = mat.base_color.as_ref().unwrap_or(&self.white_tex); - - let mut sampler = tex_ref.sampled(); - sampler = sampler.wrap_function(SamplerWrapFunction::Repeat); - sampler = sampler.minify_filter(MinifySamplerFilter::Linear); - sampler = sampler.magnify_filter(MagnifySamplerFilter::Linear); - - let c = mat.base_color_factor; - - let uniforms = uniform! { - model: tr.matrix().to_cols_array_2d(), - view: cam.view().to_cols_array_2d(), - projection: cam.projection().to_cols_array_2d(), - u_light: [light_dir_view.x, light_dir_view.y, light_dir_view.z], - tex: sampler, - color: [c[0], c[1], c[2]], - uv_offset: [mat.uv_offset.x, mat.uv_offset.y], - uv_scale: [mat.uv_scale.x, mat.uv_scale.y], - }; - - ctx.target.draw( - &mesh.vbuf, - &mesh.ibuf, - &self.program, - &uniforms, - &self.params, - ).unwrap(); - } - } - } -} diff --git a/glium_platform/src/render/debug_wireframe.rs b/glium_platform/src/render/debug_wireframe.rs deleted file mode 100644 index 2f259e9..0000000 --- a/glium_platform/src/render/debug_wireframe.rs +++ /dev/null @@ -1,80 +0,0 @@ -use std::sync::{Arc, Mutex}; -use glium::{Display, Program, Surface, VertexBuffer, implement_vertex}; -use glium::glutin::surface::WindowSurface; -use glium::index::PrimitiveType; -use glium::uniform; -use winit::event_loop::EventLoop; -use raidillon_assets::include_shader; -use crate::system::RenderingContext; -use crate::RenderingSystem; -pub use raidillon_platform::Camera; - -#[derive(Copy, Clone)] -struct DebugVertex { - position: [f32; 3], - color: [f32; 4], -} - -implement_vertex!(DebugVertex, position, color); - -/// renders debug wireframes from the shared buffer -pub struct DebugWireframeRenderingSystem { - program: Program, - params: glium::DrawParameters<'static>, -} - -impl RenderingSystem for DebugWireframeRenderingSystem { - fn initialize(display: &Display, _window: Arc>, _event_loop: &EventLoop<()>) -> Self { - const VERT_SRC: &str = include_shader!("debug_wireframe.vert"); - const FRAG_SRC: &str = include_shader!("debug_wireframe.frag"); - - let program = Program::from_source(display, VERT_SRC, FRAG_SRC, None).unwrap(); - - let params = glium::DrawParameters { - depth: glium::Depth { - test: glium::draw_parameters::DepthTest::IfLess, - write: false, - ..Default::default() - }, - line_width: Some(1.0), - ..Default::default() - }; - - Self { program, params } - } - - fn render(&mut self, ctx: &mut RenderingContext) { - let debug_wireframes = ctx.debug_wireframes.borrow(); - - if !debug_wireframes.enabled || debug_wireframes.vertices.is_empty() { - return; - } - - let cam = match ctx.scene.world.query::<&Camera>().iter().next() { - Some((_, cam)) => *cam, - None => return, - }; - - let vertices: Vec = debug_wireframes.vertices.iter() - .map(|v| DebugVertex { position: v.position, color: v.color }) - .collect(); - - let vbuf = match VertexBuffer::new(ctx.display, &vertices) { - Ok(vb) => vb, - Err(_) => return, - }; - - let uniforms = uniform! { - view: cam.view().to_cols_array_2d(), - projection: cam.projection().to_cols_array_2d(), - }; - - ctx.target.draw( - &vbuf, - glium::index::NoIndices(PrimitiveType::LinesList), - &self.program, - &uniforms, - &self.params, - ).ok(); - } -} diff --git a/glium_platform/src/render/egui.rs b/glium_platform/src/render/egui.rs deleted file mode 100644 index 3cd0583..0000000 --- a/glium_platform/src/render/egui.rs +++ /dev/null @@ -1,74 +0,0 @@ -use std::sync::{Arc, Mutex}; -use egui::ViewportId; -use glium::{Display, Frame}; -use glium::glutin::surface::WindowSurface; -use winit::window::Window; -use crate::RenderingSystem; -use crate::system::RenderingContext; -use egui_glium::EguiGlium; -use winit::event::{Event, WindowEvent}; -use winit::event_loop::EventLoop; -use std::cell::Cell; -use std::rc::Rc; - -pub struct EguiRenderer { - egui_glium: EguiGlium, - should_egui_receive_input_events: Option>>, -} - -impl RenderingSystem for EguiRenderer { - fn initialize(display: &Display, window: Arc>, event_loop: &EventLoop<()>) -> Self - where - Self: Sized, - { - let window = window.lock().unwrap(); - let egui_glium = EguiGlium::new(ViewportId::ROOT, &display, &window, &event_loop); - - Self { egui_glium: egui_glium, should_egui_receive_input_events: None } - } - - fn render(&mut self, ctx: &mut RenderingContext) { - if self.should_egui_receive_input_events.is_none() { - self.should_egui_receive_input_events = Some(ctx.should_egui_receive_input_events.clone()); - } - - let window = ctx.window.lock().unwrap(); - - self.egui_glium.run(&window, |egui_ctx| { - ctx.egui_queue.borrow_mut().run(egui_ctx); - }); - - self.egui_glium.paint(ctx.display, ctx.target); - } - - fn handle_event(&mut self, window: Arc>, event: Event<()>) { - let window = window.lock().unwrap(); - match event { - Event::WindowEvent { event, .. } => { - let should_egui_receive_input_events = match self.should_egui_receive_input_events.as_ref() { - Some(v) => v.get(), - None => true, - }; - - let should_send_event = if should_egui_receive_input_events { - true - } else { - !matches!(event, - WindowEvent::KeyboardInput { .. } | - WindowEvent::ModifiersChanged(_) | - WindowEvent::CursorMoved { .. } | - WindowEvent::MouseInput { .. } | - WindowEvent::MouseWheel { .. } | - WindowEvent::Touch(_) | - WindowEvent::Ime(_) - ) - }; - - if should_send_event { - let _ = self.egui_glium.on_event(&window, &event); - } - } - _ => {}, - } - } -} diff --git a/glium_platform/src/render/mod.rs b/glium_platform/src/render/mod.rs deleted file mode 100644 index 22aa047..0000000 --- a/glium_platform/src/render/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -mod basic; -mod skybox; -mod egui; -mod debug_wireframe; - -pub use basic::BasicMeshRenderingSystem; -pub use skybox::SkyboxRenderingSystem; -pub use egui::EguiRenderer; -pub use debug_wireframe::DebugWireframeRenderingSystem; diff --git a/glium_platform/src/render/skybox.rs b/glium_platform/src/render/skybox.rs deleted file mode 100644 index d11683b..0000000 --- a/glium_platform/src/render/skybox.rs +++ /dev/null @@ -1,157 +0,0 @@ -use std::path::PathBuf; -use std::rc::Rc; -use std::cell::RefCell; -use std::sync::{Arc, Mutex}; -use glium::{Display, Program, Surface, VertexBuffer, IndexBuffer, implement_vertex}; -use glium::glutin::surface::WindowSurface; -use glium::index::PrimitiveType; -use glium::texture::{RawImage2d, SrgbTexture2d, Texture2d}; -use glium::uniform; -use glium::uniforms::{MagnifySamplerFilter, MinifySamplerFilter, SamplerWrapFunction}; -use glam::{Mat4, Vec2, Vec3}; -use winit::event_loop::EventLoop; -use raidillon_assets::include_shader; -use crate::system::RenderingContext; -use crate::RenderingSystem; - -#[derive(Copy, Clone)] -struct SkyboxVertex { position: [f32; 3] } -implement_vertex!(SkyboxVertex, position); - -pub struct SkyboxRenderingSystem { - program: Program, - quad_vb: VertexBuffer, - quad_ib: IndexBuffer, - /// Equirectangular HDR image, tonemapped to sRGB for skybox view - equirect_srgb: SrgbTexture2d, - /// Dominant light direction estimated from HDRI - light_dir: Vec3, -} - -impl SkyboxRenderingSystem { - fn build_cube(display: &Display) -> (VertexBuffer, IndexBuffer) { - // Unit cube centered at origin - let p = &[ - [-1.0, -1.0, -1.0], [ 1.0, -1.0, -1.0], [ 1.0, 1.0, -1.0], [-1.0, 1.0, -1.0], // back - [-1.0, -1.0, 1.0], [ 1.0, -1.0, 1.0], [ 1.0, 1.0, 1.0], [-1.0, 1.0, 1.0], // front - ]; - let verts = vec![ - SkyboxVertex { position: p[0] }, SkyboxVertex { position: p[1] }, SkyboxVertex { position: p[2] }, SkyboxVertex { position: p[3] }, // back - SkyboxVertex { position: p[4] }, SkyboxVertex { position: p[5] }, SkyboxVertex { position: p[6] }, SkyboxVertex { position: p[7] }, // front - ]; - let idx: [u16; 36] = [ - // back face - 0,1,2, 2,3,0, - // front face - 4,6,5, 6,4,7, - // left face - 0,3,7, 7,4,0, - // right face - 1,5,6, 6,2,1, - // bottom face - 0,4,5, 5,1,0, - // top face - 3,2,6, 6,7,3, - ]; - ( - VertexBuffer::new(display, &verts).unwrap(), - IndexBuffer::new(display, PrimitiveType::TrianglesList, &idx).unwrap(), - ) - } - - fn load_hdr_equirect_and_analyze(display: &Display, path: &std::path::Path) -> (SrgbTexture2d, Vec3) { - // Use image crate to decode EXR as f32 RGB - let dyn_img = image::ImageReader::open(path).expect("open exr").with_guessed_format().expect("guess format").decode().expect("decode exr"); - let hdr = dyn_img.to_rgb32f(); - let (width, height) = hdr.dimensions(); - let width = width as usize; let height = height as usize; - let mut dir_accum = Vec3::ZERO; - let mut weight_sum = 0.0f32; - for y in 0..height { - let v = (y as f32 + 0.5) / height as f32; - let theta = (v - 0.5) * std::f32::consts::PI; - let lat_weight = theta.cos().max(0.0); - for x in 0..width { - let u = (x as f32 + 0.5) / width as f32; - let phi = (u - 0.5) * 2.0 * std::f32::consts::PI; - let px = hdr.get_pixel(x as u32, y as u32).0; - let rgb = Vec3::new(px[0], px[1], px[2]); - let lum = 0.2126*rgb.x + 0.7152*rgb.y + 0.0722*rgb.z; - if lum > 0.0 { - let dir = Vec3::new(phi.cos()*theta.cos(), theta.sin(), phi.sin()*theta.cos()); - let w = lum * lat_weight; - dir_accum += dir * w; - weight_sum += w; - } - } - } - let mut light_dir = if weight_sum > 0.0 { dir_accum / weight_sum } else { Vec3::new(0.0, -1.0, 0.0) }; - if light_dir.length_squared() < 1e-6 { light_dir = Vec3::new(0.0,-1.0,0.0); } - light_dir = light_dir.normalize(); - - // Tonemap to sRGB - let mut srgb_bytes = Vec::with_capacity(width*height*4); - for y in 0..height { - for x in 0..width { - let px = hdr.get_pixel(x as u32, y as u32).0; - let mapped = Vec3::new(px[0], px[1], px[2]) / (Vec3::new(px[0], px[1], px[2]) + Vec3::ONE); - let srgb = mapped.powf(1.0/2.2); - srgb_bytes.extend_from_slice(&[ - (srgb.x.clamp(0.0,1.0)*255.0) as u8, - (srgb.y.clamp(0.0,1.0)*255.0) as u8, - (srgb.z.clamp(0.0,1.0)*255.0) as u8, - 255u8, - ]); - } - } - let raw = RawImage2d::from_raw_rgba(srgb_bytes, (width as u32, height as u32)); - let tex = SrgbTexture2d::new(display, raw).unwrap(); - (tex, light_dir) - } -} - -impl RenderingSystem for SkyboxRenderingSystem { - fn initialize(display: &Display, _window: Arc>, event_loop: &EventLoop<()>) -> Self { - const VERT_SRC: &str = include_shader!("skybox.vert"); - const FRAG_SRC: &str = include_shader!("skybox.frag"); - let program = Program::from_source(display, VERT_SRC, FRAG_SRC, None).unwrap(); - let (quad_vb, quad_ib) = Self::build_cube(display); - - // Load EXR from assets/exr - let manifest_dir = env!("CARGO_MANIFEST_DIR"); - let path = std::path::Path::new(manifest_dir).join("../assets/exr/citrus_orchard_road_puresky_4k.exr"); - let (equirect_srgb, light_dir) = Self::load_hdr_equirect_and_analyze(display, &path); - Self { program, quad_vb, quad_ib, equirect_srgb, light_dir } - } - - fn render(&mut self, ctx: &mut RenderingContext) { - // Provide view and projection without translation for skybox - let cam = match ctx.scene.world.query::<&raidillon_platform::Camera>().iter().next() { - Some((_, cam)) => *cam, - None => return, - }; - let mut view = cam.view(); - // remove translation from view matrix (only orientation) - view.col_mut(3).x = 0.0; view.col_mut(3).y = 0.0; view.col_mut(3).z = 0.0; - let mut sampler = self.equirect_srgb.sampled(); - sampler = sampler.wrap_function(SamplerWrapFunction::Repeat); - sampler = sampler.minify_filter(MinifySamplerFilter::Linear); - sampler = sampler.magnify_filter(MagnifySamplerFilter::Linear); - - let uniforms = uniform! { - view: view.to_cols_array_2d(), - projection: cam.projection().to_cols_array_2d(), - equirect: sampler, - }; - let params = glium::DrawParameters { depth: glium::Depth { test: glium::draw_parameters::DepthTest::IfLessOrEqual, write: false, ..Default::default() }, ..Default::default() }; - ctx.target.draw(&self.quad_vb, &self.quad_ib, &self.program, &uniforms, ¶ms).ok(); - - // Share light direction with following passes - ctx.env_light_dir = self.light_dir; - } -} - -// Provide a getter for light direction for other systems -impl SkyboxRenderingSystem { - pub fn light_direction(&self) -> Vec3 { self.light_dir } -} diff --git a/glium_platform/src/system.rs b/glium_platform/src/system.rs deleted file mode 100644 index cf5f945..0000000 --- a/glium_platform/src/system.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::any::TypeId; -use std::cell::RefCell; -use std::rc::Rc; -use std::sync::{Arc, Mutex}; -use indexmap::IndexMap; -use glium::{Display, Frame}; -use glium::glutin::surface::WindowSurface; -use raidillon_assets::ModelManagerRef; -use raidillon_core::{define_typemap, EguiQueue}; -use raidillon_core::scene::Scene; -use raidillon_platform::DebugWireframesRef; -use glam::Vec3; -use winit::event_loop::EventLoop; -use std::cell::Cell; - -pub struct RenderingContext<'a> { - pub scene: &'a Scene, - pub target: &'a mut Frame, - pub window: Arc>, - pub display: &'a Display, - pub asset_manager: ModelManagerRef, - pub egui_queue: Rc>, - pub debug_wireframes: DebugWireframesRef, - pub env_light_dir: Vec3, - pub should_egui_receive_input_events: Rc> -} - -/// The internal "rendering system" trait of glium_platform. -/// This is unrelated to the main System trait in core. -pub trait RenderingSystem { - fn handle_event( - &mut self, - _window: Arc>, - _event: winit::event::Event<()>, - ) { - } - fn prepare_frame(&mut self, _window: Arc>) {} - fn render(&mut self, ctx: &mut RenderingContext); - fn initialize(display: &Display, window: Arc>, event_loop: &EventLoop<()>) -> Self - where - Self: Sized; -} - -// define_typemap!(RenderingSystemManager, RenderingSystem); - -pub struct RenderingSystemManager { - pub systems: IndexMap>, -} - -impl RenderingSystemManager { - pub fn new() -> Self { - Self { - systems: IndexMap::default(), - } - } - - pub fn add(&mut self, display: &Display, window: Arc>, event_loop: &EventLoop<()>) - where - R: RenderingSystem + 'static, - { - let system = R::initialize(display, window, event_loop); - self.systems.insert(TypeId::of::(), Box::new(system)); - } - - pub fn remove(&mut self) { - self.systems.shift_remove(&TypeId::of::()); - } -} diff --git a/justfile b/justfile new file mode 100644 index 0000000..a8ef99b --- /dev/null +++ b/justfile @@ -0,0 +1,10 @@ +default: + @just --list + +# Run 'cargo run' on the project +run *ARGS: + cargo run {{ARGS}} + +# Watch for changes and automatically restart +watch: + bacon diff --git a/opengl.png b/opengl.png new file mode 100644 index 0000000..f765a07 Binary files /dev/null and b/opengl.png differ diff --git a/physics/Cargo.toml b/physics/Cargo.toml deleted file mode 100644 index dc34e98..0000000 --- a/physics/Cargo.toml +++ /dev/null @@ -1,9 +0,0 @@ -[package] -name = "raidillon_physics" -version = "0.1.0" -edition = "2024" - -[dependencies] -rapier3d = "0.30.1" -raidillon_ecs = { path = "../ecs" } -glam = "0.30.8" \ No newline at end of file diff --git a/physics/src/lib.rs b/physics/src/lib.rs deleted file mode 100644 index a5dafc6..0000000 --- a/physics/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod physics; - -pub use crate::physics::Physics; diff --git a/physics/src/physics.rs b/physics/src/physics.rs deleted file mode 100644 index 5eff699..0000000 --- a/physics/src/physics.rs +++ /dev/null @@ -1,82 +0,0 @@ -use glam::{Quat, Vec3}; -use rapier3d::na::{Quaternion, UnitQuaternion}; -use rapier3d::prelude::*; -use raidillon_ecs::Transform; - -/// Tiny wrapper around rapier3d. -pub struct Physics { - pub rigid_body_set: RigidBodySet, - pub collider_set: ColliderSet, - physics_pipeline: PhysicsPipeline, - island_manager: IslandManager, - pub broad_phase: DefaultBroadPhase, - pub narrow_phase: NarrowPhase, - impulse_joint_set: ImpulseJointSet, - multibody_joint_set: MultibodyJointSet, - ccd_solver: CCDSolver, - gravity: Vector, - integration_parameters: IntegrationParameters, -} - -impl Default for Physics { - fn default() -> Self { - Self { - gravity: vector![0.0, -9.81, 0.0], - rigid_body_set: Default::default(), - collider_set: Default::default(), - physics_pipeline: Default::default(), - island_manager: Default::default(), - broad_phase: Default::default(), - narrow_phase: Default::default(), - impulse_joint_set: Default::default(), - multibody_joint_set: Default::default(), - ccd_solver: Default::default(), - integration_parameters: Default::default(), - } - } -} - -impl Physics { - pub fn step(&mut self, dt: f32) { - self.integration_parameters.dt = dt; - self.physics_pipeline.step( - &self.gravity, - &self.integration_parameters, - &mut self.island_manager, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut self.rigid_body_set, - &mut self.collider_set, - &mut self.impulse_joint_set, - &mut self.multibody_joint_set, - &mut self.ccd_solver, - &(), - &(), - ); - } - - pub fn add_rigid_body(&mut self, kind: RigidBodyType, transform: Transform, collider: Collider) -> RigidBodyHandle { - let rb = RigidBodyBuilder::new(kind) - .translation(vector![transform.translation.x, transform.translation.y, transform.translation.z]) - .build(); - let rb_handle = self.rigid_body_set.insert(rb); - self.collider_set.insert_with_parent(collider, rb_handle, &mut self.rigid_body_set); - rb_handle - } - - pub fn get_rigid_body(&self, handle: RigidBodyHandle) -> Option<&RigidBody> { - self.rigid_body_set.get(handle) - } - - pub fn get_rigid_body_mut(&mut self, handle: RigidBodyHandle) -> Option<&mut RigidBody> { - self.rigid_body_set.get_mut(handle) - } - - pub fn rapier_translation_to_glam(v: &Vector) -> Vec3 { - Vec3::new(v.x, v.y, v.z) - } - - pub fn rapier_rotation_to_glam(r: &UnitQuaternion) -> Quat { - Quat::from_xyzw(r.i, r.j, r.k, r.w) - } -} diff --git a/platform/Cargo.lock b/platform/Cargo.lock deleted file mode 100644 index 4ca8f54..0000000 --- a/platform/Cargo.lock +++ /dev/null @@ -1,1779 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ab_glyph" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" - -[[package]] -name = "ahash" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "android-activity" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" -dependencies = [ - "android-properties", - "bitflags 2.9.1", - "cc", - "cesu8", - "jni", - "jni-sys", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "num_enum", - "thiserror", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytemuck" -version = "1.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" - -[[package]] -name = "bytes" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" - -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.9.1", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - -[[package]] -name = "cc" -version = "1.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" -dependencies = [ - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "cursor-icon" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - -[[package]] -name = "dpi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "gethostname" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" -dependencies = [ - "libc", - "windows-targets 0.48.5", -] - -[[package]] -name = "getrandom" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi", -] - -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "indexmap" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" -dependencies = [ - "getrandom", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "libloading" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" -dependencies = [ - "cfg-if", - "windows-targets 0.53.3", -] - -[[package]] -name = "libredox" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" -dependencies = [ - "bitflags 2.9.1", - "libc", - "redox_syscall 0.5.17", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "memmap2" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "483758ad303d734cec05e5c12b41d7e93e6a6390c5e9dae6bdeb7c1259012d28" -dependencies = [ - "libc", -] - -[[package]] -name = "ndk" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" -dependencies = [ - "bitflags 2.9.1", - "jni-sys", - "log", - "ndk-sys", - "num_enum", - "raw-window-handle", - "thiserror", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.6.0+11769913" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "num_enum" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.9.1", - "block2", - "libc", - "objc2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2", - "objc2-core-location", - "objc2-foundation", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-core-location" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" -dependencies = [ - "block2", - "objc2", - "objc2-contacts", - "objc2-foundation", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.9.1", - "block2", - "dispatch", - "libc", - "objc2", -] - -[[package]] -name = "objc2-link-presentation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" -dependencies = [ - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2", - "objc2-foundation", - "objc2-metal", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation", - "objc2-link-presentation", - "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2", - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.9.1", - "block2", - "objc2", - "objc2-core-location", - "objc2-foundation", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "orbclient" -version = "0.3.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" -dependencies = [ - "libredox", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "polling" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", -] - -[[package]] -name = "proc-macro-crate" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "raidillon_platform" -version = "0.1.0" -dependencies = [ - "winit", -] - -[[package]] -name = "raw-window-handle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", -] - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "sctk-adwaita" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "slab" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.9.1", - "calloop", - "calloop-wayland-source", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.44", - "thiserror", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smol_str" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" -dependencies = [ - "serde", -] - -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" - -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs", - "rustix 1.0.8", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.9.1", - "rustix 1.0.8", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.9.1", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" -dependencies = [ - "rustix 1.0.8", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" -dependencies = [ - "bitflags 2.9.1", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - -[[package]] -name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.3", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winit" -version = "0.30.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" -dependencies = [ - "ahash", - "android-activity", - "atomic-waker", - "bitflags 2.9.1", - "block2", - "bytemuck", - "calloop", - "cfg_aliases", - "concurrent-queue", - "core-foundation", - "core-graphics", - "cursor-icon", - "dpi", - "js-sys", - "libc", - "memmap2", - "ndk", - "objc2", - "objc2-app-kit", - "objc2-foundation", - "objc2-ui-kit", - "orbclient", - "percent-encoding", - "pin-project", - "raw-window-handle", - "redox_syscall 0.4.1", - "rustix 0.38.44", - "sctk-adwaita", - "smithay-client-toolkit", - "smol_str", - "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time", - "windows-sys 0.52.0", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - -[[package]] -name = "winnow" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix 0.38.44", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.9.1", - "dlib", - "log", - "once_cell", - "xkeysym", -] - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/platform/Cargo.toml b/platform/Cargo.toml deleted file mode 100644 index 16fec56..0000000 --- a/platform/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "raidillon_platform" -version = "0.1.0" -edition = "2024" - -[dependencies] -winit = "0.30.12" -raidillon_core = { path = "../core" } -raidillon_assets = { path = "../asset" } -glam = "0.30.5" -serde = { version = "1.0.228", features = ["derive"] } -toml = "0.9.8" diff --git a/platform/src/context.rs b/platform/src/context.rs deleted file mode 100644 index 31bd6cb..0000000 --- a/platform/src/context.rs +++ /dev/null @@ -1,86 +0,0 @@ -use std::cell::Cell; -use std::{cell::RefCell, rc::Rc}; -use std::sync::{Arc, Mutex, RwLock}; -use winit::event::Event; -use raidillon_assets::ModelManagerRef; -use raidillon_core::EguiQueue; -use crate::settings::Settings; - -/// a single debug wireframe vertex with position and color -#[derive(Clone, Copy)] -pub struct DebugWireframeVertex { - pub position: [f32; 3], - pub color: [f32; 4], -} - -/// shared buffer for debug wireframe rendering -#[derive(Clone, Default)] -pub struct DebugWireframes { - pub vertices: Vec, - pub enabled: bool, -} - -impl DebugWireframes { - pub fn new() -> Self { - Self { vertices: Vec::new(), enabled: true } - } - - pub fn clear(&mut self) { - self.vertices.clear(); - } - - /// add a single line segment - pub fn add_line(&mut self, start: [f32; 3], end: [f32; 3], color: [f32; 4]) { - self.vertices.push(DebugWireframeVertex { position: start, color }); - self.vertices.push(DebugWireframeVertex { position: end, color }); - } - - /// add a wireframe box from min/max corners - pub fn add_box(&mut self, min: [f32; 3], max: [f32; 3], color: [f32; 4]) { - let [x0, y0, z0] = min; - let [x1, y1, z1] = max; - - // bottom face edges - self.add_line([x0, y0, z0], [x1, y0, z0], color); - self.add_line([x1, y0, z0], [x1, y0, z1], color); - self.add_line([x1, y0, z1], [x0, y0, z1], color); - self.add_line([x0, y0, z1], [x0, y0, z0], color); - - // top face edges - self.add_line([x0, y1, z0], [x1, y1, z0], color); - self.add_line([x1, y1, z0], [x1, y1, z1], color); - self.add_line([x1, y1, z1], [x0, y1, z1], color); - self.add_line([x0, y1, z1], [x0, y1, z0], color); - - // vertical edges - self.add_line([x0, y0, z0], [x0, y1, z0], color); - self.add_line([x1, y0, z0], [x1, y1, z0], color); - self.add_line([x1, y0, z1], [x1, y1, z1], color); - self.add_line([x0, y0, z1], [x0, y1, z1], color); - } -} - -pub type DebugWireframesRef = Rc>; - -#[derive(Clone)] -pub struct PlatformContext { - pub current_event: Event<()>, - pub asset_manager: ModelManagerRef, - pub frame_width: f32, - pub frame_height: f32, - pub time_ctx: TimeContext, - pub window: Arc>, - pub egui_queue: Rc>, - pub settings: Arc>, - /// shared debug wireframe buffer - pub debug_wireframes: DebugWireframesRef, - /// sets whether or not egui will receive input events - pub should_egui_receive_input_events: Rc>, -} - -#[derive(Clone)] -pub struct TimeContext { - pub frame_dt: f32, - pub fixed_dt: f32, - pub alpha: f32, -} diff --git a/platform/src/event.rs b/platform/src/event.rs deleted file mode 100644 index bb27077..0000000 --- a/platform/src/event.rs +++ /dev/null @@ -1,11 +0,0 @@ -pub enum PlatformEvent { - /// Emmited when the window should - RedrawRequested, - - /// The platform has requested to close the app. - CloseRequested, - - /// Platform event loop is about to block and wait for new - /// new events. - AboutToWait -} diff --git a/platform/src/lib.rs b/platform/src/lib.rs deleted file mode 100644 index ef88e08..0000000 --- a/platform/src/lib.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub mod platform; -mod camera; -mod event; -pub mod context; -pub mod settings; - -pub use platform::Platform; -pub use camera::Camera; -pub use context::{PlatformContext, TimeContext, DebugWireframes, DebugWireframesRef, DebugWireframeVertex}; diff --git a/platform/src/platform.rs b/platform/src/platform.rs deleted file mode 100644 index 8884c46..0000000 --- a/platform/src/platform.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::PlatformContext; -use raidillon_core::engine::EngineTrait; - -pub trait Platform> { - /// Initialize platform. - fn initialize(engine: E, title: String, width: u32, height: u32) -> Self; - fn run(self); -} diff --git a/platform/src/settings.rs b/platform/src/settings.rs deleted file mode 100644 index a901137..0000000 --- a/platform/src/settings.rs +++ /dev/null @@ -1,166 +0,0 @@ -use winit::monitor::{MonitorHandle, VideoModeHandle}; -use winit::window::{Fullscreen, Window}; -use serde::{Serialize, Deserialize}; -use std::error::Error; -use std::fs; -use std::io; -use std::path::{Path, PathBuf}; - -pub fn default_config_path() -> PathBuf { - let exe_path = std::env::current_exe().unwrap(); - let exe_dir = exe_path - .parent() - .ok_or_else(|| std::io::Error::new(std::io::ErrorKind::Other, "executable has no parent")).unwrap(); - - exe_dir.join("settings.toml") -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] -#[serde(rename_all = "snake_case")] -pub enum WindowMode { - BorderlessFullscreen, - ExclusiveFullscreen, - #[default] - Windowed, -} - -#[derive(Debug, Default, Serialize, Deserialize)] -pub struct Settings { - pub display_settings: DisplaySettings, -} - -impl Settings { - pub fn load_from_file(path: impl AsRef) -> Result> { - let path = path.as_ref(); - let text = fs::read_to_string(path)?; - let settings: Settings = toml::from_str(&text)?; - Ok(settings) - } - - pub fn save_to_file(&self, path: impl AsRef) -> Result<(), Box> { - let path = path.as_ref(); - if let Some(parent) = path.parent() { - fs::create_dir_all(parent)?; - } - let toml_str = toml::to_string_pretty(self)?; - fs::write(path, toml_str)?; - Ok(()) - } - - pub fn load_or_default(path: impl AsRef) -> Result> { - let path = path.as_ref(); - - match fs::read_to_string(path) { - Ok(text) => { - let settings: Settings = toml::from_str(&text)?; - Ok(settings) - } - Err(err) if err.kind() == io::ErrorKind::NotFound => { - let settings = Settings::default(); - if let Some(parent) = path.parent() { - fs::create_dir_all(parent)?; - } - let toml_str = toml::to_string_pretty(&settings)?; - fs::write(path, toml_str)?; - Ok(settings) - } - Err(err) => Err(Box::new(err)), - } - } -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(default)] -pub struct DisplaySettings { - pub fullscreen_mode: WindowMode, - #[serde(skip)] - pub dirty: bool, -} - -impl Default for DisplaySettings { - fn default() -> Self { - Self { - fullscreen_mode: WindowMode::Windowed, - dirty: false, - } - } -} - -impl DisplaySettings { - pub fn apply(&self, window: &Window) { - // apply fullscreen mode - match self.fullscreen_mode { - WindowMode::BorderlessFullscreen => { - let monitor = window.current_monitor().or_else(|| window.primary_monitor()); - window.set_fullscreen(Some(Fullscreen::Borderless(monitor))); - } - WindowMode::ExclusiveFullscreen => { - let monitor = window.current_monitor().or_else(|| window.primary_monitor()); - match monitor { - Some(monitor) => { - if let Some(video_mode) = pick_best_video_mode(&monitor) { - window.set_fullscreen(Some(Fullscreen::Exclusive(video_mode))); - } else { - // fallback to borderless - window.set_fullscreen(Some(Fullscreen::Borderless(Some(monitor)))); - } - } - None => { - // no monitor info, fallback to windowed - window.set_fullscreen(None); - } - } - } - WindowMode::Windowed => { - window.set_fullscreen(None); - }, - } - } -} - -fn pick_best_video_mode(monitor: &MonitorHandle) -> Option { - let target_size = monitor.size(); - - let mut best_native: Option = None; - let mut best_any: Option = None; - - for mode in monitor.video_modes() { - if mode.size() == target_size { - let replace = match best_native.as_ref() { - None => true, - Some(best) => { - (mode.refresh_rate_millihertz(), mode.bit_depth()) - > (best.refresh_rate_millihertz(), best.bit_depth()) - } - }; - if replace { - best_native = Some(mode.clone()); - } - } - - let replace = match best_any.as_ref() { - None => true, - Some(best) => is_better_video_mode(&mode, best), - }; - if replace { - best_any = Some(mode); - } - } - - best_native.or(best_any) -} - -fn is_better_video_mode(a: &VideoModeHandle, b: &VideoModeHandle) -> bool { - let a_size = a.size(); - let b_size = b.size(); - let a_area = u64::from(a_size.width) * u64::from(a_size.height); - let b_area = u64::from(b_size.width) * u64::from(b_size.height); - - match a_area.cmp(&b_area) { - std::cmp::Ordering::Greater => true, - std::cmp::Ordering::Less => false, - std::cmp::Ordering::Equal => { - (a.refresh_rate_millihertz(), a.bit_depth()) > (b.refresh_rate_millihertz(), b.bit_depth()) - } - } -} diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..f1458ae --- /dev/null +++ b/readme.md @@ -0,0 +1,3 @@ +## Attributions + +- [Tree](./resources/models/tree.gltf) by "Poly by Google" [CC-BY] (https://creativecommons.org/licenses/by/3.0/) via [Poly Pizza](https://poly.pizza/m/6pwiq7hSrHr) \ No newline at end of file diff --git a/resources/models/Grass Texture 1.png b/resources/models/Grass Texture 1.png new file mode 100644 index 0000000..c20a364 Binary files /dev/null and b/resources/models/Grass Texture 1.png differ diff --git a/resources/models/cube.bin b/resources/models/cube.bin new file mode 100644 index 0000000..29df9d9 Binary files /dev/null and b/resources/models/cube.bin differ diff --git a/resources/models/cube.gltf b/resources/models/cube.gltf new file mode 100644 index 0000000..8db6d67 --- /dev/null +++ b/resources/models/cube.gltf @@ -0,0 +1,121 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":840, + "uri":"cube.bin" + } + ] +} diff --git a/resources/models/cube.obj b/resources/models/cube.obj new file mode 100644 index 0000000..c4d834c --- /dev/null +++ b/resources/models/cube.obj @@ -0,0 +1,33 @@ +# cube.obj +# + +g cube + +v 0.0 0.0 0.0 +v 0.0 0.0 1.0 +v 0.0 1.0 0.0 +v 0.0 1.0 1.0 +v 1.0 0.0 0.0 +v 1.0 0.0 1.0 +v 1.0 1.0 0.0 +v 1.0 1.0 1.0 + +vn 0.0 0.0 1.0 +vn 0.0 0.0 -1.0 +vn 0.0 1.0 0.0 +vn 0.0 -1.0 0.0 +vn 1.0 0.0 0.0 +vn -1.0 0.0 0.0 + +f 1//2 7//2 5//2 +f 1//2 3//2 7//2 +f 1//6 4//6 3//6 +f 1//6 2//6 4//6 +f 3//3 8//3 7//3 +f 3//3 4//3 8//3 +f 5//5 7//5 8//5 +f 5//5 8//5 6//5 +f 1//4 5//4 6//4 +f 1//4 6//4 2//4 +f 2//1 6//1 8//1 +f 2//1 8//1 4//1 diff --git a/resources/models/monkey-smooth.bin b/resources/models/monkey-smooth.bin new file mode 100644 index 0000000..f6f4431 Binary files /dev/null and b/resources/models/monkey-smooth.bin differ diff --git a/resources/models/monkey-smooth.gltf b/resources/models/monkey-smooth.gltf new file mode 100644 index 0000000..21b6404 --- /dev/null +++ b/resources/models/monkey-smooth.gltf @@ -0,0 +1,104 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Suzanne" + } + ], + "meshes":[ + { + "name":"Suzanne", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":555, + "max":[ + 1.3671875, + 0.984375, + 0.8515625 + ], + "min":[ + -1.3671875, + -0.984375, + -0.8515625 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":555, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":555, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2904, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6660, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6660, + "byteOffset":6660, + "target":34962 + }, + { + "buffer":0, + "byteLength":4440, + "byteOffset":13320, + "target":34962 + }, + { + "buffer":0, + "byteLength":5808, + "byteOffset":17760, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":23568, + "uri":"monkey-smooth.bin" + } + ] +} diff --git a/resources/models/monkey.bin b/resources/models/monkey.bin new file mode 100644 index 0000000..e7992f3 Binary files /dev/null and b/resources/models/monkey.bin differ diff --git a/resources/models/monkey.gltf b/resources/models/monkey.gltf new file mode 100644 index 0000000..d3e2438 --- /dev/null +++ b/resources/models/monkey.gltf @@ -0,0 +1,104 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Suzanne" + } + ], + "meshes":[ + { + "name":"Suzanne", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1966, + "max":[ + 1.3671875, + 0.984375, + 0.8515625 + ], + "min":[ + -1.3671875, + -0.984375, + -0.8515625 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1966, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1966, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2904, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":23592, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":23592, + "byteOffset":23592, + "target":34962 + }, + { + "buffer":0, + "byteLength":15728, + "byteOffset":47184, + "target":34962 + }, + { + "buffer":0, + "byteLength":5808, + "byteOffset":62912, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":68720, + "uri":"monkey.bin" + } + ] +} diff --git a/resources/models/plane.bin b/resources/models/plane.bin new file mode 100644 index 0000000..7baf2c5 Binary files /dev/null and b/resources/models/plane.bin differ diff --git a/resources/models/plane.gltf b/resources/models/plane.gltf new file mode 100644 index 0000000..08db53f --- /dev/null +++ b/resources/models/plane.gltf @@ -0,0 +1,160 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_texture_transform" + ], + "extensionsRequired":[ + "KHR_texture_transform" + ], + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Plane", + "scale":[ + 10, + 10, + 10 + ] + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material.002", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "extensions":{ + "KHR_texture_transform":{ + "offset":[ + 0, + -9 + ], + "scale":[ + 10, + 10 + ] + } + }, + "index":0 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "name":"Plane.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"Grass Texture 1", + "uri":"Grass%20Texture%201.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":4, + "max":[ + 1, + 0, + 1 + ], + "min":[ + -1, + 0, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":6, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":48, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":48, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":96, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":128, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":140, + "uri":"plane.bin" + } + ] +} diff --git a/resources/models/tree.bin b/resources/models/tree.bin new file mode 100644 index 0000000..e782621 Binary files /dev/null and b/resources/models/tree.bin differ diff --git a/resources/models/tree.gltf b/resources/models/tree.gltf new file mode 100644 index 0000000..51bf9ed --- /dev/null +++ b/resources/models/tree.gltf @@ -0,0 +1,140 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"tree01", + "scale":[ + 0.009999999776482582, + 0.009999999776482582, + 0.009999999776482582 + ] + } + ], + "materials":[ + { + "name":"Mat", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":0 + }, + "metallicFactor":0 + } + } + ], + "meshes":[ + { + "name":"tree01_1", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + } + ], + "images":[ + { + "mimeType":"image/png", + "name":"tree_texture", + "uri":"tree_texture.png" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":395, + "max":[ + 123.4296646118164, + 509.0864562988281, + 168.36563110351562 + ], + "min":[ + -184.9799346923828, + 0, + -155.37196350097656 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":395, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":395, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":471, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":4740, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":4740, + "byteOffset":4740, + "target":34962 + }, + { + "buffer":0, + "byteLength":3160, + "byteOffset":9480, + "target":34962 + }, + { + "buffer":0, + "byteLength":942, + "byteOffset":12640, + "target":34963 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":13584, + "uri":"tree.bin" + } + ] +} diff --git a/resources/models/tree_texture.png b/resources/models/tree_texture.png new file mode 100644 index 0000000..f5726d4 Binary files /dev/null and b/resources/models/tree_texture.png differ diff --git a/resources/models/uvsphere-smooth.bin b/resources/models/uvsphere-smooth.bin new file mode 100644 index 0000000..f8b6e5c Binary files /dev/null and b/resources/models/uvsphere-smooth.bin differ diff --git a/resources/models/uvsphere-smooth.gltf b/resources/models/uvsphere-smooth.gltf new file mode 100644 index 0000000..0f65991 --- /dev/null +++ b/resources/models/uvsphere-smooth.gltf @@ -0,0 +1,109 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Sphere", + "translation":[ + 0, + 0, + 0.003377079963684082 + ] + } + ], + "meshes":[ + { + "name":"Sphere", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":559, + "max":[ + 0.9999997019767761, + 1, + 0.9999993443489075 + ], + "min":[ + -0.9999990463256836, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":559, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":559, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2880, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":6708, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":6708, + "byteOffset":6708, + "target":34962 + }, + { + "buffer":0, + "byteLength":4472, + "byteOffset":13416, + "target":34962 + }, + { + "buffer":0, + "byteLength":5760, + "byteOffset":17888, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":23648, + "uri":"uvsphere-smooth.bin" + } + ] +} diff --git a/resources/models/uvsphere.bin b/resources/models/uvsphere.bin new file mode 100644 index 0000000..dda76ba Binary files /dev/null and b/resources/models/uvsphere.bin differ diff --git a/resources/models/uvsphere.gltf b/resources/models/uvsphere.gltf new file mode 100644 index 0000000..edf10c7 --- /dev/null +++ b/resources/models/uvsphere.gltf @@ -0,0 +1,104 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Sphere" + } + ], + "meshes":[ + { + "name":"Sphere", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1984, + "max":[ + 0.9999997019767761, + 1, + 0.9999993443489075 + ], + "min":[ + -0.9999990463256836, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1984, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1984, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2880, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":23808, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":23808, + "target":34962 + }, + { + "buffer":0, + "byteLength":15872, + "byteOffset":47616, + "target":34962 + }, + { + "buffer":0, + "byteLength":5760, + "byteOffset":63488, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":69248, + "uri":"uvsphere.bin" + } + ] +} diff --git a/resources/models/uvsphere2.bin b/resources/models/uvsphere2.bin new file mode 100644 index 0000000..c71a8be Binary files /dev/null and b/resources/models/uvsphere2.bin differ diff --git a/resources/models/uvsphere2.gltf b/resources/models/uvsphere2.gltf new file mode 100644 index 0000000..6657f6e --- /dev/null +++ b/resources/models/uvsphere2.gltf @@ -0,0 +1,190 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.4.56", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0, + 1 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Sphere", + "translation":[ + 0, + 0, + -1.0871706008911133 + ] + }, + { + "mesh":1, + "name":"Cube", + "translation":[ + 0, + 0, + 1.0190757513046265 + ] + } + ], + "meshes":[ + { + "name":"Sphere", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3 + } + ] + }, + { + "name":"Cube.001", + "primitives":[ + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":1984, + "max":[ + 0.9999997019767761, + 1, + 0.9999993443489075 + ], + "min":[ + -0.9999990463256836, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":1984, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":1984, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":2880, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":23808, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":23808, + "target":34962 + }, + { + "buffer":0, + "byteLength":15872, + "byteOffset":47616, + "target":34962 + }, + { + "buffer":0, + "byteLength":5760, + "byteOffset":63488, + "target":34963 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":69248, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":69536, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":69824, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":70016, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":70088, + "uri":"uvsphere2.bin" + } + ] +} diff --git a/resources/shaders/gl_textured.frag b/resources/shaders/gl_textured.frag new file mode 100644 index 0000000..e0da565 --- /dev/null +++ b/resources/shaders/gl_textured.frag @@ -0,0 +1,34 @@ +#version 330 core + +in vec3 v_normal; +in vec2 v_tex; +in vec3 v_position; + +out vec4 frag_color; + +uniform vec3 u_light; +uniform sampler2D tex; +uniform vec3 color; // base colour factor (acts as solid colour when no texture) + +void main() { + // Combine base texture (or constant white) with colour factor supplied by CPU. + vec3 base_col = texture(tex, v_tex).rgb * color; + + vec3 ambient_color = base_col * 0.2; + vec3 diffuse_color = base_col * 0.6; + vec3 specular_color = vec3(1.0); + + // u_light is the direction **from the light towards the fragment**. + float diffuse = max(dot(normalize(v_normal), normalize(u_light)), 0.0); + + vec3 camera_dir = normalize(-v_position); + vec3 half_dir = normalize(normalize(u_light) + camera_dir); + float specular = pow(max(dot(half_dir, normalize(v_normal)), 0.0), 16.0); + + vec3 result = ambient_color + diffuse * diffuse_color + specular * specular_color; + + // Convert from linear to sRGB for display (approximate γ-correction) + result = pow(result, vec3(1.0 / 2.2)); + + frag_color = vec4(result, 1.0); +} \ No newline at end of file diff --git a/assets/shaders/gl_textured.vert b/resources/shaders/gl_textured.vert similarity index 99% rename from assets/shaders/gl_textured.vert rename to resources/shaders/gl_textured.vert index df2c27d..269c9d3 100644 --- a/assets/shaders/gl_textured.vert +++ b/resources/shaders/gl_textured.vert @@ -20,4 +20,4 @@ void main() { v_tex = tex_coords * uv_scale + uv_offset; v_position = (modelview * vec4(position, 1.0)).xyz; gl_Position = projection * modelview * vec4(position, 1.0); -} +} \ No newline at end of file diff --git a/assets/shaders/skybox.frag b/resources/shaders/skybox.frag similarity index 61% rename from assets/shaders/skybox.frag rename to resources/shaders/skybox.frag index ce28e95..4ad6a8c 100644 --- a/assets/shaders/skybox.frag +++ b/resources/shaders/skybox.frag @@ -9,19 +9,14 @@ uniform sampler2D equirect; const vec2 inv_atan = vec2(0.15915494309, 0.31830988618); vec2 sample_spherical_map(vec3 v) { - vec2 uv = vec2(atan(v.z, v.x), asin(clamp(v.y, -1.0, 1.0))); + vec2 uv = vec2(atan(v.z, v.x), asin(v.y)); uv *= inv_atan; uv += 0.5; - uv.x = fract(uv.x); return uv; } void main() { vec2 uv = sample_spherical_map(normalize(direction)); - uv.y = 1.0 - uv.y; - vec2 size = vec2(textureSize(equirect, 0)); - float epsY = 0.5 / max(size.y, 1.0); - uv.y = clamp(uv.y, epsY, 1.0 - epsY); vec3 color = texture(equirect, uv).rgb; frag_color = vec4(color, 1.0); -} +} \ No newline at end of file diff --git a/assets/shaders/skybox.vert b/resources/shaders/skybox.vert similarity index 99% rename from assets/shaders/skybox.vert rename to resources/shaders/skybox.vert index 2db3b53..fe5ce38 100644 --- a/assets/shaders/skybox.vert +++ b/resources/shaders/skybox.vert @@ -12,4 +12,4 @@ void main() { direction = position; vec4 pos = projection * view * vec4(position, 1.0); gl_Position = pos.xyww; -} +} \ No newline at end of file diff --git a/resources/skyboxes/sky_24_2k.png b/resources/skyboxes/sky_24_2k.png new file mode 100644 index 0000000..ac2d556 Binary files /dev/null and b/resources/skyboxes/sky_24_2k.png differ diff --git a/resources/textures/grass.png b/resources/textures/grass.png new file mode 100644 index 0000000..c20a364 Binary files /dev/null and b/resources/textures/grass.png differ diff --git a/platform/src/camera.rs b/src/camera.rs similarity index 100% rename from platform/src/camera.rs rename to src/camera.rs diff --git a/src/ecs.rs b/src/ecs.rs new file mode 100644 index 0000000..a81c9e3 --- /dev/null +++ b/src/ecs.rs @@ -0,0 +1,64 @@ +use glam::{Mat4, Quat, Vec3}; +use hecs::{Entity, World}; +use crate::render::GliumRenderer; +use crate::model::Model; + +/// This system joins the renderer and ECS, +/// and provides tools to use them together +/// effectively. +pub struct ECSRenderer { + pub renderer: GliumRenderer, + pub world: World, +} + +impl ECSRenderer { + pub fn new(renderer: GliumRenderer, world: World) -> Self { + Self { renderer, world } + } + + pub fn spawn_mesh(&mut self, model: Model, transform: Transform) -> Entity { + let model_id = self.renderer.models.len(); + self.renderer.models.push(model); + + self.world.spawn(( + transform, + ModelHandle(model_id), + )) + } + + pub fn despawn_mesh(&mut self, entity: Entity) { + if let Ok(model_handle) = self.world.get::<&ModelHandle>(entity) { + if model_handle.0 < self.renderer.models.len() { + self.renderer.models.remove(model_handle.0); + } + } + let _ = self.world.despawn(entity); + } + + /// Render a single frame using the internal renderer & world. + pub fn render(&mut self) { + self.renderer.render(&self.world); + } + + /// Render into an existing glium target surface. Useful for composing with + /// other render passes (e.g. Dear ImGui). + pub fn render_into(&mut self, target: &mut S) { + self.renderer.render_into(&self.world, target); + } +} + +#[derive(Copy, Clone)] +pub struct Transform { + pub translation: Vec3, + pub rotation: Quat, + pub scale: Vec3, +} + +impl Transform { + pub fn matrix(&self) -> Mat4 { + Mat4::from_scale_rotation_translation(self.scale, self.rotation, self.translation) + } +} + +#[derive(Clone)] +pub struct ModelHandle(pub usize); diff --git a/src/gltf_loader.rs b/src/gltf_loader.rs new file mode 100644 index 0000000..81b24b7 --- /dev/null +++ b/src/gltf_loader.rs @@ -0,0 +1,180 @@ +//! GPU-ready mesh loader for **glTF 2.0** (internal helper) +//! +//! Converts the first primitive of a glTF document into our engine `Model`. + +use anyhow::{Context, Result}; +use glium::{backend::Facade, IndexBuffer, VertexBuffer}; +use glium::index::PrimitiveType; +use gltf::mesh::util::ReadIndices; +use std::{fmt::Debug, path::Path}; +use crate::model::{Vertex, Mesh, Material, Model}; +use glium::texture::{RawImage2d, Texture2d, SrgbTexture2d}; +use glium::uniforms::{SamplerWrapFunction, MinifySamplerFilter, MagnifySamplerFilter}; +use gltf::image::Format as GltfFormat; +use glam::Vec2; + +/// Load a glTF 2.0 file from disk and upload the first primitive to the GPU. +pub fn load_gltf(path: P, facade: &F) -> Result +where + P: AsRef + Debug, + F: Facade + ?Sized, +{ + // -- parse the asset & bring buffer blobs into memory -- + let (doc, buffers, images) = gltf::import(path.as_ref()).context("failed to import glTF file")?; + + // -- grab the very first mesh / primitive -- + let mesh = doc.meshes().next().context("glTF has no meshes")?; + let primitive = mesh.primitives().next().context("mesh has no primitives")?; + + // ---------- MATERIAL ---------- + let mut mat = Material::default(); + + let mat_idx = primitive.material().index().context("primitive has no material")?; + let material = doc.materials().nth(mat_idx).unwrap(); + let pbr = material.pbr_metallic_roughness(); + + // Factors -------------------------------------------------- + mat.base_color_factor = pbr.base_color_factor(); + mat.metal_factor = pbr.metallic_factor(); + mat.roughness_factor = pbr.roughness_factor(); + mat.emissive_factor = material.emissive_factor(); + + // Helper to update sampler settings from glTF sampler + fn update_sampler(mat: &mut Material, t: &gltf::texture::Texture<'_>) { + let sampler_info = t.sampler(); + mat.sampler.wrap_function.0 = match sampler_info.wrap_s() { + gltf::texture::WrappingMode::ClampToEdge => SamplerWrapFunction::Clamp, + gltf::texture::WrappingMode::MirroredRepeat => SamplerWrapFunction::Mirror, + gltf::texture::WrappingMode::Repeat => SamplerWrapFunction::Repeat, + }; + mat.sampler.wrap_function.1 = match sampler_info.wrap_t() { + gltf::texture::WrappingMode::ClampToEdge => SamplerWrapFunction::Clamp, + gltf::texture::WrappingMode::MirroredRepeat => SamplerWrapFunction::Mirror, + gltf::texture::WrappingMode::Repeat => SamplerWrapFunction::Repeat, + }; + if let Some(f) = sampler_info.mag_filter() { + mat.sampler.magnify_filter = match f { + gltf::texture::MagFilter::Nearest => MagnifySamplerFilter::Nearest, + gltf::texture::MagFilter::Linear => MagnifySamplerFilter::Linear, + }; + } + if let Some(f) = sampler_info.min_filter() { + mat.sampler.minify_filter = match f { + gltf::texture::MinFilter::Nearest => MinifySamplerFilter::Nearest, + gltf::texture::MinFilter::Linear => MinifySamplerFilter::Linear, + gltf::texture::MinFilter::NearestMipmapNearest => MinifySamplerFilter::NearestMipmapNearest, + gltf::texture::MinFilter::NearestMipmapLinear => MinifySamplerFilter::NearestMipmapLinear, + gltf::texture::MinFilter::LinearMipmapNearest => MinifySamplerFilter::LinearMipmapNearest, + gltf::texture::MinFilter::LinearMipmapLinear => MinifySamplerFilter::LinearMipmapLinear, + }; + } + } + + // Base-color texture (sRGB) + if let Some(info) = pbr.base_color_texture() { + update_sampler(&mut mat, &info.texture()); + let view = info.texture().source().index(); + mat.base_color = Some(glium_srgb_texture(facade, &images[view])?); + } + + // Metallic-Roughness (linear) + if let Some(info) = pbr.metallic_roughness_texture() { + update_sampler(&mut mat, &info.texture()); + let view = info.texture().source().index(); + mat.metallic_roughness = Some(glium_linear_texture(facade, &images[view])?); + } + + // Normal map (linear) + if let Some(info) = primitive.material().normal_texture() { + update_sampler(&mut mat, &info.texture()); + let view = info.texture().source().index(); + mat.normal = Some(glium_linear_texture(facade, &images[view])?); + } + + // Occlusion (linear) + if let Some(info) = primitive.material().occlusion_texture() { + update_sampler(&mut mat, &info.texture()); + let view = info.texture().source().index(); + mat.occlusion = Some(glium_linear_texture(facade, &images[view])?); + } + + // Emissive (sRGB) + if let Some(info) = primitive.material().emissive_texture() { + update_sampler(&mut mat, &info.texture()); + let view = info.texture().source().index(); + mat.emissive = Some(glium_srgb_texture(facade, &images[view])?); + } + + // KHR_texture_transform + if let Some(tex) = pbr.base_color_texture() { + if let Some(xform) = tex.texture_transform() { + mat.uv_offset = Vec2::new(xform.offset()[0], xform.offset()[1]); + mat.uv_scale = Vec2::new(xform.scale()[0], xform.scale()[1]); + } + } + + // ---- Vertex/index data ---- + let reader = primitive.reader(|buf| Some(&buffers[buf.index()].0)); + + let positions: Vec<[f32; 3]> = reader.read_positions().context("missing POSITION")?.collect(); + let normals: Vec<[f32; 3]> = reader.read_normals().context("missing NORMAL")?.collect(); + let tex_coords: Vec<[f32; 2]> = reader.read_tex_coords(0).map(|tc| tc.into_f32().collect()).unwrap_or_else(|| vec![[0.0, 0.0]; positions.len()]); + let indices: Vec = reader.read_indices().context("missing indices")?.into_u32().collect(); + + // Interleave + let vertices: Vec = (0..positions.len()).map(|i| Vertex { position: positions[i], normal: normals[i], tex_coords: tex_coords[i] }).collect(); + + let vbuf = VertexBuffer::immutable(facade, &vertices)?; + let ibuf = IndexBuffer ::immutable(facade, PrimitiveType::TrianglesList, &indices)?; + + Ok(Model { mesh: Mesh { vbuf, ibuf }, material: mat }) +} + +/// Linear-space texture (RGBA8) from glTF image data. +fn glium_linear_texture(facade: &F, img: &gltf::image::Data) -> Result +where + F: Facade + ?Sized, +{ + let rgba = to_rgba(img); + let raw = RawImage2d::from_raw_rgba(rgba, (img.width, img.height)); + Ok(Texture2d::new(facade, raw)?) +} + +/// sRGB texture from glTF image data. +fn glium_srgb_texture(facade: &F, img: &gltf::image::Data) -> Result +where + F: Facade + ?Sized, +{ + let rgba = to_rgba(img); + let raw = RawImage2d::from_raw_rgba(rgba, (img.width, img.height)); + Ok(SrgbTexture2d::new(facade, raw)?) +} + +/// Convert various glTF image formats to RGBA8 as expected by glium. +fn to_rgba(img: &gltf::image::Data) -> Vec { + match img.format { + GltfFormat::R8G8B8A8 => img.pixels.clone(), + GltfFormat::R8G8B8 => { + // Expand RGB to RGBA with alpha=255 + img.pixels + .chunks(3) + .flat_map(|rgb| [rgb[0], rgb[1], rgb[2], 255u8]) + .collect() + } + GltfFormat::R8G8 => { + // Treat RG as luminance+alpha? For simplicity, replicate first channel into RGB, second as alpha. + img.pixels + .chunks(2) + .flat_map(|rg| [rg[0], rg[0], rg[0], rg[1]]) + .collect() + } + GltfFormat::R8 => { + // Grayscale: replicate into RGB, alpha=255 + img.pixels + .iter() + .flat_map(|l| [*l, *l, *l, 255u8]) + .collect() + } + _ => img.pixels.clone(), + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..1a92617 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,127 @@ +mod camera; +mod ecs; +mod model; +mod gltf_loader; +mod render; +mod time; +mod ui; + +use anyhow::Result; +use camera::Camera; +use ecs::{Transform}; +use glam::{Quat, Vec3, EulerRot}; +use glium::backend::glutin::SimpleWindowBuilder; +use render::GliumRenderer; + +fn main() -> Result<()> { + let event_loop = glium::winit::event_loop::EventLoop::builder() + .build() + .expect("create event-loop"); + + let (window, display) = SimpleWindowBuilder::new() + .with_title("fps") + .with_inner_size(1280, 720) + .build(&event_loop); + + // Create ECS renderer which internally owns both the world and the renderer + let mut ecsr = { + let world = hecs::World::new(); + let renderer = GliumRenderer::new(display.clone())?; + ecs::ECSRenderer::new(renderer, world) + }; + + // Dear ImGui integration + let mut gui = ui::Gui::new(&display, &window)?; + + let mut time = time::Time::new(); + + let object_ent = { + let model_3d = gltf_loader::load_gltf("resources/models/tree.gltf", &display)?; + ecsr.spawn_mesh(model_3d, Transform { + translation: Vec3::new(0.0, -2.5, -5.0), + rotation: Quat::IDENTITY, + scale: Vec3::new(0.01, 0.01, 0.01), + }) + }; + + let ground_ent = { + let model_3d = gltf_loader::load_gltf("resources/models/plane.gltf", &display)?; + ecsr.spawn_mesh(model_3d, Transform { + translation: Vec3::new(0.0, -1.5, 0.0), + rotation: Quat::IDENTITY, + scale: Vec3::new(1.0, 1.0, 1.0), + }) + }; + + + let camera_ent = { + let (w, h): (u32, u32) = window.inner_size().into(); + ecsr.world.spawn((Camera { + eye: Vec3::new(0.0, 0.0, 2.0), + center: Vec3::ZERO, + up: Vec3::Y, + fovy: 60_f32.to_radians(), + aspect: w as f32 / h as f32, + znear: 0.1, + zfar: 100.0, + },)) + }; + + event_loop + .run(move |event, el| { + use glium::winit::event::{Event, WindowEvent}; + + gui.handle_event(&window, &event); + + match event { + Event::WindowEvent { event, .. } => match event { + WindowEvent::CloseRequested => el.exit(), + WindowEvent::Resized(sz) => { + ecsr.world.query_one_mut::<&mut crate::camera::Camera>(camera_ent).map(|mut cam| { + cam.aspect = sz.width as f32 / sz.height as f32; + }); + } + WindowEvent::RedrawRequested => { + let mut target = display.draw(); + + ecsr.render_into(&mut target); + + gui.render_with(&mut target, &window, |ui| { + if let Ok(mut tr) = ecsr.world.query_one_mut::<&mut Transform>(object_ent) { + // Translation controls + let mut translation = [tr.translation.x, tr.translation.y, tr.translation.z]; + if ui.input_float3("Translation", &mut translation).build() { + tr.translation = Vec3::from(translation); + } + + // Scale controls + let mut scale = [tr.scale.x, tr.scale.y, tr.scale.z]; + if ui.input_float3("Scale", &mut scale).build() { + tr.scale = Vec3::from(scale); + } + + // Rotation controls + let (yaw, pitch, roll) = tr.rotation.to_euler(EulerRot::YXZ); + let mut rotation_deg = [yaw.to_degrees(), pitch.to_degrees(), roll.to_degrees()]; + if ui.input_float3("Rotation (deg)", &mut rotation_deg).build() { + let yaw = rotation_deg[0].to_radians(); + let pitch = rotation_deg[1].to_radians(); + let roll = rotation_deg[2].to_radians(); + tr.rotation = Quat::from_euler(EulerRot::YXZ, yaw, pitch, roll); + } + } + }); + target.finish().unwrap(); + } + _ => {} + }, + Event::AboutToWait => { + time.tick(); + gui.prepare_frame(&window); + window.request_redraw(); + } + _ => {} + } + }) + .map_err(Into::into) +} diff --git a/glium_platform/src/model.rs b/src/model.rs similarity index 87% rename from glium_platform/src/model.rs rename to src/model.rs index 1d18dd8..e474fe4 100644 --- a/glium_platform/src/model.rs +++ b/src/model.rs @@ -1,9 +1,8 @@ -use std::any::{Any, TypeId}; -use glium::{IndexBuffer, VertexBuffer, implement_vertex}; -use glium::texture::{SrgbTexture2d, Texture2d}; +use glium::texture::{RawImage2d, SrgbTexture2d, Texture2d}; use glium::uniforms::SamplerBehavior; use glam::{Vec2}; -use std::sync::atomic::{AtomicUsize, Ordering}; +use glium::{backend::Facade, implement_vertex, IndexBuffer, VertexBuffer}; +use glium::index::PrimitiveType; #[derive(Copy, Clone)] pub struct Vertex { @@ -53,6 +52,6 @@ impl Default for Material { } pub struct Model { - pub mesh: Mesh, + pub mesh: Mesh, pub material: Material, } diff --git a/src/render.rs b/src/render.rs new file mode 100644 index 0000000..c382239 --- /dev/null +++ b/src/render.rs @@ -0,0 +1,163 @@ +use crate::camera::Camera; +use crate::ecs::{ModelHandle, Transform}; +use crate::model::{Model, Mesh}; +use glium::texture::{RawImage2d, SrgbTexture2d}; +use glium::{uniform, Program, Surface}; +use glium::uniforms::{MinifySamplerFilter, MagnifySamplerFilter, SamplerWrapFunction}; +use glam::{Vec3, Vec4}; +use hecs::World; +use glium::glutin::surface::WindowSurface; +use image::io::Reader as ImageReader; +use glium::draw_parameters::DepthTest; + +pub struct GliumRenderer { + display: glium::Display, + program: Program, + white_tex: SrgbTexture2d, + + pub models: Vec, + + params: glium::DrawParameters<'static>, + + skybox_program: Program, + skybox_texture: SrgbTexture2d, + skybox_mesh: Mesh, +} + +impl GliumRenderer { + pub fn new(display: glium::Display) -> anyhow::Result { + const VERT_SRC: &str = include_str!("../resources/shaders/gl_textured.vert"); + const FRAG_SRC: &str = include_str!("../resources/shaders/gl_textured.frag"); + + let program = Program::from_source(&display, VERT_SRC, FRAG_SRC, None)?; + + let white_tex = { + let data = vec![255u8, 255u8, 255u8, 255u8]; + let raw = RawImage2d::from_raw_rgba(data, (1, 1)); + SrgbTexture2d::new(&display, raw)? + }; + + let params = glium::DrawParameters { + depth: glium::Depth { + test: glium::draw_parameters::DepthTest::IfLess, + write: true, + .. Default::default() + }, + .. Default::default() + }; + + let sky_vert = include_str!("../resources/shaders/skybox.vert"); + let sky_frag = include_str!("../resources/shaders/skybox.frag"); + let skybox_program = Program::from_source(&display, sky_vert, sky_frag, None)?; + + let image = ImageReader::open("resources/skyboxes/sky_24_2k.png")?.decode()?.to_rgba8(); + let dimensions = image.dimensions(); + let raw = RawImage2d::from_raw_rgba(image.into_raw(), dimensions); + let skybox_texture = SrgbTexture2d::new(&display, raw)?; + + let cube_model = crate::gltf_loader::load_gltf("resources/models/cube.gltf", &display)?; + let skybox_mesh = cube_model.mesh; + + Ok(Self { + display, + program, + white_tex, + models: Vec::new(), + params, + skybox_program, + skybox_texture, + skybox_mesh, + }) + } + + fn draw_scene(&self, world: &World, target: &mut S) { + let cam = match world.query::<&Camera>().iter().next() { + Some((_, cam)) => *cam, + None => { + eprintln!("[renderer] No camera component found. Skipping frame"); + return; + } + }; + + // Direction from the light source (0,+Y) towards the scene. + let light_dir: Vec3 = Vec3::new(0.0, -1.0, 0.0).normalize(); + + for (_, (tr, mh)) in world.query::<(&Transform, &ModelHandle)>().iter() { + let model = &self.models[mh.0]; + let mesh = &model.mesh; + let mat = &model.material; + + let tex_ref: &SrgbTexture2d = mat.base_color.as_ref().unwrap_or(&self.white_tex); + + let mut sampler = tex_ref.sampled(); + sampler = sampler.wrap_function(SamplerWrapFunction::Repeat); + sampler = sampler.minify_filter(MinifySamplerFilter::Linear); + sampler = sampler.magnify_filter(MagnifySamplerFilter::Linear); + + let c = mat.base_color_factor; + + let uniforms = uniform! { + model: tr.matrix().to_cols_array_2d(), + view: cam.view().to_cols_array_2d(), + projection: cam.projection().to_cols_array_2d(), + u_light: [light_dir.x, light_dir.y, light_dir.z], + tex: sampler, + color: [c[0], c[1], c[2]], + uv_offset: [mat.uv_offset.x, mat.uv_offset.y], + uv_scale: [mat.uv_scale.x, mat.uv_scale.y], + }; + + target.draw( + &mesh.vbuf, + &mesh.ibuf, + &self.program, + &uniforms, + &self.params, + ).unwrap(); + } + + // Render skybox + let mut sky_view = cam.view(); + sky_view.w_axis = Vec4::new(0.0, 0.0, 0.0, 1.0); + + let mut sampler = self.skybox_texture.sampled(); + sampler = sampler.wrap_function(SamplerWrapFunction::Clamp); + sampler = sampler.minify_filter(MinifySamplerFilter::Linear); + sampler = sampler.magnify_filter(MagnifySamplerFilter::Linear); + + let uniforms = uniform! { + view: sky_view.to_cols_array_2d(), + projection: cam.projection().to_cols_array_2d(), + equirect: sampler, + }; + + let sky_params = glium::DrawParameters { + depth: glium::Depth { + test: DepthTest::IfLessOrEqual, + write: false, + .. Default::default() + }, + .. Default::default() + }; + + target.draw( + &self.skybox_mesh.vbuf, + &self.skybox_mesh.ibuf, + &self.skybox_program, + &uniforms, + &sky_params, + ).unwrap(); + } + + pub fn render_into(&mut self, world: &World, target: &mut S) { + target.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0); + self.draw_scene(world, target); + } + + pub fn render(&mut self, world: &World) { + let mut frame = self.display.draw(); + frame.clear_color_and_depth((0.1, 0.1, 0.15, 1.0), 1.0); + self.draw_scene(world, &mut frame); + frame.finish().unwrap(); + } +} diff --git a/src/teapot.rs b/src/teapot.rs new file mode 100644 index 0000000..914a881 --- /dev/null +++ b/src/teapot.rs @@ -0,0 +1,2110 @@ +#[derive(Copy, Clone)] +pub struct Vertex { + position: (f32, f32, f32) +} + +implement_vertex!(Vertex, position); + +pub const VERTICES: [Vertex; 531] = [ + Vertex { position: (0.0, 0.0, 0.0) }, // dummy vector because in the original model indices + // start at 1 + Vertex { position: (40.6266, 28.3457, -1.10804) }, + Vertex { position: (40.0714, 30.4443, -1.10804) }, + Vertex { position: (40.7155, 31.1438, -1.10804) }, + Vertex { position: (42.0257, 30.4443, -1.10804) }, + Vertex { position: (43.4692, 28.3457, -1.10804) }, + Vertex { position: (37.5425, 28.3457, 14.5117) }, + Vertex { position: (37.0303, 30.4443, 14.2938) }, + Vertex { position: (37.6244, 31.1438, 14.5466) }, + Vertex { position: (38.8331, 30.4443, 15.0609) }, + Vertex { position: (40.1647, 28.3457, 15.6274) }, + Vertex { position: (29.0859, 28.3457, 27.1468) }, + Vertex { position: (28.6917, 30.4443, 26.7527) }, + Vertex { position: (29.149, 31.1438, 27.2099) }, + Vertex { position: (30.0792, 30.4443, 28.1402) }, + Vertex { position: (31.1041, 28.3457, 29.165) }, + Vertex { position: (16.4508, 28.3457, 35.6034) }, + Vertex { position: (16.2329, 30.4443, 35.0912) }, + Vertex { position: (16.4857, 31.1438, 35.6853) }, + Vertex { position: (16.9999, 30.4443, 36.894) }, + Vertex { position: (17.5665, 28.3457, 38.2256) }, + Vertex { position: (0.831025, 28.3457, 38.6876) }, + Vertex { position: (0.831025, 30.4443, 38.1324) }, + Vertex { position: (0.831025, 31.1438, 38.7764) }, + Vertex { position: (0.831025, 30.4443, 40.0866) }, + Vertex { position: (0.831025, 28.3457, 41.5301) }, + Vertex { position: (-15.868, 28.3457, 35.6034) }, + Vertex { position: (-15.0262, 30.4443, 35.0912) }, + Vertex { position: (-14.9585, 31.1438, 35.6853) }, + Vertex { position: (-15.3547, 30.4443, 36.894) }, + Vertex { position: (-15.9044, 28.3457, 38.2256) }, + Vertex { position: (-28.3832, 28.3457, 27.1468) }, + Vertex { position: (-27.4344, 30.4443, 26.7527) }, + Vertex { position: (-27.6068, 31.1438, 27.2099) }, + Vertex { position: (-28.4322, 30.4443, 28.1402) }, + Vertex { position: (-29.4421, 28.3457, 29.165) }, + Vertex { position: (-36.2402, 28.3457, 14.5117) }, + Vertex { position: (-35.52, 30.4443, 14.2938) }, + Vertex { position: (-36.0073, 31.1438, 14.5466) }, + Vertex { position: (-37.1767, 30.4443, 15.0609) }, + Vertex { position: (-38.5027, 28.3457, 15.6274) }, + Vertex { position: (-38.9646, 28.3457, -1.10804) }, + Vertex { position: (-38.4094, 30.4443, -1.10804) }, + Vertex { position: (-39.0534, 31.1438, -1.10804) }, + Vertex { position: (-40.3636, 30.4443, -1.10804) }, + Vertex { position: (-41.8071, 28.3457, -1.10804) }, + Vertex { position: (-35.8804, 28.3457, -16.7278) }, + Vertex { position: (-35.3683, 30.4443, -16.5099) }, + Vertex { position: (-35.9624, 31.1438, -16.7627) }, + Vertex { position: (-37.1711, 30.4443, -17.2769) }, + Vertex { position: (-38.5027, 28.3457, -17.8435) }, + Vertex { position: (-27.4238, 28.3457, -29.3629) }, + Vertex { position: (-27.0297, 30.4443, -28.9687) }, + Vertex { position: (-27.4869, 31.1438, -29.426) }, + Vertex { position: (-28.4172, 30.4443, -30.3562) }, + Vertex { position: (-29.4421, 28.3457, -31.3811) }, + Vertex { position: (-14.7887, 28.3457, -37.8195) }, + Vertex { position: (-14.5708, 30.4443, -37.3073) }, + Vertex { position: (-14.8236, 31.1438, -37.9014) }, + Vertex { position: (-15.3379, 30.4443, -39.1101) }, + Vertex { position: (-15.9044, 28.3457, -40.4417) }, + Vertex { position: (0.831025, 28.3457, -40.9036) }, + Vertex { position: (0.831025, 30.4443, -40.3484) }, + Vertex { position: (0.831025, 31.1438, -40.9925) }, + Vertex { position: (0.831025, 30.4443, -42.3027) }, + Vertex { position: (0.831025, 28.3457, -43.7462) }, + Vertex { position: (16.4508, 28.3457, -37.8195) }, + Vertex { position: (16.2329, 30.4443, -37.3073) }, + Vertex { position: (16.4857, 31.1438, -37.9014) }, + Vertex { position: (16.9999, 30.4443, -39.1101) }, + Vertex { position: (17.5665, 28.3457, -40.4417) }, + Vertex { position: (29.0859, 28.3457, -29.3629) }, + Vertex { position: (28.6917, 30.4443, -28.9687) }, + Vertex { position: (29.149, 31.1438, -29.426) }, + Vertex { position: (30.0792, 30.4443, -30.3562) }, + Vertex { position: (31.1041, 28.3457, -31.3811) }, + Vertex { position: (37.5425, 28.3457, -16.7278) }, + Vertex { position: (37.0303, 30.4443, -16.5099) }, + Vertex { position: (37.6244, 31.1438, -16.7627) }, + Vertex { position: (38.8331, 30.4443, -17.2769) }, + Vertex { position: (40.1647, 28.3457, -17.8435) }, + Vertex { position: (48.6879, 17.1865, -1.10804) }, + Vertex { position: (53.2404, 6.22714, -1.10804) }, + Vertex { position: (56.4605, -4.33246, -1.10804) }, + Vertex { position: (57.6819, -14.2925, -1.10804) }, + Vertex { position: (44.979, 17.1865, 17.6758) }, + Vertex { position: (49.1787, 6.22714, 19.4626) }, + Vertex { position: (52.1492, -4.33246, 20.7265) }, + Vertex { position: (53.2759, -14.2925, 21.2059) }, + Vertex { position: (34.8094, 17.1865, 32.8703) }, + Vertex { position: (38.0417, 6.22714, 36.1026) }, + Vertex { position: (40.3279, -4.33246, 38.3889) }, + Vertex { position: (41.1951, -14.2925, 39.2561) }, + Vertex { position: (19.6148, 17.1865, 43.0399) }, + Vertex { position: (21.4017, 6.22714, 47.2396) }, + Vertex { position: (22.6656, -4.33246, 50.2101) }, + Vertex { position: (23.145, -14.2925, 51.3369) }, + Vertex { position: (0.831025, 17.1865, 46.7488) }, + Vertex { position: (0.831025, 6.22714, 51.3013) }, + Vertex { position: (0.831025, -4.33246, 54.5214) }, + Vertex { position: (0.831025, -14.2925, 55.7428) }, + Vertex { position: (-17.9528, 17.1865, 43.0399) }, + Vertex { position: (-19.7397, 6.22714, 47.2396) }, + Vertex { position: (-21.0035, -4.33246, 50.2101) }, + Vertex { position: (-21.4829, -14.2925, 51.3369) }, + Vertex { position: (-33.1474, 17.1865, 32.8703) }, + Vertex { position: (-36.3796, 6.22714, 36.1026) }, + Vertex { position: (-38.6659, -4.33246, 38.3889) }, + Vertex { position: (-39.5331, -14.2925, 39.2561) }, + Vertex { position: (-43.3169, 17.1865, 17.6758) }, + Vertex { position: (-47.5166, 6.22714, 19.4626) }, + Vertex { position: (-50.4871, -4.33246, 20.7265) }, + Vertex { position: (-51.6139, -14.2925, 21.2059) }, + Vertex { position: (-47.0258, 17.1865, -1.10804) }, + Vertex { position: (-51.5784, 6.22714, -1.10804) }, + Vertex { position: (-54.7984, -4.33246, -1.10804) }, + Vertex { position: (-56.0198, -14.2925, -1.10804) }, + Vertex { position: (-43.3169, 17.1865, -19.8919) }, + Vertex { position: (-47.5166, 6.22714, -21.6787) }, + Vertex { position: (-50.4871, -4.33246, -22.9426) }, + Vertex { position: (-51.6139, -14.2925, -23.422) }, + Vertex { position: (-33.1474, 17.1865, -35.0864) }, + Vertex { position: (-36.3796, 6.22714, -38.3187) }, + Vertex { position: (-38.6659, -4.33246, -40.6049) }, + Vertex { position: (-39.5331, -14.2925, -41.4721) }, + Vertex { position: (-17.9528, 17.1865, -45.256) }, + Vertex { position: (-19.7397, 6.22714, -49.4557) }, + Vertex { position: (-21.0035, -4.33246, -52.4262) }, + Vertex { position: (-21.4829, -14.2925, -53.5529) }, + Vertex { position: (0.831025, 17.1865, -48.9649) }, + Vertex { position: (0.831025, 6.22714, -53.5174) }, + Vertex { position: (0.831025, -4.33246, -56.7375) }, + Vertex { position: (0.831025, -14.2925, -57.9589) }, + Vertex { position: (19.6148, 17.1865, -45.256) }, + Vertex { position: (21.4017, 6.22714, -49.4557) }, + Vertex { position: (22.6656, -4.33246, -52.4262) }, + Vertex { position: (23.145, -14.2925, -53.5529) }, + Vertex { position: (34.8094, 17.1865, -35.0864) }, + Vertex { position: (38.0417, 6.22714, -38.3187) }, + Vertex { position: (40.3279, -4.33246, -40.6049) }, + Vertex { position: (41.1951, -14.2925, -41.4721) }, + Vertex { position: (44.979, 17.1865, -19.8919) }, + Vertex { position: (49.1787, 6.22714, -21.6787) }, + Vertex { position: (52.1492, -4.33246, -22.9426) }, + Vertex { position: (53.2759, -14.2925, -23.422) }, + Vertex { position: (55.4611, -22.7202, -1.10804) }, + Vertex { position: (50.5755, -28.9493, -1.10804) }, + Vertex { position: (45.6899, -33.1798, -1.10804) }, + Vertex { position: (43.4692, -35.6115, -1.10804) }, + Vertex { position: (51.2273, -22.7202, 20.3343) }, + Vertex { position: (46.7203, -28.9493, 18.4167) }, + Vertex { position: (42.2133, -33.1798, 16.4991) }, + Vertex { position: (40.1647, -35.6115, 15.6274) }, + Vertex { position: (39.6184, -22.7202, 37.6793) }, + Vertex { position: (36.1496, -28.9493, 34.2106) }, + Vertex { position: (32.6808, -33.1798, 30.7418) }, + Vertex { position: (31.1041, -35.6115, 29.165) }, + Vertex { position: (22.2733, -22.7202, 49.2882) }, + Vertex { position: (20.3557, -28.9493, 44.7813) }, + Vertex { position: (18.4381, -33.1798, 40.2743) }, + Vertex { position: (17.5665, -35.6115, 38.2256) }, + Vertex { position: (0.831025, -22.7202, 53.5221) }, + Vertex { position: (0.831025, -28.9493, 48.6365) }, + Vertex { position: (0.831025, -33.1798, 43.7508) }, + Vertex { position: (0.831025, -35.6115, 41.5301) }, + Vertex { position: (-20.6113, -22.7202, 49.2882) }, + Vertex { position: (-18.6937, -28.9493, 44.7813) }, + Vertex { position: (-16.7761, -33.1798, 40.2743) }, + Vertex { position: (-15.9044, -35.6115, 38.2256) }, + Vertex { position: (-37.9564, -22.7202, 37.6793) }, + Vertex { position: (-34.4876, -28.9493, 34.2106) }, + Vertex { position: (-31.0188, -33.1798, 30.7418) }, + Vertex { position: (-29.4421, -35.6115, 29.165) }, + Vertex { position: (-49.5653, -22.7202, 20.3343) }, + Vertex { position: (-45.0583, -28.9493, 18.4167) }, + Vertex { position: (-40.5513, -33.1798, 16.4991) }, + Vertex { position: (-38.5027, -35.6115, 15.6274) }, + Vertex { position: (-53.7991, -22.7202, -1.10804) }, + Vertex { position: (-48.9135, -28.9493, -1.10804) }, + Vertex { position: (-44.0279, -33.1798, -1.10804) }, + Vertex { position: (-41.8071, -35.6115, -1.10804) }, + Vertex { position: (-49.5653, -22.7202, -22.5504) }, + Vertex { position: (-45.0583, -28.9493, -20.6327) }, + Vertex { position: (-40.5513, -33.1798, -18.7151) }, + Vertex { position: (-38.5027, -35.6115, -17.8435) }, + Vertex { position: (-37.9564, -22.7202, -39.8954) }, + Vertex { position: (-34.4876, -28.9493, -36.4266) }, + Vertex { position: (-31.0188, -33.1798, -32.9578) }, + Vertex { position: (-29.4421, -35.6115, -31.3811) }, + Vertex { position: (-20.6113, -22.7202, -51.5043) }, + Vertex { position: (-18.6937, -28.9493, -46.9973) }, + Vertex { position: (-16.7761, -33.1798, -42.4903) }, + Vertex { position: (-15.9044, -35.6115, -40.4417) }, + Vertex { position: (0.831025, -22.7202, -55.7382) }, + Vertex { position: (0.831025, -28.9493, -50.8525) }, + Vertex { position: (0.831025, -33.1798, -45.9669) }, + Vertex { position: (0.831025, -35.6115, -43.7462) }, + Vertex { position: (22.2733, -22.7202, -51.5043) }, + Vertex { position: (20.3557, -28.9493, -46.9973) }, + Vertex { position: (18.4381, -33.1798, -42.4903) }, + Vertex { position: (17.5665, -35.6115, -40.4417) }, + Vertex { position: (39.6184, -22.7202, -39.8954) }, + Vertex { position: (36.1496, -28.9493, -36.4266) }, + Vertex { position: (32.6808, -33.1798, -32.9578) }, + Vertex { position: (31.1041, -35.6115, -31.3811) }, + Vertex { position: (51.2273, -22.7202, -22.5504) }, + Vertex { position: (46.7203, -28.9493, -20.6327) }, + Vertex { position: (42.2133, -33.1798, -18.7151) }, + Vertex { position: (40.1647, -35.6115, -17.8435) }, + Vertex { position: (42.5031, -37.1772, -1.10804) }, + Vertex { position: (37.3399, -38.5429, -1.10804) }, + Vertex { position: (24.5818, -39.5089, -1.10804) }, + Vertex { position: (0.831025, -39.8754, -1.10804) }, + Vertex { position: (39.2736, -37.1772, 15.2483) }, + Vertex { position: (34.5105, -38.5429, 13.2217) }, + Vertex { position: (22.7411, -39.5089, 8.21414) }, + Vertex { position: (30.4182, -37.1772, 28.4792) }, + Vertex { position: (26.7523, -38.5429, 24.8133) }, + Vertex { position: (17.6941, -39.5089, 15.755) }, + Vertex { position: (17.1873, -37.1772, 37.3345) }, + Vertex { position: (15.1608, -38.5429, 32.5714) }, + Vertex { position: (10.1532, -39.5089, 20.8021) }, + Vertex { position: (0.831025, -37.1772, 40.5641) }, + Vertex { position: (0.831025, -38.5429, 35.4009) }, + Vertex { position: (0.831025, -39.5089, 22.6427) }, + Vertex { position: (-15.5253, -37.1772, 37.3345) }, + Vertex { position: (-13.4987, -38.5429, 32.5714) }, + Vertex { position: (-8.49115, -39.5089, 20.8021) }, + Vertex { position: (-28.7562, -37.1772, 28.4792) }, + Vertex { position: (-25.0903, -38.5429, 24.8133) }, + Vertex { position: (-16.032, -39.5089, 15.755) }, + Vertex { position: (-37.6115, -37.1772, 15.2483) }, + Vertex { position: (-32.8484, -38.5429, 13.2217) }, + Vertex { position: (-21.0791, -39.5089, 8.21414) }, + Vertex { position: (-40.8411, -37.1772, -1.10804) }, + Vertex { position: (-35.6779, -38.5429, -1.10804) }, + Vertex { position: (-22.9198, -39.5089, -1.10804) }, + Vertex { position: (-37.6115, -37.1772, -17.4643) }, + Vertex { position: (-32.8484, -38.5429, -15.4378) }, + Vertex { position: (-21.0791, -39.5089, -10.4302) }, + Vertex { position: (-28.7562, -37.1772, -30.6952) }, + Vertex { position: (-25.0903, -38.5429, -27.0294) }, + Vertex { position: (-16.032, -39.5089, -17.9711) }, + Vertex { position: (-15.5253, -37.1772, -39.5506) }, + Vertex { position: (-13.4987, -38.5429, -34.7875) }, + Vertex { position: (-8.49115, -39.5089, -23.0181) }, + Vertex { position: (0.831025, -37.1772, -42.7802) }, + Vertex { position: (0.831025, -38.5429, -37.6169) }, + Vertex { position: (0.831025, -39.5089, -24.8588) }, + Vertex { position: (17.1873, -37.1772, -39.5506) }, + Vertex { position: (15.1608, -38.5429, -34.7875) }, + Vertex { position: (10.1532, -39.5089, -23.0181) }, + Vertex { position: (30.4182, -37.1772, -30.6952) }, + Vertex { position: (26.7523, -38.5429, -27.0294) }, + Vertex { position: (17.6941, -39.5089, -17.9711) }, + Vertex { position: (39.2736, -37.1772, -17.4643) }, + Vertex { position: (34.5105, -38.5429, -15.4378) }, + Vertex { position: (22.7411, -39.5089, -10.4302) }, + Vertex { position: (-44.6497, 17.6861, -1.10804) }, + Vertex { position: (-57.9297, 17.5862, -1.10804) }, + Vertex { position: (-67.7453, 16.8867, -1.10804) }, + Vertex { position: (-73.8301, 14.9879, -1.10804) }, + Vertex { position: (-75.9176, 11.2904, -1.10804) }, + Vertex { position: (-44.2055, 18.6855, 3.68876) }, + Vertex { position: (-58.3252, 18.5699, 3.68876) }, + Vertex { position: (-68.6891, 17.7611, 3.68876) }, + Vertex { position: (-75.0724, 15.5657, 3.68876) }, + Vertex { position: (-77.2501, 11.2904, 3.68876) }, + Vertex { position: (-43.2284, 20.884, 5.28769) }, + Vertex { position: (-59.1955, 20.7341, 5.28769) }, + Vertex { position: (-70.7655, 19.6848, 5.28769) }, + Vertex { position: (-77.8053, 16.8367, 5.28769) }, + Vertex { position: (-80.1814, 11.2904, 5.28769) }, + Vertex { position: (-42.2513, 23.0825, 3.68876) }, + Vertex { position: (-60.0657, 22.8983, 3.68876) }, + Vertex { position: (-72.8419, 21.6085, 3.68876) }, + Vertex { position: (-80.5381, 18.1077, 3.68876) }, + Vertex { position: (-83.1128, 11.2904, 3.68876) }, + Vertex { position: (-41.8071, 24.0819, -1.10804) }, + Vertex { position: (-60.4613, 23.882, -1.10804) }, + Vertex { position: (-73.7857, 22.4829, -1.10804) }, + Vertex { position: (-81.7804, 18.6855, -1.10804) }, + Vertex { position: (-84.4453, 11.2904, -1.10804) }, + Vertex { position: (-42.2513, 23.0825, -5.90483) }, + Vertex { position: (-60.0657, 22.8983, -5.90483) }, + Vertex { position: (-72.8419, 21.6085, -5.90483) }, + Vertex { position: (-80.5381, 18.1077, -5.90483) }, + Vertex { position: (-83.1128, 11.2904, -5.90483) }, + Vertex { position: (-43.2284, 20.884, -7.50376) }, + Vertex { position: (-59.1955, 20.7341, -7.50376) }, + Vertex { position: (-70.7655, 19.6848, -7.50376) }, + Vertex { position: (-77.8053, 16.8367, -7.50376) }, + Vertex { position: (-80.1814, 11.2904, -7.50376) }, + Vertex { position: (-44.2055, 18.6855, -5.90483) }, + Vertex { position: (-58.3252, 18.5699, -5.90483) }, + Vertex { position: (-68.6891, 17.7611, -5.90483) }, + Vertex { position: (-75.0724, 15.5657, -5.90483) }, + Vertex { position: (-77.2501, 11.2904, -5.90483) }, + Vertex { position: (-74.8073, 5.4943, -1.10804) }, + Vertex { position: (-71.2985, -1.50103, -1.10804) }, + Vertex { position: (-65.1248, -8.49634, -1.10804) }, + Vertex { position: (-56.0198, -14.2925, -1.10804) }, + Vertex { position: (-76.0183, 4.93477, 3.68876) }, + Vertex { position: (-72.159, -2.35462, 3.68876) }, + Vertex { position: (-65.4267, -9.55033, 3.68876) }, + Vertex { position: (-55.5757, -15.6249, 3.68876) }, + Vertex { position: (-78.6824, 3.70383, 5.28769) }, + Vertex { position: (-74.0522, -4.23253, 5.28769) }, + Vertex { position: (-66.0909, -11.8691, 5.28769) }, + Vertex { position: (-54.5986, -18.5563, 5.28769) }, + Vertex { position: (-81.3466, 2.47288, 3.68876) }, + Vertex { position: (-75.9454, -6.11044, 3.68876) }, + Vertex { position: (-66.755, -14.1878, 3.68876) }, + Vertex { position: (-53.6214, -21.4877, 3.68876) }, + Vertex { position: (-82.5576, 1.91336, -1.10804) }, + Vertex { position: (-76.8059, -6.96404, -1.10804) }, + Vertex { position: (-67.0569, -15.2418, -1.10804) }, + Vertex { position: (-53.1773, -22.8201, -1.10804) }, + Vertex { position: (-81.3466, 2.47288, -5.90483) }, + Vertex { position: (-75.9454, -6.11044, -5.90483) }, + Vertex { position: (-66.755, -14.1878, -5.90483) }, + Vertex { position: (-53.6214, -21.4877, -5.90483) }, + Vertex { position: (-78.6824, 3.70383, -7.50376) }, + Vertex { position: (-74.0522, -4.23253, -7.50376) }, + Vertex { position: (-66.0909, -11.8691, -7.50376) }, + Vertex { position: (-54.5986, -18.5563, -7.50376) }, + Vertex { position: (-76.0183, 4.93477, -5.90483) }, + Vertex { position: (-72.159, -2.35462, -5.90483) }, + Vertex { position: (-65.4267, -9.55033, -5.90483) }, + Vertex { position: (-55.5757, -15.6249, -5.90483) }, + Vertex { position: (49.1543, 0.630882, -1.10804) }, + Vertex { position: (62.7896, 3.76212, -1.10804) }, + Vertex { position: (68.6967, 11.2904, -1.10804) }, + Vertex { position: (71.939, 20.4176, -1.10804) }, + Vertex { position: (77.5797, 28.3457, -1.10804) }, + Vertex { position: (49.1543, -3.03333, 9.4449) }, + Vertex { position: (63.8305, 1.04519, 8.42059) }, + Vertex { position: (70.0292, 9.70814, 6.1671) }, + Vertex { position: (73.5629, 19.8451, 3.91361) }, + Vertex { position: (80.2446, 28.3457, 2.88929) }, + Vertex { position: (49.1543, -11.0946, 12.9626) }, + Vertex { position: (66.1207, -4.93206, 11.5968) }, + Vertex { position: (72.9605, 6.22714, 8.59214) }, + Vertex { position: (77.1355, 18.5855, 5.58749) }, + Vertex { position: (86.1073, 28.3457, 4.22173) }, + Vertex { position: (49.1543, -19.1559, 9.4449) }, + Vertex { position: (68.4108, -10.9093, 8.42059) }, + Vertex { position: (75.8919, 2.74614, 6.1671) }, + Vertex { position: (80.7081, 17.326, 3.91361) }, + Vertex { position: (91.97, 28.3457, 2.88929) }, + Vertex { position: (49.1543, -22.8201, -1.10804) }, + Vertex { position: (69.4518, -13.6262, -1.10804) }, + Vertex { position: (77.2244, 1.16386, -1.10804) }, + Vertex { position: (82.3321, 16.7534, -1.10804) }, + Vertex { position: (94.6349, 28.3457, -1.10804) }, + Vertex { position: (49.1543, -19.1559, -11.661) }, + Vertex { position: (68.4108, -10.9093, -10.6367) }, + Vertex { position: (75.8919, 2.74614, -8.38317) }, + Vertex { position: (80.7081, 17.326, -6.12968) }, + Vertex { position: (91.97, 28.3457, -5.10536) }, + Vertex { position: (49.1543, -11.0946, -15.1786) }, + Vertex { position: (66.1207, -4.93206, -13.8129) }, + Vertex { position: (72.9605, 6.22714, -10.8082) }, + Vertex { position: (77.1355, 18.5855, -7.80356) }, + Vertex { position: (86.1073, 28.3457, -6.4378) }, + Vertex { position: (49.1543, -3.03333, -11.661) }, + Vertex { position: (63.8305, 1.04519, -10.6367) }, + Vertex { position: (70.0292, 9.70814, -8.38317) }, + Vertex { position: (73.5629, 19.8451, -6.12968) }, + Vertex { position: (80.2446, 28.3457, -5.10536) }, + Vertex { position: (79.6227, 29.5449, -1.10804) }, + Vertex { position: (81.1329, 29.9446, -1.10804) }, + Vertex { position: (81.577, 29.5449, -1.10804) }, + Vertex { position: (80.4222, 28.3457, -1.10804) }, + Vertex { position: (82.4767, 29.6034, 2.63946) }, + Vertex { position: (83.8116, 30.0383, 2.08983) }, + Vertex { position: (83.8515, 29.6268, 1.54019) }, + Vertex { position: (82.1988, 28.3457, 1.29036) }, + Vertex { position: (88.7555, 29.7322, 3.88862) }, + Vertex { position: (89.7049, 30.2444, 3.15578) }, + Vertex { position: (88.8555, 29.8072, 2.42294) }, + Vertex { position: (86.1073, 28.3457, 2.08983) }, + Vertex { position: (95.0343, 29.8611, 2.63946) }, + Vertex { position: (95.5982, 30.4505, 2.08983) }, + Vertex { position: (93.8594, 29.9875, 1.54019) }, + Vertex { position: (90.0158, 28.3457, 1.29036) }, + Vertex { position: (97.8883, 29.9196, -1.10804) }, + Vertex { position: (98.2769, 30.5442, -1.10804) }, + Vertex { position: (96.1339, 30.0695, -1.10804) }, + Vertex { position: (91.7924, 28.3457, -1.10804) }, + Vertex { position: (95.0343, 29.8611, -4.85553) }, + Vertex { position: (95.5982, 30.4505, -4.3059) }, + Vertex { position: (93.8594, 29.9875, -3.75626) }, + Vertex { position: (90.0158, 28.3457, -3.50643) }, + Vertex { position: (88.7555, 29.7322, -6.10469) }, + Vertex { position: (89.7049, 30.2444, -5.37185) }, + Vertex { position: (88.8555, 29.8072, -4.63901) }, + Vertex { position: (86.1073, 28.3457, -4.3059) }, + Vertex { position: (82.4767, 29.6034, -4.85553) }, + Vertex { position: (83.8116, 30.0383, -4.3059) }, + Vertex { position: (83.8515, 29.6268, -3.75626) }, + Vertex { position: (82.1988, 28.3457, -3.50643) }, + Vertex { position: (0.831025, 49.6647, -1.10804) }, + Vertex { position: (10.5134, 48.2657, -1.10804) }, + Vertex { position: (10.0693, 44.868, -1.10804) }, + Vertex { position: (6.42728, 40.6708, -1.10804) }, + Vertex { position: (6.51611, 36.8733, -1.10804) }, + Vertex { position: (9.76642, 48.2657, 2.70243) }, + Vertex { position: (9.35632, 44.868, 2.52698) }, + Vertex { position: (5.9947, 40.6708, 1.09187) }, + Vertex { position: (6.07552, 36.8733, 1.12336) }, + Vertex { position: (7.71453, 48.2657, 5.77547) }, + Vertex { position: (7.39819, 44.868, 5.45913) }, + Vertex { position: (4.80736, 40.6708, 2.8683) }, + Vertex { position: (4.86744, 36.8733, 2.92838) }, + Vertex { position: (4.64149, 48.2657, 7.82736) }, + Vertex { position: (4.46604, 44.868, 7.41726) }, + Vertex { position: (3.03093, 40.6708, 4.05564) }, + Vertex { position: (3.06242, 36.8733, 4.13646) }, + Vertex { position: (0.831025, 48.2657, 8.57438) }, + Vertex { position: (0.831025, 44.868, 8.13023) }, + Vertex { position: (0.831025, 40.6708, 4.48822) }, + Vertex { position: (0.831025, 36.8733, 4.57705) }, + Vertex { position: (-2.97944, 48.2657, 7.82736) }, + Vertex { position: (-2.80399, 44.868, 7.41726) }, + Vertex { position: (-1.36888, 40.6708, 4.05564) }, + Vertex { position: (-1.40037, 36.8733, 4.13646) }, + Vertex { position: (-6.05248, 48.2657, 5.77547) }, + Vertex { position: (-5.73614, 44.868, 5.45913) }, + Vertex { position: (-3.14531, 40.6708, 2.8683) }, + Vertex { position: (-3.20539, 36.8733, 2.92838) }, + Vertex { position: (-8.10437, 48.2657, 2.70243) }, + Vertex { position: (-7.69427, 44.868, 2.52698) }, + Vertex { position: (-4.33265, 40.6708, 1.09187) }, + Vertex { position: (-4.41347, 36.8733, 1.12336) }, + Vertex { position: (-8.85139, 48.2657, -1.10804) }, + Vertex { position: (-8.40724, 44.868, -1.10804) }, + Vertex { position: (-4.76523, 40.6708, -1.10804) }, + Vertex { position: (-4.85406, 36.8733, -1.10804) }, + Vertex { position: (-8.10437, 48.2657, -4.9185) }, + Vertex { position: (-7.69427, 44.868, -4.74305) }, + Vertex { position: (-4.33265, 40.6708, -3.30794) }, + Vertex { position: (-4.41347, 36.8733, -3.33943) }, + Vertex { position: (-6.05248, 48.2657, -7.99154) }, + Vertex { position: (-5.73614, 44.868, -7.6752) }, + Vertex { position: (-3.14531, 40.6708, -5.08437) }, + Vertex { position: (-3.20539, 36.8733, -5.14445) }, + Vertex { position: (-2.97944, 48.2657, -10.0434) }, + Vertex { position: (-2.80399, 44.868, -9.63333) }, + Vertex { position: (-1.36888, 40.6708, -6.27171) }, + Vertex { position: (-1.40037, 36.8733, -6.35253) }, + Vertex { position: (0.831025, 48.2657, -10.7904) }, + Vertex { position: (0.831025, 44.868, -10.3463) }, + Vertex { position: (0.831025, 40.6708, -6.70429) }, + Vertex { position: (0.831025, 36.8733, -6.79312) }, + Vertex { position: (4.64149, 48.2657, -10.0434) }, + Vertex { position: (4.46604, 44.868, -9.63333) }, + Vertex { position: (3.03093, 40.6708, -6.27171) }, + Vertex { position: (3.06242, 36.8733, -6.35253) }, + Vertex { position: (7.71453, 48.2657, -7.99154) }, + Vertex { position: (7.39819, 44.868, -7.6752) }, + Vertex { position: (4.80736, 40.6708, -5.08437) }, + Vertex { position: (4.86744, 36.8733, -5.14445) }, + Vertex { position: (9.76642, 48.2657, -4.9185) }, + Vertex { position: (9.35632, 44.868, -4.74305) }, + Vertex { position: (5.9947, 40.6708, -3.30794) }, + Vertex { position: (6.07552, 36.8733, -3.33943) }, + Vertex { position: (13.8001, 34.3417, -1.10804) }, + Vertex { position: (24.282, 32.6095, -1.10804) }, + Vertex { position: (33.6979, 30.8773, -1.10804) }, + Vertex { position: (37.7841, 28.3457, -1.10804) }, + Vertex { position: (12.795, 34.3417, 3.98234) }, + Vertex { position: (22.4646, 32.6095, 8.09647) }, + Vertex { position: (31.1507, 30.8773, 11.7922) }, + Vertex { position: (34.9202, 28.3457, 13.396) }, + Vertex { position: (10.0391, 34.3417, 8.10003) }, + Vertex { position: (17.4812, 32.6095, 15.5422) }, + Vertex { position: (24.1665, 30.8773, 22.2275) }, + Vertex { position: (27.0677, 28.3457, 25.1286) }, + Vertex { position: (5.9214, 34.3417, 10.856) }, + Vertex { position: (10.0355, 32.6095, 20.5255) }, + Vertex { position: (13.7313, 30.8773, 29.2117) }, + Vertex { position: (15.3351, 28.3457, 32.9812) }, + Vertex { position: (0.831025, 34.3417, 11.8611) }, + Vertex { position: (0.831025, 32.6095, 22.3429) }, + Vertex { position: (0.831025, 30.8773, 31.7589) }, + Vertex { position: (0.831025, 28.3457, 35.845) }, + Vertex { position: (-4.25935, 34.3417, 10.856) }, + Vertex { position: (-8.37348, 32.6095, 20.5255) }, + Vertex { position: (-12.0692, 30.8773, 29.2117) }, + Vertex { position: (-13.673, 28.3457, 32.9812) }, + Vertex { position: (-8.37704, 34.3417, 8.10003) }, + Vertex { position: (-15.8192, 32.6095, 15.5422) }, + Vertex { position: (-22.5045, 30.8773, 22.2275) }, + Vertex { position: (-25.4056, 28.3457, 25.1286) }, + Vertex { position: (-11.133, 34.3417, 3.98234) }, + Vertex { position: (-20.8025, 32.6095, 8.09647) }, + Vertex { position: (-29.4887, 30.8773, 11.7922) }, + Vertex { position: (-33.2582, 28.3457, 13.396) }, + Vertex { position: (-12.1381, 34.3417, -1.10804) }, + Vertex { position: (-22.62, 32.6095, -1.10804) }, + Vertex { position: (-32.0359, 30.8773, -1.10804) }, + Vertex { position: (-36.122, 28.3457, -1.10804) }, + Vertex { position: (-11.133, 34.3417, -6.19841) }, + Vertex { position: (-20.8025, 32.6095, -10.3125) }, + Vertex { position: (-29.4887, 30.8773, -14.0083) }, + Vertex { position: (-33.2582, 28.3457, -15.6121) }, + Vertex { position: (-8.37704, 34.3417, -10.3161) }, + Vertex { position: (-15.8192, 32.6095, -17.7582) }, + Vertex { position: (-22.5045, 30.8773, -24.4435) }, + Vertex { position: (-25.4056, 28.3457, -27.3447) }, + Vertex { position: (-4.25935, 34.3417, -13.072) }, + Vertex { position: (-8.37348, 32.6095, -22.7416) }, + Vertex { position: (-12.0692, 30.8773, -31.4277) }, + Vertex { position: (-13.673, 28.3457, -35.1972) }, + Vertex { position: (0.831025, 34.3417, -14.0771) }, + Vertex { position: (0.831025, 32.6095, -24.559) }, + Vertex { position: (0.831025, 30.8773, -33.9749) }, + Vertex { position: (0.831025, 28.3457, -38.0611) }, + Vertex { position: (5.9214, 34.3417, -13.072) }, + Vertex { position: (10.0355, 32.6095, -22.7416) }, + Vertex { position: (13.7313, 30.8773, -31.4277) }, + Vertex { position: (15.3351, 28.3457, -35.1972) }, + Vertex { position: (10.0391, 34.3417, -10.3161) }, + Vertex { position: (17.4812, 32.6095, -17.7582) }, + Vertex { position: (24.1665, 30.8773, -24.4435) }, + Vertex { position: (27.0677, 28.3457, -27.3447) }, + Vertex { position: (12.795, 34.3417, -6.19841) }, + Vertex { position: (22.4646, 32.6095, -10.3125) }, + Vertex { position: (31.1507, 30.8773, -14.0083) }, + Vertex { position: (34.9202, 28.3457, -15.6121) } +]; + +#[derive(Copy, Clone)] +pub struct Normal { + normal: (f32, f32, f32) +} + +implement_vertex!(Normal, normal); + +pub const NORMALS: [Normal; 531] = [ + Normal { normal: (0.0, 0.0, 0.0) }, // dummy vector because in the original model indices + // start at 1 + Normal { normal: (-0.966742, -0.255752, 0.0) }, + Normal { normal: (-0.966824, 0.255443, 0.0) }, + Normal { normal: (-0.092052, 0.995754, 0.0) }, + Normal { normal: (0.68205, 0.731305, 0.0) }, + Normal { normal: (0.870301, 0.492521, -0.0) }, + Normal { normal: (-0.893014, -0.256345, -0.369882) }, + Normal { normal: (-0.893437, 0.255997, -0.369102) }, + Normal { normal: (-0.0838771, 0.995843, -0.0355068) }, + Normal { normal: (0.629724, 0.73186, 0.260439) }, + Normal { normal: (0.803725, 0.49337, 0.332584) }, + Normal { normal: (-0.683407, -0.256729, -0.683407) }, + Normal { normal: (-0.683531, 0.256067, -0.683531) }, + Normal { normal: (-0.0649249, 0.995776, -0.0649248) }, + Normal { normal: (0.481398, 0.732469, 0.481398) }, + Normal { normal: (0.614804, 0.493997, 0.614804) }, + Normal { normal: (-0.369882, -0.256345, -0.893014) }, + Normal { normal: (-0.369102, 0.255997, -0.893437) }, + Normal { normal: (-0.0355067, 0.995843, -0.0838772) }, + Normal { normal: (0.260439, 0.73186, 0.629724) }, + Normal { normal: (0.332584, 0.49337, 0.803725) }, + Normal { normal: (-0.00284834, -0.257863, -0.966177) }, + Normal { normal: (-0.00192311, 0.254736, -0.967009) }, + Normal { normal: (-0.000266114, 0.995734, -0.0922702) }, + Normal { normal: (0.0, 0.731295, 0.682061) }, + Normal { normal: (0.0, 0.492521, 0.870301) }, + Normal { normal: (0.379058, -0.3593, -0.852771) }, + Normal { normal: (0.37711, 0.149086, -0.914091) }, + Normal { normal: (0.0275022, 0.992081, -0.122551) }, + Normal { normal: (-0.26101, 0.726762, 0.635367) }, + Normal { normal: (-0.332485, 0.492546, 0.804271) }, + Normal { normal: (0.663548, -0.410791, -0.625264) }, + Normal { normal: (0.712664, 0.0737216, -0.697621) }, + Normal { normal: (0.0997268, 0.987509, -0.121984) }, + Normal { normal: (-0.48732, 0.723754, 0.488568) }, + Normal { normal: (-0.615242, 0.492602, 0.615484) }, + Normal { normal: (0.880028, -0.332908, -0.338709) }, + Normal { normal: (0.917276, 0.167113, -0.361493) }, + Normal { normal: (0.113584, 0.992365, -0.0480695) }, + Normal { normal: (-0.63415, 0.727508, 0.261889) }, + Normal { normal: (-0.804126, 0.492634, 0.332705) }, + Normal { normal: (0.96669, -0.255738, 0.0104537) }, + Normal { normal: (0.967442, 0.252962, 0.00810329) }, + Normal { normal: (0.0934365, 0.995624, 0.00128063) }, + Normal { normal: (-0.682167, 0.731196, -0.00034353) }, + Normal { normal: (-0.870322, 0.492483, -0.0) }, + Normal { normal: (0.893014, -0.256345, 0.369882) }, + Normal { normal: (0.893437, 0.255997, 0.369102) }, + Normal { normal: (0.0838768, 0.995843, 0.0355066) }, + Normal { normal: (-0.629724, 0.73186, -0.260439) }, + Normal { normal: (-0.803725, 0.49337, -0.332584) }, + Normal { normal: (0.683407, -0.256729, 0.683407) }, + Normal { normal: (0.683531, 0.256067, 0.683531) }, + Normal { normal: (0.0649249, 0.995776, 0.0649249) }, + Normal { normal: (-0.481398, 0.732469, -0.481398) }, + Normal { normal: (-0.614804, 0.493997, -0.614804) }, + Normal { normal: (0.369882, -0.256345, 0.893014) }, + Normal { normal: (0.369102, 0.255997, 0.893437) }, + Normal { normal: (0.0355067, 0.995843, 0.083877) }, + Normal { normal: (-0.260439, 0.73186, -0.629724) }, + Normal { normal: (-0.332584, 0.49337, -0.803725) }, + Normal { normal: (0.0, -0.255752, 0.966742) }, + Normal { normal: (0.0, 0.255443, 0.966824) }, + Normal { normal: (0.0, 0.995754, 0.092052) }, + Normal { normal: (0.0, 0.731305, -0.68205) }, + Normal { normal: (-0.0, 0.492521, -0.870301) }, + Normal { normal: (-0.369882, -0.256345, 0.893014) }, + Normal { normal: (-0.369102, 0.255996, 0.893437) }, + Normal { normal: (-0.0355068, 0.995843, 0.0838771) }, + Normal { normal: (0.260439, 0.73186, -0.629724) }, + Normal { normal: (0.332584, 0.49337, -0.803725) }, + Normal { normal: (-0.683407, -0.256729, 0.683407) }, + Normal { normal: (-0.683531, 0.256067, 0.683531) }, + Normal { normal: (-0.0649249, 0.995776, 0.064925) }, + Normal { normal: (0.481398, 0.732469, -0.481398) }, + Normal { normal: (0.614804, 0.493997, -0.614804) }, + Normal { normal: (-0.893014, -0.256345, 0.369882) }, + Normal { normal: (-0.893437, 0.255997, 0.369102) }, + Normal { normal: (-0.0838767, 0.995843, 0.0355066) }, + Normal { normal: (0.629724, 0.73186, -0.260439) }, + Normal { normal: (0.803725, 0.49337, -0.332584) }, + Normal { normal: (0.915321, 0.402725, 0.0) }, + Normal { normal: (0.941808, 0.336151, -0.0) }, + Normal { normal: (0.97869, 0.205342, 0.0) }, + Normal { normal: (0.997804, -0.0662397, 0.0) }, + Normal { normal: (0.845438, 0.403546, 0.349835) }, + Normal { normal: (0.869996, 0.336859, 0.360047) }, + Normal { normal: (0.904193, 0.205791, 0.37428) }, + Normal { normal: (0.921879, -0.0663697, 0.381752) }, + Normal { normal: (0.646802, 0.404096, 0.646802) }, + Normal { normal: (0.665655, 0.337351, 0.665655) }, + Normal { normal: (0.691923, 0.20612, 0.691923) }, + Normal { normal: (0.705542, -0.0664796, 0.705543) }, + Normal { normal: (0.349835, 0.403546, 0.845438) }, + Normal { normal: (0.360047, 0.336859, 0.869996) }, + Normal { normal: (0.37428, 0.205791, 0.904193) }, + Normal { normal: (0.381752, -0.0663697, 0.921879) }, + Normal { normal: (-0.0, 0.402725, 0.915321) }, + Normal { normal: (0.0, 0.336151, 0.941808) }, + Normal { normal: (-0.0, 0.205342, 0.97869) }, + Normal { normal: (-0.0, -0.0662397, 0.997804) }, + Normal { normal: (-0.349835, 0.403546, 0.845438) }, + Normal { normal: (-0.360047, 0.336859, 0.869996) }, + Normal { normal: (-0.37428, 0.205791, 0.904193) }, + Normal { normal: (-0.381752, -0.0663697, 0.921879) }, + Normal { normal: (-0.646802, 0.404096, 0.646802) }, + Normal { normal: (-0.665655, 0.337351, 0.665655) }, + Normal { normal: (-0.691923, 0.20612, 0.691923) }, + Normal { normal: (-0.705543, -0.0664796, 0.705543) }, + Normal { normal: (-0.845438, 0.403546, 0.349835) }, + Normal { normal: (-0.869996, 0.336859, 0.360047) }, + Normal { normal: (-0.904193, 0.205791, 0.37428) }, + Normal { normal: (-0.921879, -0.0663697, 0.381752) }, + Normal { normal: (-0.915321, 0.402725, -0.0) }, + Normal { normal: (-0.941808, 0.336151, -0.0) }, + Normal { normal: (-0.97869, 0.205342, -0.0) }, + Normal { normal: (-0.997804, -0.0662397, -0.0) }, + Normal { normal: (-0.845438, 0.403546, -0.349835) }, + Normal { normal: (-0.869996, 0.336859, -0.360047) }, + Normal { normal: (-0.904193, 0.205791, -0.37428) }, + Normal { normal: (-0.921879, -0.0663697, -0.381752) }, + Normal { normal: (-0.646802, 0.404096, -0.646802) }, + Normal { normal: (-0.665655, 0.337351, -0.665655) }, + Normal { normal: (-0.691923, 0.20612, -0.691923) }, + Normal { normal: (-0.705542, -0.0664796, -0.705543) }, + Normal { normal: (-0.349835, 0.403546, -0.845438) }, + Normal { normal: (-0.360047, 0.336859, -0.869996) }, + Normal { normal: (-0.37428, 0.205791, -0.904193) }, + Normal { normal: (-0.381752, -0.0663697, -0.921879) }, + Normal { normal: (0.0, 0.402725, -0.915321) }, + Normal { normal: (-0.0, 0.336151, -0.941808) }, + Normal { normal: (0.0, 0.205342, -0.97869) }, + Normal { normal: (0.0, -0.0662397, -0.997804) }, + Normal { normal: (0.349835, 0.403546, -0.845438) }, + Normal { normal: (0.360047, 0.336859, -0.869996) }, + Normal { normal: (0.37428, 0.205791, -0.904193) }, + Normal { normal: (0.381752, -0.0663697, -0.921879) }, + Normal { normal: (0.646802, 0.404096, -0.646802) }, + Normal { normal: (0.665655, 0.337351, -0.665655) }, + Normal { normal: (0.691923, 0.20612, -0.691923) }, + Normal { normal: (0.705543, -0.0664796, -0.705542) }, + Normal { normal: (0.845438, 0.403546, -0.349835) }, + Normal { normal: (0.869996, 0.336859, -0.360047) }, + Normal { normal: (0.904193, 0.205791, -0.37428) }, + Normal { normal: (0.921879, -0.0663697, -0.381752) }, + Normal { normal: (0.900182, -0.435513, -0.0) }, + Normal { normal: (0.729611, -0.683863, -0.0) }, + Normal { normal: (0.693951, -0.720022, -0.0) }, + Normal { normal: (0.79395, -0.607984, 0.0) }, + Normal { normal: (0.831437, -0.43618, 0.344179) }, + Normal { normal: (0.673512, -0.684665, 0.278594) }, + Normal { normal: (0.640399, -0.720924, 0.264874) }, + Normal { normal: (0.732949, -0.608996, 0.303166) }, + Normal { normal: (0.636092, -0.436777, 0.636092) }, + Normal { normal: (0.514965, -0.685289, 0.514965) }, + Normal { normal: (0.489651, -0.721446, 0.489651) }, + Normal { normal: (0.560555, -0.609554, 0.560555) }, + Normal { normal: (0.344179, -0.43618, 0.831437) }, + Normal { normal: (0.278594, -0.684665, 0.673512) }, + Normal { normal: (0.264874, -0.720924, 0.640399) }, + Normal { normal: (0.303166, -0.608996, 0.732949) }, + Normal { normal: (0.0, -0.435513, 0.900182) }, + Normal { normal: (-0.0, -0.683863, 0.729611) }, + Normal { normal: (0.0, -0.720022, 0.693951) }, + Normal { normal: (-0.0, -0.607984, 0.79395) }, + Normal { normal: (-0.344179, -0.43618, 0.831437) }, + Normal { normal: (-0.278594, -0.684665, 0.673512) }, + Normal { normal: (-0.264874, -0.720924, 0.640399) }, + Normal { normal: (-0.303166, -0.608996, 0.732949) }, + Normal { normal: (-0.636092, -0.436777, 0.636092) }, + Normal { normal: (-0.514965, -0.685289, 0.514965) }, + Normal { normal: (-0.489651, -0.721446, 0.489651) }, + Normal { normal: (-0.560555, -0.609554, 0.560555) }, + Normal { normal: (-0.831437, -0.43618, 0.344179) }, + Normal { normal: (-0.673512, -0.684665, 0.278595) }, + Normal { normal: (-0.640399, -0.720924, 0.264874) }, + Normal { normal: (-0.732949, -0.608996, 0.303166) }, + Normal { normal: (-0.900182, -0.435513, -0.0) }, + Normal { normal: (-0.729611, -0.683863, -0.0) }, + Normal { normal: (-0.693951, -0.720022, 0.0) }, + Normal { normal: (-0.79395, -0.607983, -0.0) }, + Normal { normal: (-0.831437, -0.43618, -0.344179) }, + Normal { normal: (-0.673512, -0.684665, -0.278594) }, + Normal { normal: (-0.640399, -0.720924, -0.264874) }, + Normal { normal: (-0.732949, -0.608996, -0.303166) }, + Normal { normal: (-0.636092, -0.436777, -0.636092) }, + Normal { normal: (-0.514965, -0.685289, -0.514965) }, + Normal { normal: (-0.489651, -0.721446, -0.489651) }, + Normal { normal: (-0.560555, -0.609554, -0.560555) }, + Normal { normal: (-0.344179, -0.43618, -0.831437) }, + Normal { normal: (-0.278594, -0.684665, -0.673512) }, + Normal { normal: (-0.264874, -0.720924, -0.640399) }, + Normal { normal: (-0.303166, -0.608996, -0.732949) }, + Normal { normal: (-0.0, -0.435513, -0.900182) }, + Normal { normal: (0.0, -0.683863, -0.729611) }, + Normal { normal: (-0.0, -0.720022, -0.693951) }, + Normal { normal: (0.0, -0.607984, -0.79395) }, + Normal { normal: (0.344179, -0.43618, -0.831437) }, + Normal { normal: (0.278594, -0.684665, -0.673512) }, + Normal { normal: (0.264874, -0.720924, -0.640399) }, + Normal { normal: (0.303167, -0.608996, -0.732949) }, + Normal { normal: (0.636092, -0.436777, -0.636092) }, + Normal { normal: (0.514965, -0.685289, -0.514965) }, + Normal { normal: (0.489651, -0.721446, -0.489651) }, + Normal { normal: (0.560555, -0.609554, -0.560555) }, + Normal { normal: (0.831437, -0.43618, -0.344179) }, + Normal { normal: (0.673512, -0.684665, -0.278595) }, + Normal { normal: (0.640399, -0.720924, -0.264874) }, + Normal { normal: (0.732949, -0.608996, -0.303166) }, + Normal { normal: (0.62386, -0.781536, 0.0) }, + Normal { normal: (0.177291, -0.984159, -0.0) }, + Normal { normal: (0.0492072, -0.998789, 0.0) }, + Normal { normal: (0.0, -1.0, -0.0) }, + Normal { normal: (0.576229, -0.781801, 0.238217) }, + Normal { normal: (0.163629, -0.984208, 0.0675273) }, + Normal { normal: (0.0454217, -0.998792, 0.0187357) }, + Normal { normal: (0.440416, -0.782348, 0.440416) }, + Normal { normal: (0.124903, -0.984276, 0.124903) }, + Normal { normal: (0.0346621, -0.998798, 0.0346621) }, + Normal { normal: (0.238217, -0.781801, 0.576229) }, + Normal { normal: (0.0675273, -0.984208, 0.163629) }, + Normal { normal: (0.0187357, -0.998792, 0.0454217) }, + Normal { normal: (-0.0, -0.781536, 0.62386) }, + Normal { normal: (0.0, -0.984159, 0.177291) }, + Normal { normal: (-0.0, -0.998789, 0.0492072) }, + Normal { normal: (-0.238216, -0.781801, 0.576229) }, + Normal { normal: (-0.0675273, -0.984208, 0.163629) }, + Normal { normal: (-0.0187357, -0.998792, 0.0454217) }, + Normal { normal: (-0.440416, -0.782348, 0.440416) }, + Normal { normal: (-0.124903, -0.984276, 0.124903) }, + Normal { normal: (-0.0346621, -0.998798, 0.0346621) }, + Normal { normal: (-0.576229, -0.781801, 0.238217) }, + Normal { normal: (-0.163629, -0.984208, 0.0675273) }, + Normal { normal: (-0.0454217, -0.998792, 0.0187357) }, + Normal { normal: (-0.62386, -0.781536, -0.0) }, + Normal { normal: (-0.177291, -0.984159, 0.0) }, + Normal { normal: (-0.0492072, -0.998789, -0.0) }, + Normal { normal: (-0.576229, -0.781801, -0.238217) }, + Normal { normal: (-0.163629, -0.984208, -0.0675273) }, + Normal { normal: (-0.0454217, -0.998792, -0.0187357) }, + Normal { normal: (-0.440416, -0.782348, -0.440416) }, + Normal { normal: (-0.124903, -0.984276, -0.124903) }, + Normal { normal: (-0.0346621, -0.998798, -0.0346621) }, + Normal { normal: (-0.238217, -0.781801, -0.576229) }, + Normal { normal: (-0.0675273, -0.984208, -0.163629) }, + Normal { normal: (-0.0187357, -0.998792, -0.0454217) }, + Normal { normal: (0.0, -0.781536, -0.62386) }, + Normal { normal: (-0.0, -0.984159, -0.177291) }, + Normal { normal: (0.0, -0.998789, -0.0492072) }, + Normal { normal: (0.238217, -0.781801, -0.576229) }, + Normal { normal: (0.0675273, -0.984208, -0.163629) }, + Normal { normal: (0.0187357, -0.998792, -0.0454217) }, + Normal { normal: (0.440416, -0.782348, -0.440416) }, + Normal { normal: (0.124903, -0.984276, -0.124903) }, + Normal { normal: (0.0346621, -0.998798, -0.0346621) }, + Normal { normal: (0.576229, -0.781801, -0.238217) }, + Normal { normal: (0.163629, -0.984208, -0.0675273) }, + Normal { normal: (0.0454217, -0.998792, -0.0187357) }, + Normal { normal: (0.00778619, -0.99997, -0.000215809) }, + Normal { normal: (0.0391385, -0.999233, -0.000988567) }, + Normal { normal: (0.179511, -0.983746, -0.00436856) }, + Normal { normal: (0.6123, -0.790556, -0.0104598) }, + Normal { normal: (0.986152, -0.165707, -0.00666949) }, + Normal { normal: (0.00703893, -0.812495, 0.582926) }, + Normal { normal: (0.0361273, -0.837257, 0.545614) }, + Normal { normal: (0.161845, -0.810421, 0.563048) }, + Normal { normal: (0.482365, -0.595148, 0.642746) }, + Normal { normal: (0.73872, -0.114593, 0.664199) }, + Normal { normal: (-0.00190867, 0.162121, 0.986769) }, + Normal { normal: (0.0027616, 0.0171073, 0.99985) }, + Normal { normal: (0.0105326, 0.0733989, 0.997247) }, + Normal { normal: (-0.0660406, 0.130069, 0.989303) }, + Normal { normal: (-0.0944272, 0.0165946, 0.995393) }, + Normal { normal: (-0.009203, 0.871509, 0.490293) }, + Normal { normal: (-0.0486064, 0.840609, 0.539457) }, + Normal { normal: (-0.223298, 0.802881, 0.552739) }, + Normal { normal: (-0.596365, 0.559971, 0.575135) }, + Normal { normal: (-0.803337, 0.0682361, 0.591602) }, + Normal { normal: (-0.0105609, 0.999944, 0.000103364) }, + Normal { normal: (-0.0587986, 0.99827, 0.000709759) }, + Normal { normal: (-0.28071, 0.959787, 0.00326876) }, + Normal { normal: (-0.749723, 0.661738, 0.0042684) }, + Normal { normal: (-0.997351, 0.0727144, 0.00205923) }, + Normal { normal: (-0.00879197, 0.871493, -0.49033) }, + Normal { normal: (-0.0464937, 0.841178, -0.538756) }, + Normal { normal: (-0.217909, 0.806807, -0.549161) }, + Normal { normal: (-0.597291, 0.560026, -0.574121) }, + Normal { normal: (-0.804, 0.0629127, -0.591291) }, + Normal { normal: (-0.00180555, 0.161691, -0.98684) }, + Normal { normal: (0.00203087, 0.014555, -0.999892) }, + Normal { normal: (0.00921499, 0.0600698, -0.998152) }, + Normal { normal: (-0.0593333, 0.113865, -0.991723) }, + Normal { normal: (-0.0868992, 0.0122903, -0.996141) }, + Normal { normal: (0.00641779, -0.812379, -0.583094) }, + Normal { normal: (0.0337833, -0.837512, -0.545373) }, + Normal { normal: (0.157112, -0.811947, -0.56219) }, + Normal { normal: (0.484407, -0.589365, -0.646528) }, + Normal { normal: (0.73887, -0.10132, -0.666187) }, + Normal { normal: (0.946512, 0.32265, -0.0033571) }, + Normal { normal: (0.82583, 0.56387, -0.00745213) }, + Normal { normal: (0.650011, 0.759893, -0.00693681) }, + Normal { normal: (0.532429, 0.846458, -0.00524544) }, + Normal { normal: (0.725608, 0.259351, 0.637362) }, + Normal { normal: (0.645945, 0.461988, 0.607719) }, + Normal { normal: (0.531614, 0.63666, 0.558615) }, + Normal { normal: (0.424964, 0.681717, 0.59554) }, + Normal { normal: (-0.0495616, -0.019755, 0.998576) }, + Normal { normal: (-0.0378162, -0.0356243, 0.99865) }, + Normal { normal: (-0.0379139, -0.0365122, 0.998614) }, + Normal { normal: (-0.168854, -0.297946, 0.93953) }, + Normal { normal: (-0.742342, -0.299166, 0.599523) }, + Normal { normal: (-0.619602, -0.529406, 0.579503) }, + Normal { normal: (-0.483708, -0.685761, 0.543837) }, + Normal { normal: (-0.445293, -0.794355, 0.413176) }, + Normal { normal: (-0.926513, -0.376257, 0.00199587) }, + Normal { normal: (-0.75392, -0.656952, 0.00431723) }, + Normal { normal: (-0.566224, -0.824244, 0.00346105) }, + Normal { normal: (-0.481804, -0.876277, 0.00185047) }, + Normal { normal: (-0.744675, -0.294424, -0.598977) }, + Normal { normal: (-0.621949, -0.528114, -0.578165) }, + Normal { normal: (-0.481171, -0.68834, -0.542828) }, + Normal { normal: (-0.438055, -0.797035, -0.415744) }, + Normal { normal: (-0.0443368, -0.0170558, -0.998871) }, + Normal { normal: (-0.0261761, -0.0281665, -0.99926) }, + Normal { normal: (-0.0252939, -0.0283323, -0.999278) }, + Normal { normal: (-0.157482, -0.289392, -0.944167) }, + Normal { normal: (0.728244, 0.25241, -0.637142) }, + Normal { normal: (0.647055, 0.459725, -0.608254) }, + Normal { normal: (0.522994, 0.640657, -0.562171) }, + Normal { normal: (0.409978, 0.682857, -0.604669) }, + Normal { normal: (-0.230787, 0.972982, -0.00652338) }, + Normal { normal: (-0.548936, 0.835863, -0.00151111) }, + Normal { normal: (-0.875671, 0.482807, 0.00989278) }, + Normal { normal: (-0.877554, 0.479097, 0.0190923) }, + Normal { normal: (-0.69619, 0.717439, 0.024497) }, + Normal { normal: (-0.152878, 0.687211, 0.71019) }, + Normal { normal: (-0.316721, 0.63775, 0.702113) }, + Normal { normal: (-0.601067, 0.471452, 0.64533) }, + Normal { normal: (-0.635889, 0.44609, 0.6298) }, + Normal { normal: (-0.435746, 0.601008, 0.670011) }, + Normal { normal: (0.111112, -0.0850694, 0.99016) }, + Normal { normal: (0.22331, 0.00654036, 0.974726) }, + Normal { normal: (0.190097, 0.154964, 0.969458) }, + Normal { normal: (0.00527077, 0.189482, 0.98187) }, + Normal { normal: (-0.0117518, 0.246688, 0.969024) }, + Normal { normal: (0.343906, -0.722796, 0.599412) }, + Normal { normal: (0.572489, -0.567656, 0.591627) }, + Normal { normal: (0.787436, -0.256459, 0.560512) }, + Normal { normal: (0.647097, -0.306374, 0.698141) }, + Normal { normal: (0.427528, -0.499343, 0.753576) }, + Normal { normal: (0.410926, -0.911668, 0.00128446) }, + Normal { normal: (0.67152, -0.740986, -0.000899122) }, + Normal { normal: (0.922026, -0.38706, -0.00725269) }, + Normal { normal: (0.84691, -0.531556, -0.0138542) }, + Normal { normal: (0.535925, -0.8442, -0.0105045) }, + Normal { normal: (0.341188, -0.722822, -0.600931) }, + Normal { normal: (0.578664, -0.561139, -0.591838) }, + Normal { normal: (0.784869, -0.25102, -0.566542) }, + Normal { normal: (0.642681, -0.302257, -0.70399) }, + Normal { normal: (0.418589, -0.500042, -0.758117) }, + Normal { normal: (0.115806, -0.0791394, -0.990114) }, + Normal { normal: (0.232811, 0.0125652, -0.972441) }, + Normal { normal: (0.206662, 0.153601, -0.96628) }, + Normal { normal: (0.0244996, 0.161443, -0.986578) }, + Normal { normal: (0.00338193, 0.211115, -0.977455) }, + Normal { normal: (-0.134912, 0.687491, -0.713551) }, + Normal { normal: (-0.31954, 0.633073, -0.705062) }, + Normal { normal: (-0.603902, 0.461442, -0.649903) }, + Normal { normal: (-0.631816, 0.437169, -0.640072) }, + Normal { normal: (-0.424306, 0.612706, -0.66675) }, + Normal { normal: (-0.4258, 0.904753, 0.0108049) }, + Normal { normal: (0.0220472, 0.999756, 0.00162273) }, + Normal { normal: (0.999599, 0.0258705, 0.0115556) }, + Normal { normal: (0.709585, -0.704553, 0.00967183) }, + Normal { normal: (-0.259858, 0.791936, 0.552549) }, + Normal { normal: (0.00953916, 0.99972, -0.0216718) }, + Normal { normal: (0.410156, 0.332912, -0.849083) }, + Normal { normal: (0.541523, -0.54862, -0.637) }, + Normal { normal: (0.0463104, 0.455224, 0.889172) }, + Normal { normal: (-0.0106883, 0.988794, 0.148901) }, + Normal { normal: (-0.0443756, 0.682947, -0.729118) }, + Normal { normal: (0.122825, 0.00923214, -0.992385) }, + Normal { normal: (0.481839, -0.180439, 0.85748) }, + Normal { normal: (0.455272, 0.736752, 0.499925) }, + Normal { normal: (-0.220542, 0.907193, -0.358276) }, + Normal { normal: (-0.23592, 0.657249, -0.715797) }, + Normal { normal: (0.728092, -0.685302, -0.0155853) }, + Normal { normal: (0.888739, 0.45811, -0.0166791) }, + Normal { normal: (-0.260097, 0.965582, 0.000800195) }, + Normal { normal: (-0.371612, 0.928378, -0.00441745) }, + Normal { normal: (0.480166, -0.17836, -0.858853) }, + Normal { normal: (0.488103, 0.716801, -0.497947) }, + Normal { normal: (-0.222004, 0.905399, 0.361893) }, + Normal { normal: (-0.235405, 0.66318, 0.710477) }, + Normal { normal: (0.0587203, 0.437704, -0.8972) }, + Normal { normal: (0.00132612, 0.986459, -0.164003) }, + Normal { normal: (-0.0441901, 0.681677, 0.730317) }, + Normal { normal: (0.138801, -0.0341896, 0.98973) }, + Normal { normal: (-0.25889, 0.797206, -0.54538) }, + Normal { normal: (0.0122703, 0.999739, 0.0192865) }, + Normal { normal: (0.39863, 0.35489, 0.845663) }, + Normal { normal: (0.537564, -0.5814, 0.610737) }, + Normal { normal: (-0.0, 1.0, 0.0) }, + Normal { normal: (0.82454, 0.565804, 0.0) }, + Normal { normal: (0.917701, -0.397272, 0.0) }, + Normal { normal: (0.935269, -0.353939, 0.000112842) }, + Normal { normal: (0.780712, 0.624891, 0.0) }, + Normal { normal: (0.762641, 0.565035, 0.314825) }, + Normal { normal: (0.847982, -0.397998, 0.350034) }, + Normal { normal: (0.864141, -0.355261, 0.356441) }, + Normal { normal: (0.720991, 0.625625, 0.297933) }, + Normal { normal: (0.583357, 0.565165, 0.583338) }, + Normal { normal: (0.648485, -0.398726, 0.648448) }, + Normal { normal: (0.660872, -0.355894, 0.660748) }, + Normal { normal: (0.551862, 0.62529, 0.55178) }, + Normal { normal: (0.314824, 0.565051, 0.762629) }, + Normal { normal: (0.350045, -0.397976, 0.847988) }, + Normal { normal: (0.356474, -0.3552, 0.864153) }, + Normal { normal: (0.297983, 0.625515, 0.721067) }, + Normal { normal: (-0.0, 0.565804, 0.82454) }, + Normal { normal: (-0.0, -0.397272, 0.917701) }, + Normal { normal: (-0.000112839, -0.353939, 0.935269) }, + Normal { normal: (-0.0, 0.624891, 0.780712) }, + Normal { normal: (-0.314825, 0.565035, 0.762641) }, + Normal { normal: (-0.350034, -0.397998, 0.847982) }, + Normal { normal: (-0.356441, -0.355261, 0.864141) }, + Normal { normal: (-0.297933, 0.625625, 0.720991) }, + Normal { normal: (-0.583338, 0.565165, 0.583357) }, + Normal { normal: (-0.648448, -0.398726, 0.648485) }, + Normal { normal: (-0.660748, -0.355894, 0.660872) }, + Normal { normal: (-0.55178, 0.62529, 0.551862) }, + Normal { normal: (-0.762629, 0.565051, 0.314824) }, + Normal { normal: (-0.847988, -0.397976, 0.350045) }, + Normal { normal: (-0.864153, -0.3552, 0.356474) }, + Normal { normal: (-0.721067, 0.625515, 0.297983) }, + Normal { normal: (-0.82454, 0.565804, -0.0) }, + Normal { normal: (-0.917701, -0.397272, -0.0) }, + Normal { normal: (-0.935269, -0.353939, -0.000112839) }, + Normal { normal: (-0.780712, 0.624891, -0.0) }, + Normal { normal: (-0.76264, 0.565035, -0.314825) }, + Normal { normal: (-0.847982, -0.397998, -0.350034) }, + Normal { normal: (-0.864141, -0.355261, -0.356441) }, + Normal { normal: (-0.720991, 0.625625, -0.297933) }, + Normal { normal: (-0.583357, 0.565165, -0.583338) }, + Normal { normal: (-0.648485, -0.398726, -0.648448) }, + Normal { normal: (-0.660872, -0.355894, -0.660748) }, + Normal { normal: (-0.551862, 0.62529, -0.55178) }, + Normal { normal: (-0.314824, 0.565051, -0.762629) }, + Normal { normal: (-0.350045, -0.397976, -0.847988) }, + Normal { normal: (-0.356474, -0.3552, -0.864153) }, + Normal { normal: (-0.297983, 0.625515, -0.721067) }, + Normal { normal: (0.0, 0.565804, -0.82454) }, + Normal { normal: (0.0, -0.397272, -0.917701) }, + Normal { normal: (0.000112839, -0.353939, -0.935269) }, + Normal { normal: (0.0, 0.624891, -0.780712) }, + Normal { normal: (0.314825, 0.565035, -0.762641) }, + Normal { normal: (0.350034, -0.397998, -0.847982) }, + Normal { normal: (0.356441, -0.355261, -0.864141) }, + Normal { normal: (0.297933, 0.625625, -0.720991) }, + Normal { normal: (0.583338, 0.565165, -0.583357) }, + Normal { normal: (0.648448, -0.398726, -0.648485) }, + Normal { normal: (0.660748, -0.355894, -0.660872) }, + Normal { normal: (0.55178, 0.62529, -0.551862) }, + Normal { normal: (0.762629, 0.565051, -0.314824) }, + Normal { normal: (0.847988, -0.397976, -0.350045) }, + Normal { normal: (0.864153, -0.3552, -0.356474) }, + Normal { normal: (0.721067, 0.625515, -0.297983) }, + Normal { normal: (0.236584, 0.971611, 0.0) }, + Normal { normal: (0.173084, 0.984907, -0.0) }, + Normal { normal: (0.379703, 0.925108, 0.0) }, + Normal { normal: (0.526673, 0.850068, 0.0) }, + Normal { normal: (0.217978, 0.971775, 0.0902162) }, + Normal { normal: (0.15959, 0.984977, 0.0659615) }, + Normal { normal: (0.350498, 0.925312, 0.14474) }, + Normal { normal: (0.48559, 0.850653, 0.201474) }, + Normal { normal: (0.166631, 0.971838, 0.166631) }, + Normal { normal: (0.121908, 0.985026, 0.121908) }, + Normal { normal: (0.267668, 0.925585, 0.267668) }, + Normal { normal: (0.371315, 0.851029, 0.371315) }, + Normal { normal: (0.0902162, 0.971775, 0.217978) }, + Normal { normal: (0.0659615, 0.984977, 0.15959) }, + Normal { normal: (0.14474, 0.925312, 0.350498) }, + Normal { normal: (0.201474, 0.850653, 0.48559) }, + Normal { normal: (-0.0, 0.971611, 0.236584) }, + Normal { normal: (0.0, 0.984907, 0.173084) }, + Normal { normal: (0.0, 0.925108, 0.379703) }, + Normal { normal: (0.0, 0.850068, 0.526673) }, + Normal { normal: (-0.0902162, 0.971775, 0.217978) }, + Normal { normal: (-0.0659615, 0.984977, 0.15959) }, + Normal { normal: (-0.14474, 0.925312, 0.350498) }, + Normal { normal: (-0.201474, 0.850653, 0.48559) }, + Normal { normal: (-0.166631, 0.971838, 0.166631) }, + Normal { normal: (-0.121908, 0.985026, 0.121908) }, + Normal { normal: (-0.267668, 0.925585, 0.267668) }, + Normal { normal: (-0.371315, 0.851029, 0.371315) }, + Normal { normal: (-0.217978, 0.971775, 0.0902162) }, + Normal { normal: (-0.15959, 0.984977, 0.0659615) }, + Normal { normal: (-0.350498, 0.925312, 0.14474) }, + Normal { normal: (-0.48559, 0.850653, 0.201474) }, + Normal { normal: (-0.236583, 0.971611, -0.0) }, + Normal { normal: (-0.173084, 0.984907, 0.0) }, + Normal { normal: (-0.379703, 0.925108, -0.0) }, + Normal { normal: (-0.526673, 0.850068, 0.0) }, + Normal { normal: (-0.217978, 0.971775, -0.0902162) }, + Normal { normal: (-0.15959, 0.984977, -0.0659615) }, + Normal { normal: (-0.350498, 0.925312, -0.14474) }, + Normal { normal: (-0.48559, 0.850653, -0.201474) }, + Normal { normal: (-0.166631, 0.971838, -0.166631) }, + Normal { normal: (-0.121908, 0.985026, -0.121908) }, + Normal { normal: (-0.267668, 0.925585, -0.267668) }, + Normal { normal: (-0.371315, 0.851029, -0.371315) }, + Normal { normal: (-0.0902162, 0.971775, -0.217978) }, + Normal { normal: (-0.0659615, 0.984977, -0.15959) }, + Normal { normal: (-0.14474, 0.925312, -0.350498) }, + Normal { normal: (-0.201474, 0.850653, -0.485589) }, + Normal { normal: (0.0, 0.971611, -0.236584) }, + Normal { normal: (-0.0, 0.984907, -0.173084) }, + Normal { normal: (-0.0, 0.925108, -0.379703) }, + Normal { normal: (-0.0, 0.850068, -0.526673) }, + Normal { normal: (0.0902162, 0.971775, -0.217978) }, + Normal { normal: (0.0659615, 0.984977, -0.15959) }, + Normal { normal: (0.14474, 0.925312, -0.350498) }, + Normal { normal: (0.201474, 0.850653, -0.48559) }, + Normal { normal: (0.166631, 0.971838, -0.166631) }, + Normal { normal: (0.121908, 0.985026, -0.121908) }, + Normal { normal: (0.267668, 0.925585, -0.267668) }, + Normal { normal: (0.371315, 0.851029, -0.371315) }, + Normal { normal: (0.217978, 0.971775, -0.0902162) }, + Normal { normal: (0.15959, 0.984977, -0.0659615) }, + Normal { normal: (0.350498, 0.925312, -0.14474) }, + Normal { normal: (0.48559, 0.850653, -0.201474) }, +]; + +pub const INDICES: [u16; 3072] = [ + 7, 6, 1, + 1, 2, 7, + 8, 7, 2, + 2, 3, 8, + 9, 8, 3, + 3, 4, 9, + 10, 9, 4, + 4, 5, 10, + 12, 11, 6, + 6, 7, 12, + 13, 12, 7, + 7, 8, 13, + 14, 13, 8, + 8, 9, 14, + 15, 14, 9, + 9, 10, 15, + 17, 16, 11, + 11, 12, 17, + 18, 17, 12, + 12, 13, 18, + 19, 18, 13, + 13, 14, 19, + 20, 19, 14, + 14, 15, 20, + 22, 21, 16, + 16, 17, 22, + 23, 22, 17, + 17, 18, 23, + 24, 23, 18, + 18, 19, 24, + 25, 24, 19, + 19, 20, 25, + 27, 26, 21, + 21, 22, 27, + 28, 27, 22, + 22, 23, 28, + 29, 28, 23, + 23, 24, 29, + 30, 29, 24, + 24, 25, 30, + 32, 31, 26, + 26, 27, 32, + 33, 32, 27, + 27, 28, 33, + 34, 33, 28, + 28, 29, 34, + 35, 34, 29, + 29, 30, 35, + 37, 36, 31, + 31, 32, 37, + 38, 37, 32, + 32, 33, 38, + 39, 38, 33, + 33, 34, 39, + 40, 39, 34, + 34, 35, 40, + 42, 41, 36, + 36, 37, 42, + 43, 42, 37, + 37, 38, 43, + 44, 43, 38, + 38, 39, 44, + 45, 44, 39, + 39, 40, 45, + 47, 46, 41, + 41, 42, 47, + 48, 47, 42, + 42, 43, 48, + 49, 48, 43, + 43, 44, 49, + 50, 49, 44, + 44, 45, 50, + 52, 51, 46, + 46, 47, 52, + 53, 52, 47, + 47, 48, 53, + 54, 53, 48, + 48, 49, 54, + 55, 54, 49, + 49, 50, 55, + 57, 56, 51, + 51, 52, 57, + 58, 57, 52, + 52, 53, 58, + 59, 58, 53, + 53, 54, 59, + 60, 59, 54, + 54, 55, 60, + 62, 61, 56, + 56, 57, 62, + 63, 62, 57, + 57, 58, 63, + 64, 63, 58, + 58, 59, 64, + 65, 64, 59, + 59, 60, 65, + 67, 66, 61, + 61, 62, 67, + 68, 67, 62, + 62, 63, 68, + 69, 68, 63, + 63, 64, 69, + 70, 69, 64, + 64, 65, 70, + 72, 71, 66, + 66, 67, 72, + 73, 72, 67, + 67, 68, 73, + 74, 73, 68, + 68, 69, 74, + 75, 74, 69, + 69, 70, 75, + 77, 76, 71, + 71, 72, 77, + 78, 77, 72, + 72, 73, 78, + 79, 78, 73, + 73, 74, 79, + 80, 79, 74, + 74, 75, 80, + 2, 1, 76, + 76, 77, 2, + 3, 2, 77, + 77, 78, 3, + 4, 3, 78, + 78, 79, 4, + 5, 4, 79, + 79, 80, 5, + 85, 10, 5, + 5, 81, 85, + 86, 85, 81, + 81, 82, 86, + 87, 86, 82, + 82, 83, 87, + 88, 87, 83, + 83, 84, 88, + 89, 15, 10, + 10, 85, 89, + 90, 89, 85, + 85, 86, 90, + 91, 90, 86, + 86, 87, 91, + 92, 91, 87, + 87, 88, 92, + 93, 20, 15, + 15, 89, 93, + 94, 93, 89, + 89, 90, 94, + 95, 94, 90, + 90, 91, 95, + 96, 95, 91, + 91, 92, 96, + 97, 25, 20, + 20, 93, 97, + 98, 97, 93, + 93, 94, 98, + 99, 98, 94, + 94, 95, 99, + 100, 99, 95, + 95, 96, 100, + 101, 30, 25, + 25, 97, 101, + 102, 101, 97, + 97, 98, 102, + 103, 102, 98, + 98, 99, 103, + 104, 103, 99, + 99, 100, 104, + 105, 35, 30, + 30, 101, 105, + 106, 105, 101, + 101, 102, 106, + 107, 106, 102, + 102, 103, 107, + 108, 107, 103, + 103, 104, 108, + 109, 40, 35, + 35, 105, 109, + 110, 109, 105, + 105, 106, 110, + 111, 110, 106, + 106, 107, 111, + 112, 111, 107, + 107, 108, 112, + 113, 45, 40, + 40, 109, 113, + 114, 113, 109, + 109, 110, 114, + 115, 114, 110, + 110, 111, 115, + 116, 115, 111, + 111, 112, 116, + 117, 50, 45, + 45, 113, 117, + 118, 117, 113, + 113, 114, 118, + 119, 118, 114, + 114, 115, 119, + 120, 119, 115, + 115, 116, 120, + 121, 55, 50, + 50, 117, 121, + 122, 121, 117, + 117, 118, 122, + 123, 122, 118, + 118, 119, 123, + 124, 123, 119, + 119, 120, 124, + 125, 60, 55, + 55, 121, 125, + 126, 125, 121, + 121, 122, 126, + 127, 126, 122, + 122, 123, 127, + 128, 127, 123, + 123, 124, 128, + 129, 65, 60, + 60, 125, 129, + 130, 129, 125, + 125, 126, 130, + 131, 130, 126, + 126, 127, 131, + 132, 131, 127, + 127, 128, 132, + 133, 70, 65, + 65, 129, 133, + 134, 133, 129, + 129, 130, 134, + 135, 134, 130, + 130, 131, 135, + 136, 135, 131, + 131, 132, 136, + 137, 75, 70, + 70, 133, 137, + 138, 137, 133, + 133, 134, 138, + 139, 138, 134, + 134, 135, 139, + 140, 139, 135, + 135, 136, 140, + 141, 80, 75, + 75, 137, 141, + 142, 141, 137, + 137, 138, 142, + 143, 142, 138, + 138, 139, 143, + 144, 143, 139, + 139, 140, 144, + 81, 5, 80, + 80, 141, 81, + 82, 81, 141, + 141, 142, 82, + 83, 82, 142, + 142, 143, 83, + 84, 83, 143, + 143, 144, 84, + 149, 88, 84, + 84, 145, 149, + 150, 149, 145, + 145, 146, 150, + 151, 150, 146, + 146, 147, 151, + 152, 151, 147, + 147, 148, 152, + 153, 92, 88, + 88, 149, 153, + 154, 153, 149, + 149, 150, 154, + 155, 154, 150, + 150, 151, 155, + 156, 155, 151, + 151, 152, 156, + 157, 96, 92, + 92, 153, 157, + 158, 157, 153, + 153, 154, 158, + 159, 158, 154, + 154, 155, 159, + 160, 159, 155, + 155, 156, 160, + 161, 100, 96, + 96, 157, 161, + 162, 161, 157, + 157, 158, 162, + 163, 162, 158, + 158, 159, 163, + 164, 163, 159, + 159, 160, 164, + 165, 104, 100, + 100, 161, 165, + 166, 165, 161, + 161, 162, 166, + 167, 166, 162, + 162, 163, 167, + 168, 167, 163, + 163, 164, 168, + 169, 108, 104, + 104, 165, 169, + 170, 169, 165, + 165, 166, 170, + 171, 170, 166, + 166, 167, 171, + 172, 171, 167, + 167, 168, 172, + 173, 112, 108, + 108, 169, 173, + 174, 173, 169, + 169, 170, 174, + 175, 174, 170, + 170, 171, 175, + 176, 175, 171, + 171, 172, 176, + 177, 116, 112, + 112, 173, 177, + 178, 177, 173, + 173, 174, 178, + 179, 178, 174, + 174, 175, 179, + 180, 179, 175, + 175, 176, 180, + 181, 120, 116, + 116, 177, 181, + 182, 181, 177, + 177, 178, 182, + 183, 182, 178, + 178, 179, 183, + 184, 183, 179, + 179, 180, 184, + 185, 124, 120, + 120, 181, 185, + 186, 185, 181, + 181, 182, 186, + 187, 186, 182, + 182, 183, 187, + 188, 187, 183, + 183, 184, 188, + 189, 128, 124, + 124, 185, 189, + 190, 189, 185, + 185, 186, 190, + 191, 190, 186, + 186, 187, 191, + 192, 191, 187, + 187, 188, 192, + 193, 132, 128, + 128, 189, 193, + 194, 193, 189, + 189, 190, 194, + 195, 194, 190, + 190, 191, 195, + 196, 195, 191, + 191, 192, 196, + 197, 136, 132, + 132, 193, 197, + 198, 197, 193, + 193, 194, 198, + 199, 198, 194, + 194, 195, 199, + 200, 199, 195, + 195, 196, 200, + 201, 140, 136, + 136, 197, 201, + 202, 201, 197, + 197, 198, 202, + 203, 202, 198, + 198, 199, 203, + 204, 203, 199, + 199, 200, 204, + 205, 144, 140, + 140, 201, 205, + 206, 205, 201, + 201, 202, 206, + 207, 206, 202, + 202, 203, 207, + 208, 207, 203, + 203, 204, 208, + 145, 84, 144, + 144, 205, 145, + 146, 145, 205, + 205, 206, 146, + 147, 146, 206, + 206, 207, 147, + 148, 147, 207, + 207, 208, 148, + 213, 152, 148, + 148, 209, 213, + 214, 213, 209, + 209, 210, 214, + 215, 214, 210, + 210, 211, 215, + 212, 215, 211, + 211, 212, 212, + 216, 156, 152, + 152, 213, 216, + 217, 216, 213, + 213, 214, 217, + 218, 217, 214, + 214, 215, 218, + 212, 218, 215, + 215, 212, 212, + 219, 160, 156, + 156, 216, 219, + 220, 219, 216, + 216, 217, 220, + 221, 220, 217, + 217, 218, 221, + 212, 221, 218, + 218, 212, 212, + 222, 164, 160, + 160, 219, 222, + 223, 222, 219, + 219, 220, 223, + 224, 223, 220, + 220, 221, 224, + 212, 224, 221, + 221, 212, 212, + 225, 168, 164, + 164, 222, 225, + 226, 225, 222, + 222, 223, 226, + 227, 226, 223, + 223, 224, 227, + 212, 227, 224, + 224, 212, 212, + 228, 172, 168, + 168, 225, 228, + 229, 228, 225, + 225, 226, 229, + 230, 229, 226, + 226, 227, 230, + 212, 230, 227, + 227, 212, 212, + 231, 176, 172, + 172, 228, 231, + 232, 231, 228, + 228, 229, 232, + 233, 232, 229, + 229, 230, 233, + 212, 233, 230, + 230, 212, 212, + 234, 180, 176, + 176, 231, 234, + 235, 234, 231, + 231, 232, 235, + 236, 235, 232, + 232, 233, 236, + 212, 236, 233, + 233, 212, 212, + 237, 184, 180, + 180, 234, 237, + 238, 237, 234, + 234, 235, 238, + 239, 238, 235, + 235, 236, 239, + 212, 239, 236, + 236, 212, 212, + 240, 188, 184, + 184, 237, 240, + 241, 240, 237, + 237, 238, 241, + 242, 241, 238, + 238, 239, 242, + 212, 242, 239, + 239, 212, 212, + 243, 192, 188, + 188, 240, 243, + 244, 243, 240, + 240, 241, 244, + 245, 244, 241, + 241, 242, 245, + 212, 245, 242, + 242, 212, 212, + 246, 196, 192, + 192, 243, 246, + 247, 246, 243, + 243, 244, 247, + 248, 247, 244, + 244, 245, 248, + 212, 248, 245, + 245, 212, 212, + 249, 200, 196, + 196, 246, 249, + 250, 249, 246, + 246, 247, 250, + 251, 250, 247, + 247, 248, 251, + 212, 251, 248, + 248, 212, 212, + 252, 204, 200, + 200, 249, 252, + 253, 252, 249, + 249, 250, 253, + 254, 253, 250, + 250, 251, 254, + 212, 254, 251, + 251, 212, 212, + 255, 208, 204, + 204, 252, 255, + 256, 255, 252, + 252, 253, 256, + 257, 256, 253, + 253, 254, 257, + 212, 257, 254, + 254, 212, 212, + 209, 148, 208, + 208, 255, 209, + 210, 209, 255, + 255, 256, 210, + 211, 210, 256, + 256, 257, 211, + 212, 211, 257, + 257, 212, 212, + 264, 263, 258, + 258, 259, 264, + 265, 264, 259, + 259, 260, 265, + 266, 265, 260, + 260, 261, 266, + 267, 266, 261, + 261, 262, 267, + 269, 268, 263, + 263, 264, 269, + 270, 269, 264, + 264, 265, 270, + 271, 270, 265, + 265, 266, 271, + 272, 271, 266, + 266, 267, 272, + 274, 273, 268, + 268, 269, 274, + 275, 274, 269, + 269, 270, 275, + 276, 275, 270, + 270, 271, 276, + 277, 276, 271, + 271, 272, 277, + 279, 278, 273, + 273, 274, 279, + 280, 279, 274, + 274, 275, 280, + 281, 280, 275, + 275, 276, 281, + 282, 281, 276, + 276, 277, 282, + 284, 283, 278, + 278, 279, 284, + 285, 284, 279, + 279, 280, 285, + 286, 285, 280, + 280, 281, 286, + 287, 286, 281, + 281, 282, 287, + 289, 288, 283, + 283, 284, 289, + 290, 289, 284, + 284, 285, 290, + 291, 290, 285, + 285, 286, 291, + 292, 291, 286, + 286, 287, 292, + 294, 293, 288, + 288, 289, 294, + 295, 294, 289, + 289, 290, 295, + 296, 295, 290, + 290, 291, 296, + 297, 296, 291, + 291, 292, 297, + 259, 258, 293, + 293, 294, 259, + 260, 259, 294, + 294, 295, 260, + 261, 260, 295, + 295, 296, 261, + 262, 261, 296, + 296, 297, 262, + 302, 267, 262, + 262, 298, 302, + 303, 302, 298, + 298, 299, 303, + 304, 303, 299, + 299, 300, 304, + 305, 304, 300, + 300, 301, 305, + 306, 272, 267, + 267, 302, 306, + 307, 306, 302, + 302, 303, 307, + 308, 307, 303, + 303, 304, 308, + 309, 308, 304, + 304, 305, 309, + 310, 277, 272, + 272, 306, 310, + 311, 310, 306, + 306, 307, 311, + 312, 311, 307, + 307, 308, 312, + 313, 312, 308, + 308, 309, 313, + 314, 282, 277, + 277, 310, 314, + 315, 314, 310, + 310, 311, 315, + 316, 315, 311, + 311, 312, 316, + 317, 316, 312, + 312, 313, 317, + 318, 287, 282, + 282, 314, 318, + 319, 318, 314, + 314, 315, 319, + 320, 319, 315, + 315, 316, 320, + 321, 320, 316, + 316, 317, 321, + 322, 292, 287, + 287, 318, 322, + 323, 322, 318, + 318, 319, 323, + 324, 323, 319, + 319, 320, 324, + 325, 324, 320, + 320, 321, 325, + 326, 297, 292, + 292, 322, 326, + 327, 326, 322, + 322, 323, 327, + 328, 327, 323, + 323, 324, 328, + 329, 328, 324, + 324, 325, 329, + 298, 262, 297, + 297, 326, 298, + 299, 298, 326, + 326, 327, 299, + 300, 299, 327, + 327, 328, 300, + 301, 300, 328, + 328, 329, 301, + 336, 335, 330, + 330, 331, 336, + 337, 336, 331, + 331, 332, 337, + 338, 337, 332, + 332, 333, 338, + 339, 338, 333, + 333, 334, 339, + 341, 340, 335, + 335, 336, 341, + 342, 341, 336, + 336, 337, 342, + 343, 342, 337, + 337, 338, 343, + 344, 343, 338, + 338, 339, 344, + 346, 345, 340, + 340, 341, 346, + 347, 346, 341, + 341, 342, 347, + 348, 347, 342, + 342, 343, 348, + 349, 348, 343, + 343, 344, 349, + 351, 350, 345, + 345, 346, 351, + 352, 351, 346, + 346, 347, 352, + 353, 352, 347, + 347, 348, 353, + 354, 353, 348, + 348, 349, 354, + 356, 355, 350, + 350, 351, 356, + 357, 356, 351, + 351, 352, 357, + 358, 357, 352, + 352, 353, 358, + 359, 358, 353, + 353, 354, 359, + 361, 360, 355, + 355, 356, 361, + 362, 361, 356, + 356, 357, 362, + 363, 362, 357, + 357, 358, 363, + 364, 363, 358, + 358, 359, 364, + 366, 365, 360, + 360, 361, 366, + 367, 366, 361, + 361, 362, 367, + 368, 367, 362, + 362, 363, 368, + 369, 368, 363, + 363, 364, 369, + 331, 330, 365, + 365, 366, 331, + 332, 331, 366, + 366, 367, 332, + 333, 332, 367, + 367, 368, 333, + 334, 333, 368, + 368, 369, 334, + 374, 339, 334, + 334, 370, 374, + 375, 374, 370, + 370, 371, 375, + 376, 375, 371, + 371, 372, 376, + 377, 376, 372, + 372, 373, 377, + 378, 344, 339, + 339, 374, 378, + 379, 378, 374, + 374, 375, 379, + 380, 379, 375, + 375, 376, 380, + 381, 380, 376, + 376, 377, 381, + 382, 349, 344, + 344, 378, 382, + 383, 382, 378, + 378, 379, 383, + 384, 383, 379, + 379, 380, 384, + 385, 384, 380, + 380, 381, 385, + 386, 354, 349, + 349, 382, 386, + 387, 386, 382, + 382, 383, 387, + 388, 387, 383, + 383, 384, 388, + 389, 388, 384, + 384, 385, 389, + 390, 359, 354, + 354, 386, 390, + 391, 390, 386, + 386, 387, 391, + 392, 391, 387, + 387, 388, 392, + 393, 392, 388, + 388, 389, 393, + 394, 364, 359, + 359, 390, 394, + 395, 394, 390, + 390, 391, 395, + 396, 395, 391, + 391, 392, 396, + 397, 396, 392, + 392, 393, 397, + 398, 369, 364, + 364, 394, 398, + 399, 398, 394, + 394, 395, 399, + 400, 399, 395, + 395, 396, 400, + 401, 400, 396, + 396, 397, 401, + 370, 334, 369, + 369, 398, 370, + 371, 370, 398, + 398, 399, 371, + 372, 371, 399, + 399, 400, 372, + 373, 372, 400, + 400, 401, 373, + 407, 402, 402, + 402, 403, 407, + 408, 407, 403, + 403, 404, 408, + 409, 408, 404, + 404, 405, 409, + 410, 409, 405, + 405, 406, 410, + 411, 402, 402, + 402, 407, 411, + 412, 411, 407, + 407, 408, 412, + 413, 412, 408, + 408, 409, 413, + 414, 413, 409, + 409, 410, 414, + 415, 402, 402, + 402, 411, 415, + 416, 415, 411, + 411, 412, 416, + 417, 416, 412, + 412, 413, 417, + 418, 417, 413, + 413, 414, 418, + 419, 402, 402, + 402, 415, 419, + 420, 419, 415, + 415, 416, 420, + 421, 420, 416, + 416, 417, 421, + 422, 421, 417, + 417, 418, 422, + 423, 402, 402, + 402, 419, 423, + 424, 423, 419, + 419, 420, 424, + 425, 424, 420, + 420, 421, 425, + 426, 425, 421, + 421, 422, 426, + 427, 402, 402, + 402, 423, 427, + 428, 427, 423, + 423, 424, 428, + 429, 428, 424, + 424, 425, 429, + 430, 429, 425, + 425, 426, 430, + 431, 402, 402, + 402, 427, 431, + 432, 431, 427, + 427, 428, 432, + 433, 432, 428, + 428, 429, 433, + 434, 433, 429, + 429, 430, 434, + 435, 402, 402, + 402, 431, 435, + 436, 435, 431, + 431, 432, 436, + 437, 436, 432, + 432, 433, 437, + 438, 437, 433, + 433, 434, 438, + 439, 402, 402, + 402, 435, 439, + 440, 439, 435, + 435, 436, 440, + 441, 440, 436, + 436, 437, 441, + 442, 441, 437, + 437, 438, 442, + 443, 402, 402, + 402, 439, 443, + 444, 443, 439, + 439, 440, 444, + 445, 444, 440, + 440, 441, 445, + 446, 445, 441, + 441, 442, 446, + 447, 402, 402, + 402, 443, 447, + 448, 447, 443, + 443, 444, 448, + 449, 448, 444, + 444, 445, 449, + 450, 449, 445, + 445, 446, 450, + 451, 402, 402, + 402, 447, 451, + 452, 451, 447, + 447, 448, 452, + 453, 452, 448, + 448, 449, 453, + 454, 453, 449, + 449, 450, 454, + 455, 402, 402, + 402, 451, 455, + 456, 455, 451, + 451, 452, 456, + 457, 456, 452, + 452, 453, 457, + 458, 457, 453, + 453, 454, 458, + 459, 402, 402, + 402, 455, 459, + 460, 459, 455, + 455, 456, 460, + 461, 460, 456, + 456, 457, 461, + 462, 461, 457, + 457, 458, 462, + 463, 402, 402, + 402, 459, 463, + 464, 463, 459, + 459, 460, 464, + 465, 464, 460, + 460, 461, 465, + 466, 465, 461, + 461, 462, 466, + 403, 402, 402, + 402, 463, 403, + 404, 403, 463, + 463, 464, 404, + 405, 404, 464, + 464, 465, 405, + 406, 405, 465, + 465, 466, 406, + 471, 410, 406, + 406, 467, 471, + 472, 471, 467, + 467, 468, 472, + 473, 472, 468, + 468, 469, 473, + 474, 473, 469, + 469, 470, 474, + 475, 414, 410, + 410, 471, 475, + 476, 475, 471, + 471, 472, 476, + 477, 476, 472, + 472, 473, 477, + 478, 477, 473, + 473, 474, 478, + 479, 418, 414, + 414, 475, 479, + 480, 479, 475, + 475, 476, 480, + 481, 480, 476, + 476, 477, 481, + 482, 481, 477, + 477, 478, 482, + 483, 422, 418, + 418, 479, 483, + 484, 483, 479, + 479, 480, 484, + 485, 484, 480, + 480, 481, 485, + 486, 485, 481, + 481, 482, 486, + 487, 426, 422, + 422, 483, 487, + 488, 487, 483, + 483, 484, 488, + 489, 488, 484, + 484, 485, 489, + 490, 489, 485, + 485, 486, 490, + 491, 430, 426, + 426, 487, 491, + 492, 491, 487, + 487, 488, 492, + 493, 492, 488, + 488, 489, 493, + 494, 493, 489, + 489, 490, 494, + 495, 434, 430, + 430, 491, 495, + 496, 495, 491, + 491, 492, 496, + 497, 496, 492, + 492, 493, 497, + 498, 497, 493, + 493, 494, 498, + 499, 438, 434, + 434, 495, 499, + 500, 499, 495, + 495, 496, 500, + 501, 500, 496, + 496, 497, 501, + 502, 501, 497, + 497, 498, 502, + 503, 442, 438, + 438, 499, 503, + 504, 503, 499, + 499, 500, 504, + 505, 504, 500, + 500, 501, 505, + 506, 505, 501, + 501, 502, 506, + 507, 446, 442, + 442, 503, 507, + 508, 507, 503, + 503, 504, 508, + 509, 508, 504, + 504, 505, 509, + 510, 509, 505, + 505, 506, 510, + 511, 450, 446, + 446, 507, 511, + 512, 511, 507, + 507, 508, 512, + 513, 512, 508, + 508, 509, 513, + 514, 513, 509, + 509, 510, 514, + 515, 454, 450, + 450, 511, 515, + 516, 515, 511, + 511, 512, 516, + 517, 516, 512, + 512, 513, 517, + 518, 517, 513, + 513, 514, 518, + 519, 458, 454, + 454, 515, 519, + 520, 519, 515, + 515, 516, 520, + 521, 520, 516, + 516, 517, 521, + 522, 521, 517, + 517, 518, 522, + 523, 462, 458, + 458, 519, 523, + 524, 523, 519, + 519, 520, 524, + 525, 524, 520, + 520, 521, 525, + 526, 525, 521, + 521, 522, 526, + 527, 466, 462, + 462, 523, 527, + 528, 527, 523, + 523, 524, 528, + 529, 528, 524, + 524, 525, 529, + 530, 529, 525, + 525, 526, 530, + 467, 406, 466, + 466, 527, 467, + 468, 467, 527, + 527, 528, 468, + 469, 468, 528, + 528, 529, 469, + 470, 469, 529, + 529, 530, 470u16, +]; diff --git a/src/time.rs b/src/time.rs new file mode 100644 index 0000000..5e8159b --- /dev/null +++ b/src/time.rs @@ -0,0 +1,34 @@ +use std::time::{Duration, Instant}; + +#[derive(Clone, Debug)] +pub struct Time { + last: Instant, + delta: Duration, + total: Duration, +} + +impl Time { + pub fn new() -> Self { + let now = Instant::now(); + Self { + last: now, + delta: Duration::ZERO, + total: Duration::ZERO, + } + } + + pub fn tick(&mut self) { + let now = Instant::now(); + self.delta = now - self.last; + self.total += self.delta; + self.last = now; + } + + pub fn delta_seconds(&self) -> f32 { + self.delta.as_secs_f32() + } + + pub fn total_seconds(&self) -> f32 { + self.total.as_secs_f32() + } +} \ No newline at end of file diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 0000000..c6be88a --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,84 @@ +use std::time::Instant; + +use anyhow::Result; +use imgui::{Context as ImguiContext, Ui}; +use imgui_winit_support::{HiDpiMode, WinitPlatform}; +use imgui_glium_renderer::Renderer as ImguiGliumRenderer; +use winit::window::Window; +use glium::{Frame}; +use glium::glutin::surface::WindowSurface; + +/// Convenience wrapper that owns all ImGui state required for integration with +/// winit + glium. +pub struct Gui { + imgui: ImguiContext, + platform: WinitPlatform, + renderer: ImguiGliumRenderer, + last_frame: Instant, +} + +impl Gui { + pub fn new(display: &glium::Display, window: &Window) -> Result { + let mut imgui = ImguiContext::create(); + imgui.set_ini_filename(None); + let mut platform = WinitPlatform::new(&mut imgui); + platform.attach_window(imgui.io_mut(), window, HiDpiMode::Default); + imgui.fonts().add_font(&[imgui::FontSource::DefaultFontData { config: None }]); + let renderer = ImguiGliumRenderer::new(&mut imgui, display)?; + + Ok(Self { + imgui, + platform, + renderer, + last_frame: Instant::now(), + }) + } + + pub fn handle_event(&mut self, window: &Window, event: &winit::event::Event) { + self.platform + .handle_event(self.imgui.io_mut(), window, event); + } + + pub fn prepare_frame(&mut self, window: &Window) { + let now = Instant::now(); + self.imgui.io_mut().update_delta_time(now - self.last_frame); + self.last_frame = now; + + self + .platform + .prepare_frame(self.imgui.io_mut(), window) + .expect("failed to prepare imgui frame"); + } + + pub fn render(&mut self, target: &mut Frame, window: &Window) { + let mut open = true; + self.render_with(target, window, |ui| { + ui.show_demo_window(&mut open); + }); + } + + pub fn render_with(&mut self, target: &mut Frame, window: &Window, build_ui: F) + where + F: FnOnce(&Ui), + { + let ui = self.imgui.frame(); + + build_ui(&ui); + + self.platform.prepare_render(ui, window); + let draw_data = self.imgui.render(); + + self + .renderer + .render(target, draw_data) + .expect("imgui rendering failed"); + } + + pub fn ui(&mut self, build: F) + where + F: FnOnce(&Ui), + { + let ui = self.imgui.frame(); + build(&ui); + } +} \ No newline at end of file