diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..7182511 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +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 b5d2ef8..84b7805 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -/target -.aider* +target/ +*.patch +.idea/ \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..1927e4f --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,11 @@ +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 9e6529b..d36cc29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "ab_glyph" -version = "0.2.29" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -14,15 +14,15 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -40,21 +40,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.3", + "getrandom", "once_cell", "version_check", "zerocopy", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -68,7 +59,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.9.1", + "bitflags 2.10.0", "cc", "cesu8", "jni", @@ -90,9 +81,9 @@ checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "approx" @@ -104,20 +95,23 @@ dependencies = [ ] [[package]] -name = "arbitrary" -version = "1.4.1" +name = "arboard" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" - -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" dependencies = [ - "proc-macro2", - "quote", - "syn", + "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", ] [[package]] @@ -150,34 +144,11 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "av1-grain" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -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" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -185,7 +156,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -202,9 +173,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bit_field" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" [[package]] name = "bitflags" @@ -214,15 +185,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "bitstream-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block2" @@ -233,23 +198,31 @@ dependencies = [ "objc2 0.5.2", ] -[[package]] -name = "built" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" - [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +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", +] [[package]] name = "byteorder" @@ -265,9 +238,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "calloop" @@ -275,7 +248,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "log", "polling", "rustix 0.38.44", @@ -283,24 +256,50 @@ dependencies = [ "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", +] + [[package]] name = "calloop-wayland-source" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ - "calloop", + "calloop 0.13.0", "rustix 0.38.44", "wayland-backend", "wayland-client", ] [[package]] -name = "cc" -version = "1.2.27" +name = "calloop-wayland-source" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ + "calloop 0.14.3", + "rustix 1.1.2", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.2.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" +dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -312,21 +311,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -344,16 +333,13 @@ dependencies = [ ] [[package]] -name = "chlorine" -version = "1.0.13" +name = "clipboard-win" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d31b1d19317b4777ec879192d3745bd97d05262b4b19cb1dda284b9d22f19" - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] [[package]] name = "combine" @@ -384,6 +370,16 @@ 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" @@ -397,7 +393,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "core-graphics-types", "foreign-types", "libc", @@ -410,41 +406,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "libc", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-deque" version = "0.8.6" @@ -464,15 +438,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -481,9 +446,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "cursor-icon" @@ -503,8 +468,19 @@ 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", + "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", ] [[package]] @@ -524,9 +500,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "downcast-rs" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" [[package]] name = "dpi" @@ -534,12 +510,84 @@ 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" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "emath" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e561352ae95c22ad179fb56c38d6e6eecd86cf4925cf5c70e738dd01df9b620" +dependencies = [ + "bytemuck", +] + [[package]] name = "ena" version = "0.14.3" @@ -550,24 +598,28 @@ dependencies = [ ] [[package]] -name = "equator" -version = "0.4.2" +name = "epaint" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +checksum = "a909ce8cee63e8350fb0c251ad39277a5b24f19add60787e84a3b3ab3f2bd83a" dependencies = [ - "equator-macro", + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", + "profiling", ] [[package]] -name = "equator-macro" -version = "0.4.2" +name = "epaint_default_fonts" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "ad9649446c23368ae138716910e3e28143995691b598fbb9de16b42b0722cbcc" [[package]] name = "equivalent" @@ -577,19 +629,25 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] -name = "exr" -version = "1.73.0" +name = "error-code" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "exr" +version = "1.74.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -600,6 +658,26 @@ 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" @@ -610,10 +688,16 @@ dependencies = [ ] [[package]] -name = "flate2" -version = "1.1.2" +name = "find-msvc-tools" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "flate2" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -631,6 +715,12 @@ 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" @@ -659,72 +749,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] -name = "fps" -version = "0.1.0" +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "anyhow", - "glam", - "glium", - "gltf", - "glutin", - "hecs", - "image", - "imgui", - "imgui-glium-renderer", - "imgui-winit-support", - "rand", - "rapier3d", - "winit", + "percent-encoding", ] [[package]] name = "gethostname" -version = "0.4.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "libc", - "windows-targets 0.48.5", + "rustix 1.1.2", + "windows-link", ] [[package]] name = "getrandom" -version = "0.2.16" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", - "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", + "wasip2", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gl_generator" @@ -739,15 +798,105 @@ dependencies = [ [[package]] name = "glam" -version = "0.30.4" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50a99dbe56b72736564cfa4b85bf9a33079f16ae8b74983ab06af3b1a3696b11" +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" [[package]] name = "glium" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a3028d1f135b5395e6e4336916b424bc5dd2b38c6e378ce2704e4b8f4a617ed" +checksum = "8cf52ce4f5ce1501bb056627f35484a819e812d1d93f0f3da413676421b1bbe0" dependencies = [ "backtrace", "fnv", @@ -805,7 +954,7 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "cfg_aliases", "cgl", "dispatch2", @@ -813,10 +962,10 @@ dependencies = [ "glutin_glx_sys", "glutin_wgl_sys", "libloading", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", + "objc2 0.6.3", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "raw-window-handle", "wayland-sys", @@ -867,12 +1016,13 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "zerocopy", ] [[package]] @@ -895,13 +1045,22 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" +dependencies = [ + "foldhash 0.2.0", ] [[package]] @@ -914,12 +1073,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - [[package]] name = "hecs" version = "0.10.5" @@ -937,97 +1090,132 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] -name = "image" -version = "0.25.6" +name = "icu_collections" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", - "color_quant", "exr", - "gif", - "image-webp", + "moxcms", "num-traits", "png", - "qoi", - "ravif", - "rayon", - "rgb", "tiff", - "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", + "zune-core 0.5.0", + "zune-jpeg 0.5.5", ] [[package]] name = "indexmap" -version = "2.9.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.0", ] [[package]] @@ -1036,26 +1224,6 @@ 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" @@ -1086,25 +1254,19 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom", "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" - [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -1124,34 +1286,24 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" -dependencies = [ - "arbitrary", - "cc", -] +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-link", ] [[package]] @@ -1162,13 +1314,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.18", ] [[package]] @@ -1179,34 +1331,30 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "matrixmultiply" @@ -1218,27 +1366,17 @@ dependencies = [ "rawpointer", ] -[[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.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", ] @@ -1252,12 +1390,6 @@ 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" @@ -1269,18 +1401,38 @@ dependencies = [ ] [[package]] -name = "mint" -version = "0.5.9" +name = "moxcms" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" +dependencies = [ + "num-traits", + "pxfm", +] [[package]] name = "nalgebra" -version = "0.33.2" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +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", @@ -1292,9 +1444,9 @@ dependencies = [ [[package]] name = "nalgebra-macros" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +checksum = "973e7178a678cfd059ccec50887658d482ce16b0aa9da3888ddeab5cd5eb4889" dependencies = [ "proc-macro2", "quote", @@ -1307,7 +1459,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys", @@ -1332,26 +1484,10 @@ dependencies = [ ] [[package]] -name = "new_debug_unreachable" -version = "1.0.6" +name = "nohash-hasher" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" [[package]] name = "num-bigint" @@ -1415,9 +1551,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -1425,9 +1561,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1453,9 +1589,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", ] @@ -1466,7 +1602,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "libc", "objc2 0.5.2", @@ -1478,14 +1614,15 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-core-graphics", + "objc2-foundation 0.3.2", ] [[package]] @@ -1494,7 +1631,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "objc2 0.5.2", "objc2-core-location", @@ -1518,7 +1655,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -1526,13 +1663,26 @@ dependencies = [ [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "dispatch2", - "objc2 0.6.1", + "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", ] [[package]] @@ -1571,7 +1721,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "dispatch", "libc", @@ -1580,12 +1730,23 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", + "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", "objc2-core-foundation", ] @@ -1607,7 +1768,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -1619,7 +1780,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -1642,7 +1803,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "objc2 0.5.2", "objc2-cloud-kit", @@ -1674,7 +1835,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "objc2 0.5.2", "objc2-core-location", @@ -1683,9 +1844,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -1698,36 +1859,36 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "orbclient" -version = "0.3.48" +version = "0.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827" dependencies = [ "libredox", ] [[package]] name = "ordered-float" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c1f9f56e534ac6a9b8a4600bdf0f530fb393b5f393e7b4d03489c3cf0c3f01" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" dependencies = [ "num-traits", ] [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser", ] [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1735,30 +1896,31 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.18", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "parry3d" -version = "0.21.1" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f8d0a3b2f4c0e250d4599b69e490535521c3497e2b88b0b5d2ada251bc83a8" +checksum = "e99471b7b6870f7fe406d5611dd4b4c9b07aa3e5436b1d27e1515f9832bb0c6b" dependencies = [ "approx", "arrayvec", - "bitflags 2.9.1", - "downcast-rs 2.0.1", + "bitflags 2.10.0", + "downcast-rs 2.0.2", "either", "ena", - "hashbrown 0.15.4", + "foldhash 0.2.0", + "hashbrown 0.16.0", "log", "nalgebra", "num-derive", @@ -1767,8 +1929,10 @@ dependencies = [ "rstar", "simba", "slab", + "smallvec", "spade", - "thiserror 2.0.12", + "static_assertions", + "thiserror 2.0.17", ] [[package]] @@ -1779,9 +1943,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" @@ -1817,11 +1981,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" -version = "0.17.16" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "crc32fast", "fdeflate", "flate2", @@ -1830,42 +1994,41 @@ dependencies = [ [[package]] name = "polling" -version = "3.8.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ - "zerocopy", + "zerovec", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -1890,12 +2053,12 @@ dependencies = [ ] [[package]] -name = "qoi" -version = "0.4.1" +name = "pxfm" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" dependencies = [ - "bytemuck", + "num-traits", ] [[package]] @@ -1915,9 +2078,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -1929,47 +2092,122 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +name = "raidillon_app" +version = "0.1.0" dependencies = [ - "libc", - "rand_chacha", - "rand_core", + "raidillon_assets", + "raidillon_core", + "raidillon_ecs", + "raidillon_engine", + "raidillon_glium", + "raidillon_physics", + "raidillon_platform", ] [[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +name = "raidillon_assets" +version = "0.1.0" + +[[package]] +name = "raidillon_core" +version = "0.1.0" dependencies = [ - "ppv-lite86", - "rand_core", + "egui", + "hecs", + "indexmap", + "raidillon_assets", + "winit", ] [[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +name = "raidillon_ecs" +version = "0.1.0" dependencies = [ - "getrandom 0.2.16", + "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.26.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1015500058823ba9c479c908d7069adcf3f0f51a3e49dca7efc5575df7e574" +checksum = "5bd27b8eb36d0833fa0f2aea40164fabfad0fc34b9932286ae9e84f3452f5364" dependencies = [ "approx", "arrayvec", "bit-vec", - "bitflags 2.9.1", - "crossbeam", - "downcast-rs 2.0.1", + "bitflags 2.10.0", + "downcast-rs 2.0.2", "log", "nalgebra", "num-derive", @@ -1979,57 +2217,9 @@ dependencies = [ "profiling", "rustc-hash", "simba", - "thiserror 2.0.12", -] - -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand", - "rand_chacha", - "simd_helpers", - "system-deps", - "thiserror 1.0.69", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", + "static_assertions", + "thiserror 2.0.17", + "wide", ] [[package]] @@ -2044,21 +2234,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2075,19 +2255,13 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", ] -[[package]] -name = "rgb" -version = "0.8.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" - [[package]] name = "robust" version = "1.2.0" @@ -2107,9 +2281,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -2123,7 +2297,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -2132,22 +2306,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2194,24 +2368,34 @@ dependencies = [ "ab_glyph", "log", "memmap2", - "smithay-client-toolkit", + "smithay-client-toolkit 0.19.2", "tiny-skia", ] [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +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" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2220,23 +2404,24 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.9" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2247,9 +2432,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simba" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx", "num-complex", @@ -2264,20 +2449,11 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -2291,9 +2467,9 @@ 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", + "bitflags 2.10.0", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", "cursor-icon", "libc", "log", @@ -2310,6 +2486,44 @@ 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" @@ -2321,11 +2535,11 @@ dependencies = [ [[package]] name = "spade" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a14e31a007e9f85c32784b04f89e6e194bb252a4d41b4a8ccd9e77245d901c8c" +checksum = "fb313e1c8afee5b5647e00ee0fe6855e3d529eb863a0fdae1d60006c4d1e9990" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", "num-traits", "robust", "smallvec", @@ -2339,9 +2553,15 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +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" @@ -2351,9 +2571,9 @@ checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" [[package]] name = "syn" -version = "2.0.104" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -2361,24 +2581,16 @@ dependencies = [ ] [[package]] -name = "system-deps" -version = "6.2.2" +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml", - "version-compare", + "proc-macro2", + "quote", + "syn", ] -[[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" @@ -2390,11 +2602,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -2410,9 +2622,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", @@ -2421,13 +2633,16 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" dependencies = [ + "fax", "flate2", - "jpeg-decoder", + "half", + "quick-error", "weezl", + "zune-jpeg 0.4.21", ] [[package]] @@ -2456,45 +2671,73 @@ dependencies = [ ] [[package]] -name = "toml" -version = "0.8.23" +name = "tinystr" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ - "serde", + "displaydoc", + "zerovec", +] + +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap", + "serde_core", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_parser", + "toml_writer", + "winnow", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 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", ] @@ -2513,15 +2756,15 @@ checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -2529,6 +2772,18 @@ 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" @@ -2536,21 +2791,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] -name = "v_frame" -version = "0.3.9" +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "version_check" @@ -2569,63 +2813,45 @@ dependencies = [ ] [[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -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" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 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.45" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2633,35 +2859,35 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] [[package]] name = "wayland-backend" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs 1.2.1", - "rustix 0.38.44", + "rustix 1.1.2", "scoped-tls", "smallvec", "wayland-sys", @@ -2669,12 +2895,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.9.1", - "rustix 0.38.44", + "bitflags 2.10.0", + "rustix 1.1.2", "wayland-backend", "wayland-scanner", ] @@ -2685,41 +2911,67 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" dependencies = [ - "rustix 0.38.44", + "rustix 1.1.2", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.8" +version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-scanner", ] [[package]] -name = "wayland-protocols-plasma" -version = "0.3.8" +name = "wayland-protocols-experimental" +version = "20250721.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" dependencies = [ - "bitflags 2.9.1", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +dependencies = [ + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -2728,11 +2980,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -2741,9 +2993,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", "quick-xml", @@ -2752,9 +3004,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ "dlib", "log", @@ -2764,9 +3016,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -2783,10 +3035,26 @@ dependencies = [ ] [[package]] -name = "weezl" -version = "0.1.10" +name = "webbrowser" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wide" @@ -2800,13 +3068,19 @@ dependencies = [ [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] +[[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" @@ -2840,7 +3114,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "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", ] [[package]] @@ -2858,21 +3141,6 @@ 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" @@ -2891,18 +3159,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "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", + "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", ] [[package]] @@ -2911,12 +3180,6 @@ 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" @@ -2925,9 +3188,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -2935,12 +3198,6 @@ 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" @@ -2949,9 +3206,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -2959,12 +3216,6 @@ 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" @@ -2973,9 +3224,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -2985,9 +3236,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -2995,12 +3246,6 @@ 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" @@ -3009,9 +3254,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -3019,12 +3264,6 @@ 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" @@ -3033,9 +3272,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -3043,12 +3282,6 @@ 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" @@ -3057,9 +3290,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -3067,12 +3300,6 @@ 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" @@ -3081,26 +3308,26 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" -version = "0.30.11" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4409c10174df8779dc29a4788cac85ed84024ccbc1743b776b21a520ee1aaf4" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.9.1", + "bitflags 2.10.0", "block2", "bytemuck", - "calloop", + "calloop 0.13.0", "cfg_aliases", "concurrent-queue", - "core-foundation", + "core-foundation 0.9.4", "core-graphics", "cursor-icon", "dpi", @@ -3119,7 +3346,7 @@ dependencies = [ "redox_syscall 0.4.1", "rustix 0.38.44", "sctk-adwaita", - "smithay-client-toolkit", + "smithay-client-toolkit 0.19.2", "smol_str", "tracing", "unicode-segmentation", @@ -3139,21 +3366,24 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "x11-dl" @@ -3168,30 +3398,30 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", "libloading", "once_cell", - "rustix 0.38.44", + "rustix 1.1.2", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] name = "xcursor" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "635887f4315a33cb714eb059bdbd7c1c92bfa71bc5b9d5115460502f788c2ab5" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" [[package]] name = "xkbcommon-dl" @@ -3199,7 +3429,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "dlib", "log", "once_cell", @@ -3214,24 +3444,101 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +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", +] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +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" dependencies = [ "proc-macro2", "quote", @@ -3244,6 +3551,12 @@ 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" @@ -3255,9 +3568,18 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.18" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ - "zune-core", + "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", ] diff --git a/Cargo.toml b/Cargo.toml index acf880d..3741214 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,24 +1,11 @@ -[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" - -rapier3d = "0.26.1" -rand = "0.8" +[workspace] +members = [ + "core", + "glium_platform", + "platform", + "asset", + "game", + "ecs", + "engine", + "physics", "app", +] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0ad25db --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + 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 new file mode 100644 index 0000000..bac9855 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Raidillon rewrite number #23818491847214 + +Starting in 2025-08-03, 17:59 UTC+3 diff --git a/app/Cargo.toml b/app/Cargo.toml new file mode 100644 index 0000000..081dae0 --- /dev/null +++ b/app/Cargo.toml @@ -0,0 +1,16 @@ +[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 new file mode 100644 index 0000000..a5b875a --- /dev/null +++ b/app/src/lib.rs @@ -0,0 +1,45 @@ +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 new file mode 100644 index 0000000..fc9cdc1 --- /dev/null +++ b/app/src/prelude.rs @@ -0,0 +1,47 @@ +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 new file mode 100644 index 0000000..7b35051 --- /dev/null +++ b/asset/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "raidillon_assets" +version = "0.1.0" +edition = "2024" diff --git a/asset/src/lib.rs b/asset/src/lib.rs new file mode 100644 index 0000000..617ced9 --- /dev/null +++ b/asset/src/lib.rs @@ -0,0 +1,22 @@ +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 new file mode 100644 index 0000000..2989a3b --- /dev/null +++ b/asset/src/model_manager.rs @@ -0,0 +1,17 @@ +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 new file mode 100644 index 0000000..c57cb53 --- /dev/null +++ b/assets/exr/citrus_orchard_road_puresky_4k.exr @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..86cd3d7 --- /dev/null +++ b/assets/exr/qwantani_sunset_puresky_2k.exr @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..ad55283 --- /dev/null +++ b/assets/models/checkered-sphere.glb @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..56f4aa0 --- /dev/null +++ b/assets/models/monkey.bin @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..2651b01 --- /dev/null +++ b/assets/models/monkey.gltf @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..627ca3e --- /dev/null +++ b/assets/models/pink-monkey.bin @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..d4c6adf --- /dev/null +++ b/assets/models/pink-monkey.gltf @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..e755152 --- /dev/null +++ b/assets/models/plane.glb @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..ea99045 --- /dev/null +++ b/assets/models/sphere.glb @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..225ddd1 --- /dev/null +++ b/assets/models/tree.bin @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..58b4fb9 --- /dev/null +++ b/assets/models/tree.gltf @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..1d2807b --- /dev/null +++ b/assets/models/tree_texture.png @@ -0,0 +1,3 @@ +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 new file mode 100644 index 0000000..96d53b9 --- /dev/null +++ b/assets/shaders/debug_wireframe.frag @@ -0,0 +1,9 @@ +#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 new file mode 100644 index 0000000..7a53438 --- /dev/null +++ b/assets/shaders/debug_wireframe.vert @@ -0,0 +1,14 @@ +#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 new file mode 100644 index 0000000..abfa702 --- /dev/null +++ b/assets/shaders/gl_textured.frag @@ -0,0 +1,43 @@ +#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/resources/shaders/gl_textured.vert b/assets/shaders/gl_textured.vert similarity index 99% rename from resources/shaders/gl_textured.vert rename to assets/shaders/gl_textured.vert index 269c9d3..df2c27d 100644 --- a/resources/shaders/gl_textured.vert +++ b/assets/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/resources/shaders/skybox.frag b/assets/shaders/skybox.frag similarity index 61% rename from resources/shaders/skybox.frag rename to assets/shaders/skybox.frag index 4ad6a8c..ce28e95 100644 --- a/resources/shaders/skybox.frag +++ b/assets/shaders/skybox.frag @@ -9,14 +9,19 @@ 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(v.y)); + vec2 uv = vec2(atan(v.z, v.x), asin(clamp(v.y, -1.0, 1.0))); 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/resources/shaders/skybox.vert b/assets/shaders/skybox.vert similarity index 99% rename from resources/shaders/skybox.vert rename to assets/shaders/skybox.vert index fe5ce38..2db3b53 100644 --- a/resources/shaders/skybox.vert +++ b/assets/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/assets_src/blender/plane.blend b/assets_src/blender/plane.blend deleted file mode 100644 index 535b755..0000000 Binary files a/assets_src/blender/plane.blend and /dev/null differ diff --git a/core/Cargo.lock b/core/Cargo.lock new file mode 100644 index 0000000..1377fa3 --- /dev/null +++ b/core/Cargo.lock @@ -0,0 +1,120 @@ +# 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 new file mode 100644 index 0000000..9b3f82f --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,11 @@ +[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 new file mode 100644 index 0000000..fbbb789 --- /dev/null +++ b/core/src/egui_queue.rs @@ -0,0 +1,22 @@ +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 new file mode 100644 index 0000000..5890063 --- /dev/null +++ b/core/src/engine.rs @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..759393d --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..e586be5 --- /dev/null +++ b/core/src/scene.rs @@ -0,0 +1,85 @@ +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 new file mode 100644 index 0000000..c47466d --- /dev/null +++ b/core/src/time.rs @@ -0,0 +1,144 @@ +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 new file mode 100644 index 0000000..aac2ce7 --- /dev/null +++ b/core/src/utils/managers.rs @@ -0,0 +1,44 @@ +/// 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 new file mode 100644 index 0000000..4a5eaf5 --- /dev/null +++ b/core/src/utils/mod.rs @@ -0,0 +1,2 @@ +pub mod typemap; +mod managers; diff --git a/core/src/utils/typemap.rs b/core/src/utils/typemap.rs new file mode 100644 index 0000000..c04c2c9 --- /dev/null +++ b/core/src/utils/typemap.rs @@ -0,0 +1,544 @@ +#[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 new file mode 100644 index 0000000..a47173d --- /dev/null +++ b/ecs/Cargo.toml @@ -0,0 +1,9 @@ +[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 new file mode 100644 index 0000000..3c20ec7 --- /dev/null +++ b/ecs/src/components.rs @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..d08fe80 --- /dev/null +++ b/ecs/src/lib.rs @@ -0,0 +1,3 @@ +pub mod components; + +pub use components::{Transform, ModelID}; diff --git a/engine/Cargo.toml b/engine/Cargo.toml new file mode 100644 index 0000000..1264629 --- /dev/null +++ b/engine/Cargo.toml @@ -0,0 +1,15 @@ +[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 new file mode 100644 index 0000000..ec9841f --- /dev/null +++ b/engine/src/engine.rs @@ -0,0 +1,88 @@ +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 new file mode 100644 index 0000000..27eb6fc --- /dev/null +++ b/engine/src/input.rs @@ -0,0 +1,69 @@ +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 new file mode 100644 index 0000000..a7ad724 --- /dev/null +++ b/engine/src/lib.rs @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..cd4be0b --- /dev/null +++ b/engine/src/resources.rs @@ -0,0 +1,3 @@ +use raidillon_core::define_typemap; + +define_typemap!(EngineResources,); diff --git a/engine/src/system.rs b/engine/src/system.rs new file mode 100644 index 0000000..420da1b --- /dev/null +++ b/engine/src/system.rs @@ -0,0 +1,45 @@ +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 new file mode 100644 index 0000000..e69de29 diff --git a/game/Cargo.toml b/game/Cargo.toml new file mode 100644 index 0000000..0a28217 --- /dev/null +++ b/game/Cargo.toml @@ -0,0 +1,12 @@ +[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 new file mode 100644 index 0000000..a619cb3 --- /dev/null +++ b/game/src/main.rs @@ -0,0 +1,140 @@ +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 new file mode 100644 index 0000000..8863f2e --- /dev/null +++ b/game/src/systems/common.rs @@ -0,0 +1,34 @@ +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 new file mode 100644 index 0000000..b687e08 --- /dev/null +++ b/game/src/systems/debug_camera.rs @@ -0,0 +1,89 @@ +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 new file mode 100644 index 0000000..5d8455c --- /dev/null +++ b/game/src/systems/display_settings.rs @@ -0,0 +1,94 @@ +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 new file mode 100644 index 0000000..5519969 --- /dev/null +++ b/game/src/systems/keybinds.rs @@ -0,0 +1,69 @@ +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 new file mode 100644 index 0000000..b27450a --- /dev/null +++ b/game/src/systems/kinematic_character_controller.rs @@ -0,0 +1,187 @@ +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 new file mode 100644 index 0000000..8a4b0d5 --- /dev/null +++ b/game/src/systems/menu.rs @@ -0,0 +1,85 @@ +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 new file mode 100644 index 0000000..08c54ab --- /dev/null +++ b/game/src/systems/mod.rs @@ -0,0 +1,15 @@ +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 new file mode 100644 index 0000000..f660526 --- /dev/null +++ b/game/src/systems/physics.rs @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..33364d2 --- /dev/null +++ b/game/src/systems/physics_debug.rs @@ -0,0 +1,35 @@ +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 new file mode 100644 index 0000000..4606b6a --- /dev/null +++ b/glium_platform/Cargo.lock @@ -0,0 +1,2242 @@ +# 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 new file mode 100644 index 0000000..109fc57 --- /dev/null +++ b/glium_platform/Cargo.toml @@ -0,0 +1,21 @@ +[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 new file mode 100644 index 0000000..c8cb1d4 --- /dev/null +++ b/glium_platform/src/assets.rs @@ -0,0 +1,53 @@ +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 new file mode 100644 index 0000000..fe4ec37 --- /dev/null +++ b/glium_platform/src/gltf_loader.rs @@ -0,0 +1,183 @@ +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 new file mode 100644 index 0000000..6fd924f --- /dev/null +++ b/glium_platform/src/lib.rs @@ -0,0 +1,10 @@ +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/src/model.rs b/glium_platform/src/model.rs similarity index 87% rename from src/model.rs rename to glium_platform/src/model.rs index e474fe4..1d18dd8 100644 --- a/src/model.rs +++ b/glium_platform/src/model.rs @@ -1,8 +1,9 @@ -use glium::texture::{RawImage2d, SrgbTexture2d, Texture2d}; +use std::any::{Any, TypeId}; +use glium::{IndexBuffer, VertexBuffer, implement_vertex}; +use glium::texture::{SrgbTexture2d, Texture2d}; use glium::uniforms::SamplerBehavior; use glam::{Vec2}; -use glium::{backend::Facade, implement_vertex, IndexBuffer, VertexBuffer}; -use glium::index::PrimitiveType; +use std::sync::atomic::{AtomicUsize, Ordering}; #[derive(Copy, Clone)] pub struct Vertex { @@ -52,6 +53,6 @@ impl Default for Material { } pub struct Model { - pub mesh: Mesh, + pub mesh: Mesh, pub material: Material, } diff --git a/glium_platform/src/platform.rs b/glium_platform/src/platform.rs new file mode 100644 index 0000000..8f00d92 --- /dev/null +++ b/glium_platform/src/platform.rs @@ -0,0 +1,201 @@ +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 new file mode 100644 index 0000000..6553cc0 --- /dev/null +++ b/glium_platform/src/render/basic.rs @@ -0,0 +1,115 @@ +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 new file mode 100644 index 0000000..2f259e9 --- /dev/null +++ b/glium_platform/src/render/debug_wireframe.rs @@ -0,0 +1,80 @@ +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 new file mode 100644 index 0000000..3cd0583 --- /dev/null +++ b/glium_platform/src/render/egui.rs @@ -0,0 +1,74 @@ +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 new file mode 100644 index 0000000..22aa047 --- /dev/null +++ b/glium_platform/src/render/mod.rs @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..d11683b --- /dev/null +++ b/glium_platform/src/render/skybox.rs @@ -0,0 +1,157 @@ +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 new file mode 100644 index 0000000..cf5f945 --- /dev/null +++ b/glium_platform/src/system.rs @@ -0,0 +1,68 @@ +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 deleted file mode 100644 index a8ef99b..0000000 --- a/justfile +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index f765a07..0000000 Binary files a/opengl.png and /dev/null differ diff --git a/physics/Cargo.toml b/physics/Cargo.toml new file mode 100644 index 0000000..dc34e98 --- /dev/null +++ b/physics/Cargo.toml @@ -0,0 +1,9 @@ +[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 new file mode 100644 index 0000000..a5dafc6 --- /dev/null +++ b/physics/src/lib.rs @@ -0,0 +1,3 @@ +mod physics; + +pub use crate::physics::Physics; diff --git a/physics/src/physics.rs b/physics/src/physics.rs new file mode 100644 index 0000000..5eff699 --- /dev/null +++ b/physics/src/physics.rs @@ -0,0 +1,82 @@ +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 new file mode 100644 index 0000000..4ca8f54 --- /dev/null +++ b/platform/Cargo.lock @@ -0,0 +1,1779 @@ +# 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 new file mode 100644 index 0000000..16fec56 --- /dev/null +++ b/platform/Cargo.toml @@ -0,0 +1,12 @@ +[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/src/camera.rs b/platform/src/camera.rs similarity index 100% rename from src/camera.rs rename to platform/src/camera.rs diff --git a/platform/src/context.rs b/platform/src/context.rs new file mode 100644 index 0000000..31bd6cb --- /dev/null +++ b/platform/src/context.rs @@ -0,0 +1,86 @@ +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 new file mode 100644 index 0000000..bb27077 --- /dev/null +++ b/platform/src/event.rs @@ -0,0 +1,11 @@ +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 new file mode 100644 index 0000000..ef88e08 --- /dev/null +++ b/platform/src/lib.rs @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..8884c46 --- /dev/null +++ b/platform/src/platform.rs @@ -0,0 +1,8 @@ +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 new file mode 100644 index 0000000..a901137 --- /dev/null +++ b/platform/src/settings.rs @@ -0,0 +1,166 @@ +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 deleted file mode 100644 index f1458ae..0000000 --- a/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -## 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 deleted file mode 100644 index c20a364..0000000 Binary files a/resources/models/Grass Texture 1.png and /dev/null differ diff --git a/resources/models/cube.bin b/resources/models/cube.bin deleted file mode 100644 index 29df9d9..0000000 Binary files a/resources/models/cube.bin and /dev/null differ diff --git a/resources/models/cube.gltf b/resources/models/cube.gltf deleted file mode 100644 index 8db6d67..0000000 --- a/resources/models/cube.gltf +++ /dev/null @@ -1,121 +0,0 @@ -{ - "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 deleted file mode 100644 index c4d834c..0000000 --- a/resources/models/cube.obj +++ /dev/null @@ -1,33 +0,0 @@ -# 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 deleted file mode 100644 index f6f4431..0000000 Binary files a/resources/models/monkey-smooth.bin and /dev/null differ diff --git a/resources/models/monkey-smooth.gltf b/resources/models/monkey-smooth.gltf deleted file mode 100644 index 21b6404..0000000 --- a/resources/models/monkey-smooth.gltf +++ /dev/null @@ -1,104 +0,0 @@ -{ - "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 deleted file mode 100644 index e7992f3..0000000 Binary files a/resources/models/monkey.bin and /dev/null differ diff --git a/resources/models/monkey.gltf b/resources/models/monkey.gltf deleted file mode 100644 index d3e2438..0000000 --- a/resources/models/monkey.gltf +++ /dev/null @@ -1,104 +0,0 @@ -{ - "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 deleted file mode 100644 index 7baf2c5..0000000 Binary files a/resources/models/plane.bin and /dev/null differ diff --git a/resources/models/plane.gltf b/resources/models/plane.gltf deleted file mode 100644 index 08db53f..0000000 --- a/resources/models/plane.gltf +++ /dev/null @@ -1,160 +0,0 @@ -{ - "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 deleted file mode 100644 index e782621..0000000 Binary files a/resources/models/tree.bin and /dev/null differ diff --git a/resources/models/tree.gltf b/resources/models/tree.gltf deleted file mode 100644 index 51bf9ed..0000000 --- a/resources/models/tree.gltf +++ /dev/null @@ -1,140 +0,0 @@ -{ - "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 deleted file mode 100644 index f5726d4..0000000 Binary files a/resources/models/tree_texture.png and /dev/null differ diff --git a/resources/models/uvsphere-smooth.bin b/resources/models/uvsphere-smooth.bin deleted file mode 100644 index f8b6e5c..0000000 Binary files a/resources/models/uvsphere-smooth.bin and /dev/null differ diff --git a/resources/models/uvsphere-smooth.gltf b/resources/models/uvsphere-smooth.gltf deleted file mode 100644 index 0f65991..0000000 --- a/resources/models/uvsphere-smooth.gltf +++ /dev/null @@ -1,109 +0,0 @@ -{ - "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 deleted file mode 100644 index dda76ba..0000000 Binary files a/resources/models/uvsphere.bin and /dev/null differ diff --git a/resources/models/uvsphere.gltf b/resources/models/uvsphere.gltf deleted file mode 100644 index edf10c7..0000000 --- a/resources/models/uvsphere.gltf +++ /dev/null @@ -1,104 +0,0 @@ -{ - "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 deleted file mode 100644 index c71a8be..0000000 Binary files a/resources/models/uvsphere2.bin and /dev/null differ diff --git a/resources/models/uvsphere2.gltf b/resources/models/uvsphere2.gltf deleted file mode 100644 index 6657f6e..0000000 --- a/resources/models/uvsphere2.gltf +++ /dev/null @@ -1,190 +0,0 @@ -{ - "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 deleted file mode 100644 index e0da565..0000000 --- a/resources/shaders/gl_textured.frag +++ /dev/null @@ -1,34 +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; -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/resources/skyboxes/sky_24_2k.png b/resources/skyboxes/sky_24_2k.png deleted file mode 100644 index ac2d556..0000000 Binary files a/resources/skyboxes/sky_24_2k.png and /dev/null differ diff --git a/resources/textures/grass.png b/resources/textures/grass.png deleted file mode 100644 index c20a364..0000000 Binary files a/resources/textures/grass.png and /dev/null differ diff --git a/src/ecs.rs b/src/ecs.rs deleted file mode 100644 index a81c9e3..0000000 --- a/src/ecs.rs +++ /dev/null @@ -1,64 +0,0 @@ -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 deleted file mode 100644 index d5f805c..0000000 --- a/src/gltf_loader.rs +++ /dev/null @@ -1,181 +0,0 @@ -//! 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(); - - if let Some(mat_idx) = primitive.material().index() { - 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) = 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 - 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 deleted file mode 100644 index af8a3f9..0000000 --- a/src/main.rs +++ /dev/null @@ -1,216 +0,0 @@ -mod camera; -mod ecs; -mod model; -mod gltf_loader; -mod render; -mod time; -mod ui; -mod physics; - -use anyhow::Result; -use camera::Camera; -use ecs::{Transform, ModelHandle}; -use glam::{Quat, Vec3, EulerRot}; -use glium::backend::glutin::SimpleWindowBuilder; -use render::GliumRenderer; -use rapier3d::prelude::*; -use rapier3d::prelude::LockedAxes; -use rapier3d::na::{UnitQuaternion, Quaternion}; -use rand::Rng; - -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(1920, 1080) - .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) - }; - - let mut physics = physics::Physics::new(); - - // 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(10.0, 10.0, 10.0), - }) - }; - - // Add physics for ground - let ground_tr = *ecsr.world.get::<&Transform>(ground_ent).unwrap(); - let (axis, angle) = ground_tr.rotation.to_axis_angle(); - let rotation = vector![axis.x * angle, axis.y * angle, axis.z * angle]; - let ground_half_height = 0.1; - let ground_half_extents_x = ground_tr.scale.x * 1.0; - let ground_half_extents_z = ground_tr.scale.z * 1.0; - let ground_pos = Isometry::new( - vector![ - ground_tr.translation.x, - ground_tr.translation.y - ground_half_height, - ground_tr.translation.z - ], - rotation, - ); - let ground_rb = RigidBodyBuilder::fixed().position(ground_pos).build(); - let ground_collider = ColliderBuilder::cuboid(ground_half_extents_x, ground_half_height, ground_half_extents_z).build(); - physics.add_rigid_body(ground_ent, ground_rb, ground_collider); - - // Add physics for object - let object_tr = *ecsr.world.get::<&Transform>(object_ent).unwrap(); - let (axis, angle) = object_tr.rotation.to_axis_angle(); - let rotation = vector![axis.x * angle, axis.y * angle, axis.z * angle]; - let object_pos = Isometry::new( - vector![object_tr.translation.x, object_tr.translation.y, object_tr.translation.z], - rotation, - ); - let object_rb = RigidBodyBuilder::dynamic() - .position(object_pos) - .locked_axes(LockedAxes::ROTATION_LOCKED_X | LockedAxes::ROTATION_LOCKED_Z) - .angular_damping(5.0) - .build(); - let object_radius = 0.2 * object_tr.scale.x; - let object_half_height = 2.0 * object_tr.scale.y; - let object_collider = ColliderBuilder::cylinder(object_half_height, object_radius).build(); - physics.add_rigid_body(object_ent, object_rb, object_collider); - - let sphere_model_id = { - let model = gltf_loader::load_gltf("resources/models/uvsphere-smooth.gltf", &display)?; - let id = ecsr.renderer.models.len(); - ecsr.renderer.models.push(model); - id - }; - - 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| { - let spawn_clicked = ui.button("Spawn Sphere"); - if spawn_clicked { - let mut rng = rand::thread_rng(); - let offset_x: f32 = rng.gen_range(-0.1..0.1); - let offset_z: f32 = rng.gen_range(-0.1..0.1); - let sphere_transform = Transform { - translation: Vec3::new(offset_x, 5.0, offset_z), - rotation: Quat::IDENTITY, - scale: Vec3::splat(0.5), - }; - - let sphere_ent = ecsr.world.spawn(( - sphere_transform, - ModelHandle(sphere_model_id), - )); - - let (axis, angle) = sphere_transform.rotation.to_axis_angle(); - let rotation = vector![axis.x * angle, axis.y * angle, axis.z * angle]; - let sphere_pos = Isometry::new( - vector![ - sphere_transform.translation.x, - sphere_transform.translation.y, - sphere_transform.translation.z, - ], - rotation, - ); - - let sphere_rb = RigidBodyBuilder::dynamic() - .position(sphere_pos) - .linvel(vector![offset_x * 2.0, 0.0, offset_z * 2.0]) - .build(); - - let sphere_radius = 1.0 * sphere_transform.scale.x; - let sphere_collider = ColliderBuilder::ball(sphere_radius).build(); - - physics.add_rigid_body(sphere_ent, sphere_rb, sphere_collider); - } - - 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(); - physics.step(time.delta_seconds(), &mut ecsr.world); - gui.prepare_frame(&window); - window.request_redraw(); - } - _ => {} - } - }) - .map_err(Into::into) -} diff --git a/src/physics.rs b/src/physics.rs deleted file mode 100644 index 0095c9b..0000000 --- a/src/physics.rs +++ /dev/null @@ -1,90 +0,0 @@ -use std::collections::HashMap; -use rapier3d::prelude::*; -use hecs::World; -use glam::{Vec3, Quat}; -use crate::ecs::Transform; - -pub struct Physics { - rigid_bodies: RigidBodySet, - colliders: ColliderSet, - integration_params: IntegrationParameters, - pipeline: PhysicsPipeline, - island_manager: IslandManager, - broad_phase: BroadPhaseMultiSap, - narrow_phase: NarrowPhase, - impulse_joints: ImpulseJointSet, - multibody_joints: MultibodyJointSet, - ccd_solver: CCDSolver, - query_pipeline: QueryPipeline, - gravity: Vector, - entity_to_rb: HashMap, -} - -impl Physics { - pub fn new() -> Self { - let rigid_bodies = RigidBodySet::new(); - let colliders = ColliderSet::new(); - let integration_params = IntegrationParameters::default(); - let pipeline = PhysicsPipeline::new(); - let island_manager = IslandManager::new(); - let broad_phase = BroadPhaseMultiSap::new(); - let narrow_phase = NarrowPhase::new(); - let impulse_joints = ImpulseJointSet::new(); - let multibody_joints = MultibodyJointSet::new(); - let ccd_solver = CCDSolver::new(); - let query_pipeline = QueryPipeline::new(); - let gravity = vector![0.0, -9.81, 0.0]; - Self { - rigid_bodies, - colliders, - integration_params, - pipeline, - island_manager, - broad_phase, - narrow_phase, - impulse_joints, - multibody_joints, - ccd_solver, - query_pipeline, - gravity, - entity_to_rb: HashMap::new(), - } - } - - pub fn step(&mut self, dt: f32, world: &mut World) { - let physics_hooks = (); - let event_handler = (); - self.integration_params.dt = dt; - self.pipeline.step( - &self.gravity, - &self.integration_params, - &mut self.island_manager, - &mut self.broad_phase, - &mut self.narrow_phase, - &mut self.rigid_bodies, - &mut self.colliders, - &mut self.impulse_joints, - &mut self.multibody_joints, - &mut self.ccd_solver, - Some(&mut self.query_pipeline), - &physics_hooks, - &event_handler, - ); - - for (&ent, &handle) in &self.entity_to_rb { - if let Ok(mut tr) = world.get::<&mut Transform>(ent) { - let rb = self.rigid_bodies.get(handle).unwrap(); - let pos = rb.position(); - tr.translation = Vec3::new(pos.translation.x, pos.translation.y, pos.translation.z); - let q = pos.rotation; - tr.rotation = Quat::from_xyzw(q.i, q.j, q.k, q.w); - } - } - } - - pub fn add_rigid_body(&mut self, ent: hecs::Entity, rb: RigidBody, collider: Collider) { - let rb_handle = self.rigid_bodies.insert(rb); - self.colliders.insert_with_parent(collider, rb_handle, &mut self.rigid_bodies); - self.entity_to_rb.insert(ent, rb_handle); - } -} \ No newline at end of file diff --git a/src/render.rs b/src/render.rs deleted file mode 100644 index c382239..0000000 --- a/src/render.rs +++ /dev/null @@ -1,163 +0,0 @@ -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 deleted file mode 100644 index 914a881..0000000 --- a/src/teapot.rs +++ /dev/null @@ -1,2110 +0,0 @@ -#[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 deleted file mode 100644 index 5e8159b..0000000 --- a/src/time.rs +++ /dev/null @@ -1,34 +0,0 @@ -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 deleted file mode 100644 index c6be88a..0000000 --- a/src/ui.rs +++ /dev/null @@ -1,84 +0,0 @@ -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