diff --git a/.cargo/config.toml b/.cargo/config.toml index 13ccc194..7dcc7f7b 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,5 @@ [alias] -shaders = "gpu build --output-dir crates/renderling/shaders --shader-crate crates/renderling/ --shader-manifest crates/renderling/shaders/manifest.json" +shaders = "gpu toml crates/renderling" [build] rustflags = ["--cfg=web_sys_unstable_apis"] diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..0fa5070f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.spv binary +*.wgsl binary diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 798f4ee5..c71e5aaf 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -18,11 +18,9 @@ jobs: - uses: actions/cache@v4 with: path: ~/.cache/rust-gpu - key: ${{ runner.os }} + key: 0-${{ runner.os }} - uses: moonrepo/setup-rust@v1 - - run: rustup toolchain add nightly-2024-04-24 - - run: rustup component add --toolchain nightly-2024-04-24 rust-src rustc-dev llvm-tools - - run: cargo install --git https://github.com/rust-gpu/cargo-gpu + - run: RUST_LOG=trace cargo install --git https://github.com/rust-gpu/cargo-gpu - run: rm -rf crates/renderling/src/linkage/* crates/renderling/shaders - run: RUST_LOG=trace cargo shaders - run: cargo build -p renderling diff --git a/Cargo.lock b/Cargo.lock index ec941949..cbe8b919 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "ab_glyph" -version = "0.2.28" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -19,10 +19,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "ahash" @@ -48,9 +48,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f" [[package]] name = "android-activity" @@ -99,9 +99,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -114,36 +114,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -166,15 +166,15 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "as-raw-xcb-connection" @@ -227,7 +227,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" dependencies = [ "async-lock", - "autocfg 1.3.0", + "autocfg 1.4.0", "blocking", "futures-lite 1.13.0", ] @@ -270,14 +270,14 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" dependencies = [ - "autocfg 1.3.0", + "autocfg 1.4.0", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "base64" @@ -287,18 +287,18 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bit-set" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bit_field" @@ -342,7 +342,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.3.0", + "futures-lite 2.5.0", "piper", ] @@ -354,22 +354,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -378,17 +378,23 @@ 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.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "calloop" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ "bitflags 2.6.0", "log", @@ -400,9 +406,9 @@ dependencies = [ [[package]] name = "calloop-wayland-source" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" dependencies = [ "calloop", "rustix", @@ -412,13 +418,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.104" +version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b6a57f98764a267ff415d50a25e6e166f3831a5071af4995296ea97d210490" +checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ "jobserver", "libc", - "once_cell", + "shlex", ] [[package]] @@ -474,9 +480,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -484,9 +490,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -496,21 +502,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.8" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "cloudabi" @@ -539,40 +545,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" - -[[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "combine" @@ -625,9 +600,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -655,9 +630,9 @@ dependencies = [ [[package]] name = "crabslab" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3781ede0f1a6126c8dc76581800b73c76c029485f1ce11840661b9eade6138" +checksum = "33f1b554aea54b251b8094d2e493b5b1003d43a759fc6e206e43e8ef0450a9b1" dependencies = [ "crabslab-derive", "futures-lite 1.13.0", @@ -667,13 +642,13 @@ dependencies = [ [[package]] name = "crabslab-derive" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23834bdd3f175b7899b352743b70b855639f662ac6f07360ff85c502e144cfde" +checksum = "ef999dd82fff9dc1f2cf371c0f9a6315016b9562a04811fbefae2d80da6a1fad" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -738,7 +713,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -747,17 +722,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" -[[package]] -name = "d3d12" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" -dependencies = [ - "bitflags 2.6.0", - "libloading", - "winapi", -] - [[package]] name = "dagga" version = "0.2.1" @@ -861,9 +825,9 @@ dependencies = [ [[package]] name = "euclid" -version = "0.22.10" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f0eb73b934648cd7a4a61f1b15391cd95dab0b4da6e2e66c2a072c144b4a20" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" dependencies = [ "num-traits", ] @@ -899,7 +863,7 @@ dependencies = [ name = "example" version = "0.1.0" dependencies = [ - "clap 4.5.8", + "clap 4.5.20", "env_logger", "futures-lite 1.13.0", "gltf", @@ -924,7 +888,7 @@ version = "0.1.0" dependencies = [ "env_logger", "example", - "fastrand 2.1.1", + "fastrand 2.2.0", "log", "renderling", "winit", @@ -951,12 +915,11 @@ dependencies = [ [[package]] name = "exr" -version = "1.72.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "flume", "half", "lebe", "miniz_oxide", @@ -976,15 +939,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" dependencies = [ "simd-adler32", ] @@ -1006,9 +969,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -1020,15 +983,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", -] - [[package]] name = "foreign-types" version = "0.5.0" @@ -1047,7 +1001,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -1064,15 +1018,15 @@ checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -1091,9 +1045,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "futures-core", "pin-project-lite", @@ -1143,18 +1097,18 @@ dependencies = [ [[package]] name = "glam" -version = "0.24.2" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" +checksum = "dc46dd3ec48fdd8e693a98d2b8bafae273a2d54c1de02a2a7e3d57d501f39677" dependencies = [ "libm", ] [[package]] name = "glow" -version = "0.13.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" dependencies = [ "js-sys", "slotmap", @@ -1171,7 +1125,7 @@ dependencies = [ "base64", "byteorder", "gltf-json", - "image 0.25.1", + "image 0.25.5", "lazy_static", "serde_json", "urlencoding", @@ -1186,7 +1140,7 @@ dependencies = [ "inflections", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -1212,9 +1166,9 @@ dependencies = [ [[package]] name = "glyph_brush" -version = "0.7.9" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca26e3a8a43052ca015c0b1ce055035ff5bc47afddff5b01c7141e0c3e3a2a1" +checksum = "225e5bd28cddb97578e31da78ae24eff4d6611523fb03b73f300d511461834c0" dependencies = [ "glyph_brush_draw_cache", "glyph_brush_layout", @@ -1269,14 +1223,13 @@ dependencies = [ [[package]] name = "gpu-allocator" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" dependencies = [ "log", "presser", "thiserror", - "winapi", "windows", ] @@ -1288,7 +1241,7 @@ checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" dependencies = [ "bitflags 2.6.0", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -1321,19 +1274,10 @@ dependencies = [ ] [[package]] -name = "hassle-rs" -version = "0.11.0" +name = "hashbrown" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" -dependencies = [ - "bitflags 2.6.0", - "com", - "libc", - "libloading", - "thiserror", - "widestring", - "winapi", -] +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1356,12 +1300,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.4.0" @@ -1414,12 +1352,12 @@ dependencies = [ [[package]] name = "image" -version = "0.25.1" +version = "0.25.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" dependencies = [ "bytemuck", - "byteorder", + "byteorder-lite", "num-traits", "png", "zune-core", @@ -1437,12 +1375,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.1", ] [[package]] @@ -1462,20 +1400,20 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" @@ -1507,9 +1445,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -1525,9 +1463,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1563,15 +1501,15 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "libloading" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -1579,19 +1517,19 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" -version = "0.0.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", + "redox_syscall 0.5.7", ] [[package]] @@ -1631,7 +1569,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "autocfg 1.3.0", + "autocfg 1.4.0", "scopeguard", ] @@ -1663,9 +1601,9 @@ dependencies = [ [[package]] name = "lyon_geom" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edecfb8d234a2b0be031ab02ebcdd9f3b9ee418fb35e265f7a540a48d197bff9" +checksum = "8af69edc087272df438b3ee436c4bb6d7c04aa8af665cfd398feae627dbd8570" dependencies = [ "arrayvec", "euclid", @@ -1674,9 +1612,9 @@ dependencies = [ [[package]] name = "lyon_path" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c08a606c7a59638d6c6aa18ac91a06aa9fb5f765a7efb27e6a4da58700740d7" +checksum = "8e0b8aec2f58586f6eef237985b9a9b7cb3a3aff4417c575075cf95bf925252e" dependencies = [ "lyon_geom", "num-traits", @@ -1710,9 +1648,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -1732,21 +1670,30 @@ dependencies = [ "paste", ] +[[package]] +name = "minicov" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27fe9f1cc3c22e1687f9446c2083c4c5fc7f0bcf1c7a86bdbded14985895b4b" +dependencies = [ + "cc", + "walkdir", +] + [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", "simd-adler32", ] [[package]] name = "naga" -version = "22.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" +version = "23.0.0" +source = "git+https://github.com/gfx-rs/wgpu.git#79a6f2cd3158ff1ae16b94fcf260cf52744c73fc" dependencies = [ "arrayvec", "bit-set", @@ -1809,29 +1756,29 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "autocfg 1.3.0", + "autocfg 1.4.0", "libm", ] [[package]] name = "num_enum" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -2048,42 +1995,42 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "orbclient" -version = "0.3.47" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" dependencies = [ "libredox", ] [[package]] name = "ordered-float" -version = "4.2.1" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ff2cf528c6c03d9ed653d6c4ce1dc0582dc4af309790ad92f07c1cd551b0be" +checksum = "c65ee1f9701bf938026630b455d5315f490640234259037edb259798b3bcf85e" dependencies = [ "num-traits", ] [[package]] name = "owned_ttf_parser" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ - "ttf-parser 0.24.0", + "ttf-parser 0.25.0", ] [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2103,7 +2050,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -2138,52 +2085,52 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "piper" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-io", ] [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "png" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -2194,9 +2141,9 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.2" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", @@ -2204,14 +2151,17 @@ dependencies = [ "pin-project-lite", "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "presser" @@ -2221,9 +2171,9 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -2231,27 +2181,27 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] [[package]] name = "profiling" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" [[package]] name = "qoi" @@ -2264,18 +2214,18 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.34.0" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f24d770aeca0eacb81ac29dfbc55ebcc09312fdd1f8bbecdc7e4a84e000e3b4" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2468,18 +2418,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2489,9 +2439,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2500,9 +2450,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "renderdoc-sys" @@ -2523,7 +2473,7 @@ dependencies = [ "dagga", "env_logger", "example", - "fastrand 2.1.1", + "fastrand 2.2.0", "futures-lite 1.13.0", "glam", "gltf", @@ -2560,6 +2510,7 @@ dependencies = [ "loading-bytes", "log", "lyon", + "pretty_assertions", "renderling", "rustc-hash 1.1.0", "snafu", @@ -2580,9 +2531,9 @@ checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "99e4ea3e1cdc4b559b8e5650f9c8e5998e3e5c1343b4eaf034565f32318d63c0" dependencies = [ "bitflags 2.6.0", "errno", @@ -2629,9 +2580,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" -version = "0.9.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7555fcb4f753d095d734fdefebb0ad8c98478a21db500492d87c55913d3b0086" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" dependencies = [ "ab_glyph", "log", @@ -2648,35 +2599,42 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" 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" @@ -2689,7 +2647,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "autocfg 1.3.0", + "autocfg 1.4.0", ] [[package]] @@ -2709,9 +2667,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "smithay-client-toolkit" -version = "0.18.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ "bitflags 2.6.0", "calloop", @@ -2763,15 +2721,6 @@ dependencies = [ "syn 1.0.109", ] -[[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" @@ -2784,8 +2733,7 @@ dependencies = [ [[package]] name = "spirv-std" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c3c0972a2df79abe2c8af2fe7f7937a9aa558b6a1f78fc5edf93f4d480d757" +source = "git+https://github.com/Rust-GPU/rust-gpu#9be942e96730726a61a742fd41465bdc8a81aa34" dependencies = [ "bitflags 1.3.2", "glam", @@ -2797,8 +2745,7 @@ dependencies = [ [[package]] name = "spirv-std-macros" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f776bf9f2897ea7acff15d7753711fdf1693592bd7459a01c394262b1df45c" +source = "git+https://github.com/Rust-GPU/rust-gpu#9be942e96730726a61a742fd41465bdc8a81aa34" dependencies = [ "proc-macro2", "quote", @@ -2809,8 +2756,7 @@ dependencies = [ [[package]] name = "spirv-std-types" version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a73417b7d72d95b4995c840dceb4e3b4bcbad4ff7f35df9c1655b6826c18d3a9" +source = "git+https://github.com/Rust-GPU/rust-gpu#9be942e96730726a61a742fd41465bdc8a81aa34" [[package]] name = "static_assertions" @@ -2849,9 +2795,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.68" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -2878,22 +2824,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -2934,15 +2880,15 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "toml_datetime", @@ -2973,44 +2919,42 @@ checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" [[package]] name = "ttf-parser" -version = "0.24.0" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8686b91785aff82828ed725225925b33b4fde44c4bb15876e5f7c832724c420a" +checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" [[package]] name = "twox-hash" -version = "1.6.3" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +checksum = "a6db6856664807f43c17fbaf2718e2381ac1476a449aa104f5f64622defa1245" dependencies = [ - "cfg-if", "rand 0.8.5", - "static_assertions", ] [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] name = "urlencoding" @@ -3032,9 +2976,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "waker-fn" @@ -3060,34 +3004,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -3097,9 +3042,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3107,31 +3052,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-bindgen-test" -version = "0.3.42" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9bf62a58e0780af3e852044583deee40983e5886da43a271dd772379987667b" +checksum = "d381749acb0943d357dcbd8f0b100640679883fcdeeef04def49daf8d33a5426" dependencies = [ "console_error_panic_hook", "js-sys", + "minicov", "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", @@ -3140,20 +3086,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.42" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f89739351a2e03cb94beb799d47fb2cac01759b40ec441f7de39b00cbf7ef0" +checksum = "c97b2ef2c8d627381e51c071c2ab328eac606d3f69dd82bcbca20a9e389d95f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] name = "wayland-backend" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269c04f203640d0da2092d1b8d89a2d081714ae3ac2f1b53e99f205740517198" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", @@ -3165,9 +3111,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.4" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bd0f46c069d3382a36c8666c1b9ccef32b8b04f41667ca1fef06a1adcc2982" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", "rustix", @@ -3188,9 +3134,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.4" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09414bcf0fd8d9577d73e9ac4659ebc45bcc9cff1980a350543ad8e50ee263b2" +checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" dependencies = [ "rustix", "wayland-client", @@ -3199,9 +3145,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.31.2" +version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -3211,9 +3157,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.2.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -3224,9 +3170,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.2.0" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -3237,9 +3183,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.3" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edf466fc49a4feb65a511ca403fec3601494d0dee85dbf37fff6fa0dd4eec3b6" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" dependencies = [ "proc-macro2", "quick-xml", @@ -3248,9 +3194,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.3" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6754825230fa5b27bafaa28c30b3c9e72c55530581220cef401fa422c0fae7" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" dependencies = [ "dlib", "log", @@ -3260,9 +3206,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -3286,9 +3232,8 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" -version = "22.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" +version = "23.0.0" +source = "git+https://github.com/gfx-rs/wgpu.git#79a6f2cd3158ff1ae16b94fcf260cf52744c73fc" dependencies = [ "arrayvec", "cfg_aliases 0.1.1", @@ -3311,9 +3256,8 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "22.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" +version = "23.0.0" +source = "git+https://github.com/gfx-rs/wgpu.git#79a6f2cd3158ff1ae16b94fcf260cf52744c73fc" dependencies = [ "arrayvec", "bit-vec", @@ -3337,9 +3281,8 @@ dependencies = [ [[package]] name = "wgpu-hal" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" +version = "23.0.0" +source = "git+https://github.com/gfx-rs/wgpu.git#79a6f2cd3158ff1ae16b94fcf260cf52744c73fc" dependencies = [ "android_system_properties", "arrayvec", @@ -3347,15 +3290,14 @@ dependencies = [ "bit-set", "bitflags 2.6.0", "block", + "bytemuck", "cfg_aliases 0.1.1", "core-graphics-types", - "d3d12", "glow", "glutin_wgl_sys", "gpu-alloc", "gpu-allocator", "gpu-descriptor", - "hassle-rs", "js-sys", "khronos-egl", "libc", @@ -3377,26 +3319,20 @@ dependencies = [ "wasm-bindgen", "web-sys", "wgpu-types", - "winapi", + "windows", + "windows-core", ] [[package]] name = "wgpu-types" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" +version = "23.0.0" +source = "git+https://github.com/gfx-rs/wgpu.git#79a6f2cd3158ff1ae16b94fcf260cf52744c73fc" dependencies = [ "bitflags 2.6.0", "js-sys", "web-sys", ] -[[package]] -name = "widestring" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" - [[package]] name = "winapi" version = "0.3.9" @@ -3415,11 +3351,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3430,9 +3366,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.52.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ "windows-core", "windows-targets 0.52.6", @@ -3440,10 +3376,55 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ + "windows-result", "windows-targets 0.52.6", ] @@ -3465,6 +3446,15 @@ 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-targets" version = "0.42.2" @@ -3645,9 +3635,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.3" +version = "0.30.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f45a7b7e2de6af35448d7718dab6d95acec466eb3bb7a56f4d31d1af754004" +checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" dependencies = [ "ahash", "android-activity", @@ -3697,9 +3687,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.40" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -3738,9 +3728,9 @@ checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xcursor" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" [[package]] name = "xi-unicode" @@ -3769,15 +3759,15 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.20" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" +checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" @@ -3785,6 +3775,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] @@ -3796,7 +3787,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.87", ] [[package]] @@ -3816,9 +3807,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index dce08e7d..95479051 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,16 +17,16 @@ resolver = "2" assert_approx_eq = "1.1.0" async-channel = "1.8" bytemuck = { version = "1.13.0", features = ["derive"] } -crabslab = { version = "0.6.0", default-features = false } +crabslab = { version = "0.6.2", default-features = false } ctor = "0.2.2" dagga = "0.2.1" env_logger = "0.10.0" futures-lite = "1.13" -glam = { version = "0.24.2", default-features = false } +glam = { version = "0.29", default-features = false } gltf = { version = "1.4,1", features = ["KHR_lights_punctual", "KHR_materials_unlit", "KHR_materials_emissive_strength", "extras", "extensions"] } image = "0.24" log = "0.4" -naga = { version = "22.1.0", features = ["spv-in", "wgsl-out", "wgsl-in", "msl-out"] } +naga = { version = "23.0.0", features = ["spv-in", "wgsl-out", "wgsl-in", "msl-out"] } pretty_assertions = "1.4.0" proc-macro2 = { version = "1.0", features = ["span-locations"] } rustc-hash = "1.1" @@ -38,7 +38,7 @@ wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" web-sys = "0.3" winit = { version = "0.30" } -wgpu = "22.1.0" +wgpu = "23.0.0" [profile.dev] @@ -49,3 +49,10 @@ opt-level = 3 [profile.dev.package.gltf] opt-level = 3 + +[patch.crates-io] +naga = { git = "https://github.com/gfx-rs/wgpu.git" } +wgpu = { git = "https://github.com/gfx-rs/wgpu.git" } +spirv-std = { git = "https://github.com/Rust-GPU/rust-gpu" } + + diff --git a/README.md b/README.md index 12f4901f..fb5f030f 100644 --- a/README.md +++ b/README.md @@ -76,41 +76,48 @@ By default it uses a single uber-shader for rendering. - [x] texture atlas - [x] automatic resource management (Arc/drop based) + - [ ] [BCn compression](https://www.reedbeta.com/blog/understanding-bcn-texture-compression-formats/) + - [x] GPU slab allocator - [x] automatic resource management (Arc/drop based) + - [x] frustum culling -- [ ] occlusion culling +- [ ] occlusion culling - in progress + +- [x] Built-in support for common lighting/material workflows + - [x] physically based shading + - [x] unlit - [ ] light tiling - [ ] shadow mapping -- 3d - - [x] Built-in support for common lighting/material workflows - - [x] physically based shading - - [x] unlit - - [x] high dynamic range - - [x] skybox - - image based lighting - - [x] diffuse - - [x] specular - - [x] msaa (easy because of forward+) - - [x] bloom "physically based" up+downsampling blur - - [ ] ssao - - [ ] depth of field - - gltf support - - [x] scenes - - [x] nodes - - [x] cameras - - [x] meshes - - materials - - [x] pbr metallic roughness (factors + textures) - - [x] normal mapping - - [x] occlusion textures - - [ ] pbr specular glosiness - - [ ] parallax mapping - - [x] textures, images, samplers - - animation - - [x] interpolation - - [x] skinning - - [x] morph targets +- [ ] ssao + +- [x] msaa +- [x] bloom "physically based" up+downsampling blur +- [ ] depth of field +- [x] high dynamic range +- [x] skybox + +- [x] image based lighting + - [x] diffuse + - [x] specular + +- gltf support + - [x] scenes + - [x] nodes + - [x] cameras + - [x] meshes + - materials + - [x] pbr metallic roughness (factors + textures) + - [x] normal mapping + - [x] occlusion textures + - [ ] pbr specular glossiness + - [ ] parallax mapping + - [x] textures, images, samplers + - animation + - [x] interpolation + - [x] skinning + - [x] morph targets + - 2d (renderling-ui) - [x] text - [x] stroked and filled paths diff --git a/crates/example-culling/src/main.rs b/crates/example-culling/src/main.rs index 4edf231d..142a1c5f 100644 --- a/crates/example-culling/src/main.rs +++ b/crates/example-culling/src/main.rs @@ -1,4 +1,5 @@ -//! An example app showing (and verifying) how frustum culling works in `renderling`. +//! An example app showing (and verifying) how frustum culling works in +//! `renderling`. use std::{any::Any, sync::Arc}; use example::{camera::CameraController, utils::*}; @@ -123,6 +124,7 @@ impl CullingExample { app_camera.0.id(), if BoundingSphere::from(aabb) .is_inside_camera_view(&frustum_camera.0, transform.get()) + .0 { material_overlapping.id() } else { @@ -230,8 +232,8 @@ impl TestAppHandler for CullingExample { let target = Vec3::ZERO; let up = Vec3::Y; let view = Mat4::look_at_rh(eye, target, up); - // let projection = Mat4::orthographic_rh(-10.0, 10.0, -10.0, 10.0, -10.0, 10.0); - // let view = Mat4::IDENTITY; + // let projection = Mat4::orthographic_rh(-10.0, 10.0, -10.0, 10.0, -10.0, + // 10.0); let view = Mat4::IDENTITY; Camera::new(projection, view) }); diff --git a/crates/example/src/lib.rs b/crates/example/src/lib.rs index 873f23c5..444b61d5 100644 --- a/crates/example/src/lib.rs +++ b/crates/example/src/lib.rs @@ -7,13 +7,13 @@ use std::{ use renderling::{ atlas::AtlasImage, - bvol::Aabb, + bvol::{Aabb, BoundingSphere}, camera::Camera, math::{Mat4, UVec2, Vec2, Vec3, Vec4}, pbr::light::{DirectionalLight, Light}, skybox::Skybox, - slab::Hybrid, - stage::{Animator, GltfDocument, Stage}, + slab::{GpuArray, Hybrid}, + stage::{Animator, GltfDocument, Renderlet, Stage, Vertex}, Context, }; use renderling_ui::{FontArc, Section, Text, Ui, UiPath, UiText}; @@ -111,6 +111,17 @@ impl AppUi { } } +struct DefaultModel { + vertices: GpuArray, + renderlet: Hybrid, +} + +pub enum Model { + Gltf(GltfDocument), + Default(DefaultModel), + None, +} + pub struct App { last_frame_instant: f64, skybox_image_bytes: Option>, @@ -118,7 +129,7 @@ pub struct App { pub stage: Stage, camera: Hybrid, _light: Option<(Hybrid, Hybrid)>, - document: Option, + model: Model, animators: Option>, animations_conflict: bool, pub camera_controller: Box, @@ -132,7 +143,8 @@ impl App { .with_background_color(DARK_BLUE_BG_COLOR) .with_bloom_mix_strength(0.5) .with_bloom_filter_radius(4.0) - .with_msaa_sample_count(4); + .with_msaa_sample_count(4) + .with_debug_overlay(true); let camera = stage.new_value(Camera::default()); // let sunlight = stage.new_value(DirectionalLight { // direction: Vec3::NEG_Y, @@ -167,7 +179,7 @@ impl App { camera, _light: None, - document: None, + model: Model::None, animators: None, animations_conflict: false, @@ -210,12 +222,44 @@ impl App { self.stage.set_skybox(skybox); } + pub fn load_default_model(&mut self) { + let mut min = Vec3::splat(f32::INFINITY); + let mut max = Vec3::splat(f32::NEG_INFINITY); + let vertices = self + .stage + .new_array(renderling::math::unit_cube().into_iter().map(|(p, n)| { + let p = p * 2.0; + min = min.min(p); + max = max.max(p); + Vertex::default() + .with_position(p) + .with_normal(n) + .with_color(Vec4::new(1.0, 0.0, 0.0, 1.0)) + })); + log::info!("default model bounds: {min} {max}"); + let bounds = BoundingSphere::from((min, max)); + self.camera_controller.reset(Aabb::new(min, max)); + self.camera_controller + .update_camera(self.stage.get_size(), &self.camera); + self.last_frame_instant = now(); + let renderlet = self.stage.new_value(Renderlet { + vertices_array: vertices.array(), + camera_id: self.camera.id(), + bounds, + ..Default::default() + }); + self.model = Model::Default(DefaultModel { + vertices: vertices.into_gpu_only(), + renderlet, + }); + } + fn load_gltf_model(&mut self, path: impl AsRef, bytes: &[u8]) { log::info!("loading gltf"); self.camera_controller .reset(Aabb::new(Vec3::NEG_ONE, Vec3::ONE)); self.stage.clear_images().unwrap(); - self.document = None; + self.model = Model::None; log::debug!("ticking stage to reclaim buffers"); self.stage.tick(); let doc = match self @@ -329,7 +373,7 @@ impl App { log::trace!(" and some animations conflict"); } self.animations_conflict = has_conflicting_animations; - self.document = Some(doc); + self.model = Model::Gltf(doc); } pub fn tick_loads(&mut self) { diff --git a/crates/example/src/main.rs b/crates/example/src/main.rs index cb03339f..eacfb8da 100644 --- a/crates/example/src/main.rs +++ b/crates/example/src/main.rs @@ -91,6 +91,9 @@ impl ApplicationHandler for OuterApp { if let Some(file) = self.cli.model.as_ref() { log::info!("loading model '{file}'"); app.load(file.as_ref()); + } else { + log::info!("loading default model"); + app.load_default_model(); } if let Some(file) = self.cli.skybox.as_ref() { log::info!("loading skybox '{file}'"); diff --git a/crates/renderling-ui/Cargo.toml b/crates/renderling-ui/Cargo.toml index 83355675..666f70c7 100644 --- a/crates/renderling-ui/Cargo.toml +++ b/crates/renderling-ui/Cargo.toml @@ -26,3 +26,4 @@ ctor = {workspace = true} env_logger = {workspace = true} futures-lite = {workspace = true} img-diff = {path = "../img-diff"} +pretty_assertions.workspace = true diff --git a/crates/renderling-ui/src/lib.rs b/crates/renderling-ui/src/lib.rs index c59a0782..3ded1f94 100644 --- a/crates/renderling-ui/src/lib.rs +++ b/crates/renderling-ui/src/lib.rs @@ -81,7 +81,7 @@ pub struct ImageId(usize); /// A two dimensional transformation. /// /// Clones of `UiTransform` all point to the same data. -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct UiTransform { transform: NestedTransform, renderlet_ids: Arc>>, diff --git a/crates/renderling-ui/src/text.rs b/crates/renderling-ui/src/text.rs index 76e9ee9c..03c9c9ad 100644 --- a/crates/renderling-ui/src/text.rs +++ b/crates/renderling-ui/src/text.rs @@ -25,7 +25,7 @@ use renderling::{ use crate::{Ui, UiTransform}; // TODO: make UiText able to be updated without fully destroying it - +#[derive(Debug)] pub struct UiText { pub cache: GlyphCache, pub vertices: GpuArray, @@ -139,6 +139,15 @@ pub struct Cache { dirty: bool, } +impl core::fmt::Debug for Cache { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Cache") + .field("img", &(self.img.width(), self.img.height())) + .field("dirty", &self.dirty) + .finish() + } +} + impl Cache { pub fn new(width: u32, height: u32) -> Cache { Cache { @@ -163,6 +172,7 @@ impl Cache { } /// A cache of glyphs. +#[derive(Debug)] pub struct GlyphCache { /// Image on the CPU or GPU used as our texture cache cache: Option, @@ -432,4 +442,52 @@ mod test { let depth_img = ui.stage.get_depth_texture().read_image().unwrap(); img_diff::assert_img_eq("ui/text/overlay_depth.png", depth_img); } + + #[test] + fn recreate_text() { + let ctx = Context::headless(50, 50); + let ui = Ui::new(&ctx).with_antialiasing(true); + let _font_id = futures_lite::future::block_on( + ui.load_font("../../fonts/Recursive Mn Lnr St Med Nerd Font Complete.ttf"), + ) + .unwrap(); + let mut _text = ui + .new_text() + .with_section( + Section::default() + .add_text( + Text::new("60.0 fps") + .with_scale(24.0) + .with_color([1.0, 0.0, 0.0, 1.0]), + ) + .with_bounds((50.0, 50.0)), + ) + .build(); + + let frame = ctx.get_next_frame().unwrap(); + ui.render(&frame.view()); + let img = frame.read_image().unwrap(); + frame.present(); + img_diff::assert_img_eq("ui/text/can_recreate_0.png", img); + + log::info!("replacing text"); + _text = ui + .new_text() + .with_section( + Section::default() + .add_text( + Text::new(":)-|<") + .with_scale(24.0) + .with_color([1.0, 0.0, 0.0, 1.0]), + ) + .with_bounds((50.0, 50.0)), + ) + .build(); + + let frame = ctx.get_next_frame().unwrap(); + ui.render(&frame.view()); + let img = frame.read_image().unwrap(); + frame.present(); + img_diff::assert_img_eq("ui/text/can_recreate_1.png", img); + } } diff --git a/crates/renderling/Cargo.toml b/crates/renderling/Cargo.toml index 9cf273a6..8e66197d 100644 --- a/crates/renderling/Cargo.toml +++ b/crates/renderling/Cargo.toml @@ -10,81 +10,26 @@ categories = ["rendering", "game-development", "graphics"] readme = "../../README.md" build = "src/build.rs" +[package.metadata.rust-gpu.build.spirv-builder] +git = "https://github.com/Rust-GPU/rust-gpu.git" +rev = "0da80f8" + +[package.metadata.rust-gpu.build] +output-dir = "shaders" + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] crate-type = ["rlib", "cdylib"] [features] -default = ["gltf", "shaders", "tutorial", "winit"] -shaders = [ - "array_test", - "bloom", - "brdf_lut_convolution_fragment", - "brdf_lut_convolution_vertex", - "compute_frustum_culling", - "generate_mipmap_fragment", - "generate_mipmap_vertex", - "prefilter_environment_cubemap_fragment", - "prefilter_environment_cubemap_vertex", - "renderlet_fragment", - "renderlet_vertex", - "skybox_cubemap_fragment", - "skybox_cubemap_vertex", - "skybox_equirectangular_fragment", - "skybox_vertex", - "test_i8_i16_extraction", - "tonemapping_fragment", - "tonemapping_vertex" -] +default = ["gltf", "tutorial", "winit"] gltf = ["dep:gltf", "dep:serde_json"] -tutorial = [ - "tutorial_passthru_fragment", - "tutorial_implicit_isosceles_vertex", - "tutorial_slabbed_vertices_no_instance", - "tutorial_slabbed_vertices", - "tutorial_slabbed_renderlet" -] -bloom = [ - "bloom_downsample_fragment", - "bloom_upsample_fragment", - "bloom_mix_fragment", - "bloom_vertex" -] -# shaders +# optional shaders array_test = [] -bloom_downsample_fragment = [] -bloom_upsample_fragment = [] -bloom_mix_fragment = [] -bloom_vertex = [] -brdf_lut_convolution_fragment = [] -brdf_lut_convolution_vertex = [] -compute_frustum_culling = [] -generate_mipmap_fragment = [] -generate_mipmap_vertex = [] -prefilter_environment_cubemap_fragment = [] -prefilter_environment_cubemap_vertex = [] -#raymarch_fragment = [] -#raymarch_rays_fragment = [] -#raymarch_vertex = [] -#sdf_shape_fragment = [] -#sdf_shape_vertex = [] -#sdf_prim_fragment_test = [] -renderlet_fragment = [] -renderlet_vertex = [] -skybox_cubemap_fragment = [] -skybox_cubemap_vertex = [] -skybox_equirectangular_fragment = [] -skybox_vertex = [] test_i8_i16_extraction = [] test_spirv_atomics = [] -tonemapping_fragment = [] -tonemapping_vertex = [] -tutorial_passthru_fragment = [] -tutorial_implicit_isosceles_vertex = [] -tutorial_slabbed_vertices_no_instance = [] -tutorial_slabbed_vertices = [] -tutorial_slabbed_renderlet = [] +tutorial = [] wasm = ["wgpu/fragile-send-sync-non-atomic-wasm"] @@ -139,3 +84,4 @@ winit.workspace = true [target.'cfg(not(target_arch = "spirv"))'.dev-dependencies] glam = { workspace = true, features = ["std", "debug-glam-assert"] } + diff --git a/crates/renderling/shaders/bloom-bloom_mix_fragment.spv b/crates/renderling/shaders/bloom-bloom_mix_fragment.spv index a04b917b..f15f4459 100644 Binary files a/crates/renderling/shaders/bloom-bloom_mix_fragment.spv and b/crates/renderling/shaders/bloom-bloom_mix_fragment.spv differ diff --git a/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl b/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl index ab6213fd..74385898 100644 --- a/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl +++ b/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl @@ -17,28 +17,29 @@ var global_6: texture_2d; var global_7: vec4; fn function() { - var phi_131_: bool; - var phi_80_: f32; + var phi_133_: bool; + var phi_81_: f32; let _e14 = arrayLength((&global.member)); let _e15 = global_1; let _e16 = global_2; if (_e14 >= 1u) { - phi_131_ = (_e16 <= (_e14 - 1u)); + phi_133_ = (_e16 <= (_e14 - 1u)); } else { - phi_131_ = false; + phi_133_ = false; } - let _e21 = phi_131_; + let _e21 = phi_133_; if _e21 { let _e24 = global.member[_e16]; - phi_80_ = bitcast(_e24); + phi_81_ = bitcast(_e24); } else { - phi_80_ = 0f; + phi_81_ = 0f; } - let _e27 = phi_80_; + let _e27 = phi_81_; let _e28 = textureSample(global_4, global_3, _e15); let _e32 = textureSample(global_6, global_5, _e15); - global_7 = vec4(fma((_e32.x - _e28.x), _e27, _e28.x), fma((_e32.y - _e28.y), _e27, _e28.y), fma((_e32.z - _e28.z), _e27, _e28.z), 1f); + let _e36 = (1f - _e27); + global_7 = vec4(fma(_e28.x, _e36, (_e32.x * _e27)), fma(_e28.y, _e36, (_e32.y * _e27)), fma(_e28.z, _e36, (_e32.z * _e27)), 1f); return; } diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv new file mode 100644 index 00000000..f5540eb6 Binary files /dev/null and b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv differ diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl new file mode 100644 index 00000000..1f9e813d --- /dev/null +++ b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl @@ -0,0 +1,70 @@ +struct type_5 { + member: array, +} + +struct type_8 { + member: u32, + member_1: u32, +} + +var global: vec3; +@group(0) @binding(0) +var global_1: type_5; +@group(0) @binding(1) +var global_2: texture_depth_2d; + +fn function() { + var phi_285_: bool; + var phi_312_: bool; + var phi_211_: type_8; + var phi_338_: u32; + + let _e15 = arrayLength((&global_1.member)); + let _e16 = global; + let _e19 = global_1.member[0u]; + let _e22 = global_1.member[1u]; + let _e25 = global_1.member[2u]; + let _e28 = global_1.member[3u]; + let _e31 = global_1.member[4u]; + let _e32 = (_e25 & 31u); + if (_e16.x < (_e19 >> bitcast(_e32))) { + phi_285_ = (_e16.y < (_e22 >> bitcast(_e32))); + } else { + phi_285_ = false; + } + let _e42 = phi_285_; + if (_e42 != true) { + } else { + let _e46 = textureLoad(global_2, vec2(_e16.x, _e16.y), 0i); + let _e50 = select(_e28, 4294967295u, (0u >= _e31)); + if (_e15 >= 2u) { + phi_312_ = (_e50 <= (_e15 - 2u)); + } else { + phi_312_ = false; + } + let _e55 = phi_312_; + if _e55 { + let _e58 = global_1.member[_e50]; + let _e62 = global_1.member[(_e50 + 1u)]; + phi_211_ = type_8(_e58, _e62); + } else { + phi_211_ = type_8(4294967295u, 0u); + } + let _e65 = phi_211_; + let _e71 = ((_e16.y * (_e19 >> bitcast(0u))) + _e16.x); + if (_e71 >= _e65.member_1) { + phi_338_ = 4294967295u; + } else { + phi_338_ = (_e65.member + _e71); + } + let _e75 = phi_338_; + global_1.member[_e75] = bitcast(vec4(_e46).x); + } + return; +} + +@compute @workgroup_size(32, 32, 1) +fn cullcompute_copy_depth_to_pyramid(@builtin(global_invocation_id) param: vec3) { + global = param; + function(); +} diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv new file mode 100644 index 00000000..26d47eaf Binary files /dev/null and b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv differ diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl new file mode 100644 index 00000000..62888d80 --- /dev/null +++ b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl @@ -0,0 +1,70 @@ +struct type_5 { + member: array, +} + +struct type_8 { + member: u32, + member_1: u32, +} + +var global: vec3; +@group(0) @binding(0) +var global_1: type_5; +@group(0) @binding(1) +var global_2: texture_depth_multisampled_2d; + +fn function() { + var phi_285_: bool; + var phi_312_: bool; + var phi_233_: type_8; + var phi_338_: u32; + + let _e15 = arrayLength((&global_1.member)); + let _e16 = global; + let _e19 = global_1.member[0u]; + let _e22 = global_1.member[1u]; + let _e25 = global_1.member[2u]; + let _e28 = global_1.member[3u]; + let _e31 = global_1.member[4u]; + let _e32 = (_e25 & 31u); + if (_e16.x < (_e19 >> bitcast(_e32))) { + phi_285_ = (_e16.y < (_e22 >> bitcast(_e32))); + } else { + phi_285_ = false; + } + let _e42 = phi_285_; + if (_e42 != true) { + } else { + let _e46 = textureLoad(global_2, vec2(_e16.x, _e16.y), 0i); + let _e50 = select(_e28, 4294967295u, (0u >= _e31)); + if (_e15 >= 2u) { + phi_312_ = (_e50 <= (_e15 - 2u)); + } else { + phi_312_ = false; + } + let _e55 = phi_312_; + if _e55 { + let _e58 = global_1.member[_e50]; + let _e62 = global_1.member[(_e50 + 1u)]; + phi_233_ = type_8(_e58, _e62); + } else { + phi_233_ = type_8(4294967295u, 0u); + } + let _e65 = phi_233_; + let _e71 = ((_e16.y * (_e19 >> bitcast(0u))) + _e16.x); + if (_e71 >= _e65.member_1) { + phi_338_ = 4294967295u; + } else { + phi_338_ = (_e65.member + _e71); + } + let _e75 = phi_338_; + global_1.member[_e75] = bitcast(vec4(_e46).x); + } + return; +} + +@compute @workgroup_size(32, 32, 1) +fn cullcompute_copy_depth_to_pyramid_multisampled(@builtin(global_invocation_id) param: vec3) { + global = param; + function(); +} diff --git a/crates/renderling/shaders/cull-compute_culling.spv b/crates/renderling/shaders/cull-compute_culling.spv new file mode 100644 index 00000000..ad827503 Binary files /dev/null and b/crates/renderling/shaders/cull-compute_culling.spv differ diff --git a/crates/renderling/shaders/cull-compute_culling.wgsl b/crates/renderling/shaders/cull-compute_culling.wgsl new file mode 100644 index 00000000..59fbdbd1 --- /dev/null +++ b/crates/renderling/shaders/cull-compute_culling.wgsl @@ -0,0 +1,863 @@ +struct type_9 { + member: array, +} + +struct type_15 { + member: vec4, + member_1: vec4, + member_2: vec4, + member_3: vec4, +} + +struct type_16 { + member: array, 8>, + member_1: array, 6>, +} + +struct type_17 { + member: type_15, + member_1: type_15, + member_2: type_16, + member_3: vec3, +} + +struct type_19 { + member: u32, + member_1: u32, +} + +struct type_23 { + member: u32, + member_1: u32, + member_2: u32, + member_3: u32, +} + +struct type_25 { + member: array, +} + +struct type_31 { + member: vec2, + member_1: vec2, + member_2: type_19, + member_3: u32, + member_4: bool, + member_5: bool, + member_6: bool, + member_7: bool, +} + +struct type_32 { + member: vec3, + member_1: vec4, + member_2: vec3, +} + +struct type_33 { + member: bool, + member_1: u32, +} + +@group(0) @binding(0) +var global: type_9; +@group(0) @binding(1) +var global_1: type_9; +@group(0) @binding(2) +var global_2: type_25; +var global_3: vec3; + +fn function() { + var local: array, 6>; + var local_1: array, 8>; + var local_2: array; + var local_3: array; + var local_4: array; + var local_5: array; + var local_6: array, 8>; + var local_7: array, 6>; + var phi_631_: u32; + var phi_667_: type_31; + var phi_2083_: bool; + var phi_832_: type_19; + var phi_833_: type_19; + var phi_848_: type_19; + var phi_875_: bool; + var phi_881_: type_19; + var phi_882_: type_19; + var phi_897_: type_19; + var phi_920_: bool; + var phi_928_: type_17; + var phi_2115_: bool; + var phi_979_: type_32; + var phi_1111_: type_19; + var phi_1112_: type_19; + var phi_1127_: type_19; + var phi_1171_: bool; + var phi_1175_: bool; + var phi_1176_: bool; + var phi_2679_: bool; + var phi_1984_: bool; + var phi_2705_: bool; + var phi_1183_: type_19; + var phi_1184_: type_19; + var phi_1199_: type_19; + var phi_1209_: type_19; + var phi_1212_: i32; + var phi_1210_: type_19; + var phi_1227_: type_19; + var phi_1268_: i32; + var phi_1213_: i32; + var phi_1269_: bool; + var phi_2700_: bool; + var local_8: i32; + var phi_1276_: type_19; + var phi_1279_: i32; + var phi_1277_: type_19; + var phi_1294_: type_19; + var phi_1335_: i32; + var phi_1280_: i32; + var phi_1336_: bool; + var phi_2707_: bool; + var local_9: i32; + var phi_2714_: bool; + var phi_1342_: bool; + var phi_1343_: bool; + var phi_2713_: bool; + var phi_1344_: bool; + var phi_1345_: bool; + var phi_1346_: bool; + var phi_1347_: bool; + var phi_2712_: bool; + var phi_1987_: bool; + var phi_1986_: bool; + var phi_1985_: bool; + var phi_1370_: type_33; + var phi_1371_: type_33; + var local_10: u32; + var phi_1377_: type_33; + var phi_1378_: type_33; + var phi_1642_: u32; + var phi_2498_: bool; + var phi_1660_: type_19; + var phi_2524_: u32; + + switch bitcast(0u) { + default: { + let _e90 = arrayLength((&global.member)); + let _e92 = arrayLength((&global_1.member)); + let _e95 = global_3; + if (_e95.x >= arrayLength((&global_2.member))) { + } else { + let _e101 = global_2.member[_e95.x].member_3; + let _e104 = global.member[_e101]; + let _e109 = global.member[(_e101 + 2u)]; + let _e113 = global.member[(_e101 + 3u)]; + let _e114 = bitcast(_e113); + let _e118 = global.member[(_e101 + 4u)]; + let _e119 = bitcast(_e118); + let _e123 = global.member[(_e101 + 5u)]; + let _e124 = bitcast(_e123); + let _e128 = global.member[(_e101 + 6u)]; + let _e129 = bitcast(_e128); + let _e133 = global.member[(_e101 + 7u)]; + let _e137 = global.member[(_e101 + 8u)]; + let _e141 = global.member[(_e101 + 9u)]; + let _e145 = global.member[(_e101 + 10u)]; + global_2.member[_e95.x].member = select(_e137, _e109, (_e133 == 4294967295u)); + global_2.member[_e95.x].member_1 = select(0u, 1u, (_e104 == 1u)); + if (_e129 == 0f) { + } else { + if select(false, true, (_e90 >= 11u)) { + let _e160 = global.member[0u]; + let _e163 = global.member[1u]; + let _e167 = global.member[2u]; + let _e170 = global.member[3u]; + let _e174 = global.member[4u]; + switch bitcast(_e174) { + case 0: { + phi_631_ = 0u; + break; + } + case 1: { + phi_631_ = 1u; + break; + } + case 2: { + phi_631_ = 2u; + break; + } + case 3: { + phi_631_ = 3u; + break; + } + case 4: { + phi_631_ = 4u; + break; + } + case 5: { + phi_631_ = 5u; + break; + } + case 6: { + phi_631_ = 6u; + break; + } + case 7: { + phi_631_ = 7u; + break; + } + case 8: { + phi_631_ = 8u; + break; + } + case 9: { + phi_631_ = 9u; + break; + } + case 10: { + phi_631_ = 10u; + break; + } + case 11: { + phi_631_ = 11u; + break; + } + case 12: { + phi_631_ = 12u; + break; + } + case 13: { + phi_631_ = 13u; + break; + } + case 14: { + phi_631_ = 14u; + break; + } + case 15: { + phi_631_ = 15u; + break; + } + case 16: { + phi_631_ = 16u; + break; + } + case 17: { + phi_631_ = 17u; + break; + } + case 18: { + phi_631_ = 18u; + break; + } + case 19: { + phi_631_ = 19u; + break; + } + default: { + phi_631_ = 0u; + break; + } + } + let _e177 = phi_631_; + let _e180 = global.member[5u]; + let _e184 = global.member[6u]; + let _e188 = global.member[7u]; + let _e192 = global.member[8u]; + let _e196 = global.member[9u]; + let _e199 = global.member[10u]; + phi_667_ = type_31(vec2(_e160, _e163), vec2(_e167, _e170), type_19(_e196, _e199), _e177, (_e180 == 1u), (_e184 == 1u), (_e188 == 1u), (_e192 == 1u)); + } else { + phi_667_ = type_31(vec2(0u, 0u), vec2(1u, 1u), type_19(4294967295u, 0u), 0u, true, true, true, false); + } + let _e203 = phi_667_; + if _e203.member_6 { + if (_e90 >= 83u) { + phi_2083_ = (_e141 <= (_e90 - 83u)); + } else { + phi_2083_ = false; + } + let _e209 = phi_2083_; + if _e209 { + let _e212 = global.member[_e141]; + let _e217 = global.member[(_e141 + 1u)]; + let _e222 = global.member[(_e141 + 2u)]; + let _e227 = global.member[(_e141 + 3u)]; + let _e233 = global.member[(_e141 + 4u)]; + let _e238 = global.member[(_e141 + 5u)]; + let _e243 = global.member[(_e141 + 6u)]; + let _e248 = global.member[(_e141 + 7u)]; + let _e254 = global.member[(_e141 + 8u)]; + let _e259 = global.member[(_e141 + 9u)]; + let _e264 = global.member[(_e141 + 10u)]; + let _e269 = global.member[(_e141 + 11u)]; + let _e275 = global.member[(_e141 + 12u)]; + let _e280 = global.member[(_e141 + 13u)]; + let _e285 = global.member[(_e141 + 14u)]; + let _e290 = global.member[(_e141 + 15u)]; + let _e297 = global.member[(_e141 + 16u)]; + let _e302 = global.member[(_e141 + 17u)]; + let _e307 = global.member[(_e141 + 18u)]; + let _e312 = global.member[(_e141 + 19u)]; + let _e318 = global.member[(_e141 + 20u)]; + let _e323 = global.member[(_e141 + 21u)]; + let _e328 = global.member[(_e141 + 22u)]; + let _e333 = global.member[(_e141 + 23u)]; + let _e339 = global.member[(_e141 + 24u)]; + let _e344 = global.member[(_e141 + 25u)]; + let _e349 = global.member[(_e141 + 26u)]; + let _e354 = global.member[(_e141 + 27u)]; + let _e360 = global.member[(_e141 + 28u)]; + let _e365 = global.member[(_e141 + 29u)]; + let _e370 = global.member[(_e141 + 30u)]; + let _e375 = global.member[(_e141 + 31u)]; + let _e382 = global.member[(_e141 + 32u)]; + let _e387 = global.member[(_e141 + 33u)]; + let _e392 = global.member[(_e141 + 34u)]; + local_7 = array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); + phi_832_ = type_19(0u, 6u); + loop { + let _e397 = phi_832_; + if (_e397.member < _e397.member_1) { + phi_833_ = type_19((_e397.member + 1u), _e397.member_1); + phi_848_ = type_19(1u, _e397.member); + } else { + phi_833_ = _e397; + phi_848_ = type_19(0u, type_19().member_1); + } + let _e410 = phi_833_; + let _e412 = phi_848_; + switch bitcast(_e412.member) { + case 0: { + phi_875_ = false; + break; + } + case 1: { + let _e417 = ((_e141 + 35u) + (_e412.member_1 * 4u)); + let _e420 = global.member[_e417]; + let _e425 = global.member[(_e417 + 1u)]; + let _e430 = global.member[(_e417 + 2u)]; + let _e435 = global.member[(_e417 + 3u)]; + local_7[_e412.member_1] = vec4(bitcast(_e420), bitcast(_e425), bitcast(_e430), bitcast(_e435)); + phi_875_ = true; + break; + } + default: { + phi_875_ = bool(); + break; + } + } + let _e440 = phi_875_; + continue; + continuing { + phi_832_ = _e410; + break if !(_e440); + } + } + let _e442 = local_7; + local_6 = array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); + phi_881_ = type_19(0u, 8u); + loop { + let _e445 = phi_881_; + if (_e445.member < _e445.member_1) { + phi_882_ = type_19((_e445.member + 1u), _e445.member_1); + phi_897_ = type_19(1u, _e445.member); + } else { + phi_882_ = _e445; + phi_897_ = type_19(0u, type_19().member_1); + } + let _e458 = phi_882_; + let _e460 = phi_897_; + switch bitcast(_e460.member) { + case 0: { + phi_920_ = false; + break; + } + case 1: { + let _e465 = ((_e141 + 59u) + (_e460.member_1 * 3u)); + let _e468 = global.member[_e465]; + let _e473 = global.member[(_e465 + 1u)]; + let _e478 = global.member[(_e465 + 2u)]; + local_6[_e460.member_1] = vec3(bitcast(_e468), bitcast(_e473), bitcast(_e478)); + phi_920_ = true; + break; + } + default: { + phi_920_ = bool(); + break; + } + } + let _e483 = phi_920_; + continue; + continuing { + phi_881_ = _e458; + break if !(_e483); + } + } + let _e485 = local_6; + phi_928_ = type_17(type_15(vec4(bitcast(_e212), bitcast(_e217), bitcast(_e222), bitcast(_e227)), vec4(bitcast(_e233), bitcast(_e238), bitcast(_e243), bitcast(_e248)), vec4(bitcast(_e254), bitcast(_e259), bitcast(_e264), bitcast(_e269)), vec4(bitcast(_e275), bitcast(_e280), bitcast(_e285), bitcast(_e290))), type_15(vec4(bitcast(_e297), bitcast(_e302), bitcast(_e307), bitcast(_e312)), vec4(bitcast(_e318), bitcast(_e323), bitcast(_e328), bitcast(_e333)), vec4(bitcast(_e339), bitcast(_e344), bitcast(_e349), bitcast(_e354)), vec4(bitcast(_e360), bitcast(_e365), bitcast(_e370), bitcast(_e375))), type_16(_e485, _e442), vec3(bitcast(_e382), bitcast(_e387), bitcast(_e392))); + } else { + phi_928_ = type_17(type_15(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_15(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_16(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); + } + let _e489 = phi_928_; + if (_e90 >= 10u) { + phi_2115_ = (_e145 <= (_e90 - 10u)); + } else { + phi_2115_ = false; + } + let _e497 = phi_2115_; + if _e497 { + let _e500 = global.member[_e145]; + let _e505 = global.member[(_e145 + 1u)]; + let _e510 = global.member[(_e145 + 2u)]; + let _e516 = global.member[(_e145 + 3u)]; + let _e521 = global.member[(_e145 + 4u)]; + let _e526 = global.member[(_e145 + 5u)]; + let _e531 = global.member[(_e145 + 6u)]; + let _e537 = global.member[(_e145 + 7u)]; + let _e542 = global.member[(_e145 + 8u)]; + let _e547 = global.member[(_e145 + 9u)]; + phi_979_ = type_32(vec3(bitcast(_e500), bitcast(_e505), bitcast(_e510)), vec4(bitcast(_e516), bitcast(_e521), bitcast(_e526), bitcast(_e531)), vec3(bitcast(_e537), bitcast(_e542), bitcast(_e547))); + } else { + phi_979_ = type_32(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + } + let _e552 = phi_979_; + let _e560 = (_e552.member_1.x + _e552.member_1.x); + let _e561 = (_e552.member_1.y + _e552.member_1.y); + let _e562 = (_e552.member_1.z + _e552.member_1.z); + let _e564 = (_e552.member_1.z * _e562); + let _e565 = (_e552.member_1.w * _e560); + let _e566 = (_e552.member_1.w * _e561); + let _e567 = (_e552.member_1.w * _e562); + let _e587 = (vec4((1f - fma(_e552.member_1.y, _e561, _e564)), fma(_e552.member_1.x, _e561, _e567), fma(_e552.member_1.x, _e562, -(_e566)), 0f) * _e552.member_2.x); + let _e589 = (vec4(fma(_e552.member_1.x, _e561, -(_e567)), (1f - fma(_e552.member_1.x, _e560, _e564)), fma(_e552.member_1.y, _e562, _e565), 0f) * _e552.member_2.y); + let _e591 = (vec4(fma(_e552.member_1.x, _e562, _e566), fma(_e552.member_1.y, _e562, -(_e565)), (1f - fma(_e552.member_1.x, _e560, (_e552.member_1.y * _e561))), 0f) * _e552.member_2.z); + let _e613 = (_e552.member.x + fma(_e591.x, _e124, fma(_e589.x, _e119, (_e587.x * _e114)))); + let _e614 = (_e552.member.y + fma(_e591.y, _e124, fma(_e589.y, _e119, (_e587.y * _e114)))); + let _e615 = (_e552.member.z + fma(_e591.z, _e124, fma(_e589.z, _e119, (_e587.z * _e114)))); + let _e616 = vec3(_e613, _e614, _e615); + let _e619 = (max(_e552.member_2.x, max(_e552.member_2.y, _e552.member_2.z)) * _e129); + let _e621 = sqrt((_e619 * _e619)); + local_1 = _e489.member_2.member; + local = _e489.member_2.member_1; + let _e626 = local[0u][0u]; + let _e629 = local[0u][1u]; + let _e634 = local[0u][2u]; + let _e638 = local[0u][3u]; + let _e640 = -(_e621); + if ((fma(_e634, _e615, fma(_e626, _e613, (_e629 * _e614))) + _e638) < _e640) { + phi_1378_ = type_33(true, 0u); + } else { + phi_1111_ = type_19(0u, 6u); + loop { + let _e643 = phi_1111_; + if (_e643.member < _e643.member_1) { + phi_1112_ = type_19((_e643.member + 1u), _e643.member_1); + phi_1127_ = type_19(1u, _e643.member); + } else { + phi_1112_ = _e643; + phi_1127_ = type_19(0u, type_19().member_1); + } + let _e656 = phi_1112_; + let _e658 = phi_1127_; + local_10 = _e658.member_1; + switch bitcast(_e658.member) { + case 0: { + phi_1175_ = false; + phi_1176_ = true; + break; + } + case 1: { + if (_e658.member_1 != 0u) { + if (_e658.member_1 < 6u) { + } else { + phi_2679_ = true; + phi_1984_ = bool(); + break; + } + let _e666 = local[_e658.member_1][0u]; + let _e669 = local[_e658.member_1][1u]; + let _e674 = local[_e658.member_1][2u]; + let _e678 = local[_e658.member_1][3u]; + phi_1171_ = select(true, false, ((fma(_e674, _e615, fma(_e666, _e613, (_e669 * _e614))) + _e678) < _e640)); + } else { + phi_1171_ = true; + } + let _e683 = phi_1171_; + phi_1175_ = _e683; + phi_1176_ = false; + break; + } + default: { + phi_1175_ = bool(); + phi_1176_ = bool(); + break; + } + } + let _e685 = phi_1175_; + let _e687 = phi_1176_; + continue; + continuing { + phi_1111_ = _e656; + phi_2679_ = false; + phi_1984_ = _e687; + break if !(_e685); + } + } + let _e690 = phi_2679_; + let _e692 = phi_1984_; + if _e690 { + break; + } + if _e692 { + let _e693 = vec3(_e621); + let _e694 = (_e616 - _e693); + let _e695 = (_e616 + _e693); + phi_2705_ = _e690; + phi_1183_ = type_19(0u, 3u); + loop { + let _e697 = phi_2705_; + let _e699 = phi_1183_; + if (_e699.member < _e699.member_1) { + phi_1184_ = type_19((_e699.member + 1u), _e699.member_1); + phi_1199_ = type_19(1u, _e699.member); + } else { + phi_1184_ = _e699; + phi_1199_ = type_19(0u, type_19().member_1); + } + let _e712 = phi_1184_; + let _e714 = phi_1199_; + switch bitcast(_e714.member) { + case 0: { + phi_2713_ = _e697; + phi_1344_ = false; + phi_1345_ = true; + phi_1346_ = false; + phi_1347_ = false; + break; + } + case 1: { + phi_1209_ = type_19(0u, 8u); + phi_1212_ = 0i; + loop { + let _e719 = phi_1209_; + let _e721 = phi_1212_; + local_8 = _e721; + if (_e719.member < _e719.member_1) { + phi_1210_ = type_19((_e719.member + 1u), _e719.member_1); + phi_1227_ = type_19(1u, _e719.member); + } else { + phi_1210_ = _e719; + phi_1227_ = type_19(0u, type_19().member_1); + } + let _e734 = phi_1210_; + let _e736 = phi_1227_; + switch bitcast(_e736.member) { + case 0: { + phi_1213_ = i32(); + phi_1269_ = false; + break; + } + case 1: { + if (_e736.member_1 < 8u) { + } else { + phi_2700_ = true; + break; + } + let _e743 = local_1[_e736.member_1][0u]; + let _e746 = local_1[_e736.member_1][1u]; + let _e749 = local_1[_e736.member_1][2u]; + local_2 = array(_e743, _e746, _e749); + let _e751 = (_e714.member_1 < 3u); + if _e751 { + } else { + phi_2700_ = true; + break; + } + let _e753 = local_2[_e714.member_1]; + local_3 = array(_e694.x, _e694.y, _e694.z); + if _e751 { + } else { + phi_2700_ = true; + break; + } + let _e759 = local_3[_e714.member_1]; + if (_e753 < _e759) { + phi_1268_ = (_e721 + 1i); + } else { + phi_1268_ = _e721; + } + let _e763 = phi_1268_; + phi_1213_ = _e763; + phi_1269_ = true; + break; + } + default: { + phi_1213_ = i32(); + phi_1269_ = bool(); + break; + } + } + let _e765 = phi_1213_; + let _e767 = phi_1269_; + continue; + continuing { + phi_1209_ = _e734; + phi_1212_ = _e765; + phi_2700_ = _e697; + break if !(_e767); + } + } + let _e770 = phi_2700_; + phi_2712_ = _e770; + phi_1987_ = bool(); + phi_1986_ = bool(); + phi_1985_ = bool(); + if _e770 { + break; + } + let _e772 = local_8; + let _e773 = (_e772 == 8i); + if _e773 { + phi_2714_ = _e770; + phi_1342_ = false; + phi_1343_ = false; + } else { + phi_1276_ = type_19(0u, 8u); + phi_1279_ = 0i; + loop { + let _e775 = phi_1276_; + let _e777 = phi_1279_; + local_9 = _e777; + if (_e775.member < _e775.member_1) { + phi_1277_ = type_19((_e775.member + 1u), _e775.member_1); + phi_1294_ = type_19(1u, _e775.member); + } else { + phi_1277_ = _e775; + phi_1294_ = type_19(0u, type_19().member_1); + } + let _e790 = phi_1277_; + let _e792 = phi_1294_; + switch bitcast(_e792.member) { + case 0: { + phi_1280_ = i32(); + phi_1336_ = false; + break; + } + case 1: { + if (_e792.member_1 < 8u) { + } else { + phi_2707_ = true; + break; + } + let _e799 = local_1[_e792.member_1][0u]; + let _e802 = local_1[_e792.member_1][1u]; + let _e805 = local_1[_e792.member_1][2u]; + local_4 = array(_e799, _e802, _e805); + let _e807 = (_e714.member_1 < 3u); + if _e807 { + } else { + phi_2707_ = true; + break; + } + let _e809 = local_4[_e714.member_1]; + local_5 = array(_e695.x, _e695.y, _e695.z); + if _e807 { + } else { + phi_2707_ = true; + break; + } + let _e815 = local_5[_e714.member_1]; + if (_e809 > _e815) { + phi_1335_ = (_e777 + 1i); + } else { + phi_1335_ = _e777; + } + let _e819 = phi_1335_; + phi_1280_ = _e819; + phi_1336_ = true; + break; + } + default: { + phi_1280_ = i32(); + phi_1336_ = bool(); + break; + } + } + let _e821 = phi_1280_; + let _e823 = phi_1336_; + continue; + continuing { + phi_1276_ = _e790; + phi_1279_ = _e821; + phi_2707_ = _e770; + break if !(_e823); + } + } + let _e826 = phi_2707_; + phi_2712_ = _e826; + phi_1987_ = bool(); + phi_1986_ = bool(); + phi_1985_ = bool(); + if _e826 { + break; + } + let _e828 = local_9; + let _e829 = (_e828 == 8i); + phi_2714_ = _e826; + phi_1342_ = select(true, false, _e829); + phi_1343_ = _e829; + } + let _e832 = phi_2714_; + let _e834 = phi_1342_; + let _e836 = phi_1343_; + phi_2713_ = _e832; + phi_1344_ = _e834; + phi_1345_ = false; + phi_1346_ = _e773; + phi_1347_ = _e836; + break; + } + default: { + phi_2713_ = _e697; + phi_1344_ = bool(); + phi_1345_ = bool(); + phi_1346_ = bool(); + phi_1347_ = bool(); + break; + } + } + let _e838 = phi_2713_; + let _e840 = phi_1344_; + let _e842 = phi_1345_; + let _e844 = phi_1346_; + let _e846 = phi_1347_; + continue; + continuing { + phi_2705_ = _e838; + phi_1183_ = _e712; + phi_2712_ = _e838; + phi_1987_ = _e846; + phi_1986_ = _e844; + phi_1985_ = _e842; + break if !(_e840); + } + } + let _e849 = phi_2712_; + let _e851 = phi_1987_; + let _e853 = phi_1986_; + let _e855 = phi_1985_; + if _e849 { + break; + } + let _e856 = select(_e853, false, _e855); + if select(true, false, select(_e856, true, select(select(_e851, false, _e855), false, _e856))) { + phi_1370_ = type_33(false, 0u); + } else { + phi_1370_ = type_33(true, 0u); + } + let _e862 = phi_1370_; + phi_1371_ = _e862; + } else { + phi_1371_ = type_33(); + } + let _e864 = phi_1371_; + if select(true, false, _e692) { + let _e867 = local_10; + phi_1377_ = type_33(true, _e867); + } else { + phi_1377_ = _e864; + } + let _e870 = phi_1377_; + phi_1378_ = _e870; + } + let _e872 = phi_1378_; + if (_e872.member != true) { + global_2.member[_e95.x].member_1 = 1u; + if _e203.member_7 { + let _e878 = global_1.member[0u]; + let _e881 = global_1.member[1u]; + let _e884 = global_1.member[3u]; + let _e887 = global_1.member[4u]; + let _e888 = f32(_e878); + let _e930 = fma(_e489.member.member_3.z, _e489.member_1.member.w, fma(_e489.member.member_2.z, _e489.member_1.member.z, fma(_e489.member.member.z, _e489.member_1.member.x, (_e489.member.member_1.z * _e489.member_1.member.y)))); + let _e931 = fma(_e489.member.member_3.w, _e489.member_1.member.w, fma(_e489.member.member_2.w, _e489.member_1.member.z, fma(_e489.member.member.w, _e489.member_1.member.x, (_e489.member.member_1.w * _e489.member_1.member.y)))); + let _e951 = fma(_e489.member.member_3.z, _e489.member_1.member_1.w, fma(_e489.member.member_2.z, _e489.member_1.member_1.z, fma(_e489.member.member.z, _e489.member_1.member_1.x, (_e489.member.member_1.z * _e489.member_1.member_1.y)))); + let _e952 = fma(_e489.member.member_3.w, _e489.member_1.member_1.w, fma(_e489.member.member_2.w, _e489.member_1.member_1.z, fma(_e489.member.member.w, _e489.member_1.member_1.x, (_e489.member.member_1.w * _e489.member_1.member_1.y)))); + let _e972 = fma(_e489.member.member_3.z, _e489.member_1.member_2.w, fma(_e489.member.member_2.z, _e489.member_1.member_2.z, fma(_e489.member.member.z, _e489.member_1.member_2.x, (_e489.member.member_1.z * _e489.member_1.member_2.y)))); + let _e973 = fma(_e489.member.member_3.w, _e489.member_1.member_2.w, fma(_e489.member.member_2.w, _e489.member_1.member_2.z, fma(_e489.member.member.w, _e489.member_1.member_2.x, (_e489.member.member_1.w * _e489.member_1.member_2.y)))); + let _e993 = fma(_e489.member.member_3.z, _e489.member_1.member_3.w, fma(_e489.member.member_2.z, _e489.member_1.member_3.z, fma(_e489.member.member.z, _e489.member_1.member_3.x, (_e489.member.member_1.z * _e489.member_1.member_3.y)))); + let _e994 = fma(_e489.member.member_3.w, _e489.member_1.member_3.w, fma(_e489.member.member_2.w, _e489.member_1.member_3.z, fma(_e489.member.member.w, _e489.member_1.member_3.x, (_e489.member.member_1.w * _e489.member_1.member_3.y)))); + let _e1006 = (fma(_e973, _e615, fma(_e931, _e613, (_e952 * _e614))) + _e994); + let _e1012 = fma(_e621, _e489.member_2.member_1[5].x, _e613); + let _e1013 = fma(_e621, _e489.member_2.member_1[5].y, _e614); + let _e1014 = fma(_e621, _e489.member_2.member_1[5].z, _e615); + let _e1029 = fma(_e621, _e489.member_2.member_1[0].x, _e613); + let _e1030 = fma(_e621, _e489.member_2.member_1[0].y, _e614); + let _e1031 = fma(_e621, _e489.member_2.member_1[0].z, _e615); + let _e1048 = (vec2(((((fma(fma(_e489.member.member_3.x, _e489.member_1.member_2.w, fma(_e489.member.member_2.x, _e489.member_1.member_2.z, fma(_e489.member.member.x, _e489.member_1.member_2.x, (_e489.member.member_1.x * _e489.member_1.member_2.y)))), _e615, fma(fma(_e489.member.member_3.x, _e489.member_1.member.w, fma(_e489.member.member_2.x, _e489.member_1.member.z, fma(_e489.member.member.x, _e489.member_1.member.x, (_e489.member.member_1.x * _e489.member_1.member.y)))), _e613, (fma(_e489.member.member_3.x, _e489.member_1.member_1.w, fma(_e489.member.member_2.x, _e489.member_1.member_1.z, fma(_e489.member.member.x, _e489.member_1.member_1.x, (_e489.member.member_1.x * _e489.member_1.member_1.y)))) * _e614))) + fma(_e489.member.member_3.x, _e489.member_1.member_3.w, fma(_e489.member.member_2.x, _e489.member_1.member_3.z, fma(_e489.member.member.x, _e489.member_1.member_3.x, (_e489.member.member_1.x * _e489.member_1.member_3.y))))) / _e1006) + 1f) * 0.5f), fma((-1f - ((fma(fma(_e489.member.member_3.y, _e489.member_1.member_2.w, fma(_e489.member.member_2.y, _e489.member_1.member_2.z, fma(_e489.member.member.y, _e489.member_1.member_2.x, (_e489.member.member_1.y * _e489.member_1.member_2.y)))), _e615, fma(fma(_e489.member.member_3.y, _e489.member_1.member.w, fma(_e489.member.member_2.y, _e489.member_1.member.z, fma(_e489.member.member.y, _e489.member_1.member.x, (_e489.member.member_1.y * _e489.member_1.member.y)))), _e613, (fma(_e489.member.member_3.y, _e489.member_1.member_1.w, fma(_e489.member.member_2.y, _e489.member_1.member_1.z, fma(_e489.member.member.y, _e489.member_1.member_1.x, (_e489.member.member_1.y * _e489.member_1.member_1.y)))) * _e614))) + fma(_e489.member.member_3.y, _e489.member_1.member_3.w, fma(_e489.member.member_2.y, _e489.member_1.member_3.z, fma(_e489.member.member.y, _e489.member_1.member_3.x, (_e489.member.member_1.y * _e489.member_1.member_3.y))))) / _e1006)), 0.5f, 1f)) * vec2(_e888, f32(_e881))); + let _e1049 = (_e621 / _e1006); + let _e1051 = -(_e888); + let _e1055 = vec3(fma(_e1051, _e1049, _e1048.x), fma(_e1051, _e1049, _e1048.y), ((_e993 + fma(_e972, _e1014, fma(_e951, _e1013, (_e930 * _e1012)))) / (_e994 + fma(_e973, _e1014, fma(_e952, _e1013, (_e931 * _e1012)))))); + let _e1058 = vec3(fma(_e888, _e1049, _e1048.x), fma(_e888, _e1049, _e1048.y), ((_e993 + fma(_e972, _e1031, fma(_e951, _e1030, (_e930 * _e1029)))) / (_e994 + fma(_e973, _e1031, fma(_e952, _e1030, (_e931 * _e1029)))))); + let _e1059 = min(_e1055, _e1058); + let _e1060 = max(_e1055, _e1058); + let _e1065 = (_e1060.x - _e1059.x); + let _e1066 = (_e1060.y - _e1059.y); + let _e1070 = floor(log2(select(_e1066, _e1065, (_e1065 > _e1066)))); + let _e1075 = select(select(u32(_e1070), 0u, (_e1070 < 0f)), 4294967295u, (_e1070 > 4294967000f)); + let _e1076 = (_e887 - 1u); + let _e1078 = select(_e1075, _e1076, (_e1075 > _e1076)); + let _e1084 = round(((_e1059.x + _e1060.x) * 0.5f)); + let _e1090 = (_e1078 & 31u); + let _e1093 = round(((_e1059.y + _e1060.y) * 0.5f)); + if (_e1078 >= _e887) { + phi_1642_ = 4294967295u; + } else { + phi_1642_ = (_e884 + (2u * _e1078)); + } + let _e1105 = phi_1642_; + if (_e92 >= 2u) { + phi_2498_ = (_e1105 <= (_e92 - 2u)); + } else { + phi_2498_ = false; + } + let _e1110 = phi_2498_; + if _e1110 { + let _e1113 = global_1.member[_e1105]; + let _e1117 = global_1.member[(_e1105 + 1u)]; + phi_1660_ = type_19(_e1113, _e1117); + } else { + phi_1660_ = type_19(4294967295u, 0u); + } + let _e1120 = phi_1660_; + let _e1126 = (((select(select(u32(_e1093), 0u, (_e1093 < 0f)), 4294967295u, (_e1093 > 4294967000f)) >> bitcast(_e1090)) * (_e878 >> bitcast(_e1090))) + (select(select(u32(_e1084), 0u, (_e1084 < 0f)), 4294967295u, (_e1084 > 4294967000f)) >> bitcast(_e1090))); + if (_e1126 >= _e1120.member_1) { + phi_2524_ = 4294967295u; + } else { + phi_2524_ = (_e1120.member + _e1126); + } + let _e1130 = phi_2524_; + let _e1133 = global_1.member[_e1130]; + if select((_e1059.z > 1f), true, (_e1059.z > bitcast(_e1133))) { + global_2.member[_e95.x].member_1 = 0u; + } + } + } else { + global_2.member[_e95.x].member_1 = 0u; + } + } + } + } + break; + } + } + return; +} + +@compute @workgroup_size(32, 1, 1) +fn cullcompute_culling(@builtin(global_invocation_id) param: vec3) { + global_3 = param; + function(); +} diff --git a/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.spv b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.spv new file mode 100644 index 00000000..adc86d7e Binary files /dev/null and b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.spv differ diff --git a/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl new file mode 100644 index 00000000..b3f04f94 --- /dev/null +++ b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl @@ -0,0 +1,268 @@ +struct type_4 { + member: array, +} + +struct type_7 { + member: u32, + member_1: u32, +} + +var global: vec3; +@group(0) @binding(0) +var global_1: type_4; + +fn function() { + var phi_504_: bool; + var phi_221_: u32; + var phi_520_: bool; + var phi_239_: type_7; + var phi_546_: u32; + var phi_565_: bool; + var phi_258_: f32; + var phi_276_: u32; + var phi_587_: bool; + var phi_294_: type_7; + var phi_613_: u32; + var phi_632_: bool; + var phi_313_: f32; + var phi_331_: u32; + var phi_654_: bool; + var phi_349_: type_7; + var phi_680_: u32; + var phi_699_: bool; + var phi_368_: f32; + var phi_386_: u32; + var phi_721_: bool; + var phi_404_: type_7; + var phi_747_: u32; + var phi_766_: bool; + var phi_423_: f32; + var phi_443_: u32; + var phi_788_: bool; + var phi_461_: type_7; + var phi_814_: u32; + + let _e14 = arrayLength((&global_1.member)); + let _e15 = global; + let _e18 = global_1.member[0u]; + let _e21 = global_1.member[1u]; + let _e24 = global_1.member[2u]; + let _e27 = global_1.member[3u]; + let _e30 = global_1.member[4u]; + let _e31 = (_e24 & 31u); + let _e33 = (_e18 >> bitcast(_e31)); + if (_e15.x < _e33) { + phi_504_ = (_e15.y < (_e21 >> bitcast(_e31))); + } else { + phi_504_ = false; + } + let _e41 = phi_504_; + if (_e41 != true) { + } else { + let _e44 = (_e15.x * 2u); + let _e45 = (_e15.y * 2u); + let _e46 = (_e24 - 1u); + let _e47 = (_e46 >= _e30); + if _e47 { + phi_221_ = 4294967295u; + } else { + phi_221_ = (_e27 + (2u * _e46)); + } + let _e51 = phi_221_; + let _e52 = (_e14 >= 2u); + if _e52 { + phi_520_ = (_e51 <= (_e14 - 2u)); + } else { + phi_520_ = false; + } + let _e56 = phi_520_; + if _e56 { + let _e59 = global_1.member[_e51]; + let _e63 = global_1.member[(_e51 + 1u)]; + phi_239_ = type_7(_e59, _e63); + } else { + phi_239_ = type_7(4294967295u, 0u); + } + let _e66 = phi_239_; + let _e71 = (_e18 >> bitcast((_e46 & 31u))); + let _e72 = (_e45 * _e71); + let _e73 = (_e72 + _e44); + if (_e73 >= _e66.member_1) { + phi_546_ = 4294967295u; + } else { + phi_546_ = (_e66.member + _e73); + } + let _e77 = phi_546_; + let _e78 = (_e14 >= 1u); + if _e78 { + phi_565_ = (_e77 <= (_e14 - 1u)); + } else { + phi_565_ = false; + } + let _e82 = phi_565_; + if _e82 { + let _e85 = global_1.member[_e77]; + phi_258_ = bitcast(_e85); + } else { + phi_258_ = 0f; + } + let _e88 = phi_258_; + let _e89 = (_e44 + 1u); + if _e47 { + phi_276_ = 4294967295u; + } else { + phi_276_ = (_e27 + (2u * _e46)); + } + let _e93 = phi_276_; + if _e52 { + phi_587_ = (_e93 <= (_e14 - 2u)); + } else { + phi_587_ = false; + } + let _e97 = phi_587_; + if _e97 { + let _e100 = global_1.member[_e93]; + let _e104 = global_1.member[(_e93 + 1u)]; + phi_294_ = type_7(_e100, _e104); + } else { + phi_294_ = type_7(4294967295u, 0u); + } + let _e107 = phi_294_; + let _e110 = (_e72 + _e89); + if (_e110 >= _e107.member_1) { + phi_613_ = 4294967295u; + } else { + phi_613_ = (_e107.member + _e110); + } + let _e114 = phi_613_; + if _e78 { + phi_632_ = (_e114 <= (_e14 - 1u)); + } else { + phi_632_ = false; + } + let _e118 = phi_632_; + if _e118 { + let _e121 = global_1.member[_e114]; + phi_313_ = bitcast(_e121); + } else { + phi_313_ = 0f; + } + let _e124 = phi_313_; + if _e47 { + phi_331_ = 4294967295u; + } else { + phi_331_ = (_e27 + (2u * _e46)); + } + let _e129 = phi_331_; + if _e52 { + phi_654_ = (_e129 <= (_e14 - 2u)); + } else { + phi_654_ = false; + } + let _e133 = phi_654_; + if _e133 { + let _e136 = global_1.member[_e129]; + let _e140 = global_1.member[(_e129 + 1u)]; + phi_349_ = type_7(_e136, _e140); + } else { + phi_349_ = type_7(4294967295u, 0u); + } + let _e143 = phi_349_; + let _e146 = ((_e45 + 1u) * _e71); + let _e147 = (_e146 + _e44); + if (_e147 >= _e143.member_1) { + phi_680_ = 4294967295u; + } else { + phi_680_ = (_e143.member + _e147); + } + let _e151 = phi_680_; + if _e78 { + phi_699_ = (_e151 <= (_e14 - 1u)); + } else { + phi_699_ = false; + } + let _e155 = phi_699_; + if _e155 { + let _e158 = global_1.member[_e151]; + phi_368_ = bitcast(_e158); + } else { + phi_368_ = 0f; + } + let _e161 = phi_368_; + if _e47 { + phi_386_ = 4294967295u; + } else { + phi_386_ = (_e27 + (2u * _e46)); + } + let _e165 = phi_386_; + if _e52 { + phi_721_ = (_e165 <= (_e14 - 2u)); + } else { + phi_721_ = false; + } + let _e169 = phi_721_; + if _e169 { + let _e172 = global_1.member[_e165]; + let _e176 = global_1.member[(_e165 + 1u)]; + phi_404_ = type_7(_e172, _e176); + } else { + phi_404_ = type_7(4294967295u, 0u); + } + let _e179 = phi_404_; + let _e182 = (_e146 + _e89); + if (_e182 >= _e179.member_1) { + phi_747_ = 4294967295u; + } else { + phi_747_ = (_e179.member + _e182); + } + let _e186 = phi_747_; + if _e78 { + phi_766_ = (_e186 <= (_e14 - 1u)); + } else { + phi_766_ = false; + } + let _e190 = phi_766_; + if _e190 { + let _e193 = global_1.member[_e186]; + phi_423_ = bitcast(_e193); + } else { + phi_423_ = 0f; + } + let _e196 = phi_423_; + if (_e24 >= _e30) { + phi_443_ = 4294967295u; + } else { + phi_443_ = (_e27 + (2u * _e24)); + } + let _e204 = phi_443_; + if _e52 { + phi_788_ = (_e204 <= (_e14 - 2u)); + } else { + phi_788_ = false; + } + let _e208 = phi_788_; + if _e208 { + let _e211 = global_1.member[_e204]; + let _e215 = global_1.member[(_e204 + 1u)]; + phi_461_ = type_7(_e211, _e215); + } else { + phi_461_ = type_7(4294967295u, 0u); + } + let _e218 = phi_461_; + let _e222 = ((_e15.y * _e33) + _e15.x); + if (_e222 >= _e218.member_1) { + phi_814_ = 4294967295u; + } else { + phi_814_ = (_e218.member + _e222); + } + let _e226 = phi_814_; + global_1.member[_e226] = bitcast(max(max(max(_e88, _e124), _e161), _e196)); + } + return; +} + +@compute @workgroup_size(32, 32, 1) +fn cullcompute_downsample_depth_pyramid(@builtin(global_invocation_id) param: vec3) { + global = param; + function(); +} diff --git a/crates/renderling/shaders/cull-compute_frustum_culling.spv b/crates/renderling/shaders/cull-compute_frustum_culling.spv deleted file mode 100644 index eddf5824..00000000 Binary files a/crates/renderling/shaders/cull-compute_frustum_culling.spv and /dev/null differ diff --git a/crates/renderling/shaders/cull-compute_frustum_culling.wgsl b/crates/renderling/shaders/cull-compute_frustum_culling.wgsl deleted file mode 100644 index 34caf38b..00000000 --- a/crates/renderling/shaders/cull-compute_frustum_culling.wgsl +++ /dev/null @@ -1,667 +0,0 @@ -struct type_8 { - member: array, -} - -struct type_14 { - member: vec4, - member_1: vec4, - member_2: vec4, - member_3: vec4, -} - -struct type_15 { - member: array, 8>, - member_1: array, 6>, -} - -struct type_16 { - member: type_14, - member_1: type_14, - member_2: type_15, - member_3: vec3, -} - -struct type_18 { - member: u32, - member_1: u32, -} - -struct type_22 { - member: u32, - member_1: u32, - member_2: u32, - member_3: u32, -} - -struct type_24 { - member: array, -} - -struct type_29 { - member: vec3, - member_1: vec4, - member_2: vec3, -} - -struct type_30 { - member: bool, - member_1: u32, -} - -@group(0) @binding(0) -var global: type_8; -@group(0) @binding(1) -var global_1: type_24; -var global_2: vec3; - -fn function() { - var local: array, 6>; - var local_1: array, 8>; - var local_2: array; - var local_3: array; - var local_4: array; - var local_5: array; - var local_6: array, 8>; - var local_7: array, 6>; - var phi_1208_: bool; - var phi_460_: type_18; - var phi_461_: type_18; - var phi_476_: type_18; - var phi_503_: bool; - var phi_509_: type_18; - var phi_510_: type_18; - var phi_525_: type_18; - var phi_548_: bool; - var phi_556_: type_16; - var phi_1240_: bool; - var phi_607_: type_29; - var phi_739_: type_18; - var phi_740_: type_18; - var phi_755_: type_18; - var phi_799_: bool; - var phi_803_: bool; - var phi_804_: bool; - var phi_1415_: bool; - var phi_1154_: bool; - var phi_1438_: bool; - var phi_811_: type_18; - var phi_812_: type_18; - var phi_827_: type_18; - var phi_837_: type_18; - var phi_840_: i32; - var phi_838_: type_18; - var phi_855_: type_18; - var phi_896_: i32; - var phi_841_: i32; - var phi_897_: bool; - var phi_1433_: bool; - var local_8: i32; - var phi_904_: type_18; - var phi_907_: i32; - var phi_905_: type_18; - var phi_922_: type_18; - var phi_963_: i32; - var phi_908_: i32; - var phi_964_: bool; - var phi_1440_: bool; - var local_9: i32; - var phi_1447_: bool; - var phi_970_: bool; - var phi_971_: bool; - var phi_1446_: bool; - var phi_972_: bool; - var phi_973_: bool; - var phi_974_: bool; - var phi_975_: bool; - var phi_1445_: bool; - var phi_1157_: bool; - var phi_1156_: bool; - var phi_1155_: bool; - var phi_998_: type_30; - var phi_999_: type_30; - var local_10: u32; - var phi_1005_: type_30; - var phi_1006_: type_30; - - switch bitcast(0u) { - default: { - let _e82 = arrayLength((&global.member)); - let _e85 = global_2; - if (_e85.x >= arrayLength((&global_1.member))) { - } else { - let _e91 = global_1.member[_e85.x].member_3; - let _e94 = global.member[_e91]; - let _e99 = global.member[(_e91 + 2u)]; - let _e103 = global.member[(_e91 + 3u)]; - let _e104 = bitcast(_e103); - let _e108 = global.member[(_e91 + 4u)]; - let _e109 = bitcast(_e108); - let _e113 = global.member[(_e91 + 5u)]; - let _e114 = bitcast(_e113); - let _e118 = global.member[(_e91 + 6u)]; - let _e119 = bitcast(_e118); - let _e123 = global.member[(_e91 + 7u)]; - let _e127 = global.member[(_e91 + 8u)]; - let _e131 = global.member[(_e91 + 9u)]; - let _e135 = global.member[(_e91 + 10u)]; - global_1.member[_e85.x].member = select(_e127, _e99, (_e123 == 4294967295u)); - global_1.member[_e85.x].member_1 = select(0u, 1u, (_e94 == 1u)); - if (_e119 == 0f) { - } else { - if (_e82 >= 83u) { - phi_1208_ = (_e131 <= (_e82 - 83u)); - } else { - phi_1208_ = false; - } - let _e150 = phi_1208_; - if _e150 { - let _e153 = global.member[_e131]; - let _e158 = global.member[(_e131 + 1u)]; - let _e163 = global.member[(_e131 + 2u)]; - let _e168 = global.member[(_e131 + 3u)]; - let _e174 = global.member[(_e131 + 4u)]; - let _e179 = global.member[(_e131 + 5u)]; - let _e184 = global.member[(_e131 + 6u)]; - let _e189 = global.member[(_e131 + 7u)]; - let _e195 = global.member[(_e131 + 8u)]; - let _e200 = global.member[(_e131 + 9u)]; - let _e205 = global.member[(_e131 + 10u)]; - let _e210 = global.member[(_e131 + 11u)]; - let _e216 = global.member[(_e131 + 12u)]; - let _e221 = global.member[(_e131 + 13u)]; - let _e226 = global.member[(_e131 + 14u)]; - let _e231 = global.member[(_e131 + 15u)]; - let _e238 = global.member[(_e131 + 16u)]; - let _e243 = global.member[(_e131 + 17u)]; - let _e248 = global.member[(_e131 + 18u)]; - let _e253 = global.member[(_e131 + 19u)]; - let _e259 = global.member[(_e131 + 20u)]; - let _e264 = global.member[(_e131 + 21u)]; - let _e269 = global.member[(_e131 + 22u)]; - let _e274 = global.member[(_e131 + 23u)]; - let _e280 = global.member[(_e131 + 24u)]; - let _e285 = global.member[(_e131 + 25u)]; - let _e290 = global.member[(_e131 + 26u)]; - let _e295 = global.member[(_e131 + 27u)]; - let _e301 = global.member[(_e131 + 28u)]; - let _e306 = global.member[(_e131 + 29u)]; - let _e311 = global.member[(_e131 + 30u)]; - let _e316 = global.member[(_e131 + 31u)]; - let _e323 = global.member[(_e131 + 32u)]; - let _e328 = global.member[(_e131 + 33u)]; - let _e333 = global.member[(_e131 + 34u)]; - local_7 = array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); - phi_460_ = type_18(0u, 6u); - loop { - let _e338 = phi_460_; - if (_e338.member < _e338.member_1) { - phi_461_ = type_18((_e338.member + 1u), _e338.member_1); - phi_476_ = type_18(1u, _e338.member); - } else { - phi_461_ = _e338; - phi_476_ = type_18(0u, type_18().member_1); - } - let _e351 = phi_461_; - let _e353 = phi_476_; - switch bitcast(_e353.member) { - case 0: { - phi_503_ = false; - break; - } - case 1: { - let _e358 = ((_e131 + 35u) + (_e353.member_1 * 4u)); - let _e361 = global.member[_e358]; - let _e366 = global.member[(_e358 + 1u)]; - let _e371 = global.member[(_e358 + 2u)]; - let _e376 = global.member[(_e358 + 3u)]; - local_7[_e353.member_1] = vec4(bitcast(_e361), bitcast(_e366), bitcast(_e371), bitcast(_e376)); - phi_503_ = true; - break; - } - default: { - phi_503_ = bool(); - break; - } - } - let _e381 = phi_503_; - continue; - continuing { - phi_460_ = _e351; - break if !(_e381); - } - } - let _e383 = local_7; - local_6 = array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); - phi_509_ = type_18(0u, 8u); - loop { - let _e386 = phi_509_; - if (_e386.member < _e386.member_1) { - phi_510_ = type_18((_e386.member + 1u), _e386.member_1); - phi_525_ = type_18(1u, _e386.member); - } else { - phi_510_ = _e386; - phi_525_ = type_18(0u, type_18().member_1); - } - let _e399 = phi_510_; - let _e401 = phi_525_; - switch bitcast(_e401.member) { - case 0: { - phi_548_ = false; - break; - } - case 1: { - let _e406 = ((_e131 + 59u) + (_e401.member_1 * 3u)); - let _e409 = global.member[_e406]; - let _e414 = global.member[(_e406 + 1u)]; - let _e419 = global.member[(_e406 + 2u)]; - local_6[_e401.member_1] = vec3(bitcast(_e409), bitcast(_e414), bitcast(_e419)); - phi_548_ = true; - break; - } - default: { - phi_548_ = bool(); - break; - } - } - let _e424 = phi_548_; - continue; - continuing { - phi_509_ = _e399; - break if !(_e424); - } - } - let _e426 = local_6; - phi_556_ = type_16(type_14(vec4(bitcast(_e153), bitcast(_e158), bitcast(_e163), bitcast(_e168)), vec4(bitcast(_e174), bitcast(_e179), bitcast(_e184), bitcast(_e189)), vec4(bitcast(_e195), bitcast(_e200), bitcast(_e205), bitcast(_e210)), vec4(bitcast(_e216), bitcast(_e221), bitcast(_e226), bitcast(_e231))), type_14(vec4(bitcast(_e238), bitcast(_e243), bitcast(_e248), bitcast(_e253)), vec4(bitcast(_e259), bitcast(_e264), bitcast(_e269), bitcast(_e274)), vec4(bitcast(_e280), bitcast(_e285), bitcast(_e290), bitcast(_e295)), vec4(bitcast(_e301), bitcast(_e306), bitcast(_e311), bitcast(_e316))), type_15(_e426, _e383), vec3(bitcast(_e323), bitcast(_e328), bitcast(_e333))); - } else { - phi_556_ = type_16(type_14(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_14(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_15(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); - } - let _e430 = phi_556_; - if (_e82 >= 10u) { - phi_1240_ = (_e135 <= (_e82 - 10u)); - } else { - phi_1240_ = false; - } - let _e436 = phi_1240_; - if _e436 { - let _e439 = global.member[_e135]; - let _e444 = global.member[(_e135 + 1u)]; - let _e449 = global.member[(_e135 + 2u)]; - let _e455 = global.member[(_e135 + 3u)]; - let _e460 = global.member[(_e135 + 4u)]; - let _e465 = global.member[(_e135 + 5u)]; - let _e470 = global.member[(_e135 + 6u)]; - let _e476 = global.member[(_e135 + 7u)]; - let _e481 = global.member[(_e135 + 8u)]; - let _e486 = global.member[(_e135 + 9u)]; - phi_607_ = type_29(vec3(bitcast(_e439), bitcast(_e444), bitcast(_e449)), vec4(bitcast(_e455), bitcast(_e460), bitcast(_e465), bitcast(_e470)), vec3(bitcast(_e476), bitcast(_e481), bitcast(_e486))); - } else { - phi_607_ = type_29(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); - } - let _e491 = phi_607_; - let _e499 = (_e491.member_1.x + _e491.member_1.x); - let _e500 = (_e491.member_1.y + _e491.member_1.y); - let _e501 = (_e491.member_1.z + _e491.member_1.z); - let _e503 = (_e491.member_1.z * _e501); - let _e504 = (_e491.member_1.w * _e499); - let _e505 = (_e491.member_1.w * _e500); - let _e506 = (_e491.member_1.w * _e501); - let _e526 = (vec4((1f - fma(_e491.member_1.y, _e500, _e503)), fma(_e491.member_1.x, _e500, _e506), fma(_e491.member_1.x, _e501, -(_e505)), 0f) * _e491.member_2.x); - let _e528 = (vec4(fma(_e491.member_1.x, _e500, -(_e506)), (1f - fma(_e491.member_1.x, _e499, _e503)), fma(_e491.member_1.y, _e501, _e504), 0f) * _e491.member_2.y); - let _e530 = (vec4(fma(_e491.member_1.x, _e501, _e505), fma(_e491.member_1.y, _e501, -(_e504)), (1f - fma(_e491.member_1.x, _e499, (_e491.member_1.y * _e500))), 0f) * _e491.member_2.z); - let _e552 = (_e491.member.x + fma(_e530.x, _e114, fma(_e528.x, _e109, (_e526.x * _e104)))); - let _e553 = (_e491.member.y + fma(_e530.y, _e114, fma(_e528.y, _e109, (_e526.y * _e104)))); - let _e554 = (_e491.member.z + fma(_e530.z, _e114, fma(_e528.z, _e109, (_e526.z * _e104)))); - let _e555 = vec3(_e552, _e553, _e554); - let _e558 = (max(_e491.member_2.x, max(_e491.member_2.y, _e491.member_2.z)) * _e119); - let _e560 = sqrt((_e558 * _e558)); - local_1 = _e430.member_2.member; - local = _e430.member_2.member_1; - let _e565 = local[0u][0u]; - let _e568 = local[0u][1u]; - let _e573 = local[0u][2u]; - let _e577 = local[0u][3u]; - let _e579 = -(_e560); - if ((fma(_e573, _e554, fma(_e565, _e552, (_e568 * _e553))) + _e577) < _e579) { - phi_1006_ = type_30(true, 0u); - } else { - phi_739_ = type_18(0u, 6u); - loop { - let _e582 = phi_739_; - if (_e582.member < _e582.member_1) { - phi_740_ = type_18((_e582.member + 1u), _e582.member_1); - phi_755_ = type_18(1u, _e582.member); - } else { - phi_740_ = _e582; - phi_755_ = type_18(0u, type_18().member_1); - } - let _e595 = phi_740_; - let _e597 = phi_755_; - local_10 = _e597.member_1; - switch bitcast(_e597.member) { - case 0: { - phi_803_ = false; - phi_804_ = true; - break; - } - case 1: { - if (_e597.member_1 != 0u) { - if (_e597.member_1 < 6u) { - } else { - phi_1415_ = true; - phi_1154_ = bool(); - break; - } - let _e605 = local[_e597.member_1][0u]; - let _e608 = local[_e597.member_1][1u]; - let _e613 = local[_e597.member_1][2u]; - let _e617 = local[_e597.member_1][3u]; - phi_799_ = select(true, false, ((fma(_e613, _e554, fma(_e605, _e552, (_e608 * _e553))) + _e617) < _e579)); - } else { - phi_799_ = true; - } - let _e622 = phi_799_; - phi_803_ = _e622; - phi_804_ = false; - break; - } - default: { - phi_803_ = bool(); - phi_804_ = bool(); - break; - } - } - let _e624 = phi_803_; - let _e626 = phi_804_; - continue; - continuing { - phi_739_ = _e595; - phi_1415_ = false; - phi_1154_ = _e626; - break if !(_e624); - } - } - let _e629 = phi_1415_; - let _e631 = phi_1154_; - if _e629 { - break; - } - if _e631 { - let _e632 = vec3(_e560); - let _e633 = (_e555 - _e632); - let _e634 = (_e555 + _e632); - phi_1438_ = _e629; - phi_811_ = type_18(0u, 3u); - loop { - let _e636 = phi_1438_; - let _e638 = phi_811_; - if (_e638.member < _e638.member_1) { - phi_812_ = type_18((_e638.member + 1u), _e638.member_1); - phi_827_ = type_18(1u, _e638.member); - } else { - phi_812_ = _e638; - phi_827_ = type_18(0u, type_18().member_1); - } - let _e651 = phi_812_; - let _e653 = phi_827_; - switch bitcast(_e653.member) { - case 0: { - phi_1446_ = _e636; - phi_972_ = false; - phi_973_ = true; - phi_974_ = false; - phi_975_ = false; - break; - } - case 1: { - phi_837_ = type_18(0u, 8u); - phi_840_ = 0i; - loop { - let _e658 = phi_837_; - let _e660 = phi_840_; - local_8 = _e660; - if (_e658.member < _e658.member_1) { - phi_838_ = type_18((_e658.member + 1u), _e658.member_1); - phi_855_ = type_18(1u, _e658.member); - } else { - phi_838_ = _e658; - phi_855_ = type_18(0u, type_18().member_1); - } - let _e673 = phi_838_; - let _e675 = phi_855_; - switch bitcast(_e675.member) { - case 0: { - phi_841_ = i32(); - phi_897_ = false; - break; - } - case 1: { - if (_e675.member_1 < 8u) { - } else { - phi_1433_ = true; - break; - } - let _e682 = local_1[_e675.member_1][0u]; - let _e685 = local_1[_e675.member_1][1u]; - let _e688 = local_1[_e675.member_1][2u]; - local_2 = array(_e682, _e685, _e688); - let _e690 = (_e653.member_1 < 3u); - if _e690 { - } else { - phi_1433_ = true; - break; - } - let _e692 = local_2[_e653.member_1]; - local_3 = array(_e633.x, _e633.y, _e633.z); - if _e690 { - } else { - phi_1433_ = true; - break; - } - let _e698 = local_3[_e653.member_1]; - if (_e692 < _e698) { - phi_896_ = (_e660 + 1i); - } else { - phi_896_ = _e660; - } - let _e702 = phi_896_; - phi_841_ = _e702; - phi_897_ = true; - break; - } - default: { - phi_841_ = i32(); - phi_897_ = bool(); - break; - } - } - let _e704 = phi_841_; - let _e706 = phi_897_; - continue; - continuing { - phi_837_ = _e673; - phi_840_ = _e704; - phi_1433_ = _e636; - break if !(_e706); - } - } - let _e709 = phi_1433_; - phi_1445_ = _e709; - phi_1157_ = bool(); - phi_1156_ = bool(); - phi_1155_ = bool(); - if _e709 { - break; - } - let _e711 = local_8; - let _e712 = (_e711 == 8i); - if _e712 { - phi_1447_ = _e709; - phi_970_ = false; - phi_971_ = false; - } else { - phi_904_ = type_18(0u, 8u); - phi_907_ = 0i; - loop { - let _e714 = phi_904_; - let _e716 = phi_907_; - local_9 = _e716; - if (_e714.member < _e714.member_1) { - phi_905_ = type_18((_e714.member + 1u), _e714.member_1); - phi_922_ = type_18(1u, _e714.member); - } else { - phi_905_ = _e714; - phi_922_ = type_18(0u, type_18().member_1); - } - let _e729 = phi_905_; - let _e731 = phi_922_; - switch bitcast(_e731.member) { - case 0: { - phi_908_ = i32(); - phi_964_ = false; - break; - } - case 1: { - if (_e731.member_1 < 8u) { - } else { - phi_1440_ = true; - break; - } - let _e738 = local_1[_e731.member_1][0u]; - let _e741 = local_1[_e731.member_1][1u]; - let _e744 = local_1[_e731.member_1][2u]; - local_4 = array(_e738, _e741, _e744); - let _e746 = (_e653.member_1 < 3u); - if _e746 { - } else { - phi_1440_ = true; - break; - } - let _e748 = local_4[_e653.member_1]; - local_5 = array(_e634.x, _e634.y, _e634.z); - if _e746 { - } else { - phi_1440_ = true; - break; - } - let _e754 = local_5[_e653.member_1]; - if (_e748 > _e754) { - phi_963_ = (_e716 + 1i); - } else { - phi_963_ = _e716; - } - let _e758 = phi_963_; - phi_908_ = _e758; - phi_964_ = true; - break; - } - default: { - phi_908_ = i32(); - phi_964_ = bool(); - break; - } - } - let _e760 = phi_908_; - let _e762 = phi_964_; - continue; - continuing { - phi_904_ = _e729; - phi_907_ = _e760; - phi_1440_ = _e709; - break if !(_e762); - } - } - let _e765 = phi_1440_; - phi_1445_ = _e765; - phi_1157_ = bool(); - phi_1156_ = bool(); - phi_1155_ = bool(); - if _e765 { - break; - } - let _e767 = local_9; - let _e768 = (_e767 == 8i); - phi_1447_ = _e765; - phi_970_ = select(true, false, _e768); - phi_971_ = _e768; - } - let _e771 = phi_1447_; - let _e773 = phi_970_; - let _e775 = phi_971_; - phi_1446_ = _e771; - phi_972_ = _e773; - phi_973_ = false; - phi_974_ = _e712; - phi_975_ = _e775; - break; - } - default: { - phi_1446_ = _e636; - phi_972_ = bool(); - phi_973_ = bool(); - phi_974_ = bool(); - phi_975_ = bool(); - break; - } - } - let _e777 = phi_1446_; - let _e779 = phi_972_; - let _e781 = phi_973_; - let _e783 = phi_974_; - let _e785 = phi_975_; - continue; - continuing { - phi_1438_ = _e777; - phi_811_ = _e651; - phi_1445_ = _e777; - phi_1157_ = _e785; - phi_1156_ = _e783; - phi_1155_ = _e781; - break if !(_e779); - } - } - let _e788 = phi_1445_; - let _e790 = phi_1157_; - let _e792 = phi_1156_; - let _e794 = phi_1155_; - if _e788 { - break; - } - let _e795 = select(_e792, false, _e794); - if select(true, false, select(_e795, true, select(select(_e790, false, _e794), false, _e795))) { - phi_998_ = type_30(false, 0u); - } else { - phi_998_ = type_30(true, 0u); - } - let _e801 = phi_998_; - phi_999_ = _e801; - } else { - phi_999_ = type_30(); - } - let _e803 = phi_999_; - if select(true, false, _e631) { - let _e806 = local_10; - phi_1005_ = type_30(true, _e806); - } else { - phi_1005_ = _e803; - } - let _e809 = phi_1005_; - phi_1006_ = _e809; - } - let _e811 = phi_1006_; - if (_e811.member != true) { - } else { - global_1.member[_e85.x].member_1 = 0u; - } - } - } - break; - } - } - return; -} - -@compute @workgroup_size(32, 1, 1) -fn cullcompute_frustum_culling(@builtin(global_invocation_id) param: vec3) { - global_2 = param; - function(); -} diff --git a/crates/renderling/shaders/debug-debug_overlay_fragment.spv b/crates/renderling/shaders/debug-debug_overlay_fragment.spv new file mode 100644 index 00000000..43151e3a Binary files /dev/null and b/crates/renderling/shaders/debug-debug_overlay_fragment.spv differ diff --git a/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl b/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl new file mode 100644 index 00000000..a2ec575a --- /dev/null +++ b/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl @@ -0,0 +1,679 @@ +struct type_10 { + member: array, +} + +struct type_17 { + member: u32, + member_1: u32, +} + +struct type_21 { + member: u32, + member_1: u32, + member_2: u32, + member_3: u32, +} + +struct type_23 { + member: array, +} + +struct type_26 { + member: vec3, + member_1: vec4, + member_2: vec3, +} + +@group(0) @binding(0) +var global: type_10; +var global_1: vec4; +@group(0) @binding(1) +var global_2: type_23; +var global_3: vec4; + +fn function() { + var local: array, 6>; + var local_1: array, 8>; + var local_2: array; + var local_3: array; + var local_4: array; + var local_5: array; + var local_6: array, 8>; + var local_7: array, 6>; + var phi_2139_: bool; + var phi_540_: type_17; + var phi_541_: type_17; + var phi_556_: type_17; + var phi_726_: type_17; + var phi_727_: type_17; + var phi_742_: type_17; + var phi_769_: bool; + var phi_775_: type_17; + var phi_776_: type_17; + var phi_791_: type_17; + var phi_814_: bool; + var phi_870_: type_26; + var phi_1013_: type_17; + var phi_1014_: type_17; + var phi_1029_: type_17; + var phi_1073_: bool; + var phi_1077_: bool; + var phi_1078_: bool; + var phi_2127_: bool; + var phi_1576_: bool; + var phi_2147_: bool; + var phi_1085_: type_17; + var phi_1086_: type_17; + var phi_1101_: type_17; + var phi_1111_: type_17; + var phi_1114_: i32; + var phi_1112_: type_17; + var phi_1129_: type_17; + var phi_1170_: i32; + var phi_1115_: i32; + var phi_1171_: bool; + var phi_2142_: bool; + var local_8: i32; + var phi_1178_: type_17; + var phi_1181_: i32; + var phi_1179_: type_17; + var phi_1196_: type_17; + var phi_1237_: i32; + var phi_1182_: i32; + var phi_1238_: bool; + var phi_2149_: bool; + var local_9: i32; + var phi_2156_: bool; + var phi_1244_: bool; + var phi_2155_: bool; + var phi_1246_: bool; + var phi_2154_: bool; + var phi_2162_: bool; + var phi_2161_: bool; + var phi_2159_: bool; + var phi_1491_: bool; + var phi_2158_: bool; + + switch bitcast(0u) { + default: { + let _e75 = global_3; + let _e78 = global.member[2u]; + let _e81 = global.member[3u]; + global_1 = vec4(0f, 0f, 0f, 0f); + phi_2139_ = false; + phi_540_ = type_17(0u, arrayLength((&global_2.member))); + loop { + let _e84 = phi_2139_; + let _e86 = phi_540_; + if (_e86.member < _e86.member_1) { + phi_541_ = type_17((_e86.member + 1u), _e86.member_1); + phi_556_ = type_17(1u, _e86.member); + } else { + phi_541_ = _e86; + phi_556_ = type_17(0u, type_17().member_1); + } + let _e99 = phi_541_; + let _e101 = phi_556_; + switch bitcast(_e101.member) { + case 0: { + phi_2159_ = _e84; + phi_1491_ = false; + break; + } + case 1: { + let _e108 = global_2.member[_e101.member_1].member_3; + let _e112 = global.member[(_e108 + 9u)]; + let _e115 = global.member[_e112]; + let _e116 = bitcast(_e115); + let _e120 = global.member[(_e112 + 1u)]; + let _e121 = bitcast(_e120); + let _e125 = global.member[(_e112 + 2u)]; + let _e126 = bitcast(_e125); + let _e130 = global.member[(_e112 + 3u)]; + let _e131 = bitcast(_e130); + let _e135 = global.member[(_e112 + 4u)]; + let _e136 = bitcast(_e135); + let _e140 = global.member[(_e112 + 5u)]; + let _e141 = bitcast(_e140); + let _e145 = global.member[(_e112 + 6u)]; + let _e146 = bitcast(_e145); + let _e150 = global.member[(_e112 + 7u)]; + let _e151 = bitcast(_e150); + let _e155 = global.member[(_e112 + 8u)]; + let _e156 = bitcast(_e155); + let _e160 = global.member[(_e112 + 9u)]; + let _e161 = bitcast(_e160); + let _e165 = global.member[(_e112 + 10u)]; + let _e166 = bitcast(_e165); + let _e170 = global.member[(_e112 + 11u)]; + let _e171 = bitcast(_e170); + let _e175 = global.member[(_e112 + 12u)]; + let _e176 = bitcast(_e175); + let _e180 = global.member[(_e112 + 13u)]; + let _e181 = bitcast(_e180); + let _e185 = global.member[(_e112 + 14u)]; + let _e186 = bitcast(_e185); + let _e190 = global.member[(_e112 + 15u)]; + let _e191 = bitcast(_e190); + let _e195 = global.member[(_e112 + 16u)]; + let _e196 = bitcast(_e195); + let _e200 = global.member[(_e112 + 17u)]; + let _e201 = bitcast(_e200); + let _e205 = global.member[(_e112 + 18u)]; + let _e206 = bitcast(_e205); + let _e210 = global.member[(_e112 + 19u)]; + let _e211 = bitcast(_e210); + let _e215 = global.member[(_e112 + 20u)]; + let _e216 = bitcast(_e215); + let _e220 = global.member[(_e112 + 21u)]; + let _e221 = bitcast(_e220); + let _e225 = global.member[(_e112 + 22u)]; + let _e226 = bitcast(_e225); + let _e230 = global.member[(_e112 + 23u)]; + let _e231 = bitcast(_e230); + let _e235 = global.member[(_e112 + 24u)]; + let _e236 = bitcast(_e235); + let _e240 = global.member[(_e112 + 25u)]; + let _e241 = bitcast(_e240); + let _e245 = global.member[(_e112 + 26u)]; + let _e246 = bitcast(_e245); + let _e250 = global.member[(_e112 + 27u)]; + let _e251 = bitcast(_e250); + let _e255 = global.member[(_e112 + 28u)]; + let _e256 = bitcast(_e255); + let _e260 = global.member[(_e112 + 29u)]; + let _e261 = bitcast(_e260); + let _e265 = global.member[(_e112 + 30u)]; + let _e266 = bitcast(_e265); + let _e270 = global.member[(_e112 + 31u)]; + let _e271 = bitcast(_e270); + local_7 = array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); + phi_726_ = type_17(0u, 6u); + loop { + let _e274 = phi_726_; + if (_e274.member < _e274.member_1) { + phi_727_ = type_17((_e274.member + 1u), _e274.member_1); + phi_742_ = type_17(1u, _e274.member); + } else { + phi_727_ = _e274; + phi_742_ = type_17(0u, type_17().member_1); + } + let _e287 = phi_727_; + let _e289 = phi_742_; + switch bitcast(_e289.member) { + case 0: { + phi_769_ = false; + break; + } + case 1: { + let _e294 = ((_e112 + 35u) + (_e289.member_1 * 4u)); + let _e297 = global.member[_e294]; + let _e302 = global.member[(_e294 + 1u)]; + let _e307 = global.member[(_e294 + 2u)]; + let _e312 = global.member[(_e294 + 3u)]; + local_7[_e289.member_1] = vec4(bitcast(_e297), bitcast(_e302), bitcast(_e307), bitcast(_e312)); + phi_769_ = true; + break; + } + default: { + phi_769_ = bool(); + break; + } + } + let _e317 = phi_769_; + continue; + continuing { + phi_726_ = _e287; + break if !(_e317); + } + } + let _e319 = local_7; + local_6 = array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); + phi_775_ = type_17(0u, 8u); + loop { + let _e322 = phi_775_; + if (_e322.member < _e322.member_1) { + phi_776_ = type_17((_e322.member + 1u), _e322.member_1); + phi_791_ = type_17(1u, _e322.member); + } else { + phi_776_ = _e322; + phi_791_ = type_17(0u, type_17().member_1); + } + let _e335 = phi_776_; + let _e337 = phi_791_; + switch bitcast(_e337.member) { + case 0: { + phi_814_ = false; + break; + } + case 1: { + let _e342 = ((_e112 + 59u) + (_e337.member_1 * 3u)); + let _e345 = global.member[_e342]; + let _e350 = global.member[(_e342 + 1u)]; + let _e355 = global.member[(_e342 + 2u)]; + local_6[_e337.member_1] = vec3(bitcast(_e345), bitcast(_e350), bitcast(_e355)); + phi_814_ = true; + break; + } + default: { + phi_814_ = bool(); + break; + } + } + let _e360 = phi_814_; + continue; + continuing { + phi_775_ = _e335; + break if !(_e360); + } + } + let _e362 = local_6; + let _e366 = global.member[(_e108 + 10u)]; + if ((_e366 == 4294967295u) != true) { + let _e371 = global.member[_e366]; + let _e376 = global.member[(_e366 + 1u)]; + let _e381 = global.member[(_e366 + 2u)]; + let _e387 = global.member[(_e366 + 3u)]; + let _e392 = global.member[(_e366 + 4u)]; + let _e397 = global.member[(_e366 + 5u)]; + let _e402 = global.member[(_e366 + 6u)]; + let _e408 = global.member[(_e366 + 7u)]; + let _e413 = global.member[(_e366 + 8u)]; + let _e418 = global.member[(_e366 + 9u)]; + phi_870_ = type_26(vec3(bitcast(_e371), bitcast(_e376), bitcast(_e381)), vec4(bitcast(_e387), bitcast(_e392), bitcast(_e397), bitcast(_e402)), vec3(bitcast(_e408), bitcast(_e413), bitcast(_e418))); + } else { + phi_870_ = type_26(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + } + let _e423 = phi_870_; + let _e427 = global.member[(_e108 + 3u)]; + let _e428 = bitcast(_e427); + let _e432 = global.member[(_e108 + 4u)]; + let _e433 = bitcast(_e432); + let _e437 = global.member[(_e108 + 5u)]; + let _e438 = bitcast(_e437); + let _e442 = global.member[(_e108 + 6u)]; + let _e451 = (_e423.member_1.x + _e423.member_1.x); + let _e452 = (_e423.member_1.y + _e423.member_1.y); + let _e453 = (_e423.member_1.z + _e423.member_1.z); + let _e455 = (_e423.member_1.z * _e453); + let _e456 = (_e423.member_1.w * _e451); + let _e457 = (_e423.member_1.w * _e452); + let _e458 = (_e423.member_1.w * _e453); + let _e478 = (vec4((1f - fma(_e423.member_1.y, _e452, _e455)), fma(_e423.member_1.x, _e452, _e458), fma(_e423.member_1.x, _e453, -(_e457)), 0f) * _e423.member_2.x); + let _e480 = (vec4(fma(_e423.member_1.x, _e452, -(_e458)), (1f - fma(_e423.member_1.x, _e451, _e455)), fma(_e423.member_1.y, _e453, _e456), 0f) * _e423.member_2.y); + let _e482 = (vec4(fma(_e423.member_1.x, _e453, _e457), fma(_e423.member_1.y, _e453, -(_e456)), (1f - fma(_e423.member_1.x, _e451, (_e423.member_1.y * _e452))), 0f) * _e423.member_2.z); + let _e504 = (_e423.member.x + fma(_e482.x, _e438, fma(_e480.x, _e433, (_e478.x * _e428)))); + let _e505 = (_e423.member.y + fma(_e482.y, _e438, fma(_e480.y, _e433, (_e478.y * _e428)))); + let _e506 = (_e423.member.z + fma(_e482.z, _e438, fma(_e480.z, _e433, (_e478.z * _e428)))); + let _e507 = vec3(_e504, _e505, _e506); + let _e510 = (max(_e423.member_2.x, max(_e423.member_2.y, _e423.member_2.z)) * bitcast(_e442)); + let _e512 = sqrt((_e510 * _e510)); + local_1 = _e362; + local = _e319; + let _e515 = local[0u][0u]; + let _e518 = local[0u][1u]; + let _e523 = local[0u][2u]; + let _e527 = local[0u][3u]; + let _e529 = -(_e512); + if ((fma(_e523, _e506, fma(_e515, _e504, (_e518 * _e505))) + _e527) < _e529) { + phi_2161_ = _e84; + } else { + phi_1013_ = type_17(0u, 6u); + loop { + let _e532 = phi_1013_; + if (_e532.member < _e532.member_1) { + phi_1014_ = type_17((_e532.member + 1u), _e532.member_1); + phi_1029_ = type_17(1u, _e532.member); + } else { + phi_1014_ = _e532; + phi_1029_ = type_17(0u, type_17().member_1); + } + let _e545 = phi_1014_; + let _e547 = phi_1029_; + switch bitcast(_e547.member) { + case 0: { + phi_1077_ = false; + phi_1078_ = true; + break; + } + case 1: { + if (_e547.member_1 != 0u) { + if (_e547.member_1 < 6u) { + } else { + phi_2127_ = true; + phi_1576_ = bool(); + break; + } + let _e555 = local[_e547.member_1][0u]; + let _e558 = local[_e547.member_1][1u]; + let _e563 = local[_e547.member_1][2u]; + let _e567 = local[_e547.member_1][3u]; + phi_1073_ = select(true, false, ((fma(_e563, _e506, fma(_e555, _e504, (_e558 * _e505))) + _e567) < _e529)); + } else { + phi_1073_ = true; + } + let _e572 = phi_1073_; + phi_1077_ = _e572; + phi_1078_ = false; + break; + } + default: { + phi_1077_ = bool(); + phi_1078_ = bool(); + break; + } + } + let _e574 = phi_1077_; + let _e576 = phi_1078_; + continue; + continuing { + phi_1013_ = _e545; + phi_2127_ = _e84; + phi_1576_ = _e576; + break if !(_e574); + } + } + let _e579 = phi_2127_; + let _e581 = phi_1576_; + phi_2158_ = _e579; + if _e579 { + break; + } + if _e581 { + let _e582 = vec3(_e512); + let _e583 = (_e507 - _e582); + let _e584 = (_e507 + _e582); + phi_2147_ = _e579; + phi_1085_ = type_17(0u, 3u); + loop { + let _e586 = phi_2147_; + let _e588 = phi_1085_; + if (_e588.member < _e588.member_1) { + phi_1086_ = type_17((_e588.member + 1u), _e588.member_1); + phi_1101_ = type_17(1u, _e588.member); + } else { + phi_1086_ = _e588; + phi_1101_ = type_17(0u, type_17().member_1); + } + let _e601 = phi_1086_; + let _e603 = phi_1101_; + switch bitcast(_e603.member) { + case 0: { + phi_2155_ = _e586; + phi_1246_ = false; + break; + } + case 1: { + phi_1111_ = type_17(0u, 8u); + phi_1114_ = 0i; + loop { + let _e608 = phi_1111_; + let _e610 = phi_1114_; + local_8 = _e610; + if (_e608.member < _e608.member_1) { + phi_1112_ = type_17((_e608.member + 1u), _e608.member_1); + phi_1129_ = type_17(1u, _e608.member); + } else { + phi_1112_ = _e608; + phi_1129_ = type_17(0u, type_17().member_1); + } + let _e623 = phi_1112_; + let _e625 = phi_1129_; + switch bitcast(_e625.member) { + case 0: { + phi_1115_ = i32(); + phi_1171_ = false; + break; + } + case 1: { + if (_e625.member_1 < 8u) { + } else { + phi_2142_ = true; + break; + } + let _e632 = local_1[_e625.member_1][0u]; + let _e635 = local_1[_e625.member_1][1u]; + let _e638 = local_1[_e625.member_1][2u]; + local_2 = array(_e632, _e635, _e638); + let _e640 = (_e603.member_1 < 3u); + if _e640 { + } else { + phi_2142_ = true; + break; + } + let _e642 = local_2[_e603.member_1]; + local_3 = array(_e583.x, _e583.y, _e583.z); + if _e640 { + } else { + phi_2142_ = true; + break; + } + let _e648 = local_3[_e603.member_1]; + if (_e642 < _e648) { + phi_1170_ = (_e610 + 1i); + } else { + phi_1170_ = _e610; + } + let _e652 = phi_1170_; + phi_1115_ = _e652; + phi_1171_ = true; + break; + } + default: { + phi_1115_ = i32(); + phi_1171_ = bool(); + break; + } + } + let _e654 = phi_1115_; + let _e656 = phi_1171_; + continue; + continuing { + phi_1111_ = _e623; + phi_1114_ = _e654; + phi_2142_ = _e586; + break if !(_e656); + } + } + let _e659 = phi_2142_; + phi_2154_ = _e659; + if _e659 { + break; + } + let _e661 = local_8; + if (_e661 == 8i) { + phi_2156_ = _e659; + phi_1244_ = false; + } else { + phi_1178_ = type_17(0u, 8u); + phi_1181_ = 0i; + loop { + let _e664 = phi_1178_; + let _e666 = phi_1181_; + local_9 = _e666; + if (_e664.member < _e664.member_1) { + phi_1179_ = type_17((_e664.member + 1u), _e664.member_1); + phi_1196_ = type_17(1u, _e664.member); + } else { + phi_1179_ = _e664; + phi_1196_ = type_17(0u, type_17().member_1); + } + let _e679 = phi_1179_; + let _e681 = phi_1196_; + switch bitcast(_e681.member) { + case 0: { + phi_1182_ = i32(); + phi_1238_ = false; + break; + } + case 1: { + if (_e681.member_1 < 8u) { + } else { + phi_2149_ = true; + break; + } + let _e688 = local_1[_e681.member_1][0u]; + let _e691 = local_1[_e681.member_1][1u]; + let _e694 = local_1[_e681.member_1][2u]; + local_4 = array(_e688, _e691, _e694); + let _e696 = (_e603.member_1 < 3u); + if _e696 { + } else { + phi_2149_ = true; + break; + } + let _e698 = local_4[_e603.member_1]; + local_5 = array(_e584.x, _e584.y, _e584.z); + if _e696 { + } else { + phi_2149_ = true; + break; + } + let _e704 = local_5[_e603.member_1]; + if (_e698 > _e704) { + phi_1237_ = (_e666 + 1i); + } else { + phi_1237_ = _e666; + } + let _e708 = phi_1237_; + phi_1182_ = _e708; + phi_1238_ = true; + break; + } + default: { + phi_1182_ = i32(); + phi_1238_ = bool(); + break; + } + } + let _e710 = phi_1182_; + let _e712 = phi_1238_; + continue; + continuing { + phi_1178_ = _e679; + phi_1181_ = _e710; + phi_2149_ = _e659; + break if !(_e712); + } + } + let _e715 = phi_2149_; + phi_2154_ = _e715; + if _e715 { + break; + } + let _e717 = local_9; + phi_2156_ = _e715; + phi_1244_ = select(true, false, (_e717 == 8i)); + } + let _e721 = phi_2156_; + let _e723 = phi_1244_; + phi_2155_ = _e721; + phi_1246_ = _e723; + break; + } + default: { + phi_2155_ = _e586; + phi_1246_ = bool(); + break; + } + } + let _e725 = phi_2155_; + let _e727 = phi_1246_; + continue; + continuing { + phi_2147_ = _e725; + phi_1085_ = _e601; + phi_2154_ = _e725; + break if !(_e727); + } + } + let _e730 = phi_2154_; + phi_2158_ = _e730; + if _e730 { + break; + } + phi_2162_ = _e730; + } else { + phi_2162_ = _e579; + } + let _e732 = phi_2162_; + phi_2161_ = _e732; + } + let _e734 = phi_2161_; + let _e735 = f32(_e78); + let _e752 = fma(_e186, _e211, fma(_e166, _e206, fma(_e126, _e196, (_e146 * _e201)))); + let _e753 = fma(_e191, _e211, fma(_e171, _e206, fma(_e131, _e196, (_e151 * _e201)))); + let _e768 = fma(_e186, _e231, fma(_e166, _e226, fma(_e126, _e216, (_e146 * _e221)))); + let _e769 = fma(_e191, _e231, fma(_e171, _e226, fma(_e131, _e216, (_e151 * _e221)))); + let _e784 = fma(_e186, _e251, fma(_e166, _e246, fma(_e126, _e236, (_e146 * _e241)))); + let _e785 = fma(_e191, _e251, fma(_e171, _e246, fma(_e131, _e236, (_e151 * _e241)))); + let _e800 = fma(_e186, _e271, fma(_e166, _e266, fma(_e126, _e256, (_e146 * _e261)))); + let _e801 = fma(_e191, _e271, fma(_e171, _e266, fma(_e131, _e256, (_e151 * _e261)))); + let _e813 = (fma(_e785, _e506, fma(_e753, _e504, (_e769 * _e505))) + _e801); + let _e818 = fma(_e512, _e319[5].x, _e504); + let _e819 = fma(_e512, _e319[5].y, _e505); + let _e820 = fma(_e512, _e319[5].z, _e506); + let _e834 = fma(_e512, _e319[0].x, _e504); + let _e835 = fma(_e512, _e319[0].y, _e505); + let _e836 = fma(_e512, _e319[0].z, _e506); + let _e853 = (vec2(((((fma(fma(_e176, _e251, fma(_e156, _e246, fma(_e116, _e236, (_e136 * _e241)))), _e506, fma(fma(_e176, _e211, fma(_e156, _e206, fma(_e116, _e196, (_e136 * _e201)))), _e504, (fma(_e176, _e231, fma(_e156, _e226, fma(_e116, _e216, (_e136 * _e221)))) * _e505))) + fma(_e176, _e271, fma(_e156, _e266, fma(_e116, _e256, (_e136 * _e261))))) / _e813) + 1f) * 0.5f), fma((-1f - ((fma(fma(_e181, _e251, fma(_e161, _e246, fma(_e121, _e236, (_e141 * _e241)))), _e506, fma(fma(_e181, _e211, fma(_e161, _e206, fma(_e121, _e196, (_e141 * _e201)))), _e504, (fma(_e181, _e231, fma(_e161, _e226, fma(_e121, _e216, (_e141 * _e221)))) * _e505))) + fma(_e181, _e271, fma(_e161, _e266, fma(_e121, _e256, (_e141 * _e261))))) / _e813)), 0.5f, 1f)) * vec2(_e735, f32(_e81))); + let _e854 = (_e512 / _e813); + let _e856 = -(_e735); + let _e860 = vec3(fma(_e856, _e854, _e853.x), fma(_e856, _e854, _e853.y), ((_e800 + fma(_e784, _e820, fma(_e768, _e819, (_e752 * _e818)))) / (_e801 + fma(_e785, _e820, fma(_e769, _e819, (_e753 * _e818)))))); + let _e863 = vec3(fma(_e735, _e854, _e853.x), fma(_e735, _e854, _e853.y), ((_e800 + fma(_e784, _e836, fma(_e768, _e835, (_e752 * _e834)))) / (_e801 + fma(_e785, _e836, fma(_e769, _e835, (_e753 * _e834)))))); + let _e864 = min(_e860, _e863); + let _e865 = max(_e860, _e863); + let _e886 = fma(-((_e865.x - _e864.x)), 0.5f, abs(fma(-((_e864.x + _e865.x)), 0.5f, (_e75.x + 0.5f)))); + let _e888 = fma(-((_e865.y - _e864.y)), 0.5f, abs(fma(-((_e864.y + _e865.y)), 0.5f, (_e75.y + 0.5f)))); + let _e889 = max(_e886, 0f); + let _e890 = max(_e888, 0f); + let _e899 = f32(select(0u, 1u, (_e865.z <= 1f))); + let _e900 = abs((min(max(_e886, _e888), 0f) + sqrt(fma(_e889, _e889, (_e890 * _e890))))); + if (_e900 < 0.5f) { + global_1 = vec4(0f, 0f, 0f, _e899); + } else { + if (_e900 <= 2f) { + global_1 = vec4(1f, 1f, 1f, (0.5f * _e899)); + } else { + if (_e900 <= 3f) { + global_1 = vec4(0.5f, 0.5f, 0.5f, _e899); + } + } + } + phi_2159_ = _e734; + phi_1491_ = true; + break; + } + default: { + phi_2159_ = _e84; + phi_1491_ = bool(); + break; + } + } + let _e909 = phi_2159_; + let _e911 = phi_1491_; + continue; + continuing { + phi_2139_ = _e909; + phi_540_ = _e99; + phi_2158_ = _e909; + break if !(_e911); + } + } + let _e914 = phi_2158_; + if _e914 { + break; + } + break; + } + } + return; +} + +@fragment +fn debugdebug_overlay_fragment(@builtin(position) param: vec4) -> @location(0) vec4 { + global_3 = param; + function(); + let _e3 = global_1; + return _e3; +} diff --git a/crates/renderling/shaders/debug-debug_overlay_vertex.spv b/crates/renderling/shaders/debug-debug_overlay_vertex.spv new file mode 100644 index 00000000..6e631c96 Binary files /dev/null and b/crates/renderling/shaders/debug-debug_overlay_vertex.spv differ diff --git a/crates/renderling/shaders/debug-debug_overlay_vertex.wgsl b/crates/renderling/shaders/debug-debug_overlay_vertex.wgsl new file mode 100644 index 00000000..77844c9c --- /dev/null +++ b/crates/renderling/shaders/debug-debug_overlay_vertex.wgsl @@ -0,0 +1,32 @@ +var global: u32; +var global_1: vec4 = vec4(0f, 0f, 0f, 1f); + +fn function() { + var local: array, 6>; + + switch bitcast(0u) { + default: { + let _e14 = global; + local = array, 6>(vec4(-1f, -1f, 0.5f, 1f), vec4(1f, -1f, 0.5f, 1f), vec4(1f, 1f, 0.5f, 1f), vec4(1f, 1f, 0.5f, 1f), vec4(-1f, 1f, 0.5f, 1f), vec4(-1f, -1f, 0.5f, 1f)); + let _e15 = (_e14 % 6u); + if (_e15 < 6u) { + } else { + break; + } + let _e18 = local[_e15]; + global_1 = _e18; + break; + } + } + return; +} + +@vertex +fn debugdebug_overlay_vertex(@builtin(vertex_index) param: u32) -> @builtin(position) vec4 { + global = param; + function(); + let _e4 = global_1.y; + global_1.y = -(_e4); + let _e6 = global_1; + return _e6; +} diff --git a/crates/renderling/shaders/manifest.json b/crates/renderling/shaders/manifest.json index 150eea7c..7e8e0f99 100644 --- a/crates/renderling/shaders/manifest.json +++ b/crates/renderling/shaders/manifest.json @@ -1,121 +1,146 @@ [ { - "source_path": "crates/renderling/shaders/bloom-bloom_downsample_fragment.spv", + "source_path": "shaders/bloom-bloom_downsample_fragment.spv", "entry_point": "bloom::bloom_downsample_fragment", "wgsl_entry_point": "bloombloom_downsample_fragment" }, { - "source_path": "crates/renderling/shaders/bloom-bloom_mix_fragment.spv", + "source_path": "shaders/bloom-bloom_mix_fragment.spv", "entry_point": "bloom::bloom_mix_fragment", "wgsl_entry_point": "bloombloom_mix_fragment" }, { - "source_path": "crates/renderling/shaders/bloom-bloom_upsample_fragment.spv", + "source_path": "shaders/bloom-bloom_upsample_fragment.spv", "entry_point": "bloom::bloom_upsample_fragment", "wgsl_entry_point": "bloombloom_upsample_fragment" }, { - "source_path": "crates/renderling/shaders/bloom-bloom_vertex.spv", + "source_path": "shaders/bloom-bloom_vertex.spv", "entry_point": "bloom::bloom_vertex", "wgsl_entry_point": "bloombloom_vertex" }, { - "source_path": "crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.spv", + "source_path": "shaders/convolution-brdf_lut_convolution_fragment.spv", "entry_point": "convolution::brdf_lut_convolution_fragment", "wgsl_entry_point": "convolutionbrdf_lut_convolution_fragment" }, { - "source_path": "crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.spv", + "source_path": "shaders/convolution-brdf_lut_convolution_vertex.spv", "entry_point": "convolution::brdf_lut_convolution_vertex", "wgsl_entry_point": "convolutionbrdf_lut_convolution_vertex" }, { - "source_path": "crates/renderling/shaders/convolution-generate_mipmap_fragment.spv", + "source_path": "shaders/convolution-generate_mipmap_fragment.spv", "entry_point": "convolution::generate_mipmap_fragment", "wgsl_entry_point": "convolutiongenerate_mipmap_fragment" }, { - "source_path": "crates/renderling/shaders/convolution-generate_mipmap_vertex.spv", + "source_path": "shaders/convolution-generate_mipmap_vertex.spv", "entry_point": "convolution::generate_mipmap_vertex", "wgsl_entry_point": "convolutiongenerate_mipmap_vertex" }, { - "source_path": "crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.spv", + "source_path": "shaders/convolution-prefilter_environment_cubemap_fragment.spv", "entry_point": "convolution::prefilter_environment_cubemap_fragment", "wgsl_entry_point": "convolutionprefilter_environment_cubemap_fragment" }, { - "source_path": "crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.spv", + "source_path": "shaders/convolution-prefilter_environment_cubemap_vertex.spv", "entry_point": "convolution::prefilter_environment_cubemap_vertex", "wgsl_entry_point": "convolutionprefilter_environment_cubemap_vertex" }, { - "source_path": "crates/renderling/shaders/cull-compute_frustum_culling.spv", - "entry_point": "cull::compute_frustum_culling", - "wgsl_entry_point": "cullcompute_frustum_culling" + "source_path": "shaders/cull-compute_copy_depth_to_pyramid.spv", + "entry_point": "cull::compute_copy_depth_to_pyramid", + "wgsl_entry_point": "cullcompute_copy_depth_to_pyramid" }, { - "source_path": "crates/renderling/shaders/skybox-skybox_cubemap_fragment.spv", + "source_path": "shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv", + "entry_point": "cull::compute_copy_depth_to_pyramid_multisampled", + "wgsl_entry_point": "cullcompute_copy_depth_to_pyramid_multisampled" + }, + { + "source_path": "shaders/cull-compute_culling.spv", + "entry_point": "cull::compute_culling", + "wgsl_entry_point": "cullcompute_culling" + }, + { + "source_path": "shaders/cull-compute_downsample_depth_pyramid.spv", + "entry_point": "cull::compute_downsample_depth_pyramid", + "wgsl_entry_point": "cullcompute_downsample_depth_pyramid" + }, + { + "source_path": "shaders/debug-debug_overlay_fragment.spv", + "entry_point": "debug::debug_overlay_fragment", + "wgsl_entry_point": "debugdebug_overlay_fragment" + }, + { + "source_path": "shaders/debug-debug_overlay_vertex.spv", + "entry_point": "debug::debug_overlay_vertex", + "wgsl_entry_point": "debugdebug_overlay_vertex" + }, + { + "source_path": "shaders/skybox-skybox_cubemap_fragment.spv", "entry_point": "skybox::skybox_cubemap_fragment", "wgsl_entry_point": "skyboxskybox_cubemap_fragment" }, { - "source_path": "crates/renderling/shaders/skybox-skybox_cubemap_vertex.spv", + "source_path": "shaders/skybox-skybox_cubemap_vertex.spv", "entry_point": "skybox::skybox_cubemap_vertex", "wgsl_entry_point": "skyboxskybox_cubemap_vertex" }, { - "source_path": "crates/renderling/shaders/skybox-skybox_equirectangular_fragment.spv", + "source_path": "shaders/skybox-skybox_equirectangular_fragment.spv", "entry_point": "skybox::skybox_equirectangular_fragment", "wgsl_entry_point": "skyboxskybox_equirectangular_fragment" }, { - "source_path": "crates/renderling/shaders/skybox-skybox_vertex.spv", + "source_path": "shaders/skybox-skybox_vertex.spv", "entry_point": "skybox::skybox_vertex", "wgsl_entry_point": "skyboxskybox_vertex" }, { - "source_path": "crates/renderling/shaders/stage-renderlet_fragment.spv", + "source_path": "shaders/stage-renderlet_fragment.spv", "entry_point": "stage::renderlet_fragment", "wgsl_entry_point": "stagerenderlet_fragment" }, { - "source_path": "crates/renderling/shaders/stage-renderlet_vertex.spv", + "source_path": "shaders/stage-renderlet_vertex.spv", "entry_point": "stage::renderlet_vertex", "wgsl_entry_point": "stagerenderlet_vertex" }, { - "source_path": "crates/renderling/shaders/tonemapping-tonemapping_fragment.spv", + "source_path": "shaders/tonemapping-tonemapping_fragment.spv", "entry_point": "tonemapping::tonemapping_fragment", "wgsl_entry_point": "tonemappingtonemapping_fragment" }, { - "source_path": "crates/renderling/shaders/tonemapping-tonemapping_vertex.spv", + "source_path": "shaders/tonemapping-tonemapping_vertex.spv", "entry_point": "tonemapping::tonemapping_vertex", "wgsl_entry_point": "tonemappingtonemapping_vertex" }, { - "source_path": "crates/renderling/shaders/tutorial-tutorial_implicit_isosceles_vertex.spv", + "source_path": "shaders/tutorial-tutorial_implicit_isosceles_vertex.spv", "entry_point": "tutorial::tutorial_implicit_isosceles_vertex", "wgsl_entry_point": "tutorialtutorial_implicit_isosceles_vertex" }, { - "source_path": "crates/renderling/shaders/tutorial-tutorial_passthru_fragment.spv", + "source_path": "shaders/tutorial-tutorial_passthru_fragment.spv", "entry_point": "tutorial::tutorial_passthru_fragment", "wgsl_entry_point": "tutorialtutorial_passthru_fragment" }, { - "source_path": "crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv", + "source_path": "shaders/tutorial-tutorial_slabbed_renderlet.spv", "entry_point": "tutorial::tutorial_slabbed_renderlet", "wgsl_entry_point": "tutorialtutorial_slabbed_renderlet" }, { - "source_path": "crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv", + "source_path": "shaders/tutorial-tutorial_slabbed_vertices.spv", "entry_point": "tutorial::tutorial_slabbed_vertices", "wgsl_entry_point": "tutorialtutorial_slabbed_vertices" }, { - "source_path": "crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.spv", + "source_path": "shaders/tutorial-tutorial_slabbed_vertices_no_instance.spv", "entry_point": "tutorial::tutorial_slabbed_vertices_no_instance", "wgsl_entry_point": "tutorialtutorial_slabbed_vertices_no_instance" } diff --git a/crates/renderling/shaders/skybox-skybox_vertex.spv b/crates/renderling/shaders/skybox-skybox_vertex.spv index cc307f64..55c9e197 100644 Binary files a/crates/renderling/shaders/skybox-skybox_vertex.spv and b/crates/renderling/shaders/skybox-skybox_vertex.spv differ diff --git a/crates/renderling/shaders/skybox-skybox_vertex.wgsl b/crates/renderling/shaders/skybox-skybox_vertex.wgsl index 67a569b0..6adee79a 100644 --- a/crates/renderling/shaders/skybox-skybox_vertex.wgsl +++ b/crates/renderling/shaders/skybox-skybox_vertex.wgsl @@ -34,36 +34,36 @@ struct VertexOutput { var global: u32; @group(0) @binding(0) var global_1: type_10; -var global_2: u32; -var global_3: vec3; -var global_4: vec4 = vec4(0f, 0f, 0f, 1f); +var global_2: vec4 = vec4(0f, 0f, 0f, 1f); +var global_3: u32; +var global_4: vec3; fn function() { var local: array, 8>; var local_1: array, 6>; var local_2: array, 36>; - var phi_725_: bool; - var phi_305_: type_23; - var phi_306_: type_23; - var phi_321_: type_23; - var phi_348_: bool; - var phi_354_: type_23; - var phi_355_: type_23; - var phi_370_: type_23; - var phi_393_: bool; - var phi_401_: type_21; + var phi_714_: bool; + var phi_301_: type_23; + var phi_302_: type_23; + var phi_317_: type_23; + var phi_344_: bool; + var phi_350_: type_23; + var phi_351_: type_23; + var phi_366_: type_23; + var phi_389_: bool; + var phi_397_: type_21; switch bitcast(0u) { default: { - let _e78 = global_2; + let _e78 = global_3; let _e79 = global; let _e81 = arrayLength((&global_1.member)); if (_e81 >= 83u) { - phi_725_ = (_e78 <= (_e81 - 83u)); + phi_714_ = (_e78 <= (_e81 - 83u)); } else { - phi_725_ = false; + phi_714_ = false; } - let _e86 = phi_725_; + let _e86 = phi_714_; if _e86 { let _e89 = global_1.member[_e78]; let _e94 = global_1.member[(_e78 + 1u)]; @@ -101,21 +101,21 @@ fn function() { let _e264 = global_1.member[(_e78 + 33u)]; let _e269 = global_1.member[(_e78 + 34u)]; local_1 = array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); - phi_305_ = type_23(0u, 6u); + phi_301_ = type_23(0u, 6u); loop { - let _e274 = phi_305_; + let _e274 = phi_301_; if (_e274.member < _e274.member_1) { - phi_306_ = type_23((_e274.member + 1u), _e274.member_1); - phi_321_ = type_23(1u, _e274.member); + phi_302_ = type_23((_e274.member + 1u), _e274.member_1); + phi_317_ = type_23(1u, _e274.member); } else { - phi_306_ = _e274; - phi_321_ = type_23(0u, type_23().member_1); + phi_302_ = _e274; + phi_317_ = type_23(0u, type_23().member_1); } - let _e287 = phi_306_; - let _e289 = phi_321_; + let _e287 = phi_302_; + let _e289 = phi_317_; switch bitcast(_e289.member) { case 0: { - phi_348_ = false; + phi_344_ = false; break; } case 1: { @@ -125,38 +125,38 @@ fn function() { let _e307 = global_1.member[(_e294 + 2u)]; let _e312 = global_1.member[(_e294 + 3u)]; local_1[_e289.member_1] = vec4(bitcast(_e297), bitcast(_e302), bitcast(_e307), bitcast(_e312)); - phi_348_ = true; + phi_344_ = true; break; } default: { - phi_348_ = bool(); + phi_344_ = bool(); break; } } - let _e317 = phi_348_; + let _e317 = phi_344_; continue; continuing { - phi_305_ = _e287; + phi_301_ = _e287; break if !(_e317); } } let _e319 = local_1; local = array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); - phi_354_ = type_23(0u, 8u); + phi_350_ = type_23(0u, 8u); loop { - let _e322 = phi_354_; + let _e322 = phi_350_; if (_e322.member < _e322.member_1) { - phi_355_ = type_23((_e322.member + 1u), _e322.member_1); - phi_370_ = type_23(1u, _e322.member); + phi_351_ = type_23((_e322.member + 1u), _e322.member_1); + phi_366_ = type_23(1u, _e322.member); } else { - phi_355_ = _e322; - phi_370_ = type_23(0u, type_23().member_1); + phi_351_ = _e322; + phi_366_ = type_23(0u, type_23().member_1); } - let _e335 = phi_355_; - let _e337 = phi_370_; + let _e335 = phi_351_; + let _e337 = phi_366_; switch bitcast(_e337.member) { case 0: { - phi_393_ = false; + phi_389_ = false; break; } case 1: { @@ -165,36 +165,36 @@ fn function() { let _e350 = global_1.member[(_e342 + 1u)]; let _e355 = global_1.member[(_e342 + 2u)]; local[_e337.member_1] = vec3(bitcast(_e345), bitcast(_e350), bitcast(_e355)); - phi_393_ = true; + phi_389_ = true; break; } default: { - phi_393_ = bool(); + phi_389_ = bool(); break; } } - let _e360 = phi_393_; + let _e360 = phi_389_; continue; continuing { - phi_354_ = _e335; + phi_350_ = _e335; break if !(_e360); } } let _e362 = local; - phi_401_ = type_21(type_19(vec4(bitcast(_e89), bitcast(_e94), bitcast(_e99), bitcast(_e104)), vec4(bitcast(_e110), bitcast(_e115), bitcast(_e120), bitcast(_e125)), vec4(bitcast(_e131), bitcast(_e136), bitcast(_e141), bitcast(_e146)), vec4(bitcast(_e152), bitcast(_e157), bitcast(_e162), bitcast(_e167))), type_19(vec4(bitcast(_e174), bitcast(_e179), bitcast(_e184), bitcast(_e189)), vec4(bitcast(_e195), bitcast(_e200), bitcast(_e205), bitcast(_e210)), vec4(bitcast(_e216), bitcast(_e221), bitcast(_e226), bitcast(_e231)), vec4(bitcast(_e237), bitcast(_e242), bitcast(_e247), bitcast(_e252))), type_20(_e362, _e319), vec3(bitcast(_e259), bitcast(_e264), bitcast(_e269))); + phi_397_ = type_21(type_19(vec4(bitcast(_e89), bitcast(_e94), bitcast(_e99), bitcast(_e104)), vec4(bitcast(_e110), bitcast(_e115), bitcast(_e120), bitcast(_e125)), vec4(bitcast(_e131), bitcast(_e136), bitcast(_e141), bitcast(_e146)), vec4(bitcast(_e152), bitcast(_e157), bitcast(_e162), bitcast(_e167))), type_19(vec4(bitcast(_e174), bitcast(_e179), bitcast(_e184), bitcast(_e189)), vec4(bitcast(_e195), bitcast(_e200), bitcast(_e205), bitcast(_e210)), vec4(bitcast(_e216), bitcast(_e221), bitcast(_e226), bitcast(_e231)), vec4(bitcast(_e237), bitcast(_e242), bitcast(_e247), bitcast(_e252))), type_20(_e362, _e319), vec3(bitcast(_e259), bitcast(_e264), bitcast(_e269))); } else { - phi_401_ = type_21(type_19(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_19(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_20(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); + phi_397_ = type_21(type_19(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_19(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_20(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); } - let _e366 = phi_401_; + let _e366 = phi_397_; local_2 = array, 36>(vec3(-0.5f, 0.5f, 0.5f), vec3(0.5f, 0.5f, -0.5f), vec3(-0.5f, 0.5f, -0.5f), vec3(-0.5f, 0.5f, 0.5f), vec3(0.5f, 0.5f, 0.5f), vec3(0.5f, 0.5f, -0.5f), vec3(-0.5f, 0.5f, 0.5f), vec3(-0.5f, -0.5f, 0.5f), vec3(0.5f, 0.5f, 0.5f), vec3(-0.5f, -0.5f, 0.5f), vec3(0.5f, -0.5f, 0.5f), vec3(0.5f, 0.5f, 0.5f), vec3(0.5f, 0.5f, 0.5f), vec3(0.5f, -0.5f, -0.5f), vec3(0.5f, 0.5f, -0.5f), vec3(0.5f, 0.5f, 0.5f), vec3(0.5f, -0.5f, 0.5f), vec3(0.5f, -0.5f, -0.5f), vec3(-0.5f, 0.5f, -0.5f), vec3(-0.5f, -0.5f, -0.5f), vec3(-0.5f, 0.5f, 0.5f), vec3(-0.5f, -0.5f, -0.5f), vec3(-0.5f, -0.5f, 0.5f), vec3(-0.5f, 0.5f, 0.5f), vec3(-0.5f, -0.5f, 0.5f), vec3(0.5f, -0.5f, -0.5f), vec3(0.5f, -0.5f, 0.5f), vec3(-0.5f, -0.5f, 0.5f), vec3(-0.5f, -0.5f, -0.5f), vec3(0.5f, -0.5f, -0.5f), vec3(0.5f, 0.5f, -0.5f), vec3(-0.5f, -0.5f, -0.5f), vec3(-0.5f, 0.5f, -0.5f), vec3(0.5f, 0.5f, -0.5f), vec3(0.5f, -0.5f, -0.5f), vec3(-0.5f, -0.5f, -0.5f)); if (_e79 < 36u) { } else { break; } let _e374 = local_2[_e79]; - global_3 = _e374; + global_4 = _e374; let _e441 = (fma(fma(_e366.member.member_2.w, _e366.member_1.member_2.z, fma(_e366.member.member.w, _e366.member_1.member_2.x, (_e366.member.member_1.w * _e366.member_1.member_2.y))), _e374.z, fma(fma(_e366.member.member_2.w, _e366.member_1.member.z, fma(_e366.member.member.w, _e366.member_1.member.x, (_e366.member.member_1.w * _e366.member_1.member.y))), _e374.x, (fma(_e366.member.member_2.w, _e366.member_1.member_1.z, fma(_e366.member.member.w, _e366.member_1.member_1.x, (_e366.member.member_1.w * _e366.member_1.member_1.y))) * _e374.y))) + _e366.member.member_3.w); - global_4 = vec4((fma(fma(_e366.member.member_2.x, _e366.member_1.member_2.z, fma(_e366.member.member.x, _e366.member_1.member_2.x, (_e366.member.member_1.x * _e366.member_1.member_2.y))), _e374.z, fma(fma(_e366.member.member_2.x, _e366.member_1.member.z, fma(_e366.member.member.x, _e366.member_1.member.x, (_e366.member.member_1.x * _e366.member_1.member.y))), _e374.x, (fma(_e366.member.member_2.x, _e366.member_1.member_1.z, fma(_e366.member.member.x, _e366.member_1.member_1.x, (_e366.member.member_1.x * _e366.member_1.member_1.y))) * _e374.y))) + _e366.member.member_3.x), (fma(fma(_e366.member.member_2.y, _e366.member_1.member_2.z, fma(_e366.member.member.y, _e366.member_1.member_2.x, (_e366.member.member_1.y * _e366.member_1.member_2.y))), _e374.z, fma(fma(_e366.member.member_2.y, _e366.member_1.member.z, fma(_e366.member.member.y, _e366.member_1.member.x, (_e366.member.member_1.y * _e366.member_1.member.y))), _e374.x, (fma(_e366.member.member_2.y, _e366.member_1.member_1.z, fma(_e366.member.member.y, _e366.member_1.member_1.x, (_e366.member.member_1.y * _e366.member_1.member_1.y))) * _e374.y))) + _e366.member.member_3.y), _e441, _e441); + global_2 = vec4((fma(fma(_e366.member.member_2.x, _e366.member_1.member_2.z, fma(_e366.member.member.x, _e366.member_1.member_2.x, (_e366.member.member_1.x * _e366.member_1.member_2.y))), _e374.z, fma(fma(_e366.member.member_2.x, _e366.member_1.member.z, fma(_e366.member.member.x, _e366.member_1.member.x, (_e366.member.member_1.x * _e366.member_1.member.y))), _e374.x, (fma(_e366.member.member_2.x, _e366.member_1.member_1.z, fma(_e366.member.member.x, _e366.member_1.member_1.x, (_e366.member.member_1.x * _e366.member_1.member_1.y))) * _e374.y))) + _e366.member.member_3.x), (fma(fma(_e366.member.member_2.y, _e366.member_1.member_2.z, fma(_e366.member.member.y, _e366.member_1.member_2.x, (_e366.member.member_1.y * _e366.member_1.member_2.y))), _e374.z, fma(fma(_e366.member.member_2.y, _e366.member_1.member.z, fma(_e366.member.member.y, _e366.member_1.member.x, (_e366.member.member_1.y * _e366.member_1.member.y))), _e374.x, (fma(_e366.member.member_2.y, _e366.member_1.member_1.z, fma(_e366.member.member.y, _e366.member_1.member_1.x, (_e366.member.member_1.y * _e366.member_1.member_1.y))) * _e374.y))) + _e366.member.member_3.y), _e441, _e441); break; } } @@ -203,12 +203,12 @@ fn function() { @vertex fn skyboxskybox_vertex(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { - global_2 = param; + global_3 = param; global = param_1; function(); - let _e7 = global_4.y; - global_4.y = -(_e7); - let _e9 = global_3; - let _e10 = global_4; + let _e7 = global_2.y; + global_2.y = -(_e7); + let _e9 = global_4; + let _e10 = global_2; return VertexOutput(_e9, _e10); } diff --git a/crates/renderling/shaders/stage-renderlet_fragment.spv b/crates/renderling/shaders/stage-renderlet_fragment.spv index 1cd8a79d..2e3dd7e3 100644 Binary files a/crates/renderling/shaders/stage-renderlet_fragment.spv and b/crates/renderling/shaders/stage-renderlet_fragment.spv differ diff --git a/crates/renderling/shaders/stage-renderlet_fragment.wgsl b/crates/renderling/shaders/stage-renderlet_fragment.wgsl index 422eb816..cd912e7b 100644 --- a/crates/renderling/shaders/stage-renderlet_fragment.wgsl +++ b/crates/renderling/shaders/stage-renderlet_fragment.wgsl @@ -26,22 +26,13 @@ struct type_24 { member_1: u32, } -struct type_28 { +struct type_29 { member: vec3, member_1: vec4, member_2: vec3, } -struct type_30 { - member: vec2, - member_1: vec2, - member_2: type_24, - member_3: u32, - member_4: bool, - member_5: bool, -} - -struct type_32 { +struct type_31 { member: vec3, member_1: f32, member_2: vec4, @@ -61,7 +52,7 @@ struct type_32 { member_16: f32, } -struct type_33 { +struct type_32 { member: type_24, member_1: vec2, member_2: vec2, @@ -69,19 +60,19 @@ struct type_33 { member_4: u32, } -struct type_34 { +struct type_33 { member: u32, member_1: u32, member_2: u32, } -struct type_35 { +struct type_34 { member: vec3, member_1: vec4, member_2: f32, } -struct type_36 { +struct type_35 { member: vec3, member_1: vec3, member_2: f32, @@ -93,2114 +84,2096 @@ struct type_36 { @group(0) @binding(0) var global: type_11; var global_1: u32; -var global_2: u32; -var global_3: u32; -var global_4: vec4; -var global_5: vec2; -var global_6: vec2; +var global_2: vec4; +var global_3: vec2; +var global_4: vec2; +var global_5: vec3; +var global_6: vec3; var global_7: vec3; var global_8: vec3; -var global_9: vec3; -var global_10: vec3; @group(1) @binding(1) -var global_11: sampler; +var global_9: sampler; @group(1) @binding(0) -var global_12: texture_2d_array; +var global_10: texture_2d_array; @group(1) @binding(2) -var global_13: texture_cube; +var global_11: texture_cube; @group(1) @binding(3) -var global_14: sampler; +var global_12: sampler; @group(1) @binding(4) -var global_15: texture_cube; +var global_13: texture_cube; @group(1) @binding(5) -var global_16: sampler; +var global_14: sampler; @group(1) @binding(6) -var global_17: texture_2d; +var global_15: texture_2d; @group(1) @binding(7) -var global_18: sampler; -var global_19: vec4; +var global_16: sampler; +var global_17: vec4; fn function() { var local: array, 8>; var local_1: array, 6>; - var phi_3692_: bool; - var phi_500_: u32; - var phi_526_: type_30; - var phi_3743_: bool; - var phi_645_: type_32; - var phi_649_: type_32; - var phi_3776_: bool; - var phi_689_: u32; - var phi_698_: u32; - var phi_711_: type_33; - var phi_3832_: f32; - var phi_3814_: bool; - var phi_765_: f32; - var phi_760_: f32; - var phi_766_: f32; - var phi_3797_: bool; - var phi_731_: f32; - var phi_768_: f32; - var phi_3880_: f32; - var phi_3862_: bool; - var phi_823_: f32; - var phi_818_: f32; - var phi_824_: f32; - var phi_3845_: bool; - var phi_789_: f32; - var phi_826_: f32; - var phi_3912_: bool; - var phi_909_: u32; - var phi_918_: u32; - var phi_931_: type_33; - var phi_3967_: f32; - var phi_3949_: bool; - var phi_985_: f32; - var phi_980_: f32; - var phi_986_: f32; - var phi_3932_: bool; - var phi_951_: f32; - var phi_988_: f32; - var phi_4015_: f32; - var phi_3997_: bool; - var phi_1043_: f32; - var phi_1038_: f32; - var phi_1044_: f32; - var phi_3980_: bool; - var phi_1009_: f32; - var phi_1046_: f32; - var phi_4047_: bool; - var phi_1129_: u32; - var phi_1138_: u32; - var phi_1151_: type_33; - var phi_4102_: f32; - var phi_4084_: bool; - var phi_1205_: f32; - var phi_1200_: f32; - var phi_1206_: f32; - var phi_4067_: bool; - var phi_1171_: f32; - var phi_1208_: f32; - var phi_4150_: f32; - var phi_4132_: bool; - var phi_1263_: f32; - var phi_1258_: f32; - var phi_1264_: f32; - var phi_4115_: bool; - var phi_1229_: f32; - var phi_1266_: f32; - var phi_4182_: bool; - var phi_1349_: u32; - var phi_1358_: u32; - var phi_1371_: type_33; - var phi_4237_: f32; - var phi_4219_: bool; - var phi_1425_: f32; - var phi_1420_: f32; - var phi_1426_: f32; - var phi_4202_: bool; - var phi_1391_: f32; - var phi_1428_: f32; - var phi_4285_: f32; - var phi_4267_: bool; - var phi_1483_: f32; - var phi_1478_: f32; - var phi_1484_: f32; - var phi_4250_: bool; - var phi_1449_: f32; - var phi_1486_: f32; - var phi_4317_: bool; - var phi_1569_: u32; - var phi_1578_: u32; - var phi_1591_: type_33; - var phi_4372_: f32; - var phi_4354_: bool; - var phi_1645_: f32; - var phi_1640_: f32; - var phi_1646_: f32; - var phi_4337_: bool; - var phi_1611_: f32; - var phi_1648_: f32; - var phi_4420_: f32; - var phi_4402_: bool; - var phi_1703_: f32; - var phi_1698_: f32; - var phi_1704_: f32; - var phi_4385_: bool; - var phi_1669_: f32; - var phi_1706_: f32; - var phi_4474_: vec3; - var phi_4509_: vec3; - var phi_4544_: vec3; - var phi_4579_: vec3; - var phi_4614_: vec3; - var phi_1800_: vec3; - var phi_1801_: vec3; - var phi_4646_: bool; - var phi_2007_: type_24; - var phi_2008_: type_24; - var phi_2023_: type_24; - var phi_2050_: bool; - var phi_2056_: type_24; - var phi_2057_: type_24; - var phi_2072_: type_24; - var phi_2095_: bool; - var phi_2103_: type_22; - var phi_4718_: vec3; - var phi_4777_: vec3; - var phi_4851_: vec3; - var phi_5996_: vec3; - var phi_5947_: vec3; - var phi_5898_: vec3; - var phi_5849_: vec3; - var phi_5800_: vec3; - var phi_5751_: vec3; - var phi_5702_: vec3; - var phi_4901_: vec3; - var phi_4936_: vec3; + var phi_610_: u32; + var phi_3823_: bool; + var phi_764_: type_31; + var phi_768_: type_31; + var phi_3856_: bool; + var phi_808_: u32; + var phi_817_: u32; + var phi_830_: type_32; + var phi_3912_: f32; + var phi_3894_: bool; + var phi_884_: f32; + var phi_879_: f32; + var phi_885_: f32; + var phi_3877_: bool; + var phi_850_: f32; + var phi_887_: f32; + var phi_3960_: f32; + var phi_3942_: bool; + var phi_942_: f32; + var phi_937_: f32; + var phi_943_: f32; + var phi_3925_: bool; + var phi_908_: f32; + var phi_945_: f32; + var phi_3992_: bool; + var phi_1028_: u32; + var phi_1037_: u32; + var phi_1050_: type_32; + var phi_4047_: f32; + var phi_4029_: bool; + var phi_1104_: f32; + var phi_1099_: f32; + var phi_1105_: f32; + var phi_4012_: bool; + var phi_1070_: f32; + var phi_1107_: f32; + var phi_4095_: f32; + var phi_4077_: bool; + var phi_1162_: f32; + var phi_1157_: f32; + var phi_1163_: f32; + var phi_4060_: bool; + var phi_1128_: f32; + var phi_1165_: f32; + var phi_4127_: bool; + var phi_1248_: u32; + var phi_1257_: u32; + var phi_1270_: type_32; + var phi_4182_: f32; + var phi_4164_: bool; + var phi_1324_: f32; + var phi_1319_: f32; + var phi_1325_: f32; + var phi_4147_: bool; + var phi_1290_: f32; + var phi_1327_: f32; + var phi_4230_: f32; + var phi_4212_: bool; + var phi_1382_: f32; + var phi_1377_: f32; + var phi_1383_: f32; + var phi_4195_: bool; + var phi_1348_: f32; + var phi_1385_: f32; + var phi_4262_: bool; + var phi_1468_: u32; + var phi_1477_: u32; + var phi_1490_: type_32; + var phi_4317_: f32; + var phi_4299_: bool; + var phi_1544_: f32; + var phi_1539_: f32; + var phi_1545_: f32; + var phi_4282_: bool; + var phi_1510_: f32; + var phi_1547_: f32; + var phi_4365_: f32; + var phi_4347_: bool; + var phi_1602_: f32; + var phi_1597_: f32; + var phi_1603_: f32; + var phi_4330_: bool; + var phi_1568_: f32; + var phi_1605_: f32; + var phi_4397_: bool; + var phi_1688_: u32; + var phi_1697_: u32; + var phi_1710_: type_32; + var phi_4452_: f32; + var phi_4434_: bool; + var phi_1764_: f32; + var phi_1759_: f32; + var phi_1765_: f32; + var phi_4417_: bool; + var phi_1730_: f32; + var phi_1767_: f32; + var phi_4500_: f32; + var phi_4482_: bool; + var phi_1822_: f32; + var phi_1817_: f32; + var phi_1823_: f32; + var phi_4465_: bool; + var phi_1788_: f32; + var phi_1825_: f32; + var phi_4554_: vec3; + var phi_4589_: vec3; + var phi_4624_: vec3; + var phi_4659_: vec3; + var phi_4694_: vec3; + var phi_1919_: vec3; + var phi_1920_: vec3; + var phi_4726_: bool; + var phi_2127_: type_24; + var phi_2128_: type_24; var phi_2143_: type_24; - var phi_2146_: vec3; - var phi_2144_: type_24; - var phi_2161_: type_24; - var phi_4953_: u32; - var phi_4972_: bool; - var phi_2178_: u32; - var phi_5004_: bool; - var phi_2195_: u32; - var phi_2205_: type_34; - var phi_5034_: bool; - var phi_2255_: type_28; - var phi_5463_: bool; - var phi_2753_: type_36; - var phi_5513_: vec3; - var phi_5548_: vec3; - var phi_5583_: vec3; - var phi_2999_: vec3; - var phi_5290_: bool; - var phi_2505_: type_35; - var phi_5336_: vec3; - var phi_5371_: vec3; - var phi_2690_: vec3; - var phi_5115_: bool; - var phi_2303_: type_35; - var phi_5163_: vec3; - var phi_5198_: vec3; - var phi_3001_: vec3; - var phi_3002_: bool; - var phi_3011_: vec3; - var phi_2147_: vec3; - var phi_3013_: bool; + var phi_2170_: bool; + var phi_2176_: type_24; + var phi_2177_: type_24; + var phi_2192_: type_24; + var phi_2215_: bool; + var phi_2223_: type_22; + var phi_4798_: vec3; + var phi_4857_: vec3; + var phi_4931_: vec3; + var phi_6075_: vec3; + var phi_6026_: vec3; + var phi_5977_: vec3; + var phi_5928_: vec3; + var phi_5879_: vec3; + var phi_5830_: vec3; + var phi_5781_: vec3; + var phi_4981_: vec3; + var phi_5016_: vec3; + var phi_2263_: type_24; + var phi_2266_: vec3; + var phi_2264_: type_24; + var phi_2281_: type_24; + var phi_5033_: u32; + var phi_5052_: bool; + var phi_2298_: u32; + var phi_5084_: bool; + var phi_2315_: u32; + var phi_2325_: type_33; + var phi_5114_: bool; + var phi_2375_: type_29; + var phi_5542_: bool; + var phi_2875_: type_35; + var phi_5592_: vec3; + var phi_5627_: vec3; + var phi_5662_: vec3; + var phi_3122_: vec3; + var phi_5369_: bool; + var phi_2626_: type_34; + var phi_5415_: vec3; + var phi_5450_: vec3; + var phi_2812_: vec3; + var phi_5194_: bool; + var phi_2423_: type_34; + var phi_5242_: vec3; + var phi_5277_: vec3; + var phi_3124_: vec3; + var phi_3125_: bool; + var phi_3134_: vec3; + var phi_2267_: vec3; + var phi_3136_: bool; var local_2: vec3; var local_3: vec3; var local_4: vec3; - var phi_3125_: vec4; + var phi_3249_: vec4; - let _e117 = arrayLength((&global.member)); - let _e118 = global_1; - let _e119 = global_2; - let _e120 = global_3; - let _e121 = global_4; - let _e122 = global_5; - let _e123 = global_6; - let _e124 = global_7; - let _e125 = global_8; - let _e126 = global_9; - let _e127 = global_10; - if (_e117 >= 9u) { - phi_3692_ = (_e120 <= (_e117 - 9u)); - } else { - phi_3692_ = false; - } - let _e132 = phi_3692_; - if _e132 { - let _e135 = global.member[_e120]; - let _e139 = global.member[(_e120 + 1u)]; - let _e144 = global.member[(_e120 + 2u)]; - let _e148 = global.member[(_e120 + 3u)]; - let _e153 = global.member[(_e120 + 4u)]; - switch bitcast(_e153) { - case 0: { - phi_500_ = 0u; - break; - } - case 1: { - phi_500_ = 1u; - break; - } - case 2: { - phi_500_ = 2u; - break; - } - case 3: { - phi_500_ = 3u; - break; - } - case 4: { - phi_500_ = 4u; - break; - } - case 5: { - phi_500_ = 5u; - break; - } - case 6: { - phi_500_ = 6u; - break; - } - case 7: { - phi_500_ = 7u; - break; - } - case 8: { - phi_500_ = 8u; - break; - } - case 9: { - phi_500_ = 9u; - break; - } - case 10: { - phi_500_ = 10u; - break; - } - case 11: { - phi_500_ = 11u; - break; - } - case 12: { - phi_500_ = 12u; - break; - } - case 13: { - phi_500_ = 13u; - break; - } - case 14: { - phi_500_ = 14u; - break; - } - case 15: { - phi_500_ = 15u; - break; - } - case 16: { - phi_500_ = 16u; - break; - } - case 17: { - phi_500_ = 17u; - break; - } - case 18: { - phi_500_ = 18u; - break; - } - case 19: { - phi_500_ = 19u; - break; - } - default: { - phi_500_ = 0u; - break; - } + let _e110 = arrayLength((&global.member)); + let _e111 = global_1; + let _e112 = global_2; + let _e113 = global_3; + let _e114 = global_4; + let _e115 = global_5; + let _e116 = global_6; + let _e117 = global_7; + let _e118 = global_8; + let _e122 = global.member[(_e111 + 9u)]; + let _e126 = global.member[(_e111 + 11u)]; + let _e130 = global.member[(_e111 + 17u)]; + let _e133 = global.member[_e130]; + let _e137 = global.member[(_e130 + 1u)]; + let _e141 = global.member[(_e130 + 4u)]; + switch bitcast(_e141) { + case 0: { + phi_610_ = 0u; + break; + } + case 1: { + phi_610_ = 1u; + break; + } + case 2: { + phi_610_ = 2u; + break; + } + case 3: { + phi_610_ = 3u; + break; + } + case 4: { + phi_610_ = 4u; + break; + } + case 5: { + phi_610_ = 5u; + break; + } + case 6: { + phi_610_ = 6u; + break; + } + case 7: { + phi_610_ = 7u; + break; + } + case 8: { + phi_610_ = 8u; + break; + } + case 9: { + phi_610_ = 9u; + break; + } + case 10: { + phi_610_ = 10u; + break; + } + case 11: { + phi_610_ = 11u; + break; + } + case 12: { + phi_610_ = 12u; + break; + } + case 13: { + phi_610_ = 13u; + break; + } + case 14: { + phi_610_ = 14u; + break; + } + case 15: { + phi_610_ = 15u; + break; + } + case 16: { + phi_610_ = 16u; + break; + } + case 17: { + phi_610_ = 17u; + break; + } + case 18: { + phi_610_ = 18u; + break; + } + case 19: { + phi_610_ = 19u; + break; + } + default: { + phi_610_ = 0u; + break; } - let _e156 = phi_500_; - let _e160 = global.member[(_e120 + 5u)]; - let _e165 = global.member[(_e120 + 6u)]; - let _e170 = global.member[(_e120 + 7u)]; - let _e174 = global.member[(_e120 + 8u)]; - phi_526_ = type_30(vec2(_e135, _e139), vec2(_e144, _e148), type_24(_e170, _e174), _e156, (_e160 == 1u), (_e165 == 1u)); - } else { - phi_526_ = type_30(vec2(0u, 0u), vec2(1u, 1u), type_24(4294967295u, 0u), 0u, true, true); } - let _e178 = phi_526_; - if (_e119 == 4294967295u) { - phi_649_ = type_32(vec3(0f, 0f, 0f), 1f, vec4(1f, 1f, 1f, 1f), 1f, 1f, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 0u, 0u, 0u, 0u, 0u, false, 0f); + let _e144 = phi_610_; + let _e148 = global.member[(_e130 + 5u)]; + let _e153 = global.member[(_e130 + 9u)]; + let _e157 = global.member[(_e130 + 10u)]; + if (_e126 == 4294967295u) { + phi_768_ = type_31(vec3(0f, 0f, 0f), 1f, vec4(1f, 1f, 1f, 1f), 1f, 1f, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 0u, 0u, 0u, 0u, 0u, false, 0f); } else { - if (_e117 >= 22u) { - phi_3743_ = (_e119 <= (_e117 - 22u)); + if (_e110 >= 22u) { + phi_3823_ = (_e126 <= (_e110 - 22u)); } else { - phi_3743_ = false; - } - let _e191 = phi_3743_; - if _e191 { - let _e194 = global.member[_e119]; - let _e199 = global.member[(_e119 + 1u)]; - let _e204 = global.member[(_e119 + 2u)]; - let _e210 = global.member[(_e119 + 3u)]; - let _e215 = global.member[(_e119 + 4u)]; - let _e220 = global.member[(_e119 + 5u)]; - let _e225 = global.member[(_e119 + 6u)]; - let _e230 = global.member[(_e119 + 7u)]; - let _e236 = global.member[(_e119 + 8u)]; - let _e241 = global.member[(_e119 + 9u)]; - let _e246 = global.member[(_e119 + 10u)]; - let _e250 = global.member[(_e119 + 11u)]; - let _e254 = global.member[(_e119 + 12u)]; - let _e258 = global.member[(_e119 + 13u)]; - let _e262 = global.member[(_e119 + 14u)]; - let _e266 = global.member[(_e119 + 15u)]; - let _e270 = global.member[(_e119 + 16u)]; - let _e274 = global.member[(_e119 + 17u)]; - let _e278 = global.member[(_e119 + 18u)]; - let _e282 = global.member[(_e119 + 19u)]; - let _e286 = global.member[(_e119 + 20u)]; - let _e291 = global.member[(_e119 + 21u)]; - phi_645_ = type_32(vec3(bitcast(_e194), bitcast(_e199), bitcast(_e204)), bitcast(_e210), vec4(bitcast(_e215), bitcast(_e220), bitcast(_e225), bitcast(_e230)), bitcast(_e236), bitcast(_e241), _e246, _e250, _e254, _e258, _e262, _e266, _e270, _e274, _e278, _e282, (_e286 == 1u), bitcast(_e291)); + phi_3823_ = false; + } + let _e163 = phi_3823_; + if _e163 { + let _e166 = global.member[_e126]; + let _e171 = global.member[(_e126 + 1u)]; + let _e176 = global.member[(_e126 + 2u)]; + let _e182 = global.member[(_e126 + 3u)]; + let _e187 = global.member[(_e126 + 4u)]; + let _e192 = global.member[(_e126 + 5u)]; + let _e197 = global.member[(_e126 + 6u)]; + let _e202 = global.member[(_e126 + 7u)]; + let _e208 = global.member[(_e126 + 8u)]; + let _e213 = global.member[(_e126 + 9u)]; + let _e218 = global.member[(_e126 + 10u)]; + let _e222 = global.member[(_e126 + 11u)]; + let _e226 = global.member[(_e126 + 12u)]; + let _e230 = global.member[(_e126 + 13u)]; + let _e234 = global.member[(_e126 + 14u)]; + let _e238 = global.member[(_e126 + 15u)]; + let _e242 = global.member[(_e126 + 16u)]; + let _e246 = global.member[(_e126 + 17u)]; + let _e250 = global.member[(_e126 + 18u)]; + let _e254 = global.member[(_e126 + 19u)]; + let _e258 = global.member[(_e126 + 20u)]; + let _e263 = global.member[(_e126 + 21u)]; + phi_764_ = type_31(vec3(bitcast(_e166), bitcast(_e171), bitcast(_e176)), bitcast(_e182), vec4(bitcast(_e187), bitcast(_e192), bitcast(_e197), bitcast(_e202)), bitcast(_e208), bitcast(_e213), _e218, _e222, _e226, _e230, _e234, _e238, _e242, _e246, _e250, _e254, (_e258 == 1u), bitcast(_e263)); } else { - phi_645_ = type_32(vec3(0f, 0f, 0f), 1f, vec4(1f, 1f, 1f, 1f), 1f, 1f, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 0u, 0u, 0u, 0u, 0u, true, 0f); + phi_764_ = type_31(vec3(0f, 0f, 0f), 1f, vec4(1f, 1f, 1f, 1f), 1f, 1f, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 4294967295u, 0u, 0u, 0u, 0u, 0u, true, 0f); } - let _e295 = phi_645_; - phi_649_ = type_32(_e295.member, _e295.member_1, _e295.member_2, _e295.member_3, _e295.member_4, _e295.member_5, _e295.member_6, _e295.member_7, _e295.member_8, _e295.member_9, _e295.member_10, _e295.member_11, _e295.member_12, _e295.member_13, _e295.member_14, (_e295.member_15 && _e178.member_4), _e295.member_16); + let _e267 = phi_764_; + phi_768_ = type_31(_e267.member, _e267.member_1, _e267.member_2, _e267.member_3, _e267.member_4, _e267.member_5, _e267.member_6, _e267.member_7, _e267.member_8, _e267.member_9, _e267.member_10, _e267.member_11, _e267.member_12, _e267.member_13, _e267.member_14, (_e267.member_15 && (_e148 == 1u)), _e267.member_16); } - let _e317 = phi_649_; - let _e321 = select(_e123, _e122, vec2((_e317.member_10 == 0u))); - let _e323 = (_e117 >= 8u); - if _e323 { - phi_3776_ = (_e317.member_5 <= (_e117 - 8u)); + let _e289 = phi_768_; + let _e293 = select(_e114, _e113, vec2((_e289.member_10 == 0u))); + let _e295 = (_e110 >= 8u); + if _e295 { + phi_3856_ = (_e289.member_5 <= (_e110 - 8u)); } else { - phi_3776_ = false; + phi_3856_ = false; } - let _e327 = phi_3776_; - if _e327 { - let _e330 = global.member[_e317.member_5]; - let _e334 = global.member[(_e317.member_5 + 1u)]; - let _e339 = global.member[(_e317.member_5 + 2u)]; - let _e343 = global.member[(_e317.member_5 + 3u)]; - let _e348 = global.member[(_e317.member_5 + 4u)]; - let _e352 = global.member[(_e317.member_5 + 5u)]; - let _e356 = global.member[(_e317.member_5 + 6u)]; - switch bitcast(_e356) { + let _e299 = phi_3856_; + if _e299 { + let _e302 = global.member[_e289.member_5]; + let _e306 = global.member[(_e289.member_5 + 1u)]; + let _e311 = global.member[(_e289.member_5 + 2u)]; + let _e315 = global.member[(_e289.member_5 + 3u)]; + let _e320 = global.member[(_e289.member_5 + 4u)]; + let _e324 = global.member[(_e289.member_5 + 5u)]; + let _e328 = global.member[(_e289.member_5 + 6u)]; + switch bitcast(_e328) { case 0: { - phi_689_ = 0u; + phi_808_ = 0u; break; } case 1: { - phi_689_ = 1u; + phi_808_ = 1u; break; } case 2: { - phi_689_ = 2u; + phi_808_ = 2u; break; } default: { - phi_689_ = 0u; + phi_808_ = 0u; break; } } - let _e359 = phi_689_; - let _e363 = global.member[(_e317.member_5 + 7u)]; - switch bitcast(_e363) { + let _e331 = phi_808_; + let _e335 = global.member[(_e289.member_5 + 7u)]; + switch bitcast(_e335) { case 0: { - phi_698_ = 0u; + phi_817_ = 0u; break; } case 1: { - phi_698_ = 1u; + phi_817_ = 1u; break; } case 2: { - phi_698_ = 2u; + phi_817_ = 2u; break; } default: { - phi_698_ = 0u; + phi_817_ = 0u; break; } } - let _e366 = phi_698_; - phi_711_ = type_33(type_24(_e359, _e366), vec2(_e330, _e334), vec2(_e339, _e343), _e348, _e352); + let _e338 = phi_817_; + phi_830_ = type_32(type_24(_e331, _e338), vec2(_e302, _e306), vec2(_e311, _e315), _e320, _e324); } else { - phi_711_ = type_33(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); + phi_830_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e370 = phi_711_; - switch bitcast(_e370.member.member) { + let _e342 = phi_830_; + switch bitcast(_e342.member.member) { case 1: { - let _e408 = abs(_e321.x); - let _e410 = (_e408 % 1f); - if (_e408 >= 1f) { - phi_3797_ = select(true, false, (_e410 == 0f)); + let _e380 = abs(_e293.x); + let _e382 = (_e380 % 1f); + if (_e380 >= 1f) { + phi_3877_ = select(true, false, (_e382 == 0f)); } else { - phi_3797_ = true; + phi_3877_ = true; } - let _e414 = phi_3797_; - let _e415 = select(1f, _e410, _e414); - if (select(-1f, 1f, (_e321.x >= 0f)) > 0f) { - phi_731_ = _e415; + let _e386 = phi_3877_; + let _e387 = select(1f, _e382, _e386); + if (select(-1f, 1f, (_e293.x >= 0f)) > 0f) { + phi_850_ = _e387; } else { - phi_731_ = (1f - _e415); + phi_850_ = (1f - _e387); } - let _e419 = phi_731_; - phi_768_ = _e419; + let _e391 = phi_850_; + phi_887_ = _e391; break; } case 2: { - let _e382 = abs(_e321.x); - let _e389 = ((select(select(u32(_e382), 0u, (_e382 < 0f)), 4294967295u, (_e382 > 4294967000f)) % 2u) == 0u); - let _e391 = (_e382 % 1f); - if (_e382 >= 1f) { - phi_3814_ = select(true, false, (_e391 == 0f)); + let _e354 = abs(_e293.x); + let _e361 = ((select(select(u32(_e354), 0u, (_e354 < 0f)), 4294967295u, (_e354 > 4294967000f)) % 2u) == 0u); + let _e363 = (_e354 % 1f); + if (_e354 >= 1f) { + phi_3894_ = select(true, false, (_e363 == 0f)); } else { - phi_3814_ = true; + phi_3894_ = true; } - let _e395 = phi_3814_; - let _e396 = select(1f, _e391, _e395); - if (select(-1f, 1f, (_e321.x >= 0f)) > 0f) { - if _e389 { - phi_760_ = _e396; + let _e367 = phi_3894_; + let _e368 = select(1f, _e363, _e367); + if (select(-1f, 1f, (_e293.x >= 0f)) > 0f) { + if _e361 { + phi_879_ = _e368; } else { - phi_760_ = (1f - _e396); + phi_879_ = (1f - _e368); } - let _e403 = phi_760_; - phi_766_ = _e403; + let _e375 = phi_879_; + phi_885_ = _e375; } else { - if _e389 { - phi_765_ = (1f - _e396); + if _e361 { + phi_884_ = (1f - _e368); } else { - phi_765_ = _e396; + phi_884_ = _e368; } - let _e400 = phi_765_; - phi_766_ = _e400; + let _e372 = phi_884_; + phi_885_ = _e372; } - let _e405 = phi_766_; - phi_768_ = _e405; + let _e377 = phi_885_; + phi_887_ = _e377; break; } case 0: { - if (_e321.x > 1f) { - phi_3832_ = 0.9999999f; + if (_e293.x > 1f) { + phi_3912_ = 0.9999999f; } else { - phi_3832_ = select(_e321.x, 0.00000011920929f, (_e321.x < 0f)); + phi_3912_ = select(_e293.x, 0.00000011920929f, (_e293.x < 0f)); } - let _e379 = phi_3832_; - phi_768_ = _e379; + let _e351 = phi_3912_; + phi_887_ = _e351; break; } default: { - phi_768_ = f32(); + phi_887_ = f32(); break; } } - let _e421 = phi_768_; - switch bitcast(_e370.member.member_1) { + let _e393 = phi_887_; + switch bitcast(_e342.member.member_1) { case 1: { - let _e459 = abs(_e321.y); - let _e461 = (_e459 % 1f); - if (_e459 >= 1f) { - phi_3845_ = select(true, false, (_e461 == 0f)); + let _e431 = abs(_e293.y); + let _e433 = (_e431 % 1f); + if (_e431 >= 1f) { + phi_3925_ = select(true, false, (_e433 == 0f)); } else { - phi_3845_ = true; + phi_3925_ = true; } - let _e465 = phi_3845_; - let _e466 = select(1f, _e461, _e465); - if (select(-1f, 1f, (_e321.y >= 0f)) > 0f) { - phi_789_ = _e466; + let _e437 = phi_3925_; + let _e438 = select(1f, _e433, _e437); + if (select(-1f, 1f, (_e293.y >= 0f)) > 0f) { + phi_908_ = _e438; } else { - phi_789_ = (1f - _e466); + phi_908_ = (1f - _e438); } - let _e470 = phi_789_; - phi_826_ = _e470; + let _e442 = phi_908_; + phi_945_ = _e442; break; } case 2: { - let _e433 = abs(_e321.y); - let _e440 = ((select(select(u32(_e433), 0u, (_e433 < 0f)), 4294967295u, (_e433 > 4294967000f)) % 2u) == 0u); - let _e442 = (_e433 % 1f); - if (_e433 >= 1f) { - phi_3862_ = select(true, false, (_e442 == 0f)); + let _e405 = abs(_e293.y); + let _e412 = ((select(select(u32(_e405), 0u, (_e405 < 0f)), 4294967295u, (_e405 > 4294967000f)) % 2u) == 0u); + let _e414 = (_e405 % 1f); + if (_e405 >= 1f) { + phi_3942_ = select(true, false, (_e414 == 0f)); } else { - phi_3862_ = true; + phi_3942_ = true; } - let _e446 = phi_3862_; - let _e447 = select(1f, _e442, _e446); - if (select(-1f, 1f, (_e321.y >= 0f)) > 0f) { - if _e440 { - phi_818_ = _e447; + let _e418 = phi_3942_; + let _e419 = select(1f, _e414, _e418); + if (select(-1f, 1f, (_e293.y >= 0f)) > 0f) { + if _e412 { + phi_937_ = _e419; } else { - phi_818_ = (1f - _e447); + phi_937_ = (1f - _e419); } - let _e454 = phi_818_; - phi_824_ = _e454; + let _e426 = phi_937_; + phi_943_ = _e426; } else { - if _e440 { - phi_823_ = (1f - _e447); + if _e412 { + phi_942_ = (1f - _e419); } else { - phi_823_ = _e447; + phi_942_ = _e419; } - let _e451 = phi_823_; - phi_824_ = _e451; + let _e423 = phi_942_; + phi_943_ = _e423; } - let _e456 = phi_824_; - phi_826_ = _e456; + let _e428 = phi_943_; + phi_945_ = _e428; break; } case 0: { - if (_e321.y > 1f) { - phi_3880_ = 0.9999999f; + if (_e293.y > 1f) { + phi_3960_ = 0.9999999f; } else { - phi_3880_ = select(_e321.y, 0.00000011920929f, (_e321.y < 0f)); + phi_3960_ = select(_e293.y, 0.00000011920929f, (_e293.y < 0f)); } - let _e430 = phi_3880_; - phi_826_ = _e430; + let _e402 = phi_3960_; + phi_945_ = _e402; break; } default: { - phi_826_ = f32(); + phi_945_ = f32(); break; } } - let _e472 = phi_826_; - let _e476 = (_e421 * f32(_e370.member_2.x)); - let _e485 = (_e472 * f32(_e370.member_2.y)); - let _e498 = f32(_e178.member.x); - let _e500 = f32(_e178.member.y); - let _e507 = vec3((f32((select(select(u32(_e476), 0u, (_e476 < 0f)), 4294967295u, (_e476 > 4294967000f)) + _e370.member_1.x)) / _e498), (f32((select(select(u32(_e485), 0u, (_e485 < 0f)), 4294967295u, (_e485 > 4294967000f)) + _e370.member_1.y)) / _e500), f32(_e370.member_3)); - let _e513 = textureSampleLevel(global_12, global_11, vec2(_e507.x, _e507.y), i32(_e507.z), 0f); - let _e516 = select(_e513, vec4(1f, 1f, 1f, 1f), vec4((_e317.member_5 == 4294967295u))); - let _e520 = select(_e123, _e122, vec2((_e317.member_11 == 0u))); - if _e323 { - phi_3912_ = (_e317.member_6 <= (_e117 - 8u)); + let _e444 = phi_945_; + let _e448 = (_e393 * f32(_e342.member_2.x)); + let _e457 = (_e444 * f32(_e342.member_2.y)); + let _e469 = f32(_e133); + let _e470 = f32(_e137); + let _e477 = vec3((f32((select(select(u32(_e448), 0u, (_e448 < 0f)), 4294967295u, (_e448 > 4294967000f)) + _e342.member_1.x)) / _e469), (f32((select(select(u32(_e457), 0u, (_e457 < 0f)), 4294967295u, (_e457 > 4294967000f)) + _e342.member_1.y)) / _e470), f32(_e342.member_3)); + let _e483 = textureSampleLevel(global_10, global_9, vec2(_e477.x, _e477.y), i32(_e477.z), 0f); + let _e486 = select(_e483, vec4(1f, 1f, 1f, 1f), vec4((_e289.member_5 == 4294967295u))); + let _e490 = select(_e114, _e113, vec2((_e289.member_11 == 0u))); + if _e295 { + phi_3992_ = (_e289.member_6 <= (_e110 - 8u)); } else { - phi_3912_ = false; + phi_3992_ = false; } - let _e525 = phi_3912_; - if _e525 { - let _e528 = global.member[_e317.member_6]; - let _e532 = global.member[(_e317.member_6 + 1u)]; - let _e537 = global.member[(_e317.member_6 + 2u)]; - let _e541 = global.member[(_e317.member_6 + 3u)]; - let _e546 = global.member[(_e317.member_6 + 4u)]; - let _e550 = global.member[(_e317.member_6 + 5u)]; - let _e554 = global.member[(_e317.member_6 + 6u)]; - switch bitcast(_e554) { + let _e495 = phi_3992_; + if _e495 { + let _e498 = global.member[_e289.member_6]; + let _e502 = global.member[(_e289.member_6 + 1u)]; + let _e507 = global.member[(_e289.member_6 + 2u)]; + let _e511 = global.member[(_e289.member_6 + 3u)]; + let _e516 = global.member[(_e289.member_6 + 4u)]; + let _e520 = global.member[(_e289.member_6 + 5u)]; + let _e524 = global.member[(_e289.member_6 + 6u)]; + switch bitcast(_e524) { case 0: { - phi_909_ = 0u; + phi_1028_ = 0u; break; } case 1: { - phi_909_ = 1u; + phi_1028_ = 1u; break; } case 2: { - phi_909_ = 2u; + phi_1028_ = 2u; break; } default: { - phi_909_ = 0u; + phi_1028_ = 0u; break; } } - let _e557 = phi_909_; - let _e561 = global.member[(_e317.member_6 + 7u)]; - switch bitcast(_e561) { + let _e527 = phi_1028_; + let _e531 = global.member[(_e289.member_6 + 7u)]; + switch bitcast(_e531) { case 0: { - phi_918_ = 0u; + phi_1037_ = 0u; break; } case 1: { - phi_918_ = 1u; + phi_1037_ = 1u; break; } case 2: { - phi_918_ = 2u; + phi_1037_ = 2u; break; } default: { - phi_918_ = 0u; + phi_1037_ = 0u; break; } } - let _e564 = phi_918_; - phi_931_ = type_33(type_24(_e557, _e564), vec2(_e528, _e532), vec2(_e537, _e541), _e546, _e550); + let _e534 = phi_1037_; + phi_1050_ = type_32(type_24(_e527, _e534), vec2(_e498, _e502), vec2(_e507, _e511), _e516, _e520); } else { - phi_931_ = type_33(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); + phi_1050_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e568 = phi_931_; - switch bitcast(_e568.member.member) { + let _e538 = phi_1050_; + switch bitcast(_e538.member.member) { case 1: { - let _e606 = abs(_e520.x); - let _e608 = (_e606 % 1f); - if (_e606 >= 1f) { - phi_3932_ = select(true, false, (_e608 == 0f)); + let _e576 = abs(_e490.x); + let _e578 = (_e576 % 1f); + if (_e576 >= 1f) { + phi_4012_ = select(true, false, (_e578 == 0f)); } else { - phi_3932_ = true; + phi_4012_ = true; } - let _e612 = phi_3932_; - let _e613 = select(1f, _e608, _e612); - if (select(-1f, 1f, (_e520.x >= 0f)) > 0f) { - phi_951_ = _e613; + let _e582 = phi_4012_; + let _e583 = select(1f, _e578, _e582); + if (select(-1f, 1f, (_e490.x >= 0f)) > 0f) { + phi_1070_ = _e583; } else { - phi_951_ = (1f - _e613); + phi_1070_ = (1f - _e583); } - let _e617 = phi_951_; - phi_988_ = _e617; + let _e587 = phi_1070_; + phi_1107_ = _e587; break; } case 2: { - let _e580 = abs(_e520.x); - let _e587 = ((select(select(u32(_e580), 0u, (_e580 < 0f)), 4294967295u, (_e580 > 4294967000f)) % 2u) == 0u); - let _e589 = (_e580 % 1f); - if (_e580 >= 1f) { - phi_3949_ = select(true, false, (_e589 == 0f)); + let _e550 = abs(_e490.x); + let _e557 = ((select(select(u32(_e550), 0u, (_e550 < 0f)), 4294967295u, (_e550 > 4294967000f)) % 2u) == 0u); + let _e559 = (_e550 % 1f); + if (_e550 >= 1f) { + phi_4029_ = select(true, false, (_e559 == 0f)); } else { - phi_3949_ = true; + phi_4029_ = true; } - let _e593 = phi_3949_; - let _e594 = select(1f, _e589, _e593); - if (select(-1f, 1f, (_e520.x >= 0f)) > 0f) { - if _e587 { - phi_980_ = _e594; + let _e563 = phi_4029_; + let _e564 = select(1f, _e559, _e563); + if (select(-1f, 1f, (_e490.x >= 0f)) > 0f) { + if _e557 { + phi_1099_ = _e564; } else { - phi_980_ = (1f - _e594); + phi_1099_ = (1f - _e564); } - let _e601 = phi_980_; - phi_986_ = _e601; + let _e571 = phi_1099_; + phi_1105_ = _e571; } else { - if _e587 { - phi_985_ = (1f - _e594); + if _e557 { + phi_1104_ = (1f - _e564); } else { - phi_985_ = _e594; + phi_1104_ = _e564; } - let _e598 = phi_985_; - phi_986_ = _e598; + let _e568 = phi_1104_; + phi_1105_ = _e568; } - let _e603 = phi_986_; - phi_988_ = _e603; + let _e573 = phi_1105_; + phi_1107_ = _e573; break; } case 0: { - if (_e520.x > 1f) { - phi_3967_ = 0.9999999f; + if (_e490.x > 1f) { + phi_4047_ = 0.9999999f; } else { - phi_3967_ = select(_e520.x, 0.00000011920929f, (_e520.x < 0f)); + phi_4047_ = select(_e490.x, 0.00000011920929f, (_e490.x < 0f)); } - let _e577 = phi_3967_; - phi_988_ = _e577; + let _e547 = phi_4047_; + phi_1107_ = _e547; break; } default: { - phi_988_ = f32(); + phi_1107_ = f32(); break; } } - let _e619 = phi_988_; - switch bitcast(_e568.member.member_1) { + let _e589 = phi_1107_; + switch bitcast(_e538.member.member_1) { case 1: { - let _e657 = abs(_e520.y); - let _e659 = (_e657 % 1f); - if (_e657 >= 1f) { - phi_3980_ = select(true, false, (_e659 == 0f)); + let _e627 = abs(_e490.y); + let _e629 = (_e627 % 1f); + if (_e627 >= 1f) { + phi_4060_ = select(true, false, (_e629 == 0f)); } else { - phi_3980_ = true; + phi_4060_ = true; } - let _e663 = phi_3980_; - let _e664 = select(1f, _e659, _e663); - if (select(-1f, 1f, (_e520.y >= 0f)) > 0f) { - phi_1009_ = _e664; + let _e633 = phi_4060_; + let _e634 = select(1f, _e629, _e633); + if (select(-1f, 1f, (_e490.y >= 0f)) > 0f) { + phi_1128_ = _e634; } else { - phi_1009_ = (1f - _e664); + phi_1128_ = (1f - _e634); } - let _e668 = phi_1009_; - phi_1046_ = _e668; + let _e638 = phi_1128_; + phi_1165_ = _e638; break; } case 2: { - let _e631 = abs(_e520.y); - let _e638 = ((select(select(u32(_e631), 0u, (_e631 < 0f)), 4294967295u, (_e631 > 4294967000f)) % 2u) == 0u); - let _e640 = (_e631 % 1f); - if (_e631 >= 1f) { - phi_3997_ = select(true, false, (_e640 == 0f)); + let _e601 = abs(_e490.y); + let _e608 = ((select(select(u32(_e601), 0u, (_e601 < 0f)), 4294967295u, (_e601 > 4294967000f)) % 2u) == 0u); + let _e610 = (_e601 % 1f); + if (_e601 >= 1f) { + phi_4077_ = select(true, false, (_e610 == 0f)); } else { - phi_3997_ = true; + phi_4077_ = true; } - let _e644 = phi_3997_; - let _e645 = select(1f, _e640, _e644); - if (select(-1f, 1f, (_e520.y >= 0f)) > 0f) { - if _e638 { - phi_1038_ = _e645; + let _e614 = phi_4077_; + let _e615 = select(1f, _e610, _e614); + if (select(-1f, 1f, (_e490.y >= 0f)) > 0f) { + if _e608 { + phi_1157_ = _e615; } else { - phi_1038_ = (1f - _e645); + phi_1157_ = (1f - _e615); } - let _e652 = phi_1038_; - phi_1044_ = _e652; + let _e622 = phi_1157_; + phi_1163_ = _e622; } else { - if _e638 { - phi_1043_ = (1f - _e645); + if _e608 { + phi_1162_ = (1f - _e615); } else { - phi_1043_ = _e645; + phi_1162_ = _e615; } - let _e649 = phi_1043_; - phi_1044_ = _e649; + let _e619 = phi_1162_; + phi_1163_ = _e619; } - let _e654 = phi_1044_; - phi_1046_ = _e654; + let _e624 = phi_1163_; + phi_1165_ = _e624; break; } case 0: { - if (_e520.y > 1f) { - phi_4015_ = 0.9999999f; + if (_e490.y > 1f) { + phi_4095_ = 0.9999999f; } else { - phi_4015_ = select(_e520.y, 0.00000011920929f, (_e520.y < 0f)); + phi_4095_ = select(_e490.y, 0.00000011920929f, (_e490.y < 0f)); } - let _e628 = phi_4015_; - phi_1046_ = _e628; + let _e598 = phi_4095_; + phi_1165_ = _e598; break; } default: { - phi_1046_ = f32(); + phi_1165_ = f32(); break; } } - let _e670 = phi_1046_; - let _e674 = (_e619 * f32(_e568.member_2.x)); - let _e683 = (_e670 * f32(_e568.member_2.y)); - let _e701 = vec3((f32((select(select(u32(_e674), 0u, (_e674 < 0f)), 4294967295u, (_e674 > 4294967000f)) + _e568.member_1.x)) / _e498), (f32((select(select(u32(_e683), 0u, (_e683 < 0f)), 4294967295u, (_e683 > 4294967000f)) + _e568.member_1.y)) / _e500), f32(_e568.member_3)); - let _e707 = textureSampleLevel(global_12, global_11, vec2(_e701.x, _e701.y), i32(_e701.z), 0f); - let _e710 = select(_e707, vec4(1f, 1f, 1f, 1f), vec4((_e317.member_6 == 4294967295u))); - let _e714 = select(_e123, _e122, vec2((_e317.member_12 == 0u))); - if _e323 { - phi_4047_ = (_e317.member_7 <= (_e117 - 8u)); + let _e640 = phi_1165_; + let _e644 = (_e589 * f32(_e538.member_2.x)); + let _e653 = (_e640 * f32(_e538.member_2.y)); + let _e671 = vec3((f32((select(select(u32(_e644), 0u, (_e644 < 0f)), 4294967295u, (_e644 > 4294967000f)) + _e538.member_1.x)) / _e469), (f32((select(select(u32(_e653), 0u, (_e653 < 0f)), 4294967295u, (_e653 > 4294967000f)) + _e538.member_1.y)) / _e470), f32(_e538.member_3)); + let _e677 = textureSampleLevel(global_10, global_9, vec2(_e671.x, _e671.y), i32(_e671.z), 0f); + let _e680 = select(_e677, vec4(1f, 1f, 1f, 1f), vec4((_e289.member_6 == 4294967295u))); + let _e684 = select(_e114, _e113, vec2((_e289.member_12 == 0u))); + if _e295 { + phi_4127_ = (_e289.member_7 <= (_e110 - 8u)); } else { - phi_4047_ = false; + phi_4127_ = false; } - let _e719 = phi_4047_; - if _e719 { - let _e722 = global.member[_e317.member_7]; - let _e726 = global.member[(_e317.member_7 + 1u)]; - let _e731 = global.member[(_e317.member_7 + 2u)]; - let _e735 = global.member[(_e317.member_7 + 3u)]; - let _e740 = global.member[(_e317.member_7 + 4u)]; - let _e744 = global.member[(_e317.member_7 + 5u)]; - let _e748 = global.member[(_e317.member_7 + 6u)]; - switch bitcast(_e748) { + let _e689 = phi_4127_; + if _e689 { + let _e692 = global.member[_e289.member_7]; + let _e696 = global.member[(_e289.member_7 + 1u)]; + let _e701 = global.member[(_e289.member_7 + 2u)]; + let _e705 = global.member[(_e289.member_7 + 3u)]; + let _e710 = global.member[(_e289.member_7 + 4u)]; + let _e714 = global.member[(_e289.member_7 + 5u)]; + let _e718 = global.member[(_e289.member_7 + 6u)]; + switch bitcast(_e718) { case 0: { - phi_1129_ = 0u; + phi_1248_ = 0u; break; } case 1: { - phi_1129_ = 1u; + phi_1248_ = 1u; break; } case 2: { - phi_1129_ = 2u; + phi_1248_ = 2u; break; } default: { - phi_1129_ = 0u; + phi_1248_ = 0u; break; } } - let _e751 = phi_1129_; - let _e755 = global.member[(_e317.member_7 + 7u)]; - switch bitcast(_e755) { + let _e721 = phi_1248_; + let _e725 = global.member[(_e289.member_7 + 7u)]; + switch bitcast(_e725) { case 0: { - phi_1138_ = 0u; + phi_1257_ = 0u; break; } case 1: { - phi_1138_ = 1u; + phi_1257_ = 1u; break; } case 2: { - phi_1138_ = 2u; + phi_1257_ = 2u; break; } default: { - phi_1138_ = 0u; + phi_1257_ = 0u; break; } } - let _e758 = phi_1138_; - phi_1151_ = type_33(type_24(_e751, _e758), vec2(_e722, _e726), vec2(_e731, _e735), _e740, _e744); + let _e728 = phi_1257_; + phi_1270_ = type_32(type_24(_e721, _e728), vec2(_e692, _e696), vec2(_e701, _e705), _e710, _e714); } else { - phi_1151_ = type_33(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); + phi_1270_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e762 = phi_1151_; - switch bitcast(_e762.member.member) { + let _e732 = phi_1270_; + switch bitcast(_e732.member.member) { case 1: { - let _e800 = abs(_e714.x); - let _e802 = (_e800 % 1f); - if (_e800 >= 1f) { - phi_4067_ = select(true, false, (_e802 == 0f)); + let _e770 = abs(_e684.x); + let _e772 = (_e770 % 1f); + if (_e770 >= 1f) { + phi_4147_ = select(true, false, (_e772 == 0f)); } else { - phi_4067_ = true; + phi_4147_ = true; } - let _e806 = phi_4067_; - let _e807 = select(1f, _e802, _e806); - if (select(-1f, 1f, (_e714.x >= 0f)) > 0f) { - phi_1171_ = _e807; + let _e776 = phi_4147_; + let _e777 = select(1f, _e772, _e776); + if (select(-1f, 1f, (_e684.x >= 0f)) > 0f) { + phi_1290_ = _e777; } else { - phi_1171_ = (1f - _e807); + phi_1290_ = (1f - _e777); } - let _e811 = phi_1171_; - phi_1208_ = _e811; + let _e781 = phi_1290_; + phi_1327_ = _e781; break; } case 2: { - let _e774 = abs(_e714.x); - let _e781 = ((select(select(u32(_e774), 0u, (_e774 < 0f)), 4294967295u, (_e774 > 4294967000f)) % 2u) == 0u); - let _e783 = (_e774 % 1f); - if (_e774 >= 1f) { - phi_4084_ = select(true, false, (_e783 == 0f)); + let _e744 = abs(_e684.x); + let _e751 = ((select(select(u32(_e744), 0u, (_e744 < 0f)), 4294967295u, (_e744 > 4294967000f)) % 2u) == 0u); + let _e753 = (_e744 % 1f); + if (_e744 >= 1f) { + phi_4164_ = select(true, false, (_e753 == 0f)); } else { - phi_4084_ = true; + phi_4164_ = true; } - let _e787 = phi_4084_; - let _e788 = select(1f, _e783, _e787); - if (select(-1f, 1f, (_e714.x >= 0f)) > 0f) { - if _e781 { - phi_1200_ = _e788; + let _e757 = phi_4164_; + let _e758 = select(1f, _e753, _e757); + if (select(-1f, 1f, (_e684.x >= 0f)) > 0f) { + if _e751 { + phi_1319_ = _e758; } else { - phi_1200_ = (1f - _e788); + phi_1319_ = (1f - _e758); } - let _e795 = phi_1200_; - phi_1206_ = _e795; + let _e765 = phi_1319_; + phi_1325_ = _e765; } else { - if _e781 { - phi_1205_ = (1f - _e788); + if _e751 { + phi_1324_ = (1f - _e758); } else { - phi_1205_ = _e788; + phi_1324_ = _e758; } - let _e792 = phi_1205_; - phi_1206_ = _e792; + let _e762 = phi_1324_; + phi_1325_ = _e762; } - let _e797 = phi_1206_; - phi_1208_ = _e797; + let _e767 = phi_1325_; + phi_1327_ = _e767; break; } case 0: { - if (_e714.x > 1f) { - phi_4102_ = 0.9999999f; + if (_e684.x > 1f) { + phi_4182_ = 0.9999999f; } else { - phi_4102_ = select(_e714.x, 0.00000011920929f, (_e714.x < 0f)); + phi_4182_ = select(_e684.x, 0.00000011920929f, (_e684.x < 0f)); } - let _e771 = phi_4102_; - phi_1208_ = _e771; + let _e741 = phi_4182_; + phi_1327_ = _e741; break; } default: { - phi_1208_ = f32(); + phi_1327_ = f32(); break; } } - let _e813 = phi_1208_; - switch bitcast(_e762.member.member_1) { + let _e783 = phi_1327_; + switch bitcast(_e732.member.member_1) { case 1: { - let _e851 = abs(_e714.y); - let _e853 = (_e851 % 1f); - if (_e851 >= 1f) { - phi_4115_ = select(true, false, (_e853 == 0f)); + let _e821 = abs(_e684.y); + let _e823 = (_e821 % 1f); + if (_e821 >= 1f) { + phi_4195_ = select(true, false, (_e823 == 0f)); } else { - phi_4115_ = true; + phi_4195_ = true; } - let _e857 = phi_4115_; - let _e858 = select(1f, _e853, _e857); - if (select(-1f, 1f, (_e714.y >= 0f)) > 0f) { - phi_1229_ = _e858; + let _e827 = phi_4195_; + let _e828 = select(1f, _e823, _e827); + if (select(-1f, 1f, (_e684.y >= 0f)) > 0f) { + phi_1348_ = _e828; } else { - phi_1229_ = (1f - _e858); + phi_1348_ = (1f - _e828); } - let _e862 = phi_1229_; - phi_1266_ = _e862; + let _e832 = phi_1348_; + phi_1385_ = _e832; break; } case 2: { - let _e825 = abs(_e714.y); - let _e832 = ((select(select(u32(_e825), 0u, (_e825 < 0f)), 4294967295u, (_e825 > 4294967000f)) % 2u) == 0u); - let _e834 = (_e825 % 1f); - if (_e825 >= 1f) { - phi_4132_ = select(true, false, (_e834 == 0f)); + let _e795 = abs(_e684.y); + let _e802 = ((select(select(u32(_e795), 0u, (_e795 < 0f)), 4294967295u, (_e795 > 4294967000f)) % 2u) == 0u); + let _e804 = (_e795 % 1f); + if (_e795 >= 1f) { + phi_4212_ = select(true, false, (_e804 == 0f)); } else { - phi_4132_ = true; + phi_4212_ = true; } - let _e838 = phi_4132_; - let _e839 = select(1f, _e834, _e838); - if (select(-1f, 1f, (_e714.y >= 0f)) > 0f) { - if _e832 { - phi_1258_ = _e839; + let _e808 = phi_4212_; + let _e809 = select(1f, _e804, _e808); + if (select(-1f, 1f, (_e684.y >= 0f)) > 0f) { + if _e802 { + phi_1377_ = _e809; } else { - phi_1258_ = (1f - _e839); + phi_1377_ = (1f - _e809); } - let _e846 = phi_1258_; - phi_1264_ = _e846; + let _e816 = phi_1377_; + phi_1383_ = _e816; } else { - if _e832 { - phi_1263_ = (1f - _e839); + if _e802 { + phi_1382_ = (1f - _e809); } else { - phi_1263_ = _e839; + phi_1382_ = _e809; } - let _e843 = phi_1263_; - phi_1264_ = _e843; + let _e813 = phi_1382_; + phi_1383_ = _e813; } - let _e848 = phi_1264_; - phi_1266_ = _e848; + let _e818 = phi_1383_; + phi_1385_ = _e818; break; } case 0: { - if (_e714.y > 1f) { - phi_4150_ = 0.9999999f; + if (_e684.y > 1f) { + phi_4230_ = 0.9999999f; } else { - phi_4150_ = select(_e714.y, 0.00000011920929f, (_e714.y < 0f)); + phi_4230_ = select(_e684.y, 0.00000011920929f, (_e684.y < 0f)); } - let _e822 = phi_4150_; - phi_1266_ = _e822; + let _e792 = phi_4230_; + phi_1385_ = _e792; break; } default: { - phi_1266_ = f32(); + phi_1385_ = f32(); break; } } - let _e864 = phi_1266_; - let _e868 = (_e813 * f32(_e762.member_2.x)); - let _e877 = (_e864 * f32(_e762.member_2.y)); - let _e895 = vec3((f32((select(select(u32(_e868), 0u, (_e868 < 0f)), 4294967295u, (_e868 > 4294967000f)) + _e762.member_1.x)) / _e498), (f32((select(select(u32(_e877), 0u, (_e877 < 0f)), 4294967295u, (_e877 > 4294967000f)) + _e762.member_1.y)) / _e500), f32(_e762.member_3)); - let _e901 = textureSampleLevel(global_12, global_11, vec2(_e895.x, _e895.y), i32(_e895.z), 0f); - let _e902 = (_e317.member_7 == 4294967295u); - let _e904 = select(_e901, vec4(1f, 1f, 1f, 1f), vec4(_e902)); - let _e908 = select(_e123, _e122, vec2((_e317.member_13 == 0u))); - if _e323 { - phi_4182_ = (_e317.member_8 <= (_e117 - 8u)); + let _e834 = phi_1385_; + let _e838 = (_e783 * f32(_e732.member_2.x)); + let _e847 = (_e834 * f32(_e732.member_2.y)); + let _e865 = vec3((f32((select(select(u32(_e838), 0u, (_e838 < 0f)), 4294967295u, (_e838 > 4294967000f)) + _e732.member_1.x)) / _e469), (f32((select(select(u32(_e847), 0u, (_e847 < 0f)), 4294967295u, (_e847 > 4294967000f)) + _e732.member_1.y)) / _e470), f32(_e732.member_3)); + let _e871 = textureSampleLevel(global_10, global_9, vec2(_e865.x, _e865.y), i32(_e865.z), 0f); + let _e872 = (_e289.member_7 == 4294967295u); + let _e874 = select(_e871, vec4(1f, 1f, 1f, 1f), vec4(_e872)); + let _e878 = select(_e114, _e113, vec2((_e289.member_13 == 0u))); + if _e295 { + phi_4262_ = (_e289.member_8 <= (_e110 - 8u)); } else { - phi_4182_ = false; + phi_4262_ = false; } - let _e913 = phi_4182_; - if _e913 { - let _e916 = global.member[_e317.member_8]; - let _e920 = global.member[(_e317.member_8 + 1u)]; - let _e925 = global.member[(_e317.member_8 + 2u)]; - let _e929 = global.member[(_e317.member_8 + 3u)]; - let _e934 = global.member[(_e317.member_8 + 4u)]; - let _e938 = global.member[(_e317.member_8 + 5u)]; - let _e942 = global.member[(_e317.member_8 + 6u)]; - switch bitcast(_e942) { + let _e883 = phi_4262_; + if _e883 { + let _e886 = global.member[_e289.member_8]; + let _e890 = global.member[(_e289.member_8 + 1u)]; + let _e895 = global.member[(_e289.member_8 + 2u)]; + let _e899 = global.member[(_e289.member_8 + 3u)]; + let _e904 = global.member[(_e289.member_8 + 4u)]; + let _e908 = global.member[(_e289.member_8 + 5u)]; + let _e912 = global.member[(_e289.member_8 + 6u)]; + switch bitcast(_e912) { case 0: { - phi_1349_ = 0u; + phi_1468_ = 0u; break; } case 1: { - phi_1349_ = 1u; + phi_1468_ = 1u; break; } case 2: { - phi_1349_ = 2u; + phi_1468_ = 2u; break; } default: { - phi_1349_ = 0u; + phi_1468_ = 0u; break; } } - let _e945 = phi_1349_; - let _e949 = global.member[(_e317.member_8 + 7u)]; - switch bitcast(_e949) { + let _e915 = phi_1468_; + let _e919 = global.member[(_e289.member_8 + 7u)]; + switch bitcast(_e919) { case 0: { - phi_1358_ = 0u; + phi_1477_ = 0u; break; } case 1: { - phi_1358_ = 1u; + phi_1477_ = 1u; break; } case 2: { - phi_1358_ = 2u; + phi_1477_ = 2u; break; } default: { - phi_1358_ = 0u; + phi_1477_ = 0u; break; } } - let _e952 = phi_1358_; - phi_1371_ = type_33(type_24(_e945, _e952), vec2(_e916, _e920), vec2(_e925, _e929), _e934, _e938); + let _e922 = phi_1477_; + phi_1490_ = type_32(type_24(_e915, _e922), vec2(_e886, _e890), vec2(_e895, _e899), _e904, _e908); } else { - phi_1371_ = type_33(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); + phi_1490_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e956 = phi_1371_; - switch bitcast(_e956.member.member) { + let _e926 = phi_1490_; + switch bitcast(_e926.member.member) { case 1: { - let _e994 = abs(_e908.x); - let _e996 = (_e994 % 1f); - if (_e994 >= 1f) { - phi_4202_ = select(true, false, (_e996 == 0f)); + let _e964 = abs(_e878.x); + let _e966 = (_e964 % 1f); + if (_e964 >= 1f) { + phi_4282_ = select(true, false, (_e966 == 0f)); } else { - phi_4202_ = true; + phi_4282_ = true; } - let _e1000 = phi_4202_; - let _e1001 = select(1f, _e996, _e1000); - if (select(-1f, 1f, (_e908.x >= 0f)) > 0f) { - phi_1391_ = _e1001; + let _e970 = phi_4282_; + let _e971 = select(1f, _e966, _e970); + if (select(-1f, 1f, (_e878.x >= 0f)) > 0f) { + phi_1510_ = _e971; } else { - phi_1391_ = (1f - _e1001); + phi_1510_ = (1f - _e971); } - let _e1005 = phi_1391_; - phi_1428_ = _e1005; + let _e975 = phi_1510_; + phi_1547_ = _e975; break; } case 2: { - let _e968 = abs(_e908.x); - let _e975 = ((select(select(u32(_e968), 0u, (_e968 < 0f)), 4294967295u, (_e968 > 4294967000f)) % 2u) == 0u); - let _e977 = (_e968 % 1f); - if (_e968 >= 1f) { - phi_4219_ = select(true, false, (_e977 == 0f)); + let _e938 = abs(_e878.x); + let _e945 = ((select(select(u32(_e938), 0u, (_e938 < 0f)), 4294967295u, (_e938 > 4294967000f)) % 2u) == 0u); + let _e947 = (_e938 % 1f); + if (_e938 >= 1f) { + phi_4299_ = select(true, false, (_e947 == 0f)); } else { - phi_4219_ = true; + phi_4299_ = true; } - let _e981 = phi_4219_; - let _e982 = select(1f, _e977, _e981); - if (select(-1f, 1f, (_e908.x >= 0f)) > 0f) { - if _e975 { - phi_1420_ = _e982; + let _e951 = phi_4299_; + let _e952 = select(1f, _e947, _e951); + if (select(-1f, 1f, (_e878.x >= 0f)) > 0f) { + if _e945 { + phi_1539_ = _e952; } else { - phi_1420_ = (1f - _e982); + phi_1539_ = (1f - _e952); } - let _e989 = phi_1420_; - phi_1426_ = _e989; + let _e959 = phi_1539_; + phi_1545_ = _e959; } else { - if _e975 { - phi_1425_ = (1f - _e982); + if _e945 { + phi_1544_ = (1f - _e952); } else { - phi_1425_ = _e982; + phi_1544_ = _e952; } - let _e986 = phi_1425_; - phi_1426_ = _e986; + let _e956 = phi_1544_; + phi_1545_ = _e956; } - let _e991 = phi_1426_; - phi_1428_ = _e991; + let _e961 = phi_1545_; + phi_1547_ = _e961; break; } case 0: { - if (_e908.x > 1f) { - phi_4237_ = 0.9999999f; + if (_e878.x > 1f) { + phi_4317_ = 0.9999999f; } else { - phi_4237_ = select(_e908.x, 0.00000011920929f, (_e908.x < 0f)); + phi_4317_ = select(_e878.x, 0.00000011920929f, (_e878.x < 0f)); } - let _e965 = phi_4237_; - phi_1428_ = _e965; + let _e935 = phi_4317_; + phi_1547_ = _e935; break; } default: { - phi_1428_ = f32(); + phi_1547_ = f32(); break; } } - let _e1007 = phi_1428_; - switch bitcast(_e956.member.member_1) { + let _e977 = phi_1547_; + switch bitcast(_e926.member.member_1) { case 1: { - let _e1045 = abs(_e908.y); - let _e1047 = (_e1045 % 1f); - if (_e1045 >= 1f) { - phi_4250_ = select(true, false, (_e1047 == 0f)); + let _e1015 = abs(_e878.y); + let _e1017 = (_e1015 % 1f); + if (_e1015 >= 1f) { + phi_4330_ = select(true, false, (_e1017 == 0f)); } else { - phi_4250_ = true; + phi_4330_ = true; } - let _e1051 = phi_4250_; - let _e1052 = select(1f, _e1047, _e1051); - if (select(-1f, 1f, (_e908.y >= 0f)) > 0f) { - phi_1449_ = _e1052; + let _e1021 = phi_4330_; + let _e1022 = select(1f, _e1017, _e1021); + if (select(-1f, 1f, (_e878.y >= 0f)) > 0f) { + phi_1568_ = _e1022; } else { - phi_1449_ = (1f - _e1052); + phi_1568_ = (1f - _e1022); } - let _e1056 = phi_1449_; - phi_1486_ = _e1056; + let _e1026 = phi_1568_; + phi_1605_ = _e1026; break; } case 2: { - let _e1019 = abs(_e908.y); - let _e1026 = ((select(select(u32(_e1019), 0u, (_e1019 < 0f)), 4294967295u, (_e1019 > 4294967000f)) % 2u) == 0u); - let _e1028 = (_e1019 % 1f); - if (_e1019 >= 1f) { - phi_4267_ = select(true, false, (_e1028 == 0f)); + let _e989 = abs(_e878.y); + let _e996 = ((select(select(u32(_e989), 0u, (_e989 < 0f)), 4294967295u, (_e989 > 4294967000f)) % 2u) == 0u); + let _e998 = (_e989 % 1f); + if (_e989 >= 1f) { + phi_4347_ = select(true, false, (_e998 == 0f)); } else { - phi_4267_ = true; + phi_4347_ = true; } - let _e1032 = phi_4267_; - let _e1033 = select(1f, _e1028, _e1032); - if (select(-1f, 1f, (_e908.y >= 0f)) > 0f) { - if _e1026 { - phi_1478_ = _e1033; + let _e1002 = phi_4347_; + let _e1003 = select(1f, _e998, _e1002); + if (select(-1f, 1f, (_e878.y >= 0f)) > 0f) { + if _e996 { + phi_1597_ = _e1003; } else { - phi_1478_ = (1f - _e1033); + phi_1597_ = (1f - _e1003); } - let _e1040 = phi_1478_; - phi_1484_ = _e1040; + let _e1010 = phi_1597_; + phi_1603_ = _e1010; } else { - if _e1026 { - phi_1483_ = (1f - _e1033); + if _e996 { + phi_1602_ = (1f - _e1003); } else { - phi_1483_ = _e1033; + phi_1602_ = _e1003; } - let _e1037 = phi_1483_; - phi_1484_ = _e1037; + let _e1007 = phi_1602_; + phi_1603_ = _e1007; } - let _e1042 = phi_1484_; - phi_1486_ = _e1042; + let _e1012 = phi_1603_; + phi_1605_ = _e1012; break; } case 0: { - if (_e908.y > 1f) { - phi_4285_ = 0.9999999f; + if (_e878.y > 1f) { + phi_4365_ = 0.9999999f; } else { - phi_4285_ = select(_e908.y, 0.00000011920929f, (_e908.y < 0f)); + phi_4365_ = select(_e878.y, 0.00000011920929f, (_e878.y < 0f)); } - let _e1016 = phi_4285_; - phi_1486_ = _e1016; + let _e986 = phi_4365_; + phi_1605_ = _e986; break; } default: { - phi_1486_ = f32(); + phi_1605_ = f32(); break; } } - let _e1058 = phi_1486_; - let _e1062 = (_e1007 * f32(_e956.member_2.x)); - let _e1071 = (_e1058 * f32(_e956.member_2.y)); - let _e1089 = vec3((f32((select(select(u32(_e1062), 0u, (_e1062 < 0f)), 4294967295u, (_e1062 > 4294967000f)) + _e956.member_1.x)) / _e498), (f32((select(select(u32(_e1071), 0u, (_e1071 < 0f)), 4294967295u, (_e1071 > 4294967000f)) + _e956.member_1.y)) / _e500), f32(_e956.member_3)); - let _e1095 = textureSampleLevel(global_12, global_11, vec2(_e1089.x, _e1089.y), i32(_e1089.z), 0f); - let _e1102 = select(_e123, _e122, vec2((_e317.member_14 == 0u))); - if _e323 { - phi_4317_ = (_e317.member_9 <= (_e117 - 8u)); + let _e1028 = phi_1605_; + let _e1032 = (_e977 * f32(_e926.member_2.x)); + let _e1041 = (_e1028 * f32(_e926.member_2.y)); + let _e1059 = vec3((f32((select(select(u32(_e1032), 0u, (_e1032 < 0f)), 4294967295u, (_e1032 > 4294967000f)) + _e926.member_1.x)) / _e469), (f32((select(select(u32(_e1041), 0u, (_e1041 < 0f)), 4294967295u, (_e1041 > 4294967000f)) + _e926.member_1.y)) / _e470), f32(_e926.member_3)); + let _e1065 = textureSampleLevel(global_10, global_9, vec2(_e1059.x, _e1059.y), i32(_e1059.z), 0f); + let _e1072 = select(_e114, _e113, vec2((_e289.member_14 == 0u))); + if _e295 { + phi_4397_ = (_e289.member_9 <= (_e110 - 8u)); } else { - phi_4317_ = false; + phi_4397_ = false; } - let _e1107 = phi_4317_; - if _e1107 { - let _e1110 = global.member[_e317.member_9]; - let _e1114 = global.member[(_e317.member_9 + 1u)]; - let _e1119 = global.member[(_e317.member_9 + 2u)]; - let _e1123 = global.member[(_e317.member_9 + 3u)]; - let _e1128 = global.member[(_e317.member_9 + 4u)]; - let _e1132 = global.member[(_e317.member_9 + 5u)]; - let _e1136 = global.member[(_e317.member_9 + 6u)]; - switch bitcast(_e1136) { + let _e1077 = phi_4397_; + if _e1077 { + let _e1080 = global.member[_e289.member_9]; + let _e1084 = global.member[(_e289.member_9 + 1u)]; + let _e1089 = global.member[(_e289.member_9 + 2u)]; + let _e1093 = global.member[(_e289.member_9 + 3u)]; + let _e1098 = global.member[(_e289.member_9 + 4u)]; + let _e1102 = global.member[(_e289.member_9 + 5u)]; + let _e1106 = global.member[(_e289.member_9 + 6u)]; + switch bitcast(_e1106) { case 0: { - phi_1569_ = 0u; + phi_1688_ = 0u; break; } case 1: { - phi_1569_ = 1u; + phi_1688_ = 1u; break; } case 2: { - phi_1569_ = 2u; + phi_1688_ = 2u; break; } default: { - phi_1569_ = 0u; + phi_1688_ = 0u; break; } } - let _e1139 = phi_1569_; - let _e1143 = global.member[(_e317.member_9 + 7u)]; - switch bitcast(_e1143) { + let _e1109 = phi_1688_; + let _e1113 = global.member[(_e289.member_9 + 7u)]; + switch bitcast(_e1113) { case 0: { - phi_1578_ = 0u; + phi_1697_ = 0u; break; } case 1: { - phi_1578_ = 1u; + phi_1697_ = 1u; break; } case 2: { - phi_1578_ = 2u; + phi_1697_ = 2u; break; } default: { - phi_1578_ = 0u; + phi_1697_ = 0u; break; } } - let _e1146 = phi_1578_; - phi_1591_ = type_33(type_24(_e1139, _e1146), vec2(_e1110, _e1114), vec2(_e1119, _e1123), _e1128, _e1132); + let _e1116 = phi_1697_; + phi_1710_ = type_32(type_24(_e1109, _e1116), vec2(_e1080, _e1084), vec2(_e1089, _e1093), _e1098, _e1102); } else { - phi_1591_ = type_33(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); + phi_1710_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e1150 = phi_1591_; - switch bitcast(_e1150.member.member) { + let _e1120 = phi_1710_; + switch bitcast(_e1120.member.member) { case 1: { - let _e1188 = abs(_e1102.x); - let _e1190 = (_e1188 % 1f); - if (_e1188 >= 1f) { - phi_4337_ = select(true, false, (_e1190 == 0f)); + let _e1158 = abs(_e1072.x); + let _e1160 = (_e1158 % 1f); + if (_e1158 >= 1f) { + phi_4417_ = select(true, false, (_e1160 == 0f)); } else { - phi_4337_ = true; + phi_4417_ = true; } - let _e1194 = phi_4337_; - let _e1195 = select(1f, _e1190, _e1194); - if (select(-1f, 1f, (_e1102.x >= 0f)) > 0f) { - phi_1611_ = _e1195; + let _e1164 = phi_4417_; + let _e1165 = select(1f, _e1160, _e1164); + if (select(-1f, 1f, (_e1072.x >= 0f)) > 0f) { + phi_1730_ = _e1165; } else { - phi_1611_ = (1f - _e1195); + phi_1730_ = (1f - _e1165); } - let _e1199 = phi_1611_; - phi_1648_ = _e1199; + let _e1169 = phi_1730_; + phi_1767_ = _e1169; break; } case 2: { - let _e1162 = abs(_e1102.x); - let _e1169 = ((select(select(u32(_e1162), 0u, (_e1162 < 0f)), 4294967295u, (_e1162 > 4294967000f)) % 2u) == 0u); - let _e1171 = (_e1162 % 1f); - if (_e1162 >= 1f) { - phi_4354_ = select(true, false, (_e1171 == 0f)); + let _e1132 = abs(_e1072.x); + let _e1139 = ((select(select(u32(_e1132), 0u, (_e1132 < 0f)), 4294967295u, (_e1132 > 4294967000f)) % 2u) == 0u); + let _e1141 = (_e1132 % 1f); + if (_e1132 >= 1f) { + phi_4434_ = select(true, false, (_e1141 == 0f)); } else { - phi_4354_ = true; + phi_4434_ = true; } - let _e1175 = phi_4354_; - let _e1176 = select(1f, _e1171, _e1175); - if (select(-1f, 1f, (_e1102.x >= 0f)) > 0f) { - if _e1169 { - phi_1640_ = _e1176; + let _e1145 = phi_4434_; + let _e1146 = select(1f, _e1141, _e1145); + if (select(-1f, 1f, (_e1072.x >= 0f)) > 0f) { + if _e1139 { + phi_1759_ = _e1146; } else { - phi_1640_ = (1f - _e1176); + phi_1759_ = (1f - _e1146); } - let _e1183 = phi_1640_; - phi_1646_ = _e1183; + let _e1153 = phi_1759_; + phi_1765_ = _e1153; } else { - if _e1169 { - phi_1645_ = (1f - _e1176); + if _e1139 { + phi_1764_ = (1f - _e1146); } else { - phi_1645_ = _e1176; + phi_1764_ = _e1146; } - let _e1180 = phi_1645_; - phi_1646_ = _e1180; + let _e1150 = phi_1764_; + phi_1765_ = _e1150; } - let _e1185 = phi_1646_; - phi_1648_ = _e1185; + let _e1155 = phi_1765_; + phi_1767_ = _e1155; break; } case 0: { - if (_e1102.x > 1f) { - phi_4372_ = 0.9999999f; + if (_e1072.x > 1f) { + phi_4452_ = 0.9999999f; } else { - phi_4372_ = select(_e1102.x, 0.00000011920929f, (_e1102.x < 0f)); + phi_4452_ = select(_e1072.x, 0.00000011920929f, (_e1072.x < 0f)); } - let _e1159 = phi_4372_; - phi_1648_ = _e1159; + let _e1129 = phi_4452_; + phi_1767_ = _e1129; break; } default: { - phi_1648_ = f32(); + phi_1767_ = f32(); break; } } - let _e1201 = phi_1648_; - switch bitcast(_e1150.member.member_1) { + let _e1171 = phi_1767_; + switch bitcast(_e1120.member.member_1) { case 1: { - let _e1239 = abs(_e1102.y); - let _e1241 = (_e1239 % 1f); - if (_e1239 >= 1f) { - phi_4385_ = select(true, false, (_e1241 == 0f)); + let _e1209 = abs(_e1072.y); + let _e1211 = (_e1209 % 1f); + if (_e1209 >= 1f) { + phi_4465_ = select(true, false, (_e1211 == 0f)); } else { - phi_4385_ = true; + phi_4465_ = true; } - let _e1245 = phi_4385_; - let _e1246 = select(1f, _e1241, _e1245); - if (select(-1f, 1f, (_e1102.y >= 0f)) > 0f) { - phi_1669_ = _e1246; + let _e1215 = phi_4465_; + let _e1216 = select(1f, _e1211, _e1215); + if (select(-1f, 1f, (_e1072.y >= 0f)) > 0f) { + phi_1788_ = _e1216; } else { - phi_1669_ = (1f - _e1246); + phi_1788_ = (1f - _e1216); } - let _e1250 = phi_1669_; - phi_1706_ = _e1250; + let _e1220 = phi_1788_; + phi_1825_ = _e1220; break; } case 2: { - let _e1213 = abs(_e1102.y); - let _e1220 = ((select(select(u32(_e1213), 0u, (_e1213 < 0f)), 4294967295u, (_e1213 > 4294967000f)) % 2u) == 0u); - let _e1222 = (_e1213 % 1f); - if (_e1213 >= 1f) { - phi_4402_ = select(true, false, (_e1222 == 0f)); + let _e1183 = abs(_e1072.y); + let _e1190 = ((select(select(u32(_e1183), 0u, (_e1183 < 0f)), 4294967295u, (_e1183 > 4294967000f)) % 2u) == 0u); + let _e1192 = (_e1183 % 1f); + if (_e1183 >= 1f) { + phi_4482_ = select(true, false, (_e1192 == 0f)); } else { - phi_4402_ = true; + phi_4482_ = true; } - let _e1226 = phi_4402_; - let _e1227 = select(1f, _e1222, _e1226); - if (select(-1f, 1f, (_e1102.y >= 0f)) > 0f) { - if _e1220 { - phi_1698_ = _e1227; + let _e1196 = phi_4482_; + let _e1197 = select(1f, _e1192, _e1196); + if (select(-1f, 1f, (_e1072.y >= 0f)) > 0f) { + if _e1190 { + phi_1817_ = _e1197; } else { - phi_1698_ = (1f - _e1227); + phi_1817_ = (1f - _e1197); } - let _e1234 = phi_1698_; - phi_1704_ = _e1234; + let _e1204 = phi_1817_; + phi_1823_ = _e1204; } else { - if _e1220 { - phi_1703_ = (1f - _e1227); + if _e1190 { + phi_1822_ = (1f - _e1197); } else { - phi_1703_ = _e1227; + phi_1822_ = _e1197; } - let _e1231 = phi_1703_; - phi_1704_ = _e1231; + let _e1201 = phi_1822_; + phi_1823_ = _e1201; } - let _e1236 = phi_1704_; - phi_1706_ = _e1236; + let _e1206 = phi_1823_; + phi_1825_ = _e1206; break; } case 0: { - if (_e1102.y > 1f) { - phi_4420_ = 0.9999999f; + if (_e1072.y > 1f) { + phi_4500_ = 0.9999999f; } else { - phi_4420_ = select(_e1102.y, 0.00000011920929f, (_e1102.y < 0f)); + phi_4500_ = select(_e1072.y, 0.00000011920929f, (_e1072.y < 0f)); } - let _e1210 = phi_4420_; - phi_1706_ = _e1210; + let _e1180 = phi_4500_; + phi_1825_ = _e1180; break; } default: { - phi_1706_ = f32(); + phi_1825_ = f32(); break; } } - let _e1252 = phi_1706_; - let _e1256 = (_e1201 * f32(_e1150.member_2.x)); - let _e1265 = (_e1252 * f32(_e1150.member_2.y)); - let _e1283 = vec3((f32((select(select(u32(_e1256), 0u, (_e1256 < 0f)), 4294967295u, (_e1256 > 4294967000f)) + _e1150.member_1.x)) / _e498), (f32((select(select(u32(_e1265), 0u, (_e1265 < 0f)), 4294967295u, (_e1265 > 4294967000f)) + _e1150.member_1.y)) / _e500), f32(_e1150.member_3)); - let _e1289 = textureSampleLevel(global_12, global_11, vec2(_e1283.x, _e1283.y), i32(_e1283.z), 0f); - let _e1292 = select(_e1289, vec4(1f, 1f, 1f, 1f), vec4((_e317.member_9 == 4294967295u))); - if _e902 { - phi_1800_ = vec3(0f, 0f, 0f); - phi_1801_ = _e124; + let _e1222 = phi_1825_; + let _e1226 = (_e1171 * f32(_e1120.member_2.x)); + let _e1235 = (_e1222 * f32(_e1120.member_2.y)); + let _e1253 = vec3((f32((select(select(u32(_e1226), 0u, (_e1226 < 0f)), 4294967295u, (_e1226 > 4294967000f)) + _e1120.member_1.x)) / _e469), (f32((select(select(u32(_e1235), 0u, (_e1235 < 0f)), 4294967295u, (_e1235 > 4294967000f)) + _e1120.member_1.y)) / _e470), f32(_e1120.member_3)); + let _e1259 = textureSampleLevel(global_10, global_9, vec2(_e1253.x, _e1253.y), i32(_e1253.z), 0f); + let _e1262 = select(_e1259, vec4(1f, 1f, 1f, 1f), vec4((_e289.member_9 == 4294967295u))); + if _e872 { + phi_1919_ = vec3(0f, 0f, 0f); + phi_1920_ = _e115; } else { - let _e1296 = fma(_e904.x, 2f, -1f); - let _e1297 = fma(_e904.y, 2f, -1f); - let _e1298 = fma(_e904.z, 2f, -1f); - let _e1303 = sqrt(fma(_e1298, _e1298, fma(_e1296, _e1296, (_e1297 * _e1297)))); - if (_e1303 == 0f) { - phi_4474_ = vec3(0f, 0f, 0f); + let _e1266 = fma(_e874.x, 2f, -1f); + let _e1267 = fma(_e874.y, 2f, -1f); + let _e1268 = fma(_e874.z, 2f, -1f); + let _e1273 = sqrt(fma(_e1268, _e1268, fma(_e1266, _e1266, (_e1267 * _e1267)))); + if (_e1273 == 0f) { + phi_4554_ = vec3(0f, 0f, 0f); } else { - phi_4474_ = (vec3(_e1296, _e1297, _e1298) * (1f / _e1303)); + phi_4554_ = (vec3(_e1266, _e1267, _e1268) * (1f / _e1273)); } - let _e1308 = phi_4474_; - let _e1315 = sqrt(fma(_e125.z, _e125.z, fma(_e125.x, _e125.x, (_e125.y * _e125.y)))); - if (_e1315 == 0f) { - phi_4509_ = vec3(0f, 0f, 0f); + let _e1278 = phi_4554_; + let _e1285 = sqrt(fma(_e116.z, _e116.z, fma(_e116.x, _e116.x, (_e116.y * _e116.y)))); + if (_e1285 == 0f) { + phi_4589_ = vec3(0f, 0f, 0f); } else { - phi_4509_ = (_e125 * (1f / _e1315)); + phi_4589_ = (_e116 * (1f / _e1285)); } - let _e1320 = phi_4509_; - let _e1327 = sqrt(fma(_e126.z, _e126.z, fma(_e126.x, _e126.x, (_e126.y * _e126.y)))); - if (_e1327 == 0f) { - phi_4544_ = vec3(0f, 0f, 0f); + let _e1290 = phi_4589_; + let _e1297 = sqrt(fma(_e117.z, _e117.z, fma(_e117.x, _e117.x, (_e117.y * _e117.y)))); + if (_e1297 == 0f) { + phi_4624_ = vec3(0f, 0f, 0f); } else { - phi_4544_ = (_e126 * (1f / _e1327)); + phi_4624_ = (_e117 * (1f / _e1297)); } - let _e1332 = phi_4544_; - let _e1339 = sqrt(fma(_e124.z, _e124.z, fma(_e124.x, _e124.x, (_e124.y * _e124.y)))); - if (_e1339 == 0f) { - phi_4579_ = vec3(0f, 0f, 0f); + let _e1302 = phi_4624_; + let _e1309 = sqrt(fma(_e115.z, _e115.z, fma(_e115.x, _e115.x, (_e115.y * _e115.y)))); + if (_e1309 == 0f) { + phi_4659_ = vec3(0f, 0f, 0f); } else { - phi_4579_ = (_e124 * (1f / _e1339)); - } - let _e1344 = phi_4579_; - let _e1363 = fma(_e1344.x, _e1308.z, fma(_e1320.x, _e1308.x, (_e1332.x * _e1308.y))); - let _e1364 = fma(_e1344.y, _e1308.z, fma(_e1320.y, _e1308.x, (_e1332.y * _e1308.y))); - let _e1365 = fma(_e1344.z, _e1308.z, fma(_e1320.z, _e1308.x, (_e1332.z * _e1308.y))); - let _e1370 = sqrt(fma(_e1365, _e1365, fma(_e1363, _e1363, (_e1364 * _e1364)))); - if (_e1370 == 0f) { - phi_4614_ = vec3(0f, 0f, 0f); + phi_4659_ = (_e115 * (1f / _e1309)); + } + let _e1314 = phi_4659_; + let _e1333 = fma(_e1314.x, _e1278.z, fma(_e1290.x, _e1278.x, (_e1302.x * _e1278.y))); + let _e1334 = fma(_e1314.y, _e1278.z, fma(_e1290.y, _e1278.x, (_e1302.y * _e1278.y))); + let _e1335 = fma(_e1314.z, _e1278.z, fma(_e1290.z, _e1278.x, (_e1302.z * _e1278.y))); + let _e1340 = sqrt(fma(_e1335, _e1335, fma(_e1333, _e1333, (_e1334 * _e1334)))); + if (_e1340 == 0f) { + phi_4694_ = vec3(0f, 0f, 0f); } else { - phi_4614_ = (vec3(_e1363, _e1364, _e1365) * (1f / _e1370)); + phi_4694_ = (vec3(_e1333, _e1334, _e1335) * (1f / _e1340)); } - let _e1375 = phi_4614_; - phi_1800_ = _e1308; - phi_1801_ = _e1375; + let _e1345 = phi_4694_; + phi_1919_ = _e1278; + phi_1920_ = _e1345; } - let _e1377 = phi_1800_; - let _e1379 = phi_1801_; - let _e1383 = (_e516.x * _e317.member_2.x); - let _e1386 = (_e516.y * _e317.member_2.y); - let _e1389 = (_e516.z * _e317.member_2.z); - let _e1394 = (_e1383 * _e121.x); - let _e1396 = (_e1386 * _e121.y); - let _e1398 = (_e1389 * _e121.z); - let _e1403 = (_e710.y * _e317.member_4); - let _e1406 = (_e710.z * _e317.member_3); - let _e1410 = fma(_e317.member_16, (select(_e1095, vec4(1f, 1f, 1f, 1f), vec4((_e317.member_8 == 4294967295u))).x - 1f), 1f); - let _e1416 = (_e1292.x * _e317.member.x); - let _e1418 = (_e1292.y * _e317.member.y); - let _e1420 = (_e1292.z * _e317.member.z); - let _e1425 = textureSampleLevel(global_13, global_14, _e1379, 0f); - if (_e117 >= 83u) { - phi_4646_ = (_e118 <= (_e117 - 83u)); + let _e1347 = phi_1919_; + let _e1349 = phi_1920_; + let _e1353 = (_e486.x * _e289.member_2.x); + let _e1356 = (_e486.y * _e289.member_2.y); + let _e1359 = (_e486.z * _e289.member_2.z); + let _e1364 = (_e1353 * _e112.x); + let _e1366 = (_e1356 * _e112.y); + let _e1368 = (_e1359 * _e112.z); + let _e1373 = (_e680.y * _e289.member_4); + let _e1376 = (_e680.z * _e289.member_3); + let _e1380 = fma(_e289.member_16, (select(_e1065, vec4(1f, 1f, 1f, 1f), vec4((_e289.member_8 == 4294967295u))).x - 1f), 1f); + let _e1386 = (_e1262.x * _e289.member.x); + let _e1388 = (_e1262.y * _e289.member.y); + let _e1390 = (_e1262.z * _e289.member.z); + let _e1395 = textureSampleLevel(global_11, global_12, _e1349, 0f); + if (_e110 >= 83u) { + phi_4726_ = (_e122 <= (_e110 - 83u)); } else { - phi_4646_ = false; + phi_4726_ = false; } - let _e1433 = phi_4646_; - if _e1433 { - let _e1436 = global.member[_e118]; - let _e1441 = global.member[(_e118 + 1u)]; - let _e1446 = global.member[(_e118 + 2u)]; - let _e1451 = global.member[(_e118 + 3u)]; - let _e1457 = global.member[(_e118 + 4u)]; - let _e1462 = global.member[(_e118 + 5u)]; - let _e1467 = global.member[(_e118 + 6u)]; - let _e1472 = global.member[(_e118 + 7u)]; - let _e1478 = global.member[(_e118 + 8u)]; - let _e1483 = global.member[(_e118 + 9u)]; - let _e1488 = global.member[(_e118 + 10u)]; - let _e1493 = global.member[(_e118 + 11u)]; - let _e1499 = global.member[(_e118 + 12u)]; - let _e1504 = global.member[(_e118 + 13u)]; - let _e1509 = global.member[(_e118 + 14u)]; - let _e1514 = global.member[(_e118 + 15u)]; - let _e1521 = global.member[(_e118 + 16u)]; - let _e1526 = global.member[(_e118 + 17u)]; - let _e1531 = global.member[(_e118 + 18u)]; - let _e1536 = global.member[(_e118 + 19u)]; - let _e1542 = global.member[(_e118 + 20u)]; - let _e1547 = global.member[(_e118 + 21u)]; - let _e1552 = global.member[(_e118 + 22u)]; - let _e1557 = global.member[(_e118 + 23u)]; - let _e1563 = global.member[(_e118 + 24u)]; - let _e1568 = global.member[(_e118 + 25u)]; - let _e1573 = global.member[(_e118 + 26u)]; - let _e1578 = global.member[(_e118 + 27u)]; - let _e1584 = global.member[(_e118 + 28u)]; - let _e1589 = global.member[(_e118 + 29u)]; - let _e1594 = global.member[(_e118 + 30u)]; - let _e1599 = global.member[(_e118 + 31u)]; - let _e1606 = global.member[(_e118 + 32u)]; - let _e1611 = global.member[(_e118 + 33u)]; - let _e1616 = global.member[(_e118 + 34u)]; + let _e1403 = phi_4726_; + if _e1403 { + let _e1406 = global.member[_e122]; + let _e1411 = global.member[(_e122 + 1u)]; + let _e1416 = global.member[(_e122 + 2u)]; + let _e1421 = global.member[(_e122 + 3u)]; + let _e1427 = global.member[(_e122 + 4u)]; + let _e1432 = global.member[(_e122 + 5u)]; + let _e1437 = global.member[(_e122 + 6u)]; + let _e1442 = global.member[(_e122 + 7u)]; + let _e1448 = global.member[(_e122 + 8u)]; + let _e1453 = global.member[(_e122 + 9u)]; + let _e1458 = global.member[(_e122 + 10u)]; + let _e1463 = global.member[(_e122 + 11u)]; + let _e1469 = global.member[(_e122 + 12u)]; + let _e1474 = global.member[(_e122 + 13u)]; + let _e1479 = global.member[(_e122 + 14u)]; + let _e1484 = global.member[(_e122 + 15u)]; + let _e1491 = global.member[(_e122 + 16u)]; + let _e1496 = global.member[(_e122 + 17u)]; + let _e1501 = global.member[(_e122 + 18u)]; + let _e1506 = global.member[(_e122 + 19u)]; + let _e1512 = global.member[(_e122 + 20u)]; + let _e1517 = global.member[(_e122 + 21u)]; + let _e1522 = global.member[(_e122 + 22u)]; + let _e1527 = global.member[(_e122 + 23u)]; + let _e1533 = global.member[(_e122 + 24u)]; + let _e1538 = global.member[(_e122 + 25u)]; + let _e1543 = global.member[(_e122 + 26u)]; + let _e1548 = global.member[(_e122 + 27u)]; + let _e1554 = global.member[(_e122 + 28u)]; + let _e1559 = global.member[(_e122 + 29u)]; + let _e1564 = global.member[(_e122 + 30u)]; + let _e1569 = global.member[(_e122 + 31u)]; + let _e1576 = global.member[(_e122 + 32u)]; + let _e1581 = global.member[(_e122 + 33u)]; + let _e1586 = global.member[(_e122 + 34u)]; local_1 = array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); - phi_2007_ = type_24(0u, 6u); + phi_2127_ = type_24(0u, 6u); loop { - let _e1621 = phi_2007_; - if (_e1621.member < _e1621.member_1) { - phi_2008_ = type_24((_e1621.member + 1u), _e1621.member_1); - phi_2023_ = type_24(1u, _e1621.member); + let _e1591 = phi_2127_; + if (_e1591.member < _e1591.member_1) { + phi_2128_ = type_24((_e1591.member + 1u), _e1591.member_1); + phi_2143_ = type_24(1u, _e1591.member); } else { - phi_2008_ = _e1621; - phi_2023_ = type_24(0u, type_24().member_1); + phi_2128_ = _e1591; + phi_2143_ = type_24(0u, type_24().member_1); } - let _e1634 = phi_2008_; - let _e1636 = phi_2023_; - switch bitcast(_e1636.member) { + let _e1604 = phi_2128_; + let _e1606 = phi_2143_; + switch bitcast(_e1606.member) { case 0: { - phi_2050_ = false; + phi_2170_ = false; break; } case 1: { - let _e1641 = ((_e118 + 35u) + (_e1636.member_1 * 4u)); - let _e1644 = global.member[_e1641]; - let _e1649 = global.member[(_e1641 + 1u)]; - let _e1654 = global.member[(_e1641 + 2u)]; - let _e1659 = global.member[(_e1641 + 3u)]; - local_1[_e1636.member_1] = vec4(bitcast(_e1644), bitcast(_e1649), bitcast(_e1654), bitcast(_e1659)); - phi_2050_ = true; + let _e1611 = ((_e122 + 35u) + (_e1606.member_1 * 4u)); + let _e1614 = global.member[_e1611]; + let _e1619 = global.member[(_e1611 + 1u)]; + let _e1624 = global.member[(_e1611 + 2u)]; + let _e1629 = global.member[(_e1611 + 3u)]; + local_1[_e1606.member_1] = vec4(bitcast(_e1614), bitcast(_e1619), bitcast(_e1624), bitcast(_e1629)); + phi_2170_ = true; break; } default: { - phi_2050_ = bool(); + phi_2170_ = bool(); break; } } - let _e1664 = phi_2050_; + let _e1634 = phi_2170_; continue; continuing { - phi_2007_ = _e1634; - break if !(_e1664); + phi_2127_ = _e1604; + break if !(_e1634); } } - let _e1666 = local_1; + let _e1636 = local_1; local = array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); - phi_2056_ = type_24(0u, 8u); + phi_2176_ = type_24(0u, 8u); loop { - let _e1669 = phi_2056_; - if (_e1669.member < _e1669.member_1) { - phi_2057_ = type_24((_e1669.member + 1u), _e1669.member_1); - phi_2072_ = type_24(1u, _e1669.member); + let _e1639 = phi_2176_; + if (_e1639.member < _e1639.member_1) { + phi_2177_ = type_24((_e1639.member + 1u), _e1639.member_1); + phi_2192_ = type_24(1u, _e1639.member); } else { - phi_2057_ = _e1669; - phi_2072_ = type_24(0u, type_24().member_1); + phi_2177_ = _e1639; + phi_2192_ = type_24(0u, type_24().member_1); } - let _e1682 = phi_2057_; - let _e1684 = phi_2072_; - switch bitcast(_e1684.member) { + let _e1652 = phi_2177_; + let _e1654 = phi_2192_; + switch bitcast(_e1654.member) { case 0: { - phi_2095_ = false; + phi_2215_ = false; break; } case 1: { - let _e1689 = ((_e118 + 59u) + (_e1684.member_1 * 3u)); - let _e1692 = global.member[_e1689]; - let _e1697 = global.member[(_e1689 + 1u)]; - let _e1702 = global.member[(_e1689 + 2u)]; - local[_e1684.member_1] = vec3(bitcast(_e1692), bitcast(_e1697), bitcast(_e1702)); - phi_2095_ = true; + let _e1659 = ((_e122 + 59u) + (_e1654.member_1 * 3u)); + let _e1662 = global.member[_e1659]; + let _e1667 = global.member[(_e1659 + 1u)]; + let _e1672 = global.member[(_e1659 + 2u)]; + local[_e1654.member_1] = vec3(bitcast(_e1662), bitcast(_e1667), bitcast(_e1672)); + phi_2215_ = true; break; } default: { - phi_2095_ = bool(); + phi_2215_ = bool(); break; } } - let _e1707 = phi_2095_; + let _e1677 = phi_2215_; continue; continuing { - phi_2056_ = _e1682; - break if !(_e1707); + phi_2176_ = _e1652; + break if !(_e1677); } } - let _e1709 = local; - phi_2103_ = type_22(type_20(vec4(bitcast(_e1436), bitcast(_e1441), bitcast(_e1446), bitcast(_e1451)), vec4(bitcast(_e1457), bitcast(_e1462), bitcast(_e1467), bitcast(_e1472)), vec4(bitcast(_e1478), bitcast(_e1483), bitcast(_e1488), bitcast(_e1493)), vec4(bitcast(_e1499), bitcast(_e1504), bitcast(_e1509), bitcast(_e1514))), type_20(vec4(bitcast(_e1521), bitcast(_e1526), bitcast(_e1531), bitcast(_e1536)), vec4(bitcast(_e1542), bitcast(_e1547), bitcast(_e1552), bitcast(_e1557)), vec4(bitcast(_e1563), bitcast(_e1568), bitcast(_e1573), bitcast(_e1578)), vec4(bitcast(_e1584), bitcast(_e1589), bitcast(_e1594), bitcast(_e1599))), type_21(_e1709, _e1666), vec3(bitcast(_e1606), bitcast(_e1611), bitcast(_e1616))); + let _e1679 = local; + phi_2223_ = type_22(type_20(vec4(bitcast(_e1406), bitcast(_e1411), bitcast(_e1416), bitcast(_e1421)), vec4(bitcast(_e1427), bitcast(_e1432), bitcast(_e1437), bitcast(_e1442)), vec4(bitcast(_e1448), bitcast(_e1453), bitcast(_e1458), bitcast(_e1463)), vec4(bitcast(_e1469), bitcast(_e1474), bitcast(_e1479), bitcast(_e1484))), type_20(vec4(bitcast(_e1491), bitcast(_e1496), bitcast(_e1501), bitcast(_e1506)), vec4(bitcast(_e1512), bitcast(_e1517), bitcast(_e1522), bitcast(_e1527)), vec4(bitcast(_e1533), bitcast(_e1538), bitcast(_e1543), bitcast(_e1548)), vec4(bitcast(_e1554), bitcast(_e1559), bitcast(_e1564), bitcast(_e1569))), type_21(_e1679, _e1636), vec3(bitcast(_e1576), bitcast(_e1581), bitcast(_e1586))); } else { - phi_2103_ = type_22(type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_21(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); + phi_2223_ = type_22(type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_21(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); } - let _e1713 = phi_2103_; - let _e1715 = (_e1713.member_3 - _e127); - let _e1722 = sqrt(fma(_e1715.z, _e1715.z, fma(_e1715.x, _e1715.x, (_e1715.y * _e1715.y)))); - let _e1723 = (_e1722 == 0f); - if _e1723 { - phi_4718_ = vec3(0f, 0f, 0f); + let _e1683 = phi_2223_; + let _e1685 = (_e1683.member_3 - _e118); + let _e1692 = sqrt(fma(_e1685.z, _e1685.z, fma(_e1685.x, _e1685.x, (_e1685.y * _e1685.y)))); + let _e1693 = (_e1692 == 0f); + if _e1693 { + phi_4798_ = vec3(0f, 0f, 0f); } else { - phi_4718_ = (_e1715 * (1f / _e1722)); + phi_4798_ = (_e1685 * (1f / _e1692)); } - let _e1727 = phi_4718_; - let _e1728 = -(_e1727); - let _e1735 = sqrt(fma(_e1379.z, _e1379.z, fma(_e1379.x, _e1379.x, (_e1379.y * _e1379.y)))); - let _e1736 = (_e1735 == 0f); - if _e1736 { - phi_4777_ = vec3(0f, 0f, 0f); + let _e1697 = phi_4798_; + let _e1698 = -(_e1697); + let _e1705 = sqrt(fma(_e1349.z, _e1349.z, fma(_e1349.x, _e1349.x, (_e1349.y * _e1349.y)))); + let _e1706 = (_e1705 == 0f); + if _e1706 { + phi_4857_ = vec3(0f, 0f, 0f); } else { - phi_4777_ = (_e1379 * (1f / _e1735)); + phi_4857_ = (_e1349 * (1f / _e1705)); } - let _e1740 = phi_4777_; - let _e1750 = (2f * fma(_e1740.z, _e1728.z, fma(_e1740.x, _e1728.x, (_e1740.y * _e1728.y)))); - let _e1757 = textureSampleLevel(global_15, global_16, (_e1728 - vec3((_e1750 * _e1740.x), (_e1750 * _e1740.y), (_e1750 * _e1740.z))), (_e1403 * 4f)); - if _e1723 { - phi_4851_ = vec3(0f, 0f, 0f); + let _e1710 = phi_4857_; + let _e1720 = (2f * fma(_e1710.z, _e1698.z, fma(_e1710.x, _e1698.x, (_e1710.y * _e1698.y)))); + let _e1727 = textureSampleLevel(global_13, global_14, (_e1698 - vec3((_e1720 * _e1710.x), (_e1720 * _e1710.y), (_e1720 * _e1710.z))), (_e1373 * 4f)); + if _e1693 { + phi_4931_ = vec3(0f, 0f, 0f); } else { - phi_4851_ = (_e1715 * (1f / _e1722)); + phi_4931_ = (_e1685 * (1f / _e1692)); } - let _e1764 = phi_4851_; - let _e1773 = textureSampleLevel(global_17, global_18, vec2(max(fma(_e1379.z, _e1764.z, fma(_e1379.x, _e1764.x, (_e1379.y * _e1764.y))), 0f), _e1403), 0f); - switch bitcast(_e178.member_3) { + let _e1734 = phi_4931_; + let _e1743 = textureSampleLevel(global_15, global_16, vec2(max(fma(_e1349.z, _e1734.z, fma(_e1349.x, _e1734.x, (_e1349.y * _e1734.y))), 0f), _e1373), 0f); + switch bitcast(_e144) { case 0: { - if _e317.member_15 { - if _e1736 { - phi_4901_ = vec3(0f, 0f, 0f); + if _e289.member_15 { + if _e1706 { + phi_4981_ = vec3(0f, 0f, 0f); } else { - phi_4901_ = (_e1379 * (1f / _e1735)); + phi_4981_ = (_e1349 * (1f / _e1705)); } - let _e1942 = phi_4901_; - if _e1723 { - phi_4936_ = vec3(0f, 0f, 0f); + let _e1912 = phi_4981_; + if _e1693 { + phi_5016_ = vec3(0f, 0f, 0f); } else { - phi_4936_ = (_e1715 * (1f / _e1722)); + phi_5016_ = (_e1685 * (1f / _e1692)); } - let _e1946 = phi_4936_; - phi_2143_ = type_24(0u, _e178.member_2.member_1); - phi_2146_ = vec3(0f, 0f, 0f); + let _e1916 = phi_5016_; + phi_2263_ = type_24(0u, _e157); + phi_2266_ = vec3(0f, 0f, 0f); loop { - let _e1949 = phi_2143_; - let _e1951 = phi_2146_; - local_2 = _e1951; - local_3 = _e1951; - local_4 = _e1951; - if (_e1949.member < _e1949.member_1) { - phi_2144_ = type_24((_e1949.member + 1u), _e1949.member_1); - phi_2161_ = type_24(1u, _e1949.member); + let _e1919 = phi_2263_; + let _e1921 = phi_2266_; + local_2 = _e1921; + local_3 = _e1921; + local_4 = _e1921; + if (_e1919.member < _e1919.member_1) { + phi_2264_ = type_24((_e1919.member + 1u), _e1919.member_1); + phi_2281_ = type_24(1u, _e1919.member); } else { - phi_2144_ = _e1949; - phi_2161_ = type_24(0u, type_24().member_1); + phi_2264_ = _e1919; + phi_2281_ = type_24(0u, type_24().member_1); } - let _e1964 = phi_2144_; - let _e1966 = phi_2161_; - switch bitcast(_e1966.member) { + let _e1934 = phi_2264_; + let _e1936 = phi_2281_; + switch bitcast(_e1936.member) { case 0: { - phi_2147_ = vec3(); - phi_3013_ = false; + phi_2267_ = vec3(); + phi_3136_ = false; break; } case 1: { - if (_e1966.member_1 >= _e178.member_2.member_1) { - phi_4953_ = 4294967295u; + if (_e1936.member_1 >= _e157) { + phi_5033_ = 4294967295u; } else { - phi_4953_ = (_e178.member_2.member + _e1966.member_1); + phi_5033_ = (_e153 + _e1936.member_1); } - let _e1973 = phi_4953_; - if (_e117 >= 1u) { - phi_4972_ = (_e1973 <= (_e117 - 1u)); + let _e1943 = phi_5033_; + if (_e110 >= 1u) { + phi_5052_ = (_e1943 <= (_e110 - 1u)); } else { - phi_4972_ = false; + phi_5052_ = false; } - let _e1978 = phi_4972_; - if _e1978 { - let _e1981 = global.member[_e1973]; - phi_2178_ = _e1981; + let _e1948 = phi_5052_; + if _e1948 { + let _e1951 = global.member[_e1943]; + phi_2298_ = _e1951; } else { - phi_2178_ = 4294967295u; + phi_2298_ = 4294967295u; } - let _e1983 = phi_2178_; - let _e1984 = (_e1983 == 4294967295u); - if _e1984 { - phi_3011_ = vec3(); + let _e1953 = phi_2298_; + let _e1954 = (_e1953 == 4294967295u); + if _e1954 { + phi_3134_ = vec3(); } else { - if (_e117 >= 3u) { - phi_5004_ = (_e1983 <= (_e117 - 3u)); + if (_e110 >= 3u) { + phi_5084_ = (_e1953 <= (_e110 - 3u)); } else { - phi_5004_ = false; + phi_5084_ = false; } - let _e1989 = phi_5004_; - if _e1989 { - let _e1992 = global.member[_e1983]; - switch bitcast(_e1992) { + let _e1959 = phi_5084_; + if _e1959 { + let _e1962 = global.member[_e1953]; + switch bitcast(_e1962) { case 0: { - phi_2195_ = 0u; + phi_2315_ = 0u; break; } case 1: { - phi_2195_ = 1u; + phi_2315_ = 1u; break; } case 2: { - phi_2195_ = 2u; + phi_2315_ = 2u; break; } default: { - phi_2195_ = 0u; + phi_2315_ = 0u; break; } } - let _e1995 = phi_2195_; - let _e1999 = global.member[(_e1983 + 1u)]; - let _e2003 = global.member[(_e1983 + 2u)]; - phi_2205_ = type_34(_e1995, _e1999, _e2003); + let _e1965 = phi_2315_; + let _e1969 = global.member[(_e1953 + 1u)]; + let _e1973 = global.member[(_e1953 + 2u)]; + phi_2325_ = type_33(_e1965, _e1969, _e1973); } else { - phi_2205_ = type_34(0u, 4294967295u, 4294967295u); + phi_2325_ = type_33(0u, 4294967295u, 4294967295u); } - let _e2006 = phi_2205_; - if (_e117 >= 10u) { - phi_5034_ = (_e2006.member_2 <= (_e117 - 10u)); + let _e1976 = phi_2325_; + if (_e110 >= 10u) { + phi_5114_ = (_e1976.member_2 <= (_e110 - 10u)); } else { - phi_5034_ = false; + phi_5114_ = false; } - let _e2012 = phi_5034_; - if _e2012 { - let _e2015 = global.member[_e2006.member_2]; - let _e2020 = global.member[(_e2006.member_2 + 1u)]; - let _e2025 = global.member[(_e2006.member_2 + 2u)]; - let _e2031 = global.member[(_e2006.member_2 + 3u)]; - let _e2036 = global.member[(_e2006.member_2 + 4u)]; - let _e2041 = global.member[(_e2006.member_2 + 5u)]; - let _e2046 = global.member[(_e2006.member_2 + 6u)]; - let _e2052 = global.member[(_e2006.member_2 + 7u)]; - let _e2057 = global.member[(_e2006.member_2 + 8u)]; - let _e2062 = global.member[(_e2006.member_2 + 9u)]; - phi_2255_ = type_28(vec3(bitcast(_e2015), bitcast(_e2020), bitcast(_e2025)), vec4(bitcast(_e2031), bitcast(_e2036), bitcast(_e2041), bitcast(_e2046)), vec3(bitcast(_e2052), bitcast(_e2057), bitcast(_e2062))); + let _e1982 = phi_5114_; + if _e1982 { + let _e1985 = global.member[_e1976.member_2]; + let _e1990 = global.member[(_e1976.member_2 + 1u)]; + let _e1995 = global.member[(_e1976.member_2 + 2u)]; + let _e2001 = global.member[(_e1976.member_2 + 3u)]; + let _e2006 = global.member[(_e1976.member_2 + 4u)]; + let _e2011 = global.member[(_e1976.member_2 + 5u)]; + let _e2016 = global.member[(_e1976.member_2 + 6u)]; + let _e2022 = global.member[(_e1976.member_2 + 7u)]; + let _e2027 = global.member[(_e1976.member_2 + 8u)]; + let _e2032 = global.member[(_e1976.member_2 + 9u)]; + phi_2375_ = type_29(vec3(bitcast(_e1985), bitcast(_e1990), bitcast(_e1995)), vec4(bitcast(_e2001), bitcast(_e2006), bitcast(_e2011), bitcast(_e2016)), vec3(bitcast(_e2022), bitcast(_e2027), bitcast(_e2032))); } else { - phi_2255_ = type_28(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_2375_ = type_29(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e2067 = phi_2255_; - let _e2075 = (_e2067.member_1.x + _e2067.member_1.x); - let _e2076 = (_e2067.member_1.y + _e2067.member_1.y); - let _e2077 = (_e2067.member_1.z + _e2067.member_1.z); - let _e2079 = (_e2067.member_1.z * _e2077); - let _e2080 = (_e2067.member_1.w * _e2075); - let _e2081 = (_e2067.member_1.w * _e2076); - let _e2082 = (_e2067.member_1.w * _e2077); - let _e2102 = (vec4((1f - fma(_e2067.member_1.y, _e2076, _e2079)), fma(_e2067.member_1.x, _e2076, _e2082), fma(_e2067.member_1.x, _e2077, -(_e2081)), 0f) * _e2067.member_2.x); - let _e2104 = (vec4(fma(_e2067.member_1.x, _e2076, -(_e2082)), (1f - fma(_e2067.member_1.x, _e2075, _e2079)), fma(_e2067.member_1.y, _e2077, _e2080), 0f) * _e2067.member_2.y); - let _e2106 = (vec4(fma(_e2067.member_1.x, _e2077, _e2081), fma(_e2067.member_1.y, _e2077, -(_e2080)), (1f - fma(_e2067.member_1.x, _e2075, (_e2067.member_1.y * _e2076))), 0f) * _e2067.member_2.z); - switch bitcast(_e2006.member) { + let _e2037 = phi_2375_; + let _e2045 = (_e2037.member_1.x + _e2037.member_1.x); + let _e2046 = (_e2037.member_1.y + _e2037.member_1.y); + let _e2047 = (_e2037.member_1.z + _e2037.member_1.z); + let _e2049 = (_e2037.member_1.z * _e2047); + let _e2050 = (_e2037.member_1.w * _e2045); + let _e2051 = (_e2037.member_1.w * _e2046); + let _e2052 = (_e2037.member_1.w * _e2047); + let _e2072 = (vec4((1f - fma(_e2037.member_1.y, _e2046, _e2049)), fma(_e2037.member_1.x, _e2046, _e2052), fma(_e2037.member_1.x, _e2047, -(_e2051)), 0f) * _e2037.member_2.x); + let _e2074 = (vec4(fma(_e2037.member_1.x, _e2046, -(_e2052)), (1f - fma(_e2037.member_1.x, _e2045, _e2049)), fma(_e2037.member_1.y, _e2047, _e2050), 0f) * _e2037.member_2.y); + let _e2076 = (vec4(fma(_e2037.member_1.x, _e2047, _e2051), fma(_e2037.member_1.y, _e2047, -(_e2050)), (1f - fma(_e2037.member_1.x, _e2045, (_e2037.member_1.y * _e2046))), 0f) * _e2037.member_2.z); + switch bitcast(_e1976.member) { case 0: { - if _e323 { - phi_5115_ = (_e2006.member_1 <= (_e117 - 8u)); + if _e295 { + phi_5194_ = (_e1976.member_1 <= (_e110 - 8u)); } else { - phi_5115_ = false; + phi_5194_ = false; } - let _e2602 = phi_5115_; - if _e2602 { - let _e2605 = global.member[_e2006.member_1]; - let _e2610 = global.member[(_e2006.member_1 + 1u)]; - let _e2615 = global.member[(_e2006.member_1 + 2u)]; - let _e2621 = global.member[(_e2006.member_1 + 3u)]; - let _e2626 = global.member[(_e2006.member_1 + 4u)]; - let _e2631 = global.member[(_e2006.member_1 + 5u)]; - let _e2636 = global.member[(_e2006.member_1 + 6u)]; - let _e2642 = global.member[(_e2006.member_1 + 7u)]; - phi_2303_ = type_35(vec3(bitcast(_e2605), bitcast(_e2610), bitcast(_e2615)), vec4(bitcast(_e2621), bitcast(_e2626), bitcast(_e2631), bitcast(_e2636)), bitcast(_e2642)); + let _e2572 = phi_5194_; + if _e2572 { + let _e2575 = global.member[_e1976.member_1]; + let _e2580 = global.member[(_e1976.member_1 + 1u)]; + let _e2585 = global.member[(_e1976.member_1 + 2u)]; + let _e2591 = global.member[(_e1976.member_1 + 3u)]; + let _e2596 = global.member[(_e1976.member_1 + 4u)]; + let _e2601 = global.member[(_e1976.member_1 + 5u)]; + let _e2606 = global.member[(_e1976.member_1 + 6u)]; + let _e2612 = global.member[(_e1976.member_1 + 7u)]; + phi_2423_ = type_34(vec3(bitcast(_e2575), bitcast(_e2580), bitcast(_e2585)), vec4(bitcast(_e2591), bitcast(_e2596), bitcast(_e2601), bitcast(_e2606)), bitcast(_e2612)); } else { - phi_2303_ = type_35(vec3(0f, -1f, 0f), vec4(1f, 1f, 1f, 1f), 1f); + phi_2423_ = type_34(vec3(0f, -1f, 0f), vec4(1f, 1f, 1f, 1f), 1f); } - let _e2646 = phi_2303_; - let _e2668 = fma(_e2106.x, _e2646.member.z, fma(_e2104.x, _e2646.member.y, (_e2102.x * _e2646.member.x))); - let _e2669 = fma(_e2106.y, _e2646.member.z, fma(_e2104.y, _e2646.member.y, (_e2102.y * _e2646.member.x))); - let _e2670 = fma(_e2106.z, _e2646.member.z, fma(_e2104.z, _e2646.member.y, (_e2102.z * _e2646.member.x))); - let _e2675 = sqrt(fma(_e2670, _e2670, fma(_e2668, _e2668, (_e2669 * _e2669)))); - if (_e2675 == 0f) { - phi_5163_ = vec3(0f, 0f, 0f); + let _e2616 = phi_2423_; + let _e2638 = fma(_e2076.x, _e2616.member.z, fma(_e2074.x, _e2616.member.y, (_e2072.x * _e2616.member.x))); + let _e2639 = fma(_e2076.y, _e2616.member.z, fma(_e2074.y, _e2616.member.y, (_e2072.y * _e2616.member.x))); + let _e2640 = fma(_e2076.z, _e2616.member.z, fma(_e2074.z, _e2616.member.y, (_e2072.z * _e2616.member.x))); + let _e2645 = sqrt(fma(_e2640, _e2640, fma(_e2638, _e2638, (_e2639 * _e2639)))); + if (_e2645 == 0f) { + phi_5242_ = vec3(0f, 0f, 0f); } else { - phi_5163_ = (vec3(_e2668, _e2669, _e2670) * (1f / _e2675)); + phi_5242_ = (vec3(_e2638, _e2639, _e2640) * (1f / _e2645)); } - let _e2680 = phi_5163_; - let _e2682 = -(_e2680.x); - let _e2684 = -(_e2680.y); - let _e2686 = -(_e2680.z); - let _e2687 = -(_e2680); - let _e2691 = fma(fma(_e1383, _e121.x, -0.4f), _e1406, 0.4f); - let _e2692 = fma(fma(_e1386, _e121.y, -0.4f), _e1406, 0.4f); - let _e2693 = fma(fma(_e1389, _e121.z, -0.4f), _e1406, 0.4f); - let _e2701 = (_e1946 + vec3(_e2682, _e2684, _e2686)); - let _e2708 = sqrt(fma(_e2701.z, _e2701.z, fma(_e2701.x, _e2701.x, (_e2701.y * _e2701.y)))); - if (_e2708 == 0f) { - phi_5198_ = vec3(0f, 0f, 0f); + let _e2650 = phi_5242_; + let _e2652 = -(_e2650.x); + let _e2654 = -(_e2650.y); + let _e2656 = -(_e2650.z); + let _e2657 = -(_e2650); + let _e2659 = fma(-(_e680.z), _e289.member_3, 1f); + let _e2663 = fma(0.4f, _e2659, (_e1364 * _e1376)); + let _e2664 = fma(0.4f, _e2659, (_e1366 * _e1376)); + let _e2665 = fma(0.4f, _e2659, (_e1368 * _e1376)); + let _e2673 = (_e1916 + vec3(_e2652, _e2654, _e2656)); + let _e2680 = sqrt(fma(_e2673.z, _e2673.z, fma(_e2673.x, _e2673.x, (_e2673.y * _e2673.y)))); + if (_e2680 == 0f) { + phi_5277_ = vec3(0f, 0f, 0f); } else { - phi_5198_ = (_e2701 * (1f / _e2708)); + phi_5277_ = (_e2673 * (1f / _e2680)); } - let _e2713 = phi_5198_; - let _e2714 = (_e1403 * _e1403); - let _e2725 = max(fma(_e1942.z, _e2713.z, fma(_e1942.x, _e2713.x, (_e1942.y * _e2713.y))), 0f); - let _e2738 = max(fma(_e1942.z, _e1946.z, fma(_e1942.x, _e1946.x, (_e1942.y * _e1946.y))), 0f); - let _e2745 = max(fma(_e1942.z, _e2687.z, fma(_e1942.x, _e2687.x, (_e1942.y * _e2687.y))), 0f); - let _e2746 = fma(_e710.y, _e317.member_4, 1f); - let _e2747 = (_e2746 * _e2746); - let _e2748 = (_e2747 * 0.125f); - let _e2750 = fma(-(_e2747), 0.125f, 1f); - let _e2763 = (1f - max(fma(_e2713.z, _e1946.z, fma(_e2713.x, _e1946.x, (_e2713.y * _e1946.y))), 0f)); - let _e2765 = select(_e2763, 0f, (_e2763 < 0f)); - let _e2768 = pow(select(_e2765, 1f, (_e2765 > 1f)), 5f); - let _e2769 = fma((1f - _e2691), _e2768, _e2691); - let _e2770 = fma((1f - _e2692), _e2768, _e2692); - let _e2771 = fma((1f - _e2693), _e2768, _e2693); - let _e2776 = fma(-(_e710.z), _e317.member_3, 1f); - let _e2780 = (((_e2714 * _e2714) / (pow(fma((_e2725 * _e2725), fma(_e2714, _e2714, -1f), 1f), 2f) * 3.1415927f)) * ((_e2738 / fma(_e2738, _e2750, _e2748)) * (_e2745 / fma(_e2745, _e2750, _e2748)))); - let _e2787 = max(fma(_e1942.z, _e2686, fma(_e1942.x, _e2682, (_e1942.y * _e2684))), 0f); - let _e2789 = fma((4f * _e2738), _e2787, 0.0001f); - phi_3001_ = vec3(fma((fma((((1f - _e2769) * _e2776) * _e1394), 0.31830987f, ((_e2780 * _e2769) / _e2789)) * (_e2646.member_1.x * _e2646.member_2)), _e2787, _e1951.x), fma((fma((((1f - _e2770) * _e2776) * _e1396), 0.31830987f, ((_e2780 * _e2770) / _e2789)) * (_e2646.member_1.y * _e2646.member_2)), _e2787, _e1951.y), fma((fma((((1f - _e2771) * _e2776) * _e1398), 0.31830987f, ((_e2780 * _e2771) / _e2789)) * (_e2646.member_1.z * _e2646.member_2)), _e2787, _e1951.z)); - phi_3002_ = true; + let _e2685 = phi_5277_; + let _e2686 = (_e1373 * _e1373); + let _e2697 = max(fma(_e1912.z, _e2685.z, fma(_e1912.x, _e2685.x, (_e1912.y * _e2685.y))), 0f); + let _e2710 = max(fma(_e1912.z, _e1916.z, fma(_e1912.x, _e1916.x, (_e1912.y * _e1916.y))), 0f); + let _e2717 = max(fma(_e1912.z, _e2657.z, fma(_e1912.x, _e2657.x, (_e1912.y * _e2657.y))), 0f); + let _e2718 = fma(_e680.y, _e289.member_4, 1f); + let _e2719 = (_e2718 * _e2718); + let _e2720 = (_e2719 * 0.125f); + let _e2722 = fma(-(_e2719), 0.125f, 1f); + let _e2735 = (1f - max(fma(_e2685.z, _e1916.z, fma(_e2685.x, _e1916.x, (_e2685.y * _e1916.y))), 0f)); + let _e2737 = select(_e2735, 0f, (_e2735 < 0f)); + let _e2740 = pow(select(_e2737, 1f, (_e2737 > 1f)), 5f); + let _e2741 = fma((1f - _e2663), _e2740, _e2663); + let _e2742 = fma((1f - _e2664), _e2740, _e2664); + let _e2743 = fma((1f - _e2665), _e2740, _e2665); + let _e2750 = (((_e2686 * _e2686) / (pow(fma((_e2697 * _e2697), fma(_e2686, _e2686, -1f), 1f), 2f) * 3.1415927f)) * ((_e2710 / fma(_e2710, _e2722, _e2720)) * (_e2717 / fma(_e2717, _e2722, _e2720)))); + let _e2757 = max(fma(_e1912.z, _e2656, fma(_e1912.x, _e2652, (_e1912.y * _e2654))), 0f); + let _e2759 = fma((4f * _e2710), _e2757, 0.0001f); + phi_3124_ = vec3(fma((fma((((1f - _e2741) * _e2659) * _e1364), 0.31830987f, ((_e2750 * _e2741) / _e2759)) * (_e2616.member_1.x * _e2616.member_2)), _e2757, _e1921.x), fma((fma((((1f - _e2742) * _e2659) * _e1366), 0.31830987f, ((_e2750 * _e2742) / _e2759)) * (_e2616.member_1.y * _e2616.member_2)), _e2757, _e1921.y), fma((fma((((1f - _e2743) * _e2659) * _e1368), 0.31830987f, ((_e2750 * _e2743) / _e2759)) * (_e2616.member_1.z * _e2616.member_2)), _e2757, _e1921.z)); + phi_3125_ = true; break; } case 1: { - if _e323 { - phi_5290_ = (_e2006.member_1 <= (_e117 - 8u)); + if _e295 { + phi_5369_ = (_e1976.member_1 <= (_e110 - 8u)); } else { - phi_5290_ = false; + phi_5369_ = false; } - let _e2391 = phi_5290_; - if _e2391 { - let _e2394 = global.member[_e2006.member_1]; - let _e2399 = global.member[(_e2006.member_1 + 1u)]; - let _e2404 = global.member[(_e2006.member_1 + 2u)]; - let _e2410 = global.member[(_e2006.member_1 + 3u)]; - let _e2415 = global.member[(_e2006.member_1 + 4u)]; - let _e2420 = global.member[(_e2006.member_1 + 5u)]; - let _e2425 = global.member[(_e2006.member_1 + 6u)]; - let _e2431 = global.member[(_e2006.member_1 + 7u)]; - phi_2505_ = type_35(vec3(bitcast(_e2394), bitcast(_e2399), bitcast(_e2404)), vec4(bitcast(_e2410), bitcast(_e2415), bitcast(_e2420), bitcast(_e2425)), bitcast(_e2431)); + let _e2361 = phi_5369_; + if _e2361 { + let _e2364 = global.member[_e1976.member_1]; + let _e2369 = global.member[(_e1976.member_1 + 1u)]; + let _e2374 = global.member[(_e1976.member_1 + 2u)]; + let _e2380 = global.member[(_e1976.member_1 + 3u)]; + let _e2385 = global.member[(_e1976.member_1 + 4u)]; + let _e2390 = global.member[(_e1976.member_1 + 5u)]; + let _e2395 = global.member[(_e1976.member_1 + 6u)]; + let _e2401 = global.member[(_e1976.member_1 + 7u)]; + phi_2626_ = type_34(vec3(bitcast(_e2364), bitcast(_e2369), bitcast(_e2374)), vec4(bitcast(_e2380), bitcast(_e2385), bitcast(_e2390), bitcast(_e2395)), bitcast(_e2401)); } else { - phi_2505_ = type_35(vec3(0f, 0f, 0f), vec4(1f, 1f, 1f, 1f), 1f); + phi_2626_ = type_34(vec3(0f, 0f, 0f), vec4(1f, 1f, 1f, 1f), 1f); } - let _e2435 = phi_2505_; - let _e2464 = (vec3((_e2067.member.x + fma(_e2106.x, _e2435.member.z, fma(_e2104.x, _e2435.member.y, (_e2102.x * _e2435.member.x)))), (_e2067.member.y + fma(_e2106.y, _e2435.member.z, fma(_e2104.y, _e2435.member.y, (_e2102.y * _e2435.member.x)))), (_e2067.member.z + fma(_e2106.z, _e2435.member.z, fma(_e2104.z, _e2435.member.y, (_e2102.z * _e2435.member.x))))) - _e127); - let _e2471 = sqrt(fma(_e2464.z, _e2464.z, fma(_e2464.x, _e2464.x, (_e2464.y * _e2464.y)))); - let _e2472 = (_e2471 == 0f); - if _e2472 { - phi_2690_ = vec3(); + let _e2405 = phi_2626_; + let _e2434 = (vec3((_e2037.member.x + fma(_e2076.x, _e2405.member.z, fma(_e2074.x, _e2405.member.y, (_e2072.x * _e2405.member.x)))), (_e2037.member.y + fma(_e2076.y, _e2405.member.z, fma(_e2074.y, _e2405.member.y, (_e2072.y * _e2405.member.x)))), (_e2037.member.z + fma(_e2076.z, _e2405.member.z, fma(_e2074.z, _e2405.member.y, (_e2072.z * _e2405.member.x))))) - _e118); + let _e2441 = sqrt(fma(_e2434.z, _e2434.z, fma(_e2434.x, _e2434.x, (_e2434.y * _e2434.y)))); + let _e2442 = (_e2441 == 0f); + if _e2442 { + phi_2812_ = vec3(); } else { - if _e2472 { - phi_5336_ = vec3(0f, 0f, 0f); + if _e2442 { + phi_5415_ = vec3(0f, 0f, 0f); } else { - phi_5336_ = (_e2464 * (1f / _e2471)); + phi_5415_ = (_e2434 * (1f / _e2441)); } - let _e2476 = phi_5336_; - let _e2478 = (_e2435.member_2 / (_e2471 * _e2471)); - let _e2482 = fma(fma(_e1383, _e121.x, -0.4f), _e1406, 0.4f); - let _e2483 = fma(fma(_e1386, _e121.y, -0.4f), _e1406, 0.4f); - let _e2484 = fma(fma(_e1389, _e121.z, -0.4f), _e1406, 0.4f); - let _e2491 = (_e1946 + _e2476); - let _e2498 = sqrt(fma(_e2491.z, _e2491.z, fma(_e2491.x, _e2491.x, (_e2491.y * _e2491.y)))); - if (_e2498 == 0f) { - phi_5371_ = vec3(0f, 0f, 0f); + let _e2446 = phi_5415_; + let _e2448 = (_e2405.member_2 / (_e2441 * _e2441)); + let _e2450 = fma(-(_e680.z), _e289.member_3, 1f); + let _e2454 = fma(0.4f, _e2450, (_e1364 * _e1376)); + let _e2455 = fma(0.4f, _e2450, (_e1366 * _e1376)); + let _e2456 = fma(0.4f, _e2450, (_e1368 * _e1376)); + let _e2463 = (_e1916 + _e2446); + let _e2470 = sqrt(fma(_e2463.z, _e2463.z, fma(_e2463.x, _e2463.x, (_e2463.y * _e2463.y)))); + if (_e2470 == 0f) { + phi_5450_ = vec3(0f, 0f, 0f); } else { - phi_5371_ = (_e2491 * (1f / _e2498)); + phi_5450_ = (_e2463 * (1f / _e2470)); } - let _e2503 = phi_5371_; - let _e2504 = (_e1403 * _e1403); - let _e2515 = max(fma(_e1942.z, _e2503.z, fma(_e1942.x, _e2503.x, (_e1942.y * _e2503.y))), 0f); - let _e2528 = max(fma(_e1942.z, _e1946.z, fma(_e1942.x, _e1946.x, (_e1942.y * _e1946.y))), 0f); - let _e2535 = max(fma(_e1942.z, _e2476.z, fma(_e1942.x, _e2476.x, (_e1942.y * _e2476.y))), 0f); - let _e2536 = fma(_e710.y, _e317.member_4, 1f); - let _e2537 = (_e2536 * _e2536); - let _e2538 = (_e2537 * 0.125f); - let _e2540 = fma(-(_e2537), 0.125f, 1f); - let _e2553 = (1f - max(fma(_e2503.z, _e1946.z, fma(_e2503.x, _e1946.x, (_e2503.y * _e1946.y))), 0f)); - let _e2555 = select(_e2553, 0f, (_e2553 < 0f)); - let _e2558 = pow(select(_e2555, 1f, (_e2555 > 1f)), 5f); - let _e2559 = fma((1f - _e2482), _e2558, _e2482); - let _e2560 = fma((1f - _e2483), _e2558, _e2483); - let _e2561 = fma((1f - _e2484), _e2558, _e2484); - let _e2566 = fma(-(_e710.z), _e317.member_3, 1f); - let _e2570 = (((_e2504 * _e2504) / (pow(fma((_e2515 * _e2515), fma(_e2504, _e2504, -1f), 1f), 2f) * 3.1415927f)) * ((_e2528 / fma(_e2528, _e2540, _e2538)) * (_e2535 / fma(_e2535, _e2540, _e2538)))); - let _e2575 = fma((4f * _e2528), _e2535, 0.0001f); - phi_2690_ = vec3(fma((fma((((1f - _e2559) * _e2566) * _e1394), 0.31830987f, ((_e2570 * _e2559) / _e2575)) * (_e2435.member_1.x * _e2478)), _e2535, _e1951.x), fma((fma((((1f - _e2560) * _e2566) * _e1396), 0.31830987f, ((_e2570 * _e2560) / _e2575)) * (_e2435.member_1.y * _e2478)), _e2535, _e1951.y), fma((fma((((1f - _e2561) * _e2566) * _e1398), 0.31830987f, ((_e2570 * _e2561) / _e2575)) * (_e2435.member_1.z * _e2478)), _e2535, _e1951.z)); + let _e2475 = phi_5450_; + let _e2476 = (_e1373 * _e1373); + let _e2487 = max(fma(_e1912.z, _e2475.z, fma(_e1912.x, _e2475.x, (_e1912.y * _e2475.y))), 0f); + let _e2500 = max(fma(_e1912.z, _e1916.z, fma(_e1912.x, _e1916.x, (_e1912.y * _e1916.y))), 0f); + let _e2507 = max(fma(_e1912.z, _e2446.z, fma(_e1912.x, _e2446.x, (_e1912.y * _e2446.y))), 0f); + let _e2508 = fma(_e680.y, _e289.member_4, 1f); + let _e2509 = (_e2508 * _e2508); + let _e2510 = (_e2509 * 0.125f); + let _e2512 = fma(-(_e2509), 0.125f, 1f); + let _e2525 = (1f - max(fma(_e2475.z, _e1916.z, fma(_e2475.x, _e1916.x, (_e2475.y * _e1916.y))), 0f)); + let _e2527 = select(_e2525, 0f, (_e2525 < 0f)); + let _e2530 = pow(select(_e2527, 1f, (_e2527 > 1f)), 5f); + let _e2531 = fma((1f - _e2454), _e2530, _e2454); + let _e2532 = fma((1f - _e2455), _e2530, _e2455); + let _e2533 = fma((1f - _e2456), _e2530, _e2456); + let _e2540 = (((_e2476 * _e2476) / (pow(fma((_e2487 * _e2487), fma(_e2476, _e2476, -1f), 1f), 2f) * 3.1415927f)) * ((_e2500 / fma(_e2500, _e2512, _e2510)) * (_e2507 / fma(_e2507, _e2512, _e2510)))); + let _e2545 = fma((4f * _e2500), _e2507, 0.0001f); + phi_2812_ = vec3(fma((fma((((1f - _e2531) * _e2450) * _e1364), 0.31830987f, ((_e2540 * _e2531) / _e2545)) * (_e2405.member_1.x * _e2448)), _e2507, _e1921.x), fma((fma((((1f - _e2532) * _e2450) * _e1366), 0.31830987f, ((_e2540 * _e2532) / _e2545)) * (_e2405.member_1.y * _e2448)), _e2507, _e1921.y), fma((fma((((1f - _e2533) * _e2450) * _e1368), 0.31830987f, ((_e2540 * _e2533) / _e2545)) * (_e2405.member_1.z * _e2448)), _e2507, _e1921.z)); } - let _e2596 = phi_2690_; - phi_3001_ = _e2596; - phi_3002_ = select(true, false, _e2472); + let _e2566 = phi_2812_; + phi_3124_ = _e2566; + phi_3125_ = select(true, false, _e2442); break; } case 2: { - if (_e117 >= 13u) { - phi_5463_ = (_e2006.member_1 <= (_e117 - 13u)); + if (_e110 >= 13u) { + phi_5542_ = (_e1976.member_1 <= (_e110 - 13u)); } else { - phi_5463_ = false; + phi_5542_ = false; } - let _e2117 = phi_5463_; - if _e2117 { - let _e2120 = global.member[_e2006.member_1]; - let _e2125 = global.member[(_e2006.member_1 + 1u)]; - let _e2130 = global.member[(_e2006.member_1 + 2u)]; - let _e2136 = global.member[(_e2006.member_1 + 3u)]; - let _e2141 = global.member[(_e2006.member_1 + 4u)]; - let _e2146 = global.member[(_e2006.member_1 + 5u)]; - let _e2152 = global.member[(_e2006.member_1 + 6u)]; - let _e2157 = global.member[(_e2006.member_1 + 7u)]; - let _e2162 = global.member[(_e2006.member_1 + 8u)]; - let _e2167 = global.member[(_e2006.member_1 + 9u)]; - let _e2172 = global.member[(_e2006.member_1 + 10u)]; - let _e2177 = global.member[(_e2006.member_1 + 11u)]; - let _e2183 = global.member[(_e2006.member_1 + 12u)]; - phi_2753_ = type_36(vec3(bitcast(_e2120), bitcast(_e2125), bitcast(_e2130)), vec3(bitcast(_e2136), bitcast(_e2141), bitcast(_e2146)), bitcast(_e2152), bitcast(_e2157), vec4(bitcast(_e2162), bitcast(_e2167), bitcast(_e2172), bitcast(_e2177)), bitcast(_e2183)); + let _e2087 = phi_5542_; + if _e2087 { + let _e2090 = global.member[_e1976.member_1]; + let _e2095 = global.member[(_e1976.member_1 + 1u)]; + let _e2100 = global.member[(_e1976.member_1 + 2u)]; + let _e2106 = global.member[(_e1976.member_1 + 3u)]; + let _e2111 = global.member[(_e1976.member_1 + 4u)]; + let _e2116 = global.member[(_e1976.member_1 + 5u)]; + let _e2122 = global.member[(_e1976.member_1 + 6u)]; + let _e2127 = global.member[(_e1976.member_1 + 7u)]; + let _e2132 = global.member[(_e1976.member_1 + 8u)]; + let _e2137 = global.member[(_e1976.member_1 + 9u)]; + let _e2142 = global.member[(_e1976.member_1 + 10u)]; + let _e2147 = global.member[(_e1976.member_1 + 11u)]; + let _e2153 = global.member[(_e1976.member_1 + 12u)]; + phi_2875_ = type_35(vec3(bitcast(_e2090), bitcast(_e2095), bitcast(_e2100)), vec3(bitcast(_e2106), bitcast(_e2111), bitcast(_e2116)), bitcast(_e2122), bitcast(_e2127), vec4(bitcast(_e2132), bitcast(_e2137), bitcast(_e2142), bitcast(_e2147)), bitcast(_e2153)); } else { - phi_2753_ = type_36(vec3(0f, 0f, 0f), vec3(0f, -1f, 0f), 1.0471976f, 1.5707964f, vec4(1f, 1f, 1f, 1f), 1f); + phi_2875_ = type_35(vec3(0f, 0f, 0f), vec3(0f, -1f, 0f), 1.0471976f, 1.5707964f, vec4(1f, 1f, 1f, 1f), 1f); } - let _e2187 = phi_2753_; - let _e2219 = (vec3((_e2067.member.x + fma(_e2106.x, _e2187.member.z, fma(_e2104.x, _e2187.member.y, (_e2102.x * _e2187.member.x)))), (_e2067.member.y + fma(_e2106.y, _e2187.member.z, fma(_e2104.y, _e2187.member.y, (_e2102.y * _e2187.member.x)))), (_e2067.member.z + fma(_e2106.z, _e2187.member.z, fma(_e2104.z, _e2187.member.y, (_e2102.z * _e2187.member.x))))) - _e127); - let _e2226 = sqrt(fma(_e2219.z, _e2219.z, fma(_e2219.x, _e2219.x, (_e2219.y * _e2219.y)))); - let _e2227 = (_e2226 == 0f); - if _e2227 { - phi_2999_ = vec3(); + let _e2157 = phi_2875_; + let _e2189 = (vec3((_e2037.member.x + fma(_e2076.x, _e2157.member.z, fma(_e2074.x, _e2157.member.y, (_e2072.x * _e2157.member.x)))), (_e2037.member.y + fma(_e2076.y, _e2157.member.z, fma(_e2074.y, _e2157.member.y, (_e2072.y * _e2157.member.x)))), (_e2037.member.z + fma(_e2076.z, _e2157.member.z, fma(_e2074.z, _e2157.member.y, (_e2072.z * _e2157.member.x))))) - _e118); + let _e2196 = sqrt(fma(_e2189.z, _e2189.z, fma(_e2189.x, _e2189.x, (_e2189.y * _e2189.y)))); + let _e2197 = (_e2196 == 0f); + if _e2197 { + phi_3122_ = vec3(); } else { - if _e2227 { - phi_5513_ = vec3(0f, 0f, 0f); + if _e2197 { + phi_5592_ = vec3(0f, 0f, 0f); } else { - phi_5513_ = (_e2219 * (1f / _e2226)); + phi_5592_ = (_e2189 * (1f / _e2196)); } - let _e2231 = phi_5513_; - let _e2241 = fma(_e2106.x, _e2187.member_1.z, fma(_e2104.x, _e2187.member_1.y, (_e2102.x * _e2187.member_1.x))); - let _e2242 = fma(_e2106.y, _e2187.member_1.z, fma(_e2104.y, _e2187.member_1.y, (_e2102.y * _e2187.member_1.x))); - let _e2243 = fma(_e2106.z, _e2187.member_1.z, fma(_e2104.z, _e2187.member_1.y, (_e2102.z * _e2187.member_1.x))); - let _e2248 = sqrt(fma(_e2243, _e2243, fma(_e2241, _e2241, (_e2242 * _e2242)))); - if (_e2248 == 0f) { - phi_5548_ = vec3(0f, 0f, 0f); + let _e2201 = phi_5592_; + let _e2211 = fma(_e2076.x, _e2157.member_1.z, fma(_e2074.x, _e2157.member_1.y, (_e2072.x * _e2157.member_1.x))); + let _e2212 = fma(_e2076.y, _e2157.member_1.z, fma(_e2074.y, _e2157.member_1.y, (_e2072.y * _e2157.member_1.x))); + let _e2213 = fma(_e2076.z, _e2157.member_1.z, fma(_e2074.z, _e2157.member_1.y, (_e2072.z * _e2157.member_1.x))); + let _e2218 = sqrt(fma(_e2213, _e2213, fma(_e2211, _e2211, (_e2212 * _e2212)))); + if (_e2218 == 0f) { + phi_5627_ = vec3(0f, 0f, 0f); } else { - phi_5548_ = (vec3(_e2241, _e2242, _e2243) * (1f / _e2248)); + phi_5627_ = (vec3(_e2211, _e2212, _e2213) * (1f / _e2218)); } - let _e2253 = phi_5548_; - let _e2265 = ((fma(_e2231.z, _e2253.z, fma(_e2231.x, _e2253.x, (_e2231.y * _e2253.y))) - _e2187.member_3) / (_e2187.member_2 - _e2187.member_3)); - let _e2267 = select(_e2265, 0f, (_e2265 < 0f)); - let _e2270 = (_e2187.member_5 * select(_e2267, 1f, (_e2267 > 1f))); - let _e2274 = fma(fma(_e1383, _e121.x, -0.4f), _e1406, 0.4f); - let _e2275 = fma(fma(_e1386, _e121.y, -0.4f), _e1406, 0.4f); - let _e2276 = fma(fma(_e1389, _e121.z, -0.4f), _e1406, 0.4f); - let _e2283 = (_e1946 + _e2231); - let _e2290 = sqrt(fma(_e2283.z, _e2283.z, fma(_e2283.x, _e2283.x, (_e2283.y * _e2283.y)))); - if (_e2290 == 0f) { - phi_5583_ = vec3(0f, 0f, 0f); + let _e2223 = phi_5627_; + let _e2235 = ((fma(_e2201.z, _e2223.z, fma(_e2201.x, _e2223.x, (_e2201.y * _e2223.y))) - _e2157.member_3) / (_e2157.member_2 - _e2157.member_3)); + let _e2237 = select(_e2235, 0f, (_e2235 < 0f)); + let _e2240 = (_e2157.member_5 * select(_e2237, 1f, (_e2237 > 1f))); + let _e2242 = fma(-(_e680.z), _e289.member_3, 1f); + let _e2246 = fma(0.4f, _e2242, (_e1364 * _e1376)); + let _e2247 = fma(0.4f, _e2242, (_e1366 * _e1376)); + let _e2248 = fma(0.4f, _e2242, (_e1368 * _e1376)); + let _e2255 = (_e1916 + _e2201); + let _e2262 = sqrt(fma(_e2255.z, _e2255.z, fma(_e2255.x, _e2255.x, (_e2255.y * _e2255.y)))); + if (_e2262 == 0f) { + phi_5662_ = vec3(0f, 0f, 0f); } else { - phi_5583_ = (_e2283 * (1f / _e2290)); + phi_5662_ = (_e2255 * (1f / _e2262)); } - let _e2295 = phi_5583_; - let _e2296 = (_e1403 * _e1403); - let _e2307 = max(fma(_e1942.z, _e2295.z, fma(_e1942.x, _e2295.x, (_e1942.y * _e2295.y))), 0f); - let _e2320 = max(fma(_e1942.z, _e1946.z, fma(_e1942.x, _e1946.x, (_e1942.y * _e1946.y))), 0f); - let _e2324 = max(fma(_e1942.z, _e2231.z, fma(_e1942.x, _e2231.x, (_e1942.y * _e2231.y))), 0f); - let _e2325 = fma(_e710.y, _e317.member_4, 1f); - let _e2326 = (_e2325 * _e2325); - let _e2327 = (_e2326 * 0.125f); - let _e2329 = fma(-(_e2326), 0.125f, 1f); - let _e2342 = (1f - max(fma(_e2295.z, _e1946.z, fma(_e2295.x, _e1946.x, (_e2295.y * _e1946.y))), 0f)); - let _e2344 = select(_e2342, 0f, (_e2342 < 0f)); - let _e2347 = pow(select(_e2344, 1f, (_e2344 > 1f)), 5f); - let _e2348 = fma((1f - _e2274), _e2347, _e2274); - let _e2349 = fma((1f - _e2275), _e2347, _e2275); - let _e2350 = fma((1f - _e2276), _e2347, _e2276); - let _e2355 = fma(-(_e710.z), _e317.member_3, 1f); - let _e2359 = (((_e2296 * _e2296) / (pow(fma((_e2307 * _e2307), fma(_e2296, _e2296, -1f), 1f), 2f) * 3.1415927f)) * ((_e2320 / fma(_e2320, _e2329, _e2327)) * (_e2324 / fma(_e2324, _e2329, _e2327)))); - let _e2364 = fma((4f * _e2320), _e2324, 0.0001f); - phi_2999_ = vec3(fma((fma((((1f - _e2348) * _e2355) * _e1394), 0.31830987f, ((_e2359 * _e2348) / _e2364)) * (_e2187.member_4.x * _e2270)), _e2324, _e1951.x), fma((fma((((1f - _e2349) * _e2355) * _e1396), 0.31830987f, ((_e2359 * _e2349) / _e2364)) * (_e2187.member_4.y * _e2270)), _e2324, _e1951.y), fma((fma((((1f - _e2350) * _e2355) * _e1398), 0.31830987f, ((_e2359 * _e2350) / _e2364)) * (_e2187.member_4.z * _e2270)), _e2324, _e1951.z)); + let _e2267 = phi_5662_; + let _e2268 = (_e1373 * _e1373); + let _e2279 = max(fma(_e1912.z, _e2267.z, fma(_e1912.x, _e2267.x, (_e1912.y * _e2267.y))), 0f); + let _e2292 = max(fma(_e1912.z, _e1916.z, fma(_e1912.x, _e1916.x, (_e1912.y * _e1916.y))), 0f); + let _e2296 = max(fma(_e1912.z, _e2201.z, fma(_e1912.x, _e2201.x, (_e1912.y * _e2201.y))), 0f); + let _e2297 = fma(_e680.y, _e289.member_4, 1f); + let _e2298 = (_e2297 * _e2297); + let _e2299 = (_e2298 * 0.125f); + let _e2301 = fma(-(_e2298), 0.125f, 1f); + let _e2314 = (1f - max(fma(_e2267.z, _e1916.z, fma(_e2267.x, _e1916.x, (_e2267.y * _e1916.y))), 0f)); + let _e2316 = select(_e2314, 0f, (_e2314 < 0f)); + let _e2319 = pow(select(_e2316, 1f, (_e2316 > 1f)), 5f); + let _e2320 = fma((1f - _e2246), _e2319, _e2246); + let _e2321 = fma((1f - _e2247), _e2319, _e2247); + let _e2322 = fma((1f - _e2248), _e2319, _e2248); + let _e2329 = (((_e2268 * _e2268) / (pow(fma((_e2279 * _e2279), fma(_e2268, _e2268, -1f), 1f), 2f) * 3.1415927f)) * ((_e2292 / fma(_e2292, _e2301, _e2299)) * (_e2296 / fma(_e2296, _e2301, _e2299)))); + let _e2334 = fma((4f * _e2292), _e2296, 0.0001f); + phi_3122_ = vec3(fma((fma((((1f - _e2320) * _e2242) * _e1364), 0.31830987f, ((_e2329 * _e2320) / _e2334)) * (_e2157.member_4.x * _e2240)), _e2296, _e1921.x), fma((fma((((1f - _e2321) * _e2242) * _e1366), 0.31830987f, ((_e2329 * _e2321) / _e2334)) * (_e2157.member_4.y * _e2240)), _e2296, _e1921.y), fma((fma((((1f - _e2322) * _e2242) * _e1368), 0.31830987f, ((_e2329 * _e2322) / _e2334)) * (_e2157.member_4.z * _e2240)), _e2296, _e1921.z)); } - let _e2385 = phi_2999_; - phi_3001_ = _e2385; - phi_3002_ = select(true, false, _e2227); + let _e2355 = phi_3122_; + phi_3124_ = _e2355; + phi_3125_ = select(true, false, _e2197); break; } default: { - phi_3001_ = vec3(); - phi_3002_ = bool(); + phi_3124_ = vec3(); + phi_3125_ = bool(); break; } } - let _e2810 = phi_3001_; - let _e2812 = phi_3002_; - phi_3011_ = select(_e2810, _e1951, vec3(select(true, false, _e2812))); + let _e2780 = phi_3124_; + let _e2782 = phi_3125_; + phi_3134_ = select(_e2780, _e1921, vec3(select(true, false, _e2782))); } - let _e2817 = phi_3011_; - phi_2147_ = _e2817; - phi_3013_ = select(true, false, _e1984); + let _e2787 = phi_3134_; + phi_2267_ = _e2787; + phi_3136_ = select(true, false, _e1954); break; } default: { - phi_2147_ = vec3(); - phi_3013_ = bool(); + phi_2267_ = vec3(); + phi_3136_ = bool(); break; } } - let _e2820 = phi_2147_; - let _e2822 = phi_3013_; + let _e2790 = phi_2267_; + let _e2792 = phi_3136_; continue; continuing { - phi_2143_ = _e1964; - phi_2146_ = _e2820; - break if !(_e2822); + phi_2263_ = _e1934; + phi_2266_ = _e2790; + break if !(_e2792); } } - let _e2827 = fma(fma(_e1383, _e121.x, -0.04f), _e1406, 0.04f); - let _e2828 = fma(fma(_e1386, _e121.y, -0.04f), _e1406, 0.04f); - let _e2829 = fma(fma(_e1389, _e121.z, -0.04f), _e1406, 0.04f); - let _e2841 = fma(-(_e710.y), _e317.member_4, 1f); - let _e2848 = (1f - max(fma(_e1942.z, _e1946.z, fma(_e1942.x, _e1946.x, (_e1942.y * _e1946.y))), 0f)); - let _e2850 = select(_e2848, 0f, (_e2848 < 0f)); - let _e2853 = pow(select(_e2850, 1f, (_e2850 > 1f)), 5f); - let _e2854 = fma((max(_e2841, _e2827) - _e2827), _e2853, _e2827); - let _e2855 = fma((max(_e2841, _e2828) - _e2828), _e2853, _e2828); - let _e2856 = fma((max(_e2841, _e2829) - _e2829), _e2853, _e2829); - let _e2861 = fma(-(_e710.z), _e317.member_3, 1f); - let _e2878 = local_2; - let _e2882 = local_3; - let _e2886 = local_4; - phi_3125_ = vec4(fma(_e1416, _e317.member_1, fma(fma(((1f - _e2854) * _e2861), (_e1425.x * _e1394), (_e1757.x * fma(_e2854, _e1773.x, _e1773.y))), _e1410, _e2878.x)), fma(_e1418, _e317.member_1, fma(fma(((1f - _e2855) * _e2861), (_e1425.y * _e1396), (_e1757.y * fma(_e2855, _e1773.x, _e1773.y))), _e1410, _e2882.y)), fma(_e1420, _e317.member_1, fma(fma(((1f - _e2856) * _e2861), (_e1425.z * _e1398), (_e1757.z * fma(_e2856, _e1773.x, _e1773.y))), _e1410, _e2886.z)), 1f); + let _e2795 = fma(-(_e680.z), _e289.member_3, 1f); + let _e2799 = fma(0.04f, _e2795, (_e1364 * _e1376)); + let _e2800 = fma(0.04f, _e2795, (_e1366 * _e1376)); + let _e2801 = fma(0.04f, _e2795, (_e1368 * _e1376)); + let _e2813 = fma(-(_e680.y), _e289.member_4, 1f); + let _e2820 = (1f - max(fma(_e1912.z, _e1916.z, fma(_e1912.x, _e1916.x, (_e1912.y * _e1916.y))), 0f)); + let _e2822 = select(_e2820, 0f, (_e2820 < 0f)); + let _e2825 = pow(select(_e2822, 1f, (_e2822 > 1f)), 5f); + let _e2826 = fma((max(_e2813, _e2799) - _e2799), _e2825, _e2799); + let _e2827 = fma((max(_e2813, _e2800) - _e2800), _e2825, _e2800); + let _e2828 = fma((max(_e2813, _e2801) - _e2801), _e2825, _e2801); + let _e2848 = local_2; + let _e2852 = local_3; + let _e2856 = local_4; + phi_3249_ = vec4(fma(_e1386, _e289.member_1, fma(fma(((1f - _e2826) * _e2795), (_e1395.x * _e1364), (_e1727.x * fma(_e2826, _e1743.x, _e1743.y))), _e1380, _e2848.x)), fma(_e1388, _e289.member_1, fma(fma(((1f - _e2827) * _e2795), (_e1395.y * _e1366), (_e1727.y * fma(_e2827, _e1743.x, _e1743.y))), _e1380, _e2852.y)), fma(_e1390, _e289.member_1, fma(fma(((1f - _e2828) * _e2795), (_e1395.z * _e1368), (_e1727.z * fma(_e2828, _e1743.x, _e1743.y))), _e1380, _e2856.z)), 1f); } else { - phi_3125_ = (vec4((_e121.x * _e516.x), (_e121.y * _e516.y), (_e121.z * _e516.z), (_e121.w * _e516.w)) * _e317.member_2); + phi_3249_ = (vec4((_e112.x * _e486.x), (_e112.y * _e486.y), (_e112.z * _e486.z), (_e112.w * _e486.w)) * _e289.member_2); } - let _e2894 = phi_3125_; - global_19 = _e2894; + let _e2864 = phi_3249_; + global_17 = _e2864; break; } case 1: { - let _e1915 = sqrt(fma(_e122.x, _e122.x, (_e122.y * _e122.y))); - if (_e1915 == 0f) { - phi_5702_ = vec3(0f, 0f, 0f); + let _e1885 = sqrt(fma(_e113.x, _e113.x, (_e113.y * _e113.y))); + if (_e1885 == 0f) { + phi_5781_ = vec3(0f, 0f, 0f); } else { - phi_5702_ = (vec3(_e122.x, _e122.y, 0f) * (1f / _e1915)); + phi_5781_ = (vec3(_e113.x, _e113.y, 0f) * (1f / _e1885)); } - let _e1920 = phi_5702_; - global_19 = vec4(((_e1920.x + 1f) * 0.5f), ((_e1920.y + 1f) * 0.5f), ((_e1920.z + 1f) * 0.5f), 1f); + let _e1890 = phi_5781_; + global_17 = vec4(((_e1890.x + 1f) * 0.5f), ((_e1890.y + 1f) * 0.5f), ((_e1890.z + 1f) * 0.5f), 1f); break; } case 2: { - let _e1894 = sqrt(fma(_e123.x, _e123.x, (_e123.y * _e123.y))); - if (_e1894 == 0f) { - phi_5751_ = vec3(0f, 0f, 0f); + let _e1864 = sqrt(fma(_e114.x, _e114.x, (_e114.y * _e114.y))); + if (_e1864 == 0f) { + phi_5830_ = vec3(0f, 0f, 0f); } else { - phi_5751_ = (vec3(_e123.x, _e123.y, 0f) * (1f / _e1894)); + phi_5830_ = (vec3(_e114.x, _e114.y, 0f) * (1f / _e1864)); } - let _e1899 = phi_5751_; - global_19 = vec4(((_e1899.x + 1f) * 0.5f), ((_e1899.y + 1f) * 0.5f), ((_e1899.z + 1f) * 0.5f), 1f); + let _e1869 = phi_5830_; + global_17 = vec4(((_e1869.x + 1f) * 0.5f), ((_e1869.y + 1f) * 0.5f), ((_e1869.z + 1f) * 0.5f), 1f); break; } case 3: { - if _e1736 { - phi_5800_ = vec3(0f, 0f, 0f); + if _e1706 { + phi_5879_ = vec3(0f, 0f, 0f); } else { - phi_5800_ = (_e1379 * (1f / _e1735)); + phi_5879_ = (_e1349 * (1f / _e1705)); } - let _e1878 = phi_5800_; - global_19 = vec4(((_e1878.x + 1f) * 0.5f), ((_e1878.y + 1f) * 0.5f), ((_e1878.z + 1f) * 0.5f), 1f); + let _e1848 = phi_5879_; + global_17 = vec4(((_e1848.x + 1f) * 0.5f), ((_e1848.y + 1f) * 0.5f), ((_e1848.z + 1f) * 0.5f), 1f); break; } case 4: { - global_19 = _e121; + global_17 = _e112; break; } case 5: { - let _e1859 = sqrt(fma(_e124.z, _e124.z, fma(_e124.x, _e124.x, (_e124.y * _e124.y)))); - if (_e1859 == 0f) { - phi_5849_ = vec3(0f, 0f, 0f); + let _e1829 = sqrt(fma(_e115.z, _e115.z, fma(_e115.x, _e115.x, (_e115.y * _e115.y)))); + if (_e1829 == 0f) { + phi_5928_ = vec3(0f, 0f, 0f); } else { - phi_5849_ = (_e124 * (1f / _e1859)); + phi_5928_ = (_e115 * (1f / _e1829)); } - let _e1864 = phi_5849_; - global_19 = vec4(((_e1864.x + 1f) * 0.5f), ((_e1864.y + 1f) * 0.5f), ((_e1864.z + 1f) * 0.5f), 1f); + let _e1834 = phi_5928_; + global_17 = vec4(((_e1834.x + 1f) * 0.5f), ((_e1834.y + 1f) * 0.5f), ((_e1834.z + 1f) * 0.5f), 1f); break; } case 6: { - let _e1837 = sqrt(fma(_e1377.z, _e1377.z, fma(_e1377.x, _e1377.x, (_e1377.y * _e1377.y)))); - if (_e1837 == 0f) { - phi_5898_ = vec3(0f, 0f, 0f); + let _e1807 = sqrt(fma(_e1347.z, _e1347.z, fma(_e1347.x, _e1347.x, (_e1347.y * _e1347.y)))); + if (_e1807 == 0f) { + phi_5977_ = vec3(0f, 0f, 0f); } else { - phi_5898_ = (_e1377 * (1f / _e1837)); + phi_5977_ = (_e1347 * (1f / _e1807)); } - let _e1842 = phi_5898_; - global_19 = vec4(((_e1842.x + 1f) * 0.5f), ((_e1842.y + 1f) * 0.5f), ((_e1842.z + 1f) * 0.5f), 1f); + let _e1812 = phi_5977_; + global_17 = vec4(((_e1812.x + 1f) * 0.5f), ((_e1812.y + 1f) * 0.5f), ((_e1812.z + 1f) * 0.5f), 1f); break; } case 7: { - let _e1815 = sqrt(fma(_e125.z, _e125.z, fma(_e125.x, _e125.x, (_e125.y * _e125.y)))); - if (_e1815 == 0f) { - phi_5947_ = vec3(0f, 0f, 0f); + let _e1785 = sqrt(fma(_e116.z, _e116.z, fma(_e116.x, _e116.x, (_e116.y * _e116.y)))); + if (_e1785 == 0f) { + phi_6026_ = vec3(0f, 0f, 0f); } else { - phi_5947_ = (_e125 * (1f / _e1815)); + phi_6026_ = (_e116 * (1f / _e1785)); } - let _e1820 = phi_5947_; - global_19 = vec4(((_e1820.x + 1f) * 0.5f), ((_e1820.y + 1f) * 0.5f), ((_e1820.z + 1f) * 0.5f), 1f); + let _e1790 = phi_6026_; + global_17 = vec4(((_e1790.x + 1f) * 0.5f), ((_e1790.y + 1f) * 0.5f), ((_e1790.z + 1f) * 0.5f), 1f); break; } case 8: { - let _e1793 = sqrt(fma(_e126.z, _e126.z, fma(_e126.x, _e126.x, (_e126.y * _e126.y)))); - if (_e1793 == 0f) { - phi_5996_ = vec3(0f, 0f, 0f); + let _e1763 = sqrt(fma(_e117.z, _e117.z, fma(_e117.x, _e117.x, (_e117.y * _e117.y)))); + if (_e1763 == 0f) { + phi_6075_ = vec3(0f, 0f, 0f); } else { - phi_5996_ = (_e126 * (1f / _e1793)); + phi_6075_ = (_e117 * (1f / _e1763)); } - let _e1798 = phi_5996_; - global_19 = vec4(((_e1798.x + 1f) * 0.5f), ((_e1798.y + 1f) * 0.5f), ((_e1798.z + 1f) * 0.5f), 1f); + let _e1768 = phi_6075_; + global_17 = vec4(((_e1768.x + 1f) * 0.5f), ((_e1768.y + 1f) * 0.5f), ((_e1768.z + 1f) * 0.5f), 1f); break; } case 9: { - global_19 = vec4(_e1425.x, _e1425.y, _e1425.z, 1f); + global_17 = vec4(_e1395.x, _e1395.y, _e1395.z, 1f); break; } case 10: { - global_19 = vec4(_e1757.x, _e1757.y, _e1757.z, 1f); + global_17 = vec4(_e1727.x, _e1727.y, _e1727.z, 1f); break; } case 11: { - global_19 = vec4(_e1773.x, _e1773.y, 1f, 1f); + global_17 = vec4(_e1743.x, _e1743.y, 1f, 1f); break; } case 12: { - global_19 = (vec4(_e1383, _e1386, _e1389, (_e516.w * _e317.member_2.w)) * _e121); + global_17 = (vec4(_e1353, _e1356, _e1359, (_e486.w * _e289.member_2.w)) * _e112); break; } case 13: { - global_19 = vec4(_e1403, _e1403, _e1403, 1f); + global_17 = vec4(_e1373, _e1373, _e1373, 1f); break; } case 14: { - global_19 = vec4(_e1406, _e1406, _e1406, 1f); + global_17 = vec4(_e1376, _e1376, _e1376, 1f); break; } case 15: { - global_19 = vec4(_e1410, _e1410, _e1410, 1f); + global_17 = vec4(_e1380, _e1380, _e1380, 1f); break; } case 16: { - global_19 = vec4((_e1416 * _e317.member_1), (_e1418 * _e317.member_1), (_e1420 * _e317.member_1), 1f); + global_17 = vec4((_e1386 * _e289.member_1), (_e1388 * _e289.member_1), (_e1390 * _e289.member_1), 1f); break; } case 17: { - global_19 = vec4(_e1292.x, _e1292.y, _e1292.z, 1f); + global_17 = vec4(_e1262.x, _e1262.y, _e1262.z, 1f); break; } case 18: { - global_19 = vec4(_e317.member.x, _e317.member.y, _e317.member.z, 1f); + global_17 = vec4(_e289.member.x, _e289.member.y, _e289.member.z, 1f); break; } case 19: { - global_19 = vec4(_e317.member_1, _e317.member_1, _e317.member_1, 1f); + global_17 = vec4(_e289.member_1, _e289.member_1, _e289.member_1, 1f); break; } default: { @@ -2211,7 +2184,7 @@ fn function() { } @fragment -fn stagerenderlet_fragment(@location(0) @interpolate(flat) param: u32, @location(1) @interpolate(flat) param_1: u32, @location(2) @interpolate(flat) param_2: u32, @location(3) param_3: vec4, @location(4) param_4: vec2, @location(5) param_5: vec2, @location(6) param_6: vec3, @location(7) param_7: vec3, @location(8) param_8: vec3, @location(9) param_9: vec3) -> @location(0) vec4 { +fn stagerenderlet_fragment(@location(0) @interpolate(flat) param: u32, @location(1) param_1: vec4, @location(2) param_2: vec2, @location(3) param_3: vec2, @location(4) param_4: vec3, @location(5) param_5: vec3, @location(6) param_6: vec3, @location(7) param_7: vec3) -> @location(0) vec4 { global_1 = param; global_2 = param_1; global_3 = param_2; @@ -2220,9 +2193,7 @@ fn stagerenderlet_fragment(@location(0) @interpolate(flat) param: u32, @location global_6 = param_5; global_7 = param_6; global_8 = param_7; - global_9 = param_8; - global_10 = param_9; function(); - let _e21 = global_19; - return _e21; + let _e17 = global_17; + return _e17; } diff --git a/crates/renderling/shaders/stage-renderlet_vertex.spv b/crates/renderling/shaders/stage-renderlet_vertex.spv index 23ffd2d9..0f24ad1f 100644 Binary files a/crates/renderling/shaders/stage-renderlet_vertex.spv and b/crates/renderling/shaders/stage-renderlet_vertex.spv differ diff --git a/crates/renderling/shaders/stage-renderlet_vertex.wgsl b/crates/renderling/shaders/stage-renderlet_vertex.wgsl index a410eb01..4d9508db 100644 --- a/crates/renderling/shaders/stage-renderlet_vertex.wgsl +++ b/crates/renderling/shaders/stage-renderlet_vertex.wgsl @@ -32,13 +32,7 @@ struct type_27 { member_2: vec3, } -struct type_28 { - member: vec3, - member_1: vec3, - member_2: vec3, -} - -struct type_31 { +struct type_30 { member: vec3, member_1: vec4, member_2: vec3, @@ -49,6 +43,12 @@ struct type_31 { member_7: vec2, } +struct type_33 { + member: vec3, + member_1: vec3, + member_2: vec3, +} + struct type_34 { member: type_24, member_1: type_24, @@ -56,16 +56,14 @@ struct type_34 { struct VertexOutput { @location(0) @interpolate(flat) member: u32, - @location(1) @interpolate(flat) member_1: u32, - @location(2) @interpolate(flat) member_2: u32, - @location(3) member_3: vec4, - @location(4) member_4: vec2, - @location(5) member_5: vec2, + @location(1) member_1: vec4, + @location(2) member_2: vec2, + @location(3) member_3: vec2, + @location(4) member_4: vec3, + @location(5) member_5: vec3, @location(6) member_6: vec3, @location(7) member_7: vec3, - @location(8) member_8: vec3, - @location(9) member_9: vec3, - @builtin(position) member_10: vec4, + @builtin(position) member_8: vec4, } var global: u32; @@ -74,16 +72,14 @@ var global_1: vec4 = vec4(0f, 0f, 0f, 1f); var global_2: type_12; var global_3: u32; var global_4: u32; -var global_5: u32; -var global_6: u32; -var global_7: vec4; -var global_8: vec2; -var global_9: vec2; -var global_10: type_20 = type_20(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); +var global_5: vec4; +var global_6: vec2; +var global_7: vec2; +var global_8: type_20 = type_20(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); +var global_9: vec3; +var global_10: vec3; var global_11: vec3; var global_12: vec3; -var global_13: vec3; -var global_14: vec3; fn function() { var local: array; @@ -92,1062 +88,1059 @@ fn function() { var local_3: array, 6>; var local_4: array; var local_5: array; - var phi_741_: u32; - var phi_2842_: bool; - var phi_748_: u32; - var phi_749_: u32; - var phi_759_: u32; - var phi_841_: type_24; - var phi_842_: type_24; - var phi_857_: type_24; - var phi_870_: bool; - var phi_876_: type_24; - var phi_877_: type_24; - var phi_892_: type_24; - var phi_906_: bool; - var phi_912_: type_24; - var phi_915_: type_31; - var phi_913_: type_24; - var phi_930_: type_24; - var phi_947_: u32; - var phi_2872_: bool; - var phi_965_: type_24; - var phi_2898_: u32; - var phi_2917_: bool; - var phi_1015_: type_28; - var phi_1025_: u32; - var phi_2939_: bool; - var phi_1033_: f32; - var phi_916_: type_31; - var phi_1086_: bool; - var local_6: type_31; - var local_7: type_31; - var local_8: type_31; - var phi_2962_: bool; - var phi_1200_: type_34; - var local_9: type_31; - var phi_1203_: type_24; - var phi_1206_: type_20; - var phi_1204_: type_24; - var phi_1221_: type_24; - var local_10: type_31; - var phi_1245_: u32; - var phi_2996_: bool; - var phi_1254_: u32; - var phi_3020_: bool; - var phi_1303_: type_27; - var phi_1313_: u32; - var phi_3046_: bool; - var phi_1386_: type_20; - var phi_1207_: type_20; - var phi_1623_: bool; - var phi_3863_: bool; + var phi_743_: u32; + var phi_2848_: bool; + var phi_750_: u32; + var phi_751_: u32; + var phi_761_: u32; + var phi_843_: type_24; + var phi_844_: type_24; + var phi_859_: type_24; + var phi_872_: bool; + var phi_878_: type_24; + var phi_879_: type_24; + var phi_894_: type_24; + var phi_908_: bool; + var phi_914_: type_24; + var phi_917_: type_30; + var phi_915_: type_24; + var phi_932_: type_24; + var phi_949_: u32; + var phi_2878_: bool; + var phi_967_: type_24; + var phi_2904_: u32; + var phi_2923_: bool; + var phi_1017_: type_33; + var phi_1027_: u32; + var phi_2945_: bool; + var phi_1035_: f32; + var phi_918_: type_30; + var phi_1088_: bool; + var local_6: type_30; + var local_7: type_30; + var local_8: type_30; + var phi_2968_: bool; + var phi_1212_: type_34; + var local_9: type_30; + var phi_1215_: type_24; + var phi_1218_: type_20; + var phi_1216_: type_24; + var phi_1233_: type_24; + var local_10: type_30; + var phi_1257_: u32; + var phi_3002_: bool; + var phi_1266_: u32; + var phi_3026_: bool; + var phi_1315_: type_27; + var phi_1325_: u32; + var phi_3051_: bool; + var phi_1398_: type_20; + var phi_1219_: type_20; + var phi_1635_: bool; + var phi_3867_: bool; var local_11: type_20; var local_12: type_20; var local_13: type_20; var local_14: type_20; - var phi_1650_: bool; - var phi_1652_: bool; - var phi_1653_: bool; - var phi_1654_: bool; - var phi_1655_: bool; + var phi_1662_: bool; + var phi_1664_: bool; + var phi_1665_: bool; + var phi_1666_: bool; + var phi_1667_: bool; var local_15: type_20; var local_16: type_20; var local_17: type_20; var local_18: type_20; - var phi_1689_: bool; - var phi_1691_: bool; - var phi_1692_: bool; - var phi_1693_: bool; - var phi_1694_: bool; + var phi_1701_: bool; + var phi_1703_: bool; + var phi_1704_: bool; + var phi_1705_: bool; + var phi_1706_: bool; var local_19: type_20; var local_20: type_20; var local_21: type_20; var local_22: type_20; - var phi_1728_: bool; - var phi_1730_: bool; - var phi_1731_: bool; - var phi_1732_: bool; - var phi_1733_: bool; + var phi_1740_: bool; + var phi_1742_: bool; + var phi_1743_: bool; + var phi_1744_: bool; + var phi_1745_: bool; var local_23: type_20; var local_24: type_20; var local_25: type_20; var local_26: type_20; - var phi_1767_: bool; - var phi_1769_: bool; - var phi_1770_: bool; - var phi_1771_: bool; - var phi_1772_: bool; - var phi_1777_: bool; var phi_1779_: bool; - var phi_1780_: bool; var phi_1781_: bool; var phi_1782_: bool; - var phi_1790_: type_20; - var phi_3183_: bool; - var phi_3246_: vec4; - var phi_3276_: vec4; - var phi_3278_: vec4; - var phi_3289_: type_27; - var phi_3290_: type_27; - var phi_3293_: type_27; + var phi_1783_: bool; + var phi_1784_: bool; + var phi_1789_: bool; + var phi_1791_: bool; + var phi_1792_: bool; + var phi_1793_: bool; + var phi_1794_: bool; + var phi_1802_: type_20; + var phi_3188_: bool; + var phi_3251_: vec4; + var phi_3281_: vec4; + var phi_3283_: vec4; var phi_3294_: type_27; - var phi_3295_: bool; + var phi_3295_: type_27; + var phi_3298_: type_27; var phi_3299_: type_27; - var phi_1792_: type_27; - var phi_1794_: type_27; - var phi_1795_: bool; - var phi_3393_: bool; - var phi_1848_: type_27; - var phi_1849_: type_27; - var local_27: type_31; - var phi_1893_: vec3; - var local_28: type_31; - var phi_3438_: vec3; - var phi_3520_: vec3; - var phi_3555_: vec3; - var local_29: type_31; - var local_30: type_31; - var phi_3568_: bool; - var phi_2217_: type_24; - var phi_2218_: type_24; - var phi_2233_: type_24; - var phi_2260_: bool; - var phi_2266_: type_24; - var phi_2267_: type_24; - var phi_2282_: type_24; - var phi_2305_: bool; - var phi_2313_: type_22; + var phi_3300_: bool; + var phi_3304_: type_27; + var phi_1804_: type_27; + var phi_1806_: type_27; + var phi_1807_: bool; + var phi_3398_: bool; + var phi_1860_: type_27; + var phi_1861_: type_27; + var local_27: type_30; + var phi_1905_: vec3; + var local_28: type_30; + var phi_3442_: vec3; + var phi_3524_: vec3; + var phi_3559_: vec3; + var local_29: type_30; + var local_30: type_30; + var phi_3572_: bool; + var phi_2229_: type_24; + var phi_2230_: type_24; + var phi_2245_: type_24; + var phi_2272_: bool; + var phi_2278_: type_24; + var phi_2279_: type_24; + var phi_2294_: type_24; + var phi_2317_: bool; + var phi_2325_: type_22; var local_31: type_20; switch bitcast(0u) { default: { - let _e97 = global_3; - let _e98 = global; - let _e100 = arrayLength((&global_2.member)); - let _e103 = global_2.member[_e97]; - let _e108 = global_2.member[(_e97 + 1u)]; - let _e112 = global_2.member[(_e97 + 2u)]; - let _e116 = global_2.member[(_e97 + 7u)]; - let _e120 = global_2.member[(_e97 + 8u)]; - let _e124 = global_2.member[(_e97 + 9u)]; - let _e128 = global_2.member[(_e97 + 10u)]; - let _e132 = global_2.member[(_e97 + 11u)]; - let _e136 = global_2.member[(_e97 + 12u)]; - let _e140 = global_2.member[(_e97 + 13u)]; - let _e144 = global_2.member[(_e97 + 14u)]; - let _e148 = global_2.member[(_e97 + 15u)]; - let _e152 = global_2.member[(_e97 + 16u)]; - let _e156 = global_2.member[(_e97 + 17u)]; - if (_e103 == 1u) { - global_4 = _e124; - global_5 = _e132; - global_6 = _e156; - if (_e116 == 4294967295u) { - phi_749_ = _e98; + let _e95 = global_3; + let _e96 = global; + let _e98 = arrayLength((&global_2.member)); + let _e101 = global_2.member[_e95]; + let _e106 = global_2.member[(_e95 + 1u)]; + let _e110 = global_2.member[(_e95 + 2u)]; + let _e114 = global_2.member[(_e95 + 7u)]; + let _e118 = global_2.member[(_e95 + 8u)]; + let _e122 = global_2.member[(_e95 + 9u)]; + let _e126 = global_2.member[(_e95 + 10u)]; + let _e130 = global_2.member[(_e95 + 12u)]; + let _e134 = global_2.member[(_e95 + 13u)]; + let _e138 = global_2.member[(_e95 + 14u)]; + let _e142 = global_2.member[(_e95 + 15u)]; + let _e146 = global_2.member[(_e95 + 16u)]; + let _e150 = global_2.member[(_e95 + 17u)]; + if (_e101 == 1u) { + global_4 = _e95; + if (_e114 == 4294967295u) { + phi_751_ = _e96; } else { - if (_e98 >= _e120) { - phi_741_ = 4294967295u; + if (_e96 >= _e118) { + phi_743_ = 4294967295u; } else { - phi_741_ = (_e116 + _e98); + phi_743_ = (_e114 + _e96); } - let _e161 = phi_741_; - if (_e100 >= 1u) { - phi_2842_ = (_e161 <= (_e100 - 1u)); + let _e155 = phi_743_; + if (_e98 >= 1u) { + phi_2848_ = (_e155 <= (_e98 - 1u)); } else { - phi_2842_ = false; + phi_2848_ = false; } - let _e166 = phi_2842_; - if _e166 { - let _e169 = global_2.member[_e161]; - phi_748_ = _e169; + let _e160 = phi_2848_; + if _e160 { + let _e163 = global_2.member[_e155]; + phi_750_ = _e163; } else { - phi_748_ = 0u; + phi_750_ = 0u; } - let _e171 = phi_748_; - phi_749_ = _e171; + let _e165 = phi_750_; + phi_751_ = _e165; } - let _e173 = phi_749_; - if (_e173 >= _e112) { - phi_759_ = 4294967295u; + let _e167 = phi_751_; + if (_e167 >= _e110) { + phi_761_ = 4294967295u; } else { - phi_759_ = (_e108 + (26u * _e173)); + phi_761_ = (_e106 + (26u * _e167)); } - let _e178 = phi_759_; - let _e181 = global_2.member[_e178]; - let _e186 = global_2.member[(_e178 + 1u)]; - let _e191 = global_2.member[(_e178 + 2u)]; - let _e197 = global_2.member[(_e178 + 3u)]; - let _e202 = global_2.member[(_e178 + 4u)]; - let _e207 = global_2.member[(_e178 + 5u)]; - let _e212 = global_2.member[(_e178 + 6u)]; - let _e218 = global_2.member[(_e178 + 7u)]; - let _e223 = global_2.member[(_e178 + 8u)]; - let _e229 = global_2.member[(_e178 + 9u)]; - let _e234 = global_2.member[(_e178 + 10u)]; - let _e240 = global_2.member[(_e178 + 11u)]; - let _e245 = global_2.member[(_e178 + 12u)]; - let _e250 = global_2.member[(_e178 + 13u)]; - let _e256 = global_2.member[(_e178 + 14u)]; - let _e261 = global_2.member[(_e178 + 15u)]; - let _e266 = global_2.member[(_e178 + 16u)]; - let _e271 = global_2.member[(_e178 + 17u)]; + let _e172 = phi_761_; + let _e175 = global_2.member[_e172]; + let _e180 = global_2.member[(_e172 + 1u)]; + let _e185 = global_2.member[(_e172 + 2u)]; + let _e191 = global_2.member[(_e172 + 3u)]; + let _e196 = global_2.member[(_e172 + 4u)]; + let _e201 = global_2.member[(_e172 + 5u)]; + let _e206 = global_2.member[(_e172 + 6u)]; + let _e212 = global_2.member[(_e172 + 7u)]; + let _e217 = global_2.member[(_e172 + 8u)]; + let _e223 = global_2.member[(_e172 + 9u)]; + let _e228 = global_2.member[(_e172 + 10u)]; + let _e234 = global_2.member[(_e172 + 11u)]; + let _e239 = global_2.member[(_e172 + 12u)]; + let _e244 = global_2.member[(_e172 + 13u)]; + let _e250 = global_2.member[(_e172 + 14u)]; + let _e255 = global_2.member[(_e172 + 15u)]; + let _e260 = global_2.member[(_e172 + 16u)]; + let _e265 = global_2.member[(_e172 + 17u)]; local_5 = array(0u, 0u, 0u, 0u); - phi_841_ = type_24(0u, 4u); + phi_843_ = type_24(0u, 4u); loop { - let _e276 = phi_841_; - if (_e276.member < _e276.member_1) { - phi_842_ = type_24((_e276.member + 1u), _e276.member_1); - phi_857_ = type_24(1u, _e276.member); + let _e270 = phi_843_; + if (_e270.member < _e270.member_1) { + phi_844_ = type_24((_e270.member + 1u), _e270.member_1); + phi_859_ = type_24(1u, _e270.member); } else { - phi_842_ = _e276; - phi_857_ = type_24(0u, type_24().member_1); + phi_844_ = _e270; + phi_859_ = type_24(0u, type_24().member_1); } - let _e289 = phi_842_; - let _e291 = phi_857_; - switch bitcast(_e291.member) { + let _e283 = phi_844_; + let _e285 = phi_859_; + switch bitcast(_e285.member) { case 0: { - phi_870_ = false; + phi_872_ = false; break; } case 1: { - let _e298 = global_2.member[((_e178 + 18u) + _e291.member_1)]; - local_5[_e291.member_1] = _e298; - phi_870_ = true; + let _e292 = global_2.member[((_e172 + 18u) + _e285.member_1)]; + local_5[_e285.member_1] = _e292; + phi_872_ = true; break; } default: { - phi_870_ = bool(); + phi_872_ = bool(); break; } } - let _e301 = phi_870_; + let _e295 = phi_872_; continue; continuing { - phi_841_ = _e289; - break if !(_e301); + phi_843_ = _e283; + break if !(_e295); } } - let _e303 = local_5; + let _e297 = local_5; local_4 = array(0f, 0f, 0f, 0f); - phi_876_ = type_24(0u, 4u); + phi_878_ = type_24(0u, 4u); loop { - let _e306 = phi_876_; - if (_e306.member < _e306.member_1) { - phi_877_ = type_24((_e306.member + 1u), _e306.member_1); - phi_892_ = type_24(1u, _e306.member); + let _e300 = phi_878_; + if (_e300.member < _e300.member_1) { + phi_879_ = type_24((_e300.member + 1u), _e300.member_1); + phi_894_ = type_24(1u, _e300.member); } else { - phi_877_ = _e306; - phi_892_ = type_24(0u, type_24().member_1); + phi_879_ = _e300; + phi_894_ = type_24(0u, type_24().member_1); } - let _e319 = phi_877_; - let _e321 = phi_892_; - switch bitcast(_e321.member) { + let _e313 = phi_879_; + let _e315 = phi_894_; + switch bitcast(_e315.member) { case 0: { - phi_906_ = false; + phi_908_ = false; break; } case 1: { - let _e328 = global_2.member[((_e178 + 22u) + _e321.member_1)]; - local_4[_e321.member_1] = bitcast(_e328); - phi_906_ = true; + let _e322 = global_2.member[((_e172 + 22u) + _e315.member_1)]; + local_4[_e315.member_1] = bitcast(_e322); + phi_908_ = true; break; } default: { - phi_906_ = bool(); + phi_908_ = bool(); break; } } - let _e332 = phi_906_; + let _e326 = phi_908_; continue; continuing { - phi_876_ = _e319; - break if !(_e332); + phi_878_ = _e313; + break if !(_e326); } } - let _e334 = local_4; - phi_912_ = type_24(0u, _e144); - phi_915_ = type_31(vec3(bitcast(_e181), bitcast(_e186), bitcast(_e191)), vec4(bitcast(_e197), bitcast(_e202), bitcast(_e207), bitcast(_e212)), vec3(bitcast(_e240), bitcast(_e245), bitcast(_e250)), vec4(bitcast(_e256), bitcast(_e261), bitcast(_e266), bitcast(_e271)), _e303, _e334, vec2(bitcast(_e218), bitcast(_e223)), vec2(bitcast(_e229), bitcast(_e234))); + let _e328 = local_4; + phi_914_ = type_24(0u, _e138); + phi_917_ = type_30(vec3(bitcast(_e175), bitcast(_e180), bitcast(_e185)), vec4(bitcast(_e191), bitcast(_e196), bitcast(_e201), bitcast(_e206)), vec3(bitcast(_e234), bitcast(_e239), bitcast(_e244)), vec4(bitcast(_e250), bitcast(_e255), bitcast(_e260), bitcast(_e265)), _e297, _e328, vec2(bitcast(_e212), bitcast(_e217)), vec2(bitcast(_e223), bitcast(_e228))); loop { - let _e338 = phi_912_; - let _e340 = phi_915_; - local_6 = _e340; - local_7 = _e340; - local_8 = _e340; - local_9 = _e340; - local_10 = _e340; - local_27 = _e340; - local_28 = _e340; - local_29 = _e340; - local_30 = _e340; - if (_e338.member < _e338.member_1) { - phi_913_ = type_24((_e338.member + 1u), _e338.member_1); - phi_930_ = type_24(1u, _e338.member); + let _e332 = phi_914_; + let _e334 = phi_917_; + local_6 = _e334; + local_7 = _e334; + local_8 = _e334; + local_9 = _e334; + local_10 = _e334; + local_27 = _e334; + local_28 = _e334; + local_29 = _e334; + local_30 = _e334; + if (_e332.member < _e332.member_1) { + phi_915_ = type_24((_e332.member + 1u), _e332.member_1); + phi_932_ = type_24(1u, _e332.member); } else { - phi_913_ = _e338; - phi_930_ = type_24(0u, type_24().member_1); + phi_915_ = _e332; + phi_932_ = type_24(0u, type_24().member_1); } - let _e353 = phi_913_; - let _e355 = phi_930_; - switch bitcast(_e355.member) { + let _e347 = phi_915_; + let _e349 = phi_932_; + switch bitcast(_e349.member) { case 0: { - phi_916_ = type_31(); - phi_1086_ = false; + phi_918_ = type_30(); + phi_1088_ = false; break; } case 1: { - if (_e355.member_1 >= _e144) { - phi_947_ = 4294967295u; + if (_e349.member_1 >= _e138) { + phi_949_ = 4294967295u; } else { - phi_947_ = (_e140 + (2u * _e355.member_1)); + phi_949_ = (_e134 + (2u * _e349.member_1)); } - let _e363 = phi_947_; - if (_e100 >= 2u) { - phi_2872_ = (_e363 <= (_e100 - 2u)); + let _e357 = phi_949_; + if (_e98 >= 2u) { + phi_2878_ = (_e357 <= (_e98 - 2u)); } else { - phi_2872_ = false; + phi_2878_ = false; } - let _e368 = phi_2872_; - if _e368 { - let _e371 = global_2.member[_e363]; - let _e375 = global_2.member[(_e363 + 1u)]; - phi_965_ = type_24(_e371, _e375); + let _e362 = phi_2878_; + if _e362 { + let _e365 = global_2.member[_e357]; + let _e369 = global_2.member[(_e357 + 1u)]; + phi_967_ = type_24(_e365, _e369); } else { - phi_965_ = type_24(4294967295u, 0u); + phi_967_ = type_24(4294967295u, 0u); } - let _e378 = phi_965_; - if (_e173 >= _e378.member_1) { - phi_2898_ = 4294967295u; + let _e372 = phi_967_; + if (_e167 >= _e372.member_1) { + phi_2904_ = 4294967295u; } else { - phi_2898_ = (_e378.member + (9u * _e173)); + phi_2904_ = (_e372.member + (9u * _e167)); } - let _e385 = phi_2898_; - if (_e100 >= 9u) { - phi_2917_ = (_e385 <= (_e100 - 9u)); + let _e379 = phi_2904_; + if (_e98 >= 9u) { + phi_2923_ = (_e379 <= (_e98 - 9u)); } else { - phi_2917_ = false; + phi_2923_ = false; } - let _e390 = phi_2917_; - if _e390 { - let _e393 = global_2.member[_e385]; - let _e398 = global_2.member[(_e385 + 1u)]; - let _e403 = global_2.member[(_e385 + 2u)]; - let _e409 = global_2.member[(_e385 + 3u)]; - let _e414 = global_2.member[(_e385 + 4u)]; - let _e419 = global_2.member[(_e385 + 5u)]; - let _e425 = global_2.member[(_e385 + 6u)]; - let _e430 = global_2.member[(_e385 + 7u)]; - let _e435 = global_2.member[(_e385 + 8u)]; - phi_1015_ = type_28(vec3(bitcast(_e393), bitcast(_e398), bitcast(_e403)), vec3(bitcast(_e409), bitcast(_e414), bitcast(_e419)), vec3(bitcast(_e425), bitcast(_e430), bitcast(_e435))); + let _e384 = phi_2923_; + if _e384 { + let _e387 = global_2.member[_e379]; + let _e392 = global_2.member[(_e379 + 1u)]; + let _e397 = global_2.member[(_e379 + 2u)]; + let _e403 = global_2.member[(_e379 + 3u)]; + let _e408 = global_2.member[(_e379 + 4u)]; + let _e413 = global_2.member[(_e379 + 5u)]; + let _e419 = global_2.member[(_e379 + 6u)]; + let _e424 = global_2.member[(_e379 + 7u)]; + let _e429 = global_2.member[(_e379 + 8u)]; + phi_1017_ = type_33(vec3(bitcast(_e387), bitcast(_e392), bitcast(_e397)), vec3(bitcast(_e403), bitcast(_e408), bitcast(_e413)), vec3(bitcast(_e419), bitcast(_e424), bitcast(_e429))); } else { - phi_1015_ = type_28(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); + phi_1017_ = type_33(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); } - let _e440 = phi_1015_; - if (_e355.member_1 >= _e152) { - phi_1025_ = 4294967295u; + let _e434 = phi_1017_; + if (_e349.member_1 >= _e146) { + phi_1027_ = 4294967295u; } else { - phi_1025_ = (_e148 + _e355.member_1); + phi_1027_ = (_e142 + _e349.member_1); } - let _e444 = phi_1025_; - if (_e100 >= 1u) { - phi_2939_ = (_e444 <= (_e100 - 1u)); + let _e438 = phi_1027_; + if (_e98 >= 1u) { + phi_2945_ = (_e438 <= (_e98 - 1u)); } else { - phi_2939_ = false; + phi_2945_ = false; } - let _e449 = phi_2939_; - if _e449 { - let _e452 = global_2.member[_e444]; - phi_1033_ = bitcast(_e452); + let _e443 = phi_2945_; + if _e443 { + let _e446 = global_2.member[_e438]; + phi_1035_ = bitcast(_e446); } else { - phi_1033_ = 0f; + phi_1035_ = 0f; } - let _e455 = phi_1033_; - let _e478 = type_31(vec3(fma(_e455, _e440.member.x, _e340.member.x), fma(_e455, _e440.member.y, _e340.member.y), fma(_e455, _e440.member.z, _e340.member.z)), _e340.member_1, _e340.member_2, _e340.member_3, _e340.member_4, _e340.member_5, _e340.member_6, _e340.member_7); - let _e501 = type_31(_e478.member, _e478.member_1, vec3(fma(_e455, _e440.member_1.x, _e340.member_2.x), fma(_e455, _e440.member_1.y, _e340.member_2.y), fma(_e455, _e440.member_1.z, _e340.member_2.z)), _e478.member_3, _e478.member_4, _e478.member_5, _e478.member_6, _e478.member_7); - phi_916_ = type_31(_e501.member, _e501.member_1, _e501.member_2, vec4(fma(_e455, _e440.member_2.x, _e340.member_3.x), fma(_e455, _e440.member_2.y, _e340.member_3.y), fma(_e455, _e440.member_2.z, _e340.member_3.z), _e340.member_3.w), _e501.member_4, _e501.member_5, _e501.member_6, _e501.member_7); - phi_1086_ = true; + let _e449 = phi_1035_; + let _e472 = type_30(vec3(fma(_e449, _e434.member.x, _e334.member.x), fma(_e449, _e434.member.y, _e334.member.y), fma(_e449, _e434.member.z, _e334.member.z)), _e334.member_1, _e334.member_2, _e334.member_3, _e334.member_4, _e334.member_5, _e334.member_6, _e334.member_7); + let _e495 = type_30(_e472.member, _e472.member_1, vec3(fma(_e449, _e434.member_1.x, _e334.member_2.x), fma(_e449, _e434.member_1.y, _e334.member_2.y), fma(_e449, _e434.member_1.z, _e334.member_2.z)), _e472.member_3, _e472.member_4, _e472.member_5, _e472.member_6, _e472.member_7); + phi_918_ = type_30(_e495.member, _e495.member_1, _e495.member_2, vec4(fma(_e449, _e434.member_2.x, _e334.member_3.x), fma(_e449, _e434.member_2.y, _e334.member_3.y), fma(_e449, _e434.member_2.z, _e334.member_3.z), _e334.member_3.w), _e495.member_4, _e495.member_5, _e495.member_6, _e495.member_7); + phi_1088_ = true; break; } default: { - phi_916_ = type_31(); - phi_1086_ = bool(); + phi_918_ = type_30(); + phi_1088_ = bool(); break; } } - let _e528 = phi_916_; - let _e530 = phi_1086_; + let _e522 = phi_918_; + let _e524 = phi_1088_; continue; continuing { - phi_912_ = _e353; - phi_915_ = _e528; - break if !(_e530); + phi_914_ = _e347; + phi_917_ = _e522; + break if !(_e524); } } - let _e533 = local_6; - global_7 = _e533.member_1; - let _e536 = local_7; - global_8 = _e536.member_6; - let _e539 = local_8; - global_9 = _e539.member_7; - let _e544 = global_2.member[(_e156 + 6u)]; - if (_e544 == 1u) { - let _e547 = ((_e136 == 4294967295u) != true); - if _e547 { - if (_e100 >= 4u) { - phi_2962_ = (_e136 <= (_e100 - 4u)); + let _e527 = local_6; + global_5 = _e527.member_1; + let _e530 = local_7; + global_6 = _e530.member_6; + let _e533 = local_8; + global_7 = _e533.member_7; + let _e538 = global_2.member[(_e150 + 6u)]; + if (_e538 == 1u) { + let _e541 = ((_e130 == 4294967295u) != true); + if _e541 { + if (_e98 >= 4u) { + phi_2968_ = (_e130 <= (_e98 - 4u)); } else { - phi_2962_ = false; + phi_2968_ = false; } - let _e552 = phi_2962_; - if _e552 { - let _e555 = global_2.member[_e136]; - let _e559 = global_2.member[(_e136 + 1u)]; - let _e563 = global_2.member[(_e136 + 2u)]; - let _e567 = global_2.member[(_e136 + 3u)]; - phi_1200_ = type_34(type_24(_e555, _e559), type_24(_e563, _e567)); + let _e546 = phi_2968_; + if _e546 { + let _e549 = global_2.member[_e130]; + let _e553 = global_2.member[(_e130 + 1u)]; + let _e557 = global_2.member[(_e130 + 2u)]; + let _e561 = global_2.member[(_e130 + 3u)]; + phi_1212_ = type_34(type_24(_e549, _e553), type_24(_e557, _e561)); } else { - phi_1200_ = type_34(type_24(4294967295u, 0u), type_24(4294967295u, 0u)); + phi_1212_ = type_34(type_24(4294967295u, 0u), type_24(4294967295u, 0u)); } - let _e572 = phi_1200_; - let _e574 = local_9; - local = _e574.member_5; - phi_1203_ = type_24(0u, 4u); - phi_1206_ = type_20(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); + let _e566 = phi_1212_; + let _e568 = local_9; + local = _e568.member_5; + phi_1215_ = type_24(0u, 4u); + phi_1218_ = type_20(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); loop { - let _e577 = phi_1203_; - let _e579 = phi_1206_; - local_11 = _e579; - local_12 = _e579; - local_13 = _e579; - local_14 = _e579; - local_15 = _e579; - local_16 = _e579; - local_17 = _e579; - local_18 = _e579; - local_19 = _e579; - local_20 = _e579; - local_21 = _e579; - local_22 = _e579; - local_23 = _e579; - local_24 = _e579; - local_25 = _e579; - local_26 = _e579; - local_31 = _e579; - if (_e577.member < _e577.member_1) { - phi_1204_ = type_24((_e577.member + 1u), _e577.member_1); - phi_1221_ = type_24(1u, _e577.member); + let _e571 = phi_1215_; + let _e573 = phi_1218_; + local_11 = _e573; + local_12 = _e573; + local_13 = _e573; + local_14 = _e573; + local_15 = _e573; + local_16 = _e573; + local_17 = _e573; + local_18 = _e573; + local_19 = _e573; + local_20 = _e573; + local_21 = _e573; + local_22 = _e573; + local_23 = _e573; + local_24 = _e573; + local_25 = _e573; + local_26 = _e573; + local_31 = _e573; + if (_e571.member < _e571.member_1) { + phi_1216_ = type_24((_e571.member + 1u), _e571.member_1); + phi_1233_ = type_24(1u, _e571.member); } else { - phi_1204_ = _e577; - phi_1221_ = type_24(0u, type_24().member_1); + phi_1216_ = _e571; + phi_1233_ = type_24(0u, type_24().member_1); } - let _e592 = phi_1204_; - let _e594 = phi_1221_; - switch bitcast(_e594.member) { + let _e586 = phi_1216_; + let _e588 = phi_1233_; + switch bitcast(_e588.member) { case 0: { - phi_1207_ = type_20(); - phi_1623_ = false; + phi_1219_ = type_20(); + phi_1635_ = false; break; } case 1: { - let _e599 = local_10; - local_1 = _e599.member_4; - let _e601 = (_e594.member_1 < 4u); - if _e601 { + let _e593 = local_10; + local_1 = _e593.member_4; + let _e595 = (_e588.member_1 < 4u); + if _e595 { } else { - phi_3863_ = true; + phi_3867_ = true; break; } - let _e603 = local_1[_e594.member_1]; - if (_e603 >= _e572.member.member_1) { - phi_1245_ = 4294967295u; + let _e597 = local_1[_e588.member_1]; + if (_e597 >= _e566.member.member_1) { + phi_1257_ = 4294967295u; } else { - phi_1245_ = (_e572.member.member + _e603); + phi_1257_ = (_e566.member.member + _e597); } - let _e611 = phi_1245_; - if (_e100 >= 1u) { - phi_2996_ = (_e611 <= (_e100 - 1u)); + let _e605 = phi_1257_; + if (_e98 >= 1u) { + phi_3002_ = (_e605 <= (_e98 - 1u)); } else { - phi_2996_ = false; + phi_3002_ = false; } - let _e616 = phi_2996_; - if _e616 { - let _e619 = global_2.member[_e611]; - phi_1254_ = _e619; + let _e610 = phi_3002_; + if _e610 { + let _e613 = global_2.member[_e605]; + phi_1266_ = _e613; } else { - phi_1254_ = 4294967295u; + phi_1266_ = 4294967295u; } - let _e621 = phi_1254_; - if (_e100 >= 10u) { - phi_3020_ = (_e621 <= (_e100 - 10u)); + let _e615 = phi_1266_; + if (_e98 >= 10u) { + phi_3026_ = (_e615 <= (_e98 - 10u)); } else { - phi_3020_ = false; + phi_3026_ = false; } - let _e626 = phi_3020_; - if _e626 { - let _e629 = global_2.member[_e621]; - let _e634 = global_2.member[(_e621 + 1u)]; - let _e639 = global_2.member[(_e621 + 2u)]; - let _e645 = global_2.member[(_e621 + 3u)]; - let _e650 = global_2.member[(_e621 + 4u)]; - let _e655 = global_2.member[(_e621 + 5u)]; - let _e660 = global_2.member[(_e621 + 6u)]; - let _e666 = global_2.member[(_e621 + 7u)]; - let _e671 = global_2.member[(_e621 + 8u)]; - let _e676 = global_2.member[(_e621 + 9u)]; - phi_1303_ = type_27(vec3(bitcast(_e629), bitcast(_e634), bitcast(_e639)), vec4(bitcast(_e645), bitcast(_e650), bitcast(_e655), bitcast(_e660)), vec3(bitcast(_e666), bitcast(_e671), bitcast(_e676))); + let _e620 = phi_3026_; + if _e620 { + let _e623 = global_2.member[_e615]; + let _e628 = global_2.member[(_e615 + 1u)]; + let _e633 = global_2.member[(_e615 + 2u)]; + let _e639 = global_2.member[(_e615 + 3u)]; + let _e644 = global_2.member[(_e615 + 4u)]; + let _e649 = global_2.member[(_e615 + 5u)]; + let _e654 = global_2.member[(_e615 + 6u)]; + let _e660 = global_2.member[(_e615 + 7u)]; + let _e665 = global_2.member[(_e615 + 8u)]; + let _e670 = global_2.member[(_e615 + 9u)]; + phi_1315_ = type_27(vec3(bitcast(_e623), bitcast(_e628), bitcast(_e633)), vec4(bitcast(_e639), bitcast(_e644), bitcast(_e649), bitcast(_e654)), vec3(bitcast(_e660), bitcast(_e665), bitcast(_e670))); } else { - phi_1303_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_1315_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e681 = phi_1303_; - if (_e603 >= _e572.member_1.member_1) { - phi_1313_ = 4294967295u; + let _e675 = phi_1315_; + if (_e597 >= _e566.member_1.member_1) { + phi_1325_ = 4294967295u; } else { - phi_1313_ = (_e572.member_1.member + (16u * _e603)); + phi_1325_ = (_e566.member_1.member + (16u * _e597)); } - let _e690 = phi_1313_; - if (_e100 >= 16u) { - phi_3046_ = (_e690 <= (_e100 - 16u)); + let _e684 = phi_1325_; + if (_e98 >= 16u) { + phi_3051_ = (_e684 <= (_e98 - 16u)); } else { - phi_3046_ = false; + phi_3051_ = false; } - let _e695 = phi_3046_; - if _e695 { - let _e698 = global_2.member[_e690]; - let _e703 = global_2.member[(_e690 + 1u)]; - let _e708 = global_2.member[(_e690 + 2u)]; - let _e713 = global_2.member[(_e690 + 3u)]; - let _e719 = global_2.member[(_e690 + 4u)]; - let _e724 = global_2.member[(_e690 + 5u)]; - let _e729 = global_2.member[(_e690 + 6u)]; - let _e734 = global_2.member[(_e690 + 7u)]; - let _e740 = global_2.member[(_e690 + 8u)]; - let _e745 = global_2.member[(_e690 + 9u)]; - let _e750 = global_2.member[(_e690 + 10u)]; - let _e755 = global_2.member[(_e690 + 11u)]; - let _e761 = global_2.member[(_e690 + 12u)]; - let _e766 = global_2.member[(_e690 + 13u)]; - let _e771 = global_2.member[(_e690 + 14u)]; - let _e776 = global_2.member[(_e690 + 15u)]; - phi_1386_ = type_20(vec4(bitcast(_e698), bitcast(_e703), bitcast(_e708), bitcast(_e713)), vec4(bitcast(_e719), bitcast(_e724), bitcast(_e729), bitcast(_e734)), vec4(bitcast(_e740), bitcast(_e745), bitcast(_e750), bitcast(_e755)), vec4(bitcast(_e761), bitcast(_e766), bitcast(_e771), bitcast(_e776))); + let _e689 = phi_3051_; + if _e689 { + let _e692 = global_2.member[_e684]; + let _e697 = global_2.member[(_e684 + 1u)]; + let _e702 = global_2.member[(_e684 + 2u)]; + let _e707 = global_2.member[(_e684 + 3u)]; + let _e713 = global_2.member[(_e684 + 4u)]; + let _e718 = global_2.member[(_e684 + 5u)]; + let _e723 = global_2.member[(_e684 + 6u)]; + let _e728 = global_2.member[(_e684 + 7u)]; + let _e734 = global_2.member[(_e684 + 8u)]; + let _e739 = global_2.member[(_e684 + 9u)]; + let _e744 = global_2.member[(_e684 + 10u)]; + let _e749 = global_2.member[(_e684 + 11u)]; + let _e755 = global_2.member[(_e684 + 12u)]; + let _e760 = global_2.member[(_e684 + 13u)]; + let _e765 = global_2.member[(_e684 + 14u)]; + let _e770 = global_2.member[(_e684 + 15u)]; + phi_1398_ = type_20(vec4(bitcast(_e692), bitcast(_e697), bitcast(_e702), bitcast(_e707)), vec4(bitcast(_e713), bitcast(_e718), bitcast(_e723), bitcast(_e728)), vec4(bitcast(_e734), bitcast(_e739), bitcast(_e744), bitcast(_e749)), vec4(bitcast(_e755), bitcast(_e760), bitcast(_e765), bitcast(_e770))); } else { - phi_1386_ = type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); + phi_1398_ = type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); } - let _e781 = phi_1386_; - let _e789 = (_e681.member_1.x + _e681.member_1.x); - let _e790 = (_e681.member_1.y + _e681.member_1.y); - let _e791 = (_e681.member_1.z + _e681.member_1.z); - let _e793 = (_e681.member_1.z * _e791); - let _e794 = (_e681.member_1.w * _e789); - let _e795 = (_e681.member_1.w * _e790); - let _e796 = (_e681.member_1.w * _e791); - let _e816 = (vec4((1f - fma(_e681.member_1.y, _e790, _e793)), fma(_e681.member_1.x, _e790, _e796), fma(_e681.member_1.x, _e791, -(_e795)), 0f) * _e681.member_2.x); - let _e818 = (vec4(fma(_e681.member_1.x, _e790, -(_e796)), (1f - fma(_e681.member_1.x, _e789, _e793)), fma(_e681.member_1.y, _e791, _e794), 0f) * _e681.member_2.y); - let _e820 = (vec4(fma(_e681.member_1.x, _e791, _e795), fma(_e681.member_1.y, _e791, -(_e794)), (1f - fma(_e681.member_1.x, _e789, (_e681.member_1.y * _e790))), 0f) * _e681.member_2.z); - if _e601 { + let _e775 = phi_1398_; + let _e783 = (_e675.member_1.x + _e675.member_1.x); + let _e784 = (_e675.member_1.y + _e675.member_1.y); + let _e785 = (_e675.member_1.z + _e675.member_1.z); + let _e787 = (_e675.member_1.z * _e785); + let _e788 = (_e675.member_1.w * _e783); + let _e789 = (_e675.member_1.w * _e784); + let _e790 = (_e675.member_1.w * _e785); + let _e810 = (vec4((1f - fma(_e675.member_1.y, _e784, _e787)), fma(_e675.member_1.x, _e784, _e790), fma(_e675.member_1.x, _e785, -(_e789)), 0f) * _e675.member_2.x); + let _e812 = (vec4(fma(_e675.member_1.x, _e784, -(_e790)), (1f - fma(_e675.member_1.x, _e783, _e787)), fma(_e675.member_1.y, _e785, _e788), 0f) * _e675.member_2.y); + let _e814 = (vec4(fma(_e675.member_1.x, _e785, _e789), fma(_e675.member_1.y, _e785, -(_e788)), (1f - fma(_e675.member_1.x, _e783, (_e675.member_1.y * _e784))), 0f) * _e675.member_2.z); + if _e595 { } else { - phi_3863_ = true; + phi_3867_ = true; break; } - let _e925 = local[_e594.member_1]; - phi_1207_ = type_20((_e579.member + (vec4(fma(_e681.member.x, _e781.member.w, fma(_e820.x, _e781.member.z, fma(_e816.x, _e781.member.x, (_e818.x * _e781.member.y)))), fma(_e681.member.y, _e781.member.w, fma(_e820.y, _e781.member.z, fma(_e816.y, _e781.member.x, (_e818.y * _e781.member.y)))), fma(_e681.member.z, _e781.member.w, fma(_e820.z, _e781.member.z, fma(_e816.z, _e781.member.x, (_e818.z * _e781.member.y)))), (fma(_e820.w, _e781.member.z, fma(_e816.w, _e781.member.x, (_e818.w * _e781.member.y))) + _e781.member.w)) * _e925)), (_e579.member_1 + (vec4(fma(_e681.member.x, _e781.member_1.w, fma(_e820.x, _e781.member_1.z, fma(_e816.x, _e781.member_1.x, (_e818.x * _e781.member_1.y)))), fma(_e681.member.y, _e781.member_1.w, fma(_e820.y, _e781.member_1.z, fma(_e816.y, _e781.member_1.x, (_e818.y * _e781.member_1.y)))), fma(_e681.member.z, _e781.member_1.w, fma(_e820.z, _e781.member_1.z, fma(_e816.z, _e781.member_1.x, (_e818.z * _e781.member_1.y)))), (fma(_e820.w, _e781.member_1.z, fma(_e816.w, _e781.member_1.x, (_e818.w * _e781.member_1.y))) + _e781.member_1.w)) * _e925)), (_e579.member_2 + (vec4(fma(_e681.member.x, _e781.member_2.w, fma(_e820.x, _e781.member_2.z, fma(_e816.x, _e781.member_2.x, (_e818.x * _e781.member_2.y)))), fma(_e681.member.y, _e781.member_2.w, fma(_e820.y, _e781.member_2.z, fma(_e816.y, _e781.member_2.x, (_e818.y * _e781.member_2.y)))), fma(_e681.member.z, _e781.member_2.w, fma(_e820.z, _e781.member_2.z, fma(_e816.z, _e781.member_2.x, (_e818.z * _e781.member_2.y)))), (fma(_e820.w, _e781.member_2.z, fma(_e816.w, _e781.member_2.x, (_e818.w * _e781.member_2.y))) + _e781.member_2.w)) * _e925)), (_e579.member_3 + (vec4(fma(_e681.member.x, _e781.member_3.w, fma(_e820.x, _e781.member_3.z, fma(_e816.x, _e781.member_3.x, (_e818.x * _e781.member_3.y)))), fma(_e681.member.y, _e781.member_3.w, fma(_e820.y, _e781.member_3.z, fma(_e816.y, _e781.member_3.x, (_e818.y * _e781.member_3.y)))), fma(_e681.member.z, _e781.member_3.w, fma(_e820.z, _e781.member_3.z, fma(_e816.z, _e781.member_3.x, (_e818.z * _e781.member_3.y)))), (fma(_e820.w, _e781.member_3.z, fma(_e816.w, _e781.member_3.x, (_e818.w * _e781.member_3.y))) + _e781.member_3.w)) * _e925))); - phi_1623_ = true; + let _e919 = local[_e588.member_1]; + phi_1219_ = type_20((_e573.member + (vec4(fma(_e675.member.x, _e775.member.w, fma(_e814.x, _e775.member.z, fma(_e810.x, _e775.member.x, (_e812.x * _e775.member.y)))), fma(_e675.member.y, _e775.member.w, fma(_e814.y, _e775.member.z, fma(_e810.y, _e775.member.x, (_e812.y * _e775.member.y)))), fma(_e675.member.z, _e775.member.w, fma(_e814.z, _e775.member.z, fma(_e810.z, _e775.member.x, (_e812.z * _e775.member.y)))), (fma(_e814.w, _e775.member.z, fma(_e810.w, _e775.member.x, (_e812.w * _e775.member.y))) + _e775.member.w)) * _e919)), (_e573.member_1 + (vec4(fma(_e675.member.x, _e775.member_1.w, fma(_e814.x, _e775.member_1.z, fma(_e810.x, _e775.member_1.x, (_e812.x * _e775.member_1.y)))), fma(_e675.member.y, _e775.member_1.w, fma(_e814.y, _e775.member_1.z, fma(_e810.y, _e775.member_1.x, (_e812.y * _e775.member_1.y)))), fma(_e675.member.z, _e775.member_1.w, fma(_e814.z, _e775.member_1.z, fma(_e810.z, _e775.member_1.x, (_e812.z * _e775.member_1.y)))), (fma(_e814.w, _e775.member_1.z, fma(_e810.w, _e775.member_1.x, (_e812.w * _e775.member_1.y))) + _e775.member_1.w)) * _e919)), (_e573.member_2 + (vec4(fma(_e675.member.x, _e775.member_2.w, fma(_e814.x, _e775.member_2.z, fma(_e810.x, _e775.member_2.x, (_e812.x * _e775.member_2.y)))), fma(_e675.member.y, _e775.member_2.w, fma(_e814.y, _e775.member_2.z, fma(_e810.y, _e775.member_2.x, (_e812.y * _e775.member_2.y)))), fma(_e675.member.z, _e775.member_2.w, fma(_e814.z, _e775.member_2.z, fma(_e810.z, _e775.member_2.x, (_e812.z * _e775.member_2.y)))), (fma(_e814.w, _e775.member_2.z, fma(_e810.w, _e775.member_2.x, (_e812.w * _e775.member_2.y))) + _e775.member_2.w)) * _e919)), (_e573.member_3 + (vec4(fma(_e675.member.x, _e775.member_3.w, fma(_e814.x, _e775.member_3.z, fma(_e810.x, _e775.member_3.x, (_e812.x * _e775.member_3.y)))), fma(_e675.member.y, _e775.member_3.w, fma(_e814.y, _e775.member_3.z, fma(_e810.y, _e775.member_3.x, (_e812.y * _e775.member_3.y)))), fma(_e675.member.z, _e775.member_3.w, fma(_e814.z, _e775.member_3.z, fma(_e810.z, _e775.member_3.x, (_e812.z * _e775.member_3.y)))), (fma(_e814.w, _e775.member_3.z, fma(_e810.w, _e775.member_3.x, (_e812.w * _e775.member_3.y))) + _e775.member_3.w)) * _e919))); + phi_1635_ = true; break; } default: { - phi_1207_ = type_20(); - phi_1623_ = bool(); + phi_1219_ = type_20(); + phi_1635_ = bool(); break; } } - let _e940 = phi_1207_; - let _e942 = phi_1623_; + let _e934 = phi_1219_; + let _e936 = phi_1635_; continue; continuing { - phi_1203_ = _e592; - phi_1206_ = _e940; - phi_3863_ = false; - break if !(_e942); + phi_1215_ = _e586; + phi_1218_ = _e934; + phi_3867_ = false; + break if !(_e936); } } - let _e945 = phi_3863_; - if _e945 { + let _e939 = phi_3867_; + if _e939 { break; } - let _e947 = local_11; - let _e952 = global_10.member[0u]; - if (_e947.member.x == _e952) { - let _e955 = local_12; - let _e960 = global_10.member[1u]; - if (_e955.member.y == _e960) { - let _e963 = local_13; - let _e968 = global_10.member[2u]; - let _e969 = (_e963.member.z == _e968); - if _e969 { - let _e971 = local_14; - let _e976 = global_10.member[3u]; - phi_1650_ = (_e971.member.w == _e976); + let _e941 = local_11; + let _e946 = global_8.member[0u]; + if (_e941.member.x == _e946) { + let _e949 = local_12; + let _e954 = global_8.member[1u]; + if (_e949.member.y == _e954) { + let _e957 = local_13; + let _e962 = global_8.member[2u]; + let _e963 = (_e957.member.z == _e962); + if _e963 { + let _e965 = local_14; + let _e970 = global_8.member[3u]; + phi_1662_ = (_e965.member.w == _e970); } else { - phi_1650_ = bool(); + phi_1662_ = bool(); } - let _e979 = phi_1650_; - phi_1652_ = _e979; - phi_1653_ = select(true, false, _e969); + let _e973 = phi_1662_; + phi_1664_ = _e973; + phi_1665_ = select(true, false, _e963); } else { - phi_1652_ = bool(); - phi_1653_ = true; + phi_1664_ = bool(); + phi_1665_ = true; } - let _e982 = phi_1652_; - let _e984 = phi_1653_; - phi_1654_ = _e982; - phi_1655_ = _e984; + let _e976 = phi_1664_; + let _e978 = phi_1665_; + phi_1666_ = _e976; + phi_1667_ = _e978; } else { - phi_1654_ = bool(); - phi_1655_ = true; + phi_1666_ = bool(); + phi_1667_ = true; } - let _e986 = phi_1654_; - let _e988 = phi_1655_; - if select(_e986, false, _e988) { - let _e991 = local_15; - let _e996 = global_10.member_1[0u]; - if (_e991.member_1.x == _e996) { - let _e999 = local_16; - let _e1004 = global_10.member_1[1u]; - if (_e999.member_1.y == _e1004) { - let _e1007 = local_17; - let _e1012 = global_10.member_1[2u]; - let _e1013 = (_e1007.member_1.z == _e1012); - if _e1013 { - let _e1015 = local_18; - let _e1020 = global_10.member_1[3u]; - phi_1689_ = (_e1015.member_1.w == _e1020); + let _e980 = phi_1666_; + let _e982 = phi_1667_; + if select(_e980, false, _e982) { + let _e985 = local_15; + let _e990 = global_8.member_1[0u]; + if (_e985.member_1.x == _e990) { + let _e993 = local_16; + let _e998 = global_8.member_1[1u]; + if (_e993.member_1.y == _e998) { + let _e1001 = local_17; + let _e1006 = global_8.member_1[2u]; + let _e1007 = (_e1001.member_1.z == _e1006); + if _e1007 { + let _e1009 = local_18; + let _e1014 = global_8.member_1[3u]; + phi_1701_ = (_e1009.member_1.w == _e1014); } else { - phi_1689_ = bool(); + phi_1701_ = bool(); } - let _e1023 = phi_1689_; - phi_1691_ = _e1023; - phi_1692_ = select(true, false, _e1013); + let _e1017 = phi_1701_; + phi_1703_ = _e1017; + phi_1704_ = select(true, false, _e1007); } else { - phi_1691_ = bool(); - phi_1692_ = true; + phi_1703_ = bool(); + phi_1704_ = true; } - let _e1026 = phi_1691_; - let _e1028 = phi_1692_; - phi_1693_ = _e1026; - phi_1694_ = _e1028; + let _e1020 = phi_1703_; + let _e1022 = phi_1704_; + phi_1705_ = _e1020; + phi_1706_ = _e1022; } else { - phi_1693_ = bool(); - phi_1694_ = true; + phi_1705_ = bool(); + phi_1706_ = true; } - let _e1030 = phi_1693_; - let _e1032 = phi_1694_; - if select(_e1030, false, _e1032) { - let _e1035 = local_19; - let _e1040 = global_10.member_2[0u]; - if (_e1035.member_2.x == _e1040) { - let _e1043 = local_20; - let _e1048 = global_10.member_2[1u]; - if (_e1043.member_2.y == _e1048) { - let _e1051 = local_21; - let _e1056 = global_10.member_2[2u]; - let _e1057 = (_e1051.member_2.z == _e1056); - if _e1057 { - let _e1059 = local_22; - let _e1064 = global_10.member_2[3u]; - phi_1728_ = (_e1059.member_2.w == _e1064); + let _e1024 = phi_1705_; + let _e1026 = phi_1706_; + if select(_e1024, false, _e1026) { + let _e1029 = local_19; + let _e1034 = global_8.member_2[0u]; + if (_e1029.member_2.x == _e1034) { + let _e1037 = local_20; + let _e1042 = global_8.member_2[1u]; + if (_e1037.member_2.y == _e1042) { + let _e1045 = local_21; + let _e1050 = global_8.member_2[2u]; + let _e1051 = (_e1045.member_2.z == _e1050); + if _e1051 { + let _e1053 = local_22; + let _e1058 = global_8.member_2[3u]; + phi_1740_ = (_e1053.member_2.w == _e1058); } else { - phi_1728_ = bool(); + phi_1740_ = bool(); } - let _e1067 = phi_1728_; - phi_1730_ = _e1067; - phi_1731_ = select(true, false, _e1057); + let _e1061 = phi_1740_; + phi_1742_ = _e1061; + phi_1743_ = select(true, false, _e1051); } else { - phi_1730_ = bool(); - phi_1731_ = true; + phi_1742_ = bool(); + phi_1743_ = true; } - let _e1070 = phi_1730_; - let _e1072 = phi_1731_; - phi_1732_ = _e1070; - phi_1733_ = _e1072; + let _e1064 = phi_1742_; + let _e1066 = phi_1743_; + phi_1744_ = _e1064; + phi_1745_ = _e1066; } else { - phi_1732_ = bool(); - phi_1733_ = true; + phi_1744_ = bool(); + phi_1745_ = true; } - let _e1074 = phi_1732_; - let _e1076 = phi_1733_; - let _e1077 = select(_e1074, false, _e1076); - if _e1077 { - let _e1079 = local_23; - let _e1084 = global_10.member_3[0u]; - if (_e1079.member_3.x == _e1084) { - let _e1087 = local_24; - let _e1092 = global_10.member_3[1u]; - if (_e1087.member_3.y == _e1092) { - let _e1095 = local_25; - let _e1100 = global_10.member_3[2u]; - let _e1101 = (_e1095.member_3.z == _e1100); - if _e1101 { - let _e1103 = local_26; - let _e1108 = global_10.member_3[3u]; - phi_1767_ = (_e1103.member_3.w == _e1108); + let _e1068 = phi_1744_; + let _e1070 = phi_1745_; + let _e1071 = select(_e1068, false, _e1070); + if _e1071 { + let _e1073 = local_23; + let _e1078 = global_8.member_3[0u]; + if (_e1073.member_3.x == _e1078) { + let _e1081 = local_24; + let _e1086 = global_8.member_3[1u]; + if (_e1081.member_3.y == _e1086) { + let _e1089 = local_25; + let _e1094 = global_8.member_3[2u]; + let _e1095 = (_e1089.member_3.z == _e1094); + if _e1095 { + let _e1097 = local_26; + let _e1102 = global_8.member_3[3u]; + phi_1779_ = (_e1097.member_3.w == _e1102); } else { - phi_1767_ = bool(); + phi_1779_ = bool(); } - let _e1111 = phi_1767_; - phi_1769_ = _e1111; - phi_1770_ = select(true, false, _e1101); + let _e1105 = phi_1779_; + phi_1781_ = _e1105; + phi_1782_ = select(true, false, _e1095); } else { - phi_1769_ = bool(); - phi_1770_ = true; + phi_1781_ = bool(); + phi_1782_ = true; } - let _e1114 = phi_1769_; - let _e1116 = phi_1770_; - phi_1771_ = _e1114; - phi_1772_ = _e1116; + let _e1108 = phi_1781_; + let _e1110 = phi_1782_; + phi_1783_ = _e1108; + phi_1784_ = _e1110; } else { - phi_1771_ = bool(); - phi_1772_ = true; + phi_1783_ = bool(); + phi_1784_ = true; } - let _e1118 = phi_1771_; - let _e1120 = phi_1772_; - phi_1777_ = select(_e1118, false, _e1120); + let _e1112 = phi_1783_; + let _e1114 = phi_1784_; + phi_1789_ = select(_e1112, false, _e1114); } else { - phi_1777_ = bool(); + phi_1789_ = bool(); } - let _e1123 = phi_1777_; - phi_1779_ = _e1123; - phi_1780_ = select(true, false, _e1077); + let _e1117 = phi_1789_; + phi_1791_ = _e1117; + phi_1792_ = select(true, false, _e1071); } else { - phi_1779_ = bool(); - phi_1780_ = true; + phi_1791_ = bool(); + phi_1792_ = true; } - let _e1126 = phi_1779_; - let _e1128 = phi_1780_; - phi_1781_ = _e1126; - phi_1782_ = _e1128; + let _e1120 = phi_1791_; + let _e1122 = phi_1792_; + phi_1793_ = _e1120; + phi_1794_ = _e1122; } else { - phi_1781_ = bool(); - phi_1782_ = true; + phi_1793_ = bool(); + phi_1794_ = true; } - let _e1130 = phi_1781_; - let _e1132 = phi_1782_; - if select(_e1130, false, _e1132) { - phi_1790_ = type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); + let _e1124 = phi_1793_; + let _e1126 = phi_1794_; + if select(_e1124, false, _e1126) { + phi_1802_ = type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); } else { - let _e2062 = local_31; - phi_1790_ = _e2062; + let _e2056 = local_31; + phi_1802_ = _e2056; } - let _e1135 = phi_1790_; - let _e1158 = fma(_e1135.member_2.z, _e1135.member_3.w, -((_e1135.member_2.w * _e1135.member_3.z))); - let _e1161 = fma(_e1135.member_2.y, _e1135.member_3.w, -((_e1135.member_2.w * _e1135.member_3.y))); - let _e1164 = fma(_e1135.member_2.y, _e1135.member_3.z, -((_e1135.member_2.z * _e1135.member_3.y))); - let _e1167 = fma(_e1135.member_2.x, _e1135.member_3.w, -((_e1135.member_2.w * _e1135.member_3.x))); - let _e1170 = fma(_e1135.member_2.x, _e1135.member_3.z, -((_e1135.member_2.z * _e1135.member_3.x))); - let _e1173 = fma(_e1135.member_2.x, _e1135.member_3.y, -((_e1135.member_2.y * _e1135.member_3.x))); - let _e1195 = fma(-(_e1135.member.w), fma(_e1135.member_1.z, _e1173, fma(_e1135.member_1.x, _e1164, -((_e1135.member_1.y * _e1170)))), fma(_e1135.member.z, fma(_e1135.member_1.w, _e1173, fma(_e1135.member_1.x, _e1161, -((_e1135.member_1.y * _e1167)))), fma(_e1135.member.x, fma(_e1135.member_1.w, _e1164, fma(_e1135.member_1.y, _e1158, -((_e1135.member_1.z * _e1161)))), -((_e1135.member.y * fma(_e1135.member_1.w, _e1170, fma(_e1135.member_1.x, _e1158, -((_e1135.member_1.z * _e1167))))))))); - if (_e1195 == 0f) { - phi_3293_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); - phi_3294_ = type_27(); - phi_3295_ = true; + let _e1129 = phi_1802_; + let _e1152 = fma(_e1129.member_2.z, _e1129.member_3.w, -((_e1129.member_2.w * _e1129.member_3.z))); + let _e1155 = fma(_e1129.member_2.y, _e1129.member_3.w, -((_e1129.member_2.w * _e1129.member_3.y))); + let _e1158 = fma(_e1129.member_2.y, _e1129.member_3.z, -((_e1129.member_2.z * _e1129.member_3.y))); + let _e1161 = fma(_e1129.member_2.x, _e1129.member_3.w, -((_e1129.member_2.w * _e1129.member_3.x))); + let _e1164 = fma(_e1129.member_2.x, _e1129.member_3.z, -((_e1129.member_2.z * _e1129.member_3.x))); + let _e1167 = fma(_e1129.member_2.x, _e1129.member_3.y, -((_e1129.member_2.y * _e1129.member_3.x))); + let _e1189 = fma(-(_e1129.member.w), fma(_e1129.member_1.z, _e1167, fma(_e1129.member_1.x, _e1158, -((_e1129.member_1.y * _e1164)))), fma(_e1129.member.z, fma(_e1129.member_1.w, _e1167, fma(_e1129.member_1.x, _e1155, -((_e1129.member_1.y * _e1161)))), fma(_e1129.member.x, fma(_e1129.member_1.w, _e1158, fma(_e1129.member_1.y, _e1152, -((_e1129.member_1.z * _e1155)))), -((_e1129.member.y * fma(_e1129.member_1.w, _e1164, fma(_e1129.member_1.x, _e1152, -((_e1129.member_1.z * _e1161))))))))); + if (_e1189 == 0f) { + phi_3298_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); + phi_3299_ = type_27(); + phi_3300_ = true; } else { - let _e1204 = (sqrt(fma(_e1135.member.w, _e1135.member.w, fma(_e1135.member.z, _e1135.member.z, fma(_e1135.member.x, _e1135.member.x, (_e1135.member.y * _e1135.member.y))))) * select(-1f, 1f, (_e1195 >= 0f))); - let _e1209 = sqrt(fma(_e1135.member_1.w, _e1135.member_1.w, fma(_e1135.member_1.z, _e1135.member_1.z, fma(_e1135.member_1.x, _e1135.member_1.x, (_e1135.member_1.y * _e1135.member_1.y))))); - let _e1214 = sqrt(fma(_e1135.member_2.w, _e1135.member_2.w, fma(_e1135.member_2.z, _e1135.member_2.z, fma(_e1135.member_2.x, _e1135.member_2.x, (_e1135.member_2.y * _e1135.member_2.y))))); - if (_e1204 != 0f) { - phi_3183_ = select(true, false, (_e1209 != 0f)); + let _e1198 = (sqrt(fma(_e1129.member.w, _e1129.member.w, fma(_e1129.member.z, _e1129.member.z, fma(_e1129.member.x, _e1129.member.x, (_e1129.member.y * _e1129.member.y))))) * select(-1f, 1f, (_e1189 >= 0f))); + let _e1203 = sqrt(fma(_e1129.member_1.w, _e1129.member_1.w, fma(_e1129.member_1.z, _e1129.member_1.z, fma(_e1129.member_1.x, _e1129.member_1.x, (_e1129.member_1.y * _e1129.member_1.y))))); + let _e1208 = sqrt(fma(_e1129.member_2.w, _e1129.member_2.w, fma(_e1129.member_2.z, _e1129.member_2.z, fma(_e1129.member_2.x, _e1129.member_2.x, (_e1129.member_2.y * _e1129.member_2.y))))); + if (_e1198 != 0f) { + phi_3188_ = select(true, false, (_e1203 != 0f)); } else { - phi_3183_ = true; + phi_3188_ = true; } - let _e1221 = phi_3183_; - let _e1222 = select((_e1214 != 0f), false, _e1221); - if _e1222 { - let _e1223 = (1f / _e1204); - let _e1224 = (1f / _e1209); - let _e1225 = (1f / _e1214); - let _e1226 = (_e1135.member.x * _e1223); - let _e1227 = (_e1135.member.z * _e1223); - let _e1228 = (_e1135.member_1.x * _e1224); - let _e1229 = (_e1135.member_2.x * _e1225); - let _e1230 = (_e1135.member_2.y * _e1225); - if ((_e1135.member_2.z * _e1225) <= 0f) { - let _e1234 = fma(_e1135.member_1.y, _e1224, -(_e1226)); - let _e1236 = fma(-(_e1135.member_2.z), _e1225, 1f); - if (_e1234 <= 0f) { - let _e1238 = (_e1236 - _e1234); - let _e1240 = (0.5f / sqrt(_e1238)); - phi_3246_ = vec4((_e1238 * _e1240), (fma(_e1135.member.y, _e1223, _e1228) * _e1240), (fma(_e1135.member.z, _e1223, _e1229) * _e1240), (fma(_e1135.member_1.z, _e1224, -(_e1230)) * _e1240)); + let _e1215 = phi_3188_; + let _e1216 = select((_e1208 != 0f), false, _e1215); + if _e1216 { + let _e1217 = (1f / _e1198); + let _e1218 = (1f / _e1203); + let _e1219 = (1f / _e1208); + let _e1220 = (_e1129.member.x * _e1217); + let _e1221 = (_e1129.member.z * _e1217); + let _e1222 = (_e1129.member_1.x * _e1218); + let _e1223 = (_e1129.member_2.x * _e1219); + let _e1224 = (_e1129.member_2.y * _e1219); + if ((_e1129.member_2.z * _e1219) <= 0f) { + let _e1228 = fma(_e1129.member_1.y, _e1218, -(_e1220)); + let _e1230 = fma(-(_e1129.member_2.z), _e1219, 1f); + if (_e1228 <= 0f) { + let _e1232 = (_e1230 - _e1228); + let _e1234 = (0.5f / sqrt(_e1232)); + phi_3251_ = vec4((_e1232 * _e1234), (fma(_e1129.member.y, _e1217, _e1222) * _e1234), (fma(_e1129.member.z, _e1217, _e1223) * _e1234), (fma(_e1129.member_1.z, _e1218, -(_e1224)) * _e1234)); } else { - let _e1250 = (_e1236 + _e1234); - let _e1252 = (0.5f / sqrt(_e1250)); - phi_3246_ = vec4((fma(_e1135.member.y, _e1223, _e1228) * _e1252), (_e1250 * _e1252), (fma(_e1135.member_1.z, _e1224, _e1230) * _e1252), (fma(_e1135.member_2.x, _e1225, -(_e1227)) * _e1252)); + let _e1244 = (_e1230 + _e1228); + let _e1246 = (0.5f / sqrt(_e1244)); + phi_3251_ = vec4((fma(_e1129.member.y, _e1217, _e1222) * _e1246), (_e1244 * _e1246), (fma(_e1129.member_1.z, _e1218, _e1224) * _e1246), (fma(_e1129.member_2.x, _e1219, -(_e1221)) * _e1246)); } - let _e1263 = phi_3246_; - phi_3278_ = _e1263; + let _e1257 = phi_3251_; + phi_3283_ = _e1257; } else { - let _e1264 = fma(_e1135.member_1.y, _e1224, _e1226); - let _e1265 = fma(_e1135.member_2.z, _e1225, 1f); - if (_e1264 <= 0f) { - let _e1267 = (_e1265 - _e1264); - let _e1269 = (0.5f / sqrt(_e1267)); - phi_3276_ = vec4((fma(_e1135.member.z, _e1223, _e1229) * _e1269), (fma(_e1135.member_1.z, _e1224, _e1230) * _e1269), (_e1267 * _e1269), (fma(_e1135.member.y, _e1223, -(_e1228)) * _e1269)); + let _e1258 = fma(_e1129.member_1.y, _e1218, _e1220); + let _e1259 = fma(_e1129.member_2.z, _e1219, 1f); + if (_e1258 <= 0f) { + let _e1261 = (_e1259 - _e1258); + let _e1263 = (0.5f / sqrt(_e1261)); + phi_3281_ = vec4((fma(_e1129.member.z, _e1217, _e1223) * _e1263), (fma(_e1129.member_1.z, _e1218, _e1224) * _e1263), (_e1261 * _e1263), (fma(_e1129.member.y, _e1217, -(_e1222)) * _e1263)); } else { - let _e1279 = (_e1265 + _e1264); - let _e1281 = (0.5f / sqrt(_e1279)); - phi_3276_ = vec4((fma(_e1135.member_1.z, _e1224, -(_e1230)) * _e1281), (fma(_e1135.member_2.x, _e1225, -(_e1227)) * _e1281), (fma(_e1135.member.y, _e1223, -(_e1228)) * _e1281), (_e1279 * _e1281)); + let _e1273 = (_e1259 + _e1258); + let _e1275 = (0.5f / sqrt(_e1273)); + phi_3281_ = vec4((fma(_e1129.member_1.z, _e1218, -(_e1224)) * _e1275), (fma(_e1129.member_2.x, _e1219, -(_e1221)) * _e1275), (fma(_e1129.member.y, _e1217, -(_e1222)) * _e1275), (_e1273 * _e1275)); } - let _e1294 = phi_3276_; - phi_3278_ = _e1294; + let _e1288 = phi_3281_; + phi_3283_ = _e1288; } - let _e1296 = phi_3278_; - phi_3289_ = type_27(vec3(_e1204, _e1209, _e1214), _e1296, vec3(_e1135.member_3.x, _e1135.member_3.y, _e1135.member_3.z)); - phi_3290_ = type_27(); + let _e1290 = phi_3283_; + phi_3294_ = type_27(vec3(_e1198, _e1203, _e1208), _e1290, vec3(_e1129.member_3.x, _e1129.member_3.y, _e1129.member_3.z)); + phi_3295_ = type_27(); } else { - phi_3289_ = type_27(); - phi_3290_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); + phi_3294_ = type_27(); + phi_3295_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); } - let _e1300 = phi_3289_; - let _e1302 = phi_3290_; - phi_3293_ = _e1302; - phi_3294_ = _e1300; - phi_3295_ = select(true, false, _e1222); + let _e1294 = phi_3294_; + let _e1296 = phi_3295_; + phi_3298_ = _e1296; + phi_3299_ = _e1294; + phi_3300_ = select(true, false, _e1216); } - let _e1305 = phi_3293_; - let _e1307 = phi_3294_; - let _e1309 = phi_3295_; - if _e1309 { - phi_3299_ = _e1305; + let _e1299 = phi_3298_; + let _e1301 = phi_3299_; + let _e1303 = phi_3300_; + if _e1303 { + phi_3304_ = _e1299; } else { - phi_3299_ = _e1307; + phi_3304_ = _e1301; } - let _e1311 = phi_3299_; - phi_1792_ = type_27(_e1311.member_2, _e1311.member_1, _e1311.member); + let _e1305 = phi_3304_; + phi_1804_ = type_27(_e1305.member_2, _e1305.member_1, _e1305.member); } else { - phi_1792_ = type_27(); + phi_1804_ = type_27(); } - let _e1317 = phi_1792_; - phi_1794_ = _e1317; - phi_1795_ = select(true, false, _e547); + let _e1311 = phi_1804_; + phi_1806_ = _e1311; + phi_1807_ = select(true, false, _e541); } else { - phi_1794_ = type_27(); - phi_1795_ = true; + phi_1806_ = type_27(); + phi_1807_ = true; } - let _e1320 = phi_1794_; - let _e1322 = phi_1795_; - if _e1322 { - if (_e100 >= 10u) { - phi_3393_ = (_e128 <= (_e100 - 10u)); + let _e1314 = phi_1806_; + let _e1316 = phi_1807_; + if _e1316 { + if (_e98 >= 10u) { + phi_3398_ = (_e126 <= (_e98 - 10u)); } else { - phi_3393_ = false; + phi_3398_ = false; } - let _e1327 = phi_3393_; - if _e1327 { - let _e1330 = global_2.member[_e128]; - let _e1335 = global_2.member[(_e128 + 1u)]; - let _e1340 = global_2.member[(_e128 + 2u)]; - let _e1346 = global_2.member[(_e128 + 3u)]; - let _e1351 = global_2.member[(_e128 + 4u)]; - let _e1356 = global_2.member[(_e128 + 5u)]; - let _e1361 = global_2.member[(_e128 + 6u)]; - let _e1367 = global_2.member[(_e128 + 7u)]; - let _e1372 = global_2.member[(_e128 + 8u)]; - let _e1377 = global_2.member[(_e128 + 9u)]; - phi_1848_ = type_27(vec3(bitcast(_e1330), bitcast(_e1335), bitcast(_e1340)), vec4(bitcast(_e1346), bitcast(_e1351), bitcast(_e1356), bitcast(_e1361)), vec3(bitcast(_e1367), bitcast(_e1372), bitcast(_e1377))); + let _e1321 = phi_3398_; + if _e1321 { + let _e1324 = global_2.member[_e126]; + let _e1329 = global_2.member[(_e126 + 1u)]; + let _e1334 = global_2.member[(_e126 + 2u)]; + let _e1340 = global_2.member[(_e126 + 3u)]; + let _e1345 = global_2.member[(_e126 + 4u)]; + let _e1350 = global_2.member[(_e126 + 5u)]; + let _e1355 = global_2.member[(_e126 + 6u)]; + let _e1361 = global_2.member[(_e126 + 7u)]; + let _e1366 = global_2.member[(_e126 + 8u)]; + let _e1371 = global_2.member[(_e126 + 9u)]; + phi_1860_ = type_27(vec3(bitcast(_e1324), bitcast(_e1329), bitcast(_e1334)), vec4(bitcast(_e1340), bitcast(_e1345), bitcast(_e1350), bitcast(_e1355)), vec3(bitcast(_e1361), bitcast(_e1366), bitcast(_e1371))); } else { - phi_1848_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_1860_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e1382 = phi_1848_; - phi_1849_ = _e1382; + let _e1376 = phi_1860_; + phi_1861_ = _e1376; } else { - phi_1849_ = _e1320; + phi_1861_ = _e1314; } - let _e1384 = phi_1849_; - let _e1393 = local_27; - let _e1401 = sqrt(fma(_e1393.member_2.z, _e1393.member_2.z, fma(_e1393.member_2.x, _e1393.member_2.x, (_e1393.member_2.y * _e1393.member_2.y)))); - if (_e1401 == 0f) { - phi_1893_ = vec3(0f, 0f, 0f); + let _e1378 = phi_1861_; + let _e1387 = local_27; + let _e1395 = sqrt(fma(_e1387.member_2.z, _e1387.member_2.z, fma(_e1387.member_2.x, _e1387.member_2.x, (_e1387.member_2.y * _e1387.member_2.y)))); + if (_e1395 == 0f) { + phi_1905_ = vec3(0f, 0f, 0f); } else { - phi_1893_ = (_e1393.member_2 * (1f / _e1401)); + phi_1905_ = (_e1387.member_2 * (1f / _e1395)); } - let _e1406 = phi_1893_; - let _e1408 = local_28; - let _e1417 = sqrt(fma(_e1408.member_3.z, _e1408.member_3.z, fma(_e1408.member_3.x, _e1408.member_3.x, (_e1408.member_3.y * _e1408.member_3.y)))); - if (_e1417 == 0f) { - phi_3438_ = vec3(0f, 0f, 0f); + let _e1400 = phi_1905_; + let _e1402 = local_28; + let _e1411 = sqrt(fma(_e1402.member_3.z, _e1402.member_3.z, fma(_e1402.member_3.x, _e1402.member_3.x, (_e1402.member_3.y * _e1402.member_3.y)))); + if (_e1411 == 0f) { + phi_3442_ = vec3(0f, 0f, 0f); } else { - phi_3438_ = (vec3(_e1408.member_3.x, _e1408.member_3.y, _e1408.member_3.z) * (1f / _e1417)); + phi_3442_ = (vec3(_e1402.member_3.x, _e1402.member_3.y, _e1402.member_3.z) * (1f / _e1411)); } - let _e1422 = phi_3438_; - let _e1429 = (_e1384.member_1.x + _e1384.member_1.x); - let _e1430 = (_e1384.member_1.y + _e1384.member_1.y); - let _e1431 = (_e1384.member_1.z + _e1384.member_1.z); - let _e1433 = (_e1384.member_1.z * _e1431); - let _e1434 = (_e1384.member_1.w * _e1429); - let _e1435 = (_e1384.member_1.w * _e1430); - let _e1436 = (_e1384.member_1.w * _e1431); - let _e1455 = (vec4((1f - fma(_e1384.member_1.y, _e1430, _e1433)), fma(_e1384.member_1.x, _e1430, _e1436), fma(_e1384.member_1.x, _e1431, -(_e1435)), 0f) * _e1384.member_2.x); - let _e1456 = (vec4(fma(_e1384.member_1.x, _e1430, -(_e1436)), (1f - fma(_e1384.member_1.x, _e1429, _e1433)), fma(_e1384.member_1.y, _e1431, _e1434), 0f) * _e1384.member_2.y); - let _e1457 = (vec4(fma(_e1384.member_1.x, _e1431, _e1435), fma(_e1384.member_1.y, _e1431, -(_e1434)), (1f - fma(_e1384.member_1.x, _e1429, (_e1384.member_1.y * _e1430))), 0f) * _e1384.member_2.z); - let _e1462 = (_e1406.x / (_e1384.member_2.x * _e1384.member_2.x)); - let _e1464 = (_e1406.y / (_e1384.member_2.y * _e1384.member_2.y)); - let _e1466 = (_e1406.z / (_e1384.member_2.z * _e1384.member_2.z)); - let _e1482 = fma(_e1457.x, _e1466, fma(_e1455.x, _e1462, (_e1456.x * _e1464))); - let _e1483 = fma(_e1457.y, _e1466, fma(_e1455.y, _e1462, (_e1456.y * _e1464))); - let _e1484 = fma(_e1457.z, _e1466, fma(_e1455.z, _e1462, (_e1456.z * _e1464))); - let _e1489 = sqrt(fma(_e1484, _e1484, fma(_e1482, _e1482, (_e1483 * _e1483)))); - if (_e1489 == 0f) { - phi_3520_ = vec3(0f, 0f, 0f); + let _e1416 = phi_3442_; + let _e1423 = (_e1378.member_1.x + _e1378.member_1.x); + let _e1424 = (_e1378.member_1.y + _e1378.member_1.y); + let _e1425 = (_e1378.member_1.z + _e1378.member_1.z); + let _e1427 = (_e1378.member_1.z * _e1425); + let _e1428 = (_e1378.member_1.w * _e1423); + let _e1429 = (_e1378.member_1.w * _e1424); + let _e1430 = (_e1378.member_1.w * _e1425); + let _e1449 = (vec4((1f - fma(_e1378.member_1.y, _e1424, _e1427)), fma(_e1378.member_1.x, _e1424, _e1430), fma(_e1378.member_1.x, _e1425, -(_e1429)), 0f) * _e1378.member_2.x); + let _e1450 = (vec4(fma(_e1378.member_1.x, _e1424, -(_e1430)), (1f - fma(_e1378.member_1.x, _e1423, _e1427)), fma(_e1378.member_1.y, _e1425, _e1428), 0f) * _e1378.member_2.y); + let _e1451 = (vec4(fma(_e1378.member_1.x, _e1425, _e1429), fma(_e1378.member_1.y, _e1425, -(_e1428)), (1f - fma(_e1378.member_1.x, _e1423, (_e1378.member_1.y * _e1424))), 0f) * _e1378.member_2.z); + let _e1456 = (_e1400.x / (_e1378.member_2.x * _e1378.member_2.x)); + let _e1458 = (_e1400.y / (_e1378.member_2.y * _e1378.member_2.y)); + let _e1460 = (_e1400.z / (_e1378.member_2.z * _e1378.member_2.z)); + let _e1476 = fma(_e1451.x, _e1460, fma(_e1449.x, _e1456, (_e1450.x * _e1458))); + let _e1477 = fma(_e1451.y, _e1460, fma(_e1449.y, _e1456, (_e1450.y * _e1458))); + let _e1478 = fma(_e1451.z, _e1460, fma(_e1449.z, _e1456, (_e1450.z * _e1458))); + let _e1483 = sqrt(fma(_e1478, _e1478, fma(_e1476, _e1476, (_e1477 * _e1477)))); + if (_e1483 == 0f) { + phi_3524_ = vec3(0f, 0f, 0f); } else { - phi_3520_ = (vec3(_e1482, _e1483, _e1484) * (1f / _e1489)); + phi_3524_ = (vec3(_e1476, _e1477, _e1478) * (1f / _e1483)); } - let _e1494 = phi_3520_; - global_11 = _e1494; - let _e1504 = fma(_e1457.x, _e1422.z, fma(_e1455.x, _e1422.x, (_e1456.x * _e1422.y))); - let _e1505 = fma(_e1457.y, _e1422.z, fma(_e1455.y, _e1422.x, (_e1456.y * _e1422.y))); - let _e1506 = fma(_e1457.z, _e1422.z, fma(_e1455.z, _e1422.x, (_e1456.z * _e1422.y))); - let _e1511 = sqrt(fma(_e1506, _e1506, fma(_e1504, _e1504, (_e1505 * _e1505)))); - if (_e1511 == 0f) { - phi_3555_ = vec3(0f, 0f, 0f); + let _e1488 = phi_3524_; + global_9 = _e1488; + let _e1498 = fma(_e1451.x, _e1416.z, fma(_e1449.x, _e1416.x, (_e1450.x * _e1416.y))); + let _e1499 = fma(_e1451.y, _e1416.z, fma(_e1449.y, _e1416.x, (_e1450.y * _e1416.y))); + let _e1500 = fma(_e1451.z, _e1416.z, fma(_e1449.z, _e1416.x, (_e1450.z * _e1416.y))); + let _e1505 = sqrt(fma(_e1500, _e1500, fma(_e1498, _e1498, (_e1499 * _e1499)))); + if (_e1505 == 0f) { + phi_3559_ = vec3(0f, 0f, 0f); } else { - phi_3555_ = (vec3(_e1504, _e1505, _e1506) * (1f / _e1511)); + phi_3559_ = (vec3(_e1498, _e1499, _e1500) * (1f / _e1505)); } - let _e1516 = phi_3555_; - global_12 = _e1516; - let _e1533 = local_29; - let _e1537 = select(-1f, 1f, (_e1533.member_3.w >= 0f)); - global_13 = vec3((fma(_e1494.y, _e1516.z, -((_e1516.y * _e1494.z))) * _e1537), (fma(_e1494.z, _e1516.x, -((_e1516.z * _e1494.x))) * _e1537), (fma(_e1494.x, _e1516.y, -((_e1516.x * _e1494.y))) * _e1537)); - let _e1543 = local_30; - let _e1557 = (_e1384.member.x + fma(_e1457.x, _e1543.member.z, fma(_e1456.x, _e1543.member.y, (_e1455.x * _e1543.member.x)))); - let _e1558 = (_e1384.member.y + fma(_e1457.y, _e1543.member.z, fma(_e1456.y, _e1543.member.y, (_e1455.y * _e1543.member.x)))); - let _e1559 = (_e1384.member.z + fma(_e1457.z, _e1543.member.z, fma(_e1456.z, _e1543.member.y, (_e1455.z * _e1543.member.x)))); - global_14 = vec3(_e1557, _e1558, _e1559); - if (_e100 >= 83u) { - phi_3568_ = (_e124 <= (_e100 - 83u)); + let _e1510 = phi_3559_; + global_10 = _e1510; + let _e1527 = local_29; + let _e1531 = select(-1f, 1f, (_e1527.member_3.w >= 0f)); + global_11 = vec3((fma(_e1488.y, _e1510.z, -((_e1510.y * _e1488.z))) * _e1531), (fma(_e1488.z, _e1510.x, -((_e1510.z * _e1488.x))) * _e1531), (fma(_e1488.x, _e1510.y, -((_e1510.x * _e1488.y))) * _e1531)); + let _e1537 = local_30; + let _e1551 = (_e1378.member.x + fma(_e1451.x, _e1537.member.z, fma(_e1450.x, _e1537.member.y, (_e1449.x * _e1537.member.x)))); + let _e1552 = (_e1378.member.y + fma(_e1451.y, _e1537.member.z, fma(_e1450.y, _e1537.member.y, (_e1449.y * _e1537.member.x)))); + let _e1553 = (_e1378.member.z + fma(_e1451.z, _e1537.member.z, fma(_e1450.z, _e1537.member.y, (_e1449.z * _e1537.member.x)))); + global_12 = vec3(_e1551, _e1552, _e1553); + if (_e98 >= 83u) { + phi_3572_ = (_e122 <= (_e98 - 83u)); } else { - phi_3568_ = false; + phi_3572_ = false; } - let _e1565 = phi_3568_; - if _e1565 { - let _e1568 = global_2.member[_e124]; - let _e1573 = global_2.member[(_e124 + 1u)]; - let _e1578 = global_2.member[(_e124 + 2u)]; - let _e1583 = global_2.member[(_e124 + 3u)]; - let _e1589 = global_2.member[(_e124 + 4u)]; - let _e1594 = global_2.member[(_e124 + 5u)]; - let _e1599 = global_2.member[(_e124 + 6u)]; - let _e1604 = global_2.member[(_e124 + 7u)]; - let _e1610 = global_2.member[(_e124 + 8u)]; - let _e1615 = global_2.member[(_e124 + 9u)]; - let _e1620 = global_2.member[(_e124 + 10u)]; - let _e1625 = global_2.member[(_e124 + 11u)]; - let _e1631 = global_2.member[(_e124 + 12u)]; - let _e1636 = global_2.member[(_e124 + 13u)]; - let _e1641 = global_2.member[(_e124 + 14u)]; - let _e1646 = global_2.member[(_e124 + 15u)]; - let _e1653 = global_2.member[(_e124 + 16u)]; - let _e1658 = global_2.member[(_e124 + 17u)]; - let _e1663 = global_2.member[(_e124 + 18u)]; - let _e1668 = global_2.member[(_e124 + 19u)]; - let _e1674 = global_2.member[(_e124 + 20u)]; - let _e1679 = global_2.member[(_e124 + 21u)]; - let _e1684 = global_2.member[(_e124 + 22u)]; - let _e1689 = global_2.member[(_e124 + 23u)]; - let _e1695 = global_2.member[(_e124 + 24u)]; - let _e1700 = global_2.member[(_e124 + 25u)]; - let _e1705 = global_2.member[(_e124 + 26u)]; - let _e1710 = global_2.member[(_e124 + 27u)]; - let _e1716 = global_2.member[(_e124 + 28u)]; - let _e1721 = global_2.member[(_e124 + 29u)]; - let _e1726 = global_2.member[(_e124 + 30u)]; - let _e1731 = global_2.member[(_e124 + 31u)]; - let _e1738 = global_2.member[(_e124 + 32u)]; - let _e1743 = global_2.member[(_e124 + 33u)]; - let _e1748 = global_2.member[(_e124 + 34u)]; + let _e1559 = phi_3572_; + if _e1559 { + let _e1562 = global_2.member[_e122]; + let _e1567 = global_2.member[(_e122 + 1u)]; + let _e1572 = global_2.member[(_e122 + 2u)]; + let _e1577 = global_2.member[(_e122 + 3u)]; + let _e1583 = global_2.member[(_e122 + 4u)]; + let _e1588 = global_2.member[(_e122 + 5u)]; + let _e1593 = global_2.member[(_e122 + 6u)]; + let _e1598 = global_2.member[(_e122 + 7u)]; + let _e1604 = global_2.member[(_e122 + 8u)]; + let _e1609 = global_2.member[(_e122 + 9u)]; + let _e1614 = global_2.member[(_e122 + 10u)]; + let _e1619 = global_2.member[(_e122 + 11u)]; + let _e1625 = global_2.member[(_e122 + 12u)]; + let _e1630 = global_2.member[(_e122 + 13u)]; + let _e1635 = global_2.member[(_e122 + 14u)]; + let _e1640 = global_2.member[(_e122 + 15u)]; + let _e1647 = global_2.member[(_e122 + 16u)]; + let _e1652 = global_2.member[(_e122 + 17u)]; + let _e1657 = global_2.member[(_e122 + 18u)]; + let _e1662 = global_2.member[(_e122 + 19u)]; + let _e1668 = global_2.member[(_e122 + 20u)]; + let _e1673 = global_2.member[(_e122 + 21u)]; + let _e1678 = global_2.member[(_e122 + 22u)]; + let _e1683 = global_2.member[(_e122 + 23u)]; + let _e1689 = global_2.member[(_e122 + 24u)]; + let _e1694 = global_2.member[(_e122 + 25u)]; + let _e1699 = global_2.member[(_e122 + 26u)]; + let _e1704 = global_2.member[(_e122 + 27u)]; + let _e1710 = global_2.member[(_e122 + 28u)]; + let _e1715 = global_2.member[(_e122 + 29u)]; + let _e1720 = global_2.member[(_e122 + 30u)]; + let _e1725 = global_2.member[(_e122 + 31u)]; + let _e1732 = global_2.member[(_e122 + 32u)]; + let _e1737 = global_2.member[(_e122 + 33u)]; + let _e1742 = global_2.member[(_e122 + 34u)]; local_3 = array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); - phi_2217_ = type_24(0u, 6u); + phi_2229_ = type_24(0u, 6u); loop { - let _e1753 = phi_2217_; - if (_e1753.member < _e1753.member_1) { - phi_2218_ = type_24((_e1753.member + 1u), _e1753.member_1); - phi_2233_ = type_24(1u, _e1753.member); + let _e1747 = phi_2229_; + if (_e1747.member < _e1747.member_1) { + phi_2230_ = type_24((_e1747.member + 1u), _e1747.member_1); + phi_2245_ = type_24(1u, _e1747.member); } else { - phi_2218_ = _e1753; - phi_2233_ = type_24(0u, type_24().member_1); + phi_2230_ = _e1747; + phi_2245_ = type_24(0u, type_24().member_1); } - let _e1766 = phi_2218_; - let _e1768 = phi_2233_; - switch bitcast(_e1768.member) { + let _e1760 = phi_2230_; + let _e1762 = phi_2245_; + switch bitcast(_e1762.member) { case 0: { - phi_2260_ = false; + phi_2272_ = false; break; } case 1: { - let _e1773 = ((_e124 + 35u) + (_e1768.member_1 * 4u)); - let _e1776 = global_2.member[_e1773]; - let _e1781 = global_2.member[(_e1773 + 1u)]; - let _e1786 = global_2.member[(_e1773 + 2u)]; - let _e1791 = global_2.member[(_e1773 + 3u)]; - local_3[_e1768.member_1] = vec4(bitcast(_e1776), bitcast(_e1781), bitcast(_e1786), bitcast(_e1791)); - phi_2260_ = true; + let _e1767 = ((_e122 + 35u) + (_e1762.member_1 * 4u)); + let _e1770 = global_2.member[_e1767]; + let _e1775 = global_2.member[(_e1767 + 1u)]; + let _e1780 = global_2.member[(_e1767 + 2u)]; + let _e1785 = global_2.member[(_e1767 + 3u)]; + local_3[_e1762.member_1] = vec4(bitcast(_e1770), bitcast(_e1775), bitcast(_e1780), bitcast(_e1785)); + phi_2272_ = true; break; } default: { - phi_2260_ = bool(); + phi_2272_ = bool(); break; } } - let _e1796 = phi_2260_; + let _e1790 = phi_2272_; continue; continuing { - phi_2217_ = _e1766; - break if !(_e1796); + phi_2229_ = _e1760; + break if !(_e1790); } } - let _e1798 = local_3; + let _e1792 = local_3; local_2 = array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); - phi_2266_ = type_24(0u, 8u); + phi_2278_ = type_24(0u, 8u); loop { - let _e1801 = phi_2266_; - if (_e1801.member < _e1801.member_1) { - phi_2267_ = type_24((_e1801.member + 1u), _e1801.member_1); - phi_2282_ = type_24(1u, _e1801.member); + let _e1795 = phi_2278_; + if (_e1795.member < _e1795.member_1) { + phi_2279_ = type_24((_e1795.member + 1u), _e1795.member_1); + phi_2294_ = type_24(1u, _e1795.member); } else { - phi_2267_ = _e1801; - phi_2282_ = type_24(0u, type_24().member_1); + phi_2279_ = _e1795; + phi_2294_ = type_24(0u, type_24().member_1); } - let _e1814 = phi_2267_; - let _e1816 = phi_2282_; - switch bitcast(_e1816.member) { + let _e1808 = phi_2279_; + let _e1810 = phi_2294_; + switch bitcast(_e1810.member) { case 0: { - phi_2305_ = false; + phi_2317_ = false; break; } case 1: { - let _e1821 = ((_e124 + 59u) + (_e1816.member_1 * 3u)); - let _e1824 = global_2.member[_e1821]; - let _e1829 = global_2.member[(_e1821 + 1u)]; - let _e1834 = global_2.member[(_e1821 + 2u)]; - local_2[_e1816.member_1] = vec3(bitcast(_e1824), bitcast(_e1829), bitcast(_e1834)); - phi_2305_ = true; + let _e1815 = ((_e122 + 59u) + (_e1810.member_1 * 3u)); + let _e1818 = global_2.member[_e1815]; + let _e1823 = global_2.member[(_e1815 + 1u)]; + let _e1828 = global_2.member[(_e1815 + 2u)]; + local_2[_e1810.member_1] = vec3(bitcast(_e1818), bitcast(_e1823), bitcast(_e1828)); + phi_2317_ = true; break; } default: { - phi_2305_ = bool(); + phi_2317_ = bool(); break; } } - let _e1839 = phi_2305_; + let _e1833 = phi_2317_; continue; continuing { - phi_2266_ = _e1814; - break if !(_e1839); + phi_2278_ = _e1808; + break if !(_e1833); } } - let _e1841 = local_2; - phi_2313_ = type_22(type_20(vec4(bitcast(_e1568), bitcast(_e1573), bitcast(_e1578), bitcast(_e1583)), vec4(bitcast(_e1589), bitcast(_e1594), bitcast(_e1599), bitcast(_e1604)), vec4(bitcast(_e1610), bitcast(_e1615), bitcast(_e1620), bitcast(_e1625)), vec4(bitcast(_e1631), bitcast(_e1636), bitcast(_e1641), bitcast(_e1646))), type_20(vec4(bitcast(_e1653), bitcast(_e1658), bitcast(_e1663), bitcast(_e1668)), vec4(bitcast(_e1674), bitcast(_e1679), bitcast(_e1684), bitcast(_e1689)), vec4(bitcast(_e1695), bitcast(_e1700), bitcast(_e1705), bitcast(_e1710)), vec4(bitcast(_e1716), bitcast(_e1721), bitcast(_e1726), bitcast(_e1731))), type_21(_e1841, _e1798), vec3(bitcast(_e1738), bitcast(_e1743), bitcast(_e1748))); + let _e1835 = local_2; + phi_2325_ = type_22(type_20(vec4(bitcast(_e1562), bitcast(_e1567), bitcast(_e1572), bitcast(_e1577)), vec4(bitcast(_e1583), bitcast(_e1588), bitcast(_e1593), bitcast(_e1598)), vec4(bitcast(_e1604), bitcast(_e1609), bitcast(_e1614), bitcast(_e1619)), vec4(bitcast(_e1625), bitcast(_e1630), bitcast(_e1635), bitcast(_e1640))), type_20(vec4(bitcast(_e1647), bitcast(_e1652), bitcast(_e1657), bitcast(_e1662)), vec4(bitcast(_e1668), bitcast(_e1673), bitcast(_e1678), bitcast(_e1683)), vec4(bitcast(_e1689), bitcast(_e1694), bitcast(_e1699), bitcast(_e1704)), vec4(bitcast(_e1710), bitcast(_e1715), bitcast(_e1720), bitcast(_e1725))), type_21(_e1835, _e1792), vec3(bitcast(_e1732), bitcast(_e1737), bitcast(_e1742))); } else { - phi_2313_ = type_22(type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_21(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); + phi_2325_ = type_22(type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_21(array, 8>(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)), array, 6>(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f))), vec3(0f, 0f, 0f)); } - let _e1845 = phi_2313_; - global_1 = vec4((fma(fma(_e1845.member.member_3.x, _e1845.member_1.member_2.w, fma(_e1845.member.member_2.x, _e1845.member_1.member_2.z, fma(_e1845.member.member.x, _e1845.member_1.member_2.x, (_e1845.member.member_1.x * _e1845.member_1.member_2.y)))), _e1559, fma(fma(_e1845.member.member_3.x, _e1845.member_1.member.w, fma(_e1845.member.member_2.x, _e1845.member_1.member.z, fma(_e1845.member.member.x, _e1845.member_1.member.x, (_e1845.member.member_1.x * _e1845.member_1.member.y)))), _e1557, (fma(_e1845.member.member_3.x, _e1845.member_1.member_1.w, fma(_e1845.member.member_2.x, _e1845.member_1.member_1.z, fma(_e1845.member.member.x, _e1845.member_1.member_1.x, (_e1845.member.member_1.x * _e1845.member_1.member_1.y)))) * _e1558))) + fma(_e1845.member.member_3.x, _e1845.member_1.member_3.w, fma(_e1845.member.member_2.x, _e1845.member_1.member_3.z, fma(_e1845.member.member.x, _e1845.member_1.member_3.x, (_e1845.member.member_1.x * _e1845.member_1.member_3.y))))), (fma(fma(_e1845.member.member_3.y, _e1845.member_1.member_2.w, fma(_e1845.member.member_2.y, _e1845.member_1.member_2.z, fma(_e1845.member.member.y, _e1845.member_1.member_2.x, (_e1845.member.member_1.y * _e1845.member_1.member_2.y)))), _e1559, fma(fma(_e1845.member.member_3.y, _e1845.member_1.member.w, fma(_e1845.member.member_2.y, _e1845.member_1.member.z, fma(_e1845.member.member.y, _e1845.member_1.member.x, (_e1845.member.member_1.y * _e1845.member_1.member.y)))), _e1557, (fma(_e1845.member.member_3.y, _e1845.member_1.member_1.w, fma(_e1845.member.member_2.y, _e1845.member_1.member_1.z, fma(_e1845.member.member.y, _e1845.member_1.member_1.x, (_e1845.member.member_1.y * _e1845.member_1.member_1.y)))) * _e1558))) + fma(_e1845.member.member_3.y, _e1845.member_1.member_3.w, fma(_e1845.member.member_2.y, _e1845.member_1.member_3.z, fma(_e1845.member.member.y, _e1845.member_1.member_3.x, (_e1845.member.member_1.y * _e1845.member_1.member_3.y))))), (fma(fma(_e1845.member.member_3.z, _e1845.member_1.member_2.w, fma(_e1845.member.member_2.z, _e1845.member_1.member_2.z, fma(_e1845.member.member.z, _e1845.member_1.member_2.x, (_e1845.member.member_1.z * _e1845.member_1.member_2.y)))), _e1559, fma(fma(_e1845.member.member_3.z, _e1845.member_1.member.w, fma(_e1845.member.member_2.z, _e1845.member_1.member.z, fma(_e1845.member.member.z, _e1845.member_1.member.x, (_e1845.member.member_1.z * _e1845.member_1.member.y)))), _e1557, (fma(_e1845.member.member_3.z, _e1845.member_1.member_1.w, fma(_e1845.member.member_2.z, _e1845.member_1.member_1.z, fma(_e1845.member.member.z, _e1845.member_1.member_1.x, (_e1845.member.member_1.z * _e1845.member_1.member_1.y)))) * _e1558))) + fma(_e1845.member.member_3.z, _e1845.member_1.member_3.w, fma(_e1845.member.member_2.z, _e1845.member_1.member_3.z, fma(_e1845.member.member.z, _e1845.member_1.member_3.x, (_e1845.member.member_1.z * _e1845.member_1.member_3.y))))), (fma(fma(_e1845.member.member_3.w, _e1845.member_1.member_2.w, fma(_e1845.member.member_2.w, _e1845.member_1.member_2.z, fma(_e1845.member.member.w, _e1845.member_1.member_2.x, (_e1845.member.member_1.w * _e1845.member_1.member_2.y)))), _e1559, fma(fma(_e1845.member.member_3.w, _e1845.member_1.member.w, fma(_e1845.member.member_2.w, _e1845.member_1.member.z, fma(_e1845.member.member.w, _e1845.member_1.member.x, (_e1845.member.member_1.w * _e1845.member_1.member.y)))), _e1557, (fma(_e1845.member.member_3.w, _e1845.member_1.member_1.w, fma(_e1845.member.member_2.w, _e1845.member_1.member_1.z, fma(_e1845.member.member.w, _e1845.member_1.member_1.x, (_e1845.member.member_1.w * _e1845.member_1.member_1.y)))) * _e1558))) + fma(_e1845.member.member_3.w, _e1845.member_1.member_3.w, fma(_e1845.member.member_2.w, _e1845.member_1.member_3.z, fma(_e1845.member.member.w, _e1845.member_1.member_3.x, (_e1845.member.member_1.w * _e1845.member_1.member_3.y)))))); + let _e1839 = phi_2325_; + global_1 = vec4((fma(fma(_e1839.member.member_3.x, _e1839.member_1.member_2.w, fma(_e1839.member.member_2.x, _e1839.member_1.member_2.z, fma(_e1839.member.member.x, _e1839.member_1.member_2.x, (_e1839.member.member_1.x * _e1839.member_1.member_2.y)))), _e1553, fma(fma(_e1839.member.member_3.x, _e1839.member_1.member.w, fma(_e1839.member.member_2.x, _e1839.member_1.member.z, fma(_e1839.member.member.x, _e1839.member_1.member.x, (_e1839.member.member_1.x * _e1839.member_1.member.y)))), _e1551, (fma(_e1839.member.member_3.x, _e1839.member_1.member_1.w, fma(_e1839.member.member_2.x, _e1839.member_1.member_1.z, fma(_e1839.member.member.x, _e1839.member_1.member_1.x, (_e1839.member.member_1.x * _e1839.member_1.member_1.y)))) * _e1552))) + fma(_e1839.member.member_3.x, _e1839.member_1.member_3.w, fma(_e1839.member.member_2.x, _e1839.member_1.member_3.z, fma(_e1839.member.member.x, _e1839.member_1.member_3.x, (_e1839.member.member_1.x * _e1839.member_1.member_3.y))))), (fma(fma(_e1839.member.member_3.y, _e1839.member_1.member_2.w, fma(_e1839.member.member_2.y, _e1839.member_1.member_2.z, fma(_e1839.member.member.y, _e1839.member_1.member_2.x, (_e1839.member.member_1.y * _e1839.member_1.member_2.y)))), _e1553, fma(fma(_e1839.member.member_3.y, _e1839.member_1.member.w, fma(_e1839.member.member_2.y, _e1839.member_1.member.z, fma(_e1839.member.member.y, _e1839.member_1.member.x, (_e1839.member.member_1.y * _e1839.member_1.member.y)))), _e1551, (fma(_e1839.member.member_3.y, _e1839.member_1.member_1.w, fma(_e1839.member.member_2.y, _e1839.member_1.member_1.z, fma(_e1839.member.member.y, _e1839.member_1.member_1.x, (_e1839.member.member_1.y * _e1839.member_1.member_1.y)))) * _e1552))) + fma(_e1839.member.member_3.y, _e1839.member_1.member_3.w, fma(_e1839.member.member_2.y, _e1839.member_1.member_3.z, fma(_e1839.member.member.y, _e1839.member_1.member_3.x, (_e1839.member.member_1.y * _e1839.member_1.member_3.y))))), (fma(fma(_e1839.member.member_3.z, _e1839.member_1.member_2.w, fma(_e1839.member.member_2.z, _e1839.member_1.member_2.z, fma(_e1839.member.member.z, _e1839.member_1.member_2.x, (_e1839.member.member_1.z * _e1839.member_1.member_2.y)))), _e1553, fma(fma(_e1839.member.member_3.z, _e1839.member_1.member.w, fma(_e1839.member.member_2.z, _e1839.member_1.member.z, fma(_e1839.member.member.z, _e1839.member_1.member.x, (_e1839.member.member_1.z * _e1839.member_1.member.y)))), _e1551, (fma(_e1839.member.member_3.z, _e1839.member_1.member_1.w, fma(_e1839.member.member_2.z, _e1839.member_1.member_1.z, fma(_e1839.member.member.z, _e1839.member_1.member_1.x, (_e1839.member.member_1.z * _e1839.member_1.member_1.y)))) * _e1552))) + fma(_e1839.member.member_3.z, _e1839.member_1.member_3.w, fma(_e1839.member.member_2.z, _e1839.member_1.member_3.z, fma(_e1839.member.member.z, _e1839.member_1.member_3.x, (_e1839.member.member_1.z * _e1839.member_1.member_3.y))))), (fma(fma(_e1839.member.member_3.w, _e1839.member_1.member_2.w, fma(_e1839.member.member_2.w, _e1839.member_1.member_2.z, fma(_e1839.member.member.w, _e1839.member_1.member_2.x, (_e1839.member.member_1.w * _e1839.member_1.member_2.y)))), _e1553, fma(fma(_e1839.member.member_3.w, _e1839.member_1.member.w, fma(_e1839.member.member_2.w, _e1839.member_1.member.z, fma(_e1839.member.member.w, _e1839.member_1.member.x, (_e1839.member.member_1.w * _e1839.member_1.member.y)))), _e1551, (fma(_e1839.member.member_3.w, _e1839.member_1.member_1.w, fma(_e1839.member.member_2.w, _e1839.member_1.member_1.z, fma(_e1839.member.member.w, _e1839.member_1.member_1.x, (_e1839.member.member_1.w * _e1839.member_1.member_1.y)))) * _e1552))) + fma(_e1839.member.member_3.w, _e1839.member_1.member_3.w, fma(_e1839.member.member_2.w, _e1839.member_1.member_3.z, fma(_e1839.member.member.w, _e1839.member_1.member_3.x, (_e1839.member.member_1.w * _e1839.member_1.member_3.y)))))); } else { global_1 = vec4(10f, 10f, 10f, 1f); } @@ -1162,18 +1155,16 @@ fn stagerenderlet_vertex(@builtin(instance_index) param: u32, @builtin(vertex_in global_3 = param; global = param_1; function(); - let _e16 = global_1.y; - global_1.y = -(_e16); - let _e18 = global_4; - let _e19 = global_5; - let _e20 = global_6; - let _e21 = global_7; - let _e22 = global_8; - let _e23 = global_9; - let _e24 = global_11; - let _e25 = global_12; - let _e26 = global_13; - let _e27 = global_14; - let _e28 = global_1; - return VertexOutput(_e18, _e19, _e20, _e21, _e22, _e23, _e24, _e25, _e26, _e27, _e28); + let _e14 = global_1.y; + global_1.y = -(_e14); + let _e16 = global_4; + let _e17 = global_5; + let _e18 = global_6; + let _e19 = global_7; + let _e20 = global_9; + let _e21 = global_10; + let _e22 = global_11; + let _e23 = global_12; + let _e24 = global_1; + return VertexOutput(_e16, _e17, _e18, _e19, _e20, _e21, _e22, _e23, _e24); } diff --git a/crates/renderling/shaders/tonemapping-tonemapping_fragment.spv b/crates/renderling/shaders/tonemapping-tonemapping_fragment.spv index c13cc9f5..98edd89b 100644 Binary files a/crates/renderling/shaders/tonemapping-tonemapping_fragment.spv and b/crates/renderling/shaders/tonemapping-tonemapping_fragment.spv differ diff --git a/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl b/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl index 7f52467a..7012bf25 100644 --- a/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl +++ b/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl @@ -17,19 +17,19 @@ var global_3: texture_2d; var global_4: vec4; fn function() { - var phi_142_: type_14; - var phi_190_: vec4; + var phi_141_: type_14; + var phi_189_: vec4; let _e53 = global_1; let _e54 = textureSample(global_3, global_2, _e53); if select(false, true, (arrayLength((&global.member)) >= 2u)) { let _e59 = global.member[0u]; let _e62 = global.member[1u]; - phi_142_ = type_14(_e59, bitcast(_e62)); + phi_141_ = type_14(_e59, bitcast(_e62)); } else { - phi_142_ = type_14(0u, 1f); + phi_141_ = type_14(0u, 1f); } - let _e66 = phi_142_; + let _e66 = phi_141_; let _e70 = (_e54.x * _e66.member_1); let _e72 = (_e54.y * _e66.member_1); let _e74 = (_e54.z * _e66.member_1); @@ -37,7 +37,7 @@ fn function() { switch bitcast(_e66.member) { case 1: { let _e98 = min(vec3(max(((_e70 * fma(2.51f, _e70, 0.03f)) / fma(_e70, fma(2.43f, _e70, 0.59f), 0.14f)), 0f), max(((_e72 * fma(2.51f, _e72, 0.03f)) / fma(_e72, fma(2.43f, _e72, 0.59f), 0.14f)), 0f), max(((_e74 * fma(2.51f, _e74, 0.03f)) / fma(_e74, fma(2.43f, _e74, 0.59f), 0.14f)), 0f)), vec3(1f, 1f, 1f)); - phi_190_ = vec4(_e98.x, _e98.y, _e98.z, _e76); + phi_189_ = vec4(_e98.x, _e98.y, _e98.z, _e76); break; } case 2: { @@ -48,7 +48,7 @@ fn function() { let _e125 = (fma(_e110, (_e110 + 0.0245786f), -0.000090537f) / fma(_e110, fma(0.983729f, _e110, 0.432951f), 0.238081f)); let _e126 = (fma(_e111, (_e111 + 0.0245786f), -0.000090537f) / fma(_e111, fma(0.983729f, _e111, 0.432951f), 0.238081f)); let _e140 = min(vec3(max(fma(-0.07367f, _e126, fma(1.60475f, _e124, (-0.53108f * _e125))), 0f), max(fma(-0.00605f, _e126, fma(-0.10208f, _e124, (1.10813f * _e125))), 0f), max(fma(1.07602f, _e126, fma(-0.00327f, _e124, (-0.07276f * _e125))), 0f)), vec3(1f, 1f, 1f)); - phi_190_ = vec4(_e140.x, _e140.y, _e140.z, _e76); + phi_189_ = vec4(_e140.x, _e140.y, _e140.z, _e76); break; } case 3: { @@ -59,20 +59,20 @@ fn function() { let _e167 = (fma(_e152, (_e152 + 0.0245786f), -0.000090537f) / fma(_e152, fma(0.983729f, _e152, 0.432951f), 0.238081f)); let _e168 = (fma(_e153, (_e153 + 0.0245786f), -0.000090537f) / fma(_e153, fma(0.983729f, _e153, 0.432951f), 0.238081f)); let _e182 = min(vec3(max(fma(-0.07367f, _e168, fma(1.60475f, _e166, (-0.53108f * _e167))), 0f), max(fma(-0.00605f, _e168, fma(-0.10208f, _e166, (1.10813f * _e167))), 0f), max(fma(1.07602f, _e168, fma(-0.00327f, _e166, (-0.07276f * _e167))), 0f)), vec3(1f, 1f, 1f)); - phi_190_ = vec4(_e182.x, _e182.y, _e182.z, _e76); + phi_189_ = vec4(_e182.x, _e182.y, _e182.z, _e76); break; } case 4: { let _e192 = (vec3(_e70, _e72, _e74) / vec3(fma(_e54.x, _e66.member_1, 1f), fma(_e54.y, _e66.member_1, 1f), fma(_e54.z, _e66.member_1, 1f))); - phi_190_ = vec4(_e192.x, _e192.y, _e192.z, _e76); + phi_189_ = vec4(_e192.x, _e192.y, _e192.z, _e76); break; } default: { - phi_190_ = vec4(_e70, _e72, _e74, _e76); + phi_189_ = vec4(_e70, _e72, _e74, _e76); break; } } - let _e198 = phi_190_; + let _e198 = phi_189_; global_4 = _e198; return; } diff --git a/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv b/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv index a43d96ca..7ad18552 100644 Binary files a/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv and b/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv differ diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv index cd614e1e..bf7e54dc 100644 Binary files a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv and b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv differ diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl index c399ba81..e6cb321e 100644 --- a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl +++ b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl @@ -73,7 +73,7 @@ fn function() { var phi_768_: type_28; var phi_1412_: bool; var phi_819_: type_25; - var phi_1483_: bool; + var phi_1482_: bool; var phi_980_: type_22; var phi_981_: type_22; var phi_996_: type_22; @@ -235,11 +235,11 @@ fn function() { let _e362 = (vec4(fma(_e325.member_1.x, _e334, -(_e340)), (1f - fma(_e325.member_1.x, _e333, _e337)), fma(_e325.member_1.y, _e335, _e338), 0f) * _e325.member_2.y); let _e364 = (vec4(fma(_e325.member_1.x, _e335, _e339), fma(_e325.member_1.y, _e335, -(_e338)), (1f - fma(_e325.member_1.x, _e333, (_e325.member_1.y * _e334))), 0f) * _e325.member_2.z); if (_e79 >= 83u) { - phi_1483_ = (_e91 <= (_e79 - 83u)); + phi_1482_ = (_e91 <= (_e79 - 83u)); } else { - phi_1483_ = false; + phi_1482_ = false; } - let _e372 = phi_1483_; + let _e372 = phi_1482_; if _e372 { let _e375 = global_1.member[_e91]; let _e380 = global_1.member[(_e91 + 1u)]; diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv index cdd8bffd..f33fafbc 100644 Binary files a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv and b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv differ diff --git a/crates/renderling/src/atlas/cpu.rs b/crates/renderling/src/atlas/cpu.rs index cd294a62..9b1d6d5e 100644 --- a/crates/renderling/src/atlas/cpu.rs +++ b/crates/renderling/src/atlas/cpu.rs @@ -278,7 +278,7 @@ impl Atlas { let mut texture_array = self.texture_array.write().unwrap(); let extent = texture_array.texture.size(); - let newly_packed_layers = pack_images(&layers, &images, extent) + let newly_packed_layers = pack_images(&layers, images, extent) .context(CannotPackTexturesSnafu { size: extent })?; let mut staged = StagedResources::try_staging( @@ -422,14 +422,14 @@ fn pack_images<'a>( images .iter() .enumerate() - .map(|(i, img)| AnotherPacking::Img { + .map(|(i, image)| AnotherPacking::Img { original_index: i, - image: &img, + image, }), ) .collect() }; - new_packing.sort_by(|a, b| (a.size().length_squared()).cmp(&(b.size().length_squared()))); + new_packing.sort_by_key(|a| (a.size().length_squared())); let total_images = new_packing.len(); let new_packing_layers: Vec> = fan_split_n(extent.depth_or_array_layers as usize, new_packing); @@ -473,7 +473,7 @@ impl StagedResources { let new_texture_array = Atlas::create_texture(device, queue, extent)?; let mut output = vec![]; let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { - label: Some("atlas add images"), + label: Some("atlas staging"), }); let mut temporary_layers = vec![Layer::default(); extent.depth_or_array_layers as usize]; for (layer_index, packed_items) in newly_packed_layers.into_iter().enumerate() { @@ -551,7 +551,7 @@ impl StagedResources { AnotherPacking::Internal(mut texture) => { let mut t = texture.cache; debug_assert_eq!(t.size_px, size_px); - log::trace!(" add_images: copying previous frame {t:?}",); + log::trace!(" copying previous frame {t:?}",); // copy the frame from the old texture to the new texture // in a new destination encoder.copy_texture_to_texture( @@ -571,7 +571,7 @@ impl StagedResources { origin: wgpu::Origin3d { x: offset_px.x, y: offset_px.y, - z: t.layer_index, + z: layer_index as u32, }, aspect: wgpu::TextureAspect::All, }, diff --git a/crates/renderling/src/bloom.rs b/crates/renderling/src/bloom.rs index 2cc16c8f..b3bdddee 100644 --- a/crates/renderling/src/bloom.rs +++ b/crates/renderling/src/bloom.rs @@ -10,7 +10,6 @@ mod cpu; #[cfg(not(target_arch = "spirv"))] pub use cpu::*; -#[cfg(feature = "bloom_vertex")] /// Bloom vertex shader. /// /// This is a pass-through vertex shader to facilitate a bloom effect. @@ -28,14 +27,13 @@ pub fn bloom_vertex( *out_id = in_id; } -#[cfg(feature = "bloom_downsample_fragment")] /// Bloom downsampling shader. /// /// Performs successive downsampling from a source texture. /// /// As taken from Call Of Duty method - presented at ACM Siggraph 2014. /// -/// This particular method was customly designed to eliminate +/// This particular method was designed to eliminate /// "pulsating artifacts and temporal stability issues". #[spirv(fragment)] pub fn bloom_downsample_fragment( @@ -102,7 +100,6 @@ pub fn bloom_downsample_fragment( *downsample = (center + inner + outer + furthest).max(min); } -#[cfg(feature = "bloom_upsample_fragment")] /// Bloom upsampling shader. /// /// This shader performs successive upsampling on a source texture. @@ -169,7 +166,6 @@ pub fn bloom_upsample_fragment( *upsample = sample.extend(0.5); } -#[cfg(feature = "bloom_mix_fragment")] #[spirv(fragment)] #[allow(clippy::too_many_arguments)] /// Bloom "mix" shader. diff --git a/crates/renderling/src/bloom/cpu.rs b/crates/renderling/src/bloom/cpu.rs index 461b7875..678f936d 100644 --- a/crates/renderling/src/bloom/cpu.rs +++ b/crates/renderling/src/bloom/cpu.rs @@ -1,4 +1,5 @@ //! Bloom. +use core::ops::Deref; use std::sync::{Arc, RwLock}; use crabslab::Id; @@ -58,7 +59,7 @@ fn create_bloom_downsample_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeli layout: Some(&layout), vertex: wgpu::VertexState { module: &vertex_module.module, - entry_point: vertex_module.entry_point, + entry_point: Some(vertex_module.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -75,7 +76,7 @@ fn create_bloom_downsample_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeli multisample: wgpu::MultisampleState::default(), fragment: Some(wgpu::FragmentState { module: &fragment_module.module, - entry_point: fragment_module.entry_point, + entry_point: Some(fragment_module.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba16Float, blend: None, @@ -103,7 +104,7 @@ fn create_bloom_upsample_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeline layout: Some(&layout), vertex: wgpu::VertexState { module: &vertex_module.module, - entry_point: vertex_module.entry_point, + entry_point: Some(vertex_module.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -120,7 +121,7 @@ fn create_bloom_upsample_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeline multisample: wgpu::MultisampleState::default(), fragment: Some(wgpu::FragmentState { module: &fragment_module.module, - entry_point: fragment_module.entry_point, + entry_point: Some(fragment_module.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba16Float, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -312,7 +313,7 @@ fn create_mix_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeline { layout: Some(&layout), vertex: wgpu::VertexState { module: &vertex_module.module, - entry_point: vertex_module.entry_point, + entry_point: Some(vertex_module.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -329,7 +330,7 @@ fn create_mix_pipeline(device: &wgpu::Device) -> wgpu::RenderPipeline { multisample: wgpu::MultisampleState::default(), fragment: Some(wgpu::FragmentState { module: &fragment_module.module, - entry_point: fragment_module.entry_point, + entry_point: Some(fragment_module.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba16Float, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -599,7 +600,7 @@ impl Bloom { occlusion_query_set: None, }); render_pass.set_pipeline(&self.downsample_pipeline); - render_pass.set_bind_group(0, bindgroup, &[]); + render_pass.set_bind_group(0, Some(bindgroup), &[]); let id = pixel_size.into(); render_pass.draw(0..6, id..id + 1); } @@ -645,7 +646,7 @@ impl Bloom { occlusion_query_set: None, }); render_pass.set_pipeline(&self.upsample_pipeline); - render_pass.set_bind_group(0, bindgroup, &[]); + render_pass.set_bind_group(0, Some(bindgroup), &[]); let id = self.upsample_filter_radius.id().into(); render_pass.draw(0..6, id..id + 1); } @@ -675,7 +676,7 @@ impl Bloom { occlusion_query_set: None, }); render_pass.set_pipeline(&self.mix_pipeline); - render_pass.set_bind_group(0, &mix_bindgroup, &[]); + render_pass.set_bind_group(0, Some(mix_bindgroup.deref()), &[]); let id = self.mix_strength.id().into(); render_pass.draw(0..6, id..id + 1); } @@ -753,6 +754,8 @@ mod test { let height = 128; let ctx = Context::headless(width, height); let mut stage = ctx.new_stage().with_bloom(false); + // .with_frustum_culling(false) + // .with_occlusion_culling(false); let projection = crate::camera::perspective(width as f32, height as f32); let view = crate::camera::look_at(Vec3::new(0.0, 2.0, 18.0), Vec3::ZERO, Vec3::Y); diff --git a/crates/renderling/src/bvol.rs b/crates/renderling/src/bvol.rs index 593d8cfa..6ed86821 100644 --- a/crates/renderling/src/bvol.rs +++ b/crates/renderling/src/bvol.rs @@ -12,7 +12,7 @@ //! * https://iquilezles.org/www/articles/frustumcorrect/frustumcorrect.htm use crabslab::SlabItem; -use glam::{Mat4, Vec3, Vec4, Vec4Swizzles}; +use glam::{Mat4, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; #[cfg(target_arch = "spirv")] use spirv_std::num_traits::Float; @@ -111,6 +111,21 @@ impl Aabb { } } + /// Return the length along the x axis. + pub fn width(&self) -> f32 { + self.max.x - self.min.x + } + + /// Return the length along the y axis. + pub fn height(&self) -> f32 { + self.max.y - self.min.y + } + + /// Return the length along the z axis. + pub fn depth(&self) -> f32 { + self.max.z - self.min.z + } + pub fn center(&self) -> Vec3 { (self.min + self.max) * 0.5 } @@ -123,8 +138,8 @@ impl Aabb { self.min == self.max } - /// Determines whether this `Aabb` can be seen by `camera` after being transformed by - /// `transform`. + /// Determines whether this `Aabb` can be seen by `camera` after being + /// transformed by `transform`. pub fn is_outside_camera_view(&self, camera: &Camera, transform: Transform) -> bool { let transform = Mat4::from(transform); let min = transform.transform_point3(self.min); @@ -173,6 +188,9 @@ impl Aabb { #[cfg_attr(not(target_arch = "spirv"), derive(Debug))] #[derive(Clone, Copy, Default, PartialEq, SlabItem)] pub struct Frustum { + /// Planes constructing the sides of the frustum, + /// each expressed as a normal vector (xyz) and the distance (w) + /// from the origin along that vector. pub planes: [Vec4; 6], pub points: [Vec3; 8], } @@ -321,13 +339,48 @@ impl BoundingSphere { } } - pub fn is_inside_camera_view(&self, camera: &Camera, transform: Transform) -> bool { + /// Determine whether this sphere is inside the camera's view frustum after + /// being transformed by `transform`. + pub fn is_inside_camera_view( + &self, + camera: &Camera, + transform: Transform, + ) -> (bool, BoundingSphere) { let center = Mat4::from(transform).transform_point3(self.center); let scale = Vec3::splat(transform.scale.max_element()); let radius = Mat4::from_scale(scale) .transform_point3(Vec3::new(self.radius, 0.0, 0.0)) .distance(Vec3::ZERO); - BoundingSphere::new(center, radius).is_inside_frustum(camera.frustum()) + let sphere = BoundingSphere::new(center, radius); + (sphere.is_inside_frustum(camera.frustum()), sphere) + } + + /// Returns an [`Aabb`] with x and y coordinates in viewport pixels and z coordinate + /// in NDC depth. + pub fn project_onto_viewport(&self, camera: &Camera, viewport: Vec2) -> Aabb { + fn ndc_to_pixel(viewport: Vec2, ndc: Vec3) -> Vec2 { + let screen = Vec3::new((ndc.x + 1.0) * 0.5, 1.0 - (ndc.y + 1.0) * 0.5, ndc.z); + (screen * viewport.extend(1.0)).xy() + } + + let viewproj = camera.view_projection(); + let frustum = camera.frustum(); + + // Find the center and radius of the bounding sphere in pixel space. + // By pixel space, I mean where (0, 0) is the top-left of the screen + // and (w, h) is is the bottom-left. + let center_clip = viewproj * self.center.extend(1.0); + let front_center_ndc = + viewproj.project_point3(self.center + self.radius * frustum.planes[5].xyz()); + let back_center_ndc = + viewproj.project_point3(self.center + self.radius * frustum.planes[0].xyz()); + let center_ndc = center_clip.xyz() / center_clip.w; + let center_pixels = ndc_to_pixel(viewport, center_ndc); + let radius_pixels = viewport.x * (self.radius / center_clip.w); + Aabb::new( + (center_pixels - radius_pixels).extend(front_center_ndc.z), + (center_pixels + radius_pixels).extend(back_center_ndc.z), + ) } } @@ -364,14 +417,14 @@ pub trait BVol { /// In order for a bounding volume to be inside the frustum, it must not be /// culled by any plane. /// - /// Coherence is provided by the `lpindex` argument, which should be the index of - /// the first plane found that culls this volume, given as part of the return - /// value of this function. + /// Coherence is provided by the `lpindex` argument, which should be the + /// index of the first plane found that culls this volume, given as part + /// of the return value of this function. /// /// Returns `true` if the volume is outside the frustum, `false` otherwise. /// - /// Returns the index of first plane found that culls this volume, to cache and use later - /// as a short circuit. + /// Returns the index of first plane found that culls this volume, to cache + /// and use later as a short circuit. fn coherent_test_is_volume_outside_frustum( &self, frustum: &Frustum, @@ -409,6 +462,11 @@ impl BVol for Aabb { mod test { use glam::{Mat4, Quat}; + use crate::{ + stage::{Renderlet, Vertex}, + Context, + }; + use super::*; #[test] @@ -458,4 +516,46 @@ mod test { "aabb should be inside the frustum" ); } + + #[test] + fn bounding_sphere_from_min_max() { + let ctx = Context::headless(100, 100); + let stage = ctx + .new_stage() + .with_lighting(false) + .with_background_color(Vec4::ONE) + .with_debug_overlay(true) + .with_frustum_culling(false); + + let mut min = Vec3::splat(f32::INFINITY); + let mut max = Vec3::splat(f32::NEG_INFINITY); + let vertices = stage.new_array(crate::math::unit_cube().into_iter().map(|(p, n)| { + min = min.min(p); + max = max.max(p); + Vertex::default() + .with_position(p) + .with_normal(n) + .with_color(Vec4::new(1.0, 0.0, 0.0, 1.0)) + })); + let bounds = BoundingSphere::from((min, max)); + log::info!("bounds: {bounds:?}"); + + let projection = Mat4::perspective_rh(std::f32::consts::FRAC_PI_4, 1.0, 0.1, 20.0); + let view = Mat4::look_at_rh(Vec3::new(0.0, 0.0, 2.0), Vec3::ZERO, Vec3::Y); + let camera = stage.new_value(Camera::new(projection, view)); + + let renderlet = stage.new_value(Renderlet { + vertices_array: vertices.array(), + bounds, + camera_id: camera.id(), + ..Default::default() + }); + stage.add_renderlet(&renderlet); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::save("bvol/bounding_sphere_from_min_max.png", img); + frame.present(); + } } diff --git a/crates/renderling/src/camera.rs b/crates/renderling/src/camera.rs index 0436b6b4..a9f96561 100644 --- a/crates/renderling/src/camera.rs +++ b/crates/renderling/src/camera.rs @@ -2,7 +2,7 @@ use crabslab::SlabItem; use glam::{Mat4, Vec3}; -use crate::bvol::Frustum; +use crate::bvol::{dist_bpp, Frustum}; /// A camera used for transforming the stage during rendering. /// @@ -80,6 +80,15 @@ impl Camera { pub fn view_projection(&self) -> Mat4 { self.projection * self.view } + + /// Returns **roughly** the location of the znear plane. + pub fn z_near(&self) -> f32 { + dist_bpp(&self.frustum.planes[0], self.position) + } + + pub fn z_far(&self) -> f32 { + dist_bpp(&self.frustum.planes[5], self.position) + } } /// Returns the projection and view matrices for a camera with default @@ -88,8 +97,8 @@ impl Camera { /// The default projection and view matrices are defined as: /// /// ```rust -/// use renderling::prelude::*; /// use glam::*; +/// use renderling::prelude::*; /// /// let width = 800.0; /// let height = 600.0; diff --git a/crates/renderling/src/context.rs b/crates/renderling/src/context.rs index 3ad9d125..a745c7f8 100644 --- a/crates/renderling/src/context.rs +++ b/crates/renderling/src/context.rs @@ -134,13 +134,13 @@ async fn device( adapter: &wgpu::Adapter, ) -> Result<(wgpu::Device, wgpu::Queue), wgpu::RequestDeviceError> { let wanted_features = wgpu::Features::INDIRECT_FIRST_INSTANCE - | wgpu::Features::MULTI_DRAW_INDIRECT - //// when debugging rust-gpu shader miscompilation it's nice to have this - //| wgpu::Features::SPIRV_SHADER_PASSTHROUGH - // this one is a funny requirement, it seems it is needed if using storage buffers in - // vertex shaders, even if those shaders are read-only - | wgpu::Features::VERTEX_WRITABLE_STORAGE - | wgpu::Features::CLEAR_TEXTURE; + | wgpu::Features::MULTI_DRAW_INDIRECT + //// when debugging rust-gpu shader miscompilation it's nice to have this + //| wgpu::Features::SPIRV_SHADER_PASSTHROUGH + // this one is a funny requirement, it seems it is needed if using storage buffers in + // vertex shaders, even if those shaders are read-only + | wgpu::Features::VERTEX_WRITABLE_STORAGE + | wgpu::Features::CLEAR_TEXTURE; let supported_features = adapter.features(); let required_features = wanted_features.intersection(supported_features); let unsupported_features = wanted_features.difference(supported_features); diff --git a/crates/renderling/src/convolution.rs b/crates/renderling/src/convolution.rs index 22c4f0f3..310114fa 100644 --- a/crates/renderling/src/convolution.rs +++ b/crates/renderling/src/convolution.rs @@ -14,6 +14,8 @@ use spirv_std::num_traits::Float; use crate::{camera::Camera, math::IsVector}; +// Allow manual bit rotation because this code is `no_std`. +#[allow(clippy::manual_rotate)] fn radical_inverse_vdc(mut bits: u32) -> f32 { bits = (bits << 16u32) | (bits >> 16u32); bits = ((bits & 0x55555555u32) << 1u32) | ((bits & 0xAAAAAAAAu32) >> 1u32); @@ -158,7 +160,6 @@ pub struct VertexPrefilterEnvironmentCubemapIds { pub roughness: Id, } -#[cfg(feature = "prefilter_environment_cubemap_vertex")] /// Vertex shader for rendering a "prefilter environment" cubemap. #[spirv(vertex)] pub fn prefilter_environment_cubemap_vertex( @@ -177,7 +178,6 @@ pub fn prefilter_environment_cubemap_vertex( *gl_pos = camera.view_projection() * in_pos.extend(1.0); } -#[cfg(feature = "prefilter_environment_cubemap_fragment")] /// Fragment shader for rendering a "prefilter environment" cubemap. /// /// Lambertian prefilter. @@ -242,7 +242,6 @@ pub fn calc_lod(n_dot_l: f32) -> f32 { 0.5 * (6.0 * cube_width * cube_width / (SAMPLE_COUNT as f32 * pdf).max(f32::EPSILON)).log2() } -#[cfg(feature = "generate_mipmap_vertex")] #[spirv(vertex)] /// Vertex shader for generating texture mips. pub fn generate_mipmap_vertex( @@ -255,7 +254,6 @@ pub fn generate_mipmap_vertex( *gl_pos = crate::math::CLIP_SPACE_COORD_QUAD_CCW[i]; } -#[cfg(feature = "generate_mipmap_fragment")] #[spirv(fragment)] /// Fragment shader for generating texture mips. pub fn generate_mipmap_fragment( @@ -296,7 +294,6 @@ const BRDF_VERTS: [Vert; 6] = { [bl, br, tr, bl, tr, tl] }; -#[cfg(feature = "brdf_lut_convolution_vertex")] #[spirv(vertex)] /// Vertex shader for creating a BRDF LUT. pub fn brdf_lut_convolution_vertex( @@ -309,7 +306,6 @@ pub fn brdf_lut_convolution_vertex( *gl_pos = Vec3::from(pos).extend(1.0); } -#[cfg(feature = "brdf_lut_convolution_fragment")] #[spirv(fragment)] /// Fragment shader for creating a BRDF LUT. pub fn brdf_lut_convolution_fragment(in_uv: glam::Vec2, out_color: &mut glam::Vec2) { diff --git a/crates/renderling/src/cubemap.rs b/crates/renderling/src/cubemap.rs index c465afbc..aef2a8fd 100644 --- a/crates/renderling/src/cubemap.rs +++ b/crates/renderling/src/cubemap.rs @@ -84,7 +84,7 @@ impl CubemapMakingRenderPipeline { layout: Some(&pp_layout), vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -105,7 +105,7 @@ impl CubemapMakingRenderPipeline { }, fragment: Some(wgpu::FragmentState { module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, + entry_point: Some(fragment_linkage.entry_point), targets: &[Some(wgpu::ColorTargetState { format, blend: Some(wgpu::BlendState::ALPHA_BLENDING), diff --git a/crates/renderling/src/cull.rs b/crates/renderling/src/cull.rs index 3daec213..8a204bd9 100644 --- a/crates/renderling/src/cull.rs +++ b/crates/renderling/src/cull.rs @@ -2,22 +2,28 @@ //! //! Frustum culling as explained in //! [the vulkan guide](https://vkguide.dev/docs/gpudriven/compute_culling/). -use crabslab::Slab; -use glam::UVec3; -use spirv_std::{arch::IndexUnchecked, spirv}; +use crabslab::{Array, Id, Slab, SlabItem}; +use glam::{UVec2, UVec3, Vec2, Vec3Swizzles}; +#[allow(unused_imports)] +use spirv_std::num_traits::Float; +use spirv_std::{ + arch::IndexUnchecked, + image::{sample_with, Image, ImageWithMethods}, + spirv, +}; -use crate::draw::DrawIndirectArgs; +use crate::{draw::DrawIndirectArgs, pbr::PbrConfig, stage::Renderlet}; #[cfg(not(target_arch = "spirv"))] mod cpu; #[cfg(not(target_arch = "spirv"))] pub use cpu::*; -#[cfg(feature = "compute_frustum_culling")] #[spirv(compute(threads(32)))] -pub fn compute_frustum_culling( - #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &mut [u32], - #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] args: &mut [DrawIndirectArgs], +pub fn compute_culling( + #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] stage_slab: &[u32], + #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] depth_pyramid_slab: &[u32], + #[spirv(storage_buffer, descriptor_set = 0, binding = 2)] args: &mut [DrawIndirectArgs], #[spirv(global_invocation_id)] global_id: UVec3, ) { let gid = global_id.x as usize; @@ -25,20 +31,215 @@ pub fn compute_frustum_culling( return; } + crate::println!("gid: {gid}"); // Get the draw arg let arg = unsafe { args.index_unchecked_mut(gid) }; // Get the renderlet using the draw arg's renderlet id - let renderlet = slab.read_unchecked(arg.first_instance); + let renderlet_id = Id::::new(arg.first_instance); + let renderlet = stage_slab.read_unchecked(renderlet_id); + crate::println!("renderlet: {renderlet_id:?}"); arg.vertex_count = renderlet.get_vertex_count(); arg.instance_count = if renderlet.visible { 1 } else { 0 }; if renderlet.bounds.radius == 0.0 { + crate::println!("renderlet bounding radius is zero, cannot cull"); return; } - let camera = slab.read(renderlet.camera_id); - let model = slab.read(renderlet.transform_id); - if !renderlet.bounds.is_inside_camera_view(&camera, model) { + + let config: PbrConfig = stage_slab.read(Id::new(0)); + if !config.perform_frustum_culling { + return; + } + + let camera = stage_slab.read(renderlet.camera_id); + let model = stage_slab.read(renderlet.transform_id); + // Compute frustum culling, and then occlusion culling, if need be + let (renderlet_is_inside_frustum, sphere_in_world_coords) = + renderlet.bounds.is_inside_camera_view(&camera, model); + + if renderlet_is_inside_frustum { + arg.instance_count = 1; + crate::println!("renderlet is inside frustum"); + crate::println!("znear: {}", camera.frustum().planes[0]); + crate::println!(" zfar: {}", camera.frustum().planes[5]); + if !config.perform_occlusion_culling { + return; + } + + // Compute occlusion culling using the hierachical z-buffer. + let hzb_desc = depth_pyramid_slab.read_unchecked::(0u32.into()); + let viewport_size = Vec2::new(hzb_desc.size.x as f32, hzb_desc.size.y as f32); + let sphere_aabb = sphere_in_world_coords.project_onto_viewport(&camera, viewport_size); + crate::println!("sphere_aabb: {sphere_aabb:#?}"); + + let size_in_pixels = sphere_aabb.max.xy() - sphere_aabb.min.xy(); + let size_in_pixels = if size_in_pixels.x > size_in_pixels.y { + size_in_pixels.x + } else { + size_in_pixels.y + }; + crate::println!("renderlet size in pixels: {size_in_pixels}"); + + let mip_level = size_in_pixels.log2().floor() as u32; + let max_mip_level = hzb_desc.mip.len() as u32 - 1; + let mip_level = if mip_level > max_mip_level { + crate::println!("mip_level maxed out at {mip_level}, setting to {max_mip_level}"); + max_mip_level + } else { + mip_level + }; + crate::println!( + "selected mip level: {mip_level} {}x{}", + viewport_size.x as u32 >> mip_level, + viewport_size.y as u32 >> mip_level + ); + + let center = sphere_aabb.center().xy(); + crate::println!("center: {center}"); + + let x = center.x.round() as u32 >> mip_level; + let y = center.y.round() as u32 >> mip_level; + crate::println!("mip (x, y): ({x}, {y})"); + + let depth_id = hzb_desc.id_of_depth(mip_level, UVec2::new(x, y), depth_pyramid_slab); + let depth_in_hzb = depth_pyramid_slab.read_unchecked(depth_id); + crate::println!("depth_in_hzb: {depth_in_hzb}"); + + let depth_of_sphere = sphere_aabb.min.z; + crate::println!("depth_of_sphere: {depth_of_sphere}"); + + let renderlet_is_behind_something = depth_of_sphere > depth_in_hzb; + let renderlet_surrounds_camera = depth_of_sphere > 1.0; + + if renderlet_is_behind_something || renderlet_surrounds_camera { + crate::println!("CULLED"); + arg.instance_count = 0; + } + } else { arg.instance_count = 0; } } + +/// A hierarchichal depth buffer. +/// +/// AKA HZB +#[derive(Clone, Copy, Default, SlabItem)] +pub struct DepthPyramidDescriptor { + /// Size of the top layer mip. + size: UVec2, + /// Current mip level. + /// + /// This will be updated for each run of the downsample compute shader. + mip_level: u32, + /// Pointer to the mip data. + /// + /// This points to the depth data at each mip level. + /// + /// The depth data itself is somewhere else in the slab. + mip: Array>, +} + +impl DepthPyramidDescriptor { + fn should_skip_invocation(&self, global_invocation: UVec3) -> bool { + let current_size = self.size >> self.mip_level; + !(global_invocation.x < current_size.x && global_invocation.y < current_size.y) + } + + #[cfg(test)] + fn size_at(&self, mip_level: u32) -> UVec2 { + UVec2::new(self.size.x >> mip_level, self.size.y >> mip_level) + } + + /// Return the [`Id`] of the depth at the given `mip_level` and coordinate. + fn id_of_depth(&self, mip_level: u32, coord: UVec2, slab: &[u32]) -> Id { + let mip_array = slab.read(self.mip.at(mip_level as usize)); + let width_at_mip = self.size.x >> mip_level; + let index = coord.y * width_at_mip + coord.x; + mip_array.at(index as usize) + } +} + +pub type DepthImage2d = Image!(2D, type=f32, sampled, depth); +pub type DepthImage2dMultisampled = Image!(2D, type=f32, sampled, depth, multisampled); + +/// Copies a depth texture to the top mip of a pyramid of mips. +/// +/// It is assumed that a [`DepthPyramidDescriptor`] is stored at index `0` in +/// the given slab. +#[spirv(compute(threads(32, 32, 1)))] +pub fn compute_copy_depth_to_pyramid( + #[spirv(descriptor_set = 0, binding = 0, storage_buffer)] slab: &mut [u32], + #[spirv(descriptor_set = 0, binding = 1)] depth_texture: &DepthImage2d, + #[spirv(global_invocation_id)] global_id: UVec3, +) { + let desc = slab.read_unchecked::(0u32.into()); + if desc.should_skip_invocation(global_id) { + return; + } + + let depth = depth_texture + .fetch_with(global_id.xy(), sample_with::lod(0)) + .x; + let dest_id = desc.id_of_depth(0, global_id.xy(), slab); + slab.write(dest_id, &depth); +} + +/// Copies a depth texture to the top mip of a pyramid of mips. +/// +/// It is assumed that a [`DepthPyramidDescriptor`] is stored at index `0` in +/// the given slab. +#[spirv(compute(threads(32, 32, 1)))] +pub fn compute_copy_depth_to_pyramid_multisampled( + #[spirv(descriptor_set = 0, binding = 0, storage_buffer)] slab: &mut [u32], + #[spirv(descriptor_set = 0, binding = 1)] depth_texture: &DepthImage2dMultisampled, + #[spirv(global_invocation_id)] global_id: UVec3, +) { + let desc = slab.read_unchecked::(0u32.into()); + if desc.should_skip_invocation(global_id) { + return; + } + + let depth = depth_texture + .fetch_with(global_id.xy(), sample_with::sample_index(0)) + .x; + let dest_id = desc.id_of_depth(0, global_id.xy(), slab); + slab.write(dest_id, &depth); +} + +/// Downsample from `DepthPyramidDescriptor::mip_level-1` into +/// `DepthPyramidDescriptor::mip_level`. +/// +/// It is assumed that a [`DepthPyramidDescriptor`] is stored at index `0` in +/// the given slab. +/// +/// The `DepthPyramidDescriptor`'s `mip_level` field will point to that of the +/// mip level being downsampled to (the mip level being written into). +/// +/// This shader should be called in a loop from from `1..mip_count`. +#[spirv(compute(threads(32, 32, 1)))] +pub fn compute_downsample_depth_pyramid( + #[spirv(descriptor_set = 0, binding = 0, storage_buffer)] slab: &mut [u32], + #[spirv(global_invocation_id)] global_id: UVec3, +) { + let desc = slab.read_unchecked::(0u32.into()); + if desc.should_skip_invocation(global_id) { + return; + } + // Sample the texel. + // + // The texel will look like this: + // + // a b + // c d + let a_coord = global_id.xy() * 2; + let a = slab.read(desc.id_of_depth(desc.mip_level - 1, a_coord, slab)); + let b = slab.read(desc.id_of_depth(desc.mip_level - 1, a_coord + UVec2::new(1, 0), slab)); + let c = slab.read(desc.id_of_depth(desc.mip_level - 1, a_coord + UVec2::new(0, 1), slab)); + let d = slab.read(desc.id_of_depth(desc.mip_level - 1, a_coord + UVec2::new(1, 1), slab)); + // Take the maximum depth of the region (max depth means furthest away) + let depth_value = a.max(b).max(c).max(d); + // Write the texel in the next mip + let depth_id = desc.id_of_depth(desc.mip_level, global_id.xy(), slab); + slab.write(depth_id, &depth_value); +} diff --git a/crates/renderling/src/cull/cpu.rs b/crates/renderling/src/cull/cpu.rs index bfaacd52..41924b13 100644 --- a/crates/renderling/src/cull/cpu.rs +++ b/crates/renderling/src/cull/cpu.rs @@ -1,31 +1,77 @@ //! CPU side of compute culling. -const LABEL: Option<&str> = Some("compute-culling"); +use crabslab::{Array, Slab}; +use glam::UVec2; +use snafu::{OptionExt, Snafu}; +use std::sync::Arc; -/// Computes furstum culling on the GPU. +use crate::{ + slab::{GpuArray, Hybrid, SlabAllocator, SlabAllocatorError}, + texture::Texture, +}; + +use super::DepthPyramidDescriptor; + +#[derive(Debug, Snafu)] +pub enum CullingError { + #[snafu(display( + "Texture is not a depth texture, expected '{:?}' but saw '{seen:?}'", + Texture::DEPTH_FORMAT + ))] + NotADepthTexture { seen: wgpu::TextureFormat }, + + #[snafu(display("Missing depth pyramid mip {index}"))] + MissingMip { index: usize }, + + #[snafu(display("{source}"))] + SlabError { source: SlabAllocatorError }, + + #[snafu(display("Could not read mip {index}"))] + ReadMip { index: usize }, +} + +impl From for CullingError { + fn from(source: SlabAllocatorError) -> Self { + CullingError::SlabError { source } + } +} + +/// Computes frustum and occlusion culling on the GPU. pub struct ComputeCulling { pipeline: wgpu::ComputePipeline, bindgroup_layout: wgpu::BindGroupLayout, bindgroup: Option, + pub(crate) compute_depth_pyramid: ComputeDepthPyramid, } impl ComputeCulling { + const LABEL: Option<&'static str> = Some("compute-culling"); + fn new_bindgroup( - slab_buffer: &wgpu::Buffer, + stage_slab_buffer: &wgpu::Buffer, + hzb_slab_buffer: &wgpu::Buffer, indirect_buffer: &wgpu::Buffer, layout: &wgpu::BindGroupLayout, device: &wgpu::Device, ) -> wgpu::BindGroup { device.create_bind_group(&wgpu::BindGroupDescriptor { - label: LABEL, + label: Self::LABEL, layout, entries: &[ wgpu::BindGroupEntry { binding: 0, - resource: wgpu::BindingResource::Buffer(slab_buffer.as_entire_buffer_binding()), + resource: wgpu::BindingResource::Buffer( + stage_slab_buffer.as_entire_buffer_binding(), + ), }, wgpu::BindGroupEntry { binding: 1, + resource: wgpu::BindingResource::Buffer( + hzb_slab_buffer.as_entire_buffer_binding(), + ), + }, + wgpu::BindGroupEntry { + binding: 2, resource: wgpu::BindingResource::Buffer( indirect_buffer.as_entire_buffer_binding(), ), @@ -34,15 +80,15 @@ impl ComputeCulling { }) } - pub fn new(device: &wgpu::Device) -> Self { + pub fn new(device: &wgpu::Device, size: UVec2, sample_count: u32) -> Self { let bindgroup_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: LABEL, + label: Self::LABEL, entries: &[ wgpu::BindGroupLayoutEntry { binding: 0, visibility: wgpu::ShaderStages::COMPUTE, ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Storage { read_only: false }, + ty: wgpu::BufferBindingType::Storage { read_only: true }, has_dynamic_offset: false, min_binding_size: None, }, @@ -51,6 +97,16 @@ impl ComputeCulling { wgpu::BindGroupLayoutEntry { binding: 1, visibility: wgpu::ShaderStages::COMPUTE, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::COMPUTE, ty: wgpu::BindingType::Buffer { ty: wgpu::BufferBindingType::Storage { read_only: false }, has_dynamic_offset: false, @@ -60,18 +116,18 @@ impl ComputeCulling { }, ], }); - let linkage = crate::linkage::compute_frustum_culling::linkage(device); + let linkage = crate::linkage::compute_culling::linkage(device); let pipeline = device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { - label: LABEL, + label: Self::LABEL, layout: Some( &device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: LABEL, + label: Self::LABEL, bind_group_layouts: &[&bindgroup_layout], push_constant_ranges: &[], }), ), module: &linkage.module, - entry_point: linkage.entry_point, + entry_point: Some(linkage.entry_point), compilation_options: wgpu::PipelineCompilationOptions::default(), cache: None, }); @@ -79,6 +135,7 @@ impl ComputeCulling { pipeline, bindgroup_layout, bindgroup: None, + compute_depth_pyramid: ComputeDepthPyramid::new(device, size, sample_count), } } @@ -89,12 +146,14 @@ impl ComputeCulling { fn get_bindgroup( &mut self, device: &wgpu::Device, - slab_buffer: &wgpu::Buffer, + stage_slab_buffer: &wgpu::Buffer, + hzb_slab_buffer: &wgpu::Buffer, indirect_draw_buffer: &wgpu::Buffer, ) -> &wgpu::BindGroup { if self.bindgroup.is_none() { self.bindgroup = Some(Self::new_bindgroup( - slab_buffer, + stage_slab_buffer, + hzb_slab_buffer, indirect_draw_buffer, &self.bindgroup_layout, device, @@ -108,22 +167,914 @@ impl ComputeCulling { &mut self, device: &wgpu::Device, queue: &wgpu::Queue, - slab_buffer: &wgpu::Buffer, + stage_slab_buffer: &wgpu::Buffer, indirect_draw_buffer: &wgpu::Buffer, indirect_draw_count: u32, - ) { + depth_texture: &Texture, + ) -> Result<(), CullingError> { + // Compute the depth pyramid from last frame's depth buffer + self.compute_depth_pyramid + .run(device, queue, depth_texture)?; + let (hzb_buffer, invalidate) = self + .compute_depth_pyramid + .depth_pyramid + .slab + .get_updated_buffer_and_check(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )); + if invalidate { + self.invalidate_bindgroup(); + } let mut encoder = - device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: LABEL }); + device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); { let mut compute_pass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { - label: LABEL, + label: Self::LABEL, timestamp_writes: None, }); compute_pass.set_pipeline(&self.pipeline); - let bindgroup = self.get_bindgroup(device, slab_buffer, indirect_draw_buffer); - compute_pass.set_bind_group(0, bindgroup, &[]); + let bindgroup = + self.get_bindgroup(device, stage_slab_buffer, &hzb_buffer, indirect_draw_buffer); + compute_pass.set_bind_group(0, Some(bindgroup), &[]); compute_pass.dispatch_workgroups(indirect_draw_count / 32 + 1, 1, 1); } queue.submit(Some(encoder.finish())); + Ok(()) + } +} + +pub struct DepthPyramid { + slab: SlabAllocator, + desc: Hybrid, + mip: GpuArray>, + mip_data: Vec>, +} + +impl DepthPyramid { + const LABEL: Option<&'static str> = Some("depth-pyramid"); + + fn allocate( + size: UVec2, + desc: &Hybrid, + slab: &SlabAllocator, + ) -> (Vec>, GpuArray>) { + let mip_levels = size.min_element().ilog2(); + let mip_data = (0..mip_levels) + .map(|i| { + let width = size.x >> i; + let height = size.y >> i; + slab.new_array(vec![0f32; (width * height) as usize]) + .into_gpu_only() + }) + .collect::>(); + let mip = slab.new_array(mip_data.iter().map(|m| m.array())); + desc.set(DepthPyramidDescriptor { + size, + mip_level: 0, + mip: mip.array(), + }); + (mip_data, mip.into_gpu_only()) + } + + pub fn new(size: UVec2) -> Self { + let slab = SlabAllocator::default(); + let desc = slab.new_value(DepthPyramidDescriptor::default()); + let (mip_data, mip) = Self::allocate(size, &desc, &slab); + + Self { + slab, + desc, + mip_data, + mip, + } + } + + pub fn resize( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + size: UVec2, + ) -> (Arc, bool) { + log::info!("resizing depth pyramid to {size}"); + let mip = self.slab.new_array(vec![]); + self.mip_data = vec![]; + self.desc.modify(|desc| desc.mip = mip.array()); + self.mip = mip.into_gpu_only(); + + // Reclaim the dropped buffer slots + let (_, should_invalidate_a) = self.slab.get_updated_buffer_and_check(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )); + + // Reallocate + let (mip_data, mip) = Self::allocate(size, &self.desc, &self.slab); + self.mip_data = mip_data; + self.mip = mip; + + // Run upkeep one more time to sync the resize + let (buffer, should_invalidate_b) = self.slab.get_updated_buffer_and_check(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )); + (buffer, should_invalidate_a || should_invalidate_b) + } + + pub fn size(&self) -> UVec2 { + self.desc.get().size + } + + pub async fn read_images( + &self, + ctx: &crate::Context, + ) -> Result, Vec>>, CullingError> { + let size = self.size(); + let slab_data = self.slab.read(ctx, Self::LABEL, 0..).await?; + let mut images = vec![]; + let mut min = f32::MAX; + let mut max = f32::MIN; + for (i, mip) in self.mip_data.iter().enumerate() { + let depth_data: Vec = slab_data + .read_vec(mip.array()) + .into_iter() + .inspect(|&depth| { + if i == 0 { + min = min.min(depth); + max = max.max(depth); + } + }) + .collect(); + log::info!("min: {min}"); + log::info!("max: {max}"); + let width = size.x >> i; + let height = size.y >> i; + let image: image::ImageBuffer, Vec> = + image::ImageBuffer::from_raw(width, height, depth_data) + .context(ReadMipSnafu { index: i })?; + images.push(image); + } + Ok(images) + } +} + +/// Copies the depth texture to the top of the depth pyramid. +struct ComputeCopyDepth { + pipeline: wgpu::ComputePipeline, + bindgroup_layout: wgpu::BindGroupLayout, + sample_count: u32, + bindgroup: Option, +} + +impl ComputeCopyDepth { + const LABEL: Option<&'static str> = Some("compute-occlusion-copy-depth-to-pyramid"); + + fn create_bindgroup_layout(device: &wgpu::Device, sample_count: u32) -> wgpu::BindGroupLayout { + if sample_count > 1 { + log::info!( + "creating bindgroup layout with {sample_count} multisampled depth for {}", + Self::LABEL.unwrap() + ); + } else { + log::info!( + "creating bindgroup layout without multisampling for {}", + Self::LABEL.unwrap() + ); + } + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Self::LABEL, + entries: &[ + // slab + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::COMPUTE, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: false }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + // previous_mip: DepthPyramidImage + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::COMPUTE, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Depth, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: sample_count > 1, + }, + count: None, + }, + ], + }) + } + + fn create_pipeline( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + multisampled: bool, + ) -> wgpu::ComputePipeline { + let linkage = if multisampled { + log::info!("creating multisampled shader for {}", Self::LABEL.unwrap()); + crate::linkage::compute_copy_depth_to_pyramid_multisampled::linkage(device) + } else { + log::info!( + "creating shader without multisampling for {}", + Self::LABEL.unwrap() + ); + crate::linkage::compute_copy_depth_to_pyramid::linkage(device) + }; + device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { + label: Self::LABEL, + layout: Some( + &device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Self::LABEL, + bind_group_layouts: &[bindgroup_layout], + push_constant_ranges: &[], + }), + ), + module: &linkage.module, + entry_point: Some(linkage.entry_point), + compilation_options: wgpu::PipelineCompilationOptions::default(), + cache: None, + }) + } + + fn create_bindgroup( + device: &wgpu::Device, + layout: &wgpu::BindGroupLayout, + pyramid_desc_buffer: &wgpu::Buffer, + depth_texture_view: &wgpu::TextureView, + ) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Self::LABEL, + layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Buffer( + pyramid_desc_buffer.as_entire_buffer_binding(), + ), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(depth_texture_view), + }, + ], + }) + } + + pub fn new(device: &wgpu::Device, sample_count: u32) -> Self { + let bindgroup_layout = Self::create_bindgroup_layout(device, sample_count); + let pipeline = Self::create_pipeline(device, &bindgroup_layout, sample_count > 1); + Self { + pipeline, + bindgroup: None, + bindgroup_layout, + sample_count, + } + } + + pub fn invalidate(&mut self) { + self.bindgroup = None; + } + + pub fn run( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + pyramid: &DepthPyramid, + depth_texture: &Texture, + ) { + let size = pyramid.desc.modify(|desc| { + desc.mip_level = 0; + desc.size + }); + let (slab_buffer, slab_buffer_is_new) = pyramid.slab.get_updated_buffer_and_check(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )); + + if slab_buffer_is_new { + self.bindgroup = None; + } + + let sample_count = depth_texture.texture.sample_count(); + let sample_count_mismatch = sample_count != self.sample_count; + + if sample_count_mismatch { + log::info!( + "sample count changed from {} to {}, updating {} bindgroup layout and pipeline", + self.sample_count, + sample_count, + Self::LABEL.unwrap() + ); + self.sample_count = sample_count; + self.bindgroup_layout = Self::create_bindgroup_layout(device, sample_count); + self.pipeline = Self::create_pipeline(device, &self.bindgroup_layout, sample_count > 1); + self.bindgroup = None; + } + + if self.bindgroup.is_none() { + self.bindgroup = Some(Self::create_bindgroup( + device, + &self.bindgroup_layout, + &slab_buffer, + &depth_texture.view, + )); + } + // UNWRAP: safe because we just set it above^ + let bindgroup = self.bindgroup.as_ref().unwrap(); + let mut encoder = + device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); + { + let mut compute_pass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { + label: Self::LABEL, + ..Default::default() + }); + compute_pass.set_pipeline(&self.pipeline); + compute_pass.set_bind_group(0, Some(bindgroup), &[]); + let x = size.x / 32 + 1; + let y = size.y / 32 + 1; + let z = 1; + compute_pass.dispatch_workgroups(x, y, z); + } + queue.submit(Some(encoder.finish())); + } +} + +/// Downsamples the depth texture from one mip to the next. +struct ComputeDownsampleDepth { + pipeline: wgpu::ComputePipeline, + bindgroup: Option, + bindgroup_layout: wgpu::BindGroupLayout, +} + +impl ComputeDownsampleDepth { + const LABEL: Option<&'static str> = Some("compute-occlusion-downsample-depth"); + + fn create_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Self::LABEL, + entries: &[ + // slab + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::COMPUTE, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: false }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + ], + }) + } + + fn create_pipeline( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + ) -> wgpu::ComputePipeline { + let linkage = crate::linkage::compute_downsample_depth_pyramid::linkage(device); + device.create_compute_pipeline(&wgpu::ComputePipelineDescriptor { + label: Self::LABEL, + layout: Some( + &device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Self::LABEL, + bind_group_layouts: &[bindgroup_layout], + push_constant_ranges: &[], + }), + ), + module: &linkage.module, + entry_point: Some(linkage.entry_point), + compilation_options: wgpu::PipelineCompilationOptions::default(), + cache: None, + }) + } + + fn create_bindgroup( + device: &wgpu::Device, + layout: &wgpu::BindGroupLayout, + pyramid_desc_buffer: &wgpu::Buffer, + ) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Self::LABEL, + layout, + entries: &[wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Buffer( + pyramid_desc_buffer.as_entire_buffer_binding(), + ), + }], + }) + } + + pub fn new(device: &wgpu::Device) -> Self { + let bindgroup_layout = Self::create_bindgroup_layout(device); + let pipeline = Self::create_pipeline(device, &bindgroup_layout); + Self { + pipeline, + bindgroup: None, + bindgroup_layout, + } + } + + pub fn invalidate(&mut self) { + self.bindgroup = None; + } + + pub fn run(&mut self, device: &wgpu::Device, queue: &wgpu::Queue, pyramid: &DepthPyramid) { + if self.bindgroup.is_none() { + self.bindgroup = Some(Self::create_bindgroup( + device, + &self.bindgroup_layout, + &pyramid.slab.get_updated_buffer(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )), + )); + } + for i in 1..pyramid.mip_data.len() { + log::trace!("downsampling to mip {i}"); + // UNWRAP: safe because we just set it above^ + let bindgroup = self.bindgroup.as_ref().unwrap(); + // Update the mip_level we're operating on. + let size = pyramid.desc.modify(|desc| { + desc.mip_level = i as u32; + desc.size + }); + // Sync the change. + let (_, should_invalidate) = pyramid.slab.get_updated_buffer_and_check(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )); + debug_assert!(!should_invalidate, "pyramid slab should never resize here"); + + let mut encoder = device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); + { + let mut compute_pass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { + label: Self::LABEL, + ..Default::default() + }); + compute_pass.set_pipeline(&self.pipeline); + compute_pass.set_bind_group(0, Some(bindgroup), &[]); + let w = size.x >> i; + let h = size.y >> i; + let x = w / 32 + 1; + let y = h / 32 + 1; + let z = 1; + compute_pass.dispatch_workgroups(x, y, z); + } + queue.submit(Some(encoder.finish())); + } + } +} + +/// Computes occlusion culling on the GPU. +pub struct ComputeDepthPyramid { + sample_count: u32, + pub(crate) depth_pyramid: DepthPyramid, + compute_copy_depth: ComputeCopyDepth, + compute_downsample_depth: ComputeDownsampleDepth, +} + +impl ComputeDepthPyramid { + const LABEL: Option<&'static str> = Some("compute-depth-pyramid"); + + pub fn new(device: &wgpu::Device, size: UVec2, sample_count: u32) -> Self { + let depth_pyramid = DepthPyramid::new(size); + let compute_copy_depth = ComputeCopyDepth::new(device, sample_count); + let compute_downsample_depth = ComputeDownsampleDepth::new(device); + Self { + depth_pyramid, + compute_copy_depth, + compute_downsample_depth, + sample_count, + } + } + + /// Invalidate the bindgroup. + /// + /// Call this if the depth texture is regenerated. + pub fn invalidate(&mut self) { + self.compute_copy_depth.invalidate(); + } + + pub fn run( + &mut self, + device: &wgpu::Device, + queue: &wgpu::Queue, + depth_texture: &Texture, + ) -> Result<(), CullingError> { + let sample_count = depth_texture.texture.sample_count(); + if sample_count != self.sample_count { + log::warn!( + "sample_count changed from {} to {sample_count}, invalidating", + self.sample_count + ); + self.compute_copy_depth.invalidate(); + self.sample_count = sample_count; + } + + let extent = depth_texture.texture.size(); + let size = UVec2::new(extent.width, extent.height); + let (_, should_invalidate) = if size != self.depth_pyramid.size() { + log::warn!("depth texture size changed, invalidating"); + self.compute_copy_depth.invalidate(); + self.compute_downsample_depth.invalidate(); + self.depth_pyramid.resize(device, queue, size) + } else { + self.depth_pyramid.slab.get_updated_buffer_and_check(( + device, + queue, + Self::LABEL, + wgpu::BufferUsages::empty(), + )) + }; + if should_invalidate { + self.compute_copy_depth.invalidate(); + self.compute_downsample_depth.invalidate(); + } + + self.compute_copy_depth + .run(device, queue, &self.depth_pyramid, depth_texture); + + self.compute_downsample_depth + .run(device, queue, &self.depth_pyramid); + + Ok(()) + } +} + +#[cfg(test)] +mod test { + use std::collections::HashMap; + + use crate::{ + bvol::BoundingSphere, cull::DepthPyramidDescriptor, draw::DrawIndirectArgs, + math::hex_to_vec4, prelude::*, + }; + use crabslab::GrowableSlab; + use glam::{Mat4, Quat, UVec2, UVec3, Vec2, Vec3, Vec4}; + + #[test] + fn occlusion_culling_sanity() { + let ctx = Context::headless(100, 100); + let stage = ctx.new_stage().with_background_color(Vec4::splat(1.0)); + let camera_position = Vec3::new(0.0, 9.0, 9.0); + let camera = stage.new_value(Camera::new( + Mat4::perspective_rh(std::f32::consts::PI / 4.0, 1.0, 1.0, 24.0), + Mat4::look_at_rh(camera_position, Vec3::ZERO, Vec3::Y), + )); + let geometry = stage.new_array(crate::test::gpu_cube_vertices()); + let transform = stage.new_value(Transform { + scale: Vec3::new(6.0, 6.0, 6.0), + rotation: Quat::from_axis_angle(Vec3::Y, -std::f32::consts::FRAC_PI_4), + ..Default::default() + }); + let cube = stage.new_value(Renderlet { + camera_id: camera.id(), + vertices_array: geometry.array(), + transform_id: transform.id(), + ..Default::default() + }); + stage.add_renderlet(&cube); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + frame.present(); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::save("cull/pyramid/frame.png", img); + frame.present(); + + let depth_texture = stage.get_depth_texture(); + let depth_img = depth_texture.read_image().unwrap(); + img_diff::save("cull/pyramid/depth.png", depth_img); + + let pyramid_images = futures_lite::future::block_on( + stage + .draw_calls + .read() + .unwrap() + .drawing_strategy + .as_indirect() + .unwrap() + .read_hzb_images(&ctx), + ) + .unwrap(); + for (i, img) in pyramid_images.into_iter().enumerate() { + img_diff::save(&format!("cull/pyramid/mip_{i}.png"), img); + } + } + + #[test] + fn depth_pyramid_descriptor_sanity() { + let mut slab = vec![]; + let size = UVec2::new(64, 32); + let mip_levels = size.min_element().ilog2(); + let desc_id = slab.allocate::(); + let mips_array = slab.allocate_array::>(mip_levels as usize); + let mip_data_arrays = (0..mip_levels) + .map(|i| { + let w = size.x >> i; + let h = size.y >> i; + let len = (w * h) as usize; + log::info!("allocating {len} f32s for mip {i} of size {w}x{h}"); + let array = slab.allocate_array::(len); + let mut data: Vec = vec![]; + for _y in 0..h { + for x in 0..w { + data.push(x as f32); + } + } + slab.write_array(array, &data); + array + }) + .collect::>(); + slab.write_array(mips_array, &mip_data_arrays); + let desc = DepthPyramidDescriptor { + size: UVec2::new(64, 32), + mip_level: 0, + mip: mips_array, + }; + slab.write(desc_id, &desc); + + // Test that `id_of_depth` returns the correct value. + for mip_level in 0..mip_levels { + let size = desc.size_at(mip_level); + log::info!("mip {mip_level} is size {size}"); + for y in 0..size.y { + for x in 0..size.x { + let id = desc.id_of_depth(mip_level, UVec2::new(x, y), &slab); + let depth = slab.read(id); + assert_eq!(x as f32, depth, "depth should be x value"); + } + } + } + } + + #[test] + fn occlusion_culling_debugging() { + let ctx = Context::headless(128, 128); + let stage = ctx + .new_stage() + .with_lighting(false) + .with_bloom(false) + .with_background_color(Vec4::splat(1.0)); + let camera = { + let fovy = std::f32::consts::FRAC_PI_4; + let aspect = 1.0; + let znear = 0.1; + let zfar = 100.0; + let projection = Mat4::perspective_rh(fovy, aspect, znear, zfar); + // Camera is looking straight down Z, towards the origin with Y up + let view = Mat4::look_at_rh(Vec3::new(0.0, 0.0, 10.0), Vec3::ZERO, Vec3::Y); + stage.new_value(Camera::new(projection, view)) + }; + + let save_render = |s: &str| { + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::save(&format!("cull/debugging_{s}.png"), img); + frame.present(); + }; + + // A hashmap to hold renderlet ids to their names. + let mut names = HashMap::, String>::default(); + + // Add four yellow cubes in each corner + let _ycubes = [ + (Vec2::new(-1.0, 1.0), "top_left"), + (Vec2::new(1.0, 1.0), "top_right"), + (Vec2::new(1.0, -1.0), "bottom_right"), + (Vec2::new(-1.0, -1.0), "bottom_left"), + ] + .map(|(offset, suffix)| { + let yellow = hex_to_vec4(0xFFE6A5FF); + let transform = stage.new_value(Transform { + // move it back behind the purple cube + translation: (offset * 10.0).extend(-20.0), + // scale it up since it's a unit cube + scale: Vec3::splat(2.0), + ..Default::default() + }); + let vertices = stage.new_array(crate::math::unit_cube().into_iter().map(|(p, n)| { + Vertex::default() + .with_position(p) + .with_normal(n) + .with_color(yellow) + })); + let renderlet = stage.new_value(Renderlet { + camera_id: camera.id(), + vertices_array: vertices.array(), + transform_id: transform.id(), + bounds: BoundingSphere::new(Vec3::ZERO, Vec3::splat(0.5).length()), + ..Default::default() + }); + stage.add_renderlet(&renderlet); + names.insert(renderlet.id(), format!("yellow_cube_{suffix}")); + (renderlet, transform, vertices) + }); + + save_render("0_yellow_cubes"); + + // We'll add a golden floor + let _floor = { + let golden = hex_to_vec4(0xFFBF61FF); + let transform = stage.new_value(Transform { + // flip it so it's facing up, like a floor should be + rotation: Quat::from_rotation_x(std::f32::consts::FRAC_PI_2), + // move it down and back a bit + translation: Vec3::new(0.0, -5.0, -10.0), + // scale it up, since it's a unit quad + scale: Vec3::new(100.0, 100.0, 1.0), + }); + let vertices = stage.new_array( + crate::math::UNIT_QUAD_CCW + .map(|p| Vertex::default().with_position(p).with_color(golden)), + ); + let renderlet = stage.new_value(Renderlet { + camera_id: camera.id(), + vertices_array: vertices.array(), + transform_id: transform.id(), + bounds: BoundingSphere::new(Vec3::ZERO, Vec2::splat(0.5).length()), + ..Default::default() + }); + stage.add_renderlet(&renderlet); + names.insert(renderlet.id(), "floor".into()); + (renderlet, transform, vertices) + }; + + save_render("1_floor"); + + // Add a green cube + let _gcube = { + let green = hex_to_vec4(0x8ABFA3FF); + let transform = stage.new_value(Transform { + // move it back behind the purple cube + translation: Vec3::new(0.0, 0.0, -10.0), + // scale it up since it's a unit cube + scale: Vec3::splat(5.0), + ..Default::default() + }); + let vertices = stage.new_array(crate::math::unit_cube().into_iter().map(|(p, n)| { + Vertex::default() + .with_position(p) + .with_normal(n) + .with_color(green) + })); + let renderlet = stage.new_value(Renderlet { + camera_id: camera.id(), + vertices_array: vertices.array(), + transform_id: transform.id(), + bounds: BoundingSphere::new(Vec3::ZERO, Vec3::splat(0.5).length()), + ..Default::default() + }); + stage.add_renderlet(&renderlet); + names.insert(renderlet.id(), "green_cube".into()); + (renderlet, transform, vertices) + }; + + save_render("2_green_cube"); + + // And a purple cube + let _pcube = { + let purple = hex_to_vec4(0x605678FF); + let transform = stage.new_value(Transform { + // move it back a bit + translation: Vec3::new(0.0, 0.0, -3.0), + // scale it up since it's a unit cube + scale: Vec3::splat(5.0), + ..Default::default() + }); + let vertices = stage.new_array(crate::math::unit_cube().into_iter().map(|(p, n)| { + Vertex::default() + .with_position(p) + .with_normal(n) + .with_color(purple) + })); + let renderlet = stage.new_value(Renderlet { + camera_id: camera.id(), + vertices_array: vertices.array(), + transform_id: transform.id(), + bounds: BoundingSphere::new(Vec3::ZERO, Vec3::splat(0.5).length()), + ..Default::default() + }); + stage.add_renderlet(&renderlet); + names.insert(renderlet.id(), "purple_cube".into()); + (renderlet, transform, vertices) + }; + + // Do two renders, because depth pyramid operates on depth data one frame + // behind + save_render("3_purple_cube"); + save_render("3_purple_cube"); + + // save the normalized depth image + let mut depth_img = stage.get_depth_texture().read_image().unwrap(); + let mut max = Vec3::MIN; + let mut min = Vec3::MAX; + depth_img.as_rgb32f().unwrap().pixels().for_each(|c| { + let v = Vec3::from(c.0); + max = max.max(v); + min = min.min(v); + }); + let total = max.x - min.x; + depth_img + .as_mut_rgb32f() + .unwrap() + .pixels_mut() + .for_each(|c| { + let comps = c.0.map(|u| (u - min.x) / total); + c.0 = comps; + }); + log::info!("min: {min}"); + log::info!("max: {max}"); + img_diff::save("cull/debugging_4_depth.png", depth_img); + + // save the normalized pyramid images + let pyramid_images = futures_lite::future::block_on( + stage + .draw_calls + .read() + .unwrap() + .drawing_strategy + .as_indirect() + .unwrap() + .read_hzb_images(&ctx), + ) + .unwrap(); + for (i, mut img) in pyramid_images.into_iter().enumerate() { + img.pixels_mut().for_each(|p| { + p.0[0] = (p.0[0] - min.x) / total; + }); + img_diff::save(&format!("cull/debugging_pyramid_mip_{i}.png"), img); + } + + // The stage's slab, which contains the `Renderlet`s and their `BoundingSphere`s + let stage_slab = + futures_lite::future::block_on(stage.read(&ctx, Some("read stage"), ..)).unwrap(); + let draw_calls = stage.draw_calls.read().unwrap(); + let indirect_draws = draw_calls.drawing_strategy.as_indirect().unwrap(); + // The HZB slab, which contains a `DepthPyramidDescriptor` at index 0, and all the + // pyramid's mips + let depth_pyramid_slab = futures_lite::future::block_on( + indirect_draws + .compute_culling + .compute_depth_pyramid + .depth_pyramid + .slab + .read(&ctx, Some("read hzb desc"), ..), + ) + .unwrap(); + // The indirect draw buffer + let mut args_slab = + futures_lite::future::block_on(indirect_draws.slab.read(&ctx, Some("read args"), ..)) + .unwrap(); + let args: &mut [DrawIndirectArgs] = bytemuck::cast_slice_mut(&mut args_slab); + // Number of `DrawIndirectArgs` in the `args` buffer. + let num_draw_calls = draw_calls.draw_count(); + + // Print our names so we know what we're working with + let mut pnames = names.iter().collect::>(); + pnames.sort(); + for (id, name) in pnames.into_iter() { + log::info!("id: {id:?}, name: {name}"); + } + + for i in 0..num_draw_calls as u32 { + let renderlet_id = Id::::new(args[i as usize].first_instance); + let name = names.get(&renderlet_id).unwrap(); + if name != "green_cube" { + continue; + } + log::info!(""); + log::info!("name: {name}"); + crate::cull::compute_culling( + &stage_slab, + &depth_pyramid_slab, + args, + UVec3::new(i, 0, 0), + ); + } } } diff --git a/crates/renderling/src/debug.rs b/crates/renderling/src/debug.rs new file mode 100644 index 00000000..72b5e924 --- /dev/null +++ b/crates/renderling/src/debug.rs @@ -0,0 +1,74 @@ +//! Debug overlay. +use crabslab::{Id, Slab}; +use glam::{Vec2, Vec3Swizzles, Vec4, Vec4Swizzles}; +#[cfg(target_arch = "spirv")] +use spirv_std::num_traits::Float; +use spirv_std::{arch::IndexUnchecked, spirv}; + +use crate::{draw::DrawIndirectArgs, pbr::PbrConfig, sdf, stage::Renderlet, transform::Transform}; + +#[cfg(not(target_arch = "spirv"))] +mod cpu; +#[cfg(not(target_arch = "spirv"))] +pub use cpu::*; + +/// Renders an implicit quad. +#[spirv(vertex)] +pub fn debug_overlay_vertex( + #[spirv(vertex_index)] vertex_id: u32, + #[spirv(position)] clip_pos: &mut Vec4, +) { + *clip_pos = crate::math::CLIP_SPACE_COORD_QUAD_CCW[vertex_id as usize % 6]; +} + +/// Renders a debug overlay on top of the current framebuffer. +/// +/// Displays useful information in real time. +#[spirv(fragment)] +pub fn debug_overlay_fragment( + #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32], + #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] draw_calls: &[DrawIndirectArgs], + #[spirv(frag_coord)] frag_coord: Vec4, + frag_color: &mut Vec4, +) { + let resolution_id = Id::from(PbrConfig::OFFSET_OF_RESOLUTION); + let viewport_size = slab.read_unchecked(resolution_id); + + *frag_color = Vec4::ZERO; + + for i in 0..draw_calls.len() { + let draw_call = unsafe { draw_calls.index_unchecked(i) }; + let renderlet_id = Id::::new(draw_call.first_instance); + let camera_id = slab.read_unchecked(renderlet_id + Renderlet::OFFSET_OF_CAMERA_ID); + let camera = slab.read_unchecked(camera_id); + let transform_id = slab.read_unchecked(renderlet_id + Renderlet::OFFSET_OF_TRANSFORM_ID); + let mut model = Transform::IDENTITY; + slab.read_into_if_some(transform_id, &mut model); + let bounds = slab.read_unchecked(renderlet_id + Renderlet::OFFSET_OF_BOUNDS); + + let (_, sphere_in_world_coords) = bounds.is_inside_camera_view(&camera, model); + let sphere_aabb = sphere_in_world_coords.project_onto_viewport( + &camera, + Vec2::new(viewport_size.x as f32, viewport_size.y as f32), + ); + + let sdf_circle = sdf::Box { + center: sphere_aabb.center().xy(), + half_extent: (sphere_aabb.max.xy() - sphere_aabb.min.xy()) * 0.5, + }; + + let distance = sdf_circle.distance(frag_coord.xy() + 0.5); + + // Here we use `step_le`, which I have annotated with `#inline(always)`. + // I did this because without it, it seems to do the opposite of expected. + // I found this by inlining by hand. + let alpha = crate::math::step_le(sphere_aabb.max.z, 1.0); + if distance.abs() < 0.5 { + *frag_color = Vec4::new(0.0, 0.0, 0.0, 1.0 * alpha); + } else if distance.abs() <= 2.0 { + *frag_color = Vec4::new(1.0, 1.0, 1.0, 0.5 * alpha); + } else if distance.abs() <= 3.0 { + *frag_color = Vec4::new(0.5, 0.5, 0.5, 1.0 * alpha); + } + } +} diff --git a/crates/renderling/src/debug/cpu.rs b/crates/renderling/src/debug/cpu.rs new file mode 100644 index 00000000..90529303 --- /dev/null +++ b/crates/renderling/src/debug/cpu.rs @@ -0,0 +1,168 @@ +//! CPU side of drawing debugging overlays. + +use std::sync::{Arc, Mutex}; + +#[derive(Clone)] +pub struct DebugOverlay { + pipeline: Arc, + bindgroup_layout: Arc, + bindgroup: Arc>>, +} + +impl DebugOverlay { + const LABEL: Option<&'static str> = Some("debug-overlay"); + + fn create_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Self::LABEL, + entries: &[ + // stage slab + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + // draw calls + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + ], + }) + } + + fn create_pipeline_layout( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + ) -> wgpu::PipelineLayout { + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Self::LABEL, + bind_group_layouts: &[bindgroup_layout], + push_constant_ranges: &[], + }) + } + + fn create_pipeline( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + format: wgpu::TextureFormat, + ) -> wgpu::RenderPipeline { + let vertex = crate::linkage::debug_overlay_vertex::linkage(device); + let fragment = crate::linkage::debug_overlay_fragment::linkage(device); + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Self::LABEL, + layout: Some(&Self::create_pipeline_layout(device, bindgroup_layout)), + vertex: wgpu::VertexState { + module: &vertex.module, + entry_point: None, + compilation_options: wgpu::PipelineCompilationOptions::default(), + buffers: &[], + }, + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleList, + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: None, + unclipped_depth: false, + polygon_mode: wgpu::PolygonMode::Fill, + conservative: false, + }, + + depth_stencil: None, + multisample: wgpu::MultisampleState::default(), + fragment: Some(wgpu::FragmentState { + module: &fragment.module, + entry_point: None, + compilation_options: wgpu::PipelineCompilationOptions::default(), + targets: &[Some(wgpu::ColorTargetState { + format, + blend: Some(wgpu::BlendState::ALPHA_BLENDING), + write_mask: wgpu::ColorWrites::all(), + })], + }), + multiview: None, + cache: None, + }) + } + + pub fn create_bindgroup( + &self, + device: &wgpu::Device, + slab_buffer: &wgpu::Buffer, + indirect_draw_buffer: &wgpu::Buffer, + ) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Self::LABEL, + layout: &self.bindgroup_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Buffer(slab_buffer.as_entire_buffer_binding()), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::Buffer( + indirect_draw_buffer.as_entire_buffer_binding(), + ), + }, + ], + }) + } + + pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { + let bindgroup_layout = Arc::new(Self::create_bindgroup_layout(device)); + Self { + pipeline: Self::create_pipeline(device, &bindgroup_layout, format).into(), + bindgroup_layout, + bindgroup: Arc::new(Mutex::new(None)), + } + } + + pub fn render( + &self, + device: &wgpu::Device, + queue: &wgpu::Queue, + view: &wgpu::TextureView, + slab_buffer: &wgpu::Buffer, + indirect_draw_buffer: &wgpu::Buffer, + ) { + let mut encoder = + device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); + { + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Self::LABEL, + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, + store: wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }); + render_pass.set_pipeline(&self.pipeline); + // UNWRAP: panic on purpose + let mut guard = self.bindgroup.lock().unwrap(); + if guard.is_none() { + *guard = Some(self.create_bindgroup(device, slab_buffer, indirect_draw_buffer)); + } + render_pass.set_bind_group(0, guard.as_ref(), &[]); + render_pass.draw(0..6, 0..1); + } + queue.submit(Some(encoder.finish())); + } +} diff --git a/crates/renderling/src/draw.rs b/crates/renderling/src/draw.rs index a5e5176f..70c9a4b9 100644 --- a/crates/renderling/src/draw.rs +++ b/crates/renderling/src/draw.rs @@ -3,9 +3,7 @@ //! [`DrawCalls`] is used to maintain the list of all staged [`Renderlet`]s. //! It also performs frustum culling and issues draw calls during //! [`Stage::render`]. -use crabslab::{Id, SlabItem}; - -use crate::stage::Renderlet; +use crabslab::SlabItem; #[cfg(not(target_arch = "spirv"))] mod cpu; @@ -13,10 +11,12 @@ mod cpu; pub use cpu::*; /// Argument buffer layout for draw_indirect commands. +#[repr(C)] +#[cfg_attr(not(target_arch = "spirv"), derive(bytemuck::Pod, bytemuck::Zeroable))] #[derive(Clone, Copy, Default, SlabItem)] pub struct DrawIndirectArgs { pub vertex_count: u32, pub instance_count: u32, pub first_vertex: u32, - pub first_instance: Id, + pub first_instance: u32, } diff --git a/crates/renderling/src/draw/cpu.rs b/crates/renderling/src/draw/cpu.rs index b397e4ea..ddc574e8 100644 --- a/crates/renderling/src/draw/cpu.rs +++ b/crates/renderling/src/draw/cpu.rs @@ -1,57 +1,56 @@ //! CPU-only side of renderling/draw.rs -use std::sync::{Arc, RwLock, Weak}; +use std::sync::Arc; use crabslab::Id; +use glam::UVec2; use rustc_hash::FxHashMap; use crate::{ - cull::ComputeCulling, - slab::{Gpu, Hybrid, SlabAllocator}, + cull::{ComputeCulling, CullingError}, + slab::{Gpu, Hybrid, SlabAllocator, WeakHybrid}, stage::Renderlet, + texture::Texture, Context, }; use super::DrawIndirectArgs; /// Used to track renderlets internally. +#[repr(transparent)] struct InternalRenderlet { - id: Id, - vertex_count: u32, - is_visible: bool, - weak_cpu: Weak>, - weak_gpu: Weak, + inner: WeakHybrid, } impl InternalRenderlet { fn has_external_references(&self) -> bool { - self.weak_gpu.strong_count() > 0 + self.inner.strong_count() > 0 } fn from_hybrid_renderlet(hr: &Hybrid) -> Self { - let r = hr.get(); - let weak_cpu = Arc::downgrade(&hr.cpu_value); - let weak_gpu = Arc::downgrade(&hr.gpu_value.update); - InternalRenderlet { - id: hr.id(), - vertex_count: r.get_vertex_count(), - is_visible: r.visible, - weak_cpu, - weak_gpu, + Self { + inner: WeakHybrid::from_hybrid(hr), } } + + fn copy_inner(&self) -> Option { + self.inner.upgrade().map(|hy| hy.get()) + } } -struct IndirectDraws { - slab: SlabAllocator, - draws: Vec>, - compute_culling: ComputeCulling, +/// Issues indirect draw calls. +/// +/// Issues draw calls and performs culling. +pub struct IndirectDraws { + pub(crate) slab: SlabAllocator, + pub(crate) draws: Vec>, + pub(crate) compute_culling: ComputeCulling, } impl IndirectDraws { - fn new(device: &wgpu::Device) -> Self { + fn new(device: &wgpu::Device, size: UVec2, sample_count: u32) -> Self { Self { - compute_culling: ComputeCulling::new(device), + compute_culling: ComputeCulling::new(device, size, sample_count), slab: SlabAllocator::default(), draws: vec![], } @@ -96,13 +95,28 @@ impl IndirectDraws { .iter() .map(|ir: &InternalRenderlet| { self.slab - .new_value(DrawIndirectArgs::from(ir.id)) + .new_value(DrawIndirectArgs::from(ir.inner.id())) .into_gpu_only() }) .collect(); } self.get_indirect_buffer(device, queue) } + + /// Read the images from the hierarchical z-buffer used for occlusion + /// culling. + /// + /// This is primarily for testing. + pub async fn read_hzb_images( + &self, + ctx: &crate::Context, + ) -> Result, Vec>>, CullingError> { + self.compute_culling + .compute_depth_pyramid + .depth_pyramid + .read_images(ctx) + .await + } } impl From> for DrawIndirectArgs { @@ -114,12 +128,12 @@ impl From> for DrawIndirectArgs { vertex_count: 0, instance_count: 0, first_vertex: 0, - first_instance: id, + first_instance: id.inner(), } } } -enum DrawingStrategy { +pub(crate) enum DrawingStrategy { /// The standard drawing method that includes compute culling. Indirect(IndirectDraws), /// Fallback drawing method for web targets. @@ -129,27 +143,38 @@ enum DrawingStrategy { Direct, } +impl DrawingStrategy { + #[cfg(test)] + pub fn as_indirect(&self) -> Option<&IndirectDraws> { + if let DrawingStrategy::Indirect(i) = self { + Some(i) + } else { + None + } + } +} + /// Used to determine which objects are drawn and maintains the /// list of all [`Renderlet`]s. pub struct DrawCalls { /// Internal representation of all staged renderlets. internal_renderlets: Vec, - drawing_strategy: DrawingStrategy, + pub(crate) drawing_strategy: DrawingStrategy, } impl DrawCalls { /// Create a new [`DrawCalls`]. /// - /// `use_compute_culling` can be used to set whether frustum culling is used as a GPU compute - /// step before drawing. This is a native-only option. - pub fn new(ctx: &Context, use_compute_culling: bool) -> Self { + /// `use_compute_culling` can be used to set whether frustum culling is used + /// as a GPU compute step before drawing. This is a native-only option. + pub fn new(ctx: &Context, use_compute_culling: bool, size: UVec2, sample_count: u32) -> Self { let can_use_multi_draw_indirect = ctx.get_adapter().features().contains( wgpu::Features::INDIRECT_FIRST_INSTANCE | wgpu::Features::MULTI_DRAW_INDIRECT, ); if use_compute_culling && !can_use_multi_draw_indirect { log::warn!( - "`use_compute_culling` is `true`, but the MULTI_DRAW_INDIRECT feature \ - is not available. No compute culling will occur." + "`use_compute_culling` is `true`, but the MULTI_DRAW_INDIRECT feature is not \ + available. No compute culling will occur." ) } let can_use_compute_culling = use_compute_culling && can_use_multi_draw_indirect; @@ -158,7 +183,11 @@ impl DrawCalls { drawing_strategy: { if can_use_compute_culling { log::debug!("Using indirect drawing method and compute culling"); - DrawingStrategy::Indirect(IndirectDraws::new(ctx.get_device())) + DrawingStrategy::Indirect(IndirectDraws::new( + ctx.get_device(), + size, + sample_count, + )) } else { log::debug!("Using direct drawing method"); DrawingStrategy::Direct @@ -191,7 +220,7 @@ impl DrawCalls { /// Returns the number of draw calls remaining in the queue. pub fn remove_renderlet(&mut self, renderlet: &Hybrid) -> usize { let id = renderlet.id(); - self.internal_renderlets.retain(|ir| ir.id != id); + self.internal_renderlets.retain(|ir| ir.inner.id() != id); if let DrawingStrategy::Indirect(indirect) = &mut self.drawing_strategy { indirect.invalidate(); @@ -212,7 +241,7 @@ impl DrawCalls { let mut m = FxHashMap::from_iter( std::mem::take(&mut self.internal_renderlets) .into_iter() - .map(|r| (r.id, r)), + .map(|r| (r.inner.id(), r)), ); for id in order.into_iter() { if let Some(renderlet) = m.remove(&id) { @@ -226,6 +255,15 @@ impl DrawCalls { } } + /// Iterator over all staged [`Renderlet`]s. + pub fn renderlets_iter(&self) -> impl Iterator { + self.internal_renderlets + .iter() + .filter_map(|ir| ir.copy_inner()) + .collect::>() + .into_iter() + } + /// Invalidates any resources that depend on the external stage slab buffer /// which holds the [`Renderlet`]s that have been queued to draw. pub fn invalidate_external_slab_buffer(&mut self) { @@ -241,21 +279,10 @@ impl DrawCalls { // Drop any renderlets that have no external references. self.internal_renderlets.retain_mut(|ir| { if ir.has_external_references() { - // Update the cached data (for direct drawing), if possible - // - // Note: - // If we can't upgrade here, it means the CPU value has been - // dropped. In that case we don't need to update the cache here, - // since the user can no longer update the cache either. - if let Some(arc_renderlet) = Weak::upgrade(&ir.weak_cpu) { - let r = arc_renderlet.read().unwrap(); - ir.vertex_count = r.get_vertex_count(); - ir.is_visible = r.visible; - } true } else { redraw_args = true; - log::trace!("dropping '{:?}' from drawing", ir.id); + log::trace!("dropping '{:?}' from drawing", ir.inner.id()); false } }); @@ -270,44 +297,65 @@ impl DrawCalls { } } + /// Returns the number of draw calls (direct or indirect) that will be + /// made during pre-rendering (compute culling) and rendering. + pub fn draw_count(&self) -> usize { + self.internal_renderlets.len() + } + /// Perform pre-draw steps like compute culling, if available. /// - /// This does not do upkeep, please call [`DrawCalls::upkeep`] before calling this - /// function. + /// This does not do upkeep, please call [`DrawCalls::upkeep`] before + /// calling this function. + /// + /// Returns the indirect draw buffer. pub fn pre_draw( &mut self, device: &wgpu::Device, queue: &wgpu::Queue, slab_buffer: &wgpu::Buffer, - ) { - let num_draw_calls = self.internal_renderlets.len(); + depth_texture: &Texture, + ) -> Result>, CullingError> { + let num_draw_calls = self.draw_count(); // Only do compute culling if there are things we need to draw, otherwise // `wgpu` will err with something like: // "Buffer with 'indirect draw upkeep' label binding size is zero" if num_draw_calls > 0 { + log::trace!("num_draw_calls: {num_draw_calls}"); + // TODO: Cull on GPU even when `multidraw_indirect` is unavailable. + // + // We can do this without multidraw by running GPU culling and then + // copying `indirect_buffer` back to the CPU. if let DrawingStrategy::Indirect(indirect) = &mut self.drawing_strategy { - if let Some(indirect_buffer) = indirect.slab.get_buffer() { + let maybe_buffer = indirect.slab.get_buffer(); + if let Some(indirect_buffer) = maybe_buffer.as_ref() { log::trace!("performing culling on {num_draw_calls} renderlets"); indirect.compute_culling.run( device, queue, slab_buffer, - &indirect_buffer, + indirect_buffer, num_draw_calls as u32, - ); + depth_texture, + )?; } else { log::warn!( - "DrawCalls::pre_render called without first calling `upkeep` \ - - no culling was performed" + "DrawCalls::pre_render called without first calling `upkeep` - no culling \ + was performed" ); } + Ok(maybe_buffer) + } else { + Ok(None) } + } else { + Ok(None) } } /// Draw into the given `RenderPass`. pub fn draw(&self, render_pass: &mut wgpu::RenderPass) { - let num_draw_calls = self.internal_renderlets.len(); + let num_draw_calls = self.draw_count(); if num_draw_calls > 0 { match &self.drawing_strategy { DrawingStrategy::Indirect(indirect) => { @@ -324,9 +372,10 @@ impl DrawCalls { log::trace!("drawing {num_draw_calls} renderlets using direct"); for ir in self.internal_renderlets.iter() { // UNWRAP: panic on purpose - if ir.is_visible { - let vertex_range = 0..ir.vertex_count; - let id = ir.id; + if let Some(hr) = ir.inner.upgrade() { + let ir = hr.get(); + let vertex_range = 0..ir.get_vertex_count(); + let id = hr.id(); let instance_range = id.inner()..id.inner() + 1; render_pass.draw(vertex_range, instance_range); } diff --git a/crates/renderling/src/ibl/diffuse_irradiance.rs b/crates/renderling/src/ibl/diffuse_irradiance.rs index 078cb85f..5b801dd3 100644 --- a/crates/renderling/src/ibl/diffuse_irradiance.rs +++ b/crates/renderling/src/ibl/diffuse_irradiance.rs @@ -88,7 +88,7 @@ impl DiffuseIrradianceConvolutionRenderPipeline { layout: Some(&pp_layout), vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -109,7 +109,7 @@ impl DiffuseIrradianceConvolutionRenderPipeline { }, fragment: Some(wgpu::FragmentState { module: &fragment_shader, - entry_point: "fragment_convolve_diffuse_irradiance", + entry_point: Some("fragment_convolve_diffuse_irradiance"), targets: &[Some(wgpu::ColorTargetState { format, blend: Some(wgpu::BlendState::ALPHA_BLENDING), diff --git a/crates/renderling/src/ibl/prefiltered_environment.rs b/crates/renderling/src/ibl/prefiltered_environment.rs index 798fbd9d..353922c0 100644 --- a/crates/renderling/src/ibl/prefiltered_environment.rs +++ b/crates/renderling/src/ibl/prefiltered_environment.rs @@ -69,7 +69,7 @@ pub fn create_pipeline_and_bindgroup( layout: Some(&pp_layout), vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -90,7 +90,7 @@ pub fn create_pipeline_and_bindgroup( }, fragment: Some(wgpu::FragmentState { module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, + entry_point: Some(fragment_linkage.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba16Float, blend: Some(wgpu::BlendState { diff --git a/crates/renderling/src/lib.rs b/crates/renderling/src/lib.rs index 2dd550fa..af3577a5 100644 --- a/crates/renderling/src/lib.rs +++ b/crates/renderling/src/lib.rs @@ -157,6 +157,7 @@ pub mod convolution; #[cfg(not(target_arch = "spirv"))] pub mod cubemap; pub mod cull; +pub mod debug; pub mod draw; #[cfg(not(target_arch = "spirv"))] pub mod ibl; @@ -164,6 +165,7 @@ pub mod ibl; mod linkage; pub mod math; pub mod pbr; +pub mod sdf; pub mod skybox; pub mod slab; pub mod stage; @@ -397,7 +399,7 @@ mod test { .with_color([r, g, b, 1.0]) } - fn gpu_cube_vertices() -> Vec { + pub fn gpu_cube_vertices() -> Vec { math::UNIT_INDICES .iter() .map(|i| cmy_gpu_vertex(math::UNIT_POINTS[*i])) @@ -430,9 +432,6 @@ mod test { let frame = ctx.get_next_frame().unwrap(); stage.render(&frame.view()); - let depth_texture = stage.get_depth_texture(); - let depth_img = depth_texture.read_image().unwrap(); - img_diff::save("cmy_cube/sanity_depth.png", depth_img); let img = frame.read_image().unwrap(); img_diff::assert_img_eq("cmy_cube/sanity.png", img); } diff --git a/crates/renderling/src/linkage.rs b/crates/renderling/src/linkage.rs index d6a81656..b5001c96 100644 --- a/crates/renderling/src/linkage.rs +++ b/crates/renderling/src/linkage.rs @@ -1,53 +1,45 @@ //! Provides convenient wrappers around renderling shader linkage. +//! +//! # Warning! +//! Please don't put anything in `crates/renderling/src/linkage/*`. +//! The files there are all auto-generated by the shader compilation machinery in `shaders/`. +//! It is common to delete everything in that directory and regenerate. use std::sync::Arc; -#[cfg(feature = "bloom_downsample_fragment")] pub mod bloom_downsample_fragment; -#[cfg(feature = "bloom_mix_fragment")] pub mod bloom_mix_fragment; -#[cfg(feature = "bloom_upsample_fragment")] pub mod bloom_upsample_fragment; -#[cfg(feature = "bloom_vertex")] pub mod bloom_vertex; -#[cfg(feature = "brdf_lut_convolution_fragment")] pub mod brdf_lut_convolution_fragment; -#[cfg(feature = "brdf_lut_convolution_vertex")] pub mod brdf_lut_convolution_vertex; -#[cfg(feature = "compute_frustum_culling")] -pub mod compute_frustum_culling; -#[cfg(feature = "generate_mipmap_fragment")] +pub mod compute_copy_depth_to_pyramid; +pub mod compute_copy_depth_to_pyramid_multisampled; +pub mod compute_culling; +pub mod compute_downsample_depth_pyramid; +pub mod debug_overlay_fragment; +pub mod debug_overlay_vertex; pub mod generate_mipmap_fragment; -#[cfg(feature = "generate_mipmap_vertex")] pub mod generate_mipmap_vertex; -#[cfg(feature = "prefilter_environment_cubemap_fragment")] pub mod prefilter_environment_cubemap_fragment; -#[cfg(feature = "prefilter_environment_cubemap_vertex")] pub mod prefilter_environment_cubemap_vertex; -#[cfg(feature = "renderlet_fragment")] pub mod renderlet_fragment; -#[cfg(feature = "renderlet_vertex")] pub mod renderlet_vertex; -#[cfg(feature = "skybox_cubemap_fragment")] pub mod skybox_cubemap_fragment; -#[cfg(feature = "skybox_cubemap_vertex")] pub mod skybox_cubemap_vertex; -#[cfg(feature = "skybox_equirectangular_fragment")] pub mod skybox_equirectangular_fragment; -#[cfg(feature = "skybox_vertex")] pub mod skybox_vertex; -#[cfg(feature = "tonemapping_fragment")] pub mod tonemapping_fragment; -#[cfg(feature = "tonemapping_vertex")] pub mod tonemapping_vertex; -#[cfg(feature = "tutorial_implicit_isosceles_vertex")] + +#[cfg(feature = "tutorial")] pub mod tutorial_implicit_isosceles_vertex; -#[cfg(feature = "tutorial_passthru_fragment")] +#[cfg(feature = "tutorial")] pub mod tutorial_passthru_fragment; -#[cfg(feature = "tutorial_slabbed_renderlet")] +#[cfg(feature = "tutorial")] pub mod tutorial_slabbed_renderlet; -#[cfg(feature = "tutorial_slabbed_vertices")] +#[cfg(feature = "tutorial")] pub mod tutorial_slabbed_vertices; -#[cfg(feature = "tutorial_slabbed_vertices_no_instance")] +#[cfg(feature = "tutorial")] pub mod tutorial_slabbed_vertices_no_instance; pub struct ShaderLinkage { diff --git a/crates/renderling/src/linkage/compute_copy_depth_to_pyramid.rs b/crates/renderling/src/linkage/compute_copy_depth_to_pyramid.rs new file mode 100644 index 00000000..54ddddda --- /dev/null +++ b/crates/renderling/src/linkage/compute_copy_depth_to_pyramid.rs @@ -0,0 +1,40 @@ +#![allow(dead_code)] +//! Automatically generated by Renderling's `build.rs`. +use crate::linkage::ShaderLinkage; +#[cfg(not(target_arch = "wasm32"))] +mod target { + pub const ENTRY_POINT: &str = "cull::compute_copy_depth_to_pyramid"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/cull-compute_copy_depth_to_pyramid.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!( + "creating native linkage for {}", + "compute_copy_depth_to_pyramid" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "cullcompute_copy_depth_to_pyramid"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/cull-compute_copy_depth_to_pyramid.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!( + "creating web linkage for {}", + "compute_copy_depth_to_pyramid" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +pub fn linkage(device: &wgpu::Device) -> ShaderLinkage { + target::linkage(device) +} diff --git a/crates/renderling/src/linkage/compute_copy_depth_to_pyramid_multisampled.rs b/crates/renderling/src/linkage/compute_copy_depth_to_pyramid_multisampled.rs new file mode 100644 index 00000000..7d544ce3 --- /dev/null +++ b/crates/renderling/src/linkage/compute_copy_depth_to_pyramid_multisampled.rs @@ -0,0 +1,40 @@ +#![allow(dead_code)] +//! Automatically generated by Renderling's `build.rs`. +use crate::linkage::ShaderLinkage; +#[cfg(not(target_arch = "wasm32"))] +mod target { + pub const ENTRY_POINT: &str = "cull::compute_copy_depth_to_pyramid_multisampled"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!( + "creating native linkage for {}", + "compute_copy_depth_to_pyramid_multisampled" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "cullcompute_copy_depth_to_pyramid_multisampled"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!( + "creating web linkage for {}", + "compute_copy_depth_to_pyramid_multisampled" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +pub fn linkage(device: &wgpu::Device) -> ShaderLinkage { + target::linkage(device) +} diff --git a/crates/renderling/src/linkage/compute_culling.rs b/crates/renderling/src/linkage/compute_culling.rs new file mode 100644 index 00000000..1a44979a --- /dev/null +++ b/crates/renderling/src/linkage/compute_culling.rs @@ -0,0 +1,34 @@ +#![allow(dead_code)] +//! Automatically generated by Renderling's `build.rs`. +use crate::linkage::ShaderLinkage; +#[cfg(not(target_arch = "wasm32"))] +mod target { + pub const ENTRY_POINT: &str = "cull::compute_culling"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/cull-compute_culling.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!("creating native linkage for {}", "compute_culling"); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "cullcompute_culling"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/cull-compute_culling.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!("creating web linkage for {}", "compute_culling"); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +pub fn linkage(device: &wgpu::Device) -> ShaderLinkage { + target::linkage(device) +} diff --git a/crates/renderling/src/linkage/compute_downsample_depth_pyramid.rs b/crates/renderling/src/linkage/compute_downsample_depth_pyramid.rs new file mode 100644 index 00000000..2a7066ae --- /dev/null +++ b/crates/renderling/src/linkage/compute_downsample_depth_pyramid.rs @@ -0,0 +1,40 @@ +#![allow(dead_code)] +//! Automatically generated by Renderling's `build.rs`. +use crate::linkage::ShaderLinkage; +#[cfg(not(target_arch = "wasm32"))] +mod target { + pub const ENTRY_POINT: &str = "cull::compute_downsample_depth_pyramid"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/cull-compute_downsample_depth_pyramid.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!( + "creating native linkage for {}", + "compute_downsample_depth_pyramid" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "cullcompute_downsample_depth_pyramid"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/cull-compute_downsample_depth_pyramid.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!( + "creating web linkage for {}", + "compute_downsample_depth_pyramid" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +pub fn linkage(device: &wgpu::Device) -> ShaderLinkage { + target::linkage(device) +} diff --git a/crates/renderling/src/linkage/compute_frustum_culling.rs b/crates/renderling/src/linkage/debug_overlay_fragment.rs similarity index 66% rename from crates/renderling/src/linkage/compute_frustum_culling.rs rename to crates/renderling/src/linkage/debug_overlay_fragment.rs index 9ef46a9a..2120094a 100644 --- a/crates/renderling/src/linkage/compute_frustum_culling.rs +++ b/crates/renderling/src/linkage/debug_overlay_fragment.rs @@ -3,12 +3,12 @@ use crate::linkage::ShaderLinkage; #[cfg(not(target_arch = "wasm32"))] mod target { - pub const ENTRY_POINT: &str = "cull::compute_frustum_culling"; + pub const ENTRY_POINT: &str = "debug::debug_overlay_fragment"; pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { - wgpu::include_spirv!("../../shaders/cull-compute_frustum_culling.spv") + wgpu::include_spirv!("../../shaders/debug-debug_overlay_fragment.spv") } pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { - log::info!("creating native linkage for {}", "compute_frustum_culling"); + log::info!("creating native linkage for {}", "debug_overlay_fragment"); super::ShaderLinkage { entry_point: ENTRY_POINT, module: device.create_shader_module(descriptor()).into(), @@ -17,12 +17,12 @@ mod target { } #[cfg(target_arch = "wasm32")] mod target { - pub const ENTRY_POINT: &str = "cullcompute_frustum_culling"; + pub const ENTRY_POINT: &str = "debugdebug_overlay_fragment"; pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { - wgpu::include_wgsl!("../../shaders/cull-compute_frustum_culling.wgsl") + wgpu::include_wgsl!("../../shaders/debug-debug_overlay_fragment.wgsl") } pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { - log::info!("creating web linkage for {}", "compute_frustum_culling"); + log::info!("creating web linkage for {}", "debug_overlay_fragment"); super::ShaderLinkage { entry_point: ENTRY_POINT, module: device.create_shader_module(descriptor()).into(), diff --git a/crates/renderling/src/linkage/debug_overlay_vertex.rs b/crates/renderling/src/linkage/debug_overlay_vertex.rs new file mode 100644 index 00000000..78dc2c60 --- /dev/null +++ b/crates/renderling/src/linkage/debug_overlay_vertex.rs @@ -0,0 +1,34 @@ +#![allow(dead_code)] +//! Automatically generated by Renderling's `build.rs`. +use crate::linkage::ShaderLinkage; +#[cfg(not(target_arch = "wasm32"))] +mod target { + pub const ENTRY_POINT: &str = "debug::debug_overlay_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/debug-debug_overlay_vertex.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!("creating native linkage for {}", "debug_overlay_vertex"); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "debugdebug_overlay_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/debug-debug_overlay_vertex.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::info!("creating web linkage for {}", "debug_overlay_vertex"); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +pub fn linkage(device: &wgpu::Device) -> ShaderLinkage { + target::linkage(device) +} diff --git a/crates/renderling/src/math.rs b/crates/renderling/src/math.rs index 29a5e40c..3a09b2a8 100644 --- a/crates/renderling/src/math.rs +++ b/crates/renderling/src/math.rs @@ -365,12 +365,20 @@ pub fn signum_or_zero(n: f32) -> f32 { ((n >= 0.0) as u32) as f32 - ((n < 0.0) as u32) as f32 } -/// Return `0.0` where `value` is less than `edge` and `1.0` where -/// `value` is greater than or equal to `edge`. -pub fn step(edge: f32, value: f32) -> f32 { +/// Return `1.0` when `value` is greater than or equal to `edge` and `0.0` where +/// `value` is less than `edge`. +#[inline(always)] +pub fn step_ge(value: f32, edge: f32) -> f32 { ((value >= edge) as u32) as f32 } +/// Return `1.0` when `value` is less than or equal to `edge` +/// and `0.0` when `value` is greater than `edge`. +#[inline(always)] +pub fn step_le(value: f32, edge: f32) -> f32 { + ((value <= edge) as u32) as f32 +} + pub fn smoothstep(edge_in: f32, edge_out: f32, mut x: f32) -> f32 { // Scale, and clamp x to 0..1 range x = clamp((x - edge_in) / (edge_out - edge_in), 0.0, 1.0); @@ -482,6 +490,10 @@ pub fn unit_cube() -> Vec<(Vec3, Vec3)> { .collect::>() } +/// Points on the unit cube that create a triangle-list mesh. +/// +/// Use [`unit_cube`] for a mesh that includes normals. +/// /// `rust-gpu` doesn't like nested/double indexing so we do this here. /// See [this comment on discord](https://discord.com/channels/750717012564770887/750717499737243679/1131395331368693770) pub const CUBE: [Vec3; 36] = { @@ -523,9 +535,9 @@ mod test { #[test] fn step_sanity() { - assert_eq!(0.0, step(0.0, -0.33333)); - assert_eq!(1.0, step(0.0, 0.33333)); - assert_eq!(1.0, step(0.0, 0.0)); + assert_eq!(0.0, step_le(0.0, -0.33333)); + assert_eq!(1.0, step_le(0.0, 0.33333)); + assert_eq!(1.0, step_le(0.0, 0.0)); } #[test] diff --git a/crates/renderling/src/pbr.rs b/crates/renderling/src/pbr.rs index abd20f55..0eca3f13 100644 --- a/crates/renderling/src/pbr.rs +++ b/crates/renderling/src/pbr.rs @@ -13,14 +13,14 @@ use spirv_std::num_traits::Float; use crate::{ atlas::AtlasTexture, - camera::Camera, math::{self, IsSampler, IsVector, Sample2d, Sample2dArray, SampleCube}, pbr::light::{DirectionalLight, PointLight, SpotLight}, println as my_println, + stage::Renderlet, }; pub mod debug; -use debug::DebugMode; +use debug::DebugChannel; pub mod light; use light::LightStyle; @@ -232,12 +232,15 @@ pub fn sample_brdf, S: IsSampler>( /// Holds PBR configuration info. #[cfg_attr(not(target_arch = "spirv"), derive(Debug))] #[derive(Clone, Copy, PartialEq, SlabItem)] +#[offsets] pub struct PbrConfig { pub atlas_size: glam::UVec2, pub resolution: glam::UVec2, - pub debug_mode: debug::DebugMode, + pub debug_channel: debug::DebugChannel, pub has_lighting: bool, pub has_skinning: bool, + pub perform_frustum_culling: bool, + pub perform_occlusion_culling: bool, pub light_array: Array>, } @@ -246,9 +249,11 @@ impl Default for PbrConfig { Self { atlas_size: Default::default(), resolution: glam::UVec2::ONE, - debug_mode: Default::default(), + debug_channel: Default::default(), has_lighting: true, has_skinning: true, + perform_frustum_culling: true, + perform_occlusion_culling: false, light_array: Default::default(), } } @@ -302,17 +307,8 @@ pub fn fragment_impl( brdf_sampler: &S, slab: &[u32], - PbrConfig { - atlas_size, - resolution: _, - debug_mode, - has_lighting, - has_skinning: _, - light_array, - }: PbrConfig, + renderlet_id: Id, - in_camera: Id, - in_material: Id, in_color: Vec4, in_uv0: Vec2, in_uv1: Vec2, @@ -328,7 +324,19 @@ pub fn fragment_impl( C: SampleCube, S: IsSampler, { - let material = get_material(in_material, has_lighting, slab); + let renderlet = slab.read_unchecked(renderlet_id); + let PbrConfig { + atlas_size, + resolution: _, + debug_channel, + has_lighting, + has_skinning: _, + perform_frustum_culling: _, + perform_occlusion_culling: _, + light_array, + } = slab.read_unchecked(renderlet.pbr_config_id); + + let material = get_material(renderlet.material_id, has_lighting, slab); my_println!("material: {:?}", material); let albedo_tex_uv = if material.albedo_tex_coord == 0 { @@ -431,7 +439,7 @@ pub fn fragment_impl( let emissive = emissive_tex_color.xyz() * material.emissive_factor * material.emissive_strength_multiplier; let irradiance = sample_irradiance(irradiance, irradiance_sampler, n); - let camera = slab.read(in_camera); + let camera = slab.read(renderlet.camera_id); let specular = sample_specular_reflection( prefiltered, prefiltered_sampler, @@ -446,82 +454,82 @@ pub fn fragment_impl( ((u.alt_norm_or_zero() + Vec3::splat(1.0)) / 2.0).extend(1.0) } - crate::println!("debug_mode: {debug_mode:?}"); - match debug_mode { - DebugMode::None => {} - DebugMode::UvCoords0 => { + crate::println!("debug_mode: {debug_channel:?}"); + match debug_channel { + DebugChannel::None => {} + DebugChannel::UvCoords0 => { *output = colorize(Vec3::new(in_uv0.x, in_uv0.y, 0.0)); return; } - DebugMode::UvCoords1 => { + DebugChannel::UvCoords1 => { *output = colorize(Vec3::new(in_uv1.x, in_uv1.y, 0.0)); return; } - DebugMode::Normals => { + DebugChannel::Normals => { *output = colorize(norm); return; } - DebugMode::VertexColor => { + DebugChannel::VertexColor => { *output = in_color; return; } - DebugMode::VertexNormals => { + DebugChannel::VertexNormals => { *output = colorize(in_norm); return; } - DebugMode::UvNormals => { + DebugChannel::UvNormals => { *output = colorize(uv_norm); return; } - DebugMode::Tangents => { + DebugChannel::Tangents => { *output = colorize(in_tangent); return; } - DebugMode::Bitangents => { + DebugChannel::Bitangents => { *output = colorize(in_bitangent); return; } - DebugMode::DiffuseIrradiance => { + DebugChannel::DiffuseIrradiance => { *output = irradiance.extend(1.0); return; } - DebugMode::SpecularReflection => { + DebugChannel::SpecularReflection => { *output = specular.extend(1.0); return; } - DebugMode::Brdf => { + DebugChannel::Brdf => { *output = brdf.extend(1.0).extend(1.0); return; } - DebugMode::Roughness => { + DebugChannel::Roughness => { *output = Vec3::splat(roughness).extend(1.0); return; } - DebugMode::Metallic => { + DebugChannel::Metallic => { *output = Vec3::splat(metallic).extend(1.0); return; } - DebugMode::Albedo => { + DebugChannel::Albedo => { *output = albedo; return; } - DebugMode::Occlusion => { + DebugChannel::Occlusion => { *output = Vec3::splat(ao).extend(1.0); return; } - DebugMode::Emissive => { + DebugChannel::Emissive => { *output = emissive.extend(1.0); return; } - DebugMode::UvEmissive => { + DebugChannel::UvEmissive => { *output = emissive_tex_color.xyz().extend(1.0); return; } - DebugMode::EmissiveFactor => { + DebugChannel::EmissiveFactor => { *output = material.emissive_factor.extend(1.0); return; } - DebugMode::EmissiveStrength => { + DebugChannel::EmissiveStrength => { *output = Vec3::splat(material.emissive_strength_multiplier).extend(1.0); return; } diff --git a/crates/renderling/src/pbr/debug.rs b/crates/renderling/src/pbr/debug.rs index c63fed3d..5c36e522 100644 --- a/crates/renderling/src/pbr/debug.rs +++ b/crates/renderling/src/pbr/debug.rs @@ -6,7 +6,7 @@ use crabslab::SlabItem; #[cfg_attr(not(target_arch = "spirv"), derive(Debug))] #[repr(u32)] #[derive(Clone, Copy, Default, PartialEq, PartialOrd, SlabItem)] -pub enum DebugMode { +pub enum DebugChannel { #[default] None, diff --git a/crates/renderling/src/sdf.rs b/crates/renderling/src/sdf.rs new file mode 100644 index 00000000..80cabc2b --- /dev/null +++ b/crates/renderling/src/sdf.rs @@ -0,0 +1,84 @@ +//! SDF functions for use in shaders. +//! +//! For more info, see these great articles: +//! - + +use crabslab::SlabItem; +use glam::Vec2; + +#[derive(Clone, Copy, SlabItem)] +pub struct Circle { + pub center: Vec2, + pub radius: f32, +} + +impl Circle { + pub fn distance(&self, point: Vec2) -> f32 { + let p = point - self.center; + p.length() - self.radius + } +} + +#[derive(Clone, Copy, SlabItem)] +pub struct Box { + pub center: Vec2, + pub half_extent: Vec2, +} + +impl Box { + pub fn distance(&self, point: Vec2) -> f32 { + let p = point - self.center; + let component_edge_distance = p.abs() - self.half_extent; + let outside = component_edge_distance.max(Vec2::ZERO).length(); + let inside = component_edge_distance + .x + .max(component_edge_distance.y) + .min(0.0); + inside + outside + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn sdf_circle_sanity() { + let mut img = image::ImageBuffer::, Vec>::new(32, 32); + + let circle = Circle { + center: Vec2::new(12.0, 12.0), + radius: 4.0, + }; + + img.enumerate_pixels_mut().for_each(|(x, y, p)| { + let distance = circle.distance(Vec2::new(x as f32 + 0.5, y as f32 + 0.5)); + p.0[0] = distance / circle.radius; + }); + + img_diff::assert_img_eq( + "sdf/circle_sanity.png", + image::DynamicImage::from(img).into_rgb8(), + ); + } + + #[test] + fn sdf_box_sanity() { + let mut img = image::ImageBuffer::, Vec>::new(32, 32); + + let bx = Box { + center: Vec2::new(12.0, 12.0), + half_extent: Vec2::new(4.0, 6.0), + }; + + img.enumerate_pixels_mut().for_each(|(x, y, p)| { + let distance = bx.distance(Vec2::new(x as f32 + 0.5, y as f32 + 0.5)); + p.0[0] = distance / bx.half_extent.max_element(); + }); + + img_diff::assert_img_eq( + "sdf/box_sanity.png", + image::DynamicImage::from(img).into_rgb8(), + ); + } +} diff --git a/crates/renderling/src/skybox.rs b/crates/renderling/src/skybox.rs index b434ba06..d3797f3c 100644 --- a/crates/renderling/src/skybox.rs +++ b/crates/renderling/src/skybox.rs @@ -30,7 +30,6 @@ pub fn direction_to_equirectangular_uv(dir: Vec3) -> Vec2 { uv } -#[cfg(feature = "skybox_vertex")] /// Vertex shader for a skybox. #[spirv(vertex)] pub fn skybox_vertex( @@ -50,7 +49,6 @@ pub fn skybox_vertex( *clip_pos = position.xyww(); } -#[cfg(feature = "skybox_cubemap_fragment")] /// Colors a skybox using a cubemap texture. #[spirv(fragment)] pub fn skybox_cubemap_fragment( @@ -63,7 +61,6 @@ pub fn skybox_cubemap_fragment( *out_color = env_color.extend(1.0); } -#[cfg(feature = "skybox_cubemap_vertex")] /// Vertex shader that draws a cubemap. /// /// Uses the `instance_index` as the [`Id`] for a [`Camera`]. @@ -84,7 +81,6 @@ pub fn skybox_cubemap_vertex( *gl_pos = camera.view_projection() * pos.extend(1.0); } -#[cfg(feature = "skybox_equirectangular_fragment")] /// Fragment shader that colors a skybox using an equirectangular texture. #[spirv(fragment)] pub fn skybox_equirectangular_fragment( diff --git a/crates/renderling/src/skybox/cpu.rs b/crates/renderling/src/skybox/cpu.rs index 98536b1f..9542bfad 100644 --- a/crates/renderling/src/skybox/cpu.rs +++ b/crates/renderling/src/skybox/cpu.rs @@ -103,7 +103,7 @@ pub(crate) fn create_skybox_render_pipeline( layout: Some(&pp_layout), vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -130,7 +130,7 @@ pub(crate) fn create_skybox_render_pipeline( }, fragment: Some(wgpu::FragmentState { module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, + entry_point: Some(fragment_linkage.entry_point), targets: &[Some(wgpu::ColorTargetState { format, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -426,7 +426,7 @@ impl Skybox { }); render_pass.set_pipeline(pipeline); - render_pass.set_bind_group(0, bindgroup, &[]); + render_pass.set_bind_group(0, Some(bindgroup), &[]); render_pass.draw(0..36, 0..1); } @@ -547,7 +547,7 @@ impl Skybox { }); render_pass.set_pipeline(&pipeline); - render_pass.set_bind_group(0, &bindgroup, &[]); + render_pass.set_bind_group(0, Some(&bindgroup), &[]); render_pass.draw(0..36, prefilter_id.inner()..prefilter_id.inner() + 1); } @@ -575,7 +575,7 @@ impl Skybox { layout: None, vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -596,7 +596,7 @@ impl Skybox { }, fragment: Some(wgpu::FragmentState { module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, + entry_point: Some(fragment_linkage.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rg16Float, blend: Some(wgpu::BlendState { diff --git a/crates/renderling/src/slab/cpu.rs b/crates/renderling/src/slab/cpu.rs index 33cc8d86..ebb56e2f 100644 --- a/crates/renderling/src/slab/cpu.rs +++ b/crates/renderling/src/slab/cpu.rs @@ -247,7 +247,9 @@ impl Default for SlabAllocator { update_queue: Default::default(), recycles: Default::default(), len: Default::default(), - capacity: Default::default(), + // Start with size 1, because some of `wgpu`'s validation depends on it. + // See for more info. + capacity: Arc::new(AtomicUsize::new(1)), needs_expansion: Arc::new(true.into()), buffer: Default::default(), } @@ -311,7 +313,7 @@ impl SlabAllocator { } pub(crate) fn insert_update_source(&self, k: usize, source: WeakGpuRef) { - log::trace!("inserting update source {k}",); + log::trace!("slab insert_update_source {k}",); let _ = self.notifier.0.try_send(k); // UNWRAP: panic on purpose self.update_sources.write().unwrap().insert(k, source); @@ -326,7 +328,10 @@ impl SlabAllocator { let may_range = self.recycles.write().unwrap().remove(T::SLAB_SIZE as u32); if let Some(range) = may_range { let id = Id::::new(range.first_index); - log::trace!("dequeued {range:?} to {id:?}"); + log::trace!( + "slab allocate {}: dequeued {range:?} to {id:?}", + std::any::type_name::() + ); debug_assert_eq!( range.last_index, range.first_index + T::SLAB_SIZE as u32 - 1 @@ -352,7 +357,10 @@ impl SlabAllocator { .remove((T::SLAB_SIZE * len) as u32); if let Some(range) = may_range { let array = Array::::new(range.first_index, len as u32); - log::trace!("dequeued {range:?} to {array:?}"); + log::trace!( + "slab allocate_array {len}x{}: dequeued {range:?} to {array:?}", + std::any::type_name::() + ); debug_assert_eq!( range.last_index, range.first_index + (T::SLAB_SIZE * len) as u32 - 1 @@ -409,12 +417,26 @@ impl SlabAllocator { /// Use [`SlabAllocator::upkeep`] when you only need the buffer after a /// change, for example to recreate bindgroups. pub fn get_updated_buffer(&self, resources: Buffer::Resources<'_>) -> Arc { + self.get_updated_buffer_and_check(resources).0 + } + + /// Return an updated buffer, and whether or not it is different from the + /// last one. + /// + /// This is the only way to guarantee access to a buffer. + /// + /// Use [`SlabAllocator::upkeep`] when you only need the buffer after a + /// change, for example to recreate bindgroups. + pub fn get_updated_buffer_and_check( + &self, + resources: Buffer::Resources<'_>, + ) -> (Arc, bool) { if let Some(new_buffer) = self.upkeep(resources) { - new_buffer + (new_buffer, true) } else { // UNWRAP: safe because we know the buffer exists at this point, // as we've called `upkeep` above - self.get_buffer().unwrap() + (self.get_buffer().unwrap(), false) } } @@ -455,6 +477,8 @@ impl SlabAllocator { /// Build the set of sources that require updates, draining the source /// notifier and resetting the stored `update_queue`. + /// + /// This also places recycled items into the recycle bin. fn drain_updated_sources(&self) -> RangeManager { let update_set = self.get_updated_source_ids(); // UNWRAP: panic on purpose @@ -471,14 +495,16 @@ impl SlabAllocator { let count = gpu_ref.weak.strong_count(); if count == 0 { // recycle this allocation - log::debug!("recycling {key} {:?}", gpu_ref.u32_array); - if gpu_ref.u32_array.is_null() || gpu_ref.u32_array.is_empty() { - log::debug!(" cannot recycle - empty or null"); - true + let array = gpu_ref.u32_array; + log::debug!("slab drain_updated_sources: recycling {key} {array:?}"); + if array.is_null() { + log::debug!(" cannot recycle, null"); + } else if array.is_empty() { + log::debug!(" cannot recycle, empty"); } else { recycles_guard.add_range(gpu_ref.u32_array.into()); - true } + true } else { gpu_ref .get_update() @@ -547,8 +573,7 @@ impl SlabAllocator { /// This is primarily used for debugging. pub async fn read( &self, - device: &wgpu::Device, - queue: &wgpu::Queue, + ctx: &crate::Context, label: Option<&str>, range: impl std::ops::RangeBounds, ) -> Result, SlabAllocatorError> { @@ -566,7 +591,7 @@ impl SlabAllocator { let byte_offset = start * std::mem::size_of::(); let length = len * std::mem::size_of::(); let output_buffer_size = length as u64; - let output_buffer = device.create_buffer(&wgpu::BufferDescriptor { + let output_buffer = ctx.get_device().create_buffer(&wgpu::BufferDescriptor { label, size: output_buffer_size, usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::MAP_READ, @@ -574,7 +599,9 @@ impl SlabAllocator { }); let internal_buffer = self.get_buffer().context(NoInternalBufferSnafu)?; - let mut encoder = device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label }); + let mut encoder = ctx + .get_device() + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label }); log::trace!( "copy_buffer_to_buffer byte_offset:{byte_offset}, \ output_buffer_size:{output_buffer_size}", @@ -586,12 +613,12 @@ impl SlabAllocator { 0, output_buffer_size, ); - queue.submit(std::iter::once(encoder.finish())); + ctx.get_queue().submit(std::iter::once(encoder.finish())); let buffer_slice = output_buffer.slice(..); let (tx, rx) = async_channel::bounded(1); buffer_slice.map_async(wgpu::MapMode::Read, move |res| tx.try_send(res).unwrap()); - device.poll(wgpu::Maintain::Wait); + ctx.get_device().poll(wgpu::Maintain::Wait); rx.recv() .await .context(AsyncRecvSnafu)? @@ -601,7 +628,7 @@ impl SlabAllocator { } } -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct SlabUpdate { pub array: Array, pub elements: Vec, @@ -625,7 +652,6 @@ impl SlabUpdate { } pub(crate) struct WeakGpuRef { - pub(crate) notifier_index: usize, pub(crate) u32_array: Array, pub(crate) weak: Weak>>, pub(crate) takes_update: bool, @@ -650,7 +676,6 @@ impl WeakGpuRef { pub(crate) fn from_gpu(gpu: &Gpu) -> Self { WeakGpuRef { - notifier_index: gpu.notifier_index, u32_array: Array::new(gpu.id.inner(), T::SLAB_SIZE as u32), weak: Arc::downgrade(&gpu.update), takes_update: true, @@ -659,7 +684,6 @@ impl WeakGpuRef { pub(crate) fn from_gpu_array(gpu_array: &GpuArray) -> Self { WeakGpuRef { - notifier_index: gpu_array.notifier_index, u32_array: gpu_array.array.into_u32_array(), weak: Arc::downgrade(&gpu_array.updates), takes_update: true, @@ -667,8 +691,8 @@ impl WeakGpuRef { } } -// impl UpdatesSlab for GpuArray { -// fn strong_count(&self) -> usize { +// impl UpdatesSlab for +// GpuArray { fn strong_count(&self) -> usize { // Arc::strong_count(&self.updates) // } @@ -685,8 +709,8 @@ impl WeakGpuRef { // } // } -// impl UpdatesSlab for HybridArray { -// fn strong_count(&self) -> usize { +// impl UpdatesSlab for +// HybridArray { fn strong_count(&self) -> usize { // self.gpu_value.strong_count() // } @@ -758,6 +782,10 @@ impl Clone for WeakHybrid { } impl WeakHybrid { + pub fn id(&self) -> Id { + self.weak_gpu.id + } + pub fn from_hybrid(h: &Hybrid) -> Self { Self { weak_cpu: Arc::downgrade(&h.cpu_value), @@ -771,6 +799,10 @@ impl WeakHybrid { gpu_value: self.weak_gpu.upgrade()?, }) } + + pub fn strong_count(&self) -> usize { + self.weak_gpu.update.strong_count() + } } /// A "hybrid" type that lives on the CPU and the GPU. @@ -824,11 +856,12 @@ impl Hybrid { self.cpu_value.read().unwrap().clone() } - pub fn modify(&self, f: impl FnOnce(&mut T)) { + pub fn modify(&self, f: impl FnOnce(&mut T) -> A) -> A { let mut value_guard = self.cpu_value.write().unwrap(); - f(&mut value_guard); + let a = f(&mut value_guard); let t = value_guard.clone(); self.gpu_value.set(t); + a } pub fn set(&self, value: T) { @@ -910,6 +943,7 @@ impl Gpu { /// Once created, the array cannot be resized. /// /// Updates are syncronized to the GPU once per frame. +#[derive(Debug)] pub struct GpuArray { array: Array, notifier_index: usize, diff --git a/crates/renderling/src/stage.rs b/crates/renderling/src/stage.rs index 25af6ab7..70cda871 100644 --- a/crates/renderling/src/stage.rs +++ b/crates/renderling/src/stage.rs @@ -53,8 +53,9 @@ impl Skin { let joint_index = vertex.joints[i] as usize; let joint_id = slab.read(self.joints.at(joint_index)); let joint_transform = slab.read(joint_id); - // First apply the inverse bind matrix to bring the vertex into the joint's local space, - // then apply the joint's current transformation to move it into world space. + // First apply the inverse bind matrix to bring the vertex into the joint's + // local space, then apply the joint's current transformation to move it + // into world space. let inverse_bind_matrix = slab.read(self.inverse_bind_matrices.at(joint_index)); Mat4::from(joint_transform) * inverse_bind_matrix } @@ -195,9 +196,11 @@ impl Vertex { /// the [`Stage`]. #[cfg_attr(not(target_arch = "spirv"), derive(Debug))] #[derive(Clone, Copy, PartialEq, SlabItem)] +#[offsets] pub struct Renderlet { pub visible: bool, pub vertices_array: Array, + /// Bounding sphere of the entire renderlet, in local space. pub bounds: BoundingSphere, pub indices_array: Array, pub camera_id: Id, @@ -228,7 +231,8 @@ impl Default for Renderlet { } impl Renderlet { - /// Retrieve the vertex from the slab, calculating any displacement due to morph targets. + /// Retrieve the vertex from the slab, calculating any displacement due to + /// morph targets. pub fn get_vertex(&self, vertex_index: u32, slab: &[u32]) -> Vertex { let index = if self.indices_array.is_null() { vertex_index as usize @@ -257,7 +261,6 @@ impl Renderlet { } } -#[cfg(feature = "renderlet_vertex")] /// Renderlet vertex shader. #[spirv(vertex)] #[allow(clippy::too_many_arguments)] @@ -268,9 +271,7 @@ pub fn renderlet_vertex( #[spirv(vertex_index)] vertex_index: u32, #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32], - #[spirv(flat)] out_camera: &mut Id, - #[spirv(flat)] out_material: &mut Id, - #[spirv(flat)] out_pbr_config: &mut Id, + #[spirv(flat)] out_renderlet: &mut Id, out_color: &mut Vec4, out_uv0: &mut Vec2, out_uv1: &mut Vec2, @@ -287,9 +288,7 @@ pub fn renderlet_vertex( return; } - *out_camera = renderlet.camera_id; - *out_material = renderlet.material_id; - *out_pbr_config = renderlet.pbr_config_id; + *out_renderlet = renderlet_id; let vertex = renderlet.get_vertex(vertex_index, slab); *out_color = vertex.color; @@ -328,7 +327,6 @@ pub fn renderlet_vertex( *out_clip_pos = camera.view_projection() * world_pos.extend(1.0); } -#[cfg(feature = "renderlet_fragment")] /// Renderlet fragment shader #[allow(clippy::too_many_arguments, dead_code)] #[spirv(fragment)] @@ -345,10 +343,7 @@ pub fn renderlet_fragment( #[spirv(descriptor_set = 1, binding = 6)] brdf: &Image2d, #[spirv(descriptor_set = 1, binding = 7)] brdf_sampler: &Sampler, #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32], - #[spirv(frag_coord)] _frag_coord: Vec4, - #[spirv(flat)] in_camera: Id, - #[spirv(flat)] in_material: Id, - #[spirv(flat)] in_pbr_config: Id, + #[spirv(flat)] renderlet_id: Id, in_color: Vec4, in_uv0: Vec2, in_uv1: Vec2, @@ -368,9 +363,7 @@ pub fn renderlet_fragment( brdf, brdf_sampler, slab, - slab.read(in_pbr_config), - in_camera, - in_material, + renderlet_id, in_color, in_uv0, in_uv1, diff --git a/crates/renderling/src/stage/cpu.rs b/crates/renderling/src/stage/cpu.rs index 048e9b79..aee5d958 100644 --- a/crates/renderling/src/stage/cpu.rs +++ b/crates/renderling/src/stage/cpu.rs @@ -3,7 +3,7 @@ //! The `Stage` object contains a slab buffer and a render pipeline. //! It is used to stage [`Renderlet`]s for rendering. use core::sync::atomic::{AtomicU32, Ordering}; -use crabslab::{Id, Slab}; +use crabslab::Id; use snafu::Snafu; use std::{ ops::Deref, @@ -14,8 +14,9 @@ use crate::{ atlas::{Atlas, AtlasError, AtlasImage, AtlasImageError, AtlasTexture}, bloom::Bloom, camera::Camera, + debug::DebugOverlay, draw::DrawCalls, - pbr::{debug::DebugMode, light::Light, PbrConfig}, + pbr::{debug::DebugChannel, light::Light, PbrConfig}, skybox::{Skybox, SkyboxRenderPipeline}, slab::*, stage::Renderlet, @@ -84,7 +85,7 @@ fn create_stage_render_pipeline( layout: Some(&layout), vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -111,7 +112,7 @@ fn create_stage_render_pipeline( }, fragment: Some(wgpu::FragmentState { module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, + entry_point: Some(fragment_linkage.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba16Float, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -154,10 +155,12 @@ pub struct Stage { pub(crate) bloom: Bloom, pub(crate) skybox: Arc>, pub(crate) tonemapping: Tonemapping, + pub(crate) debug_overlay: DebugOverlay, pub(crate) background_color: Arc>, pub(crate) has_skybox: Arc, pub(crate) has_bloom: Arc, + pub(crate) has_debug_overlay: Arc, pub(crate) skybox_bindgroup: Arc>>>, pub(crate) buffers_bindgroup: Arc>>>, @@ -230,7 +233,14 @@ impl Stage { has_bloom: AtomicBool::from(true).into(), buffers_bindgroup: Default::default(), textures_bindgroup: Default::default(), - draw_calls: Arc::new(RwLock::new(DrawCalls::new(ctx, true))), + draw_calls: Arc::new(RwLock::new(DrawCalls::new( + ctx, + true, + UVec2::new(w, h), + multisample_count, + ))), + debug_overlay: DebugOverlay::new(&device, ctx.get_render_target().format()), + has_debug_overlay: Arc::new(false.into()), hdr_texture, depth_texture, msaa_render_target, @@ -336,16 +346,60 @@ impl Stage { } /// Set the debug mode. - pub fn set_debug_mode(&self, debug_mode: DebugMode) { - self.pbr_config.modify(|cfg| cfg.debug_mode = debug_mode); + pub fn set_debug_mode(&self, debug_mode: DebugChannel) { + self.pbr_config.modify(|cfg| cfg.debug_channel = debug_mode); } /// Set the debug mode. - pub fn with_debug_mode(self, debug_mode: DebugMode) -> Self { + pub fn with_debug_mode(self, debug_mode: DebugChannel) -> Self { self.set_debug_mode(debug_mode); self } + /// Set whether to render the debug overlay. + pub fn set_use_debug_overlay(&self, use_debug_overlay: bool) { + self.has_debug_overlay + .store(use_debug_overlay, std::sync::atomic::Ordering::Relaxed); + } + + /// Set whether to render the debug overlay. + pub fn with_debug_overlay(self, use_debug_overlay: bool) -> Self { + self.set_use_debug_overlay(use_debug_overlay); + self + } + + /// Set whether to use frustum culling on GPU before drawing. + /// + /// This defaults to `true`. + pub fn set_use_frustum_culling(&self, use_frustum_culling: bool) { + self.pbr_config + .modify(|cfg| cfg.perform_frustum_culling = use_frustum_culling); + } + + /// Set whether to render the debug overlay. + pub fn with_frustum_culling(self, use_frustum_culling: bool) -> Self { + self.set_use_frustum_culling(use_frustum_culling); + self + } + + /// Set whether to use occlusion culling on GPU before drawing. + /// + /// This defaults to `false`. + /// + /// ## Warning + /// + /// Occlusion culling is a feature in development. YMMV. + pub fn set_use_occlusion_culling(&self, use_occlusion_culling: bool) { + self.pbr_config + .modify(|cfg| cfg.perform_occlusion_culling = use_occlusion_culling); + } + + /// Set whether to render the debug overlay. + pub fn with_occlusion_culling(self, use_occlusion_culling: bool) -> Self { + self.set_use_occlusion_culling(use_occlusion_culling); + self + } + /// Set whether the stage uses lighting. pub fn set_has_lighting(&self, use_lighting: bool) { self.pbr_config @@ -665,6 +719,13 @@ impl Stage { guard.reorder_renderlets(order); } + /// Iterator over all staged [`Renderlet`]s. + pub fn renderlets_iter(&self) -> impl Iterator { + // UNWRAP: panic on purpose + let guard = self.draw_calls.read().unwrap(); + guard.renderlets_iter() + } + /// Returns a clone of the current depth texture. pub fn get_depth_texture(&self) -> DepthTexture { DepthTexture { @@ -728,7 +789,11 @@ impl Stage { pub fn render(&self, view: &wgpu::TextureView) { let slab_buffer = self.tick_internal(); let mut draw_calls = self.draw_calls.write().unwrap(); - draw_calls.pre_draw(&self.device, &self.queue, &slab_buffer); + let depth_texture = self.depth_texture.read().unwrap(); + // UNWRAP: safe because we know the depth texture format will always match + let maybe_indirect_buffer = draw_calls + .pre_draw(&self.device, &self.queue, &slab_buffer, &depth_texture) + .unwrap(); { let label = Some("stage render"); // UNWRAP: POP @@ -753,24 +818,24 @@ impl Stage { .create_command_encoder(&wgpu::CommandEncoderDescriptor { label }); { let hdr_texture = self.hdr_texture.read().unwrap(); - let depth_texture = self.depth_texture.read().unwrap(); - let ops = wgpu::Operations { + + let mk_ops = |store| wgpu::Operations { load: if clear_colors { wgpu::LoadOp::Clear(background_color) } else { wgpu::LoadOp::Load }, - store: wgpu::StoreOp::Store, + store, }; let color_attachment = if let Some(msaa_view) = msaa_target.as_ref() { wgpu::RenderPassColorAttachment { - ops, + ops: mk_ops(wgpu::StoreOp::Discard), view: msaa_view, resolve_target: Some(&hdr_texture.view), } } else { wgpu::RenderPassColorAttachment { - ops, + ops: mk_ops(wgpu::StoreOp::Store), view: &hdr_texture.view, resolve_target: None, } @@ -794,16 +859,15 @@ impl Stage { }); render_pass.set_pipeline(&pipeline); - render_pass.set_bind_group(0, &slab_buffers_bindgroup, &[]); - render_pass.set_bind_group(1, &textures_bindgroup, &[]); - + render_pass.set_bind_group(0, Some(slab_buffers_bindgroup.as_ref()), &[]); + render_pass.set_bind_group(1, Some(textures_bindgroup.as_ref()), &[]); draw_calls.draw(&mut render_pass); if let Some((pipeline, bindgroup)) = may_skybox_pipeline_and_bindgroup.as_ref() { // UNWRAP: if we can't acquire the lock we want to panic. let skybox = self.skybox.read().unwrap(); render_pass.set_pipeline(&pipeline.pipeline); - render_pass.set_bind_group(0, bindgroup, &[]); + render_pass.set_bind_group(0, Some(bindgroup.as_ref()), &[]); render_pass.draw(0..36, skybox.camera.inner()..skybox.camera.inner() + 1); } } @@ -843,8 +907,19 @@ impl Stage { self.queue.submit(std::iter::once(encoder.finish())); } - // then render tonemapping self.tonemapping.render(&self.device, &self.queue, view); + + if self.has_debug_overlay.load(Ordering::Relaxed) { + if let Some(indirect_draw_buffer) = maybe_indirect_buffer { + self.debug_overlay.render( + &self.device, + &self.queue, + view, + &slab_buffer, + &indirect_draw_buffer, + ); + } + } } } diff --git a/crates/renderling/src/stage/gltf_support.rs b/crates/renderling/src/stage/gltf_support.rs index 21a9beb0..0de9bc3b 100644 --- a/crates/renderling/src/stage/gltf_support.rs +++ b/crates/renderling/src/stage/gltf_support.rs @@ -508,9 +508,14 @@ impl GltfPrimitive { let vs = uv1s.zip(vs); let vs = uv0s.into_iter().zip(vs); let vs = positions.into_iter().zip(vs); + + let mut min = Vec3::splat(f32::INFINITY); + let mut max = Vec3::splat(f32::NEG_INFINITY); let vertices = vs .map( |(position, (uv0, (uv1, (normal, (tangent, (color, (joints, weights)))))))| { + min = min.min(position); + max = max.max(position); Vertex { position, color, @@ -528,17 +533,27 @@ impl GltfPrimitive { log::debug!("{} vertices, {:?}", vertices.len(), vertices.array()); let indices = stage.new_array(indices); log::debug!("{} indices, {:?}", indices.len(), indices.array()); - let gltf::mesh::Bounds { min, max } = primitive.bounding_box(); - let min = Vec3::from_array(min); - let max = Vec3::from_array(max); + let (bbmin, bbmax) = { + let gltf::mesh::Bounds { min, max } = primitive.bounding_box(); + (Vec3::from_array(min), Vec3::from_array(max)) + }; + if bbmin != min { + log::warn!("gltf supplied bounding box min ({bbmin:?}) doesn't match seen ({min:?})"); + } + if bbmax != max { + log::warn!("gltf supplied bounding box max ({bbmax:?}) doesn't match seen ({max:?})"); + } + let bounding_box = (min, max); + + log::info!("primitive '{}' bounds: {bounding_box:?}", primitive.index()); Self { vertices, indices, material, - bounding_box: (min, max), morph_targets, morph_targets_array, + bounding_box, } } } @@ -1408,9 +1423,7 @@ mod test { v.renderlet_id, v.vertex_index, slab, - &mut v.out_camera, - &mut v.out_material, - &mut v.out_pbr_config, + &mut v.renderlet_id, &mut v.out_color, &mut v.out_uv0, &mut v.out_uv1, diff --git a/crates/renderling/src/texture.rs b/crates/renderling/src/texture.rs index c08b843c..8f254799 100644 --- a/crates/renderling/src/texture.rs +++ b/crates/renderling/src/texture.rs @@ -6,10 +6,13 @@ use image::{ load_from_memory, ColorType, DynamicImage, GenericImage, GenericImageView, ImageBuffer, ImageError, PixelWithColorType, Rgba32FImage, }; +use mips::MipMapGenerator; use snafu::prelude::*; use crate::atlas::{AtlasImage, AtlasImageFormat}; +pub mod mips; + #[derive(Debug, Snafu)] /// Enumeration of errors produced by [`Texture`]. pub enum TextureError { @@ -611,146 +614,12 @@ impl Texture { &mut self, device: &wgpu::Device, queue: &wgpu::Queue, - label: Option<&str>, + _label: Option<&str>, mip_levels: u32, ) -> Vec { - let mip_levels = 1.max(mip_levels); - let (color_channels, subpixel_bytes) = - wgpu_texture_format_channels_and_subpixel_bytes(self.texture.format()); - - let bg_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label, - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - sample_type: wgpu::TextureSampleType::Float { filterable: true }, - view_dimension: wgpu::TextureViewDimension::D2, - multisampled: false, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 1, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), - count: None, - }, - ], - }); - let pp_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label, - bind_group_layouts: &[&bg_layout], - push_constant_ranges: &[], - }); - let vertex_linkage = crate::linkage::generate_mipmap_vertex::linkage(device); - let fragment_linkage = crate::linkage::generate_mipmap_fragment::linkage(device); - let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label, - layout: Some(&pp_layout), - vertex: wgpu::VertexState { - module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, - buffers: &[], - compilation_options: Default::default(), - }, - primitive: wgpu::PrimitiveState { - topology: wgpu::PrimitiveTopology::TriangleList, - front_face: wgpu::FrontFace::Cw, - polygon_mode: wgpu::PolygonMode::Fill, - ..Default::default() - }, - fragment: Some(wgpu::FragmentState { - module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, - targets: &[Some(wgpu::ColorTargetState { - format: self.texture.format(), - blend: None, - write_mask: wgpu::ColorWrites::all(), - })], - compilation_options: Default::default(), - }), - depth_stencil: None, - multisample: wgpu::MultisampleState::default(), - multiview: None, - cache: None, - }); - let size = self.texture.size(); - let mut mips: Vec = vec![]; - - for mip_level in 1..mip_levels { - let mip_width = size.width >> mip_level; - let mip_height = size.height >> mip_level; - let mip_texture = Self::new_with( - device, - queue, - Some(&format!("mip{mip_level}")), - Some( - wgpu::TextureUsages::COPY_SRC - | wgpu::TextureUsages::RENDER_ATTACHMENT - | wgpu::TextureUsages::TEXTURE_BINDING, - ), - None, - self.texture.format(), - color_channels, - subpixel_bytes, - mip_width, - mip_height, - 1, - &[], - ); - let prev_texture = if mip_level == 1 { - // This is not a needless borrow as without it the compiler - // thinks `self` has been moved - #[allow(clippy::needless_borrow)] - &self - } else { - &mips[(mip_level - 2) as usize] - }; - let bindgroup = device.create_bind_group(&wgpu::BindGroupDescriptor { - label, - layout: &bg_layout, - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: wgpu::BindingResource::TextureView(&prev_texture.view), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::Sampler(&prev_texture.sampler), - }, - ], - }); - - let mut encoder = - device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default()); - - { - let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { - label: Some(&format!("mip{mip_level}")), - color_attachments: &[Some(wgpu::RenderPassColorAttachment { - view: &mip_texture.view, - resolve_target: None, - ops: wgpu::Operations { - load: wgpu::LoadOp::Clear(wgpu::Color::WHITE), - store: wgpu::StoreOp::Store, - }, - })], - depth_stencil_attachment: None, - ..Default::default() - }); - - render_pass.set_pipeline(&pipeline); - render_pass.set_bind_group(0, &bindgroup, &[]); - render_pass.draw(0..6, 0..1); - } - - queue.submit(std::iter::once(encoder.finish())); - - mips.push(mip_texture); - } - mips + let generator = MipMapGenerator::new(device, self.texture.format()); + // UNWRAP: safe because we know the formats match. + generator.generate(device, queue, self, mip_levels).unwrap() } pub const HDR_TEXTURE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba16Float; diff --git a/crates/renderling/src/texture/mips.rs b/crates/renderling/src/texture/mips.rs new file mode 100644 index 00000000..5ab552d4 --- /dev/null +++ b/crates/renderling/src/texture/mips.rs @@ -0,0 +1,196 @@ +//! Mip-map generation. + +use crate::texture::Texture; +use snafu::Snafu; + +use super::wgpu_texture_format_channels_and_subpixel_bytes; + +const LABEL: Option<&str> = Some("mip-map-generator"); + +#[derive(Debug, Snafu)] +pub enum MipMapError { + #[snafu(display("Texture format does not match, expected '{expected:?}' but saw '{seen:?}'"))] + TextureMismatch { + expected: wgpu::TextureFormat, + seen: wgpu::TextureFormat, + }, +} + +fn create_pipeline( + device: &wgpu::Device, + format: wgpu::TextureFormat, + pp_layout: &wgpu::PipelineLayout, +) -> wgpu::RenderPipeline { + let vertex_linkage = crate::linkage::generate_mipmap_vertex::linkage(device); + let fragment_linkage = crate::linkage::generate_mipmap_fragment::linkage(device); + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: LABEL, + layout: Some(pp_layout), + vertex: wgpu::VertexState { + module: &vertex_linkage.module, + entry_point: Some(vertex_linkage.entry_point), + buffers: &[], + compilation_options: Default::default(), + }, + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleList, + front_face: wgpu::FrontFace::Cw, + polygon_mode: wgpu::PolygonMode::Fill, + ..Default::default() + }, + fragment: Some(wgpu::FragmentState { + module: &fragment_linkage.module, + entry_point: Some(fragment_linkage.entry_point), + targets: &[Some(wgpu::ColorTargetState { + format, + blend: None, + write_mask: wgpu::ColorWrites::all(), + })], + compilation_options: Default::default(), + }), + depth_stencil: None, + multisample: wgpu::MultisampleState::default(), + multiview: None, + cache: None, + }) +} + +pub struct MipMapGenerator { + format: wgpu::TextureFormat, + pipeline: wgpu::RenderPipeline, + bindgroup_layout: wgpu::BindGroupLayout, +} + +impl MipMapGenerator { + pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { + let bg_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: LABEL, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count: None, + }, + ], + }); + let pp_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: LABEL, + bind_group_layouts: &[&bg_layout], + push_constant_ranges: &[], + }); + let pipeline = create_pipeline(device, format, &pp_layout); + Self { + format, + pipeline, + bindgroup_layout: bg_layout, + } + } + + /// Generate mip maps. + /// + /// # Errs + /// Errors if the texture's format doesn't match the generator format. + pub fn generate( + &self, + device: &wgpu::Device, + queue: &wgpu::Queue, + texture: &Texture, + mip_levels: u32, + ) -> Result, MipMapError> { + snafu::ensure!( + texture.texture.format() == self.format, + TextureMismatchSnafu { + expected: self.format, + seen: texture.texture.format() + } + ); + + let mip_levels = 1.max(mip_levels); + let (color_channels, subpixel_bytes) = + wgpu_texture_format_channels_and_subpixel_bytes(self.format); + + let size = texture.texture.size(); + let mut mips: Vec = vec![]; + + for mip_level in 1..mip_levels { + let mip_width = size.width >> mip_level; + let mip_height = size.height >> mip_level; + let mip_texture = Texture::new_with( + device, + queue, + Some(&format!("mip{mip_level}")), + Some( + wgpu::TextureUsages::COPY_SRC + | wgpu::TextureUsages::RENDER_ATTACHMENT + | wgpu::TextureUsages::TEXTURE_BINDING, + ), + None, + self.format, + color_channels, + subpixel_bytes, + mip_width, + mip_height, + 1, + &[], + ); + let prev_texture = if mip_level == 1 { + texture + } else { + &mips[(mip_level - 2) as usize] + }; + let bindgroup = device.create_bind_group(&wgpu::BindGroupDescriptor { + label: LABEL, + layout: &self.bindgroup_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::TextureView(&prev_texture.view), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::Sampler(&prev_texture.sampler), + }, + ], + }); + + let mut encoder = + device.create_command_encoder(&wgpu::CommandEncoderDescriptor::default()); + + { + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some(&format!("mip{mip_level}")), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &mip_texture.view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color::WHITE), + store: wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment: None, + ..Default::default() + }); + + render_pass.set_pipeline(&self.pipeline); + render_pass.set_bind_group(0, Some(&bindgroup), &[]); + render_pass.draw(0..6, 0..1); + } + + queue.submit(std::iter::once(encoder.finish())); + + mips.push(mip_texture); + } + Ok(mips) + } +} diff --git a/crates/renderling/src/tonemapping.rs b/crates/renderling/src/tonemapping.rs index e0fde064..96fd63e7 100644 --- a/crates/renderling/src/tonemapping.rs +++ b/crates/renderling/src/tonemapping.rs @@ -141,7 +141,6 @@ const QUAD_2D_POINTS: [(Vec2, Vec2); 6] = { [tl, bl, br, tl, br, tr] }; -#[cfg(feature = "tonemapping_vertex")] #[spirv(vertex)] pub fn tonemapping_vertex( #[spirv(vertex_index)] vertex_id: u32, @@ -153,7 +152,6 @@ pub fn tonemapping_vertex( *gl_pos = pos.extend(0.0).extend(1.0); } -#[cfg(feature = "tonemapping_fragment")] #[spirv(fragment)] pub fn tonemapping_fragment( #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32], diff --git a/crates/renderling/src/tonemapping/cpu.rs b/crates/renderling/src/tonemapping/cpu.rs index ff159dfe..fc25d5ae 100644 --- a/crates/renderling/src/tonemapping/cpu.rs +++ b/crates/renderling/src/tonemapping/cpu.rs @@ -1,4 +1,5 @@ //! Tonemapping. +use core::ops::Deref; use std::sync::{Arc, RwLock}; use crate::{ @@ -126,7 +127,7 @@ impl Tonemapping { layout: Some(&layout), vertex: wgpu::VertexState { module: &vertex_linkage.module, - entry_point: vertex_linkage.entry_point, + entry_point: Some(vertex_linkage.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -142,7 +143,7 @@ impl Tonemapping { depth_stencil: None, fragment: Some(wgpu::FragmentState { module: &fragment_linkage.module, - entry_point: fragment_linkage.entry_point, + entry_point: Some(fragment_linkage.entry_point), targets: &[Some(wgpu::ColorTargetState { format: frame_texture_format, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -206,7 +207,7 @@ impl Tonemapping { ..Default::default() }); render_pass.set_pipeline(&self.pipeline); - render_pass.set_bind_group(0, &bindgroup, &[]); + render_pass.set_bind_group(0, Some(bindgroup.deref()), &[]); let id = self.config.id().into(); render_pass.draw(0..6, id..id + 1); drop(render_pass); diff --git a/crates/renderling/src/transform.rs b/crates/renderling/src/transform.rs index a18e36a7..5d328e1d 100644 --- a/crates/renderling/src/transform.rs +++ b/crates/renderling/src/transform.rs @@ -17,11 +17,7 @@ pub struct Transform { impl Default for Transform { fn default() -> Self { - Self { - translation: Vec3::ZERO, - rotation: Quat::IDENTITY, - scale: Vec3::ONE, - } + Self::IDENTITY } } @@ -48,6 +44,14 @@ impl From for Mat4 { } } +impl Transform { + pub const IDENTITY: Self = Transform { + translation: Vec3::ZERO, + rotation: Quat::IDENTITY, + scale: Vec3::ONE, + }; +} + #[cfg(test)] mod test { use super::*; diff --git a/crates/renderling/src/tutorial.rs b/crates/renderling/src/tutorial.rs index 041609f5..ba3498f2 100644 --- a/crates/renderling/src/tutorial.rs +++ b/crates/renderling/src/tutorial.rs @@ -5,7 +5,6 @@ use spirv_std::spirv; use crate::stage::{Renderlet, Vertex}; -#[cfg(feature = "tutorial_passthru_fragment")] /// Simple fragment shader that writes the input color to the output color. #[spirv(fragment)] pub fn tutorial_passthru_fragment(in_color: Vec4, output: &mut Vec4) { @@ -20,7 +19,6 @@ fn implicit_isosceles_triangle(vertex_index: u32) -> Vec4 { Vec4::new(x, y, 0.0, 1.0) } -#[cfg(feature = "tutorial_implicit_isosceles_vertex")] /// Simple vertex shader with an implicit isosceles triangle. #[spirv(vertex)] pub fn tutorial_implicit_isosceles_vertex( @@ -36,7 +34,6 @@ pub fn tutorial_implicit_isosceles_vertex( *clip_pos = pos; } -#[cfg(feature = "tutorial_slabbed_vertices_no_instance")] /// This shader uses the vertex index as a slab [`Id`]. The [`Id`] is used to /// read the vertex from the slab. The vertex's position and color are written /// to the output. @@ -56,7 +53,6 @@ pub fn tutorial_slabbed_vertices_no_instance( *out_color = vertex.color; } -#[cfg(feature = "tutorial_slabbed_vertices")] /// This shader uses the `instance_index` as a slab [`Id`]. /// The `instance_index` is the [`Id`] of an [`Array`] of [`Vertex`]s. The /// `vertex_index` is the index of a [`Vertex`] within the [`Array`]. @@ -79,7 +75,6 @@ pub fn tutorial_slabbed_vertices( *out_color = vertex.color; } -#[cfg(feature = "tutorial_slabbed_renderlet")] /// This shader uses the `instance_index` as a slab [`Id`]. /// The `instance_index` is the [`Id`] of a [`Renderlet`]. /// The [`Renderlet`] contains an [`Array`] of [`Vertex`]s @@ -135,7 +130,7 @@ mod test { layout: None, vertex: wgpu::VertexState { module: &vertex.module, - entry_point: vertex.entry_point, + entry_point: Some(vertex.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -162,7 +157,7 @@ mod test { }, fragment: Some(wgpu::FragmentState { module: &fragment.module, - entry_point: fragment.entry_point, + entry_point: Some(fragment.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba8UnormSrgb, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -264,7 +259,7 @@ mod test { layout: Some(&pipeline_layout), vertex: wgpu::VertexState { module: &vertex.module, - entry_point: vertex.entry_point, + entry_point: Some(vertex.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -291,7 +286,7 @@ mod test { }, fragment: Some(wgpu::FragmentState { module: &fragment.module, - entry_point: fragment.entry_point, + entry_point: Some(fragment.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba8UnormSrgb, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -342,13 +337,13 @@ mod test { ..Default::default() }); render_pass.set_pipeline(&pipeline); - render_pass.set_bind_group(0, &bindgroup, &[]); + render_pass.set_bind_group(0, Some(&bindgroup), &[]); render_pass.draw(0..vertices.len() as u32, 0..1); } queue.submit(std::iter::once(encoder.finish())); // assert that we're reading the data correctly - let data = futures_lite::future::block_on(slab.read(&device, &queue, None, ..)).unwrap(); + let data = futures_lite::future::block_on(slab.read(&ctx, None, ..)).unwrap(); let mut vertices = vec![]; for i in 0..3 { let mut out_color = Vec4::ONE; @@ -437,7 +432,7 @@ mod test { layout: Some(&pipeline_layout), vertex: wgpu::VertexState { module: &vertex.module, - entry_point: vertex.entry_point, + entry_point: Some(vertex.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -464,7 +459,7 @@ mod test { }, fragment: Some(wgpu::FragmentState { module: &fragment.module, - entry_point: fragment.entry_point, + entry_point: Some(fragment.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba8UnormSrgb, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -515,7 +510,7 @@ mod test { ..Default::default() }); render_pass.set_pipeline(&pipeline); - render_pass.set_bind_group(0, &bindgroup, &[]); + render_pass.set_bind_group(0, Some(&bindgroup), &[]); render_pass.draw( 0..vertices.len() as u32, vertices_array.id().inner()..vertices_array.id().inner() + 1, @@ -609,7 +604,7 @@ mod test { layout: Some(&pipeline_layout), vertex: wgpu::VertexState { module: &vertex.module, - entry_point: vertex.entry_point, + entry_point: Some(vertex.entry_point), buffers: &[], compilation_options: Default::default(), }, @@ -636,7 +631,7 @@ mod test { }, fragment: Some(wgpu::FragmentState { module: &fragment.module, - entry_point: fragment.entry_point, + entry_point: Some(fragment.entry_point), targets: &[Some(wgpu::ColorTargetState { format: wgpu::TextureFormat::Rgba8UnormSrgb, blend: Some(wgpu::BlendState::ALPHA_BLENDING), @@ -687,7 +682,7 @@ mod test { ..Default::default() }); render_pass.set_pipeline(&pipeline); - render_pass.set_bind_group(0, &bindgroup, &[]); + render_pass.set_bind_group(0, Some(&bindgroup), &[]); render_pass.draw( 0..geometry.len() as u32, unit.id().inner()..unit.id().inner() + 1, diff --git a/test_img/sdf/box_sanity.png b/test_img/sdf/box_sanity.png new file mode 100644 index 00000000..a4a9a6ec Binary files /dev/null and b/test_img/sdf/box_sanity.png differ diff --git a/test_img/sdf/circle_sanity.png b/test_img/sdf/circle_sanity.png new file mode 100644 index 00000000..31cd513d Binary files /dev/null and b/test_img/sdf/circle_sanity.png differ diff --git a/test_img/ui/text/can_recreate_0.png b/test_img/ui/text/can_recreate_0.png new file mode 100644 index 00000000..f205e423 Binary files /dev/null and b/test_img/ui/text/can_recreate_0.png differ diff --git a/test_img/ui/text/can_recreate_1.png b/test_img/ui/text/can_recreate_1.png new file mode 100644 index 00000000..c8c44d5a Binary files /dev/null and b/test_img/ui/text/can_recreate_1.png differ