diff --git a/Cargo.lock b/Cargo.lock index 4dbd694..d152631 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -138,6 +138,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.21" @@ -242,6 +248,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d67af77d68a931ecd5cbd8a3b5987d63a1d1d1278f7f6a60ae33db485cdebb69" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + [[package]] name = "arboard" version = "3.4.1" @@ -260,6 +272,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -493,6 +516,29 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -508,6 +554,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -523,6 +575,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "block" version = "0.1.6" @@ -560,6 +618,12 @@ dependencies = [ "piper", ] +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + [[package]] name = "bumpalo" version = "3.16.0" @@ -647,6 +711,16 @@ 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.0" @@ -687,6 +761,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "colorchoice" version = "1.0.3" @@ -786,12 +866,37 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + [[package]] name = "crypto-common" version = "0.1.6" @@ -1142,6 +1247,21 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -1180,13 +1300,14 @@ dependencies = [ "egui-wgpu", "env_logger", "flare-shader", + "futures", "futures-executor", "glam", + "image", "rand", "rand_xoshiro", "spirv-builder", "wgpu", - "winit", ] [[package]] @@ -1252,6 +1373,31 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + [[package]] name = "futures-core" version = "0.3.31" @@ -1317,6 +1463,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1359,6 +1506,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.30.0" @@ -1520,6 +1677,16 @@ dependencies = [ "bitflags 2.8.0", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.14.5" @@ -1725,11 +1892,37 @@ checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", + "zune-core", + "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +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 = "immutable-chunkmap" version = "2.0.6" @@ -1755,6 +1948,17 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "969ee3fc68ec2e88eb21434ce4d9b7e1600d1ce92ff974560a6c4a304f5124b9" +[[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 = "is_terminal_polyfill" version = "1.70.1" @@ -1770,6 +1974,15 @@ dependencies = [ "either", ] +[[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.14" @@ -1846,12 +2059,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.6" @@ -1919,6 +2148,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1928,6 +2166,16 @@ dependencies = [ "libc", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -1967,6 +2215,12 @@ dependencies = [ "paste", ] +[[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.3" @@ -2039,6 +2293,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.29.0" @@ -2058,6 +2318,63 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2531,6 +2848,34 @@ name = "profiling" version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" @@ -2605,6 +2950,56 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-string" version = "0.3.5" @@ -2617,6 +3012,26 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.4.1" @@ -2670,6 +3085,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + [[package]] name = "rspirv" version = "0.12.0+sdk-1.3.268.0" @@ -2702,7 +3123,7 @@ dependencies = [ "bytemuck", "either", "indexmap", - "itertools", + "itertools 0.10.5", "lazy_static", "libc", "log", @@ -2867,6 +3288,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2899,6 +3329,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "slab" version = "0.4.9" @@ -2983,7 +3422,7 @@ dependencies = [ "elsa", "indexmap", "internal-iterator", - "itertools", + "itertools 0.10.5", "lazy_static", "longest-increasing-subsequence", "rustc-hash", @@ -3124,6 +3563,25 @@ dependencies = [ "syn", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tempfile" version = "3.15.0" @@ -3245,11 +3703,26 @@ dependencies = [ "zerovec", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -3258,6 +3731,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -3388,6 +3863,23 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -4395,6 +4887,30 @@ dependencies = [ "syn", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "4.2.0" diff --git a/crates/flare-shader/src/lib.rs b/crates/flare-shader/src/lib.rs index f39b709..52ee960 100644 --- a/crates/flare-shader/src/lib.rs +++ b/crates/flare-shader/src/lib.rs @@ -339,7 +339,7 @@ pub fn main_fs( #[spirv(frag_coord)] frag_coord: Vec4, #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] viewport_constants: &ViewportConstants, #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] accum_constants: &AccumConstants, - #[spirv(storage_buffer, descriptor_set = 0, binding = 2)] _accum_image: &mut [Vec4], + #[spirv(storage_buffer, descriptor_set = 0, binding = 3)] accum_image: &mut [Vec4], output: &mut Vec4, ) { // Bootleg texture sampling; map from viewport image pixel coordinates to accumulator image @@ -365,29 +365,19 @@ pub fn main_fs( let offset_x = (v_width * scale - a_width) / 2.0; let offset_y = (v_height * scale - a_height) / 2.0; - let _accum_coordinate = viewport_coordinate.as_vec2() * scale - vec2(offset_x, offset_y); + let accum_coordinate = viewport_coordinate.as_vec2() * scale - vec2(offset_x, offset_y); - /* if accum_coordinate.x < 0.0 - || accum_coordinate.x >= ifs_constants.accum_width as f32 + || accum_coordinate.x >= accum_constants.width as f32 || accum_coordinate.y < 0.0 - || accum_coordinate.y >= ifs_constants.accum_height as f32 + || accum_coordinate.y >= accum_constants.height as f32 { - *output = ifs_constants.background_color; + *output = vec4(0.0, 0.0, 0.0, 1.0); } else { *output = accum_image[image_index( accum_coordinate.x as i32, accum_coordinate.y as i32, - ifs_constants.accum_width, + accum_constants.width, ) as usize]; } - */ - - if viewport_coordinate.x == 0 - || viewport_coordinate.x == viewport_constants.width as u32 - 1 - || viewport_coordinate.y == 0 - || viewport_coordinate.y == viewport_constants.height as u32 - 1 - { - *output = glam::Vec4::splat(1.); - } } diff --git a/crates/flare/Cargo.toml b/crates/flare/Cargo.toml index 31b686b..75d8d4a 100644 --- a/crates/flare/Cargo.toml +++ b/crates/flare/Cargo.toml @@ -13,12 +13,13 @@ egui = "0.31" egui-wgpu = "0.31" env_logger.workspace = true flare-shader = { path = "../flare-shader" } +futures = "0.3" futures-executor.workspace = true glam.workspace = true +image = "0.25" rand = { workspace = true, default-features = true } rand_xoshiro.workspace = true wgpu.workspace = true -winit.workspace = true [build-dependencies] spirv-builder.workspace = true diff --git a/crates/flare/src/main.rs b/crates/flare/src/main.rs index 98700b7..f47b7b6 100644 --- a/crates/flare/src/main.rs +++ b/crates/flare/src/main.rs @@ -1,9 +1,17 @@ use eframe::Frame; use eframe::epaint::PaintCallbackInfo; -use egui::Context; +use egui::{Context, Rect}; use egui_wgpu::{CallbackResources, CallbackTrait, ScreenDescriptor}; -use flare_shader::{CameraConstants, Coefs, ViewportConstants, ThreadState, Transform, Variation, VariationKind, AccumConstants}; +use flare_shader::{ + AccumConstants, CameraConstants, Coefs, ThreadState, Transform, Variation, VariationKind, + ViewportConstants, +}; +use futures::channel::oneshot; +use futures_executor::block_on; +use image::codecs::png::PngEncoder; +use image::{ExtendedColorType, ImageEncoder}; use rand::thread_rng; +use std::fs::File; use wgpu::util::DeviceExt; use wgpu::{CommandBuffer, CommandEncoder, Device, Queue, RenderPass}; @@ -74,11 +82,11 @@ impl RenderGroup { fn build_image_accum_buffer(device: &wgpu::Device, width: i32, height: i32) -> wgpu::Buffer { let pixel_count = (width * height) as u64; - let size = pixel_count * size_of::() as u64; + let size = pixel_count * 4 * size_of::() as u64; device.create_buffer(&wgpu::BufferDescriptor { label: Some("accum_image"), size, - usage: wgpu::BufferUsages::STORAGE, + usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_SRC, mapped_at_creation: false, }) } @@ -115,12 +123,7 @@ impl RenderGroup { }) } - pub fn new( - device: &wgpu::Device, - queue: &wgpu::Queue, - width: i32, - height: i32, - ) -> Self { + pub fn new(device: &wgpu::Device, queue: &wgpu::Queue, width: i32, height: i32) -> Self { let bind_group_layout = Self::bind_group_layout(device); let viewport_constants_buffer = device.create_buffer(&wgpu::BufferDescriptor { @@ -146,8 +149,7 @@ impl RenderGroup { usage: wgpu::BufferUsages::STORAGE | wgpu::BufferUsages::COPY_DST, }); - let image_accum_buffer = - Self::build_image_accum_buffer(device, width, height); + let image_accum_buffer = Self::build_image_accum_buffer(device, width, height); let bind_group = Self::build_bind_group( device, @@ -192,8 +194,17 @@ impl RenderGroup { pub fn set_viewport_dimensions(&mut self, rect: egui::Rect) { let offset = rect.left_top(); - let viewport_constants = ViewportConstants::new(offset.x as i32, offset.y as i32, rect.width() as i32, rect.height() as i32); - self.queue.write_buffer(&self.viewport_constants_buffer, 0, bytemuck::cast_slice(&[viewport_constants])) + let viewport_constants = ViewportConstants::new( + offset.x as i32, + offset.y as i32, + rect.width() as i32, + rect.height() as i32, + ); + self.queue.write_buffer( + &self.viewport_constants_buffer, + 0, + bytemuck::cast_slice(&[viewport_constants]), + ) } pub fn bind_group(&self) -> &wgpu::BindGroup { @@ -276,20 +287,24 @@ impl IfsGroup { } pub fn set_transforms(&mut self, transforms: &[Transform]) { - let transforms_buffer = self.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("transforms"), - contents: bytemuck::cast_slice(transforms), - usage: wgpu::BufferUsages::STORAGE, - }); + let transforms_buffer = self + .device + .create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("transforms"), + contents: bytemuck::cast_slice(transforms), + usage: wgpu::BufferUsages::STORAGE, + }); let _ = self.transforms_buffer.insert(transforms_buffer); } pub fn set_variations(&mut self, variations: &[Variation]) { - let variations_buffer = self.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { - label: Some("variations"), - contents: bytemuck::cast_slice(variations), - usage: wgpu::BufferUsages::STORAGE, - }); + let variations_buffer = self + .device + .create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("variations"), + contents: bytemuck::cast_slice(variations), + usage: wgpu::BufferUsages::STORAGE, + }); let _ = self.variations_buffer.insert(variations_buffer); } @@ -453,6 +468,13 @@ impl eframe::App for Flare { egui::TopBottomPanel::top("top_panel").show(ctx, |ui| { egui::menu::bar(ui, |ui| { ui.menu_button("File", |ui| { + if ui.button("Debug").clicked() { + ui.painter().add(egui_wgpu::Callback::new_paint_callback( + Rect::ZERO, + DebugIfs, + )); + ui.close_menu(); + } if ui.button("Quit").clicked() { ctx.send_viewport_cmd(egui::ViewportCommand::Close); } @@ -477,6 +499,85 @@ impl eframe::App for Flare { } } +struct DebugIfs; + +impl CallbackTrait for DebugIfs { + fn prepare( + &self, + device: &Device, + queue: &Queue, + _screen_descriptor: &ScreenDescriptor, + egui_encoder: &mut CommandEncoder, + callback_resources: &mut CallbackResources, + ) -> Vec { + let flare_assets = callback_resources + .get::() + .expect("Missing assets"); + + let export_buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: Some("image_export"), + size: flare_assets.render_group.image_accum_buffer.size(), + usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ, + mapped_at_creation: false, + }); + + let device_extra = device.clone(); + let width_extra = flare_assets.render_group.accum_constants.width as u32; + let height_extra = flare_assets.render_group.accum_constants.height as u32; + + egui_encoder.copy_buffer_to_buffer( + &flare_assets.render_group.image_accum_buffer, + 0, + &export_buffer, + 0, + export_buffer.size(), + ); + queue.on_submitted_work_done(move || { + let slice = export_buffer.slice(..); + let (sender, receiver) = oneshot::channel(); + + slice.map_async(wgpu::MapMode::Read, move |result| { + if let Ok(result) = result { + sender.send(result).unwrap() + } + }); + + device_extra.poll(wgpu::Maintain::Wait); + block_on(receiver).expect("Unable to map buffer"); + + let result: Vec = { + let data = slice.get_mapped_range(); + bytemuck::cast_slice(&data).to_vec() + }; + export_buffer.unmap(); + + let result_u8: Vec = result.iter().map(|v| (*v * 256.0) as u8).collect(); + + let file = File::create("accum_image.png").expect("Unable to create output image"); + let png_encoder = PngEncoder::new(file); + + png_encoder + .write_image( + &result_u8, + width_extra, + height_extra, + ExtendedColorType::Rgba8, + ) + .expect("Unable to write output"); + }); + + vec![] + } + + fn paint( + &self, + _info: PaintCallbackInfo, + _render_pass: &mut RenderPass<'static>, + _callback_resources: &CallbackResources, + ) { + } +} + struct PaintIfs { run_accumulate: bool, viewport: egui::Rect, @@ -491,11 +592,11 @@ impl CallbackTrait for PaintIfs { egui_encoder: &mut CommandEncoder, callback_resources: &mut CallbackResources, ) -> Vec { - if self.run_accumulate { - let flare_assets = callback_resources - .get_mut::() - .expect("Missing assets"); + let flare_assets = callback_resources + .get_mut::() + .expect("Missing assets"); + if self.run_accumulate { flare_assets .render_group .set_accum_dimensions(self.viewport.width() as i32, self.viewport.height() as i32); @@ -510,8 +611,9 @@ impl CallbackTrait for PaintIfs { pass.dispatch_workgroups(1, 1, 1); } - let flare_assets = callback_resources.get_mut::().expect("Missing assets"); - flare_assets.render_group.set_viewport_dimensions(self.viewport); + flare_assets + .render_group + .set_viewport_dimensions(self.viewport); vec![] } @@ -545,6 +647,12 @@ fn main() -> eframe::Result { eframe::run_native( "flare", native_options, - Box::new(|cc| Ok(Box::new(Flare::new(cc, initial_dimensions.x as i32, initial_dimensions.y as i32)))), + Box::new(|cc| { + Ok(Box::new(Flare::new( + cc, + initial_dimensions.x as i32, + initial_dimensions.y as i32, + ))) + }), ) }