From ae8fe0bcf8c94df4c0cf8361d9263836e9acfbff Mon Sep 17 00:00:00 2001 From: Dominic Clifton Date: Sat, 13 Dec 2025 13:25:56 +0000 Subject: [PATCH] Experimentation with a generating headless frames in a loop. --- Cargo.lock | 23 +- Cargo.toml | 12 +- crates/blue_engine_core/Cargo.lock | 472 +++++++++++++++----------- crates/blue_engine_core/src/engine.rs | 18 +- examples/shapes/cube.rs | 15 +- examples/utils/headless.rs | 10 +- examples/utils/headless_loop.rs | 142 ++++++++ 7 files changed, 467 insertions(+), 225 deletions(-) create mode 100644 examples/utils/headless_loop.rs diff --git a/Cargo.lock b/Cargo.lock index 1edcce5..29063c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -348,10 +348,27 @@ dependencies = [ name = "blue_engine" version = "0.10.0" dependencies = [ - "blue_engine_core", + "blue_engine_core 0.10.0", "blue_engine_dynamic", ] +[[package]] +name = "blue_engine_core" +version = "0.10.0" +dependencies = [ + "android_logger", + "bytemuck", + "downcast", + "env_logger", + "glam", + "image", + "log", + "pollster", + "thiserror 2.0.17", + "wgpu", + "winit", +] + [[package]] name = "blue_engine_core" version = "0.10.0" @@ -374,10 +391,8 @@ dependencies = [ [[package]] name = "blue_engine_dynamic" version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9e042a964b2fc65403f72d7b86645db9d93162e371b13e603cfa9c9f680b46" dependencies = [ - "blue_engine_core", + "blue_engine_core 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4a75632..fe69fbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,12 +44,12 @@ glam_fast_math = [ ] [dependencies] -blue_engine_core = { version = "0.10.0", optional = true } -# blue_engine_core = { path = "crates/blue_engine_core", optional = true } +# blue_engine_core = { version = "0.10.0", optional = true } +blue_engine_core = { path = "crates/blue_engine_core", optional = true } # Wasm does not support dynamic linking. -blue_engine_dynamic = { version = "0.10.0", optional = true } -# blue_engine_dynamic = { path = "crates/blue_engine_dynamic", optional = true } +# blue_engine_dynamic = { version = "0.10.0", optional = true } +blue_engine_dynamic = { path = "crates/blue_engine_dynamic", optional = true } # ========== EXAMPLES ========== # @@ -104,6 +104,10 @@ path = "examples/utils/signals.rs" name = "headless" path = "examples/utils/headless.rs" +[[example]] +name = "headless_loop" +path = "examples/utils/headless_loop.rs" + # Development ONLY [[example]] name = "dev" diff --git a/crates/blue_engine_core/Cargo.lock b/crates/blue_engine_core/Cargo.lock index 1467254..f2ea8d6 100644 --- a/crates/blue_engine_core/Cargo.lock +++ b/crates/blue_engine_core/Cargo.lock @@ -46,12 +46,30 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "377e4c0ba83e4431b10df45c1d4666f178ea9c552cac93e60c3a88bf32785923" +dependencies = [ + "as-slice", +] + [[package]] name = "aligned-vec" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "android-activity" version = "0.6.0" @@ -196,6 +214,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -217,6 +244,26 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.17", + "v_frame", + "y4m", +] + [[package]] name = "av1-grain" version = "0.2.3" @@ -272,15 +319,15 @@ name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" -dependencies = [ - "serde", -] [[package]] name = "bitstream-io" -version = "2.6.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" +checksum = "60d4bd9d1db2c6bdf285e223a7fa369d5ce98ec767dec949c6ca62863ce61757" +dependencies = [ + "core2", +] [[package]] name = "block" @@ -299,27 +346,26 @@ dependencies = [ [[package]] name = "blue_engine_core" -version = "0.9.4" +version = "0.10.0" dependencies = [ "android_logger", "bytemuck", "downcast", "env_logger", - "flume", "glam", "image", "log", "pollster", - "thiserror 2.0.12", + "thiserror 2.0.17", "wgpu", "winit", ] [[package]] name = "built" -version = "0.7.7" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" +checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" @@ -329,18 +375,18 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", @@ -402,16 +448,6 @@ 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" @@ -527,6 +563,15 @@ dependencies = [ "libc", ] +[[package]] +name = "core2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" +dependencies = [ + "memchr", +] + [[package]] name = "crc32fast" version = "1.4.2" @@ -644,6 +689,26 @@ dependencies = [ "log", ] +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -662,9 +727,9 @@ dependencies = [ [[package]] name = "exr" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" dependencies = [ "bit_field", "half", @@ -675,6 +740,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" @@ -695,22 +780,16 @@ dependencies = [ ] [[package]] -name = "flume" -version = "0.11.1" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foldhash" -version = "0.1.5" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "foreign-types" @@ -739,18 +818,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - [[package]] name = "gethostname" version = "0.4.3" @@ -768,10 +835,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -788,9 +853,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.13.1" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" dependencies = [ "color_quant", "weezl", @@ -809,12 +874,12 @@ dependencies = [ [[package]] name = "glam" -version = "0.30.1" +version = "0.30.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3aa70d918d2b234126ff4f850f628f172542bf0603ded26b8ee36e5e22d5f9" +checksum = "bd47b05dddf0005d850e5644cae7f2b14ac3df487979dbfff3b56f20b1a6ae46" dependencies = [ "bytemuck", - "serde", + "serde_core", ] [[package]] @@ -877,7 +942,7 @@ checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.9.0", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.15.2", ] [[package]] @@ -906,14 +971,17 @@ version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] -name = "heck" -version = "0.5.0" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] [[package]] name = "hermit-abi" @@ -929,9 +997,9 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "image" -version = "0.25.6" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", @@ -939,6 +1007,7 @@ dependencies = [ "exr", "gif", "image-webp", + "moxcms", "num-traits", "png", "qoi", @@ -946,8 +1015,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core", - "zune-jpeg", + "zune-core 0.5.0", + "zune-jpeg 0.5.6", ] [[package]] @@ -973,7 +1042,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.2", ] [[package]] @@ -995,9 +1064,9 @@ checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" -version = "0.12.1" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -1058,12 +1127,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - [[package]] name = "js-sys" version = "0.3.77" @@ -1164,9 +1227,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "loop9" @@ -1242,11 +1305,21 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "moxcms" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80986bbbcf925ebd3be54c26613d861255284584501595cf418320c078945608" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "naga" -version = "26.0.0" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916cbc7cb27db60be930a4e2da243cf4bc39569195f22fd8ee419cd31d5b662c" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", @@ -1255,7 +1328,7 @@ dependencies = [ "cfg_aliases", "codespan-reporting", "half", - "hashbrown", + "hashbrown 0.16.1", "hexf-parse", "indexmap", "libm", @@ -1264,19 +1337,10 @@ dependencies = [ "once_cell", "rustc-hash", "spirv", - "thiserror 2.0.12", + "thiserror 2.0.17", "unicode-ident", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.15", -] - [[package]] name = "ndk" version = "0.9.0" @@ -1675,6 +1739,12 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1715,11 +1785,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.9.0", "crc32fast", "fdeflate", "flate2", @@ -1814,6 +1884,15 @@ dependencies = [ "syn", ] +[[package]] +name = "pxfm" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" +dependencies = [ + "num-traits", +] + [[package]] name = "qoi" version = "0.4.1" @@ -1855,20 +1934,19 @@ checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" [[package]] name = "rand" -version = "0.8.5" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -1876,11 +1954,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.2", ] [[package]] @@ -1891,13 +1969,15 @@ checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rav1e" -version = "0.7.1" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" dependencies = [ + "aligned-vec 0.6.4", "arbitrary", "arg_enum_proc_macro", "arrayvec", + "av-scenechange", "av1-grain", "bitstream-io", "built", @@ -1912,23 +1992,21 @@ dependencies = [ "noop_proc_macro", "num-derive", "num-traits", - "once_cell", "paste", "profiling", "rand", "rand_chacha", "simd_helpers", - "system-deps", - "thiserror 1.0.69", + "thiserror 2.0.17", "v_frame", "wasm-bindgen", ] [[package]] name = "ravif" -version = "0.11.11" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" dependencies = [ "avif-serialize", "imgref", @@ -2085,31 +2163,32 @@ dependencies = [ [[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_derive" -version = "1.0.219" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "proc-macro2", - "quote", - "syn", + "serde_derive", ] [[package]] -name = "serde_spanned" -version = "0.6.8" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ - "serde", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2191,15 +2270,6 @@ dependencies = [ "serde", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -2209,6 +2279,12 @@ dependencies = [ "bitflags 2.9.0", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + [[package]] name = "static_assertions" version = "1.1.0" @@ -2232,25 +2308,6 @@ dependencies = [ "unicode-ident", ] -[[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 = "termcolor" version = "1.4.1" @@ -2271,11 +2328,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]] @@ -2291,9 +2348,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", @@ -2302,13 +2359,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]] @@ -2336,26 +2396,11 @@ dependencies = [ "strict-num", ] -[[package]] -name = "toml" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" -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" @@ -2364,8 +2409,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap", - "serde", - "serde_spanned", "toml_datetime", "winnow", ] @@ -2422,17 +2465,11 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" dependencies = [ - "aligned-vec", + "aligned-vec 0.5.0", "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" @@ -2666,22 +2703,22 @@ dependencies = [ [[package]] name = "weezl" -version = "0.1.8" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "26.0.1" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b6ff82bbf6e9206828e1a3178e851f8c20f1c9028e74dd3a8090741ccd5798" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", "bitflags 2.9.0", "cfg-if", "cfg_aliases", "document-features", - "hashbrown", + "hashbrown 0.16.1", "js-sys", "log", "naga", @@ -2701,17 +2738,18 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "26.0.1" +version = "27.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f62f1053bd28c2268f42916f31588f81f64796e2ff91b81293515017ca8bd9" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" dependencies = [ "arrayvec", "bit-set", "bit-vec", "bitflags 2.9.0", + "bytemuck", "cfg_aliases", "document-features", - "hashbrown", + "hashbrown 0.16.1", "indexmap", "log", "naga", @@ -2722,7 +2760,7 @@ dependencies = [ "raw-window-handle", "rustc-hash", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "wgpu-core-deps-apple", "wgpu-core-deps-emscripten", "wgpu-core-deps-wasm", @@ -2733,45 +2771,45 @@ dependencies = [ [[package]] name = "wgpu-core-deps-apple" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ae5fbde6a4cbebae38358aa73fcd6e0f15c6144b67ef5dc91ded0db125dbdf" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7670e390f416006f746b4600fdd9136455e3627f5bd763abf9a65daa216dd2d" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-wasm" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03b9f9e1a50686d315fc6debe4980cc45cd37b0e919351917df494e8fdc8885" +checksum = "9b1027dcf3b027a877e44819df7ceb0e2e98578830f8cd34cd6c3c7c2a7a50b7" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-core-deps-windows-linux-android" -version = "26.0.0" +version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720a5cb9d12b3d337c15ff0e24d3e97ed11490ff3f7506e7f3d98c68fa5d6f14" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" dependencies = [ "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "26.0.2" +version = "27.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf873d79f5c8e9699e0fffbbff4d0f7eedbbd228bff11a957987a3b82ca8405f" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" dependencies = [ "android_system_properties", "arrayvec", @@ -2788,7 +2826,7 @@ dependencies = [ "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hashbrown", + "hashbrown 0.16.1", "js-sys", "khronos-egl", "libc", @@ -2798,6 +2836,7 @@ dependencies = [ "naga", "ndk-sys", "objc", + "once_cell", "ordered-float", "parking_lot", "portable-atomic", @@ -2807,7 +2846,7 @@ dependencies = [ "raw-window-handle", "renderdoc-sys", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "wasm-bindgen", "web-sys", "wgpu-types", @@ -2817,15 +2856,15 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "26.0.0" +version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca7a8d8af57c18f57d393601a1fb159ace8b2328f1b6b5f80893f7d672c9ae2" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ "bitflags 2.9.0", "bytemuck", "js-sys", "log", - "thiserror 2.0.12", + "thiserror 2.0.17", "web-sys", ] @@ -3240,6 +3279,12 @@ version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + [[package]] name = "zerocopy" version = "0.7.35" @@ -3286,6 +3331,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" @@ -3297,9 +3348,18 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.14" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core 0.4.12", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +checksum = "f520eebad972262a1dde0ec455bce4f8b298b1e5154513de58c114c4c54303e8" dependencies = [ - "zune-core", + "zune-core 0.5.0", ] diff --git a/crates/blue_engine_core/src/engine.rs b/crates/blue_engine_core/src/engine.rs index a66a8b7..8794490 100644 --- a/crates/blue_engine_core/src/engine.rs +++ b/crates/blue_engine_core/src/engine.rs @@ -1,3 +1,4 @@ +use std::ops::ControlFlow; #[cfg(all(feature = "window", not(feature = "headless")))] use crate::Window; use crate::{CameraContainer, ObjectStorage, Renderer, SignalStorage}; @@ -145,7 +146,7 @@ pub struct Engine { pub signals: SignalStorage, /// holds the update_loop function - pub update_loop: Option>, + pub update_loop: Option ControlFlow<()>>>, /// Simplified input events #[cfg(all(feature = "window", not(feature = "headless")))] @@ -247,7 +248,7 @@ impl Engine { + FnMut( // Coreall(target_os = "android", not(feature = "headless")) &mut Engine, - ), + ) -> ControlFlow<()>, ) -> Result<(), crate::error::Error> { #[cfg(all(not(feature = "headless"), feature = "window"))] { @@ -293,14 +294,14 @@ impl Engine { #[cfg(all(not(feature = "headless"), feature = "window"))] event_loop.set_control_flow(self.event_loop_control_flow); #[cfg(all(not(feature = "headless"), feature = "window"))] - event_loop.run_app(self)?; + let result = event_loop.run_app(self)?; #[cfg(all( not(target_os = "android"), not(feature = "window"), feature = "headless" ))] - { + let result = { let window_size = (self.renderer.config.width, self.renderer.config.height); let mut events = std::mem::take(&mut self.signals.events); @@ -340,11 +341,14 @@ impl Engine { self.renderer.render(encoder, frame, headless_output); - update_function(self); + match update_function(self) { + ControlFlow::Break(r) => break r, + ControlFlow::Continue(_) => {} + } } } - } + }; - Ok(()) + Ok(result) } } diff --git a/examples/shapes/cube.rs b/examples/shapes/cube.rs index 76f43ca..7433ba8 100644 --- a/examples/shapes/cube.rs +++ b/examples/shapes/cube.rs @@ -3,11 +3,20 @@ * * The license is same as the one on the root. */ - +use std::ops::ControlFlow; +use blue_engine_core::EngineSettings; use blue_engine::{prelude::Engine, primitive_shapes::cube, ObjectSettings}; +use blue_engine::wgpu::Limits; fn main() -> Result<(), blue_engine::error::Error> { - let mut engine = Engine::new()?; + let mut engine = Engine::new_config(EngineSettings { + limits: Limits { + max_texture_dimension_1d: 4096, + max_texture_dimension_2d: 4096, + ..Default::default() + }, + ..Default::default() + })?; cube( "Cube", @@ -29,6 +38,8 @@ fn main() -> Result<(), blue_engine::error::Error> { let camy = start.elapsed().as_secs_f32().sin() * radius; let camz = start.elapsed().as_secs_f32().cos() * radius; engine.camera.set_position((camx, camy, camz)); + + ControlFlow::Continue(()) })?; Ok(()) diff --git a/examples/utils/headless.rs b/examples/utils/headless.rs index 79d9038..5d9060b 100644 --- a/examples/utils/headless.rs +++ b/examples/utils/headless.rs @@ -16,8 +16,9 @@ use blue_engine::{ Engine, EngineSettings, ObjectSettings, image::ImageEncoder, primitive_shapes::triangle, }; +use blue_engine::wgpu::Limits; -pub fn output_image_native(image_data: Vec, texture_dims: (usize, usize), path: &str) { +pub fn output_image_native(image_data: &Vec, texture_dims: (usize, usize), path: &str) { let writer = std::fs::File::create(path).unwrap(); let encoder = blue_engine::image::codecs::png::PngEncoder::new(writer); encoder @@ -40,6 +41,11 @@ fn main() -> Result<(), blue_engine::error::Error> { // The width and height must be respecting of the 256 padding height: 1024, width: 1024, + limits: Limits { + max_texture_dimension_1d: 4096, + max_texture_dimension_2d: 4096, + ..Default::default() + }, ..Default::default() })?; @@ -54,7 +60,7 @@ fn main() -> Result<(), blue_engine::error::Error> { engine.update_loop(move |_engine| { #[cfg(feature = "headless")] output_image_native( - _engine.renderer.headless_texture_data.clone(), + &_engine.renderer.headless_texture_data, ( // since we do not have a window, the width and // height is taken from the configuration of the renderer diff --git a/examples/utils/headless_loop.rs b/examples/utils/headless_loop.rs new file mode 100644 index 0000000..0686918 --- /dev/null +++ b/examples/utils/headless_loop.rs @@ -0,0 +1,142 @@ +/* + * Headless mode example of the Blue Engine. In this mode, the frames are + * rendered without a window being available. However, texture are being + * presented during the runtime as bytes format, so that it can be used + * however it is needed. + * + * To use this feature, you MUST disable the window feature, which is turned + * on by default, and enable headless mode. This feature does not work for + * android yet. + * + * example in Cargo.toml: + * + * blue_engine = { version = "*", default-features = false, features = ["static_link", "debug", "headless"] } + */ +use std::ops::ControlFlow; +use blue_engine_core::{RotateAmount, RotateAxis}; +use blue_engine::{ + Engine, EngineSettings, ObjectSettings, image::ImageEncoder, primitive_shapes::{triangle, cube}, +}; +use blue_engine::wgpu::Limits; + +pub fn output_image_native(image_data: &Vec, texture_dims: (usize, usize), path: &str) { + let writer = std::fs::File::create(path).unwrap(); + let encoder = blue_engine::image::codecs::png::PngEncoder::new(writer); + encoder + .write_image( + &image_data, + texture_dims.0 as u32, + texture_dims.1 as u32, + blue_engine::image::ExtendedColorType::Rgba8, + ) + .unwrap(); + + //std::process::exit(0); + // ^^ NO CALL TO EXIT HERE! +} + +fn main() -> Result<(), blue_engine::error::Error> { + let mut engine = Engine::new_config(EngineSettings { + // The width and height must be respecting of the 256 padding + height: 1024, + width: 1024, + limits: Limits { + max_texture_dimension_1d: 4096, + max_texture_dimension_2d: 4096, + // ^^^ Needed otherwise engine creation fails on Raspberry Pi 5 + ..Default::default() + }, + ..Default::default() + })?; + + + triangle( + "Triangle", + ObjectSettings::default(), + &mut engine.renderer, + &mut engine.objects, + )?; + + engine + .objects + .get_mut("Triangle") + .unwrap() + .set_position((0f32, 0f32, 1f32)) + .set_scale((0.5f32, 0.5f32, 0.5f32)) + .set_color(1f32, 0f32, 0f32, 1f32); + + // ^^^ Results in a BLUE triangle + + cube( + "Cube", + ObjectSettings::default(), + &mut engine.renderer, + &mut engine.objects, + )?; + + engine + .objects + .get_mut("Cube") + .unwrap() + .set_position((0f32, 0f32, 0f32)) + .set_scale((1f32, 1f32, 1.0f32)) + .set_color(0f32, 0f32, 1f32, 1f32); + + // ^^^ Results in a RED cube + + let steps = 30; + + let mut frame_index = 0; + let start_at = std::time::Instant::now(); + let mut last_frame_at = start_at; + + let _ = engine.update_loop(move |engine| { + frame_index += 1; + + let rotate = 360f32 * (frame_index as f32 / steps as f32) ; + println!("rotation: {}deg", rotate); + engine + .objects + .get_mut("Cube") + .unwrap() + .rotate(RotateAmount::Degrees(rotate), RotateAxis::Z); + + engine + .objects + .get_mut("Triangle") + .unwrap() + .rotate(RotateAmount::Degrees(-rotate), RotateAxis::Y); + + output_image_native( + &engine.renderer.headless_texture_data, + ( + // since we do not have a window, the width and + // height is taken from the configuration of the renderer + engine.renderer.config.width as usize, + engine.renderer.config.height as usize, + ), + format!("frame_{}.png", frame_index).as_str(), + ); + + let now = std::time::Instant::now(); + let elapsed_since_start = now - start_at; + let frame_duration = now - last_frame_at; + last_frame_at = now; + println!("frame {}, elapsed: {}ms, frame_duration: {}ms", frame_index, elapsed_since_start.as_millis(), frame_duration.as_millis()); + + if frame_index >= steps { + ControlFlow::Break(()) + } else { + ControlFlow::Continue(()) + } + // ^^^ added a system to allow exiting from the update loop and exiting gracefully. + // see API changes to `update_loop` + }); + + let elapsed_since_start = start_at.elapsed(); + + println!("Done!, took {}ms", elapsed_since_start.as_millis()); + // ^^^ this MUST be printed + + Ok(()) +}