From 61eecac1b32cbb53980fc797b9604bc65f105c71 Mon Sep 17 00:00:00 2001 From: Schell Carl Scivally Date: Sat, 16 Nov 2024 12:05:07 +1300 Subject: [PATCH] feature: WIP occlusion culling (#137) * use WeakHybrid in InternalRenderlet * Occlusion culling, part one added MipMapGenerator, depth pyramid shaders slab buffers are created with size 1 to avoid wgpu validation bug fixed a bug where re-staging a texture often copied to the wrong layer debbugging led to better sphere projection for culling update sample count so we don't invalidate every frame debug overlay of bounding spheres use box instead of circle for bounds in debug overlay don't use compute culling by default * regenerate shaders, fix merge errors, treat *.spv and *.wgsl as binary * use cargo-gpu on branch * clean rust-gpu checkouts (temporary) * also clean the rust-gpu cache dir * allow the cache to persist * don't use bool as u32 in shaders * change rust-gpu cache step * update cargo gpu --- .cargo/config.toml | 2 +- .gitattributes | 2 + .github/workflows/push.yaml | 6 +- Cargo.lock | 781 +++-- Cargo.toml | 15 +- README.md | 67 +- crates/example-culling/src/main.rs | 8 +- crates/example/src/lib.rs | 60 +- crates/example/src/main.rs | 3 + crates/renderling-ui/Cargo.toml | 1 + crates/renderling-ui/src/lib.rs | 2 +- crates/renderling-ui/src/text.rs | 60 +- crates/renderling/Cargo.toml | 76 +- .../shaders/bloom-bloom_mix_fragment.spv | Bin 1776 -> 1796 bytes .../shaders/bloom-bloom_mix_fragment.wgsl | 19 +- .../cull-compute_copy_depth_to_pyramid.spv | Bin 0 -> 2184 bytes .../cull-compute_copy_depth_to_pyramid.wgsl | 70 + ...ute_copy_depth_to_pyramid_multisampled.spv | Bin 0 -> 2200 bytes ...te_copy_depth_to_pyramid_multisampled.wgsl | 70 + .../shaders/cull-compute_culling.spv | Bin 0 -> 26424 bytes .../shaders/cull-compute_culling.wgsl | 863 +++++ .../cull-compute_downsample_depth_pyramid.spv | Bin 0 -> 6260 bytes ...cull-compute_downsample_depth_pyramid.wgsl | 268 ++ .../shaders/cull-compute_frustum_culling.spv | Bin 18016 -> 0 bytes .../shaders/cull-compute_frustum_culling.wgsl | 667 ---- .../shaders/debug-debug_overlay_fragment.spv | Bin 0 -> 20744 bytes .../shaders/debug-debug_overlay_fragment.wgsl | 679 ++++ .../shaders/debug-debug_overlay_vertex.spv | Bin 0 -> 824 bytes .../shaders/debug-debug_overlay_vertex.wgsl | 32 + crates/renderling/shaders/manifest.json | 77 +- .../shaders/skybox-skybox_vertex.spv | Bin 9776 -> 9776 bytes .../shaders/skybox-skybox_vertex.wgsl | 106 +- .../shaders/stage-renderlet_fragment.spv | Bin 71076 -> 70028 bytes .../shaders/stage-renderlet_fragment.wgsl | 2887 ++++++++--------- .../shaders/stage-renderlet_vertex.spv | Bin 42688 -> 42508 bytes .../shaders/stage-renderlet_vertex.wgsl | 1667 +++++----- .../tonemapping-tonemapping_fragment.spv | Bin 5488 -> 5488 bytes .../tonemapping-tonemapping_fragment.wgsl | 22 +- .../tonemapping-tonemapping_vertex.spv | Bin 1180 -> 1180 bytes .../tutorial-tutorial_slabbed_renderlet.spv | Bin 19076 -> 19076 bytes .../tutorial-tutorial_slabbed_renderlet.wgsl | 8 +- .../tutorial-tutorial_slabbed_vertices.spv | Bin 5716 -> 5716 bytes crates/renderling/src/atlas/cpu.rs | 14 +- crates/renderling/src/bloom.rs | 6 +- crates/renderling/src/bloom/cpu.rs | 21 +- crates/renderling/src/bvol.rs | 120 +- crates/renderling/src/camera.rs | 13 +- crates/renderling/src/context.rs | 14 +- crates/renderling/src/convolution.rs | 8 +- crates/renderling/src/cubemap.rs | 4 +- crates/renderling/src/cull.rs | 225 +- crates/renderling/src/cull/cpu.rs | 991 +++++- crates/renderling/src/debug.rs | 74 + crates/renderling/src/debug/cpu.rs | 168 + crates/renderling/src/draw.rs | 8 +- crates/renderling/src/draw/cpu.rs | 171 +- .../renderling/src/ibl/diffuse_irradiance.rs | 4 +- .../src/ibl/prefiltered_environment.rs | 4 +- crates/renderling/src/lib.rs | 7 +- crates/renderling/src/linkage.rs | 42 +- .../linkage/compute_copy_depth_to_pyramid.rs | 40 + ...pute_copy_depth_to_pyramid_multisampled.rs | 40 + .../renderling/src/linkage/compute_culling.rs | 34 + .../compute_downsample_depth_pyramid.rs | 40 + ...m_culling.rs => debug_overlay_fragment.rs} | 12 +- .../src/linkage/debug_overlay_vertex.rs | 34 + crates/renderling/src/math.rs | 24 +- crates/renderling/src/pbr.rs | 84 +- crates/renderling/src/pbr/debug.rs | 2 +- crates/renderling/src/sdf.rs | 84 + crates/renderling/src/skybox.rs | 4 - crates/renderling/src/skybox/cpu.rs | 12 +- crates/renderling/src/slab/cpu.rs | 88 +- crates/renderling/src/stage.rs | 29 +- crates/renderling/src/stage/cpu.rs | 113 +- crates/renderling/src/stage/gltf_support.rs | 27 +- crates/renderling/src/texture.rs | 145 +- crates/renderling/src/texture/mips.rs | 196 ++ crates/renderling/src/tonemapping.rs | 2 - crates/renderling/src/tonemapping/cpu.rs | 7 +- crates/renderling/src/transform.rs | 14 +- crates/renderling/src/tutorial.rs | 29 +- test_img/sdf/box_sanity.png | Bin 0 -> 686 bytes test_img/sdf/circle_sanity.png | Bin 0 -> 832 bytes test_img/ui/text/can_recreate_0.png | Bin 0 -> 1952 bytes test_img/ui/text/can_recreate_1.png | Bin 0 -> 874 bytes 86 files changed, 7419 insertions(+), 4053 deletions(-) create mode 100644 .gitattributes create mode 100644 crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv create mode 100644 crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl create mode 100644 crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv create mode 100644 crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl create mode 100644 crates/renderling/shaders/cull-compute_culling.spv create mode 100644 crates/renderling/shaders/cull-compute_culling.wgsl create mode 100644 crates/renderling/shaders/cull-compute_downsample_depth_pyramid.spv create mode 100644 crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl delete mode 100644 crates/renderling/shaders/cull-compute_frustum_culling.spv delete mode 100644 crates/renderling/shaders/cull-compute_frustum_culling.wgsl create mode 100644 crates/renderling/shaders/debug-debug_overlay_fragment.spv create mode 100644 crates/renderling/shaders/debug-debug_overlay_fragment.wgsl create mode 100644 crates/renderling/shaders/debug-debug_overlay_vertex.spv create mode 100644 crates/renderling/shaders/debug-debug_overlay_vertex.wgsl create mode 100644 crates/renderling/src/debug.rs create mode 100644 crates/renderling/src/debug/cpu.rs create mode 100644 crates/renderling/src/linkage/compute_copy_depth_to_pyramid.rs create mode 100644 crates/renderling/src/linkage/compute_copy_depth_to_pyramid_multisampled.rs create mode 100644 crates/renderling/src/linkage/compute_culling.rs create mode 100644 crates/renderling/src/linkage/compute_downsample_depth_pyramid.rs rename crates/renderling/src/linkage/{compute_frustum_culling.rs => debug_overlay_fragment.rs} (66%) create mode 100644 crates/renderling/src/linkage/debug_overlay_vertex.rs create mode 100644 crates/renderling/src/sdf.rs create mode 100644 crates/renderling/src/texture/mips.rs create mode 100644 test_img/sdf/box_sanity.png create mode 100644 test_img/sdf/circle_sanity.png create mode 100644 test_img/ui/text/can_recreate_0.png create mode 100644 test_img/ui/text/can_recreate_1.png 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 a04b917bf09495398058e293c6743db359f9f41e..f15f4459dddac2b50834d9780a8603e7cb1b2820 100644 GIT binary patch literal 1796 zcmYk5Sxc2s6o$9wI3$TS*raLaWM*nflvWrOL2;C7_@{rx%~jK3rOOvO=s7^UbXT z^`HT40gYfA-Rz;SLdQ0=Ip$Z0wWIAZLbbNiRaIHs*j`|*c6l>aN#q&Gv(vng>mcbFVDxlo3!gL;``wxpp@Vp z=o+AZH(ksvfjz_ypyh?gOOd;awPmz(OJFBi&Mo8VLTk6;JB03!bGxw>xqT03>_6|x z`0EQD^zi-MsT14xk~{MVx(Vpp$IJJk?NtNZGl^WWrmt#dxou?iNB`02Py86%I?sJJ z&a$WTq_bNblJvz-La7(|=r&gr~E*ygsAdm8Po_VLdBPK?Rj!#h>v?(4lODeiZm zq`2>_$jfNo*_u;)0p7j672o0)XTFTSM9lpvAl=nD>OJoW@N9B(Mu9tirN(o<1lD<` zpG=jr8&eC3uv)*8*x^J=9Dn9!g`%S*Rtg}AP_5WZi=dT0n?CqVK>mFCo zihGzd2Cf48XVe^gB=lliY*f!~5tnZwg-t{Q>CrJtpuu;}+1bB;RdpeZF(@O-7&ROgl_r z`|Zfx;UlO6X@^hIXI|RjGq(Qx4tL=Cl{D`zw!Zuh_oB}o*5dy6v3r1bwH|#l*!Il( zX5seC`{v;G)Yrrp>3uu^8{h=+ZtOn;QhXje#l0uv_D=DIT--Y|?woPnw1i#+&ajWU Q?tY$^YeXCS%Zbl`e_tSU7XSbN literal 1776 zcmYk5TT7Ht6o$7m9+E^m*h$l7nljUnD3dTM0%@eI6wA(tW<}5>lovrlruWrVbzy&@ zi~dnRB050O^L(@S_-%M+o!_)NI52{R`*ouB8wZ_53E%$H)3`BaL%?zf5R?jGjw8G z>paGsMce*z$(igtmtVqo%Gb`v-NAT$kLGNreB5tg+&cNS^KrjTnspEHUhER^l&}vX zn}Ghku=HjA5cUzXPP+iK4@KKqtSuq!tA96HWn>wT{nfkiRglBv%6|lSwB+JbrWEi7{>G@SA$Ho!9T`NpatS zC&j&Ik9G;^JzF!z3n(My_IMY+*?9svLCpCsgY>P=Q}4c2;BMOHOaf>8MvZ&E0oJ+G zFFLIwJ%7nJwhG<>d#SI-UT@J;-S^0~hEINDf5?~1I_vYc{+~=`{|&GPl{~* z9_KLUDwqQDsbAtBO-Nxtt=wtMIA2ayuF&q7ehVN$ddCw{DR`j`Nnqdyz zx07c0gzno(GkiwZXI`4&3%dUN40o{gds4r<==$1VE*ogDrN4MTRlJ5b!_3n{; z57Di6j}Bg+yDxxE;GN6k_m(Hc7tvE(PUCW>_@i80e&g~_bANvCC14ME%pCw1xF!Ej K#{RM0S@0h#wQ+X< 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 0000000000000000000000000000000000000000..f5540eb64c4a9467a865f702985ef0b184746de8 GIT binary patch literal 2184 zcmZ9MOK;6#5QpDZwGpCPttwilMA4QIS`FK{BQ#HDghq!vvqMC@z`At8i? zg-ejGtlf%*4OU3n4crBt7aGEPIPPD1%i zQ%VcdoRZ%E_596+Yacl~HrC%iQaD{aJAN!bQYcR3M~@Z9kLSk=`QpTxqo+@dk|C9% zYv7AgZI(Bs9I|Adp;VLBz-uA>hKT5d8#~NxV$bR_E9n|D{J+k8>dJX)N_;-@3dnoR z*#UV%UR4%LvOQ{#x|GA-O#E8p9OPL-o$KH^s0G`4xUzRI=B6%q2R_|!aTB^8cz2d( z1K87skNumwJ?mXLhu=o{0>~Le+!nBXbm42hUP#|QxW48I-)-P3s2#gA(^hHUf&7Z8^t;HdQwxd)M-LiVlAS-Zb$ zklo8XwfVcziL6dvcfxPOoc^9nLfSn~vU;C`-K~4j1NP4SD&V8uefG`6cN2Q|*4?qU zZCNgR)3zDvgX~3ofji8%6&!Js*}c8!yhoceFqd)0SIX*R?%Tn}ncKPRYaK7a9_!HO z75Ft|K5^{p8*qFl-W~fog, +} + +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 0000000000000000000000000000000000000000..26d47eaf4ddac461ea45d4b1a2e095d1741d89c3 GIT binary patch literal 2200 zcmZ9MTW^g~5QdjhA_Q%<&b6zlLt8@7($Z*1>XbPAfgNd^IP9i7v=)wA_m7rJU0wadL*>zt!D9b#`E+q$usm|KI5J!;pFVkH=-5DUXtXqP z?9`E=a%phDB2|cWrXlmv^lYD$3fPKu`-rxnrz7(E$XJOscQ?C>UCooK;;YT@|32&K zo2)afqGw?*Mcl`lO^7S(6_aMgwpZiPmv+SK$zO$CKwJ&_e$dqg^e$rde+jWq*LEs7?`6cAy}V%WU<{FCO+}u$R}f>ty9y4T_Y}Nq zU}M3%k>h#y!Mh1I7QEXzo^uE94t`_7yPM;A9>KeZ-`L}9)*52&;k`e|e6{$T!&vz0 z!S<~0P{wNjdoHdU_}bA6@aeb4cWz}V+VzX`F}4s{f_UcQsI>@eE!4kSi!t=O_fPoN zGSB?Ht^aG9QQ3bP*gR|d&B(o&_0|YB?t8blakR_cjNJ!6K-@#@9^;vb01@#fwjytKX2=gbKe3s z&)S~5T>E$icG-uV=inEJ^~CXBUxMR1aqoDqukaf?oAvt|Y}{`ta^HX>*LdVkfQ@-a z{tvuEtT%x;hrQW{{p4-^&SlPf#5{ZTe?)G)gAZWiuJC;X>x265+xZ0cd-5*NXLEc8 z`&Nv_Y+u0oeMfPxd%*gw>vffBk7UVC5n$5QW literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ad8275030e86495628bb350d8b1dbfd63296404d GIT binary patch literal 26424 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 kwf>iz|CPmjae4or&c^%ya<0C(zQ1Raw|, +} + +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 0000000000000000000000000000000000000000..adc86d7e140a28cdc9f612e21c76617256209ec1 GIT binary patch literal 6260 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 literal 0 HcmV?d00001 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 eddf5824ca59a716b264bdf8cf51edeb9ddf4698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18016 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 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 0000000000000000000000000000000000000000..43151e3ad104393a30aa72812708aabfea6607e3 GIT binary patch literal 20744 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6e631c962e92435e37bf9308e8787334851abfbe GIT binary patch literal 824 zcmZvZNlHUe5JgLqsIf_m(Zp_$*mq-*hz6XvjG!2t2!g2S%&EI^2d>3c*dch%OFpRh zpnko3tLj$0`nkd7;V2A5L^-zjdMYs(GWwV4h*IPd@3$P|>2Cb2dwO%;Y9-gXyzO3H zoZNSC*WEiRBUK$oJ__82ut`j8Yz(uXSY5Ga25fFaz-fSo@%EFikv)?5h&r(%cX2*( z`548kCtszLx=k3T_P*WMpWv?EBG~!Nm$P39Z%_GYG|Kp_&Nq0(_N^rJ(9ZBw4?kzP znsBstP_zf@40AMN)@QMqKK?IO>&MLhTUUp(=69@^=AVVPr`l?0=F9okIlOOmwtcX7 z|Bw3?XZv)gyC}LtV;*<%5Qj zG1kNuG5^aGod017lb5r{3f}X9o-y$%W*_}K-Z{j^j?nSVYnc7iau(mej>$WV?-l>7 KSLch@?_u8%3@Z2l literal 0 HcmV?d00001 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 cc307f64b97a2767fbb380054788838081081a1e..55c9e1976087037edc75babd040197b7db96fa69 100644 GIT binary patch literal 9776 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 literal 9776 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 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 1cd8a79d9042fe9598e5f13e18f0aea3a8f46910..2e3dd7e38650819ca22e85ff4eade0321ee9f9d3 100644 GIT binary patch literal 70028 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 literal 71076 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 ptShvvmFI=e5RX1<4S#EPwOao@T{y, 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 23ffd2d9837afbdb44620b65eb9c74867cce040e..0f24ad1fa0ecd2b2254ac73abf1f13685a558381 100644 GIT binary patch literal 42508 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 literal 42688 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

x%eLAO@ww-0(fP6}4PxYl=ausV3t)z{w@J~e&o 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, } -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 c13cc9f5b403bcf57e4dc814ac9ed5b1fd464676..98edd89b210d4952afc397870b246c75b9281a4c 100644 GIT binary patch literal 5488 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 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 a43d96cad34aa2295c5c29c5ba40539b6a066130..7ad1855206afa3f26ab9b223ec7a232020323e5a 100644 GIT binary patch delta 182 zcmbQkIfrvY4wI+?0|Ns)5OV^t4g)I#FOXK8+{h$ss{~>Ju{4s5GLS6`#URxjK(-1H zgTy6(7-oX%L-|r*F;1|(8bCJ4HjqgmJs>uSR-dfOtjwq| P*^}9sQDbv2Ge08$_&yEx delta 182 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�R_`oyB!GwRln>oXbbx@*r&BTh~BjAN`bp3{qN&!}5x^ch9B zXVk4T`VmF9XVk4TH5~=ErrI;Jh*Oh2;~49V=Lto(XVk4T`s||HGwRkEeNNHs8FlMS z&zuOhXX>-`Bx3p6GiNkh?U}RS>>0K6%sF6trgG=O*)x^90M4F~ORX1zvlsS^b(kai zMMbw~)Xf+D;-cF#>gJAqNzv^Yb?eCWxeV;OYtLLyoSN(z$5>}PZz#Gwqi&tiZ!Ee! zqi&tiZz{Syqi&t4X&%^`YR}w5oSN(z$5>}P?=8ALqi&ti?<=}Jqi&ti?=QMNqi&t4 zX)8X1`tR(uKZZ73?T=w_J`>f_AG?5k4pwdioX@_>?FzR?!=;IeMtpRL0j(MJ}& zZ=;(p`tC*d{n`2Ej=o3HS8sId$ht>?U3cw|Zpl_ex@&)&TISdvjoo>p}GL)|)~pI&tPL)|)~pHX!CL)|)4 z(^+6^s{L_snPY!A#yaD9Nzv^Ob?c0NY0>Qub?c0NS<&qeb?Zz`SAqSzn%W=p8m{)o zt#I~-TKeO5u>DcFJK^k)%H0iTf5@e-d%(3ntiv49?=8Chp>DqD_Z8j#P&aq<`-^UW zs9Q(Y{UF$N*Zz34%&|WlW1aDQtmyVf%cJOz7v26)x6aIeqUiRAx^x}2qMYliHtuy*FMYliHtuy+wMYliHtuxp7HL%y+zo`oM2AtQua&N+U-7EJt zoY!40`QCx6*WJJ0GDq}xi|%z-H(&Jkitcq+H+S^+i|%z-w~pwGitaV`@4~Dp`r@K{ zjn%Cw`jVo1jn%Cw`e#M=8mn7V{{FH%u{C%t!}WkOuh%bJPdIaV&BFD9)8Ff4&-gc} zE5NlHhEw{eH(ZM^+=>n7J)LoV8qRwl*LE#9pGl4nw+`6nQ03Nz^Vw6m{%}5T@ zfpfimFSIsuL?2M}iH&Z)=mU%Hd!h5q9eq&ICpWrvL?2Rg?xUYiE<#i9YEm(iAd;YCtJFuR5IL9&m Q?n+CvsV(7Gimf>Q0Rj=^x&QzG literal 19076 zcmZ{q2iR8Cm4$zL6)Y$=;71^eU`v@8O%xQxC@PlBBt|I$0*WOFwpb8QV~V}^-g|Fp zme|r}qNdEmXsl!G9RZ#9{kY5QhbQwrT<+RyowN2n=kEKp|LfFoNVm2w9opL3`nL7y z#)-#DZ5`WWJU`#Bt*uvE*S5u7+uFvC+il#22hW+h;g`R%vE%x*b@J5uzi->hE$qBG zbLSj5d*n{5^}@!(mL_uhNj)QPjF9WZs;>{-+1IJhH+4xKr=aFC*HEYX$?Ua^TC z(~D#MCLYDvvCbQd!)VTWZHJ54$B<>GmhQOKIrJ6}{#;uYuT$c!z>(p>=nA{-FKB}Kw{N{lj*Us5T9oJ5raihQ)m%Q@|m%Njh;JCqPKB}Kw z{M;AE4RsKYI!-R*vR=95Z3nxz?wi-ihq2c*`)9m0@jtIy=e98=Huo@MA2qk!^10<| z?#%7f%*|dqu5-hU;+%0^8g6{ytjoNU3g_)0H-p3a&FT6^aI8wa4d-?aAMM23a<*3a z)#%HyExxU-KiYO+V?B(&*~Hf8-0eAAzx*nU+JW<6m~ouNBN(IajvUsyHnI1KAp9LaUD_T8E>jx*QpoXuta0c07) z+4=^8M{_oI+_yOQ=8&@{W7jOF{%y|sI5)NJ0d}9($IF`coSj$4P9W~U;hs+9 z>{?uNye5IWbGTnyadylk4*e!`Hn;phcGX^WJ@pvKxIxVr_tkOjt@EhuD2iJRMxuVjsG9(Px6)kHq_ey+21%g=?6_;q|JA zeY-zgJ4c7sv22eI01qdd`+XosJP!i<+&PkUyRO+B)i1dYhPP+_mFAPZeAP2=ZkZE3 z+95^Dd^NArp&aJaTMx&k#v{O~L(i<`C~!{>uhr3Sn%F+u8tgUqdKr)5Y#!r*R4|Nl&1FvKIBvV_3zWBJ$6LeS;IgkdkK`HA^*o0*o3r`c zf3J)F&atOG+|!|)Uued9&E~cE9xCl7T!lJ7NQ^G)K&9={If^-lZ-vDYc_o5Vdz{1)-D*NtV*;cpYK zQ1o|*`;_=y;=Uz*k9egLFCt#K#GeqaR^rcyS1GZ@^(%1);#EuBk+^?}I}xu@;?Bft zmADJ>+9mEvJfOtgh`mR%AKi)F`@}tn+e_S&*q)2ti+G(9_a+`v;uVNDC;m6Cg0GDo zIDCxb_?TCY4^+uvDRC#_G2~YN zjJPvrAM+Zn6BC>_0d6!s@9S1)ILFyb>hbF$&yl%Z!OrzHFmt;(rkSgrx!u8PnY%97 zx%OY?t_PR7>X|zntd_YWz|QqKGIK}5Wv+VWZU9!hiS_z=u@~5Vv7V3Eoe7+Me8OzC zi5!zSyf)%RoE>8`f!R*Tm` zV7YjG53E=1$=Ss5QjgccV6}M70n3f&KJYbfF4$Vlp_UwnfXy+TF*Z@#yuMEyFZFmG308~OQDTmG9SzpY=lpmbLmV&lc+CT=#p_tGT)gIk z_42hVUJHohr5>+^V6}K12bLR8U-^FFc(CiXUh}9Y&k11j__~xlKOjyX_2fAbtd=}K z1k1(iM_|1sm70G{953~F{RFHQuam%XI0@lAiXPrtMfA#pE23Cvz z>0r5dodMRXK8Kx2953~Fods5l*V$mX)OrqBfBE>I3)bJ)^X%(+#PL^;|M_6G_+J2) zi`RuhZc5tQN0Jz;f}r6s(u;D^k~G#PL#(*X3ZfcwGUO%l&yJ*jmk@ zmK;}s&Eb2Mxtu~9c5 z zdA+CPA8*Dv-nE)TKYcUz39#>xrgHeG;~bwoaUaZME#}c9+LK^&sp+Sdwf`Ed?jzi9 z8qWRjdiweJw{VViFMijIU(EH8|9unxCuisU7iZTYZ@rE;R*|H3-L6$rk8y`?PorH{|fJX&$%|wg6(BJ|HknghrRrK zgGtev`*&jJdd_uv0qlGq;a+SwuS0tIB{;{bdHr7I?8CLGy~6P-hyLQMFE0YC z<$3cHu$;YpH2D`BQ;1&nwsC7rsl}So+e^Uqw)NWE)@g5BpY=Y++4?T~+v zv0gLZ%XRPrC5QX(n)x`;;_?~hNC-cR_`b$#xWEBCT#wpO9P>G>p@nhS27Mk}=H)ZY zv2YuZTg}?_a-Q>REN|^Te=Gz$PjC0wvDVSqx_MZKW4aJ`<dba zz0dhbCgR*TmPV7Ykp0qa#i!}NuVmwLQb1gphsC9quHBdrX! zR&%H&$0}fR)Xy;e;F3cs3F)tPU41^?0oTR*Tn~V7Yj$1=g#6 zhFKdfUh45009K3FK(JiA27&depJCeJ;-wz1!ChW41tQM~kV7YjW1nX5luWSGpFZFnB z=va<;Z3LD}A8ib_R&%Jy52eOU!1kE?;~4Kt?=|l$@2?umd!IV*OJL`E@A)08V||YC zbN6Z7pXxsHymNZP`Mi^HXEYp3Y;k_Ka3-8%eK=0;tcJ^6xw9Lt&ON8$Onq!K_gpwV zJ;I#_*3%>0`CvUgj%((ep;!(9q?jN`*y1~#|3!d>2Qb?y}n=iJ`>rO0($3HI;Z zUu@RtcylahYPbr#Ycno$t}b(2mvi(!hR)D)34Z3!_-nw);dt{qCilj*#OBf0v3}nk zuceIBJ6_j;tCzVQ6aD(-boZpL=LTZes-fLU*_IST$eYbJ#GVAzvEKh?O^NBTYcHzE0*={9mMvzkCV8j zz6Re(?4GNo$L|6=&K}RWyNO-9TE^W2cAR~marY8igIdPj2lhVn5$^tmtM}0Z4X0n; z13U!hYxzEKzV<%R`1snZ_Atle96m>g^F8LH;LOW=fXCp5W3J|NiC)fgevRex9^gr^ z^Yr#TfMc!WtIczYbvR~I;;(V&C(iTjX5c(Wnmf;to5QQ+Ir8gZxjf%~1MK+v9$*W& zc&W#0OR!qJMuFwxH5#l}eGjk|T)fodwKZ5RUSq&=@!AHg*L3zGYupwtUh4503s#HQ zc3`>m>Nmlz+j`BTo;=%w%~Rh8>;RWM>d7+>td=}Gg5~116IieMK453Kc&W#0JXkGW zyMX25wJTV!`aWPcxOl0@Yj?0(yuJmNi`Tz{^{TJ+{{a^-^>}?7tQN2DfaS86dw^ZH z^_oXLdAUem#P)$b^0z{N{FUNgaJ@!A(Gm%ZE%?7FSjJnG3a3v8bH z{pJ2}$)lb;2Y}U*=RmMrybc2ERlmRd9$dWC<24(s7O#WBa`Bo2)~kL`ITtQo>hU@R ztQN0B!E*6B46IlEp7LCQuOAYF&VIEj5H5?0;i`RUxUiJIU1#t0FkJm!5TD*<}%f;(>uwH(LndiR~ z;NqnouOEQb;&mceE?z$b>*e3AdA95*gS0e z=Xp+nOCI&)ITfsyJg0%>;&nP$FaMUFn$LiXmwLR;1gpjCEU;X>&Iaq{cWCiC2QFUf z@j4f*7O(Tba`8GJtXIcU*9CC#Qjgb#V6}K%1eVKQUJQ2K)@vU17{VV zqnU1zXgfc&*0*v9S;a6a}cs&Z%%ipfV>oK@^smJSauv)yH0L#VeNw8l2?j>HohKrYa zynX{#i`Q?#a`{f-cVKHZhgx#{9&8SOOXGKp{tm|9K>2?E4`{w$_w4)q!R+HxV1H}1 zDd(p-p5gF&`ad?9A+5Q8B6hB4Khtaj|7WoCeT4f<8R zj~>xp1e;4uKeep=C9t}Wa4$EU`{A|pZ%(hkIo7>+wHfdC^z#4P#IJF7&ObQ24tdw* zcw_Y%J1)Pkc^zzCKTBjU-ypU()Y5xzg428I>AknWYU#bV!E*6>2kiLzS?yioc&W$h zJ+NB5-UrLY>jSV}^|RWC#PL#(*GFKrczq0(i`OEsUej53*7yl=ywu~h7_1hrC1ANc z_bdgwZtFFVx_`Ua9q&)&xH#^y_n5Kc>-F$Dy@2kT(*1cGx8Snirzh)D!#o0M)b9No_uFLVp>NR#;?)L#;^V;{>%Ynr9hFb20 zL16y1_C!7RLOWP3_rhSXT)fr+JHFoULx}m;@=}l2P_SCOhJoec^#!nA^?qNMn13xV z^?0oZR*Tnguv}gP*9TjxIn=yAr{FUJ?0w*#cuyERw(g(%n)`Dk*!$Bx_x^ORy+7S! z=Xj5J4LsY!j`!a3o{{%#&08^N1F*U6Q-2G)A+ekb^tq)SxDog$?myqdsQX%Op09G& z?`zA&^7f;1zsz{&o73MjJJ#MCi1r|{x{q)VH5?_iIKKmZiSO^^eK=0;WjN>ikQ>YS z6*$NG2=^+nV=MPs!zG7vUvD^`nm(WVX2VhP=Xu|TGjE;y4xD)__b#zxedK%o_lV^k zpZeYhJI=Wo_W`kd9rs}~&iXR$BRKgw?&D^hHD}x+IC;nAyX#ND`7Yc&a__7!`r@Ly zU+UHseM!;XJ9X=czO?A>qq=qE`h5y^AM1X92IoFjjz2xMIo3z^tYgE~{qEdwb#B*& zb1za?cet!uZ*#gA(R&o#JnHU6^qxgGr@DI)y;srAukK!C-M!&lcY4a+TY=bhSFR77 zV|`@ZD>htR_sR`d*WIt->bh5h%ewV8r+bmQ`xo6j>h4AK)r)RUb@w9r8bvq1x_gmz zuLbrVuC)&!mal7Ex8dsjFdWYNMlC%(0_;6fxeegFA1b#IoV_oXS~mt~FYJBmFh}%F zif-?#n=kqoi*E0$n>+fKif-?#TSul(lOQ9AlmF+_C8PjJkD3->K;KjJkD3-?`}ajJkEE zXLbQU#8G>DH+7EMGkY~$?U{*i_KaG3W-{2GsoWGed!};J;OrT>)VdEidtuL5hdH88 zFS+fWY0LpI^#LF==O}dbw)p===O}d zbw)q5==O}db*84n#T>O~<`btTd&V)=8P5epw`bI?Gy1}!+cWCc8U47T+cWCcnVvZT zY|qr^(i4g0YtNkCaJ6U7gtKSV(lcj+?U~A*3un(%?tD0VMlQ8p0M1_6GuB~_=oc2< zo>4bn^oxpa�R_`o%@JXVk4D*XL5O>#jX>9dT;1XB=al@w~q1_Kdo9M!%ux_Kdo9 zM!&J>_Kdo9rly<0)>M1u9^%ww&p5_9<9Tn5n79_DAK8hO<8^HxJJKkV{?1f@^+f#qT3(p){%7|4|d(PKTa-l><`CSXFN|Sy8WSUozYJ%y8WSUozYJ#y8WSUovG;z zur<~GxUkHzKOAG7@w}+$_J_K4M!&e|_J_K4M!%%!_J_K4rlu>v{;sC>$4w1a`{Nck z`$H}LaU0nFsN5ZJ_DALJg0ny5QrF$!+8@?oj_CIk-TqKFU-Wy6ZhxqoJNkV^w?EXa zBkO(u?7C}zJW}S^AC9rkc>b#B_J_K4Mt`*E_D3s6(H|?i{h@B1sp$!@HP!z3Lz!cL zIL11Y^QofSAL`Z_{pq6HAL`Z_{h6ZMAL`bbYy2|U>+Wx=!o3RTb+6oOa9;Pyy$l&k5 zQ}m@pZ(U<_Yl{A9(OcIT-J0_I%O1qm;I$0b6VAL|zi_?a%;hx;*BefMuaiCFZ&3Td zwHk&~`lv5li!a=Y4d*?baVs^P_du@gT5vumIX>I~u+Kx48wBTbPvr)~`Ftan{a6Q_ z>+NfywV5OOkfP6Mbn`_YT6A9vop0{w!-~FdqgzMx4U6u*$~D^zYzva$Jb+Ea-?%}=x*5B)%zm;qO)>9AXIL7Z? PX^A$qrF=`VDaZc-^+Vt- 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 cdd8bffd584d0055c079172c0bf35092aea9cd96..f33fafbc4d696f943fbf3a17f357fe50b70ef3bb 100644 GIT binary patch delta 92 zcmcbjb46#v6c*KB1_lOpAl3q61qK#|5GY?0NNWT6+CVyV^G=rYjDjGgHBf15kkZXF a+4PwhLnoi)2nUjioaT(7n( 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 0000000000000000000000000000000000000000..a4a9a6ec2f0115a85d6fa0e03275158d63732cb9 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFqL|`IEGX(zCFOaKqYe8v5)`D z-}Rn2v%JVVd0p=9ZBUfiGjE#L`gumiO7DJ_ZO^J&)^44Bb^R@~^T+@FvwQtj>h>Ok zNi)u-<>cpo&Ubja^UeGB#qaliFZ%e%wXd&l!&z?S&fZ>Lzd05Mw_cAs{q39Cf36U@ zg!=mV(fNC)TEE{jd2{;tqJn~k+&Br(oZQ^PXJ;g*omS9WX?foA2 zZqH}GdH=pFFTNgIzH#?%@3c>cTv(3x%RhhcfT7`N(m|lP`bt{ox9s14{%E(jW%W0m z^1G$t{?)fG@A!VNI&Sk(uH6`; z2eL{3%uM6-jI|SI-Z*Bqtx_=X=X=+u`^BgJj|=%%jf*qSQ)toz7ncC9#ElUJKre$V zbJT3@Z~zJ)>FzjXd^XM4%*+hr+8-Yu$5g-F%CO~HMWUA`h$&-VH)riyU7$QL-1l^> zu(=F$n7ZGb2SA6&$jC4he0t((G+A6t$)fI$h54NV=Ja!O9vob1&@w!uG{-9 zYTNehKf@iio&CHK80J-bkD2NBsHAO{ynXxjA8Cc#&-U|U4}hcgOgoQUZ{1j}Tn|i# N44$rjF6*2UngC*gWQza* literal 0 HcmV?d00001 diff --git a/test_img/sdf/circle_sanity.png b/test_img/sdf/circle_sanity.png new file mode 100644 index 0000000000000000000000000000000000000000..31cd513d971e0d23b6f2e20b24cbd7b7fca4e523 GIT binary patch literal 832 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFtdBQIEGX(zCFOaKqYe8v5)`D z-}Rn2v%JVVd0p=9ZBUfiGjE#L`gumiO7DJ_ZO^J&)^44Bb^R@~|FtXrd|&kGe)p+* zeJ%Z_M2Q=B@22jIVcHO(V^R0VqW1ph_byLcCE6O7+y8xer}FvSIrjDQo)&Q)NZR<| z%F5t76_0yuo+$D!d|&;qcf}rt>gwu0hwc9```3M%TzSlR-oe`McaJ}OsK_vT_UxGA zv!*sL9Qhv|YUSQ@qkFG}wYBvh>3~YRw!{bW{~pT!n7#j}G?4z+xZLjR$~&dkW8b`g z&%9yp-m|>scMgCIx_D8LLH~P^zWe>}f3yQD?dJXavi$QCb^Dq1Kicab4%*@Q9@{>w`)s@9R!j&rY4jU9apIiQ^C*7tQWR1`Ud#CsO{QT$pe!qLXZuh%KK=peR zKms5RNDwIS=H0tb>s_Ai)S2!*?X+rpdppqapY?CvzyJKhhY3%MP8RKa65k05fMgw6`C%=6&0|t(c7`IqA>whnn^G|<#d_2dhv@3hv&Nk`19gV@u{XRB< z1V9{+AW)$2&yT`?Q&-qb-}ip!$79l!7nY``}X}iW$*e3CYRLAcy>Zx4ZxFVP^(2bMu|g zW@T4^TmjM$_vUC^&%XCR%^kL#49_OJhSdFSVI)|NnLoqj6Ra5U-Q%HZWYKn_3Q zEawD_Olig2&*Fh9ckkW}3_k{7NF48%Uk*%Db0_3}zTXZCw*PyP5-KL=kvt>syT5x3 TFHYYK%oz-xu6{1-oD!Ml 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