diff --git a/.cargo/config.toml b/.cargo/config.toml index 6a86f80d..148828e0 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,5 +1,7 @@ [alias] xtask = "run --package xtask --" +shaders = "xtask compile-shaders" +linkage = "xtask generate-linkage" [build] rustflags = ["--cfg=web_sys_unstable_apis"] diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 7fb5d566..5053bea8 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -10,13 +10,14 @@ on: env: # For setup-rust, see https://github.com/moonrepo/setup-rust/issues/22 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CARGO_GPU_COMMITSH: adab62777abc06eb0e93518f480c70f6e5d816fe jobs: - # Installs `cargo-gpu` and sets the cache directory for subsequent jobs + # Installs cargo deps and sets the cache directory for subsequent jobs install-cargo-gpu: strategy: matrix: - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} defaults: run: @@ -34,11 +35,12 @@ jobs: with: path: ~/.cargo # THIS KEY MUST MATCH BELOW - key: cargo-cache-1-${{ runner.os }} + key: cargo-cache-${{ env.CARGO_GPU_COMMITSH }}-${{ runner.os }} - uses: moonrepo/setup-rust@v1 - run: rustup default stable - run: rustup update - - run: cargo install --git https://github.com/rust-gpu/cargo-gpu cargo-gpu + - run: | + cargo install --git https://github.com/rust-gpu/cargo-gpu --rev $CARGO_GPU_COMMITSH cargo-gpu - run: cargo gpu show commitsh - id: cachepathstep run: | @@ -66,7 +68,7 @@ jobs: with: path: ~/.cargo # THIS KEY MUST MATCH ABOVE - key: cargo-cache-1-${{ runner.os }} + key: cargo-cache-${{ env.CARGO_GPU_COMMITSH }}-${{ runner.os }} - uses: actions/cache@v4 with: path: | @@ -77,7 +79,8 @@ jobs: - uses: moonrepo/setup-rust@v1 - run: cargo gpu show commitsh - run: rm -rf crates/renderling/src/linkage/* crates/renderling/shaders - - run: cargo xtask compile-shaders + - run: cargo shaders + - run: cargo linkage - run: cargo build -p renderling - run: git diff --exit-code --no-ext-diff @@ -98,72 +101,34 @@ jobs: - run: cargo build -p example # BAU tests - renderling-test-linux: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: moonrepo/setup-rust@v1 - - run: sudo apt-get -y install mesa-vulkan-drivers libvulkan1 vulkan-tools vulkan-validationlayers - - run: cargo test - env: - RUST_BACKTRACE: 1 - - uses: actions/upload-artifact@v4 - if: always() - with: - name: test-output-linux - path: test_output/**/*.png - - renderling-test-macos: - runs-on: macos-latest + renderling-test: + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 - uses: moonrepo/setup-rust@v1 - - run: cargo test - env: - RUST_BACKTRACE: 1 - - uses: actions/upload-artifact@v4 - if: always() + - uses: actions/cache@v4 with: - name: test-output-macos - path: test_output/**/*.png + path: ~/.cargo + key: ${{ runner.os }}-test-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: ${{ runner.os }}-cargo- - renderling-test-windows: - runs-on: macos-latest - steps: - - uses: actions/checkout@v2 - - uses: moonrepo/setup-rust@v1 - - run: cargo test - env: + - name: Install linux deps + if: runner.os == 'Linux' + run: sudo apt-get -y install mesa-vulkan-drivers libvulkan1 vulkan-tools vulkan-validationlayers + + - name: Install cargo-nextest + run: cargo install --locked cargo-nextest || true + + - name: Test + run: cargo nextest run -j 1 + env: RUST_BACKTRACE: 1 + - uses: actions/upload-artifact@v4 if: always() with: - name: test-output-windows - path: test_output/**/*.png - - # various linuxes w/ physical gpus - # renderling-test-linux-other: - # continue-on-error: true - # strategy: - # matrix: - # label: [intel, amd, pi4] - # runs-on: ${{ matrix.label }} - # steps: - # - uses: actions/checkout@v2 - # - uses: moonrepo/setup-rust@v1 - # with: - # cache: false - # - uses: Swatinem/rust-cache@v2 - # with: - # cache-all-crates: "true" - # cache-on-failure: "true" - # - run: apt-get -q -y update && apt-get -q -y install mesa-vulkan-drivers libvulkan1 vulkan-tools vulkan-validationlayers - # - run: cargo test -j 1 -- --test-threads=1 --nocapture - # continue-on-error: ${{ matrix.label == 'pi4' }} - # env: - # RUST_BACKTRACE: 1 - # - uses: actions/upload-artifact@v4 - # if: always() - # with: - # name: test-output-${{ matrix.label }} - # path: test_output/**/*.png + name: test-output-${{ runner.os }} + path: test_output diff --git a/.gitignore b/.gitignore index 1d787510..f44af5eb 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ test_output cmy_triangle_renderer.svg .aider* flamegraph.svg +**/*.blend1 diff --git a/Cargo.lock b/Cargo.lock index 46e2d852..e6f9fa34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,12 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +[[package]] +name = "acorn_prng" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4812dd5f835c603721f95a2c057394fc12a9d53206588664e68247e7cb25549b" + [[package]] name = "adler2" version = "2.0.0" @@ -59,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.7.0", + "bitflags 2.8.0", "cc", "cesu8", "jni", @@ -138,11 +144,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] @@ -360,9 +367,12 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be3f42a67d6d345ecd59f675f3f012d6974981560836e938c22b424b85ce1be" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +dependencies = [ + "serde", +] [[package]] name = "bitstream-io" @@ -394,7 +404,7 @@ dependencies = [ "async-channel 2.3.1", "async-task", "futures-io", - "futures-lite 2.5.0", + "futures-lite 2.6.0", "piper", ] @@ -412,9 +422,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" dependencies = [ "bytemuck_derive", ] @@ -454,7 +464,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "log", "polling", "rustix", @@ -476,9 +486,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.8" +version = "1.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0cf6e91fde44c773c6ee7ec6bba798504641a8bc2eb7e37a04ffbf4dfaa55a" +checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" dependencies = [ "jobserver", "libc", @@ -507,12 +517,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.1" @@ -698,9 +702,9 @@ dependencies = [ [[package]] name = "craballoc" -version = "0.1.1" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b378ae0de786477bac466f4ecd4a102402cd3a08cc05de38c0ae07443e9e1b0f" +checksum = "8760d74b862c2d66d7e26f193b712392ee89c8561b5b333b341eca0adec573f6" dependencies = [ "async-channel 1.9.0", "bytemuck", @@ -897,16 +901,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "erased-serde" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" -dependencies = [ - "serde", - "typeid", -] - [[package]] name = "errno" version = "0.3.10" @@ -914,7 +908,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1058,9 +1052,9 @@ dependencies = [ [[package]] name = "fixedbitset" -version = "0.4.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" @@ -1146,9 +1140,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" dependencies = [ "futures-core", "pin-project-lite", @@ -1207,9 +1201,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.14.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" dependencies = [ "js-sys", "slotmap", @@ -1258,9 +1252,9 @@ dependencies = [ [[package]] name = "glutin_wgl_sys" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e1951bbd9434a81aa496fe59ccc2235af3820d27b85f9314e279609211e2c" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" dependencies = [ "gl_generator", ] @@ -1309,7 +1303,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "gpu-alloc-types", ] @@ -1319,7 +1313,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", ] [[package]] @@ -1340,7 +1334,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "gpu-descriptor-types", "hashbrown", ] @@ -1351,7 +1345,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", ] [[package]] @@ -1581,9 +1575,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ "once_cell", "wasm-bindgen", @@ -1641,7 +1635,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -1656,7 +1650,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "libc", "redox_syscall 0.5.8", ] @@ -1704,12 +1698,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.24" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6ea2a48c204030ee31a7d7fc72c93294c92fe87ecb1789881c9543516e1a0d" -dependencies = [ - "value-bag", -] +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "loop9" @@ -1808,11 +1799,11 @@ dependencies = [ [[package]] name = "metal" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block", "core-graphics-types", "foreign-types", @@ -1839,9 +1830,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" +checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" dependencies = [ "adler2", "simd-adler32", @@ -1849,35 +1840,14 @@ dependencies = [ [[package]] name = "naga" -version = "23.0.0" -source = "git+https://github.com/gfx-rs/wgpu.git?rev=959c2db0bc2a303b25ec27f1557ccc8377f8139a#959c2db0bc2a303b25ec27f1557ccc8377f8139a" -dependencies = [ - "arrayvec", - "bit-set", - "bitflags 2.7.0", - "cfg_aliases 0.2.1", - "codespan-reporting", - "hexf-parse", - "indexmap", - "log", - "petgraph", - "rustc-hash 1.1.0", - "spirv", - "termcolor", - "thiserror 2.0.11", - "unicode-xid", -] - -[[package]] -name = "naga" -version = "23.1.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.7.0", - "cfg_aliases 0.1.1", + "bitflags 2.8.0", + "cfg_aliases", "codespan-reporting", "hexf-parse", "indexmap", @@ -1885,8 +1855,9 @@ dependencies = [ "petgraph", "rustc-hash 1.1.0", "spirv", + "strum", "termcolor", - "thiserror 1.0.69", + "thiserror 2.0.11", "unicode-xid", ] @@ -1896,7 +1867,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -2054,7 +2025,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "libc", "objc2", @@ -2070,7 +2041,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -2094,7 +2065,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -2136,7 +2107,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "dispatch", "libc", @@ -2161,7 +2132,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -2173,7 +2144,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-foundation", @@ -2196,7 +2167,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-cloud-kit", @@ -2228,7 +2199,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "objc2", "objc2-core-location", @@ -2317,9 +2288,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ "fixedbitset", "indexmap", @@ -2629,9 +2600,9 @@ dependencies = [ [[package]] name = "range-alloc" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] name = "rav1e" @@ -2733,7 +2704,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", ] [[package]] @@ -2775,10 +2746,11 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" name = "renderling" version = "0.4.9" dependencies = [ + "acorn_prng", "assert_approx_eq", "async-channel 1.9.0", "bytemuck", - "cfg_aliases 0.2.1", + "cfg_aliases", "craballoc", "crabslab", "crunch", @@ -2795,7 +2767,8 @@ dependencies = [ "image", "img-diff", "log", - "naga 23.0.0", + "metal", + "naga", "pathdiff", "pretty_assertions", "quote", @@ -2807,6 +2780,7 @@ dependencies = [ "spirv-std", "ttf-parser 0.20.0", "wgpu", + "wgpu-core", "winit", ] @@ -2815,7 +2789,7 @@ name = "renderling_build" version = "0.1.0" dependencies = [ "log", - "naga 23.0.0", + "naga", "quote", "serde", "serde_json", @@ -2867,13 +2841,19 @@ version = "0.38.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "ryu" version = "1.0.18" @@ -2949,15 +2929,6 @@ dependencies = [ "syn 2.0.96", ] -[[package]] -name = "serde_fmt" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d4ddca14104cd60529e8c7f7ba71a2c8acd8f7f5cfcdc2faf97eeb7c3010a4" -dependencies = [ - "serde", -] - [[package]] name = "serde_json" version = "1.0.135" @@ -3030,7 +3001,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "calloop", "calloop-wayland-source", "cursor-icon", @@ -3107,13 +3078,13 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", ] [[package]] name = "spirv-std" version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu?rev=562dff9176f63b318e9b34620ffacb8aa89dae9a#562dff9176f63b318e9b34620ffacb8aa89dae9a" +source = "git+https://github.com/Rust-GPU/rust-gpu?rev=6e2c84d#6e2c84d4fe64e32df4c060c5a7f3e35a32e45421" dependencies = [ "bitflags 1.3.2", "glam", @@ -3125,7 +3096,7 @@ dependencies = [ [[package]] name = "spirv-std-macros" version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu?rev=562dff9176f63b318e9b34620ffacb8aa89dae9a#562dff9176f63b318e9b34620ffacb8aa89dae9a" +source = "git+https://github.com/Rust-GPU/rust-gpu?rev=6e2c84d#6e2c84d4fe64e32df4c060c5a7f3e35a32e45421" dependencies = [ "proc-macro2", "quote", @@ -3136,7 +3107,7 @@ dependencies = [ [[package]] name = "spirv-std-types" version = "0.9.0" -source = "git+https://github.com/Rust-GPU/rust-gpu?rev=562dff9176f63b318e9b34620ffacb8aa89dae9a#562dff9176f63b318e9b34620ffacb8aa89dae9a" +source = "git+https://github.com/Rust-GPU/rust-gpu?rev=6e2c84d#6e2c84d4fe64e32df4c060c5a7f3e35a32e45421" [[package]] name = "static_assertions" @@ -3163,81 +3134,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "sval" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6dc0f9830c49db20e73273ffae9b5240f63c42e515af1da1fceefb69fceafd8" - -[[package]] -name = "sval_buffer" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "429922f7ad43c0ef8fd7309e14d750e38899e32eb7e8da656ea169dd28ee212f" -dependencies = [ - "sval", - "sval_ref", -] - -[[package]] -name = "sval_dynamic" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f16ff5d839396c11a30019b659b0976348f3803db0626f736764c473b50ff4" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_fmt" -version = "2.13.2" +name = "strum" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c01c27a80b6151b0557f9ccbe89c11db571dc5f68113690c1e028d7e974bae94" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" dependencies = [ - "itoa", - "ryu", - "sval", + "strum_macros", ] [[package]] -name = "sval_json" -version = "2.13.2" +name = "strum_macros" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0deef63c70da622b2a8069d8600cf4b05396459e665862e7bdb290fd6cf3f155" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" dependencies = [ - "itoa", - "ryu", - "sval", -] - -[[package]] -name = "sval_nested" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a39ce5976ae1feb814c35d290cf7cf8cd4f045782fe1548d6bc32e21f6156e9f" -dependencies = [ - "sval", - "sval_buffer", - "sval_ref", -] - -[[package]] -name = "sval_ref" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7c6ee3751795a728bc9316a092023529ffea1783499afbc5c66f5fabebb1fa" -dependencies = [ - "sval", -] - -[[package]] -name = "sval_serde" -version = "2.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a5572d0321b68109a343634e3a5d576bf131b82180c6c442dee06349dfc652a" -dependencies = [ - "serde", - "sval", - "sval_nested", + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.96", ] [[package]] @@ -3461,12 +3376,6 @@ dependencies = [ "rand 0.8.5", ] -[[package]] -name = "typeid" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" - [[package]] name = "unicode-ident" version = "1.0.14" @@ -3514,42 +3423,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "value-bag" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ef4c4aa54d5d05a279399bfa921ec387b7aba77caf7a682ae8d86785b8fdad2" -dependencies = [ - "value-bag-serde1", - "value-bag-sval2", -] - -[[package]] -name = "value-bag-serde1" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb773bd36fd59c7ca6e336c94454d9c66386416734817927ac93d81cb3c5b0b" -dependencies = [ - "erased-serde", - "serde", - "serde_fmt", -] - -[[package]] -name = "value-bag-sval2" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a916a702cac43a88694c97657d449775667bcd14b70419441d05b7fea4a83a" -dependencies = [ - "sval", - "sval_buffer", - "sval_dynamic", - "sval_fmt", - "sval_json", - "sval_ref", - "sval_serde", -] - [[package]] name = "vec_map" version = "0.8.2" @@ -3592,20 +3465,21 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", @@ -3617,9 +3491,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", @@ -3630,9 +3504,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3640,9 +3514,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -3653,19 +3527,21 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-bindgen-test" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d44563646eb934577f2772656c7ad5e9c90fac78aa8013d776fcdaf24625d" +checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" dependencies = [ "js-sys", "minicov", - "scoped-tls", "wasm-bindgen", "wasm-bindgen-futures", "wasm-bindgen-test-macro", @@ -3673,9 +3549,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54171416ce73aa0b9c377b51cc3cb542becee1cd678204812e8392e5b0e4a031" +checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" dependencies = [ "proc-macro2", "quote", @@ -3702,7 +3578,7 @@ version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "rustix", "wayland-backend", "wayland-scanner", @@ -3714,7 +3590,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "cursor-icon", "wayland-backend", ] @@ -3736,7 +3612,7 @@ version = "0.32.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -3748,7 +3624,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3761,7 +3637,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -3793,9 +3669,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3819,16 +3695,17 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" [[package]] name = "wgpu" -version = "23.0.1" +version = "24.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +checksum = "47f55718f85c2fa756edffa0e7f0e0a60aba463d1362b57e23123c58f035e4b6" dependencies = [ "arrayvec", - "cfg_aliases 0.1.1", + "bitflags 2.8.0", + "cfg_aliases", "document-features", "js-sys", "log", - "naga 23.1.0", + "naga", "parking_lot", "profiling", "raw-window-handle", @@ -3844,44 +3721,44 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "23.0.1" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +checksum = "82a39b8842dc9ffcbe34346e3ab6d496b32a47f6497e119d762c97fcaae3cb37" dependencies = [ "arrayvec", "bit-vec", - "bitflags 2.7.0", + "bitflags 2.8.0", "bytemuck", - "cfg_aliases 0.1.1", + "cfg_aliases", "document-features", "indexmap", "log", - "naga 23.1.0", + "naga", "once_cell", "parking_lot", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.11", "wgpu-hal", "wgpu-types", ] [[package]] name = "wgpu-hal" -version = "23.0.1" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +checksum = "5a782e5056b060b0b4010881d1decddd059e44f2ecd01e2db2971b48ad3627e5" dependencies = [ "android_system_properties", "arrayvec", "ash", "bit-set", - "bitflags 2.7.0", + "bitflags 2.8.0", "block", "bytemuck", - "cfg_aliases 0.1.1", + "cfg_aliases", "core-graphics-types", "glow", "glutin_wgl_sys", @@ -3894,10 +3771,11 @@ dependencies = [ "libloading", "log", "metal", - "naga 23.1.0", + "naga", "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", + "ordered-float", "parking_lot", "profiling", "range-alloc", @@ -3905,7 +3783,7 @@ dependencies = [ "renderdoc-sys", "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.11", "wasm-bindgen", "web-sys", "wgpu-types", @@ -3915,12 +3793,13 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "23.0.0" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "js-sys", + "log", "web-sys", ] @@ -3946,7 +3825,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4233,11 +4112,11 @@ dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.7.0", + "bitflags 2.8.0", "block2", "bytemuck", "calloop", - "cfg_aliases 0.2.1", + "cfg_aliases", "concurrent-queue", "core-foundation", "core-graphics", @@ -4335,7 +4214,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.7.0", + "bitflags 2.8.0", "dlib", "log", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index 027a107d..23dd3096 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,12 +16,13 @@ exclude = ["./shaders"] resolver = "2" [workspace.dependencies] +acorn_prng = "3.0" assert_approx_eq = "1.1.0" async-channel = "1.8" -bytemuck = { version = "1.13.0", features = ["derive"] } +bytemuck = { version = "1.19.0", features = ["derive"] } cfg_aliases = "0.2" clap = { version = "4.5.23", features = ["derive"] } -craballoc = { version = "0.1.1" } +craballoc = { version = "0.1.10" } crabslab = { version = "0.6.3", default-features = false } ctor = "0.2.2" dagga = "0.2.1" @@ -31,7 +32,7 @@ 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.25" log = "0.4" -naga = { git = "https://github.com/gfx-rs/wgpu.git", rev = "959c2db0bc2a303b25ec27f1557ccc8377f8139a", features = ["spv-in", "wgsl-out", "wgsl-in", "msl-out"] } +naga = { version = "24.0", features = ["spv-in", "wgsl-out", "wgsl-in", "msl-out"] } pretty_assertions = "1.4.0" proc-macro2 = { version = "1.0", features = ["span-locations"] } quote = "1.0" @@ -40,15 +41,16 @@ serde = {version = "1.0", features = ["derive"]} serde_json = "1.0.117" send_wrapper = "0.6.0" snafu = "0.8" -spirv-std = { git = "https://github.com/Rust-GPU/rust-gpu", rev = "562dff9176f63b318e9b34620ffacb8aa89dae9a" } +spirv-std = { git = "https://github.com/Rust-GPU/rust-gpu", rev = "6e2c84d" } syn = { version = "2.0.49", features = ["full", "extra-traits", "parsing"] } tracing = "0.1.41" wasm-bindgen = "0.2" wasm-bindgen-futures = "0.4" web-sys = "0.3" winit = { version = "0.30" } -wgpu = { version = "23.0" } - +wgpu = { version = "24.0" } +wgpu-core = { version = "24.0" } +metal = "0.31" [profile.dev] opt-level = 1 @@ -60,4 +62,4 @@ opt-level = 3 opt-level = 3 [patch.crates-io] -spirv-std = { git = "https://github.com/Rust-GPU/rust-gpu", rev = "562dff9176f63b318e9b34620ffacb8aa89dae9a" } +spirv-std = { git = "https://github.com/Rust-GPU/rust-gpu", rev = "6e2c84d" } diff --git a/README.md b/README.md index 20fc8741..82a639e6 100644 --- a/README.md +++ b/README.md @@ -187,11 +187,16 @@ The `crates/renderling/shaders/` folder contains the generated SPIR-V files. To regenerate the shaders, run: ``` -cargo shaders +cargo xtask compile-shaders ``` -There is a `.cargo/config.toml` alias for `cargo shaders` that expands into a larger -shader compilation command. +And to explicitly re-generate `wgpu` linkage, you can run: + +``` +cargo xtask generate-linkage +``` + +...but the `build.rs` script will do this for you, so it's not strictly necessary. ## Building on WASM diff --git a/blender/shadow_mapping_point.blend b/blender/shadow_mapping_point.blend new file mode 100644 index 00000000..d049937c Binary files /dev/null and b/blender/shadow_mapping_point.blend differ diff --git a/blender/shadow_mapping_points.blend b/blender/shadow_mapping_points.blend new file mode 100644 index 00000000..3cc96a8a Binary files /dev/null and b/blender/shadow_mapping_points.blend differ diff --git a/blender/shadow_mapping_sanity_spot.blend b/blender/shadow_mapping_sanity_spot.blend new file mode 100644 index 00000000..8cf69f68 Binary files /dev/null and b/blender/shadow_mapping_sanity_spot.blend differ diff --git a/blender/shadow_mapping_spots.blend b/blender/shadow_mapping_spots.blend new file mode 100644 index 00000000..dab2d1e1 Binary files /dev/null and b/blender/shadow_mapping_spots.blend differ diff --git a/blender/spot_lights.blend b/blender/spot_lights.blend new file mode 100644 index 00000000..369109b7 Binary files /dev/null and b/blender/spot_lights.blend differ diff --git a/blender/spot_one.blend b/blender/spot_one.blend new file mode 100644 index 00000000..ae53bddb Binary files /dev/null and b/blender/spot_one.blend differ diff --git a/crates/example-culling/src/main.rs b/crates/example-culling/src/main.rs index 142a1c5f..973107a0 100644 --- a/crates/example-culling/src/main.rs +++ b/crates/example-culling/src/main.rs @@ -33,8 +33,7 @@ struct CullingExample { app_camera: AppCamera, controller: example::camera::TurntableCameraController, stage: Stage, - dlights: [Hybrid; 2], - lights: [Hybrid; 2], + dlights: [AnalyticalLightBundle; 2], material_aabb_overlapping: Hybrid, material_aabb_outside: Hybrid, material_frustum: Hybrid, @@ -205,22 +204,24 @@ impl TestAppHandler for CullingExample { let mut seed = 46; let mut resources = BagOfResources::default(); let stage = ctx.new_stage().with_lighting(true); - let sunlight_a = stage.new_value(DirectionalLight { - direction: Vec3::new(-0.8, -1.0, 0.5).normalize(), - color: Vec4::ONE, - intensity: 10.0, - }); - let light_a = stage.new_value(Light::from(sunlight_a.id())); - let sunlight_b = stage.new_value(DirectionalLight { - direction: Vec3::new(1.0, 1.0, -0.1).normalize(), - color: Vec4::ONE, - intensity: 1.0, - }); - let light_b = stage.new_value(Light::from(sunlight_b.id())); - stage.set_lights([light_a.id(), light_b.id()]); + let sunlight_a = stage.lighting().new_analytical_light( + DirectionalLightDescriptor { + direction: Vec3::new(-0.8, -1.0, 0.5).normalize(), + color: Vec4::ONE, + intensity: 10.0, + }, + None, + ); + let sunlight_b = stage.lighting().new_analytical_light( + DirectionalLightDescriptor { + direction: Vec3::new(1.0, 1.0, -0.1).normalize(), + color: Vec4::ONE, + intensity: 1.0, + }, + None, + ); let dlights = [sunlight_a, sunlight_b]; - let lights = [light_a, light_b]; let frustum_camera = FrustumCamera({ let aspect = 1.0; @@ -287,6 +288,7 @@ impl TestAppHandler for CullingExample { next_k: seed, app_camera, frustum_camera, + dlights, controller: { let mut c = example::camera::TurntableCameraController::default(); c.reset(BOUNDS); @@ -294,8 +296,6 @@ impl TestAppHandler for CullingExample { c }, stage, - dlights, - lights, material_aabb_overlapping, material_aabb_outside, material_frustum, diff --git a/crates/example/src/lib.rs b/crates/example/src/lib.rs index 20c05662..8133ce08 100644 --- a/crates/example/src/lib.rs +++ b/crates/example/src/lib.rs @@ -10,8 +10,8 @@ use renderling::{ atlas::AtlasImage, bvol::{Aabb, BoundingSphere}, camera::Camera, + light::{AnalyticalLightBundle, DirectionalLightDescriptor}, math::{Mat4, UVec2, Vec2, Vec3, Vec4}, - pbr::light::{DirectionalLight, Light}, skybox::Skybox, stage::{Animator, GltfDocument, Renderlet, Stage, Vertex}, Context, @@ -128,7 +128,7 @@ pub struct App { loads: Arc>>>, pub stage: Stage, camera: Hybrid, - _light: Option<(Hybrid, Hybrid)>, + lighting: AnalyticalLightBundle, model: Model, animators: Option>, animations_conflict: bool, @@ -143,16 +143,16 @@ 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_debug_overlay(true); + .with_msaa_sample_count(4); let camera = stage.new_value(Camera::default()); - // let sunlight = stage.new_value(DirectionalLight { - // direction: Vec3::NEG_Y, - // color: hex_to_vec4(0xFDFBD3FF), - // intensity: 10.0, - // }); - // let light = stage.new_value(Light::from(sunlight.id())); - // stage.set_lights([light.id()]); + let directional_light = DirectionalLightDescriptor { + direction: Vec3::NEG_Y, + color: renderling::math::hex_to_vec4(0xFDFBD3FF), + intensity: 10.0, + }; + + let lighting = stage.lighting(); + let sunlight_bundle = lighting.new_analytical_light(directional_light, None); stage .set_atlas_size(wgpu::Extent3d { @@ -177,8 +177,7 @@ impl App { }, stage, camera, - _light: None, - + lighting: sunlight_bundle, model: Model::None, animators: None, animations_conflict: false, @@ -204,6 +203,7 @@ impl App { pub fn render(&self, ctx: &Context) { let frame = ctx.get_next_frame().unwrap(); + self.stage.tick(); self.stage.render(&frame.view()); self.ui.ui.render(&frame.view()); frame.present(); @@ -286,8 +286,6 @@ impl App { Ok(doc) => doc, }; - // self.entities = builder.entities.clone(); - // find the bounding box of the model so we can display it correctly let mut min = Vec3::splat(f32::INFINITY); let mut max = Vec3::splat(f32::NEG_INFINITY); @@ -372,6 +370,28 @@ impl App { log::trace!(" and some animations conflict"); } self.animations_conflict = has_conflicting_animations; + + // // Update lights and shadows + // for light in doc.lights.iter() { + // if let Some(dir) = light.details.as_directional() { + // log::info!("found a directional light to use for shadows"); + // { + // let (p, j) = dir.get().shadow_mapping_projection_and_view( + // &light.node_transform.get_global_transform().into(), + // &self.camera.get(), + // ); + // let mut guard = self.lighting.shadow_map.descriptor_lock(); + // guard.light_space_transform = p * j; + // } + + // self.lighting + // .shadow_map + // .update(&self.lighting.lighting, doc.renderlets.values().flatten()); + // self.lighting.light = light.light.clone(); + // self.lighting.light_details = dir.clone(); + // } + // } + self.model = Model::Gltf(doc); } diff --git a/crates/renderling-build/src/lib.rs b/crates/renderling-build/src/lib.rs index 53de687c..d767ffc9 100644 --- a/crates/renderling-build/src/lib.rs +++ b/crates/renderling-build/src/lib.rs @@ -93,7 +93,12 @@ fn wgsl(spv_filepath: impl AsRef, destination: impl AsRef global: vec2; +@group(0) @binding(2) +var global_1: sampler; +@group(0) @binding(1) +var global_2: texture_2d; +var global_3: vec4; + +fn function() { + let _e4 = global; + let _e5 = textureSample(global_2, global_1, _e4); + global_3 = _e5; + return; +} + +@fragment +fn atlasatlas_blit_fragment(@location(0) param: vec2) -> @location(0) vec4 { + global = param; + function(); + let _e3 = global_3; + return _e3; +} diff --git a/crates/renderling/shaders/atlas-atlas_blit_vertex.spv b/crates/renderling/shaders/atlas-atlas_blit_vertex.spv new file mode 100644 index 00000000..45409ff2 Binary files /dev/null and b/crates/renderling/shaders/atlas-atlas_blit_vertex.spv differ diff --git a/crates/renderling/shaders/atlas-atlas_blit_vertex.wgsl b/crates/renderling/shaders/atlas-atlas_blit_vertex.wgsl new file mode 100644 index 00000000..19c08304 --- /dev/null +++ b/crates/renderling/shaders/atlas-atlas_blit_vertex.wgsl @@ -0,0 +1,262 @@ +struct type_3 { + member: array, +} + +struct VertexOutput { + @location(0) member: vec2, + @builtin(position) member_1: vec4, +} + +var global: u32; +var global_1: u32; +@group(0) @binding(0) +var global_2: type_3; +var global_3: vec2; +var global_4: vec4 = vec4(0f, 0f, 0f, 1f); + +fn function() { + var local: array, 6>; + var local_1: array, 6>; + var phi_120_: u32; + var phi_129_: u32; + var phi_406_: f32; + var phi_388_: bool; + var phi_210_: f32; + var phi_205_: f32; + var phi_211_: f32; + var phi_371_: bool; + var phi_176_: f32; + var phi_213_: f32; + var phi_454_: f32; + var phi_436_: bool; + var phi_266_: f32; + var phi_261_: f32; + var phi_267_: f32; + var phi_419_: bool; + var phi_232_: f32; + var phi_269_: f32; + + switch bitcast(0u) { + default: { + let _e36 = global; + let _e37 = global_1; + local = array, 6>(vec2(0f, 1f), vec2(1f, 1f), vec2(1f, 0f), vec2(1f, 0f), vec2(0f, 0f), vec2(0f, 1f)); + let _e38 = (_e36 < 6u); + if _e38 { + } else { + break; + } + let _e40 = local[_e36]; + global_3 = _e40; + let _e43 = global_2.member[_e37]; + let _e47 = global_2.member[(_e37 + 1u)]; + let _e50 = global_2.member[_e43]; + let _e54 = global_2.member[(_e43 + 1u)]; + let _e58 = global_2.member[(_e43 + 2u)]; + let _e62 = global_2.member[(_e43 + 3u)]; + let _e66 = global_2.member[(_e43 + 6u)]; + switch bitcast(_e66) { + case 0: { + phi_120_ = 0u; + break; + } + case 1: { + phi_120_ = 1u; + break; + } + case 2: { + phi_120_ = 2u; + break; + } + default: { + phi_120_ = 0u; + break; + } + } + let _e69 = phi_120_; + let _e73 = global_2.member[(_e43 + 7u)]; + switch bitcast(_e73) { + case 0: { + phi_129_ = 0u; + break; + } + case 1: { + phi_129_ = 1u; + break; + } + case 2: { + phi_129_ = 2u; + break; + } + default: { + phi_129_ = 0u; + break; + } + } + let _e76 = phi_129_; + let _e79 = global_2.member[_e47]; + let _e83 = global_2.member[(_e47 + 1u)]; + local_1 = 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)); + if _e38 { + } else { + break; + } + let _e85 = local_1[_e36]; + let _e90 = ((_e85.x + 1f) * 0.5f); + let _e91 = (fma(_e85.y, -1f, 1f) * 0.5f); + switch bitcast(_e69) { + case 1: { + let _e126 = abs(_e90); + let _e128 = (_e126 % 1f); + if (_e126 >= 1f) { + phi_371_ = select(true, false, (_e128 == 0f)); + } else { + phi_371_ = true; + } + let _e132 = phi_371_; + let _e133 = select(1f, _e128, _e132); + if (select(-1f, 1f, (_e90 >= 0f)) > 0f) { + phi_176_ = _e133; + } else { + phi_176_ = (1f - _e133); + } + let _e137 = phi_176_; + phi_213_ = _e137; + break; + } + case 2: { + let _e100 = abs(_e90); + let _e107 = ((select(select(u32(_e100), 0u, (_e100 < 0f)), 4294967295u, (_e100 > 4294967000f)) % 2u) == 0u); + let _e109 = (_e100 % 1f); + if (_e100 >= 1f) { + phi_388_ = select(true, false, (_e109 == 0f)); + } else { + phi_388_ = true; + } + let _e113 = phi_388_; + let _e114 = select(1f, _e109, _e113); + if (select(-1f, 1f, (_e90 >= 0f)) > 0f) { + if _e107 { + phi_205_ = _e114; + } else { + phi_205_ = (1f - _e114); + } + let _e121 = phi_205_; + phi_211_ = _e121; + } else { + if _e107 { + phi_210_ = (1f - _e114); + } else { + phi_210_ = _e114; + } + let _e118 = phi_210_; + phi_211_ = _e118; + } + let _e123 = phi_211_; + phi_213_ = _e123; + break; + } + case 0: { + if (_e90 > 1f) { + phi_406_ = 0.9999999f; + } else { + phi_406_ = select(_e90, 0.00000011920929f, (_e90 < 0f)); + } + let _e97 = phi_406_; + phi_213_ = _e97; + break; + } + default: { + phi_213_ = f32(); + break; + } + } + let _e139 = phi_213_; + switch bitcast(_e76) { + case 1: { + let _e174 = abs(_e91); + let _e176 = (_e174 % 1f); + if (_e174 >= 1f) { + phi_419_ = select(true, false, (_e176 == 0f)); + } else { + phi_419_ = true; + } + let _e180 = phi_419_; + let _e181 = select(1f, _e176, _e180); + if (select(-1f, 1f, (_e91 >= 0f)) > 0f) { + phi_232_ = _e181; + } else { + phi_232_ = (1f - _e181); + } + let _e185 = phi_232_; + phi_269_ = _e185; + break; + } + case 2: { + let _e148 = abs(_e91); + let _e155 = ((select(select(u32(_e148), 0u, (_e148 < 0f)), 4294967295u, (_e148 > 4294967000f)) % 2u) == 0u); + let _e157 = (_e148 % 1f); + if (_e148 >= 1f) { + phi_436_ = select(true, false, (_e157 == 0f)); + } else { + phi_436_ = true; + } + let _e161 = phi_436_; + let _e162 = select(1f, _e157, _e161); + if (select(-1f, 1f, (_e91 >= 0f)) > 0f) { + if _e155 { + phi_261_ = _e162; + } else { + phi_261_ = (1f - _e162); + } + let _e169 = phi_261_; + phi_267_ = _e169; + } else { + if _e155 { + phi_266_ = (1f - _e162); + } else { + phi_266_ = _e162; + } + let _e166 = phi_266_; + phi_267_ = _e166; + } + let _e171 = phi_267_; + phi_269_ = _e171; + break; + } + case 0: { + if (_e91 > 1f) { + phi_454_ = 0.9999999f; + } else { + phi_454_ = select(_e91, 0.00000011920929f, (_e91 < 0f)); + } + let _e145 = phi_454_; + phi_269_ = _e145; + break; + } + default: { + phi_269_ = f32(); + break; + } + } + let _e187 = phi_269_; + let _e189 = (_e139 * f32(_e58)); + let _e196 = (_e187 * f32(_e62)); + global_4 = vec4(fma((f32((select(select(u32(_e189), 0u, (_e189 < 0f)), 4294967295u, (_e189 > 4294967000f)) + _e50)) / f32(_e79)), 2f, -1f), (fma((f32((select(select(u32(_e196), 0u, (_e196 < 0f)), 4294967295u, (_e196 > 4294967000f)) + _e54)) / f32(_e83)), 2f, -1f) * -1f), _e85.z, _e85.w); + break; + } + } + return; +} + +@vertex +fn atlasatlas_blit_vertex(@builtin(vertex_index) param: u32, @builtin(instance_index) param_1: u32) -> VertexOutput { + global = param; + global_1 = param_1; + function(); + let _e7 = global_4.y; + global_4.y = -(_e7); + let _e9 = global_3; + let _e10 = global_4; + return VertexOutput(_e9, _e10); +} diff --git a/crates/renderling/shaders/bloom-bloom_downsample_fragment.spv b/crates/renderling/shaders/bloom-bloom_downsample_fragment.spv index 7eee219c..c581fd34 100644 Binary files a/crates/renderling/shaders/bloom-bloom_downsample_fragment.spv and b/crates/renderling/shaders/bloom-bloom_downsample_fragment.spv differ diff --git a/crates/renderling/shaders/bloom-bloom_downsample_fragment.wgsl b/crates/renderling/shaders/bloom-bloom_downsample_fragment.wgsl index fd80780e..c0ab80e1 100644 --- a/crates/renderling/shaders/bloom-bloom_downsample_fragment.wgsl +++ b/crates/renderling/shaders/bloom-bloom_downsample_fragment.wgsl @@ -1,24 +1,24 @@ -struct type_8 { +struct type_3 { member: array, } @group(0) @binding(0) -var global: type_8; +var global: type_3; var global_1: vec2; -var global_2: u32; @group(0) @binding(2) -var global_3: sampler; +var global_2: sampler; @group(0) @binding(1) -var global_4: texture_2d; +var global_3: texture_2d; +var global_4: u32; var global_5: vec4; fn function() { var phi_329_: bool; - var phi_80_: vec2; + var phi_90_: vec2; let _e20 = arrayLength((&global.member)); let _e21 = global_1; - let _e22 = global_2; + let _e22 = global_4; if (_e20 >= 2u) { phi_329_ = (_e22 <= (_e20 - 2u)); } else { @@ -28,29 +28,29 @@ fn function() { if _e27 { let _e30 = global.member[_e22]; let _e35 = global.member[(_e22 + 1u)]; - phi_80_ = vec2(bitcast(_e30), bitcast(_e35)); + phi_90_ = vec2(bitcast(_e30), bitcast(_e35)); } else { - phi_80_ = vec2(0f, 0f); + phi_90_ = vec2(0f, 0f); } - let _e39 = phi_80_; + let _e39 = phi_90_; let _e44 = fma(-2f, _e39.x, _e21.x); let _e47 = fma(2f, _e39.y, _e21.y); - let _e49 = textureSample(global_4, global_3, vec2(_e44, _e47)); - let _e51 = textureSample(global_4, global_3, vec2(_e21.x, _e47)); + let _e49 = textureSample(global_3, global_2, vec2(_e44, _e47)); + let _e51 = textureSample(global_3, global_2, vec2(_e21.x, _e47)); let _e52 = vec2((2f * _e39.x), (2f * _e39.y)); - let _e54 = textureSample(global_4, global_3, (_e21 + _e52)); - let _e56 = textureSample(global_4, global_3, vec2(_e44, _e21.y)); - let _e57 = textureSample(global_4, global_3, _e21); + let _e54 = textureSample(global_3, global_2, (_e21 + _e52)); + let _e56 = textureSample(global_3, global_2, vec2(_e44, _e21.y)); + let _e57 = textureSample(global_3, global_2, _e21); let _e58 = fma(2f, _e39.x, _e21.x); - let _e60 = textureSample(global_4, global_3, vec2(_e58, _e21.y)); - let _e62 = textureSample(global_4, global_3, (_e21 - _e52)); + let _e60 = textureSample(global_3, global_2, vec2(_e58, _e21.y)); + let _e62 = textureSample(global_3, global_2, (_e21 - _e52)); let _e63 = fma(-2f, _e39.y, _e21.y); - let _e65 = textureSample(global_4, global_3, vec2(_e21.x, _e63)); - let _e67 = textureSample(global_4, global_3, vec2(_e58, _e63)); - let _e71 = textureSample(global_4, global_3, vec2((_e21.x - _e39.x), (_e21.y + _e39.y))); - let _e73 = textureSample(global_4, global_3, (_e21 + _e39)); - let _e75 = textureSample(global_4, global_3, (_e21 - _e39)); - let _e79 = textureSample(global_4, global_3, vec2((_e21.x + _e39.x), (_e21.y - _e39.y))); + let _e65 = textureSample(global_3, global_2, vec2(_e21.x, _e63)); + let _e67 = textureSample(global_3, global_2, vec2(_e58, _e63)); + let _e71 = textureSample(global_3, global_2, vec2((_e21.x - _e39.x), (_e21.y + _e39.y))); + let _e73 = textureSample(global_3, global_2, (_e21 + _e39)); + let _e75 = textureSample(global_3, global_2, (_e21 - _e39)); + let _e79 = textureSample(global_3, global_2, vec2((_e21.x + _e39.x), (_e21.y - _e39.y))); global_5 = vec4(max(fma((((_e49.x + _e54.x) + _e62.x) + _e67.x), 0.03125f, fma(0.125f, (_e57.x + (((_e71.x + _e73.x) + _e75.x) + _e79.x)), ((((_e51.x + _e56.x) + _e65.x) + _e60.x) * 0.0625f))), 0.00000011920929f), max(fma((((_e49.y + _e54.y) + _e62.y) + _e67.y), 0.03125f, fma(0.125f, (_e57.y + (((_e71.y + _e73.y) + _e75.y) + _e79.y)), ((((_e51.y + _e56.y) + _e65.y) + _e60.y) * 0.0625f))), 0.00000011920929f), max(fma((((_e49.z + _e54.z) + _e62.z) + _e67.z), 0.03125f, fma(0.125f, (_e57.z + (((_e71.z + _e73.z) + _e75.z) + _e79.z)), ((((_e51.z + _e56.z) + _e65.z) + _e60.z) * 0.0625f))), 0.00000011920929f), max(fma((((_e49.w + _e54.w) + _e62.w) + _e67.w), 0.03125f, fma(0.125f, (_e57.w + (((_e71.w + _e73.w) + _e75.w) + _e79.w)), ((((_e51.w + _e56.w) + _e65.w) + _e60.w) * 0.0625f))), 1f)); return; } @@ -58,7 +58,7 @@ fn function() { @fragment fn bloombloom_downsample_fragment(@location(0) param: vec2, @location(1) @interpolate(flat) param_1: u32) -> @location(0) vec4 { global_1 = param; - global_2 = param_1; + global_4 = param_1; function(); let _e5 = global_5; return _e5; diff --git a/crates/renderling/shaders/bloom-bloom_mix_fragment.spv b/crates/renderling/shaders/bloom-bloom_mix_fragment.spv index f15f4459..125e4e3a 100644 Binary files a/crates/renderling/shaders/bloom-bloom_mix_fragment.spv and b/crates/renderling/shaders/bloom-bloom_mix_fragment.spv differ diff --git a/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl b/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl index 74385898..57a63ea6 100644 --- a/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl +++ b/crates/renderling/shaders/bloom-bloom_mix_fragment.wgsl @@ -1,20 +1,20 @@ -struct type_8 { +struct type_3 { member: array, } @group(0) @binding(0) -var global: type_8; +var global: type_3; var global_1: vec2; -var global_2: u32; +var global_2: vec4; +var global_3: u32; @group(0) @binding(2) -var global_3: sampler; +var global_4: sampler; @group(0) @binding(1) -var global_4: texture_2d; +var global_5: texture_2d; @group(0) @binding(4) -var global_5: sampler; +var global_6: sampler; @group(0) @binding(3) -var global_6: texture_2d; -var global_7: vec4; +var global_7: texture_2d; fn function() { var phi_133_: bool; @@ -22,7 +22,7 @@ fn function() { let _e14 = arrayLength((&global.member)); let _e15 = global_1; - let _e16 = global_2; + let _e16 = global_3; if (_e14 >= 1u) { phi_133_ = (_e16 <= (_e14 - 1u)); } else { @@ -36,18 +36,18 @@ fn function() { phi_81_ = 0f; } let _e27 = phi_81_; - let _e28 = textureSample(global_4, global_3, _e15); - let _e32 = textureSample(global_6, global_5, _e15); + let _e28 = textureSample(global_5, global_4, _e15); + let _e32 = textureSample(global_7, global_6, _e15); 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); + global_2 = vec4(fma(_e28.x, _e36, (_e32.x * _e27)), fma(_e28.y, _e36, (_e32.y * _e27)), fma(_e28.z, _e36, (_e32.z * _e27)), 1f); return; } @fragment fn bloombloom_mix_fragment(@location(0) param: vec2, @location(1) @interpolate(flat) param_1: u32) -> @location(0) vec4 { global_1 = param; - global_2 = param_1; + global_3 = param_1; function(); - let _e5 = global_7; + let _e5 = global_2; return _e5; } diff --git a/crates/renderling/shaders/bloom-bloom_upsample_fragment.spv b/crates/renderling/shaders/bloom-bloom_upsample_fragment.spv index 64a6fd88..01e78d0a 100644 Binary files a/crates/renderling/shaders/bloom-bloom_upsample_fragment.spv and b/crates/renderling/shaders/bloom-bloom_upsample_fragment.spv differ diff --git a/crates/renderling/shaders/bloom-bloom_upsample_fragment.wgsl b/crates/renderling/shaders/bloom-bloom_upsample_fragment.wgsl index 65f9b7f2..62429c53 100644 --- a/crates/renderling/shaders/bloom-bloom_upsample_fragment.wgsl +++ b/crates/renderling/shaders/bloom-bloom_upsample_fragment.wgsl @@ -1,9 +1,9 @@ -struct type_8 { +struct type_3 { member: array, } @group(0) @binding(0) -var global: type_8; +var global: type_3; var global_1: vec2; @group(0) @binding(2) var global_2: sampler; diff --git a/crates/renderling/shaders/bloom-bloom_vertex.spv b/crates/renderling/shaders/bloom-bloom_vertex.spv index 34d11cda..be801ad5 100644 Binary files a/crates/renderling/shaders/bloom-bloom_vertex.spv and b/crates/renderling/shaders/bloom-bloom_vertex.spv differ diff --git a/crates/renderling/shaders/bloom-bloom_vertex.wgsl b/crates/renderling/shaders/bloom-bloom_vertex.wgsl index 08fba408..e7841877 100644 --- a/crates/renderling/shaders/bloom-bloom_vertex.wgsl +++ b/crates/renderling/shaders/bloom-bloom_vertex.wgsl @@ -4,9 +4,9 @@ struct VertexOutput { @builtin(position) member_2: vec4, } -var global: u32; +var global: vec2; var global_1: u32; -var global_2: vec2; +var global_2: u32; var global_3: vec4 = vec4(0f, 0f, 0f, 1f); var global_4: u32; @@ -16,8 +16,8 @@ fn function() { switch bitcast(0u) { default: { - let _e24 = global; - let _e25 = global_1; + let _e24 = global_1; + let _e25 = global_2; let _e26 = (_e24 % 6u); local = array, 6>(vec2(0f, 1f), vec2(1f, 1f), vec2(1f, 0f), vec2(1f, 0f), vec2(0f, 0f), vec2(0f, 1f)); let _e27 = (_e26 < 6u); @@ -26,7 +26,7 @@ fn function() { break; } let _e29 = local[_e26]; - global_2 = _e29; + global = _e29; local_1 = 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)); if _e27 { } else { @@ -43,12 +43,12 @@ fn function() { @vertex fn bloombloom_vertex(@builtin(vertex_index) param: u32, @builtin(instance_index) param_1: u32) -> VertexOutput { - global = param; - global_1 = param_1; + global_1 = param; + global_2 = param_1; function(); let _e8 = global_3.y; global_3.y = -(_e8); - let _e10 = global_2; + let _e10 = global; let _e11 = global_4; let _e12 = global_3; return VertexOutput(_e10, _e11, _e12); diff --git a/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.spv b/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.spv index 50662b7c..758e616b 100644 Binary files a/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.spv and b/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.spv differ diff --git a/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.wgsl b/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.wgsl index 35c613e2..09def563 100644 --- a/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.wgsl +++ b/crates/renderling/shaders/convolution-brdf_lut_convolution_fragment.wgsl @@ -1,4 +1,4 @@ -struct type_6 { +struct type_5 { member: u32, member_1: u32, } @@ -7,11 +7,11 @@ var global: vec2; var global_1: vec2; fn function() { - var phi_266_: type_6; + var phi_266_: type_5; var phi_269_: f32; var phi_271_: f32; - var phi_267_: type_6; - var phi_294_: type_6; + var phi_267_: type_5; + var phi_294_: type_5; var phi_586_: vec3; var phi_621_: vec3; var phi_656_: vec3; @@ -29,7 +29,7 @@ fn function() { let _e40 = max(_e37.x, 0.00000011920929f); let _e41 = -(_e40); let _e43 = sqrt(fma(_e41, _e40, 1f)); - phi_266_ = type_6(1u, 1024u); + phi_266_ = type_5(1u, 1024u); phi_269_ = 0f; phi_271_ = 0f; loop { @@ -39,11 +39,11 @@ fn function() { local = _e49; local_1 = _e47; if (_e45.member < _e45.member_1) { - phi_267_ = type_6((_e45.member + 1u), _e45.member_1); - phi_294_ = type_6(1u, _e45.member); + phi_267_ = type_5((_e45.member + 1u), _e45.member_1); + phi_294_ = type_5(1u, _e45.member); } else { phi_267_ = _e45; - phi_294_ = type_6(0u, type_6().member_1); + phi_294_ = type_5(0u, type_5().member_1); } let _e62 = phi_267_; let _e64 = phi_294_; diff --git a/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.spv b/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.spv index 80ed1bc4..9a7dd942 100644 Binary files a/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.spv and b/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.spv differ diff --git a/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.wgsl b/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.wgsl index b2cdaae9..cc8d82c9 100644 --- a/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.wgsl +++ b/crates/renderling/shaders/convolution-brdf_lut_convolution_vertex.wgsl @@ -8,8 +8,8 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: vec2; -var global_1: u32; +var global: u32; +var global_1: vec2; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); fn function() { @@ -17,7 +17,7 @@ fn function() { switch bitcast(0u) { default: { - let _e26 = global_1; + let _e26 = global; local = array(type_10(array(-1f, -1f, 0f), array(0f, 1f)), type_10(array(1f, -1f, 0f), array(1f, 1f)), type_10(array(1f, 1f, 0f), array(1f, 0f)), type_10(array(-1f, -1f, 0f), array(0f, 1f)), type_10(array(1f, 1f, 0f), array(1f, 0f)), type_10(array(-1f, 1f, 0f), array(0f, 0f))); if (_e26 < 6u) { } else { @@ -25,7 +25,7 @@ fn function() { } let _e30 = local[_e26].member; let _e33 = local[_e26].member_1; - global = vec2(_e33[0], _e33[1]); + global_1 = vec2(_e33[0], _e33[1]); global_2 = vec4(_e30[0], _e30[1], _e30[2], 1f); break; } @@ -35,11 +35,11 @@ fn function() { @vertex fn convolutionbrdf_lut_convolution_vertex(@builtin(vertex_index) param: u32) -> VertexOutput { - global_1 = param; + global = param; function(); let _e5 = global_2.y; global_2.y = -(_e5); - let _e7 = global; + let _e7 = global_1; let _e8 = global_2; return VertexOutput(_e7, _e8); } diff --git a/crates/renderling/shaders/convolution-generate_mipmap_vertex.spv b/crates/renderling/shaders/convolution-generate_mipmap_vertex.spv index 9920cd37..e8d8857c 100644 Binary files a/crates/renderling/shaders/convolution-generate_mipmap_vertex.spv and b/crates/renderling/shaders/convolution-generate_mipmap_vertex.spv differ diff --git a/crates/renderling/shaders/convolution-generate_mipmap_vertex.wgsl b/crates/renderling/shaders/convolution-generate_mipmap_vertex.wgsl index 4df4b270..dddba550 100644 --- a/crates/renderling/shaders/convolution-generate_mipmap_vertex.wgsl +++ b/crates/renderling/shaders/convolution-generate_mipmap_vertex.wgsl @@ -3,8 +3,8 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: vec2; -var global_1: u32; +var global: u32; +var global_1: vec2; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); fn function() { @@ -13,7 +13,7 @@ fn function() { switch bitcast(0u) { default: { - let _e22 = global_1; + let _e22 = global; local = array, 6>(vec2(0f, 1f), vec2(1f, 1f), vec2(1f, 0f), vec2(1f, 0f), vec2(0f, 0f), vec2(0f, 1f)); let _e23 = (_e22 < 6u); if _e23 { @@ -21,7 +21,7 @@ fn function() { break; } let _e25 = local[_e22]; - global = _e25; + global_1 = _e25; local_1 = 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)); if _e23 { } else { @@ -37,11 +37,11 @@ fn function() { @vertex fn convolutiongenerate_mipmap_vertex(@builtin(vertex_index) param: u32) -> VertexOutput { - global_1 = param; + global = param; function(); let _e5 = global_2.y; global_2.y = -(_e5); - let _e7 = global; + let _e7 = global_1; let _e8 = global_2; return VertexOutput(_e7, _e8); } diff --git a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.spv b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.spv index 07b728ce..5ded01d2 100644 Binary files a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.spv and b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.spv differ diff --git a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.wgsl b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.wgsl index 148b79c8..9698c2e6 100644 --- a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.wgsl +++ b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_fragment.wgsl @@ -1,4 +1,4 @@ -struct type_7 { +struct type_5 { member: u32, member_1: u32, } @@ -13,11 +13,11 @@ var global_4: texture_cube; fn function() { var phi_454_: vec3; - var phi_104_: type_7; + var phi_104_: type_5; var phi_107_: vec3; var phi_109_: f32; - var phi_105_: type_7; - var phi_132_: type_7; + var phi_105_: type_5; + var phi_132_: type_5; var phi_635_: vec3; var phi_670_: vec3; var phi_705_: vec3; @@ -44,7 +44,7 @@ fn function() { } let _e55 = phi_454_; let _e57 = (_e55.y * -1f); - phi_104_ = type_7(0u, 1024u); + phi_104_ = type_5(0u, 1024u); phi_107_ = vec3(0f, 0f, 0f); phi_109_ = 0f; loop { @@ -58,11 +58,11 @@ fn function() { local_4 = _e61; local_5 = _e63; if (_e59.member < _e59.member_1) { - phi_105_ = type_7((_e59.member + 1u), _e59.member_1); - phi_132_ = type_7(1u, _e59.member); + phi_105_ = type_5((_e59.member + 1u), _e59.member_1); + phi_132_ = type_5(1u, _e59.member); } else { phi_105_ = _e59; - phi_132_ = type_7(0u, type_7().member_1); + phi_132_ = type_5(0u, type_5().member_1); } let _e76 = phi_105_; let _e78 = phi_132_; diff --git a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.spv b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.spv index 03c5c9d5..a8e990ab 100644 Binary files a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.spv and b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.spv differ diff --git a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.wgsl b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.wgsl index 39e33527..7eca03a4 100644 --- a/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.wgsl +++ b/crates/renderling/shaders/convolution-prefilter_environment_cubemap_vertex.wgsl @@ -1,29 +1,30 @@ -struct type_10 { +struct type_3 { member: array, } -struct type_20 { +struct type_12 { + member: u32, + member_1: u32, +} + +struct type_21 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_21 { +struct type_22 { member: array, 8>, member_1: array, 6>, + member_2: vec3, } -struct type_22 { - member: type_20, - member_1: type_20, - member_2: type_21, - member_3: vec3, -} - -struct type_24 { - member: u32, - member_1: u32, +struct type_23 { + member: type_21, + member_1: type_21, + member_2: vec3, + member_3: type_22, } struct VertexOutput { @@ -32,9 +33,9 @@ struct VertexOutput { @builtin(position) member_2: vec4, } +var global: u32; @group(0) @binding(0) -var global: type_10; -var global_1: u32; +var global_1: type_3; var global_2: u32; var global_3: f32; var global_4: vec3; @@ -44,113 +45,113 @@ fn function() { var local: array, 8>; var local_1: array, 6>; var local_2: array, 36>; - var phi_783_: bool; - var phi_165_: type_24; - var phi_811_: bool; - var phi_326_: type_24; - var phi_327_: type_24; - var phi_350_: type_24; + var phi_796_: bool; + var phi_165_: type_12; + var phi_824_: bool; + var phi_326_: type_12; + var phi_327_: type_12; + var phi_350_: type_12; var phi_377_: bool; - var phi_383_: type_24; - var phi_384_: type_24; - var phi_407_: type_24; + var phi_383_: type_12; + var phi_384_: type_12; + var phi_407_: type_12; var phi_430_: bool; - var phi_438_: type_22; - var phi_843_: bool; - var phi_446_: f32; + var phi_451_: type_23; + var phi_856_: bool; + var phi_459_: f32; switch bitcast(0u) { default: { - let _e81 = global_1; - let _e82 = global_2; - let _e84 = arrayLength((&global.member)); + let _e84 = global_2; + let _e85 = global; + let _e87 = arrayLength((&global_1.member)); 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 (_e82 < 36u) { + if (_e85 < 36u) { } else { break; } - let _e87 = local_2[_e82]; - if (_e84 >= 2u) { - phi_783_ = (_e81 <= (_e84 - 2u)); + let _e90 = local_2[_e85]; + if (_e87 >= 2u) { + phi_796_ = (_e84 <= (_e87 - 2u)); } else { - phi_783_ = false; + phi_796_ = false; } - let _e92 = phi_783_; - if _e92 { - let _e95 = global.member[_e81]; - let _e99 = global.member[(_e81 + 1u)]; - phi_165_ = type_24(_e95, _e99); + let _e95 = phi_796_; + if _e95 { + let _e98 = global_1.member[_e84]; + let _e102 = global_1.member[(_e84 + 1u)]; + phi_165_ = type_12(_e98, _e102); } else { - phi_165_ = type_24(4294967295u, 4294967295u); + phi_165_ = type_12(4294967295u, 4294967295u); } - let _e102 = phi_165_; - if (_e84 >= 83u) { - phi_811_ = (_e102.member <= (_e84 - 83u)); + let _e105 = phi_165_; + if (_e87 >= 86u) { + phi_824_ = (_e105.member <= (_e87 - 86u)); } else { - phi_811_ = false; + phi_824_ = false; } - let _e109 = phi_811_; - if _e109 { - let _e112 = global.member[_e102.member]; - let _e117 = global.member[(_e102.member + 1u)]; - let _e122 = global.member[(_e102.member + 2u)]; - let _e127 = global.member[(_e102.member + 3u)]; - let _e133 = global.member[(_e102.member + 4u)]; - let _e138 = global.member[(_e102.member + 5u)]; - let _e143 = global.member[(_e102.member + 6u)]; - let _e148 = global.member[(_e102.member + 7u)]; - let _e154 = global.member[(_e102.member + 8u)]; - let _e159 = global.member[(_e102.member + 9u)]; - let _e164 = global.member[(_e102.member + 10u)]; - let _e169 = global.member[(_e102.member + 11u)]; - let _e175 = global.member[(_e102.member + 12u)]; - let _e180 = global.member[(_e102.member + 13u)]; - let _e185 = global.member[(_e102.member + 14u)]; - let _e190 = global.member[(_e102.member + 15u)]; - let _e197 = global.member[(_e102.member + 16u)]; - let _e202 = global.member[(_e102.member + 17u)]; - let _e207 = global.member[(_e102.member + 18u)]; - let _e212 = global.member[(_e102.member + 19u)]; - let _e218 = global.member[(_e102.member + 20u)]; - let _e223 = global.member[(_e102.member + 21u)]; - let _e228 = global.member[(_e102.member + 22u)]; - let _e233 = global.member[(_e102.member + 23u)]; - let _e239 = global.member[(_e102.member + 24u)]; - let _e244 = global.member[(_e102.member + 25u)]; - let _e249 = global.member[(_e102.member + 26u)]; - let _e254 = global.member[(_e102.member + 27u)]; - let _e260 = global.member[(_e102.member + 28u)]; - let _e265 = global.member[(_e102.member + 29u)]; - let _e270 = global.member[(_e102.member + 30u)]; - let _e275 = global.member[(_e102.member + 31u)]; - let _e282 = global.member[(_e102.member + 32u)]; - let _e287 = global.member[(_e102.member + 33u)]; - let _e292 = global.member[(_e102.member + 34u)]; + let _e112 = phi_824_; + if _e112 { + let _e115 = global_1.member[_e105.member]; + let _e120 = global_1.member[(_e105.member + 1u)]; + let _e125 = global_1.member[(_e105.member + 2u)]; + let _e130 = global_1.member[(_e105.member + 3u)]; + let _e136 = global_1.member[(_e105.member + 4u)]; + let _e141 = global_1.member[(_e105.member + 5u)]; + let _e146 = global_1.member[(_e105.member + 6u)]; + let _e151 = global_1.member[(_e105.member + 7u)]; + let _e157 = global_1.member[(_e105.member + 8u)]; + let _e162 = global_1.member[(_e105.member + 9u)]; + let _e167 = global_1.member[(_e105.member + 10u)]; + let _e172 = global_1.member[(_e105.member + 11u)]; + let _e178 = global_1.member[(_e105.member + 12u)]; + let _e183 = global_1.member[(_e105.member + 13u)]; + let _e188 = global_1.member[(_e105.member + 14u)]; + let _e193 = global_1.member[(_e105.member + 15u)]; + let _e200 = global_1.member[(_e105.member + 16u)]; + let _e205 = global_1.member[(_e105.member + 17u)]; + let _e210 = global_1.member[(_e105.member + 18u)]; + let _e215 = global_1.member[(_e105.member + 19u)]; + let _e221 = global_1.member[(_e105.member + 20u)]; + let _e226 = global_1.member[(_e105.member + 21u)]; + let _e231 = global_1.member[(_e105.member + 22u)]; + let _e236 = global_1.member[(_e105.member + 23u)]; + let _e242 = global_1.member[(_e105.member + 24u)]; + let _e247 = global_1.member[(_e105.member + 25u)]; + let _e252 = global_1.member[(_e105.member + 26u)]; + let _e257 = global_1.member[(_e105.member + 27u)]; + let _e263 = global_1.member[(_e105.member + 28u)]; + let _e268 = global_1.member[(_e105.member + 29u)]; + let _e273 = global_1.member[(_e105.member + 30u)]; + let _e278 = global_1.member[(_e105.member + 31u)]; + let _e285 = global_1.member[(_e105.member + 32u)]; + let _e290 = global_1.member[(_e105.member + 33u)]; + let _e295 = global_1.member[(_e105.member + 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_326_ = type_24(0u, 6u); + phi_326_ = type_12(0u, 6u); loop { - let _e297 = phi_326_; - if (_e297.member < _e297.member_1) { - phi_327_ = type_24((_e297.member + 1u), _e297.member_1); - phi_350_ = type_24(1u, _e297.member); + let _e300 = phi_326_; + if (_e300.member < _e300.member_1) { + phi_327_ = type_12((_e300.member + 1u), _e300.member_1); + phi_350_ = type_12(1u, _e300.member); } else { - phi_327_ = _e297; - phi_350_ = type_24(0u, type_24().member_1); + phi_327_ = _e300; + phi_350_ = type_12(0u, type_12().member_1); } - let _e310 = phi_327_; - let _e312 = phi_350_; - switch bitcast(_e312.member) { + let _e313 = phi_327_; + let _e315 = phi_350_; + switch bitcast(_e315.member) { case 0: { phi_377_ = false; break; } case 1: { - let _e317 = ((_e102.member + 35u) + (_e312.member_1 * 4u)); - let _e320 = global.member[_e317]; - let _e325 = global.member[(_e317 + 1u)]; - let _e330 = global.member[(_e317 + 2u)]; - let _e335 = global.member[(_e317 + 3u)]; - local_1[_e312.member_1] = vec4(bitcast(_e320), bitcast(_e325), bitcast(_e330), bitcast(_e335)); + let _e320 = ((_e105.member + 35u) + (_e315.member_1 * 4u)); + let _e323 = global_1.member[_e320]; + let _e328 = global_1.member[(_e320 + 1u)]; + let _e333 = global_1.member[(_e320 + 2u)]; + let _e338 = global_1.member[(_e320 + 3u)]; + local_1[_e315.member_1] = vec4(bitcast(_e323), bitcast(_e328), bitcast(_e333), bitcast(_e338)); phi_377_ = true; break; } @@ -159,38 +160,38 @@ fn function() { break; } } - let _e340 = phi_377_; + let _e343 = phi_377_; continue; continuing { - phi_326_ = _e310; - break if !(_e340); + phi_326_ = _e313; + break if !(_e343); } } - let _e342 = local_1; + let _e345 = 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_383_ = type_24(0u, 8u); + phi_383_ = type_12(0u, 8u); loop { - let _e345 = phi_383_; - if (_e345.member < _e345.member_1) { - phi_384_ = type_24((_e345.member + 1u), _e345.member_1); - phi_407_ = type_24(1u, _e345.member); + let _e348 = phi_383_; + if (_e348.member < _e348.member_1) { + phi_384_ = type_12((_e348.member + 1u), _e348.member_1); + phi_407_ = type_12(1u, _e348.member); } else { - phi_384_ = _e345; - phi_407_ = type_24(0u, type_24().member_1); + phi_384_ = _e348; + phi_407_ = type_12(0u, type_12().member_1); } - let _e358 = phi_384_; - let _e360 = phi_407_; - switch bitcast(_e360.member) { + let _e361 = phi_384_; + let _e363 = phi_407_; + switch bitcast(_e363.member) { case 0: { phi_430_ = false; break; } case 1: { - let _e365 = ((_e102.member + 59u) + (_e360.member_1 * 3u)); - let _e368 = global.member[_e365]; - let _e373 = global.member[(_e365 + 1u)]; - let _e378 = global.member[(_e365 + 2u)]; - local[_e360.member_1] = vec3(bitcast(_e368), bitcast(_e373), bitcast(_e378)); + let _e368 = ((_e105.member + 59u) + (_e363.member_1 * 3u)); + let _e371 = global_1.member[_e368]; + let _e376 = global_1.member[(_e368 + 1u)]; + let _e381 = global_1.member[(_e368 + 2u)]; + local[_e363.member_1] = vec3(bitcast(_e371), bitcast(_e376), bitcast(_e381)); phi_430_ = true; break; } @@ -199,35 +200,38 @@ fn function() { break; } } - let _e383 = phi_430_; + let _e386 = phi_430_; continue; continuing { - phi_383_ = _e358; - break if !(_e383); + phi_383_ = _e361; + break if !(_e386); } } - let _e385 = local; - phi_438_ = type_22(type_20(vec4(bitcast(_e112), bitcast(_e117), bitcast(_e122), bitcast(_e127)), vec4(bitcast(_e133), bitcast(_e138), bitcast(_e143), bitcast(_e148)), vec4(bitcast(_e154), bitcast(_e159), bitcast(_e164), bitcast(_e169)), vec4(bitcast(_e175), bitcast(_e180), bitcast(_e185), bitcast(_e190))), type_20(vec4(bitcast(_e197), bitcast(_e202), bitcast(_e207), bitcast(_e212)), vec4(bitcast(_e218), bitcast(_e223), bitcast(_e228), bitcast(_e233)), vec4(bitcast(_e239), bitcast(_e244), bitcast(_e249), bitcast(_e254)), vec4(bitcast(_e260), bitcast(_e265), bitcast(_e270), bitcast(_e275))), type_21(_e385, _e342), vec3(bitcast(_e282), bitcast(_e287), bitcast(_e292))); + let _e388 = local; + let _e392 = global_1.member[(_e105.member + 83u)]; + let _e397 = global_1.member[(_e105.member + 84u)]; + let _e402 = global_1.member[(_e105.member + 85u)]; + phi_451_ = type_23(type_21(vec4(bitcast(_e115), bitcast(_e120), bitcast(_e125), bitcast(_e130)), vec4(bitcast(_e136), bitcast(_e141), bitcast(_e146), bitcast(_e151)), vec4(bitcast(_e157), bitcast(_e162), bitcast(_e167), bitcast(_e172)), vec4(bitcast(_e178), bitcast(_e183), bitcast(_e188), bitcast(_e193))), type_21(vec4(bitcast(_e200), bitcast(_e205), bitcast(_e210), bitcast(_e215)), vec4(bitcast(_e221), bitcast(_e226), bitcast(_e231), bitcast(_e236)), vec4(bitcast(_e242), bitcast(_e247), bitcast(_e252), bitcast(_e257)), vec4(bitcast(_e263), bitcast(_e268), bitcast(_e273), bitcast(_e278))), vec3(bitcast(_e285), bitcast(_e290), bitcast(_e295)), type_22(_e388, _e345, vec3(bitcast(_e392), bitcast(_e397), bitcast(_e402)))); } else { - phi_438_ = 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_451_ = type_23(type_21(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_21(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), vec3(0f, 0f, 0f), type_22(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 _e389 = phi_438_; - if (_e84 >= 1u) { - phi_843_ = (_e102.member_1 <= (_e84 - 1u)); + let _e408 = phi_451_; + if (_e87 >= 1u) { + phi_856_ = (_e105.member_1 <= (_e87 - 1u)); } else { - phi_843_ = false; + phi_856_ = false; } - let _e396 = phi_843_; - if _e396 { - let _e399 = global.member[_e102.member_1]; - phi_446_ = bitcast(_e399); + let _e415 = phi_856_; + if _e415 { + let _e418 = global_1.member[_e105.member_1]; + phi_459_ = bitcast(_e418); } else { - phi_446_ = 0f; + phi_459_ = 0f; } - let _e402 = phi_446_; - global_3 = _e402; - global_4 = _e87; - global_5 = vec4((fma(fma(_e389.member.member_3.x, _e389.member_1.member_2.w, fma(_e389.member.member_2.x, _e389.member_1.member_2.z, fma(_e389.member.member.x, _e389.member_1.member_2.x, (_e389.member.member_1.x * _e389.member_1.member_2.y)))), _e87.z, fma(fma(_e389.member.member_3.x, _e389.member_1.member.w, fma(_e389.member.member_2.x, _e389.member_1.member.z, fma(_e389.member.member.x, _e389.member_1.member.x, (_e389.member.member_1.x * _e389.member_1.member.y)))), _e87.x, (fma(_e389.member.member_3.x, _e389.member_1.member_1.w, fma(_e389.member.member_2.x, _e389.member_1.member_1.z, fma(_e389.member.member.x, _e389.member_1.member_1.x, (_e389.member.member_1.x * _e389.member_1.member_1.y)))) * _e87.y))) + fma(_e389.member.member_3.x, _e389.member_1.member_3.w, fma(_e389.member.member_2.x, _e389.member_1.member_3.z, fma(_e389.member.member.x, _e389.member_1.member_3.x, (_e389.member.member_1.x * _e389.member_1.member_3.y))))), (fma(fma(_e389.member.member_3.y, _e389.member_1.member_2.w, fma(_e389.member.member_2.y, _e389.member_1.member_2.z, fma(_e389.member.member.y, _e389.member_1.member_2.x, (_e389.member.member_1.y * _e389.member_1.member_2.y)))), _e87.z, fma(fma(_e389.member.member_3.y, _e389.member_1.member.w, fma(_e389.member.member_2.y, _e389.member_1.member.z, fma(_e389.member.member.y, _e389.member_1.member.x, (_e389.member.member_1.y * _e389.member_1.member.y)))), _e87.x, (fma(_e389.member.member_3.y, _e389.member_1.member_1.w, fma(_e389.member.member_2.y, _e389.member_1.member_1.z, fma(_e389.member.member.y, _e389.member_1.member_1.x, (_e389.member.member_1.y * _e389.member_1.member_1.y)))) * _e87.y))) + fma(_e389.member.member_3.y, _e389.member_1.member_3.w, fma(_e389.member.member_2.y, _e389.member_1.member_3.z, fma(_e389.member.member.y, _e389.member_1.member_3.x, (_e389.member.member_1.y * _e389.member_1.member_3.y))))), (fma(fma(_e389.member.member_3.z, _e389.member_1.member_2.w, fma(_e389.member.member_2.z, _e389.member_1.member_2.z, fma(_e389.member.member.z, _e389.member_1.member_2.x, (_e389.member.member_1.z * _e389.member_1.member_2.y)))), _e87.z, fma(fma(_e389.member.member_3.z, _e389.member_1.member.w, fma(_e389.member.member_2.z, _e389.member_1.member.z, fma(_e389.member.member.z, _e389.member_1.member.x, (_e389.member.member_1.z * _e389.member_1.member.y)))), _e87.x, (fma(_e389.member.member_3.z, _e389.member_1.member_1.w, fma(_e389.member.member_2.z, _e389.member_1.member_1.z, fma(_e389.member.member.z, _e389.member_1.member_1.x, (_e389.member.member_1.z * _e389.member_1.member_1.y)))) * _e87.y))) + fma(_e389.member.member_3.z, _e389.member_1.member_3.w, fma(_e389.member.member_2.z, _e389.member_1.member_3.z, fma(_e389.member.member.z, _e389.member_1.member_3.x, (_e389.member.member_1.z * _e389.member_1.member_3.y))))), (fma(fma(_e389.member.member_3.w, _e389.member_1.member_2.w, fma(_e389.member.member_2.w, _e389.member_1.member_2.z, fma(_e389.member.member.w, _e389.member_1.member_2.x, (_e389.member.member_1.w * _e389.member_1.member_2.y)))), _e87.z, fma(fma(_e389.member.member_3.w, _e389.member_1.member.w, fma(_e389.member.member_2.w, _e389.member_1.member.z, fma(_e389.member.member.w, _e389.member_1.member.x, (_e389.member.member_1.w * _e389.member_1.member.y)))), _e87.x, (fma(_e389.member.member_3.w, _e389.member_1.member_1.w, fma(_e389.member.member_2.w, _e389.member_1.member_1.z, fma(_e389.member.member.w, _e389.member_1.member_1.x, (_e389.member.member_1.w * _e389.member_1.member_1.y)))) * _e87.y))) + fma(_e389.member.member_3.w, _e389.member_1.member_3.w, fma(_e389.member.member_2.w, _e389.member_1.member_3.z, fma(_e389.member.member.w, _e389.member_1.member_3.x, (_e389.member.member_1.w * _e389.member_1.member_3.y)))))); + let _e421 = phi_459_; + global_3 = _e421; + global_4 = _e90; + global_5 = vec4((fma(fma(_e408.member.member_3.x, _e408.member_1.member_2.w, fma(_e408.member.member_2.x, _e408.member_1.member_2.z, fma(_e408.member.member.x, _e408.member_1.member_2.x, (_e408.member.member_1.x * _e408.member_1.member_2.y)))), _e90.z, fma(fma(_e408.member.member_3.x, _e408.member_1.member.w, fma(_e408.member.member_2.x, _e408.member_1.member.z, fma(_e408.member.member.x, _e408.member_1.member.x, (_e408.member.member_1.x * _e408.member_1.member.y)))), _e90.x, (fma(_e408.member.member_3.x, _e408.member_1.member_1.w, fma(_e408.member.member_2.x, _e408.member_1.member_1.z, fma(_e408.member.member.x, _e408.member_1.member_1.x, (_e408.member.member_1.x * _e408.member_1.member_1.y)))) * _e90.y))) + fma(_e408.member.member_3.x, _e408.member_1.member_3.w, fma(_e408.member.member_2.x, _e408.member_1.member_3.z, fma(_e408.member.member.x, _e408.member_1.member_3.x, (_e408.member.member_1.x * _e408.member_1.member_3.y))))), (fma(fma(_e408.member.member_3.y, _e408.member_1.member_2.w, fma(_e408.member.member_2.y, _e408.member_1.member_2.z, fma(_e408.member.member.y, _e408.member_1.member_2.x, (_e408.member.member_1.y * _e408.member_1.member_2.y)))), _e90.z, fma(fma(_e408.member.member_3.y, _e408.member_1.member.w, fma(_e408.member.member_2.y, _e408.member_1.member.z, fma(_e408.member.member.y, _e408.member_1.member.x, (_e408.member.member_1.y * _e408.member_1.member.y)))), _e90.x, (fma(_e408.member.member_3.y, _e408.member_1.member_1.w, fma(_e408.member.member_2.y, _e408.member_1.member_1.z, fma(_e408.member.member.y, _e408.member_1.member_1.x, (_e408.member.member_1.y * _e408.member_1.member_1.y)))) * _e90.y))) + fma(_e408.member.member_3.y, _e408.member_1.member_3.w, fma(_e408.member.member_2.y, _e408.member_1.member_3.z, fma(_e408.member.member.y, _e408.member_1.member_3.x, (_e408.member.member_1.y * _e408.member_1.member_3.y))))), (fma(fma(_e408.member.member_3.z, _e408.member_1.member_2.w, fma(_e408.member.member_2.z, _e408.member_1.member_2.z, fma(_e408.member.member.z, _e408.member_1.member_2.x, (_e408.member.member_1.z * _e408.member_1.member_2.y)))), _e90.z, fma(fma(_e408.member.member_3.z, _e408.member_1.member.w, fma(_e408.member.member_2.z, _e408.member_1.member.z, fma(_e408.member.member.z, _e408.member_1.member.x, (_e408.member.member_1.z * _e408.member_1.member.y)))), _e90.x, (fma(_e408.member.member_3.z, _e408.member_1.member_1.w, fma(_e408.member.member_2.z, _e408.member_1.member_1.z, fma(_e408.member.member.z, _e408.member_1.member_1.x, (_e408.member.member_1.z * _e408.member_1.member_1.y)))) * _e90.y))) + fma(_e408.member.member_3.z, _e408.member_1.member_3.w, fma(_e408.member.member_2.z, _e408.member_1.member_3.z, fma(_e408.member.member.z, _e408.member_1.member_3.x, (_e408.member.member_1.z * _e408.member_1.member_3.y))))), (fma(fma(_e408.member.member_3.w, _e408.member_1.member_2.w, fma(_e408.member.member_2.w, _e408.member_1.member_2.z, fma(_e408.member.member.w, _e408.member_1.member_2.x, (_e408.member.member_1.w * _e408.member_1.member_2.y)))), _e90.z, fma(fma(_e408.member.member_3.w, _e408.member_1.member.w, fma(_e408.member.member_2.w, _e408.member_1.member.z, fma(_e408.member.member.w, _e408.member_1.member.x, (_e408.member.member_1.w * _e408.member_1.member.y)))), _e90.x, (fma(_e408.member.member_3.w, _e408.member_1.member_1.w, fma(_e408.member.member_2.w, _e408.member_1.member_1.z, fma(_e408.member.member.w, _e408.member_1.member_1.x, (_e408.member.member_1.w * _e408.member_1.member_1.y)))) * _e90.y))) + fma(_e408.member.member_3.w, _e408.member_1.member_3.w, fma(_e408.member.member_2.w, _e408.member_1.member_3.z, fma(_e408.member.member.w, _e408.member_1.member_3.x, (_e408.member.member_1.w * _e408.member_1.member_3.y)))))); break; } } @@ -236,8 +240,8 @@ fn function() { @vertex fn convolutionprefilter_environment_cubemap_vertex(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { - global_1 = param; - global_2 = param_1; + global_2 = param; + global = param_1; function(); let _e8 = global_5.y; global_5.y = -(_e8); diff --git a/crates/renderling/shaders/cubemap-cubemap_sampling_test_fragment.spv b/crates/renderling/shaders/cubemap-cubemap_sampling_test_fragment.spv new file mode 100644 index 00000000..6ece1052 Binary files /dev/null and b/crates/renderling/shaders/cubemap-cubemap_sampling_test_fragment.spv differ diff --git a/crates/renderling/shaders/cubemap-cubemap_sampling_test_fragment.wgsl b/crates/renderling/shaders/cubemap-cubemap_sampling_test_fragment.wgsl new file mode 100644 index 00000000..709fdc59 --- /dev/null +++ b/crates/renderling/shaders/cubemap-cubemap_sampling_test_fragment.wgsl @@ -0,0 +1,21 @@ +@group(0) @binding(2) +var global: sampler; +var global_1: vec4; +var global_2: vec3; +@group(0) @binding(1) +var global_3: texture_cube; + +fn function() { + let _e4 = global_2; + let _e5 = textureSample(global_3, global, _e4); + global_1 = _e5; + return; +} + +@fragment +fn cubemapcubemap_sampling_test_fragment(@location(0) param: vec3) -> @location(0) vec4 { + global_2 = param; + function(); + let _e3 = global_1; + return _e3; +} diff --git a/crates/renderling/shaders/cubemap-cubemap_sampling_test_vertex.spv b/crates/renderling/shaders/cubemap-cubemap_sampling_test_vertex.spv new file mode 100644 index 00000000..07a2fe23 Binary files /dev/null and b/crates/renderling/shaders/cubemap-cubemap_sampling_test_vertex.spv differ diff --git a/crates/renderling/shaders/cubemap-cubemap_sampling_test_vertex.wgsl b/crates/renderling/shaders/cubemap-cubemap_sampling_test_vertex.wgsl new file mode 100644 index 00000000..f091122c --- /dev/null +++ b/crates/renderling/shaders/cubemap-cubemap_sampling_test_vertex.wgsl @@ -0,0 +1,47 @@ +struct type_11 { + member: vec3, +} + +struct VertexOutput { + @location(0) member: vec3, + @builtin(position) member_1: vec4, +} + +var global: u32; +@group(0) @binding(0) +var global_1: type_11; +var global_2: vec4 = vec4(0f, 0f, 0f, 1f); +var global_3: vec3; + +fn function() { + var local: array, 6>; + + switch bitcast(0u) { + default: { + let _e16 = global; + let _e18 = (_e16 % 6u); + 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)); + if (_e18 < 6u) { + } else { + break; + } + let _e21 = local[_e18]; + global_2 = _e21; + let _e22 = global_1.member; + global_3 = _e22; + break; + } + } + return; +} + +@vertex +fn cubemapcubemap_sampling_test_vertex(@builtin(vertex_index) param: u32) -> VertexOutput { + global = param; + function(); + let _e5 = global_2.y; + global_2.y = -(_e5); + let _e7 = global_3; + let _e8 = global_2; + return VertexOutput(_e7, _e8); +} diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv index f5540eb6..8cb6058c 100644 Binary files a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv and b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.spv differ diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl index 1f9e813d..6f3f8cc0 100644 --- a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl +++ b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid.wgsl @@ -1,22 +1,22 @@ -struct type_5 { +struct type_2 { member: array, } -struct type_8 { +struct type_9 { member: u32, member_1: u32, } var global: vec3; @group(0) @binding(0) -var global_1: type_5; +var global_1: type_2; @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_211_: type_9; var phi_338_: u32; let _e15 = arrayLength((&global_1.member)); @@ -46,9 +46,9 @@ fn function() { if _e55 { let _e58 = global_1.member[_e50]; let _e62 = global_1.member[(_e50 + 1u)]; - phi_211_ = type_8(_e58, _e62); + phi_211_ = type_9(_e58, _e62); } else { - phi_211_ = type_8(4294967295u, 0u); + phi_211_ = type_9(4294967295u, 0u); } let _e65 = phi_211_; let _e71 = ((_e16.y * (_e19 >> bitcast(0u))) + _e16.x); @@ -63,7 +63,7 @@ fn function() { return; } -@compute @workgroup_size(32, 32, 1) +@compute @workgroup_size(16, 16, 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 index 26d47eaf..01754b01 100644 Binary files a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv and b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.spv differ diff --git a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl index 62888d80..46fd0a5d 100644 --- a/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl +++ b/crates/renderling/shaders/cull-compute_copy_depth_to_pyramid_multisampled.wgsl @@ -1,22 +1,22 @@ -struct type_5 { +struct type_2 { member: array, } -struct type_8 { +struct type_9 { member: u32, member_1: u32, } var global: vec3; @group(0) @binding(0) -var global_1: type_5; +var global_1: type_2; @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_233_: type_9; var phi_338_: u32; let _e15 = arrayLength((&global_1.member)); @@ -46,9 +46,9 @@ fn function() { if _e55 { let _e58 = global_1.member[_e50]; let _e62 = global_1.member[(_e50 + 1u)]; - phi_233_ = type_8(_e58, _e62); + phi_233_ = type_9(_e58, _e62); } else { - phi_233_ = type_8(4294967295u, 0u); + phi_233_ = type_9(4294967295u, 0u); } let _e65 = phi_233_; let _e71 = ((_e16.y * (_e19 >> bitcast(0u))) + _e16.x); @@ -63,7 +63,7 @@ fn function() { return; } -@compute @workgroup_size(32, 32, 1) +@compute @workgroup_size(16, 16, 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 index 76c52bfc..954339f2 100644 Binary files a/crates/renderling/shaders/cull-compute_culling.spv and b/crates/renderling/shaders/cull-compute_culling.spv differ diff --git a/crates/renderling/shaders/cull-compute_culling.wgsl b/crates/renderling/shaders/cull-compute_culling.wgsl index 29195b56..9b2f8cd3 100644 --- a/crates/renderling/shaders/cull-compute_culling.wgsl +++ b/crates/renderling/shaders/cull-compute_culling.wgsl @@ -1,51 +1,51 @@ -struct type_9 { +struct type_2 { member: array, } -struct type_15 { +struct type_12 { + member: u32, + member_1: u32, +} + +struct type_17 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_16 { +struct type_18 { member: array, 8>, member_1: array, 6>, -} - -struct type_17 { - member: type_15, - member_1: type_15, - member_2: type_16, - member_3: vec3, + member_2: vec3, } struct type_19 { - member: u32, - member_1: u32, + member: type_17, + member_1: type_17, + member_2: vec3, + member_3: type_18, } -struct type_23 { +struct type_24 { member: u32, member_1: u32, member_2: u32, member_3: u32, } -struct type_25 { - member: array, +struct type_26 { + member: array, } struct type_31 { member: vec2, member_1: vec2, - member_2: type_19, - member_3: u32, + member_2: u32, + member_3: bool, member_4: bool, member_5: bool, member_6: bool, - member_7: bool, } struct type_32 { @@ -60,11 +60,11 @@ struct type_33 { } @group(0) @binding(0) -var global: type_9; +var global: type_2; @group(0) @binding(1) -var global_1: type_9; +var global_1: type_2; @group(0) @binding(2) -var global_2: type_25; +var global_2: type_26; var global_3: vec3; fn function() { @@ -76,776 +76,777 @@ fn function() { 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_2131_: bool; - var phi_832_: type_19; - var phi_833_: type_19; - var phi_856_: type_19; - var phi_883_: bool; - var phi_889_: type_19; - var phi_890_: type_19; - var phi_913_: type_19; - var phi_936_: bool; - var phi_944_: type_17; - var phi_2163_: bool; - var phi_995_: type_32; - var phi_1127_: type_19; - var phi_1128_: type_19; - var phi_1151_: type_19; - var phi_1195_: bool; - var phi_1199_: bool; - var phi_1200_: bool; - var phi_2727_: bool; - var phi_2032_: bool; - var phi_2754_: bool; - var phi_1207_: type_19; - var phi_1208_: type_19; - var phi_1231_: type_19; - var phi_1241_: type_19; - var phi_1244_: i32; - var phi_1242_: type_19; - var phi_1267_: type_19; - var phi_1308_: i32; - var phi_1245_: i32; - var phi_1309_: bool; - var phi_2748_: bool; + var phi_628_: u32; + var phi_647_: type_31; + var phi_2090_: bool; + var phi_812_: type_12; + var phi_813_: type_12; + var phi_836_: type_12; + var phi_863_: bool; + var phi_869_: type_12; + var phi_870_: type_12; + var phi_893_: type_12; + var phi_916_: bool; + var phi_937_: type_19; + var phi_2122_: bool; + var phi_988_: type_32; + var phi_1120_: type_12; + var phi_1121_: type_12; + var phi_1144_: type_12; + var phi_1188_: bool; + var phi_1192_: bool; + var phi_1193_: bool; + var phi_2686_: bool; + var phi_2008_: bool; + var phi_2713_: bool; + var phi_1200_: type_12; + var phi_1201_: type_12; + var phi_1224_: type_12; + var phi_1234_: type_12; + var phi_1237_: i32; + var phi_1235_: type_12; + var phi_1260_: type_12; + var phi_1301_: i32; + var phi_1238_: i32; + var phi_1302_: bool; + var phi_2707_: bool; var local_8: i32; - var phi_1316_: type_19; - var phi_1319_: i32; - var phi_1317_: type_19; - var phi_1342_: type_19; - var phi_1383_: i32; - var phi_1320_: i32; - var phi_1384_: bool; - var phi_2755_: bool; + var phi_1309_: type_12; + var phi_1312_: i32; + var phi_1310_: type_12; + var phi_1335_: type_12; + var phi_1376_: i32; + var phi_1313_: i32; + var phi_1377_: bool; + var phi_2714_: bool; var local_9: i32; - var phi_2762_: bool; - var phi_1390_: bool; - var phi_1391_: bool; - var phi_2761_: bool; - var phi_1392_: bool; - var phi_1393_: bool; - var phi_1394_: bool; - var phi_1395_: bool; - var phi_2760_: bool; - var phi_2035_: bool; - var phi_2034_: bool; - var phi_2033_: bool; + var phi_2721_: bool; + var phi_1383_: bool; + var phi_1384_: bool; + var phi_2720_: bool; + var phi_1385_: bool; + var phi_1386_: bool; + var phi_1387_: bool; + var phi_1388_: bool; + var phi_2719_: bool; + var phi_2011_: bool; + var phi_2010_: bool; + var phi_2009_: bool; + var phi_1411_: type_33; + var phi_1412_: type_33; + var local_10: u32; var phi_1418_: type_33; var phi_1419_: type_33; - var local_10: u32; - var phi_1425_: type_33; - var phi_1426_: type_33; - var phi_1690_: u32; - var phi_2546_: bool; - var phi_1708_: type_19; - var phi_2572_: u32; + var phi_1683_: u32; + var phi_2505_: bool; + var phi_1701_: type_12; + var phi_2531_: 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))) { + let _e93 = arrayLength((&global.member)); + let _e95 = arrayLength((&global_1.member)); + let _e98 = global_3; + if (_e98.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) { + let _e104 = global_2.member[_e98.x].member_3; + let _e107 = global.member[_e104]; + let _e112 = global.member[(_e104 + 2u)]; + let _e116 = global.member[(_e104 + 3u)]; + let _e117 = bitcast(_e116); + let _e121 = global.member[(_e104 + 4u)]; + let _e122 = bitcast(_e121); + let _e126 = global.member[(_e104 + 5u)]; + let _e127 = bitcast(_e126); + let _e131 = global.member[(_e104 + 6u)]; + let _e132 = bitcast(_e131); + let _e136 = global.member[(_e104 + 7u)]; + let _e140 = global.member[(_e104 + 8u)]; + let _e144 = global.member[(_e104 + 9u)]; + let _e148 = global.member[(_e104 + 10u)]; + global_2.member[_e98.x].member = select(_e140, _e112, (_e136 == 4294967295u)); + global_2.member[_e98.x].member_1 = select(0u, 1u, (_e107 == 1u)); + if (_e132 == 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) { + if select(false, true, (_e93 >= 9u)) { + let _e163 = global.member[0u]; + let _e166 = global.member[1u]; + let _e170 = global.member[2u]; + let _e173 = global.member[3u]; + let _e177 = global.member[4u]; + switch bitcast(_e177) { case 0: { - phi_631_ = 0u; + phi_628_ = 0u; break; } case 1: { - phi_631_ = 1u; + phi_628_ = 1u; break; } case 2: { - phi_631_ = 2u; + phi_628_ = 2u; break; } case 3: { - phi_631_ = 3u; + phi_628_ = 3u; break; } case 4: { - phi_631_ = 4u; + phi_628_ = 4u; break; } case 5: { - phi_631_ = 5u; + phi_628_ = 5u; break; } case 6: { - phi_631_ = 6u; + phi_628_ = 6u; break; } case 7: { - phi_631_ = 7u; + phi_628_ = 7u; break; } case 8: { - phi_631_ = 8u; + phi_628_ = 8u; break; } case 9: { - phi_631_ = 9u; + phi_628_ = 9u; break; } case 10: { - phi_631_ = 10u; + phi_628_ = 10u; break; } case 11: { - phi_631_ = 11u; + phi_628_ = 11u; break; } case 12: { - phi_631_ = 12u; + phi_628_ = 12u; break; } case 13: { - phi_631_ = 13u; + phi_628_ = 13u; break; } case 14: { - phi_631_ = 14u; + phi_628_ = 14u; break; } case 15: { - phi_631_ = 15u; + phi_628_ = 15u; break; } case 16: { - phi_631_ = 16u; + phi_628_ = 16u; break; } case 17: { - phi_631_ = 17u; + phi_628_ = 17u; break; } case 18: { - phi_631_ = 18u; + phi_628_ = 18u; break; } case 19: { - phi_631_ = 19u; + phi_628_ = 19u; break; } default: { - phi_631_ = 0u; + phi_628_ = 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)); + let _e180 = phi_628_; + let _e183 = global.member[5u]; + let _e187 = global.member[6u]; + let _e191 = global.member[7u]; + let _e195 = global.member[8u]; + phi_647_ = type_31(vec2(_e163, _e166), vec2(_e170, _e173), _e180, (_e183 == 1u), (_e187 == 1u), (_e191 == 1u), (_e195 == 1u)); } else { - phi_667_ = type_31(vec2(0u, 0u), vec2(1u, 1u), type_19(4294967295u, 0u), 0u, true, true, true, false); + phi_647_ = type_31(vec2(0u, 0u), vec2(1u, 1u), 0u, true, true, true, false); } - let _e203 = phi_667_; - if _e203.member_6 { - if (_e90 >= 83u) { - phi_2131_ = (_e141 <= (_e90 - 83u)); + let _e199 = phi_647_; + if _e199.member_5 { + if (_e93 >= 86u) { + phi_2090_ = (_e144 <= (_e93 - 86u)); } else { - phi_2131_ = false; + phi_2090_ = false; } - let _e209 = phi_2131_; - 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)]; + let _e205 = phi_2090_; + if _e205 { + let _e208 = global.member[_e144]; + let _e213 = global.member[(_e144 + 1u)]; + let _e218 = global.member[(_e144 + 2u)]; + let _e223 = global.member[(_e144 + 3u)]; + let _e229 = global.member[(_e144 + 4u)]; + let _e234 = global.member[(_e144 + 5u)]; + let _e239 = global.member[(_e144 + 6u)]; + let _e244 = global.member[(_e144 + 7u)]; + let _e250 = global.member[(_e144 + 8u)]; + let _e255 = global.member[(_e144 + 9u)]; + let _e260 = global.member[(_e144 + 10u)]; + let _e265 = global.member[(_e144 + 11u)]; + let _e271 = global.member[(_e144 + 12u)]; + let _e276 = global.member[(_e144 + 13u)]; + let _e281 = global.member[(_e144 + 14u)]; + let _e286 = global.member[(_e144 + 15u)]; + let _e293 = global.member[(_e144 + 16u)]; + let _e298 = global.member[(_e144 + 17u)]; + let _e303 = global.member[(_e144 + 18u)]; + let _e308 = global.member[(_e144 + 19u)]; + let _e314 = global.member[(_e144 + 20u)]; + let _e319 = global.member[(_e144 + 21u)]; + let _e324 = global.member[(_e144 + 22u)]; + let _e329 = global.member[(_e144 + 23u)]; + let _e335 = global.member[(_e144 + 24u)]; + let _e340 = global.member[(_e144 + 25u)]; + let _e345 = global.member[(_e144 + 26u)]; + let _e350 = global.member[(_e144 + 27u)]; + let _e356 = global.member[(_e144 + 28u)]; + let _e361 = global.member[(_e144 + 29u)]; + let _e366 = global.member[(_e144 + 30u)]; + let _e371 = global.member[(_e144 + 31u)]; + let _e378 = global.member[(_e144 + 32u)]; + let _e383 = global.member[(_e144 + 33u)]; + let _e388 = global.member[(_e144 + 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); + phi_812_ = type_12(0u, 6u); loop { - let _e397 = phi_832_; - if (_e397.member < _e397.member_1) { - phi_833_ = type_19((_e397.member + 1u), _e397.member_1); - phi_856_ = type_19(1u, _e397.member); + let _e393 = phi_812_; + if (_e393.member < _e393.member_1) { + phi_813_ = type_12((_e393.member + 1u), _e393.member_1); + phi_836_ = type_12(1u, _e393.member); } else { - phi_833_ = _e397; - phi_856_ = type_19(0u, type_19().member_1); + phi_813_ = _e393; + phi_836_ = type_12(0u, type_12().member_1); } - let _e410 = phi_833_; - let _e412 = phi_856_; - switch bitcast(_e412.member) { + let _e406 = phi_813_; + let _e408 = phi_836_; + switch bitcast(_e408.member) { case 0: { - phi_883_ = false; + phi_863_ = 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_883_ = true; + let _e413 = ((_e144 + 35u) + (_e408.member_1 * 4u)); + let _e416 = global.member[_e413]; + let _e421 = global.member[(_e413 + 1u)]; + let _e426 = global.member[(_e413 + 2u)]; + let _e431 = global.member[(_e413 + 3u)]; + local_7[_e408.member_1] = vec4(bitcast(_e416), bitcast(_e421), bitcast(_e426), bitcast(_e431)); + phi_863_ = true; break; } default: { - phi_883_ = bool(); + phi_863_ = bool(); break; } } - let _e440 = phi_883_; + let _e436 = phi_863_; continue; continuing { - phi_832_ = _e410; - break if !(_e440); + phi_812_ = _e406; + break if !(_e436); } } - let _e442 = local_7; + let _e438 = 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_889_ = type_19(0u, 8u); + phi_869_ = type_12(0u, 8u); loop { - let _e445 = phi_889_; - if (_e445.member < _e445.member_1) { - phi_890_ = type_19((_e445.member + 1u), _e445.member_1); - phi_913_ = type_19(1u, _e445.member); + let _e441 = phi_869_; + if (_e441.member < _e441.member_1) { + phi_870_ = type_12((_e441.member + 1u), _e441.member_1); + phi_893_ = type_12(1u, _e441.member); } else { - phi_890_ = _e445; - phi_913_ = type_19(0u, type_19().member_1); + phi_870_ = _e441; + phi_893_ = type_12(0u, type_12().member_1); } - let _e458 = phi_890_; - let _e460 = phi_913_; - switch bitcast(_e460.member) { + let _e454 = phi_870_; + let _e456 = phi_893_; + switch bitcast(_e456.member) { case 0: { - phi_936_ = false; + phi_916_ = 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_936_ = true; + let _e461 = ((_e144 + 59u) + (_e456.member_1 * 3u)); + let _e464 = global.member[_e461]; + let _e469 = global.member[(_e461 + 1u)]; + let _e474 = global.member[(_e461 + 2u)]; + local_6[_e456.member_1] = vec3(bitcast(_e464), bitcast(_e469), bitcast(_e474)); + phi_916_ = true; break; } default: { - phi_936_ = bool(); + phi_916_ = bool(); break; } } - let _e483 = phi_936_; + let _e479 = phi_916_; continue; continuing { - phi_889_ = _e458; - break if !(_e483); + phi_869_ = _e454; + break if !(_e479); } } - let _e485 = local_6; - phi_944_ = 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))); + let _e481 = local_6; + let _e485 = global.member[(_e144 + 83u)]; + let _e490 = global.member[(_e144 + 84u)]; + let _e495 = global.member[(_e144 + 85u)]; + phi_937_ = type_19(type_17(vec4(bitcast(_e208), bitcast(_e213), bitcast(_e218), bitcast(_e223)), vec4(bitcast(_e229), bitcast(_e234), bitcast(_e239), bitcast(_e244)), vec4(bitcast(_e250), bitcast(_e255), bitcast(_e260), bitcast(_e265)), vec4(bitcast(_e271), bitcast(_e276), bitcast(_e281), bitcast(_e286))), type_17(vec4(bitcast(_e293), bitcast(_e298), bitcast(_e303), bitcast(_e308)), vec4(bitcast(_e314), bitcast(_e319), bitcast(_e324), bitcast(_e329)), vec4(bitcast(_e335), bitcast(_e340), bitcast(_e345), bitcast(_e350)), vec4(bitcast(_e356), bitcast(_e361), bitcast(_e366), bitcast(_e371))), vec3(bitcast(_e378), bitcast(_e383), bitcast(_e388)), type_18(_e481, _e438, vec3(bitcast(_e485), bitcast(_e490), bitcast(_e495)))); } else { - phi_944_ = 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)); + phi_937_ = type_19(type_17(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_17(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), vec3(0f, 0f, 0f), type_18(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_944_; - if (_e90 >= 10u) { - phi_2163_ = (_e145 <= (_e90 - 10u)); + let _e501 = phi_937_; + if (_e93 >= 10u) { + phi_2122_ = (_e148 <= (_e93 - 10u)); } else { - phi_2163_ = false; + phi_2122_ = false; } - let _e497 = phi_2163_; - 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_995_ = 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))); + let _e511 = phi_2122_; + if _e511 { + let _e514 = global.member[_e148]; + let _e519 = global.member[(_e148 + 1u)]; + let _e524 = global.member[(_e148 + 2u)]; + let _e530 = global.member[(_e148 + 3u)]; + let _e535 = global.member[(_e148 + 4u)]; + let _e540 = global.member[(_e148 + 5u)]; + let _e545 = global.member[(_e148 + 6u)]; + let _e551 = global.member[(_e148 + 7u)]; + let _e556 = global.member[(_e148 + 8u)]; + let _e561 = global.member[(_e148 + 9u)]; + phi_988_ = type_32(vec3(bitcast(_e514), bitcast(_e519), bitcast(_e524)), vec4(bitcast(_e530), bitcast(_e535), bitcast(_e540), bitcast(_e545)), vec3(bitcast(_e551), bitcast(_e556), bitcast(_e561))); } else { - phi_995_ = type_32(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_988_ = type_32(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e552 = phi_995_; - 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_1426_ = type_33(true, 0u); + let _e566 = phi_988_; + let _e574 = (_e566.member_1.x + _e566.member_1.x); + let _e575 = (_e566.member_1.y + _e566.member_1.y); + let _e576 = (_e566.member_1.z + _e566.member_1.z); + let _e578 = (_e566.member_1.z * _e576); + let _e579 = (_e566.member_1.w * _e574); + let _e580 = (_e566.member_1.w * _e575); + let _e581 = (_e566.member_1.w * _e576); + let _e601 = (vec4((1f - fma(_e566.member_1.y, _e575, _e578)), fma(_e566.member_1.x, _e575, _e581), fma(_e566.member_1.x, _e576, -(_e580)), 0f) * _e566.member_2.x); + let _e603 = (vec4(fma(_e566.member_1.x, _e575, -(_e581)), (1f - fma(_e566.member_1.x, _e574, _e578)), fma(_e566.member_1.y, _e576, _e579), 0f) * _e566.member_2.y); + let _e605 = (vec4(fma(_e566.member_1.x, _e576, _e580), fma(_e566.member_1.y, _e576, -(_e579)), (1f - fma(_e566.member_1.x, _e574, (_e566.member_1.y * _e575))), 0f) * _e566.member_2.z); + let _e627 = (_e566.member.x + fma(_e605.x, _e127, fma(_e603.x, _e122, (_e601.x * _e117)))); + let _e628 = (_e566.member.y + fma(_e605.y, _e127, fma(_e603.y, _e122, (_e601.y * _e117)))); + let _e629 = (_e566.member.z + fma(_e605.z, _e127, fma(_e603.z, _e122, (_e601.z * _e117)))); + let _e630 = vec3(_e627, _e628, _e629); + let _e633 = (max(_e566.member_2.x, max(_e566.member_2.y, _e566.member_2.z)) * _e132); + let _e635 = sqrt((_e633 * _e633)); + local_1 = _e501.member_3.member; + local = _e501.member_3.member_1; + let _e638 = local[0u][0u]; + let _e641 = local[0u][1u]; + let _e646 = local[0u][2u]; + let _e650 = local[0u][3u]; + let _e652 = -(_e635); + if ((fma(_e646, _e629, fma(_e638, _e627, (_e641 * _e628))) + _e650) < _e652) { + phi_1419_ = type_33(true, 0u); } else { - phi_1127_ = type_19(0u, 6u); + phi_1120_ = type_12(0u, 6u); loop { - let _e643 = phi_1127_; - if (_e643.member < _e643.member_1) { - phi_1128_ = type_19((_e643.member + 1u), _e643.member_1); - phi_1151_ = type_19(1u, _e643.member); + let _e655 = phi_1120_; + if (_e655.member < _e655.member_1) { + phi_1121_ = type_12((_e655.member + 1u), _e655.member_1); + phi_1144_ = type_12(1u, _e655.member); } else { - phi_1128_ = _e643; - phi_1151_ = type_19(0u, type_19().member_1); + phi_1121_ = _e655; + phi_1144_ = type_12(0u, type_12().member_1); } - let _e656 = phi_1128_; - let _e658 = phi_1151_; - local_10 = _e658.member_1; - switch bitcast(_e658.member) { + let _e668 = phi_1121_; + let _e670 = phi_1144_; + local_10 = _e670.member_1; + switch bitcast(_e670.member) { case 0: { - phi_1199_ = false; - phi_1200_ = true; + phi_1192_ = false; + phi_1193_ = true; break; } case 1: { - if (_e658.member_1 != 0u) { - if (_e658.member_1 < 6u) { + if (_e670.member_1 != 0u) { + if (_e670.member_1 < 6u) { } else { - phi_2727_ = true; - phi_2032_ = bool(); + phi_2686_ = true; + phi_2008_ = 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_1195_ = select(true, false, ((fma(_e674, _e615, fma(_e666, _e613, (_e669 * _e614))) + _e678) < _e640)); + let _e678 = local[_e670.member_1][0u]; + let _e681 = local[_e670.member_1][1u]; + let _e686 = local[_e670.member_1][2u]; + let _e690 = local[_e670.member_1][3u]; + phi_1188_ = select(true, false, ((fma(_e686, _e629, fma(_e678, _e627, (_e681 * _e628))) + _e690) < _e652)); } else { - phi_1195_ = true; + phi_1188_ = true; } - let _e683 = phi_1195_; - phi_1199_ = _e683; - phi_1200_ = false; + let _e695 = phi_1188_; + phi_1192_ = _e695; + phi_1193_ = false; break; } default: { - phi_1199_ = bool(); - phi_1200_ = bool(); + phi_1192_ = bool(); + phi_1193_ = bool(); break; } } - let _e685 = phi_1199_; - let _e687 = phi_1200_; + let _e697 = phi_1192_; + let _e699 = phi_1193_; continue; continuing { - phi_1127_ = _e656; - phi_2727_ = false; - phi_2032_ = _e687; - break if !(_e685); + phi_1120_ = _e668; + phi_2686_ = false; + phi_2008_ = _e699; + break if !(_e697); } } - let _e690 = phi_2727_; - let _e692 = phi_2032_; - if _e690 { + let _e702 = phi_2686_; + let _e704 = phi_2008_; + if _e702 { break; } - if _e692 { - let _e693 = vec3(_e621); - let _e694 = (_e616 - _e693); - let _e695 = (_e616 + _e693); - phi_2754_ = _e690; - phi_1207_ = type_19(0u, 3u); + if _e704 { + let _e705 = vec3(_e635); + let _e706 = (_e630 - _e705); + let _e707 = (_e630 + _e705); + phi_2713_ = _e702; + phi_1200_ = type_12(0u, 3u); loop { - let _e697 = phi_2754_; - let _e699 = phi_1207_; - if (_e699.member < _e699.member_1) { - phi_1208_ = type_19((_e699.member + 1u), _e699.member_1); - phi_1231_ = type_19(1u, _e699.member); + let _e709 = phi_2713_; + let _e711 = phi_1200_; + if (_e711.member < _e711.member_1) { + phi_1201_ = type_12((_e711.member + 1u), _e711.member_1); + phi_1224_ = type_12(1u, _e711.member); } else { - phi_1208_ = _e699; - phi_1231_ = type_19(0u, type_19().member_1); + phi_1201_ = _e711; + phi_1224_ = type_12(0u, type_12().member_1); } - let _e712 = phi_1208_; - let _e714 = phi_1231_; - switch bitcast(_e714.member) { + let _e724 = phi_1201_; + let _e726 = phi_1224_; + switch bitcast(_e726.member) { case 0: { - phi_2761_ = _e697; - phi_1392_ = false; - phi_1393_ = true; - phi_1394_ = false; - phi_1395_ = false; + phi_2720_ = _e709; + phi_1385_ = false; + phi_1386_ = true; + phi_1387_ = false; + phi_1388_ = false; break; } case 1: { - phi_1241_ = type_19(0u, 8u); - phi_1244_ = 0i; + phi_1234_ = type_12(0u, 8u); + phi_1237_ = 0i; loop { - let _e719 = phi_1241_; - let _e721 = phi_1244_; - local_8 = _e721; - if (_e719.member < _e719.member_1) { - phi_1242_ = type_19((_e719.member + 1u), _e719.member_1); - phi_1267_ = type_19(1u, _e719.member); + let _e731 = phi_1234_; + let _e733 = phi_1237_; + local_8 = _e733; + if (_e731.member < _e731.member_1) { + phi_1235_ = type_12((_e731.member + 1u), _e731.member_1); + phi_1260_ = type_12(1u, _e731.member); } else { - phi_1242_ = _e719; - phi_1267_ = type_19(0u, type_19().member_1); + phi_1235_ = _e731; + phi_1260_ = type_12(0u, type_12().member_1); } - let _e734 = phi_1242_; - let _e736 = phi_1267_; - switch bitcast(_e736.member) { + let _e746 = phi_1235_; + let _e748 = phi_1260_; + switch bitcast(_e748.member) { case 0: { - phi_1245_ = i32(); - phi_1309_ = false; + phi_1238_ = i32(); + phi_1302_ = false; break; } case 1: { - if (_e736.member_1 < 8u) { + if (_e748.member_1 < 8u) { } else { - phi_2748_ = true; + phi_2707_ = 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 { + let _e755 = local_1[_e748.member_1][0u]; + let _e758 = local_1[_e748.member_1][1u]; + let _e761 = local_1[_e748.member_1][2u]; + local_2 = array(_e755, _e758, _e761); + let _e763 = (_e726.member_1 < 3u); + if _e763 { } else { - phi_2748_ = true; + phi_2707_ = true; break; } - let _e753 = local_2[_e714.member_1]; - local_3 = array(_e694.x, _e694.y, _e694.z); - if _e751 { + let _e765 = local_2[_e726.member_1]; + local_3 = array(_e706.x, _e706.y, _e706.z); + if _e763 { } else { - phi_2748_ = true; + phi_2707_ = true; break; } - let _e759 = local_3[_e714.member_1]; - if (_e753 < _e759) { - phi_1308_ = (_e721 + 1i); + let _e771 = local_3[_e726.member_1]; + if (_e765 < _e771) { + phi_1301_ = (_e733 + 1i); } else { - phi_1308_ = _e721; + phi_1301_ = _e733; } - let _e763 = phi_1308_; - phi_1245_ = _e763; - phi_1309_ = true; + let _e775 = phi_1301_; + phi_1238_ = _e775; + phi_1302_ = true; break; } default: { - phi_1245_ = i32(); - phi_1309_ = bool(); + phi_1238_ = i32(); + phi_1302_ = bool(); break; } } - let _e765 = phi_1245_; - let _e767 = phi_1309_; + let _e777 = phi_1238_; + let _e779 = phi_1302_; continue; continuing { - phi_1241_ = _e734; - phi_1244_ = _e765; - phi_2748_ = _e697; - break if !(_e767); + phi_1234_ = _e746; + phi_1237_ = _e777; + phi_2707_ = _e709; + break if !(_e779); } } - let _e770 = phi_2748_; - phi_2760_ = _e770; - phi_2035_ = bool(); - phi_2034_ = bool(); - phi_2033_ = bool(); - if _e770 { + let _e782 = phi_2707_; + phi_2719_ = _e782; + phi_2011_ = bool(); + phi_2010_ = bool(); + phi_2009_ = bool(); + if _e782 { break; } - let _e772 = local_8; - let _e773 = (_e772 == 8i); - if _e773 { - phi_2762_ = _e770; - phi_1390_ = false; - phi_1391_ = false; + let _e784 = local_8; + let _e785 = (_e784 == 8i); + if _e785 { + phi_2721_ = _e782; + phi_1383_ = false; + phi_1384_ = false; } else { - phi_1316_ = type_19(0u, 8u); - phi_1319_ = 0i; + phi_1309_ = type_12(0u, 8u); + phi_1312_ = 0i; loop { - let _e775 = phi_1316_; - let _e777 = phi_1319_; - local_9 = _e777; - if (_e775.member < _e775.member_1) { - phi_1317_ = type_19((_e775.member + 1u), _e775.member_1); - phi_1342_ = type_19(1u, _e775.member); + let _e787 = phi_1309_; + let _e789 = phi_1312_; + local_9 = _e789; + if (_e787.member < _e787.member_1) { + phi_1310_ = type_12((_e787.member + 1u), _e787.member_1); + phi_1335_ = type_12(1u, _e787.member); } else { - phi_1317_ = _e775; - phi_1342_ = type_19(0u, type_19().member_1); + phi_1310_ = _e787; + phi_1335_ = type_12(0u, type_12().member_1); } - let _e790 = phi_1317_; - let _e792 = phi_1342_; - switch bitcast(_e792.member) { + let _e802 = phi_1310_; + let _e804 = phi_1335_; + switch bitcast(_e804.member) { case 0: { - phi_1320_ = i32(); - phi_1384_ = false; + phi_1313_ = i32(); + phi_1377_ = false; break; } case 1: { - if (_e792.member_1 < 8u) { + if (_e804.member_1 < 8u) { } else { - phi_2755_ = true; + phi_2714_ = 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 { + let _e811 = local_1[_e804.member_1][0u]; + let _e814 = local_1[_e804.member_1][1u]; + let _e817 = local_1[_e804.member_1][2u]; + local_4 = array(_e811, _e814, _e817); + let _e819 = (_e726.member_1 < 3u); + if _e819 { } else { - phi_2755_ = true; + phi_2714_ = true; break; } - let _e809 = local_4[_e714.member_1]; - local_5 = array(_e695.x, _e695.y, _e695.z); - if _e807 { + let _e821 = local_4[_e726.member_1]; + local_5 = array(_e707.x, _e707.y, _e707.z); + if _e819 { } else { - phi_2755_ = true; + phi_2714_ = true; break; } - let _e815 = local_5[_e714.member_1]; - if (_e809 > _e815) { - phi_1383_ = (_e777 + 1i); + let _e827 = local_5[_e726.member_1]; + if (_e821 > _e827) { + phi_1376_ = (_e789 + 1i); } else { - phi_1383_ = _e777; + phi_1376_ = _e789; } - let _e819 = phi_1383_; - phi_1320_ = _e819; - phi_1384_ = true; + let _e831 = phi_1376_; + phi_1313_ = _e831; + phi_1377_ = true; break; } default: { - phi_1320_ = i32(); - phi_1384_ = bool(); + phi_1313_ = i32(); + phi_1377_ = bool(); break; } } - let _e821 = phi_1320_; - let _e823 = phi_1384_; + let _e833 = phi_1313_; + let _e835 = phi_1377_; continue; continuing { - phi_1316_ = _e790; - phi_1319_ = _e821; - phi_2755_ = _e770; - break if !(_e823); + phi_1309_ = _e802; + phi_1312_ = _e833; + phi_2714_ = _e782; + break if !(_e835); } } - let _e826 = phi_2755_; - phi_2760_ = _e826; - phi_2035_ = bool(); - phi_2034_ = bool(); - phi_2033_ = bool(); - if _e826 { + let _e838 = phi_2714_; + phi_2719_ = _e838; + phi_2011_ = bool(); + phi_2010_ = bool(); + phi_2009_ = bool(); + if _e838 { break; } - let _e828 = local_9; - let _e829 = (_e828 == 8i); - phi_2762_ = _e826; - phi_1390_ = select(true, false, _e829); - phi_1391_ = _e829; + let _e840 = local_9; + let _e841 = (_e840 == 8i); + phi_2721_ = _e838; + phi_1383_ = select(true, false, _e841); + phi_1384_ = _e841; } - let _e832 = phi_2762_; - let _e834 = phi_1390_; - let _e836 = phi_1391_; - phi_2761_ = _e832; - phi_1392_ = _e834; - phi_1393_ = false; - phi_1394_ = _e773; - phi_1395_ = _e836; + let _e844 = phi_2721_; + let _e846 = phi_1383_; + let _e848 = phi_1384_; + phi_2720_ = _e844; + phi_1385_ = _e846; + phi_1386_ = false; + phi_1387_ = _e785; + phi_1388_ = _e848; break; } default: { - phi_2761_ = _e697; - phi_1392_ = bool(); - phi_1393_ = bool(); - phi_1394_ = bool(); - phi_1395_ = bool(); + phi_2720_ = _e709; + phi_1385_ = bool(); + phi_1386_ = bool(); + phi_1387_ = bool(); + phi_1388_ = bool(); break; } } - let _e838 = phi_2761_; - let _e840 = phi_1392_; - let _e842 = phi_1393_; - let _e844 = phi_1394_; - let _e846 = phi_1395_; + let _e850 = phi_2720_; + let _e852 = phi_1385_; + let _e854 = phi_1386_; + let _e856 = phi_1387_; + let _e858 = phi_1388_; continue; continuing { - phi_2754_ = _e838; - phi_1207_ = _e712; - phi_2760_ = _e838; - phi_2035_ = _e846; - phi_2034_ = _e844; - phi_2033_ = _e842; - break if !(_e840); + phi_2713_ = _e850; + phi_1200_ = _e724; + phi_2719_ = _e850; + phi_2011_ = _e858; + phi_2010_ = _e856; + phi_2009_ = _e854; + break if !(_e852); } } - let _e849 = phi_2760_; - let _e851 = phi_2035_; - let _e853 = phi_2034_; - let _e855 = phi_2033_; - if _e849 { + let _e861 = phi_2719_; + let _e863 = phi_2011_; + let _e865 = phi_2010_; + let _e867 = phi_2009_; + if _e861 { break; } - let _e856 = select(_e853, false, _e855); - if select(true, false, select(_e856, true, select(select(_e851, false, _e855), false, _e856))) { - phi_1418_ = type_33(false, 0u); + let _e868 = select(_e865, false, _e867); + if select(true, false, select(_e868, true, select(select(_e863, false, _e867), false, _e868))) { + phi_1411_ = type_33(false, 0u); } else { - phi_1418_ = type_33(true, 0u); + phi_1411_ = type_33(true, 0u); } - let _e862 = phi_1418_; - phi_1419_ = _e862; + let _e874 = phi_1411_; + phi_1412_ = _e874; } else { - phi_1419_ = type_33(); + phi_1412_ = type_33(); } - let _e864 = phi_1419_; - if select(true, false, _e692) { - let _e867 = local_10; - phi_1425_ = type_33(true, _e867); + let _e876 = phi_1412_; + if select(true, false, _e704) { + let _e879 = local_10; + phi_1418_ = type_33(true, _e879); } else { - phi_1425_ = _e864; + phi_1418_ = _e876; } - let _e870 = phi_1425_; - phi_1426_ = _e870; + let _e882 = phi_1418_; + phi_1419_ = _e882; } - let _e872 = phi_1426_; - 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_1690_ = 4294967295u; + let _e884 = phi_1419_; + if (_e884.member != true) { + global_2.member[_e98.x].member_1 = 1u; + if _e199.member_6 { + let _e890 = global_1.member[0u]; + let _e893 = global_1.member[1u]; + let _e896 = global_1.member[3u]; + let _e899 = global_1.member[4u]; + let _e900 = f32(_e890); + let _e942 = fma(_e501.member.member_3.z, _e501.member_1.member.w, fma(_e501.member.member_2.z, _e501.member_1.member.z, fma(_e501.member.member.z, _e501.member_1.member.x, (_e501.member.member_1.z * _e501.member_1.member.y)))); + let _e943 = fma(_e501.member.member_3.w, _e501.member_1.member.w, fma(_e501.member.member_2.w, _e501.member_1.member.z, fma(_e501.member.member.w, _e501.member_1.member.x, (_e501.member.member_1.w * _e501.member_1.member.y)))); + let _e963 = fma(_e501.member.member_3.z, _e501.member_1.member_1.w, fma(_e501.member.member_2.z, _e501.member_1.member_1.z, fma(_e501.member.member.z, _e501.member_1.member_1.x, (_e501.member.member_1.z * _e501.member_1.member_1.y)))); + let _e964 = fma(_e501.member.member_3.w, _e501.member_1.member_1.w, fma(_e501.member.member_2.w, _e501.member_1.member_1.z, fma(_e501.member.member.w, _e501.member_1.member_1.x, (_e501.member.member_1.w * _e501.member_1.member_1.y)))); + let _e984 = fma(_e501.member.member_3.z, _e501.member_1.member_2.w, fma(_e501.member.member_2.z, _e501.member_1.member_2.z, fma(_e501.member.member.z, _e501.member_1.member_2.x, (_e501.member.member_1.z * _e501.member_1.member_2.y)))); + let _e985 = fma(_e501.member.member_3.w, _e501.member_1.member_2.w, fma(_e501.member.member_2.w, _e501.member_1.member_2.z, fma(_e501.member.member.w, _e501.member_1.member_2.x, (_e501.member.member_1.w * _e501.member_1.member_2.y)))); + let _e1005 = fma(_e501.member.member_3.z, _e501.member_1.member_3.w, fma(_e501.member.member_2.z, _e501.member_1.member_3.z, fma(_e501.member.member.z, _e501.member_1.member_3.x, (_e501.member.member_1.z * _e501.member_1.member_3.y)))); + let _e1006 = fma(_e501.member.member_3.w, _e501.member_1.member_3.w, fma(_e501.member.member_2.w, _e501.member_1.member_3.z, fma(_e501.member.member.w, _e501.member_1.member_3.x, (_e501.member.member_1.w * _e501.member_1.member_3.y)))); + let _e1018 = (fma(_e985, _e629, fma(_e943, _e627, (_e964 * _e628))) + _e1006); + let _e1023 = fma(_e635, _e501.member_3.member_1[5].x, _e627); + let _e1024 = fma(_e635, _e501.member_3.member_1[5].y, _e628); + let _e1025 = fma(_e635, _e501.member_3.member_1[5].z, _e629); + let _e1039 = fma(_e635, _e501.member_3.member_1[0].x, _e627); + let _e1040 = fma(_e635, _e501.member_3.member_1[0].y, _e628); + let _e1041 = fma(_e635, _e501.member_3.member_1[0].z, _e629); + let _e1058 = (vec2(((((fma(fma(_e501.member.member_3.x, _e501.member_1.member_2.w, fma(_e501.member.member_2.x, _e501.member_1.member_2.z, fma(_e501.member.member.x, _e501.member_1.member_2.x, (_e501.member.member_1.x * _e501.member_1.member_2.y)))), _e629, fma(fma(_e501.member.member_3.x, _e501.member_1.member.w, fma(_e501.member.member_2.x, _e501.member_1.member.z, fma(_e501.member.member.x, _e501.member_1.member.x, (_e501.member.member_1.x * _e501.member_1.member.y)))), _e627, (fma(_e501.member.member_3.x, _e501.member_1.member_1.w, fma(_e501.member.member_2.x, _e501.member_1.member_1.z, fma(_e501.member.member.x, _e501.member_1.member_1.x, (_e501.member.member_1.x * _e501.member_1.member_1.y)))) * _e628))) + fma(_e501.member.member_3.x, _e501.member_1.member_3.w, fma(_e501.member.member_2.x, _e501.member_1.member_3.z, fma(_e501.member.member.x, _e501.member_1.member_3.x, (_e501.member.member_1.x * _e501.member_1.member_3.y))))) / _e1018) + 1f) * 0.5f), fma((-1f - ((fma(fma(_e501.member.member_3.y, _e501.member_1.member_2.w, fma(_e501.member.member_2.y, _e501.member_1.member_2.z, fma(_e501.member.member.y, _e501.member_1.member_2.x, (_e501.member.member_1.y * _e501.member_1.member_2.y)))), _e629, fma(fma(_e501.member.member_3.y, _e501.member_1.member.w, fma(_e501.member.member_2.y, _e501.member_1.member.z, fma(_e501.member.member.y, _e501.member_1.member.x, (_e501.member.member_1.y * _e501.member_1.member.y)))), _e627, (fma(_e501.member.member_3.y, _e501.member_1.member_1.w, fma(_e501.member.member_2.y, _e501.member_1.member_1.z, fma(_e501.member.member.y, _e501.member_1.member_1.x, (_e501.member.member_1.y * _e501.member_1.member_1.y)))) * _e628))) + fma(_e501.member.member_3.y, _e501.member_1.member_3.w, fma(_e501.member.member_2.y, _e501.member_1.member_3.z, fma(_e501.member.member.y, _e501.member_1.member_3.x, (_e501.member.member_1.y * _e501.member_1.member_3.y))))) / _e1018)), 0.5f, 1f)) * vec2(_e900, f32(_e893))); + let _e1059 = (_e635 / _e1018); + let _e1061 = -(_e900); + let _e1065 = vec3(fma(_e1061, _e1059, _e1058.x), fma(_e1061, _e1059, _e1058.y), ((_e1005 + fma(_e984, _e1025, fma(_e963, _e1024, (_e942 * _e1023)))) / (_e1006 + fma(_e985, _e1025, fma(_e964, _e1024, (_e943 * _e1023)))))); + let _e1068 = vec3(fma(_e900, _e1059, _e1058.x), fma(_e900, _e1059, _e1058.y), ((_e1005 + fma(_e984, _e1041, fma(_e963, _e1040, (_e942 * _e1039)))) / (_e1006 + fma(_e985, _e1041, fma(_e964, _e1040, (_e943 * _e1039)))))); + let _e1069 = min(_e1065, _e1068); + let _e1070 = max(_e1065, _e1068); + let _e1075 = (_e1070.x - _e1069.x); + let _e1076 = (_e1070.y - _e1069.y); + let _e1080 = floor(log2(select(_e1076, _e1075, (_e1075 > _e1076)))); + let _e1085 = select(select(u32(_e1080), 0u, (_e1080 < 0f)), 4294967295u, (_e1080 > 4294967000f)); + let _e1086 = (_e899 - 1u); + let _e1088 = select(_e1085, _e1086, (_e1085 > _e1086)); + let _e1094 = round(((_e1069.x + _e1070.x) * 0.5f)); + let _e1100 = (_e1088 & 31u); + let _e1103 = round(((_e1069.y + _e1070.y) * 0.5f)); + if (_e1088 >= _e899) { + phi_1683_ = 4294967295u; } else { - phi_1690_ = (_e884 + (2u * _e1078)); + phi_1683_ = (_e896 + (2u * _e1088)); } - let _e1105 = phi_1690_; - if (_e92 >= 2u) { - phi_2546_ = (_e1105 <= (_e92 - 2u)); + let _e1115 = phi_1683_; + if (_e95 >= 2u) { + phi_2505_ = (_e1115 <= (_e95 - 2u)); } else { - phi_2546_ = false; + phi_2505_ = false; } - let _e1110 = phi_2546_; - if _e1110 { - let _e1113 = global_1.member[_e1105]; - let _e1117 = global_1.member[(_e1105 + 1u)]; - phi_1708_ = type_19(_e1113, _e1117); + let _e1120 = phi_2505_; + if _e1120 { + let _e1123 = global_1.member[_e1115]; + let _e1127 = global_1.member[(_e1115 + 1u)]; + phi_1701_ = type_12(_e1123, _e1127); } else { - phi_1708_ = type_19(4294967295u, 0u); + phi_1701_ = type_12(4294967295u, 0u); } - let _e1120 = phi_1708_; - 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_2572_ = 4294967295u; + let _e1130 = phi_1701_; + let _e1136 = (((select(select(u32(_e1103), 0u, (_e1103 < 0f)), 4294967295u, (_e1103 > 4294967000f)) >> bitcast(_e1100)) * (_e890 >> bitcast(_e1100))) + (select(select(u32(_e1094), 0u, (_e1094 < 0f)), 4294967295u, (_e1094 > 4294967000f)) >> bitcast(_e1100))); + if (_e1136 >= _e1130.member_1) { + phi_2531_ = 4294967295u; } else { - phi_2572_ = (_e1120.member + _e1126); + phi_2531_ = (_e1130.member + _e1136); } - let _e1130 = phi_2572_; - let _e1133 = global_1.member[_e1130]; - if select((_e1059.z > 1f), true, (_e1059.z > bitcast(_e1133))) { - global_2.member[_e95.x].member_1 = 0u; + let _e1140 = phi_2531_; + let _e1143 = global_1.member[_e1140]; + if select((_e1069.z > 1f), true, (_e1069.z > bitcast(_e1143))) { + global_2.member[_e98.x].member_1 = 0u; } } } else { - global_2.member[_e95.x].member_1 = 0u; + global_2.member[_e98.x].member_1 = 0u; } } } @@ -856,7 +857,7 @@ fn function() { return; } -@compute @workgroup_size(32, 1, 1) +@compute @workgroup_size(16, 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 index adc86d7e..1fa75571 100644 Binary files a/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.spv and b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.spv differ diff --git a/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl index b3f04f94..cbd9928b 100644 --- a/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl +++ b/crates/renderling/shaders/cull-compute_downsample_depth_pyramid.wgsl @@ -1,4 +1,4 @@ -struct type_4 { +struct type_2 { member: array, } @@ -9,7 +9,7 @@ struct type_7 { var global: vec3; @group(0) @binding(0) -var global_1: type_4; +var global_1: type_2; fn function() { var phi_504_: bool; @@ -261,7 +261,7 @@ fn function() { return; } -@compute @workgroup_size(32, 32, 1) +@compute @workgroup_size(16, 16, 1) fn cullcompute_downsample_depth_pyramid(@builtin(global_invocation_id) param: vec3) { global = param; function(); diff --git a/crates/renderling/shaders/debug-debug_overlay_fragment.spv b/crates/renderling/shaders/debug-debug_overlay_fragment.spv index 5cb9a535..c0c77211 100644 Binary files a/crates/renderling/shaders/debug-debug_overlay_fragment.spv and b/crates/renderling/shaders/debug-debug_overlay_fragment.spv differ diff --git a/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl b/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl index a9d46cae..81940f3a 100644 --- a/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl +++ b/crates/renderling/shaders/debug-debug_overlay_fragment.wgsl @@ -1,8 +1,8 @@ -struct type_10 { +struct type_2 { member: array, } -struct type_17 { +struct type_12 { member: u32, member_1: u32, } @@ -25,7 +25,7 @@ struct type_26 { } @group(0) @binding(0) -var global: type_10; +var global: type_2; var global_1: vec4; @group(0) @binding(1) var global_2: type_23; @@ -40,59 +40,59 @@ fn function() { var local_5: array; var local_6: array, 8>; var local_7: array, 6>; - var phi_2195_: bool; - var phi_539_: type_17; - var phi_540_: type_17; - var phi_563_: type_17; - var phi_733_: type_17; - var phi_734_: type_17; - var phi_757_: type_17; + var phi_2208_: bool; + var phi_539_: type_12; + var phi_540_: type_12; + var phi_563_: type_12; + var phi_733_: type_12; + var phi_734_: type_12; + var phi_757_: type_12; var phi_784_: bool; - var phi_790_: type_17; - var phi_791_: type_17; - var phi_814_: type_17; + var phi_790_: type_12; + var phi_791_: type_12; + var phi_814_: type_12; var phi_837_: bool; - var phi_893_: type_26; - var phi_1036_: type_17; - var phi_1037_: type_17; - var phi_1060_: type_17; - var phi_1104_: bool; - var phi_1108_: bool; - var phi_1109_: bool; - var phi_2182_: bool; - var phi_1631_: bool; - var phi_2203_: bool; - var phi_1116_: type_17; - var phi_1117_: type_17; - var phi_1140_: type_17; - var phi_1150_: type_17; - var phi_1153_: i32; - var phi_1151_: type_17; - var phi_1176_: type_17; - var phi_1217_: i32; - var phi_1154_: i32; - var phi_1218_: bool; - var phi_2197_: bool; + var phi_906_: type_26; + var phi_1049_: type_12; + var phi_1050_: type_12; + var phi_1073_: type_12; + var phi_1117_: bool; + var phi_1121_: bool; + var phi_1122_: bool; + var phi_2195_: bool; + var phi_1644_: bool; + var phi_2216_: bool; + var phi_1129_: type_12; + var phi_1130_: type_12; + var phi_1153_: type_12; + var phi_1163_: type_12; + var phi_1166_: i32; + var phi_1164_: type_12; + var phi_1189_: type_12; + var phi_1230_: i32; + var phi_1167_: i32; + var phi_1231_: bool; + var phi_2210_: bool; var local_8: i32; - var phi_1225_: type_17; - var phi_1228_: i32; - var phi_1226_: type_17; - var phi_1251_: type_17; - var phi_1292_: i32; - var phi_1229_: i32; - var phi_1293_: bool; - var phi_2204_: bool; + var phi_1238_: type_12; + var phi_1241_: i32; + var phi_1239_: type_12; + var phi_1264_: type_12; + var phi_1305_: i32; + var phi_1242_: i32; + var phi_1306_: bool; + var phi_2217_: bool; var local_9: i32; - var phi_2211_: bool; - var phi_1299_: bool; - var phi_2210_: bool; - var phi_1301_: bool; - var phi_2209_: bool; - var phi_2219_: bool; - var phi_2218_: bool; - var phi_2214_: bool; - var phi_1546_: bool; - var phi_2213_: bool; + var phi_2224_: bool; + var phi_1312_: bool; + var phi_2223_: bool; + var phi_1314_: bool; + var phi_2222_: bool; + var phi_2232_: bool; + var phi_2231_: bool; + var phi_2227_: bool; + var phi_1559_: bool; + var phi_2226_: bool; switch bitcast(0u) { default: { @@ -100,24 +100,24 @@ fn function() { let _e78 = global.member[2u]; let _e81 = global.member[3u]; global_1 = vec4(0f, 0f, 0f, 0f); - phi_2195_ = false; - phi_539_ = type_17(0u, arrayLength((&global_2.member))); + phi_2208_ = false; + phi_539_ = type_12(0u, arrayLength((&global_2.member))); loop { - let _e84 = phi_2195_; + let _e84 = phi_2208_; let _e86 = phi_539_; if (_e86.member < _e86.member_1) { - phi_540_ = type_17((_e86.member + 1u), _e86.member_1); - phi_563_ = type_17(1u, _e86.member); + phi_540_ = type_12((_e86.member + 1u), _e86.member_1); + phi_563_ = type_12(1u, _e86.member); } else { phi_540_ = _e86; - phi_563_ = type_17(0u, type_17().member_1); + phi_563_ = type_12(0u, type_12().member_1); } let _e99 = phi_540_; let _e101 = phi_563_; switch bitcast(_e101.member) { case 0: { - phi_2214_ = _e84; - phi_1546_ = false; + phi_2227_ = _e84; + phi_1559_ = false; break; } case 1: { @@ -188,15 +188,15 @@ fn function() { 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_733_ = type_17(0u, 6u); + phi_733_ = type_12(0u, 6u); loop { let _e274 = phi_733_; if (_e274.member < _e274.member_1) { - phi_734_ = type_17((_e274.member + 1u), _e274.member_1); - phi_757_ = type_17(1u, _e274.member); + phi_734_ = type_12((_e274.member + 1u), _e274.member_1); + phi_757_ = type_12(1u, _e274.member); } else { phi_734_ = _e274; - phi_757_ = type_17(0u, type_17().member_1); + phi_757_ = type_12(0u, type_12().member_1); } let _e287 = phi_734_; let _e289 = phi_757_; @@ -229,15 +229,15 @@ fn function() { } 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_790_ = type_17(0u, 8u); + phi_790_ = type_12(0u, 8u); loop { let _e322 = phi_790_; if (_e322.member < _e322.member_1) { - phi_791_ = type_17((_e322.member + 1u), _e322.member_1); - phi_814_ = type_17(1u, _e322.member); + phi_791_ = type_12((_e322.member + 1u), _e322.member_1); + phi_814_ = type_12(1u, _e322.member); } else { phi_791_ = _e322; - phi_814_ = type_17(0u, type_17().member_1); + phi_814_ = type_12(0u, type_12().member_1); } let _e335 = phi_791_; let _e337 = phi_814_; @@ -280,11 +280,11 @@ fn function() { let _e408 = global.member[(_e366 + 7u)]; let _e413 = global.member[(_e366 + 8u)]; let _e418 = global.member[(_e366 + 9u)]; - phi_893_ = 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))); + phi_906_ = 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_893_ = type_26(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_906_ = type_26(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e423 = phi_893_; + let _e423 = phi_906_; let _e427 = global.member[(_e108 + 3u)]; let _e428 = bitcast(_e427); let _e432 = global.member[(_e108 + 4u)]; @@ -316,66 +316,66 @@ fn function() { let _e527 = local[0u][3u]; let _e529 = -(_e512); if ((fma(_e523, _e506, fma(_e515, _e504, (_e518 * _e505))) + _e527) < _e529) { - phi_2218_ = _e84; + phi_2231_ = _e84; } else { - phi_1036_ = type_17(0u, 6u); + phi_1049_ = type_12(0u, 6u); loop { - let _e532 = phi_1036_; + let _e532 = phi_1049_; if (_e532.member < _e532.member_1) { - phi_1037_ = type_17((_e532.member + 1u), _e532.member_1); - phi_1060_ = type_17(1u, _e532.member); + phi_1050_ = type_12((_e532.member + 1u), _e532.member_1); + phi_1073_ = type_12(1u, _e532.member); } else { - phi_1037_ = _e532; - phi_1060_ = type_17(0u, type_17().member_1); + phi_1050_ = _e532; + phi_1073_ = type_12(0u, type_12().member_1); } - let _e545 = phi_1037_; - let _e547 = phi_1060_; + let _e545 = phi_1050_; + let _e547 = phi_1073_; switch bitcast(_e547.member) { case 0: { - phi_1108_ = false; - phi_1109_ = true; + phi_1121_ = false; + phi_1122_ = true; break; } case 1: { if (_e547.member_1 != 0u) { if (_e547.member_1 < 6u) { } else { - phi_2182_ = true; - phi_1631_ = bool(); + phi_2195_ = true; + phi_1644_ = 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_1104_ = select(true, false, ((fma(_e563, _e506, fma(_e555, _e504, (_e558 * _e505))) + _e567) < _e529)); + phi_1117_ = select(true, false, ((fma(_e563, _e506, fma(_e555, _e504, (_e558 * _e505))) + _e567) < _e529)); } else { - phi_1104_ = true; + phi_1117_ = true; } - let _e572 = phi_1104_; - phi_1108_ = _e572; - phi_1109_ = false; + let _e572 = phi_1117_; + phi_1121_ = _e572; + phi_1122_ = false; break; } default: { - phi_1108_ = bool(); - phi_1109_ = bool(); + phi_1121_ = bool(); + phi_1122_ = bool(); break; } } - let _e574 = phi_1108_; - let _e576 = phi_1109_; + let _e574 = phi_1121_; + let _e576 = phi_1122_; continue; continuing { - phi_1036_ = _e545; - phi_2182_ = _e84; - phi_1631_ = _e576; + phi_1049_ = _e545; + phi_2195_ = _e84; + phi_1644_ = _e576; break if !(_e574); } } - let _e579 = phi_2182_; - let _e581 = phi_1631_; - phi_2213_ = _e579; + let _e579 = phi_2195_; + let _e581 = phi_1644_; + phi_2226_ = _e579; if _e579 { break; } @@ -383,52 +383,52 @@ fn function() { let _e582 = vec3(_e512); let _e583 = (_e507 - _e582); let _e584 = (_e507 + _e582); - phi_2203_ = _e579; - phi_1116_ = type_17(0u, 3u); + phi_2216_ = _e579; + phi_1129_ = type_12(0u, 3u); loop { - let _e586 = phi_2203_; - let _e588 = phi_1116_; + let _e586 = phi_2216_; + let _e588 = phi_1129_; if (_e588.member < _e588.member_1) { - phi_1117_ = type_17((_e588.member + 1u), _e588.member_1); - phi_1140_ = type_17(1u, _e588.member); + phi_1130_ = type_12((_e588.member + 1u), _e588.member_1); + phi_1153_ = type_12(1u, _e588.member); } else { - phi_1117_ = _e588; - phi_1140_ = type_17(0u, type_17().member_1); + phi_1130_ = _e588; + phi_1153_ = type_12(0u, type_12().member_1); } - let _e601 = phi_1117_; - let _e603 = phi_1140_; + let _e601 = phi_1130_; + let _e603 = phi_1153_; switch bitcast(_e603.member) { case 0: { - phi_2210_ = _e586; - phi_1301_ = false; + phi_2223_ = _e586; + phi_1314_ = false; break; } case 1: { - phi_1150_ = type_17(0u, 8u); - phi_1153_ = 0i; + phi_1163_ = type_12(0u, 8u); + phi_1166_ = 0i; loop { - let _e608 = phi_1150_; - let _e610 = phi_1153_; + let _e608 = phi_1163_; + let _e610 = phi_1166_; local_8 = _e610; if (_e608.member < _e608.member_1) { - phi_1151_ = type_17((_e608.member + 1u), _e608.member_1); - phi_1176_ = type_17(1u, _e608.member); + phi_1164_ = type_12((_e608.member + 1u), _e608.member_1); + phi_1189_ = type_12(1u, _e608.member); } else { - phi_1151_ = _e608; - phi_1176_ = type_17(0u, type_17().member_1); + phi_1164_ = _e608; + phi_1189_ = type_12(0u, type_12().member_1); } - let _e623 = phi_1151_; - let _e625 = phi_1176_; + let _e623 = phi_1164_; + let _e625 = phi_1189_; switch bitcast(_e625.member) { case 0: { - phi_1154_ = i32(); - phi_1218_ = false; + phi_1167_ = i32(); + phi_1231_ = false; break; } case 1: { if (_e625.member_1 < 8u) { } else { - phi_2197_ = true; + phi_2210_ = true; break; } let _e632 = local_1[_e625.member_1][0u]; @@ -438,78 +438,78 @@ fn function() { let _e640 = (_e603.member_1 < 3u); if _e640 { } else { - phi_2197_ = true; + phi_2210_ = true; break; } let _e642 = local_2[_e603.member_1]; local_3 = array(_e583.x, _e583.y, _e583.z); if _e640 { } else { - phi_2197_ = true; + phi_2210_ = true; break; } let _e648 = local_3[_e603.member_1]; if (_e642 < _e648) { - phi_1217_ = (_e610 + 1i); + phi_1230_ = (_e610 + 1i); } else { - phi_1217_ = _e610; + phi_1230_ = _e610; } - let _e652 = phi_1217_; - phi_1154_ = _e652; - phi_1218_ = true; + let _e652 = phi_1230_; + phi_1167_ = _e652; + phi_1231_ = true; break; } default: { - phi_1154_ = i32(); - phi_1218_ = bool(); + phi_1167_ = i32(); + phi_1231_ = bool(); break; } } - let _e654 = phi_1154_; - let _e656 = phi_1218_; + let _e654 = phi_1167_; + let _e656 = phi_1231_; continue; continuing { - phi_1150_ = _e623; - phi_1153_ = _e654; - phi_2197_ = _e586; + phi_1163_ = _e623; + phi_1166_ = _e654; + phi_2210_ = _e586; break if !(_e656); } } - let _e659 = phi_2197_; - phi_2209_ = _e659; + let _e659 = phi_2210_; + phi_2222_ = _e659; if _e659 { break; } let _e661 = local_8; if (_e661 == 8i) { - phi_2211_ = _e659; - phi_1299_ = false; + phi_2224_ = _e659; + phi_1312_ = false; } else { - phi_1225_ = type_17(0u, 8u); - phi_1228_ = 0i; + phi_1238_ = type_12(0u, 8u); + phi_1241_ = 0i; loop { - let _e664 = phi_1225_; - let _e666 = phi_1228_; + let _e664 = phi_1238_; + let _e666 = phi_1241_; local_9 = _e666; if (_e664.member < _e664.member_1) { - phi_1226_ = type_17((_e664.member + 1u), _e664.member_1); - phi_1251_ = type_17(1u, _e664.member); + phi_1239_ = type_12((_e664.member + 1u), _e664.member_1); + phi_1264_ = type_12(1u, _e664.member); } else { - phi_1226_ = _e664; - phi_1251_ = type_17(0u, type_17().member_1); + phi_1239_ = _e664; + phi_1264_ = type_12(0u, type_12().member_1); } - let _e679 = phi_1226_; - let _e681 = phi_1251_; + let _e679 = phi_1239_; + let _e681 = phi_1264_; switch bitcast(_e681.member) { case 0: { - phi_1229_ = i32(); - phi_1293_ = false; + phi_1242_ = i32(); + phi_1306_ = false; break; } case 1: { if (_e681.member_1 < 8u) { } else { - phi_2204_ = true; + phi_2217_ = true; break; } let _e688 = local_1[_e681.member_1][0u]; @@ -519,87 +519,87 @@ fn function() { let _e696 = (_e603.member_1 < 3u); if _e696 { } else { - phi_2204_ = true; + phi_2217_ = true; break; } let _e698 = local_4[_e603.member_1]; local_5 = array(_e584.x, _e584.y, _e584.z); if _e696 { } else { - phi_2204_ = true; + phi_2217_ = true; break; } let _e704 = local_5[_e603.member_1]; if (_e698 > _e704) { - phi_1292_ = (_e666 + 1i); + phi_1305_ = (_e666 + 1i); } else { - phi_1292_ = _e666; + phi_1305_ = _e666; } - let _e708 = phi_1292_; - phi_1229_ = _e708; - phi_1293_ = true; + let _e708 = phi_1305_; + phi_1242_ = _e708; + phi_1306_ = true; break; } default: { - phi_1229_ = i32(); - phi_1293_ = bool(); + phi_1242_ = i32(); + phi_1306_ = bool(); break; } } - let _e710 = phi_1229_; - let _e712 = phi_1293_; + let _e710 = phi_1242_; + let _e712 = phi_1306_; continue; continuing { - phi_1225_ = _e679; - phi_1228_ = _e710; - phi_2204_ = _e659; + phi_1238_ = _e679; + phi_1241_ = _e710; + phi_2217_ = _e659; break if !(_e712); } } - let _e715 = phi_2204_; - phi_2209_ = _e715; + let _e715 = phi_2217_; + phi_2222_ = _e715; if _e715 { break; } let _e717 = local_9; - phi_2211_ = _e715; - phi_1299_ = select(true, false, (_e717 == 8i)); + phi_2224_ = _e715; + phi_1312_ = select(true, false, (_e717 == 8i)); } - let _e721 = phi_2211_; - let _e723 = phi_1299_; - phi_2210_ = _e721; - phi_1301_ = _e723; + let _e721 = phi_2224_; + let _e723 = phi_1312_; + phi_2223_ = _e721; + phi_1314_ = _e723; break; } default: { - phi_2210_ = _e586; - phi_1301_ = bool(); + phi_2223_ = _e586; + phi_1314_ = bool(); break; } } - let _e725 = phi_2210_; - let _e727 = phi_1301_; + let _e725 = phi_2223_; + let _e727 = phi_1314_; continue; continuing { - phi_2203_ = _e725; - phi_1116_ = _e601; - phi_2209_ = _e725; + phi_2216_ = _e725; + phi_1129_ = _e601; + phi_2222_ = _e725; break if !(_e727); } } - let _e730 = phi_2209_; - phi_2213_ = _e730; + let _e730 = phi_2222_; + phi_2226_ = _e730; if _e730 { break; } - phi_2219_ = _e730; + phi_2232_ = _e730; } else { - phi_2219_ = _e579; + phi_2232_ = _e579; } - let _e732 = phi_2219_; - phi_2218_ = _e732; + let _e732 = phi_2232_; + phi_2231_ = _e732; } - let _e734 = phi_2218_; + let _e734 = phi_2231_; 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)))); @@ -640,27 +640,27 @@ fn function() { } } } - phi_2214_ = _e734; - phi_1546_ = true; + phi_2227_ = _e734; + phi_1559_ = true; break; } default: { - phi_2214_ = _e84; - phi_1546_ = bool(); + phi_2227_ = _e84; + phi_1559_ = bool(); break; } } - let _e909 = phi_2214_; - let _e911 = phi_1546_; + let _e909 = phi_2227_; + let _e911 = phi_1559_; continue; continuing { - phi_2195_ = _e909; + phi_2208_ = _e909; phi_539_ = _e99; - phi_2213_ = _e909; + phi_2226_ = _e909; break if !(_e911); } } - let _e914 = phi_2213_; + let _e914 = phi_2226_; if _e914 { break; } diff --git a/crates/renderling/shaders/debug-debug_overlay_vertex.spv b/crates/renderling/shaders/debug-debug_overlay_vertex.spv index 6e631c96..dd32e914 100644 Binary files a/crates/renderling/shaders/debug-debug_overlay_vertex.spv and b/crates/renderling/shaders/debug-debug_overlay_vertex.spv differ diff --git a/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.spv b/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.spv index f3d4b5e0..0843942c 100644 Binary files a/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.spv and b/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.spv differ diff --git a/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.wgsl b/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.wgsl index 52ca6527..c4886f26 100644 --- a/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.wgsl +++ b/crates/renderling/shaders/ibl-diffuse_irradiance-di_convolution_fragment.wgsl @@ -9,19 +9,19 @@ fn function() { var phi_273_: vec3; var phi_308_: vec3; var phi_343_: vec3; - var phi_138_: vec3; - var phi_141_: f32; - var phi_143_: f32; - var phi_153_: vec3; - var phi_156_: f32; - var phi_158_: f32; + var phi_146_: vec3; + var phi_149_: f32; + var phi_151_: f32; + var phi_161_: vec3; + var phi_164_: f32; + var phi_166_: f32; var phi_378_: vec3; - var phi_154_: vec3; - var phi_157_: f32; - var phi_159_: f32; - var phi_139_: vec3; - var phi_142_: f32; - var phi_144_: f32; + var phi_162_: vec3; + var phi_165_: f32; + var phi_167_: f32; + var phi_147_: vec3; + var phi_150_: f32; + var phi_152_: f32; var local: f32; var local_1: vec3; var local_2: vec3; @@ -56,26 +56,26 @@ fn function() { phi_343_ = (vec3(_e45, _e49, _e52) * (1f / _e57)); } let _e62 = phi_343_; - phi_138_ = vec3(0f, 0f, 0f); - phi_141_ = 0f; - phi_143_ = 0f; + phi_146_ = vec3(0f, 0f, 0f); + phi_149_ = 0f; + phi_151_ = 0f; loop { - let _e64 = phi_138_; - let _e66 = phi_141_; - let _e68 = phi_143_; + let _e64 = phi_146_; + let _e66 = phi_149_; + let _e68 = phi_151_; local = _e68; local_1 = _e64; local_2 = _e64; local_3 = _e64; let _e69 = (_e66 < 6.2831855f); if _e69 { - phi_153_ = _e64; - phi_156_ = 0f; - phi_158_ = _e68; + phi_161_ = _e64; + phi_164_ = 0f; + phi_166_ = _e68; loop { - let _e71 = phi_153_; - let _e73 = phi_156_; - let _e75 = phi_158_; + let _e71 = phi_161_; + let _e73 = phi_164_; + let _e75 = phi_166_; local_4 = _e71; local_5 = _e75; let _e76 = (_e73 < 1.5707964f); @@ -95,43 +95,43 @@ fn function() { } let _e104 = phi_378_; let _e105 = textureSample(global_3, global_2, _e104); - phi_154_ = vec3(fma((_e105.x * _e82), _e77, _e71.x), fma((_e105.y * _e82), _e77, _e71.y), fma((_e105.z * _e82), _e77, _e71.z)); - phi_157_ = (_e73 + 0.025f); - phi_159_ = (_e75 + 1f); + phi_162_ = vec3(fma((_e105.x * _e82), _e77, _e71.x), fma((_e105.y * _e82), _e77, _e71.y), fma((_e105.z * _e82), _e77, _e71.z)); + phi_165_ = (_e73 + 0.025f); + phi_167_ = (_e75 + 1f); } else { - phi_154_ = vec3(); - phi_157_ = f32(); - phi_159_ = f32(); + phi_162_ = vec3(); + phi_165_ = f32(); + phi_167_ = f32(); } - let _e122 = phi_154_; - let _e124 = phi_157_; - let _e126 = phi_159_; + let _e122 = phi_162_; + let _e124 = phi_165_; + let _e126 = phi_167_; continue; continuing { - phi_153_ = _e122; - phi_156_ = _e124; - phi_158_ = _e126; + phi_161_ = _e122; + phi_164_ = _e124; + phi_166_ = _e126; break if !(_e76); } } let _e167 = local_4; - phi_139_ = _e167; - phi_142_ = (_e66 + 0.025f); + phi_147_ = _e167; + phi_150_ = (_e66 + 0.025f); let _e171 = local_5; - phi_144_ = _e171; + phi_152_ = _e171; } else { - phi_139_ = vec3(); - phi_142_ = f32(); - phi_144_ = f32(); + phi_147_ = vec3(); + phi_150_ = f32(); + phi_152_ = f32(); } - let _e130 = phi_139_; - let _e132 = phi_142_; - let _e134 = phi_144_; + let _e130 = phi_147_; + let _e132 = phi_150_; + let _e134 = phi_152_; continue; continuing { - phi_138_ = _e130; - phi_141_ = _e132; - phi_143_ = _e134; + phi_146_ = _e130; + phi_149_ = _e132; + phi_151_ = _e134; break if !(_e69); } } diff --git a/crates/renderling/shaders/light-shadow_mapping_fragment.spv b/crates/renderling/shaders/light-shadow_mapping_fragment.spv new file mode 100644 index 00000000..c6edd539 Binary files /dev/null and b/crates/renderling/shaders/light-shadow_mapping_fragment.spv differ diff --git a/crates/renderling/shaders/light-shadow_mapping_fragment.wgsl b/crates/renderling/shaders/light-shadow_mapping_fragment.wgsl new file mode 100644 index 00000000..837e7eed --- /dev/null +++ b/crates/renderling/shaders/light-shadow_mapping_fragment.wgsl @@ -0,0 +1,16 @@ +var global: vec4; +var global_1: vec4; + +fn function() { + let _e3 = global_1; + global = vec4((_e3.x / _e3.w), (_e3.y / _e3.w), (_e3.z / _e3.w), 1f); + return; +} + +@fragment +fn lightshadow_mapping_fragment(@location(0) param: vec4) -> @location(0) vec4 { + global_1 = param; + function(); + let _e3 = global; + return _e3; +} diff --git a/crates/renderling/shaders/light-shadow_mapping_vertex.spv b/crates/renderling/shaders/light-shadow_mapping_vertex.spv new file mode 100644 index 00000000..a4831de8 Binary files /dev/null and b/crates/renderling/shaders/light-shadow_mapping_vertex.spv differ diff --git a/crates/renderling/shaders/light-shadow_mapping_vertex.wgsl b/crates/renderling/shaders/light-shadow_mapping_vertex.wgsl new file mode 100644 index 00000000..df2a7ed3 --- /dev/null +++ b/crates/renderling/shaders/light-shadow_mapping_vertex.wgsl @@ -0,0 +1,950 @@ +struct type_3 { + member: array, +} + +struct type_11 { + member: u32, + member_1: u32, +} + +struct type_14 { + member: vec4, + member_1: vec4, + member_2: vec4, + member_3: vec4, +} + +struct type_17 { + member: vec3, + member_1: vec4, + member_2: vec3, +} + +struct type_20 { + member: vec3, + member_1: vec4, + member_2: vec3, + member_3: vec4, + member_4: array, + member_5: array, + member_6: vec2, + member_7: vec2, +} + +struct type_23 { + member: vec3, + member_1: vec3, + member_2: vec3, +} + +struct type_24 { + member: type_11, + member_1: type_11, +} + +var global: u32; +var global_1: vec4 = vec4(0f, 0f, 0f, 1f); +var global_2: u32; +@group(0) @binding(0) +var global_3: type_3; +@group(0) @binding(1) +var global_4: type_3; +var global_5: type_14 = type_14(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); + +fn function() { + var local: array; + var local_1: array; + var local_2: array; + var local_3: array; + var phi_419_: u32; + var phi_2254_: bool; + var phi_426_: u32; + var phi_427_: u32; + var phi_437_: u32; + var phi_519_: type_11; + var phi_520_: type_11; + var phi_543_: type_11; + var phi_556_: bool; + var phi_562_: type_11; + var phi_563_: type_11; + var phi_586_: type_11; + var phi_600_: bool; + var phi_606_: type_11; + var phi_609_: type_20; + var phi_607_: type_11; + var phi_632_: type_11; + var phi_649_: u32; + var phi_2284_: bool; + var phi_667_: type_11; + var phi_2310_: u32; + var phi_2329_: bool; + var phi_717_: type_23; + var phi_727_: u32; + var phi_2351_: bool; + var phi_735_: f32; + var phi_610_: type_20; + var phi_788_: bool; + var phi_2371_: bool; + var phi_884_: type_24; + var local_4: type_20; + var phi_887_: type_11; + var phi_890_: type_14; + var phi_888_: type_11; + var phi_913_: type_11; + var local_5: type_20; + var phi_937_: u32; + var phi_2405_: bool; + var phi_946_: u32; + var phi_2429_: bool; + var phi_995_: type_17; + var phi_1005_: u32; + var phi_2454_: bool; + var phi_1078_: type_14; + var phi_891_: type_14; + var phi_1315_: bool; + var phi_2896_: bool; + var local_6: type_14; + var local_7: type_14; + var local_8: type_14; + var local_9: type_14; + var phi_1342_: bool; + var phi_1344_: bool; + var phi_1345_: bool; + var phi_1346_: bool; + var phi_1347_: bool; + var local_10: type_14; + var local_11: type_14; + var local_12: type_14; + var local_13: type_14; + var phi_1381_: bool; + var phi_1383_: bool; + var phi_1384_: bool; + var phi_1385_: bool; + var phi_1386_: bool; + var local_14: type_14; + var local_15: type_14; + var local_16: type_14; + var local_17: type_14; + var phi_1420_: bool; + var phi_1422_: bool; + var phi_1423_: bool; + var phi_1424_: bool; + var phi_1425_: bool; + var local_18: type_14; + var local_19: type_14; + var local_20: type_14; + var local_21: type_14; + var phi_1459_: bool; + var phi_1461_: bool; + var phi_1462_: bool; + var phi_1463_: bool; + var phi_1464_: bool; + var phi_1469_: bool; + var phi_1471_: bool; + var phi_1472_: bool; + var phi_1473_: bool; + var phi_1474_: bool; + var phi_1482_: type_14; + var phi_2589_: bool; + var phi_2654_: vec4; + var phi_2684_: vec4; + var phi_2686_: vec4; + var phi_2695_: type_17; + var phi_2696_: type_17; + var phi_2701_: type_17; + var phi_2702_: type_17; + var phi_2703_: bool; + var phi_2707_: type_17; + var phi_1484_: type_17; + var phi_1486_: type_17; + var phi_1487_: bool; + var phi_2801_: bool; + var phi_1540_: type_17; + var phi_1541_: type_17; + var local_22: type_20; + var phi_1654_: u32; + var local_23: type_14; + + switch bitcast(0u) { + default: { + let _e63 = global_2; + let _e64 = global; + let _e66 = arrayLength((&global_3.member)); + let _e69 = global_3.member[_e63]; + let _e74 = global_3.member[(_e63 + 1u)]; + let _e78 = global_3.member[(_e63 + 2u)]; + let _e82 = global_3.member[(_e63 + 7u)]; + let _e86 = global_3.member[(_e63 + 8u)]; + let _e90 = global_3.member[(_e63 + 10u)]; + let _e94 = global_3.member[(_e63 + 12u)]; + let _e98 = global_3.member[(_e63 + 13u)]; + let _e102 = global_3.member[(_e63 + 14u)]; + let _e106 = global_3.member[(_e63 + 15u)]; + let _e110 = global_3.member[(_e63 + 16u)]; + let _e114 = global_3.member[(_e63 + 17u)]; + if (_e69 == 1u) { + if (_e82 == 4294967295u) { + phi_427_ = _e64; + } else { + if (_e64 >= _e86) { + phi_419_ = 4294967295u; + } else { + phi_419_ = (_e82 + _e64); + } + let _e119 = phi_419_; + if (_e66 >= 1u) { + phi_2254_ = (_e119 <= (_e66 - 1u)); + } else { + phi_2254_ = false; + } + let _e124 = phi_2254_; + if _e124 { + let _e127 = global_3.member[_e119]; + phi_426_ = _e127; + } else { + phi_426_ = 0u; + } + let _e129 = phi_426_; + phi_427_ = _e129; + } + let _e131 = phi_427_; + if (_e131 >= _e78) { + phi_437_ = 4294967295u; + } else { + phi_437_ = (_e74 + (26u * _e131)); + } + let _e136 = phi_437_; + let _e139 = global_3.member[_e136]; + let _e144 = global_3.member[(_e136 + 1u)]; + let _e149 = global_3.member[(_e136 + 2u)]; + let _e155 = global_3.member[(_e136 + 3u)]; + let _e160 = global_3.member[(_e136 + 4u)]; + let _e165 = global_3.member[(_e136 + 5u)]; + let _e170 = global_3.member[(_e136 + 6u)]; + let _e176 = global_3.member[(_e136 + 7u)]; + let _e181 = global_3.member[(_e136 + 8u)]; + let _e187 = global_3.member[(_e136 + 9u)]; + let _e192 = global_3.member[(_e136 + 10u)]; + let _e198 = global_3.member[(_e136 + 11u)]; + let _e203 = global_3.member[(_e136 + 12u)]; + let _e208 = global_3.member[(_e136 + 13u)]; + let _e214 = global_3.member[(_e136 + 14u)]; + let _e219 = global_3.member[(_e136 + 15u)]; + let _e224 = global_3.member[(_e136 + 16u)]; + let _e229 = global_3.member[(_e136 + 17u)]; + local_3 = array(0u, 0u, 0u, 0u); + phi_519_ = type_11(0u, 4u); + loop { + let _e234 = phi_519_; + if (_e234.member < _e234.member_1) { + phi_520_ = type_11((_e234.member + 1u), _e234.member_1); + phi_543_ = type_11(1u, _e234.member); + } else { + phi_520_ = _e234; + phi_543_ = type_11(0u, type_11().member_1); + } + let _e247 = phi_520_; + let _e249 = phi_543_; + switch bitcast(_e249.member) { + case 0: { + phi_556_ = false; + break; + } + case 1: { + let _e256 = global_3.member[((_e136 + 18u) + _e249.member_1)]; + local_3[_e249.member_1] = _e256; + phi_556_ = true; + break; + } + default: { + phi_556_ = bool(); + break; + } + } + let _e259 = phi_556_; + continue; + continuing { + phi_519_ = _e247; + break if !(_e259); + } + } + let _e261 = local_3; + local_2 = array(0f, 0f, 0f, 0f); + phi_562_ = type_11(0u, 4u); + loop { + let _e264 = phi_562_; + if (_e264.member < _e264.member_1) { + phi_563_ = type_11((_e264.member + 1u), _e264.member_1); + phi_586_ = type_11(1u, _e264.member); + } else { + phi_563_ = _e264; + phi_586_ = type_11(0u, type_11().member_1); + } + let _e277 = phi_563_; + let _e279 = phi_586_; + switch bitcast(_e279.member) { + case 0: { + phi_600_ = false; + break; + } + case 1: { + let _e286 = global_3.member[((_e136 + 22u) + _e279.member_1)]; + local_2[_e279.member_1] = bitcast(_e286); + phi_600_ = true; + break; + } + default: { + phi_600_ = bool(); + break; + } + } + let _e290 = phi_600_; + continue; + continuing { + phi_562_ = _e277; + break if !(_e290); + } + } + let _e292 = local_2; + phi_606_ = type_11(0u, _e102); + phi_609_ = type_20(vec3(bitcast(_e139), bitcast(_e144), bitcast(_e149)), vec4(bitcast(_e155), bitcast(_e160), bitcast(_e165), bitcast(_e170)), vec3(bitcast(_e198), bitcast(_e203), bitcast(_e208)), vec4(bitcast(_e214), bitcast(_e219), bitcast(_e224), bitcast(_e229)), _e261, _e292, vec2(bitcast(_e176), bitcast(_e181)), vec2(bitcast(_e187), bitcast(_e192))); + loop { + let _e296 = phi_606_; + let _e298 = phi_609_; + local_4 = _e298; + local_5 = _e298; + local_22 = _e298; + if (_e296.member < _e296.member_1) { + phi_607_ = type_11((_e296.member + 1u), _e296.member_1); + phi_632_ = type_11(1u, _e296.member); + } else { + phi_607_ = _e296; + phi_632_ = type_11(0u, type_11().member_1); + } + let _e311 = phi_607_; + let _e313 = phi_632_; + switch bitcast(_e313.member) { + case 0: { + phi_610_ = type_20(); + phi_788_ = false; + break; + } + case 1: { + if (_e313.member_1 >= _e102) { + phi_649_ = 4294967295u; + } else { + phi_649_ = (_e98 + (2u * _e313.member_1)); + } + let _e321 = phi_649_; + if (_e66 >= 2u) { + phi_2284_ = (_e321 <= (_e66 - 2u)); + } else { + phi_2284_ = false; + } + let _e326 = phi_2284_; + if _e326 { + let _e329 = global_3.member[_e321]; + let _e333 = global_3.member[(_e321 + 1u)]; + phi_667_ = type_11(_e329, _e333); + } else { + phi_667_ = type_11(4294967295u, 0u); + } + let _e336 = phi_667_; + if (_e131 >= _e336.member_1) { + phi_2310_ = 4294967295u; + } else { + phi_2310_ = (_e336.member + (9u * _e131)); + } + let _e343 = phi_2310_; + if (_e66 >= 9u) { + phi_2329_ = (_e343 <= (_e66 - 9u)); + } else { + phi_2329_ = false; + } + let _e348 = phi_2329_; + if _e348 { + let _e351 = global_3.member[_e343]; + let _e356 = global_3.member[(_e343 + 1u)]; + let _e361 = global_3.member[(_e343 + 2u)]; + let _e367 = global_3.member[(_e343 + 3u)]; + let _e372 = global_3.member[(_e343 + 4u)]; + let _e377 = global_3.member[(_e343 + 5u)]; + let _e383 = global_3.member[(_e343 + 6u)]; + let _e388 = global_3.member[(_e343 + 7u)]; + let _e393 = global_3.member[(_e343 + 8u)]; + phi_717_ = type_23(vec3(bitcast(_e351), bitcast(_e356), bitcast(_e361)), vec3(bitcast(_e367), bitcast(_e372), bitcast(_e377)), vec3(bitcast(_e383), bitcast(_e388), bitcast(_e393))); + } else { + phi_717_ = type_23(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); + } + let _e398 = phi_717_; + if (_e313.member_1 >= _e110) { + phi_727_ = 4294967295u; + } else { + phi_727_ = (_e106 + _e313.member_1); + } + let _e402 = phi_727_; + if (_e66 >= 1u) { + phi_2351_ = (_e402 <= (_e66 - 1u)); + } else { + phi_2351_ = false; + } + let _e407 = phi_2351_; + if _e407 { + let _e410 = global_3.member[_e402]; + phi_735_ = bitcast(_e410); + } else { + phi_735_ = 0f; + } + let _e413 = phi_735_; + let _e436 = type_20(vec3(fma(_e413, _e398.member.x, _e298.member.x), fma(_e413, _e398.member.y, _e298.member.y), fma(_e413, _e398.member.z, _e298.member.z)), _e298.member_1, _e298.member_2, _e298.member_3, _e298.member_4, _e298.member_5, _e298.member_6, _e298.member_7); + let _e459 = type_20(_e436.member, _e436.member_1, vec3(fma(_e413, _e398.member_1.x, _e298.member_2.x), fma(_e413, _e398.member_1.y, _e298.member_2.y), fma(_e413, _e398.member_1.z, _e298.member_2.z)), _e436.member_3, _e436.member_4, _e436.member_5, _e436.member_6, _e436.member_7); + phi_610_ = type_20(_e459.member, _e459.member_1, _e459.member_2, vec4(fma(_e413, _e398.member_2.x, _e298.member_3.x), fma(_e413, _e398.member_2.y, _e298.member_3.y), fma(_e413, _e398.member_2.z, _e298.member_3.z), _e298.member_3.w), _e459.member_4, _e459.member_5, _e459.member_6, _e459.member_7); + phi_788_ = true; + break; + } + default: { + phi_610_ = type_20(); + phi_788_ = bool(); + break; + } + } + let _e486 = phi_610_; + let _e488 = phi_788_; + continue; + continuing { + phi_606_ = _e311; + phi_609_ = _e486; + break if !(_e488); + } + } + let _e493 = global_3.member[(_e114 + 6u)]; + if (_e493 == 1u) { + let _e496 = ((_e94 == 4294967295u) != true); + if _e496 { + if (_e66 >= 4u) { + phi_2371_ = (_e94 <= (_e66 - 4u)); + } else { + phi_2371_ = false; + } + let _e501 = phi_2371_; + if _e501 { + let _e504 = global_3.member[_e94]; + let _e508 = global_3.member[(_e94 + 1u)]; + let _e512 = global_3.member[(_e94 + 2u)]; + let _e516 = global_3.member[(_e94 + 3u)]; + phi_884_ = type_24(type_11(_e504, _e508), type_11(_e512, _e516)); + } else { + phi_884_ = type_24(type_11(4294967295u, 0u), type_11(4294967295u, 0u)); + } + let _e521 = phi_884_; + let _e523 = local_4; + local = _e523.member_5; + phi_887_ = type_11(0u, 4u); + phi_890_ = type_14(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); + loop { + let _e526 = phi_887_; + let _e528 = phi_890_; + local_6 = _e528; + local_7 = _e528; + local_8 = _e528; + local_9 = _e528; + local_10 = _e528; + local_11 = _e528; + local_12 = _e528; + local_13 = _e528; + local_14 = _e528; + local_15 = _e528; + local_16 = _e528; + local_17 = _e528; + local_18 = _e528; + local_19 = _e528; + local_20 = _e528; + local_21 = _e528; + local_23 = _e528; + if (_e526.member < _e526.member_1) { + phi_888_ = type_11((_e526.member + 1u), _e526.member_1); + phi_913_ = type_11(1u, _e526.member); + } else { + phi_888_ = _e526; + phi_913_ = type_11(0u, type_11().member_1); + } + let _e541 = phi_888_; + let _e543 = phi_913_; + switch bitcast(_e543.member) { + case 0: { + phi_891_ = type_14(); + phi_1315_ = false; + break; + } + case 1: { + let _e548 = local_5; + local_1 = _e548.member_4; + let _e550 = (_e543.member_1 < 4u); + if _e550 { + } else { + phi_2896_ = true; + break; + } + let _e552 = local_1[_e543.member_1]; + if (_e552 >= _e521.member.member_1) { + phi_937_ = 4294967295u; + } else { + phi_937_ = (_e521.member.member + _e552); + } + let _e560 = phi_937_; + if (_e66 >= 1u) { + phi_2405_ = (_e560 <= (_e66 - 1u)); + } else { + phi_2405_ = false; + } + let _e565 = phi_2405_; + if _e565 { + let _e568 = global_3.member[_e560]; + phi_946_ = _e568; + } else { + phi_946_ = 4294967295u; + } + let _e570 = phi_946_; + if (_e66 >= 10u) { + phi_2429_ = (_e570 <= (_e66 - 10u)); + } else { + phi_2429_ = false; + } + let _e575 = phi_2429_; + if _e575 { + let _e578 = global_3.member[_e570]; + let _e583 = global_3.member[(_e570 + 1u)]; + let _e588 = global_3.member[(_e570 + 2u)]; + let _e594 = global_3.member[(_e570 + 3u)]; + let _e599 = global_3.member[(_e570 + 4u)]; + let _e604 = global_3.member[(_e570 + 5u)]; + let _e609 = global_3.member[(_e570 + 6u)]; + let _e615 = global_3.member[(_e570 + 7u)]; + let _e620 = global_3.member[(_e570 + 8u)]; + let _e625 = global_3.member[(_e570 + 9u)]; + phi_995_ = type_17(vec3(bitcast(_e578), bitcast(_e583), bitcast(_e588)), vec4(bitcast(_e594), bitcast(_e599), bitcast(_e604), bitcast(_e609)), vec3(bitcast(_e615), bitcast(_e620), bitcast(_e625))); + } else { + phi_995_ = type_17(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + } + let _e630 = phi_995_; + if (_e552 >= _e521.member_1.member_1) { + phi_1005_ = 4294967295u; + } else { + phi_1005_ = (_e521.member_1.member + (16u * _e552)); + } + let _e639 = phi_1005_; + if (_e66 >= 16u) { + phi_2454_ = (_e639 <= (_e66 - 16u)); + } else { + phi_2454_ = false; + } + let _e644 = phi_2454_; + if _e644 { + let _e647 = global_3.member[_e639]; + let _e652 = global_3.member[(_e639 + 1u)]; + let _e657 = global_3.member[(_e639 + 2u)]; + let _e662 = global_3.member[(_e639 + 3u)]; + let _e668 = global_3.member[(_e639 + 4u)]; + let _e673 = global_3.member[(_e639 + 5u)]; + let _e678 = global_3.member[(_e639 + 6u)]; + let _e683 = global_3.member[(_e639 + 7u)]; + let _e689 = global_3.member[(_e639 + 8u)]; + let _e694 = global_3.member[(_e639 + 9u)]; + let _e699 = global_3.member[(_e639 + 10u)]; + let _e704 = global_3.member[(_e639 + 11u)]; + let _e710 = global_3.member[(_e639 + 12u)]; + let _e715 = global_3.member[(_e639 + 13u)]; + let _e720 = global_3.member[(_e639 + 14u)]; + let _e725 = global_3.member[(_e639 + 15u)]; + phi_1078_ = type_14(vec4(bitcast(_e647), bitcast(_e652), bitcast(_e657), bitcast(_e662)), vec4(bitcast(_e668), bitcast(_e673), bitcast(_e678), bitcast(_e683)), vec4(bitcast(_e689), bitcast(_e694), bitcast(_e699), bitcast(_e704)), vec4(bitcast(_e710), bitcast(_e715), bitcast(_e720), bitcast(_e725))); + } else { + phi_1078_ = type_14(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); + } + let _e730 = phi_1078_; + let _e738 = (_e630.member_1.x + _e630.member_1.x); + let _e739 = (_e630.member_1.y + _e630.member_1.y); + let _e740 = (_e630.member_1.z + _e630.member_1.z); + let _e742 = (_e630.member_1.z * _e740); + let _e743 = (_e630.member_1.w * _e738); + let _e744 = (_e630.member_1.w * _e739); + let _e745 = (_e630.member_1.w * _e740); + let _e765 = (vec4((1f - fma(_e630.member_1.y, _e739, _e742)), fma(_e630.member_1.x, _e739, _e745), fma(_e630.member_1.x, _e740, -(_e744)), 0f) * _e630.member_2.x); + let _e767 = (vec4(fma(_e630.member_1.x, _e739, -(_e745)), (1f - fma(_e630.member_1.x, _e738, _e742)), fma(_e630.member_1.y, _e740, _e743), 0f) * _e630.member_2.y); + let _e769 = (vec4(fma(_e630.member_1.x, _e740, _e744), fma(_e630.member_1.y, _e740, -(_e743)), (1f - fma(_e630.member_1.x, _e738, (_e630.member_1.y * _e739))), 0f) * _e630.member_2.z); + if _e550 { + } else { + phi_2896_ = true; + break; + } + let _e874 = local[_e543.member_1]; + phi_891_ = type_14((_e528.member + (vec4(fma(_e630.member.x, _e730.member.w, fma(_e769.x, _e730.member.z, fma(_e765.x, _e730.member.x, (_e767.x * _e730.member.y)))), fma(_e630.member.y, _e730.member.w, fma(_e769.y, _e730.member.z, fma(_e765.y, _e730.member.x, (_e767.y * _e730.member.y)))), fma(_e630.member.z, _e730.member.w, fma(_e769.z, _e730.member.z, fma(_e765.z, _e730.member.x, (_e767.z * _e730.member.y)))), (fma(_e769.w, _e730.member.z, fma(_e765.w, _e730.member.x, (_e767.w * _e730.member.y))) + _e730.member.w)) * _e874)), (_e528.member_1 + (vec4(fma(_e630.member.x, _e730.member_1.w, fma(_e769.x, _e730.member_1.z, fma(_e765.x, _e730.member_1.x, (_e767.x * _e730.member_1.y)))), fma(_e630.member.y, _e730.member_1.w, fma(_e769.y, _e730.member_1.z, fma(_e765.y, _e730.member_1.x, (_e767.y * _e730.member_1.y)))), fma(_e630.member.z, _e730.member_1.w, fma(_e769.z, _e730.member_1.z, fma(_e765.z, _e730.member_1.x, (_e767.z * _e730.member_1.y)))), (fma(_e769.w, _e730.member_1.z, fma(_e765.w, _e730.member_1.x, (_e767.w * _e730.member_1.y))) + _e730.member_1.w)) * _e874)), (_e528.member_2 + (vec4(fma(_e630.member.x, _e730.member_2.w, fma(_e769.x, _e730.member_2.z, fma(_e765.x, _e730.member_2.x, (_e767.x * _e730.member_2.y)))), fma(_e630.member.y, _e730.member_2.w, fma(_e769.y, _e730.member_2.z, fma(_e765.y, _e730.member_2.x, (_e767.y * _e730.member_2.y)))), fma(_e630.member.z, _e730.member_2.w, fma(_e769.z, _e730.member_2.z, fma(_e765.z, _e730.member_2.x, (_e767.z * _e730.member_2.y)))), (fma(_e769.w, _e730.member_2.z, fma(_e765.w, _e730.member_2.x, (_e767.w * _e730.member_2.y))) + _e730.member_2.w)) * _e874)), (_e528.member_3 + (vec4(fma(_e630.member.x, _e730.member_3.w, fma(_e769.x, _e730.member_3.z, fma(_e765.x, _e730.member_3.x, (_e767.x * _e730.member_3.y)))), fma(_e630.member.y, _e730.member_3.w, fma(_e769.y, _e730.member_3.z, fma(_e765.y, _e730.member_3.x, (_e767.y * _e730.member_3.y)))), fma(_e630.member.z, _e730.member_3.w, fma(_e769.z, _e730.member_3.z, fma(_e765.z, _e730.member_3.x, (_e767.z * _e730.member_3.y)))), (fma(_e769.w, _e730.member_3.z, fma(_e765.w, _e730.member_3.x, (_e767.w * _e730.member_3.y))) + _e730.member_3.w)) * _e874))); + phi_1315_ = true; + break; + } + default: { + phi_891_ = type_14(); + phi_1315_ = bool(); + break; + } + } + let _e889 = phi_891_; + let _e891 = phi_1315_; + continue; + continuing { + phi_887_ = _e541; + phi_890_ = _e889; + phi_2896_ = false; + break if !(_e891); + } + } + let _e894 = phi_2896_; + if _e894 { + break; + } + let _e896 = local_6; + let _e901 = global_5.member[0u]; + if (_e896.member.x == _e901) { + let _e904 = local_7; + let _e909 = global_5.member[1u]; + if (_e904.member.y == _e909) { + let _e912 = local_8; + let _e917 = global_5.member[2u]; + let _e918 = (_e912.member.z == _e917); + if _e918 { + let _e920 = local_9; + let _e925 = global_5.member[3u]; + phi_1342_ = (_e920.member.w == _e925); + } else { + phi_1342_ = bool(); + } + let _e928 = phi_1342_; + phi_1344_ = _e928; + phi_1345_ = select(true, false, _e918); + } else { + phi_1344_ = bool(); + phi_1345_ = true; + } + let _e931 = phi_1344_; + let _e933 = phi_1345_; + phi_1346_ = _e931; + phi_1347_ = _e933; + } else { + phi_1346_ = bool(); + phi_1347_ = true; + } + let _e935 = phi_1346_; + let _e937 = phi_1347_; + if select(_e935, false, _e937) { + let _e940 = local_10; + let _e945 = global_5.member_1[0u]; + if (_e940.member_1.x == _e945) { + let _e948 = local_11; + let _e953 = global_5.member_1[1u]; + if (_e948.member_1.y == _e953) { + let _e956 = local_12; + let _e961 = global_5.member_1[2u]; + let _e962 = (_e956.member_1.z == _e961); + if _e962 { + let _e964 = local_13; + let _e969 = global_5.member_1[3u]; + phi_1381_ = (_e964.member_1.w == _e969); + } else { + phi_1381_ = bool(); + } + let _e972 = phi_1381_; + phi_1383_ = _e972; + phi_1384_ = select(true, false, _e962); + } else { + phi_1383_ = bool(); + phi_1384_ = true; + } + let _e975 = phi_1383_; + let _e977 = phi_1384_; + phi_1385_ = _e975; + phi_1386_ = _e977; + } else { + phi_1385_ = bool(); + phi_1386_ = true; + } + let _e979 = phi_1385_; + let _e981 = phi_1386_; + if select(_e979, false, _e981) { + let _e984 = local_14; + let _e989 = global_5.member_2[0u]; + if (_e984.member_2.x == _e989) { + let _e992 = local_15; + let _e997 = global_5.member_2[1u]; + if (_e992.member_2.y == _e997) { + let _e1000 = local_16; + let _e1005 = global_5.member_2[2u]; + let _e1006 = (_e1000.member_2.z == _e1005); + if _e1006 { + let _e1008 = local_17; + let _e1013 = global_5.member_2[3u]; + phi_1420_ = (_e1008.member_2.w == _e1013); + } else { + phi_1420_ = bool(); + } + let _e1016 = phi_1420_; + phi_1422_ = _e1016; + phi_1423_ = select(true, false, _e1006); + } else { + phi_1422_ = bool(); + phi_1423_ = true; + } + let _e1019 = phi_1422_; + let _e1021 = phi_1423_; + phi_1424_ = _e1019; + phi_1425_ = _e1021; + } else { + phi_1424_ = bool(); + phi_1425_ = true; + } + let _e1023 = phi_1424_; + let _e1025 = phi_1425_; + let _e1026 = select(_e1023, false, _e1025); + if _e1026 { + let _e1028 = local_18; + let _e1033 = global_5.member_3[0u]; + if (_e1028.member_3.x == _e1033) { + let _e1036 = local_19; + let _e1041 = global_5.member_3[1u]; + if (_e1036.member_3.y == _e1041) { + let _e1044 = local_20; + let _e1049 = global_5.member_3[2u]; + let _e1050 = (_e1044.member_3.z == _e1049); + if _e1050 { + let _e1052 = local_21; + let _e1057 = global_5.member_3[3u]; + phi_1459_ = (_e1052.member_3.w == _e1057); + } else { + phi_1459_ = bool(); + } + let _e1060 = phi_1459_; + phi_1461_ = _e1060; + phi_1462_ = select(true, false, _e1050); + } else { + phi_1461_ = bool(); + phi_1462_ = true; + } + let _e1063 = phi_1461_; + let _e1065 = phi_1462_; + phi_1463_ = _e1063; + phi_1464_ = _e1065; + } else { + phi_1463_ = bool(); + phi_1464_ = true; + } + let _e1067 = phi_1463_; + let _e1069 = phi_1464_; + phi_1469_ = select(_e1067, false, _e1069); + } else { + phi_1469_ = bool(); + } + let _e1072 = phi_1469_; + phi_1471_ = _e1072; + phi_1472_ = select(true, false, _e1026); + } else { + phi_1471_ = bool(); + phi_1472_ = true; + } + let _e1075 = phi_1471_; + let _e1077 = phi_1472_; + phi_1473_ = _e1075; + phi_1474_ = _e1077; + } else { + phi_1473_ = bool(); + phi_1474_ = true; + } + let _e1079 = phi_1473_; + let _e1081 = phi_1474_; + if select(_e1079, false, _e1081) { + phi_1482_ = type_14(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); + } else { + let _e1607 = local_23; + phi_1482_ = _e1607; + } + let _e1084 = phi_1482_; + let _e1107 = fma(_e1084.member_2.z, _e1084.member_3.w, -((_e1084.member_2.w * _e1084.member_3.z))); + let _e1110 = fma(_e1084.member_2.y, _e1084.member_3.w, -((_e1084.member_2.w * _e1084.member_3.y))); + let _e1113 = fma(_e1084.member_2.y, _e1084.member_3.z, -((_e1084.member_2.z * _e1084.member_3.y))); + let _e1116 = fma(_e1084.member_2.x, _e1084.member_3.w, -((_e1084.member_2.w * _e1084.member_3.x))); + let _e1119 = fma(_e1084.member_2.x, _e1084.member_3.z, -((_e1084.member_2.z * _e1084.member_3.x))); + let _e1122 = fma(_e1084.member_2.x, _e1084.member_3.y, -((_e1084.member_2.y * _e1084.member_3.x))); + let _e1144 = fma(-(_e1084.member.w), fma(_e1084.member_1.z, _e1122, fma(_e1084.member_1.x, _e1113, -((_e1084.member_1.y * _e1119)))), fma(_e1084.member.z, fma(_e1084.member_1.w, _e1122, fma(_e1084.member_1.x, _e1110, -((_e1084.member_1.y * _e1116)))), fma(_e1084.member.x, fma(_e1084.member_1.w, _e1113, fma(_e1084.member_1.y, _e1107, -((_e1084.member_1.z * _e1110)))), -((_e1084.member.y * fma(_e1084.member_1.w, _e1119, fma(_e1084.member_1.x, _e1107, -((_e1084.member_1.z * _e1116))))))))); + if (_e1144 == 0f) { + phi_2701_ = type_17(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); + phi_2702_ = type_17(); + phi_2703_ = true; + } else { + let _e1153 = (sqrt(fma(_e1084.member.w, _e1084.member.w, fma(_e1084.member.z, _e1084.member.z, fma(_e1084.member.x, _e1084.member.x, (_e1084.member.y * _e1084.member.y))))) * select(-1f, 1f, (_e1144 >= 0f))); + let _e1158 = sqrt(fma(_e1084.member_1.w, _e1084.member_1.w, fma(_e1084.member_1.z, _e1084.member_1.z, fma(_e1084.member_1.x, _e1084.member_1.x, (_e1084.member_1.y * _e1084.member_1.y))))); + let _e1163 = sqrt(fma(_e1084.member_2.w, _e1084.member_2.w, fma(_e1084.member_2.z, _e1084.member_2.z, fma(_e1084.member_2.x, _e1084.member_2.x, (_e1084.member_2.y * _e1084.member_2.y))))); + if (_e1153 != 0f) { + phi_2589_ = select(true, false, (_e1158 != 0f)); + } else { + phi_2589_ = true; + } + let _e1170 = phi_2589_; + let _e1171 = select((_e1163 != 0f), false, _e1170); + if _e1171 { + let _e1172 = (1f / _e1153); + let _e1173 = (1f / _e1158); + let _e1174 = (1f / _e1163); + let _e1175 = (_e1084.member.x * _e1172); + let _e1176 = (_e1084.member.z * _e1172); + let _e1177 = (_e1084.member_1.x * _e1173); + let _e1178 = (_e1084.member_2.x * _e1174); + let _e1179 = (_e1084.member_2.y * _e1174); + if ((_e1084.member_2.z * _e1174) <= 0f) { + let _e1214 = fma(_e1084.member_1.y, _e1173, -(_e1175)); + let _e1216 = fma(-(_e1084.member_2.z), _e1174, 1f); + if (_e1214 <= 0f) { + let _e1230 = (_e1216 - _e1214); + let _e1232 = (0.5f / sqrt(_e1230)); + phi_2684_ = vec4((_e1230 * _e1232), (fma(_e1084.member.y, _e1172, _e1177) * _e1232), (fma(_e1084.member.z, _e1172, _e1178) * _e1232), (fma(_e1084.member_1.z, _e1173, -(_e1179)) * _e1232)); + } else { + let _e1218 = (_e1216 + _e1214); + let _e1220 = (0.5f / sqrt(_e1218)); + phi_2684_ = vec4((fma(_e1084.member.y, _e1172, _e1177) * _e1220), (_e1218 * _e1220), (fma(_e1084.member_1.z, _e1173, _e1179) * _e1220), (fma(_e1084.member_2.x, _e1174, -(_e1176)) * _e1220)); + } + let _e1243 = phi_2684_; + phi_2686_ = _e1243; + } else { + let _e1182 = fma(_e1084.member_1.y, _e1173, _e1175); + let _e1183 = fma(_e1084.member_2.z, _e1174, 1f); + if (_e1182 <= 0f) { + let _e1199 = (_e1183 - _e1182); + let _e1201 = (0.5f / sqrt(_e1199)); + phi_2654_ = vec4((fma(_e1084.member.z, _e1172, _e1178) * _e1201), (fma(_e1084.member_1.z, _e1173, _e1179) * _e1201), (_e1199 * _e1201), (fma(_e1084.member.y, _e1172, -(_e1177)) * _e1201)); + } else { + let _e1185 = (_e1183 + _e1182); + let _e1187 = (0.5f / sqrt(_e1185)); + phi_2654_ = vec4((fma(_e1084.member_1.z, _e1173, -(_e1179)) * _e1187), (fma(_e1084.member_2.x, _e1174, -(_e1176)) * _e1187), (fma(_e1084.member.y, _e1172, -(_e1177)) * _e1187), (_e1185 * _e1187)); + } + let _e1212 = phi_2654_; + phi_2686_ = _e1212; + } + let _e1245 = phi_2686_; + phi_2695_ = type_17(vec3(_e1153, _e1158, _e1163), _e1245, vec3(_e1084.member_3.x, _e1084.member_3.y, _e1084.member_3.z)); + phi_2696_ = type_17(); + } else { + phi_2695_ = type_17(); + phi_2696_ = type_17(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); + } + let _e1249 = phi_2695_; + let _e1251 = phi_2696_; + phi_2701_ = _e1251; + phi_2702_ = _e1249; + phi_2703_ = select(true, false, _e1171); + } + let _e1254 = phi_2701_; + let _e1256 = phi_2702_; + let _e1258 = phi_2703_; + if _e1258 { + phi_2707_ = _e1254; + } else { + phi_2707_ = _e1256; + } + let _e1260 = phi_2707_; + phi_1484_ = type_17(_e1260.member_2, _e1260.member_1, _e1260.member); + } else { + phi_1484_ = type_17(); + } + let _e1266 = phi_1484_; + phi_1486_ = _e1266; + phi_1487_ = select(true, false, _e496); + } else { + phi_1486_ = type_17(); + phi_1487_ = true; + } + let _e1269 = phi_1486_; + let _e1271 = phi_1487_; + if _e1271 { + if (_e66 >= 10u) { + phi_2801_ = (_e90 <= (_e66 - 10u)); + } else { + phi_2801_ = false; + } + let _e1276 = phi_2801_; + if _e1276 { + let _e1279 = global_3.member[_e90]; + let _e1284 = global_3.member[(_e90 + 1u)]; + let _e1289 = global_3.member[(_e90 + 2u)]; + let _e1295 = global_3.member[(_e90 + 3u)]; + let _e1300 = global_3.member[(_e90 + 4u)]; + let _e1305 = global_3.member[(_e90 + 5u)]; + let _e1310 = global_3.member[(_e90 + 6u)]; + let _e1316 = global_3.member[(_e90 + 7u)]; + let _e1321 = global_3.member[(_e90 + 8u)]; + let _e1326 = global_3.member[(_e90 + 9u)]; + phi_1540_ = type_17(vec3(bitcast(_e1279), bitcast(_e1284), bitcast(_e1289)), vec4(bitcast(_e1295), bitcast(_e1300), bitcast(_e1305), bitcast(_e1310)), vec3(bitcast(_e1316), bitcast(_e1321), bitcast(_e1326))); + } else { + phi_1540_ = type_17(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + } + let _e1331 = phi_1540_; + phi_1541_ = _e1331; + } else { + phi_1541_ = _e1269; + } + let _e1333 = phi_1541_; + let _e1341 = (_e1333.member_1.x + _e1333.member_1.x); + let _e1342 = (_e1333.member_1.y + _e1333.member_1.y); + let _e1343 = (_e1333.member_1.z + _e1333.member_1.z); + let _e1345 = (_e1333.member_1.z * _e1343); + let _e1346 = (_e1333.member_1.w * _e1341); + let _e1347 = (_e1333.member_1.w * _e1342); + let _e1348 = (_e1333.member_1.w * _e1343); + let _e1368 = (vec4((1f - fma(_e1333.member_1.y, _e1342, _e1345)), fma(_e1333.member_1.x, _e1342, _e1348), fma(_e1333.member_1.x, _e1343, -(_e1347)), 0f) * _e1333.member_2.x); + let _e1370 = (vec4(fma(_e1333.member_1.x, _e1342, -(_e1348)), (1f - fma(_e1333.member_1.x, _e1341, _e1345)), fma(_e1333.member_1.y, _e1343, _e1346), 0f) * _e1333.member_2.y); + let _e1372 = (vec4(fma(_e1333.member_1.x, _e1343, _e1347), fma(_e1333.member_1.y, _e1343, -(_e1346)), (1f - fma(_e1333.member_1.x, _e1341, (_e1333.member_1.y * _e1342))), 0f) * _e1333.member_2.z); + let _e1377 = local_22; + let _e1400 = (_e1333.member.x + fma(_e1372.x, _e1377.member.z, fma(_e1370.x, _e1377.member.y, (_e1368.x * _e1377.member.x)))); + let _e1401 = (_e1333.member.y + fma(_e1372.y, _e1377.member.z, fma(_e1370.y, _e1377.member.y, (_e1368.y * _e1377.member.x)))); + let _e1402 = (_e1333.member.z + fma(_e1372.z, _e1377.member.z, fma(_e1370.z, _e1377.member.y, (_e1368.z * _e1377.member.x)))); + let _e1405 = global_4.member[3u]; + let _e1408 = global_4.member[4u]; + let _e1411 = global_4.member[_e1405]; + let _e1415 = global_4.member[(_e1405 + 1u)]; + if (_e1408 >= _e1415) { + phi_1654_ = 4294967295u; + } else { + phi_1654_ = (_e1411 + (16u * _e1408)); + } + let _e1420 = phi_1654_; + let _e1423 = global_4.member[_e1420]; + let _e1428 = global_4.member[(_e1420 + 1u)]; + let _e1433 = global_4.member[(_e1420 + 2u)]; + let _e1438 = global_4.member[(_e1420 + 3u)]; + let _e1443 = global_4.member[(_e1420 + 4u)]; + let _e1448 = global_4.member[(_e1420 + 5u)]; + let _e1453 = global_4.member[(_e1420 + 6u)]; + let _e1458 = global_4.member[(_e1420 + 7u)]; + let _e1463 = global_4.member[(_e1420 + 8u)]; + let _e1468 = global_4.member[(_e1420 + 9u)]; + let _e1473 = global_4.member[(_e1420 + 10u)]; + let _e1478 = global_4.member[(_e1420 + 11u)]; + let _e1483 = global_4.member[(_e1420 + 12u)]; + let _e1488 = global_4.member[(_e1420 + 13u)]; + let _e1493 = global_4.member[(_e1420 + 14u)]; + let _e1498 = global_4.member[(_e1420 + 15u)]; + global_1 = vec4((fma(bitcast(_e1463), _e1402, fma(bitcast(_e1423), _e1400, (bitcast(_e1443) * _e1401))) + bitcast(_e1483)), (fma(bitcast(_e1468), _e1402, fma(bitcast(_e1428), _e1400, (bitcast(_e1448) * _e1401))) + bitcast(_e1488)), (fma(bitcast(_e1473), _e1402, fma(bitcast(_e1433), _e1400, (bitcast(_e1453) * _e1401))) + bitcast(_e1493)), (fma(bitcast(_e1478), _e1402, fma(bitcast(_e1438), _e1400, (bitcast(_e1458) * _e1401))) + bitcast(_e1498))); + } else { + global_1 = vec4(10f, 10f, 10f, 1f); + } + break; + } + } + return; +} + +@vertex +fn lightshadow_mapping_vertex(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> @builtin(position) vec4 { + global_2 = param; + global = param_1; + function(); + let _e6 = global_1.y; + global_1.y = -(_e6); + let _e8 = global_1; + return _e8; +} diff --git a/crates/renderling/shaders/manifest.json b/crates/renderling/shaders/manifest.json index 0b2d812e..e9fea022 100644 --- a/crates/renderling/shaders/manifest.json +++ b/crates/renderling/shaders/manifest.json @@ -1,4 +1,14 @@ [ + { + "source_path": "shaders/atlas-atlas_blit_fragment.spv", + "entry_point": "atlas::atlas_blit_fragment", + "wgsl_entry_point": "atlasatlas_blit_fragment" + }, + { + "source_path": "shaders/atlas-atlas_blit_vertex.spv", + "entry_point": "atlas::atlas_blit_vertex", + "wgsl_entry_point": "atlasatlas_blit_vertex" + }, { "source_path": "shaders/bloom-bloom_downsample_fragment.spv", "entry_point": "bloom::bloom_downsample_fragment", @@ -49,6 +59,16 @@ "entry_point": "convolution::prefilter_environment_cubemap_vertex", "wgsl_entry_point": "convolutionprefilter_environment_cubemap_vertex" }, + { + "source_path": "shaders/cubemap-cubemap_sampling_test_fragment.spv", + "entry_point": "cubemap::cubemap_sampling_test_fragment", + "wgsl_entry_point": "cubemapcubemap_sampling_test_fragment" + }, + { + "source_path": "shaders/cubemap-cubemap_sampling_test_vertex.spv", + "entry_point": "cubemap::cubemap_sampling_test_vertex", + "wgsl_entry_point": "cubemapcubemap_sampling_test_vertex" + }, { "source_path": "shaders/cull-compute_copy_depth_to_pyramid.spv", "entry_point": "cull::compute_copy_depth_to_pyramid", @@ -84,6 +104,16 @@ "entry_point": "ibl::diffuse_irradiance::di_convolution_fragment", "wgsl_entry_point": "ibldiffuse_irradiancedi_convolution_fragment" }, + { + "source_path": "shaders/light-shadow_mapping_fragment.spv", + "entry_point": "light::shadow_mapping_fragment", + "wgsl_entry_point": "lightshadow_mapping_fragment" + }, + { + "source_path": "shaders/light-shadow_mapping_vertex.spv", + "entry_point": "light::shadow_mapping_vertex", + "wgsl_entry_point": "lightshadow_mapping_vertex" + }, { "source_path": "shaders/skybox-skybox_cubemap_fragment.spv", "entry_point": "skybox::skybox_cubemap_fragment", diff --git a/crates/renderling/shaders/skybox-skybox_cubemap_fragment.spv b/crates/renderling/shaders/skybox-skybox_cubemap_fragment.spv index e72ba1d5..d3c61bab 100644 Binary files a/crates/renderling/shaders/skybox-skybox_cubemap_fragment.spv and b/crates/renderling/shaders/skybox-skybox_cubemap_fragment.spv differ diff --git a/crates/renderling/shaders/skybox-skybox_cubemap_vertex.spv b/crates/renderling/shaders/skybox-skybox_cubemap_vertex.spv index a8844f9b..f4a16170 100644 Binary files a/crates/renderling/shaders/skybox-skybox_cubemap_vertex.spv and b/crates/renderling/shaders/skybox-skybox_cubemap_vertex.spv differ diff --git a/crates/renderling/shaders/skybox-skybox_cubemap_vertex.wgsl b/crates/renderling/shaders/skybox-skybox_cubemap_vertex.wgsl index 275cf699..77dbca5d 100644 --- a/crates/renderling/shaders/skybox-skybox_cubemap_vertex.wgsl +++ b/crates/renderling/shaders/skybox-skybox_cubemap_vertex.wgsl @@ -1,29 +1,30 @@ -struct type_10 { +struct type_3 { member: array, } -struct type_19 { +struct type_12 { + member: u32, + member_1: u32, +} + +struct type_20 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_20 { +struct type_21 { member: array, 8>, member_1: array, 6>, + member_2: vec3, } -struct type_21 { - member: type_19, - member_1: type_19, - member_2: type_20, - member_3: vec3, -} - -struct type_23 { - member: u32, - member_1: u32, +struct type_22 { + member: type_20, + member_1: type_20, + member_2: vec3, + member_3: type_21, } struct VertexOutput { @@ -31,9 +32,9 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: u32; @group(0) @binding(0) -var global_1: type_10; +var global: type_3; +var global_1: u32; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); var global_3: vec3; var global_4: u32; @@ -42,89 +43,89 @@ fn function() { var local: array, 8>; var local_1: array, 6>; var local_2: array, 36>; - var phi_705_: bool; - var phi_517_: type_23; - var phi_518_: type_23; - var phi_541_: type_23; + var phi_718_: bool; + var phi_517_: type_12; + var phi_518_: type_12; + var phi_541_: type_12; var phi_568_: bool; - var phi_574_: type_23; - var phi_575_: type_23; - var phi_598_: type_23; + var phi_574_: type_12; + var phi_575_: type_12; + var phi_598_: type_12; var phi_621_: bool; - var phi_629_: type_21; + var phi_642_: type_22; switch bitcast(0u) { default: { - let _e78 = global_4; - let _e79 = global; - let _e81 = arrayLength((&global_1.member)); - if (_e81 >= 83u) { - phi_705_ = (_e78 <= (_e81 - 83u)); + let _e81 = global_4; + let _e82 = global_1; + let _e84 = arrayLength((&global.member)); + if (_e84 >= 86u) { + phi_718_ = (_e81 <= (_e84 - 86u)); } else { - phi_705_ = false; + phi_718_ = false; } - let _e86 = phi_705_; - if _e86 { - let _e89 = global_1.member[_e78]; - let _e94 = global_1.member[(_e78 + 1u)]; - let _e99 = global_1.member[(_e78 + 2u)]; - let _e104 = global_1.member[(_e78 + 3u)]; - let _e110 = global_1.member[(_e78 + 4u)]; - let _e115 = global_1.member[(_e78 + 5u)]; - let _e120 = global_1.member[(_e78 + 6u)]; - let _e125 = global_1.member[(_e78 + 7u)]; - let _e131 = global_1.member[(_e78 + 8u)]; - let _e136 = global_1.member[(_e78 + 9u)]; - let _e141 = global_1.member[(_e78 + 10u)]; - let _e146 = global_1.member[(_e78 + 11u)]; - let _e152 = global_1.member[(_e78 + 12u)]; - let _e157 = global_1.member[(_e78 + 13u)]; - let _e162 = global_1.member[(_e78 + 14u)]; - let _e167 = global_1.member[(_e78 + 15u)]; - let _e174 = global_1.member[(_e78 + 16u)]; - let _e179 = global_1.member[(_e78 + 17u)]; - let _e184 = global_1.member[(_e78 + 18u)]; - let _e189 = global_1.member[(_e78 + 19u)]; - let _e195 = global_1.member[(_e78 + 20u)]; - let _e200 = global_1.member[(_e78 + 21u)]; - let _e205 = global_1.member[(_e78 + 22u)]; - let _e210 = global_1.member[(_e78 + 23u)]; - let _e216 = global_1.member[(_e78 + 24u)]; - let _e221 = global_1.member[(_e78 + 25u)]; - let _e226 = global_1.member[(_e78 + 26u)]; - let _e231 = global_1.member[(_e78 + 27u)]; - let _e237 = global_1.member[(_e78 + 28u)]; - let _e242 = global_1.member[(_e78 + 29u)]; - let _e247 = global_1.member[(_e78 + 30u)]; - let _e252 = global_1.member[(_e78 + 31u)]; - let _e259 = global_1.member[(_e78 + 32u)]; - let _e264 = global_1.member[(_e78 + 33u)]; - let _e269 = global_1.member[(_e78 + 34u)]; + let _e89 = phi_718_; + if _e89 { + let _e92 = global.member[_e81]; + let _e97 = global.member[(_e81 + 1u)]; + let _e102 = global.member[(_e81 + 2u)]; + let _e107 = global.member[(_e81 + 3u)]; + let _e113 = global.member[(_e81 + 4u)]; + let _e118 = global.member[(_e81 + 5u)]; + let _e123 = global.member[(_e81 + 6u)]; + let _e128 = global.member[(_e81 + 7u)]; + let _e134 = global.member[(_e81 + 8u)]; + let _e139 = global.member[(_e81 + 9u)]; + let _e144 = global.member[(_e81 + 10u)]; + let _e149 = global.member[(_e81 + 11u)]; + let _e155 = global.member[(_e81 + 12u)]; + let _e160 = global.member[(_e81 + 13u)]; + let _e165 = global.member[(_e81 + 14u)]; + let _e170 = global.member[(_e81 + 15u)]; + let _e177 = global.member[(_e81 + 16u)]; + let _e182 = global.member[(_e81 + 17u)]; + let _e187 = global.member[(_e81 + 18u)]; + let _e192 = global.member[(_e81 + 19u)]; + let _e198 = global.member[(_e81 + 20u)]; + let _e203 = global.member[(_e81 + 21u)]; + let _e208 = global.member[(_e81 + 22u)]; + let _e213 = global.member[(_e81 + 23u)]; + let _e219 = global.member[(_e81 + 24u)]; + let _e224 = global.member[(_e81 + 25u)]; + let _e229 = global.member[(_e81 + 26u)]; + let _e234 = global.member[(_e81 + 27u)]; + let _e240 = global.member[(_e81 + 28u)]; + let _e245 = global.member[(_e81 + 29u)]; + let _e250 = global.member[(_e81 + 30u)]; + let _e255 = global.member[(_e81 + 31u)]; + let _e262 = global.member[(_e81 + 32u)]; + let _e267 = global.member[(_e81 + 33u)]; + let _e272 = global.member[(_e81 + 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_517_ = type_23(0u, 6u); + phi_517_ = type_12(0u, 6u); loop { - let _e274 = phi_517_; - if (_e274.member < _e274.member_1) { - phi_518_ = type_23((_e274.member + 1u), _e274.member_1); - phi_541_ = type_23(1u, _e274.member); + let _e277 = phi_517_; + if (_e277.member < _e277.member_1) { + phi_518_ = type_12((_e277.member + 1u), _e277.member_1); + phi_541_ = type_12(1u, _e277.member); } else { - phi_518_ = _e274; - phi_541_ = type_23(0u, type_23().member_1); + phi_518_ = _e277; + phi_541_ = type_12(0u, type_12().member_1); } - let _e287 = phi_518_; - let _e289 = phi_541_; - switch bitcast(_e289.member) { + let _e290 = phi_518_; + let _e292 = phi_541_; + switch bitcast(_e292.member) { case 0: { phi_568_ = false; break; } case 1: { - let _e294 = ((_e78 + 35u) + (_e289.member_1 * 4u)); - let _e297 = global_1.member[_e294]; - let _e302 = global_1.member[(_e294 + 1u)]; - 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)); + let _e297 = ((_e81 + 35u) + (_e292.member_1 * 4u)); + let _e300 = global.member[_e297]; + let _e305 = global.member[(_e297 + 1u)]; + let _e310 = global.member[(_e297 + 2u)]; + let _e315 = global.member[(_e297 + 3u)]; + local_1[_e292.member_1] = vec4(bitcast(_e300), bitcast(_e305), bitcast(_e310), bitcast(_e315)); phi_568_ = true; break; } @@ -133,38 +134,38 @@ fn function() { break; } } - let _e317 = phi_568_; + let _e320 = phi_568_; continue; continuing { - phi_517_ = _e287; - break if !(_e317); + phi_517_ = _e290; + break if !(_e320); } } - let _e319 = local_1; + let _e322 = 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_574_ = type_23(0u, 8u); + phi_574_ = type_12(0u, 8u); loop { - let _e322 = phi_574_; - if (_e322.member < _e322.member_1) { - phi_575_ = type_23((_e322.member + 1u), _e322.member_1); - phi_598_ = type_23(1u, _e322.member); + let _e325 = phi_574_; + if (_e325.member < _e325.member_1) { + phi_575_ = type_12((_e325.member + 1u), _e325.member_1); + phi_598_ = type_12(1u, _e325.member); } else { - phi_575_ = _e322; - phi_598_ = type_23(0u, type_23().member_1); + phi_575_ = _e325; + phi_598_ = type_12(0u, type_12().member_1); } - let _e335 = phi_575_; - let _e337 = phi_598_; - switch bitcast(_e337.member) { + let _e338 = phi_575_; + let _e340 = phi_598_; + switch bitcast(_e340.member) { case 0: { phi_621_ = false; break; } case 1: { - let _e342 = ((_e78 + 59u) + (_e337.member_1 * 3u)); - let _e345 = global_1.member[_e342]; - 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)); + let _e345 = ((_e81 + 59u) + (_e340.member_1 * 3u)); + let _e348 = global.member[_e345]; + let _e353 = global.member[(_e345 + 1u)]; + let _e358 = global.member[(_e345 + 2u)]; + local[_e340.member_1] = vec3(bitcast(_e348), bitcast(_e353), bitcast(_e358)); phi_621_ = true; break; } @@ -173,27 +174,30 @@ fn function() { break; } } - let _e360 = phi_621_; + let _e363 = phi_621_; continue; continuing { - phi_574_ = _e335; - break if !(_e360); + phi_574_ = _e338; + break if !(_e363); } } - let _e362 = local; - phi_629_ = 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))); + let _e365 = local; + let _e369 = global.member[(_e81 + 83u)]; + let _e374 = global.member[(_e81 + 84u)]; + let _e379 = global.member[(_e81 + 85u)]; + phi_642_ = type_22(type_20(vec4(bitcast(_e92), bitcast(_e97), bitcast(_e102), bitcast(_e107)), vec4(bitcast(_e113), bitcast(_e118), bitcast(_e123), bitcast(_e128)), vec4(bitcast(_e134), bitcast(_e139), bitcast(_e144), bitcast(_e149)), vec4(bitcast(_e155), bitcast(_e160), bitcast(_e165), bitcast(_e170))), type_20(vec4(bitcast(_e177), bitcast(_e182), bitcast(_e187), bitcast(_e192)), vec4(bitcast(_e198), bitcast(_e203), bitcast(_e208), bitcast(_e213)), vec4(bitcast(_e219), bitcast(_e224), bitcast(_e229), bitcast(_e234)), vec4(bitcast(_e240), bitcast(_e245), bitcast(_e250), bitcast(_e255))), vec3(bitcast(_e262), bitcast(_e267), bitcast(_e272)), type_21(_e365, _e322, vec3(bitcast(_e369), bitcast(_e374), bitcast(_e379)))); } else { - phi_629_ = 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_642_ = 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)), vec3(0f, 0f, 0f), 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 _e366 = phi_629_; + let _e385 = phi_642_; 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) { + if (_e82 < 36u) { } else { break; } - let _e371 = local_2[_e79]; - global_3 = _e371; - global_2 = vec4((fma(fma(_e366.member.member_3.x, _e366.member_1.member_2.w, 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)))), _e371.z, fma(fma(_e366.member.member_3.x, _e366.member_1.member.w, 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)))), _e371.x, (fma(_e366.member.member_3.x, _e366.member_1.member_1.w, 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)))) * _e371.y))) + fma(_e366.member.member_3.x, _e366.member_1.member_3.w, fma(_e366.member.member_2.x, _e366.member_1.member_3.z, fma(_e366.member.member.x, _e366.member_1.member_3.x, (_e366.member.member_1.x * _e366.member_1.member_3.y))))), (fma(fma(_e366.member.member_3.y, _e366.member_1.member_2.w, 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)))), _e371.z, fma(fma(_e366.member.member_3.y, _e366.member_1.member.w, 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)))), _e371.x, (fma(_e366.member.member_3.y, _e366.member_1.member_1.w, 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)))) * _e371.y))) + fma(_e366.member.member_3.y, _e366.member_1.member_3.w, fma(_e366.member.member_2.y, _e366.member_1.member_3.z, fma(_e366.member.member.y, _e366.member_1.member_3.x, (_e366.member.member_1.y * _e366.member_1.member_3.y))))), (fma(fma(_e366.member.member_3.z, _e366.member_1.member_2.w, fma(_e366.member.member_2.z, _e366.member_1.member_2.z, fma(_e366.member.member.z, _e366.member_1.member_2.x, (_e366.member.member_1.z * _e366.member_1.member_2.y)))), _e371.z, fma(fma(_e366.member.member_3.z, _e366.member_1.member.w, fma(_e366.member.member_2.z, _e366.member_1.member.z, fma(_e366.member.member.z, _e366.member_1.member.x, (_e366.member.member_1.z * _e366.member_1.member.y)))), _e371.x, (fma(_e366.member.member_3.z, _e366.member_1.member_1.w, fma(_e366.member.member_2.z, _e366.member_1.member_1.z, fma(_e366.member.member.z, _e366.member_1.member_1.x, (_e366.member.member_1.z * _e366.member_1.member_1.y)))) * _e371.y))) + fma(_e366.member.member_3.z, _e366.member_1.member_3.w, fma(_e366.member.member_2.z, _e366.member_1.member_3.z, fma(_e366.member.member.z, _e366.member_1.member_3.x, (_e366.member.member_1.z * _e366.member_1.member_3.y))))), (fma(fma(_e366.member.member_3.w, _e366.member_1.member_2.w, 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)))), _e371.z, fma(fma(_e366.member.member_3.w, _e366.member_1.member.w, 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)))), _e371.x, (fma(_e366.member.member_3.w, _e366.member_1.member_1.w, 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)))) * _e371.y))) + fma(_e366.member.member_3.w, _e366.member_1.member_3.w, fma(_e366.member.member_2.w, _e366.member_1.member_3.z, fma(_e366.member.member.w, _e366.member_1.member_3.x, (_e366.member.member_1.w * _e366.member_1.member_3.y)))))); + let _e390 = local_2[_e82]; + global_3 = _e390; + global_2 = vec4((fma(fma(_e385.member.member_3.x, _e385.member_1.member_2.w, fma(_e385.member.member_2.x, _e385.member_1.member_2.z, fma(_e385.member.member.x, _e385.member_1.member_2.x, (_e385.member.member_1.x * _e385.member_1.member_2.y)))), _e390.z, fma(fma(_e385.member.member_3.x, _e385.member_1.member.w, fma(_e385.member.member_2.x, _e385.member_1.member.z, fma(_e385.member.member.x, _e385.member_1.member.x, (_e385.member.member_1.x * _e385.member_1.member.y)))), _e390.x, (fma(_e385.member.member_3.x, _e385.member_1.member_1.w, fma(_e385.member.member_2.x, _e385.member_1.member_1.z, fma(_e385.member.member.x, _e385.member_1.member_1.x, (_e385.member.member_1.x * _e385.member_1.member_1.y)))) * _e390.y))) + fma(_e385.member.member_3.x, _e385.member_1.member_3.w, fma(_e385.member.member_2.x, _e385.member_1.member_3.z, fma(_e385.member.member.x, _e385.member_1.member_3.x, (_e385.member.member_1.x * _e385.member_1.member_3.y))))), (fma(fma(_e385.member.member_3.y, _e385.member_1.member_2.w, fma(_e385.member.member_2.y, _e385.member_1.member_2.z, fma(_e385.member.member.y, _e385.member_1.member_2.x, (_e385.member.member_1.y * _e385.member_1.member_2.y)))), _e390.z, fma(fma(_e385.member.member_3.y, _e385.member_1.member.w, fma(_e385.member.member_2.y, _e385.member_1.member.z, fma(_e385.member.member.y, _e385.member_1.member.x, (_e385.member.member_1.y * _e385.member_1.member.y)))), _e390.x, (fma(_e385.member.member_3.y, _e385.member_1.member_1.w, fma(_e385.member.member_2.y, _e385.member_1.member_1.z, fma(_e385.member.member.y, _e385.member_1.member_1.x, (_e385.member.member_1.y * _e385.member_1.member_1.y)))) * _e390.y))) + fma(_e385.member.member_3.y, _e385.member_1.member_3.w, fma(_e385.member.member_2.y, _e385.member_1.member_3.z, fma(_e385.member.member.y, _e385.member_1.member_3.x, (_e385.member.member_1.y * _e385.member_1.member_3.y))))), (fma(fma(_e385.member.member_3.z, _e385.member_1.member_2.w, fma(_e385.member.member_2.z, _e385.member_1.member_2.z, fma(_e385.member.member.z, _e385.member_1.member_2.x, (_e385.member.member_1.z * _e385.member_1.member_2.y)))), _e390.z, fma(fma(_e385.member.member_3.z, _e385.member_1.member.w, fma(_e385.member.member_2.z, _e385.member_1.member.z, fma(_e385.member.member.z, _e385.member_1.member.x, (_e385.member.member_1.z * _e385.member_1.member.y)))), _e390.x, (fma(_e385.member.member_3.z, _e385.member_1.member_1.w, fma(_e385.member.member_2.z, _e385.member_1.member_1.z, fma(_e385.member.member.z, _e385.member_1.member_1.x, (_e385.member.member_1.z * _e385.member_1.member_1.y)))) * _e390.y))) + fma(_e385.member.member_3.z, _e385.member_1.member_3.w, fma(_e385.member.member_2.z, _e385.member_1.member_3.z, fma(_e385.member.member.z, _e385.member_1.member_3.x, (_e385.member.member_1.z * _e385.member_1.member_3.y))))), (fma(fma(_e385.member.member_3.w, _e385.member_1.member_2.w, fma(_e385.member.member_2.w, _e385.member_1.member_2.z, fma(_e385.member.member.w, _e385.member_1.member_2.x, (_e385.member.member_1.w * _e385.member_1.member_2.y)))), _e390.z, fma(fma(_e385.member.member_3.w, _e385.member_1.member.w, fma(_e385.member.member_2.w, _e385.member_1.member.z, fma(_e385.member.member.w, _e385.member_1.member.x, (_e385.member.member_1.w * _e385.member_1.member.y)))), _e390.x, (fma(_e385.member.member_3.w, _e385.member_1.member_1.w, fma(_e385.member.member_2.w, _e385.member_1.member_1.z, fma(_e385.member.member.w, _e385.member_1.member_1.x, (_e385.member.member_1.w * _e385.member_1.member_1.y)))) * _e390.y))) + fma(_e385.member.member_3.w, _e385.member_1.member_3.w, fma(_e385.member.member_2.w, _e385.member_1.member_3.z, fma(_e385.member.member.w, _e385.member_1.member_3.x, (_e385.member.member_1.w * _e385.member_1.member_3.y)))))); break; } } @@ -203,7 +207,7 @@ fn function() { @vertex fn skyboxskybox_cubemap_vertex(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { global_4 = param; - global = param_1; + global_1 = param_1; function(); let _e7 = global_2.y; global_2.y = -(_e7); diff --git a/crates/renderling/shaders/skybox-skybox_equirectangular_fragment.spv b/crates/renderling/shaders/skybox-skybox_equirectangular_fragment.spv index a039280d..6c0cb4bd 100644 Binary files a/crates/renderling/shaders/skybox-skybox_equirectangular_fragment.spv and b/crates/renderling/shaders/skybox-skybox_equirectangular_fragment.spv differ diff --git a/crates/renderling/shaders/skybox-skybox_vertex.spv b/crates/renderling/shaders/skybox-skybox_vertex.spv index f66577b4..8316eb73 100644 Binary files a/crates/renderling/shaders/skybox-skybox_vertex.spv and b/crates/renderling/shaders/skybox-skybox_vertex.spv differ diff --git a/crates/renderling/shaders/skybox-skybox_vertex.wgsl b/crates/renderling/shaders/skybox-skybox_vertex.wgsl index 13034d28..68bc35c7 100644 --- a/crates/renderling/shaders/skybox-skybox_vertex.wgsl +++ b/crates/renderling/shaders/skybox-skybox_vertex.wgsl @@ -1,29 +1,30 @@ -struct type_10 { +struct type_3 { member: array, } -struct type_19 { +struct type_12 { + member: u32, + member_1: u32, +} + +struct type_20 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_20 { +struct type_21 { member: array, 8>, member_1: array, 6>, + member_2: vec3, } -struct type_21 { - member: type_19, - member_1: type_19, - member_2: type_20, - member_3: vec3, -} - -struct type_23 { - member: u32, - member_1: u32, +struct type_22 { + member: type_20, + member_1: type_20, + member_2: vec3, + member_3: type_21, } struct VertexOutput { @@ -31,9 +32,9 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: u32; @group(0) @binding(0) -var global_1: type_10; +var global: type_3; +var global_1: u32; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); var global_3: u32; var global_4: vec3; @@ -42,89 +43,89 @@ fn function() { var local: array, 8>; var local_1: array, 6>; var local_2: array, 36>; - var phi_730_: bool; - var phi_301_: type_23; - var phi_302_: type_23; - var phi_325_: type_23; + var phi_743_: bool; + var phi_301_: type_12; + var phi_302_: type_12; + var phi_325_: type_12; var phi_352_: bool; - var phi_358_: type_23; - var phi_359_: type_23; - var phi_382_: type_23; + var phi_358_: type_12; + var phi_359_: type_12; + var phi_382_: type_12; var phi_405_: bool; - var phi_413_: type_21; + var phi_426_: type_22; switch bitcast(0u) { default: { - let _e78 = global_3; - let _e79 = global; - let _e81 = arrayLength((&global_1.member)); - if (_e81 >= 83u) { - phi_730_ = (_e78 <= (_e81 - 83u)); + let _e81 = global_3; + let _e82 = global_1; + let _e84 = arrayLength((&global.member)); + if (_e84 >= 86u) { + phi_743_ = (_e81 <= (_e84 - 86u)); } else { - phi_730_ = false; + phi_743_ = false; } - let _e86 = phi_730_; - if _e86 { - let _e89 = global_1.member[_e78]; - let _e94 = global_1.member[(_e78 + 1u)]; - let _e99 = global_1.member[(_e78 + 2u)]; - let _e104 = global_1.member[(_e78 + 3u)]; - let _e110 = global_1.member[(_e78 + 4u)]; - let _e115 = global_1.member[(_e78 + 5u)]; - let _e120 = global_1.member[(_e78 + 6u)]; - let _e125 = global_1.member[(_e78 + 7u)]; - let _e131 = global_1.member[(_e78 + 8u)]; - let _e136 = global_1.member[(_e78 + 9u)]; - let _e141 = global_1.member[(_e78 + 10u)]; - let _e146 = global_1.member[(_e78 + 11u)]; - let _e152 = global_1.member[(_e78 + 12u)]; - let _e157 = global_1.member[(_e78 + 13u)]; - let _e162 = global_1.member[(_e78 + 14u)]; - let _e167 = global_1.member[(_e78 + 15u)]; - let _e174 = global_1.member[(_e78 + 16u)]; - let _e179 = global_1.member[(_e78 + 17u)]; - let _e184 = global_1.member[(_e78 + 18u)]; - let _e189 = global_1.member[(_e78 + 19u)]; - let _e195 = global_1.member[(_e78 + 20u)]; - let _e200 = global_1.member[(_e78 + 21u)]; - let _e205 = global_1.member[(_e78 + 22u)]; - let _e210 = global_1.member[(_e78 + 23u)]; - let _e216 = global_1.member[(_e78 + 24u)]; - let _e221 = global_1.member[(_e78 + 25u)]; - let _e226 = global_1.member[(_e78 + 26u)]; - let _e231 = global_1.member[(_e78 + 27u)]; - let _e237 = global_1.member[(_e78 + 28u)]; - let _e242 = global_1.member[(_e78 + 29u)]; - let _e247 = global_1.member[(_e78 + 30u)]; - let _e252 = global_1.member[(_e78 + 31u)]; - let _e259 = global_1.member[(_e78 + 32u)]; - let _e264 = global_1.member[(_e78 + 33u)]; - let _e269 = global_1.member[(_e78 + 34u)]; + let _e89 = phi_743_; + if _e89 { + let _e92 = global.member[_e81]; + let _e97 = global.member[(_e81 + 1u)]; + let _e102 = global.member[(_e81 + 2u)]; + let _e107 = global.member[(_e81 + 3u)]; + let _e113 = global.member[(_e81 + 4u)]; + let _e118 = global.member[(_e81 + 5u)]; + let _e123 = global.member[(_e81 + 6u)]; + let _e128 = global.member[(_e81 + 7u)]; + let _e134 = global.member[(_e81 + 8u)]; + let _e139 = global.member[(_e81 + 9u)]; + let _e144 = global.member[(_e81 + 10u)]; + let _e149 = global.member[(_e81 + 11u)]; + let _e155 = global.member[(_e81 + 12u)]; + let _e160 = global.member[(_e81 + 13u)]; + let _e165 = global.member[(_e81 + 14u)]; + let _e170 = global.member[(_e81 + 15u)]; + let _e177 = global.member[(_e81 + 16u)]; + let _e182 = global.member[(_e81 + 17u)]; + let _e187 = global.member[(_e81 + 18u)]; + let _e192 = global.member[(_e81 + 19u)]; + let _e198 = global.member[(_e81 + 20u)]; + let _e203 = global.member[(_e81 + 21u)]; + let _e208 = global.member[(_e81 + 22u)]; + let _e213 = global.member[(_e81 + 23u)]; + let _e219 = global.member[(_e81 + 24u)]; + let _e224 = global.member[(_e81 + 25u)]; + let _e229 = global.member[(_e81 + 26u)]; + let _e234 = global.member[(_e81 + 27u)]; + let _e240 = global.member[(_e81 + 28u)]; + let _e245 = global.member[(_e81 + 29u)]; + let _e250 = global.member[(_e81 + 30u)]; + let _e255 = global.member[(_e81 + 31u)]; + let _e262 = global.member[(_e81 + 32u)]; + let _e267 = global.member[(_e81 + 33u)]; + let _e272 = global.member[(_e81 + 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_301_ = type_23(0u, 6u); + phi_301_ = type_12(0u, 6u); loop { - let _e274 = phi_301_; - if (_e274.member < _e274.member_1) { - phi_302_ = type_23((_e274.member + 1u), _e274.member_1); - phi_325_ = type_23(1u, _e274.member); + let _e277 = phi_301_; + if (_e277.member < _e277.member_1) { + phi_302_ = type_12((_e277.member + 1u), _e277.member_1); + phi_325_ = type_12(1u, _e277.member); } else { - phi_302_ = _e274; - phi_325_ = type_23(0u, type_23().member_1); + phi_302_ = _e277; + phi_325_ = type_12(0u, type_12().member_1); } - let _e287 = phi_302_; - let _e289 = phi_325_; - switch bitcast(_e289.member) { + let _e290 = phi_302_; + let _e292 = phi_325_; + switch bitcast(_e292.member) { case 0: { phi_352_ = false; break; } case 1: { - let _e294 = ((_e78 + 35u) + (_e289.member_1 * 4u)); - let _e297 = global_1.member[_e294]; - let _e302 = global_1.member[(_e294 + 1u)]; - 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)); + let _e297 = ((_e81 + 35u) + (_e292.member_1 * 4u)); + let _e300 = global.member[_e297]; + let _e305 = global.member[(_e297 + 1u)]; + let _e310 = global.member[(_e297 + 2u)]; + let _e315 = global.member[(_e297 + 3u)]; + local_1[_e292.member_1] = vec4(bitcast(_e300), bitcast(_e305), bitcast(_e310), bitcast(_e315)); phi_352_ = true; break; } @@ -133,38 +134,38 @@ fn function() { break; } } - let _e317 = phi_352_; + let _e320 = phi_352_; continue; continuing { - phi_301_ = _e287; - break if !(_e317); + phi_301_ = _e290; + break if !(_e320); } } - let _e319 = local_1; + let _e322 = 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_358_ = type_23(0u, 8u); + phi_358_ = type_12(0u, 8u); loop { - let _e322 = phi_358_; - if (_e322.member < _e322.member_1) { - phi_359_ = type_23((_e322.member + 1u), _e322.member_1); - phi_382_ = type_23(1u, _e322.member); + let _e325 = phi_358_; + if (_e325.member < _e325.member_1) { + phi_359_ = type_12((_e325.member + 1u), _e325.member_1); + phi_382_ = type_12(1u, _e325.member); } else { - phi_359_ = _e322; - phi_382_ = type_23(0u, type_23().member_1); + phi_359_ = _e325; + phi_382_ = type_12(0u, type_12().member_1); } - let _e335 = phi_359_; - let _e337 = phi_382_; - switch bitcast(_e337.member) { + let _e338 = phi_359_; + let _e340 = phi_382_; + switch bitcast(_e340.member) { case 0: { phi_405_ = false; break; } case 1: { - let _e342 = ((_e78 + 59u) + (_e337.member_1 * 3u)); - let _e345 = global_1.member[_e342]; - 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)); + let _e345 = ((_e81 + 59u) + (_e340.member_1 * 3u)); + let _e348 = global.member[_e345]; + let _e353 = global.member[(_e345 + 1u)]; + let _e358 = global.member[(_e345 + 2u)]; + local[_e340.member_1] = vec3(bitcast(_e348), bitcast(_e353), bitcast(_e358)); phi_405_ = true; break; } @@ -173,28 +174,31 @@ fn function() { break; } } - let _e360 = phi_405_; + let _e363 = phi_405_; continue; continuing { - phi_358_ = _e335; - break if !(_e360); + phi_358_ = _e338; + break if !(_e363); } } - let _e362 = local; - phi_413_ = 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))); + let _e365 = local; + let _e369 = global.member[(_e81 + 83u)]; + let _e374 = global.member[(_e81 + 84u)]; + let _e379 = global.member[(_e81 + 85u)]; + phi_426_ = type_22(type_20(vec4(bitcast(_e92), bitcast(_e97), bitcast(_e102), bitcast(_e107)), vec4(bitcast(_e113), bitcast(_e118), bitcast(_e123), bitcast(_e128)), vec4(bitcast(_e134), bitcast(_e139), bitcast(_e144), bitcast(_e149)), vec4(bitcast(_e155), bitcast(_e160), bitcast(_e165), bitcast(_e170))), type_20(vec4(bitcast(_e177), bitcast(_e182), bitcast(_e187), bitcast(_e192)), vec4(bitcast(_e198), bitcast(_e203), bitcast(_e208), bitcast(_e213)), vec4(bitcast(_e219), bitcast(_e224), bitcast(_e229), bitcast(_e234)), vec4(bitcast(_e240), bitcast(_e245), bitcast(_e250), bitcast(_e255))), vec3(bitcast(_e262), bitcast(_e267), bitcast(_e272)), type_21(_e365, _e322, vec3(bitcast(_e369), bitcast(_e374), bitcast(_e379)))); } else { - phi_413_ = 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_426_ = 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)), vec3(0f, 0f, 0f), 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 _e366 = phi_413_; + let _e385 = phi_426_; 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) { + if (_e82 < 36u) { } else { break; } - let _e374 = local_2[_e79]; - 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_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); + let _e393 = local_2[_e82]; + global_4 = _e393; + let _e460 = (fma(fma(_e385.member.member_2.w, _e385.member_1.member_2.z, fma(_e385.member.member.w, _e385.member_1.member_2.x, (_e385.member.member_1.w * _e385.member_1.member_2.y))), _e393.z, fma(fma(_e385.member.member_2.w, _e385.member_1.member.z, fma(_e385.member.member.w, _e385.member_1.member.x, (_e385.member.member_1.w * _e385.member_1.member.y))), _e393.x, (fma(_e385.member.member_2.w, _e385.member_1.member_1.z, fma(_e385.member.member.w, _e385.member_1.member_1.x, (_e385.member.member_1.w * _e385.member_1.member_1.y))) * _e393.y))) + _e385.member.member_3.w); + global_2 = vec4((fma(fma(_e385.member.member_2.x, _e385.member_1.member_2.z, fma(_e385.member.member.x, _e385.member_1.member_2.x, (_e385.member.member_1.x * _e385.member_1.member_2.y))), _e393.z, fma(fma(_e385.member.member_2.x, _e385.member_1.member.z, fma(_e385.member.member.x, _e385.member_1.member.x, (_e385.member.member_1.x * _e385.member_1.member.y))), _e393.x, (fma(_e385.member.member_2.x, _e385.member_1.member_1.z, fma(_e385.member.member.x, _e385.member_1.member_1.x, (_e385.member.member_1.x * _e385.member_1.member_1.y))) * _e393.y))) + _e385.member.member_3.x), (fma(fma(_e385.member.member_2.y, _e385.member_1.member_2.z, fma(_e385.member.member.y, _e385.member_1.member_2.x, (_e385.member.member_1.y * _e385.member_1.member_2.y))), _e393.z, fma(fma(_e385.member.member_2.y, _e385.member_1.member.z, fma(_e385.member.member.y, _e385.member_1.member.x, (_e385.member.member_1.y * _e385.member_1.member.y))), _e393.x, (fma(_e385.member.member_2.y, _e385.member_1.member_1.z, fma(_e385.member.member.y, _e385.member_1.member_1.x, (_e385.member.member_1.y * _e385.member_1.member_1.y))) * _e393.y))) + _e385.member.member_3.y), _e460, _e460); break; } } @@ -204,7 +208,7 @@ fn function() { @vertex fn skyboxskybox_vertex(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { global_3 = param; - global = param_1; + global_1 = param_1; function(); let _e7 = global_2.y; global_2.y = -(_e7); diff --git a/crates/renderling/shaders/stage-renderlet_fragment.spv b/crates/renderling/shaders/stage-renderlet_fragment.spv index e0c5c13e..37dba492 100644 Binary files a/crates/renderling/shaders/stage-renderlet_fragment.spv and b/crates/renderling/shaders/stage-renderlet_fragment.spv differ diff --git a/crates/renderling/shaders/stage-renderlet_fragment.wgsl b/crates/renderling/shaders/stage-renderlet_fragment.wgsl index 99194c34..1dd89a91 100644 --- a/crates/renderling/shaders/stage-renderlet_fragment.wgsl +++ b/crates/renderling/shaders/stage-renderlet_fragment.wgsl @@ -1,38 +1,54 @@ -struct type_11 { +struct type_3 { member: array, } -struct type_20 { +struct type_14 { + member: u32, + member_1: u32, +} + +struct type_15 { + member: type_14, + member_1: vec2, + member_2: vec2, + member_3: u32, + member_4: u32, +} + +struct type_23 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_21 { +struct type_24 { member: array, 8>, member_1: array, 6>, + member_2: vec3, } -struct type_22 { - member: type_20, - member_1: type_20, - member_2: type_21, - member_3: vec3, +struct type_25 { + member: type_23, + member_1: type_23, + member_2: vec3, + member_3: type_24, } -struct type_24 { +struct type_30 { member: u32, member_1: u32, + member_2: u32, + member_3: u32, } -struct type_29 { +struct type_31 { member: vec3, member_1: vec4, member_2: vec3, } -struct type_31 { +struct type_35 { member: vec3, member_1: f32, member_2: vec4, @@ -52,27 +68,24 @@ struct type_31 { member_16: f32, } -struct type_32 { - member: type_24, - member_1: vec2, - member_2: vec2, - member_3: u32, - member_4: u32, +struct type_36 { + member: vec3, + member_1: vec4, + member_2: f32, } -struct type_33 { - member: u32, - member_1: u32, - member_2: u32, +struct type_37 { + member: i32, + member_1: i32, + member_2: bool, } -struct type_34 { - member: vec3, - member_1: vec4, - member_2: f32, +struct type_38 { + member: u32, + member_1: i32, } -struct type_35 { +struct type_39 { member: vec3, member_1: vec3, member_2: f32, @@ -81,2102 +94,3669 @@ struct type_35 { member_5: f32, } +struct type_40 { + member: vec3, + member_1: vec3, + member_2: vec3, + member_3: vec3, + member_4: f32, + member_5: f32, + member_6: f32, + member_7: f32, + member_8: f32, + member_9: f32, + member_10: f32, + member_11: bool, + member_12: bool, +} + @group(0) @binding(0) -var global: type_11; -var global_1: u32; -var global_2: vec4; -var global_3: vec2; +var global: type_3; +@group(2) @binding(0) +var global_1: type_3; +var global_2: u32; +var global_3: vec4; var global_4: vec2; -var global_5: vec3; +var global_5: vec2; var global_6: vec3; var global_7: vec3; var global_8: vec3; +var global_9: vec3; @group(1) @binding(1) -var global_9: sampler; +var global_10: sampler; @group(1) @binding(0) -var global_10: texture_2d_array; +var global_11: texture_2d_array; @group(1) @binding(2) -var global_11: texture_cube; +var global_12: texture_cube; @group(1) @binding(3) -var global_12: sampler; +var global_13: sampler; @group(1) @binding(4) -var global_13: texture_cube; +var global_14: texture_cube; @group(1) @binding(5) -var global_14: sampler; +var global_15: sampler; @group(1) @binding(6) -var global_15: texture_2d; +var global_16: texture_2d; @group(1) @binding(7) -var global_16: sampler; -var global_17: vec4; +var global_17: sampler; +@group(2) @binding(2) +var global_18: sampler; +@group(2) @binding(1) +var global_19: texture_2d_array; +var global_20: vec4; fn function() { - var local: array, 8>; - var local_1: array, 6>; - var phi_610_: u32; - var phi_3863_: bool; - var phi_764_: type_31; - var phi_768_: type_31; - var phi_3900_: bool; - var phi_808_: u32; - var phi_817_: u32; - var phi_830_: type_32; - var phi_3922_: f32; - var phi_3935_: bool; - var phi_884_: f32; - var phi_879_: f32; - var phi_885_: f32; - var phi_3952_: bool; - var phi_850_: f32; - var phi_887_: f32; - var phi_3970_: f32; - var phi_3983_: bool; - var phi_942_: f32; - var phi_937_: f32; - var phi_943_: f32; - var phi_4000_: bool; - var phi_908_: f32; - var phi_945_: f32; - var phi_4036_: bool; - var phi_1028_: u32; - var phi_1037_: u32; - var phi_1050_: type_32; - var phi_4057_: f32; - var phi_4070_: bool; - var phi_1104_: f32; - var phi_1099_: f32; - var phi_1105_: f32; - var phi_4087_: bool; - var phi_1070_: f32; - var phi_1107_: f32; - var phi_4105_: f32; - var phi_4118_: bool; - var phi_1162_: f32; - var phi_1157_: f32; - var phi_1163_: f32; - var phi_4135_: bool; - var phi_1128_: f32; - var phi_1165_: f32; - var phi_4171_: bool; - var phi_1248_: u32; - var phi_1257_: u32; - var phi_1270_: type_32; - var phi_4192_: f32; - var phi_4205_: bool; - var phi_1324_: f32; - var phi_1319_: f32; - var phi_1325_: f32; - var phi_4222_: bool; - var phi_1290_: f32; - var phi_1327_: f32; - var phi_4240_: f32; - var phi_4253_: bool; - var phi_1382_: f32; - var phi_1377_: f32; - var phi_1383_: f32; - var phi_4270_: bool; - var phi_1348_: f32; - var phi_1385_: f32; - var phi_4306_: bool; - var phi_1468_: u32; - var phi_1477_: u32; - var phi_1490_: type_32; - var phi_4327_: f32; - var phi_4340_: bool; - var phi_1544_: f32; - var phi_1539_: f32; - var phi_1545_: f32; - var phi_4357_: bool; - var phi_1510_: f32; - var phi_1547_: f32; - var phi_4375_: f32; - var phi_4388_: bool; - var phi_1602_: f32; - var phi_1597_: f32; - var phi_1603_: f32; - var phi_4405_: bool; - var phi_1568_: f32; - var phi_1605_: f32; - var phi_4441_: bool; - var phi_1688_: u32; - var phi_1697_: u32; - var phi_1710_: type_32; - var phi_4462_: f32; - var phi_4475_: bool; - var phi_1764_: f32; - var phi_1759_: f32; - var phi_1765_: f32; - var phi_4492_: bool; - var phi_1730_: f32; - var phi_1767_: f32; - var phi_4510_: f32; - var phi_4523_: bool; - var phi_1822_: f32; - var phi_1817_: f32; - var phi_1823_: f32; - var phi_4540_: bool; - var phi_1788_: f32; - var phi_1825_: f32; - var phi_4598_: vec3; - var phi_4633_: vec3; - var phi_4668_: vec3; - var phi_4703_: vec3; - var phi_4738_: vec3; - var phi_1919_: vec3; - var phi_1920_: vec3; - var phi_4770_: bool; - var phi_2127_: type_24; - var phi_2128_: type_24; - var phi_2151_: type_24; - var phi_2178_: bool; - var phi_2184_: type_24; - var phi_2185_: type_24; - var phi_2208_: type_24; - var phi_2231_: bool; - var phi_2239_: type_22; - var phi_4842_: vec3; - var phi_4901_: vec3; - var phi_4975_: vec3; - var phi_5035_: vec3; - var phi_5084_: vec3; - var phi_5133_: vec3; - var phi_5182_: vec3; - var phi_5231_: vec3; - var phi_5280_: vec3; - var phi_5329_: vec3; - var phi_5368_: vec3; - var phi_5403_: vec3; - var phi_2279_: type_24; - var phi_2282_: vec3; - var phi_2280_: type_24; - var phi_2305_: type_24; - var phi_5420_: u32; - var phi_5439_: bool; - var phi_2322_: u32; - var phi_5471_: bool; - var phi_2339_: u32; - var phi_2349_: type_33; - var phi_5501_: bool; - var phi_2399_: type_29; - var phi_5581_: bool; - var phi_2907_: type_35; - var phi_5631_: vec3; - var phi_5666_: vec3; - var phi_5701_: vec3; - var phi_3162_: vec3; - var phi_5793_: bool; - var phi_2654_: type_34; - var phi_5840_: vec3; - var phi_5875_: vec3; - var phi_2844_: vec3; - var phi_5967_: bool; - var phi_2447_: type_34; - var phi_6014_: vec3; - var phi_6049_: vec3; - var phi_3164_: vec3; - var phi_3165_: bool; - var phi_3174_: vec3; - var phi_2283_: vec3; - var phi_3176_: bool; - var local_2: vec3; - var local_3: vec3; - var local_4: vec3; - var phi_3293_: vec4; + var local: array, 21>; + var local_1: array, 8>; + var local_2: array, 6>; + var phi_722_: u32; + var phi_5803_: bool; + var phi_850_: type_35; + var phi_854_: type_35; + var phi_5840_: bool; + var phi_894_: u32; + var phi_903_: u32; + var phi_916_: type_15; + var phi_5862_: f32; + var phi_5875_: bool; + var phi_970_: f32; + var phi_965_: f32; + var phi_971_: f32; + var phi_5892_: bool; + var phi_936_: f32; + var phi_973_: f32; + var phi_5910_: f32; + var phi_5923_: bool; + var phi_1028_: f32; + var phi_1023_: f32; + var phi_1029_: f32; + var phi_5940_: bool; + var phi_994_: f32; + var phi_1031_: f32; + var phi_5976_: bool; + var phi_1114_: u32; + var phi_1123_: u32; + var phi_1136_: type_15; + var phi_5997_: f32; + var phi_6010_: bool; + var phi_1190_: f32; + var phi_1185_: f32; + var phi_1191_: f32; + var phi_6027_: bool; + var phi_1156_: f32; + var phi_1193_: f32; + var phi_6045_: f32; + var phi_6058_: bool; + var phi_1248_: f32; + var phi_1243_: f32; + var phi_1249_: f32; + var phi_6075_: bool; + var phi_1214_: f32; + var phi_1251_: f32; + var phi_6111_: bool; + var phi_1334_: u32; + var phi_1343_: u32; + var phi_1356_: type_15; + var phi_6132_: f32; + var phi_6145_: bool; + var phi_1410_: f32; + var phi_1405_: f32; + var phi_1411_: f32; + var phi_6162_: bool; + var phi_1376_: f32; + var phi_1413_: f32; + var phi_6180_: f32; + var phi_6193_: bool; + var phi_1468_: f32; + var phi_1463_: f32; + var phi_1469_: f32; + var phi_6210_: bool; + var phi_1434_: f32; + var phi_1471_: f32; + var phi_6246_: bool; + var phi_1554_: u32; + var phi_1563_: u32; + var phi_1576_: type_15; + var phi_6267_: f32; + var phi_6280_: bool; + var phi_1630_: f32; + var phi_1625_: f32; + var phi_1631_: f32; + var phi_6297_: bool; + var phi_1596_: f32; + var phi_1633_: f32; + var phi_6315_: f32; + var phi_6328_: bool; + var phi_1688_: f32; + var phi_1683_: f32; + var phi_1689_: f32; + var phi_6345_: bool; + var phi_1654_: f32; + var phi_1691_: f32; + var phi_6381_: bool; + var phi_1774_: u32; + var phi_1783_: u32; + var phi_1796_: type_15; + var phi_6402_: f32; + var phi_6415_: bool; + var phi_1850_: f32; + var phi_1845_: f32; + var phi_1851_: f32; + var phi_6432_: bool; + var phi_1816_: f32; + var phi_1853_: f32; + var phi_6450_: f32; + var phi_6463_: bool; + var phi_1908_: f32; + var phi_1903_: f32; + var phi_1909_: f32; + var phi_6480_: bool; + var phi_1874_: f32; + var phi_1911_: f32; + var phi_6538_: vec3; + var phi_6573_: vec3; + var phi_6608_: vec3; + var phi_6643_: vec3; + var phi_6678_: vec3; + var phi_2005_: vec3; + var phi_2006_: vec3; + var phi_6710_: bool; + var phi_2213_: type_14; + var phi_2214_: type_14; + var phi_2237_: type_14; + var phi_2264_: bool; + var phi_2270_: type_14; + var phi_2271_: type_14; + var phi_2294_: type_14; + var phi_2317_: bool; + var phi_2338_: type_25; + var phi_6782_: vec3; + var phi_6841_: vec3; + var phi_6915_: vec3; + var phi_6975_: vec3; + var phi_7024_: vec3; + var phi_7073_: vec3; + var phi_7122_: vec3; + var phi_7171_: vec3; + var phi_7220_: vec3; + var phi_7269_: vec3; + var phi_7308_: vec3; + var phi_7343_: vec3; + var phi_8882_: bool; + var phi_2405_: type_14; + var phi_2408_: vec3; + var phi_2406_: type_14; + var phi_2431_: type_14; + var phi_7369_: u32; + var phi_7388_: bool; + var phi_2448_: u32; + var phi_7412_: bool; + var phi_2460_: u32; + var phi_2474_: type_30; + var phi_7444_: bool; + var phi_2524_: type_31; + var phi_7524_: bool; + var phi_4104_: type_39; + var phi_7574_: vec3; + var phi_7609_: vec3; + var phi_4240_: type_40; + var phi_7644_: vec3; + var phi_7749_: bool; + var phi_7752_: bool; + var phi_7753_: bool; + var phi_4612_: u32; + var phi_4621_: u32; + var phi_8855_: bool; + var phi_4649_: type_37; + var phi_4652_: f32; + var phi_4654_: f32; + var phi_4666_: bool; + var phi_4694_: type_38; + var phi_4706_: type_37; + var phi_4650_: type_37; + var phi_4709_: type_38; + var phi_4720_: type_37; + var phi_4723_: f32; + var phi_4725_: f32; + var phi_4737_: bool; + var phi_4765_: type_38; + var phi_4777_: type_37; + var phi_4721_: type_37; + var phi_4780_: type_38; + var phi_7775_: f32; + var phi_7788_: bool; + var phi_4846_: f32; + var phi_4841_: f32; + var phi_4847_: f32; + var phi_7805_: bool; + var phi_4812_: f32; + var phi_4849_: f32; + var phi_7823_: f32; + var phi_7836_: bool; + var phi_4902_: f32; + var phi_4897_: f32; + var phi_4903_: f32; + var phi_7853_: bool; + var phi_4868_: f32; + var phi_4905_: f32; + var phi_4964_: f32; + var phi_4724_: f32; + var phi_4726_: f32; + var phi_4966_: bool; + var phi_8839_: bool; + var phi_8936_: bool; + var phi_4653_: f32; + var phi_4655_: f32; + var phi_4967_: bool; + var phi_8935_: bool; + var local_3: f32; + var local_4: f32; + var phi_9063_: bool; + var phi_4970_: f32; + var phi_9062_: bool; + var phi_4971_: f32; + var phi_9061_: bool; + var phi_4972_: f32; + var phi_4973_: vec3; + var phi_7890_: bool; + var phi_3373_: type_36; + var phi_7937_: vec3; + var phi_7972_: vec3; + var phi_3652_: type_14; + var phi_3655_: f32; + var phi_3653_: type_14; + var phi_3678_: type_14; + var phi_8093_: vec3; + var phi_8127_: vec2; + var phi_8130_: vec2; + var phi_8131_: u32; + var phi_8134_: vec2; + var phi_8135_: u32; + var phi_8136_: bool; + var phi_8161_: vec2; + var phi_8164_: vec2; + var phi_8165_: u32; + var phi_8168_: vec2; + var phi_8169_: u32; + var phi_8170_: bool; + var phi_8191_: vec2; + var phi_8194_: vec2; + var phi_8195_: u32; + var phi_8197_: vec2; + var phi_8198_: u32; + var phi_3715_: u32; + var phi_3816_: u32; + var phi_3847_: u32; + var phi_3856_: u32; + var phi_8228_: f32; + var phi_8241_: bool; + var phi_3916_: f32; + var phi_3911_: f32; + var phi_3917_: f32; + var phi_8258_: bool; + var phi_3882_: f32; + var phi_3919_: f32; + var phi_8276_: f32; + var phi_8289_: bool; + var phi_3974_: f32; + var phi_3969_: f32; + var phi_3975_: f32; + var phi_8306_: bool; + var phi_3940_: f32; + var phi_3977_: f32; + var phi_4036_: f32; + var phi_3656_: f32; + var phi_4037_: bool; + var phi_8937_: bool; + var local_5: f32; + var phi_9065_: bool; + var phi_4039_: f32; + var phi_9064_: bool; + var phi_4040_: f32; + var phi_4041_: vec3; + var phi_8343_: bool; + var phi_2572_: type_36; + var phi_8390_: vec3; + var phi_8425_: vec3; + var phi_8530_: bool; + var phi_8533_: bool; + var phi_8534_: bool; + var phi_2973_: u32; + var phi_2982_: u32; + var phi_9009_: bool; + var phi_3010_: type_37; + var phi_3013_: f32; + var phi_3015_: f32; + var phi_3027_: bool; + var phi_3055_: type_38; + var phi_3067_: type_37; + var phi_3011_: type_37; + var phi_3070_: type_38; + var phi_3081_: type_37; + var phi_3084_: f32; + var phi_3086_: f32; + var phi_3098_: bool; + var phi_3126_: type_38; + var phi_3138_: type_37; + var phi_3082_: type_37; + var phi_3141_: type_38; + var phi_8556_: f32; + var phi_8569_: bool; + var phi_3207_: f32; + var phi_3202_: f32; + var phi_3208_: f32; + var phi_8586_: bool; + var phi_3173_: f32; + var phi_3210_: f32; + var phi_8604_: f32; + var phi_8617_: bool; + var phi_3263_: f32; + var phi_3258_: f32; + var phi_3264_: f32; + var phi_8634_: bool; + var phi_3229_: f32; + var phi_3266_: f32; + var phi_3325_: f32; + var phi_3085_: f32; + var phi_3087_: f32; + var phi_3327_: bool; + var phi_8993_: bool; + var phi_9055_: bool; + var phi_3014_: f32; + var phi_3016_: f32; + var phi_3328_: bool; + var phi_9054_: bool; + var local_6: f32; + var local_7: f32; + var phi_9067_: bool; + var phi_3331_: f32; + var phi_9066_: bool; + var phi_3332_: f32; + var phi_9060_: bool; + var phi_4975_: f32; + var phi_4976_: vec3; + var phi_4977_: bool; + var phi_4997_: vec3; + var phi_9057_: bool; + var phi_2409_: vec3; + var phi_5003_: bool; + var phi_9056_: bool; + var local_8: vec3; + var local_9: vec3; + var local_10: vec3; + var phi_9076_: bool; + var phi_5120_: vec4; + var phi_9068_: bool; + var local_11: f32; + var local_12: f32; + var local_13: f32; + var local_14: f32; - 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; - } + switch bitcast(0u) { default: { - phi_610_ = 0u; - break; - } - } - 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 (_e110 >= 22u) { - phi_3863_ = (_e126 <= (_e110 - 22u)); - } else { - phi_3863_ = false; - } - let _e163 = phi_3863_; - 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_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 _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 _e289 = phi_768_; - let _e293 = select(_e114, _e113, vec2((_e289.member_10 == 0u))); - let _e295 = (_e110 >= 8u); - if _e295 { - phi_3900_ = (_e289.member_5 <= (_e110 - 8u)); - } else { - phi_3900_ = false; - } - let _e299 = phi_3900_; - 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_808_ = 0u; - break; - } - case 1: { - phi_808_ = 1u; - break; - } - case 2: { - phi_808_ = 2u; - break; - } - default: { - phi_808_ = 0u; - break; - } - } - let _e331 = phi_808_; - let _e335 = global.member[(_e289.member_5 + 7u)]; - switch bitcast(_e335) { - case 0: { - phi_817_ = 0u; - break; - } - case 1: { - phi_817_ = 1u; - break; - } - case 2: { - phi_817_ = 2u; - break; - } - default: { - phi_817_ = 0u; - break; - } - } - let _e338 = phi_817_; - phi_830_ = type_32(type_24(_e331, _e338), vec2(_e302, _e306), vec2(_e311, _e315), _e320, _e324); - } else { - phi_830_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); - } - let _e342 = phi_830_; - switch bitcast(_e342.member.member) { - case 1: { - let _e380 = abs(_e293.x); - let _e382 = (_e380 % 1f); - if (_e380 >= 1f) { - phi_3952_ = select(true, false, (_e382 == 0f)); - } else { - phi_3952_ = true; - } - let _e386 = phi_3952_; - let _e387 = select(1f, _e382, _e386); - if (select(-1f, 1f, (_e293.x >= 0f)) > 0f) { - phi_850_ = _e387; - } else { - phi_850_ = (1f - _e387); - } - let _e391 = phi_850_; - phi_887_ = _e391; - break; - } - case 2: { - 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_3935_ = select(true, false, (_e363 == 0f)); - } else { - phi_3935_ = true; - } - let _e367 = phi_3935_; - let _e368 = select(1f, _e363, _e367); - if (select(-1f, 1f, (_e293.x >= 0f)) > 0f) { - if _e361 { - phi_879_ = _e368; - } else { - phi_879_ = (1f - _e368); + let _e146 = arrayLength((&global.member)); + let _e148 = arrayLength((&global_1.member)); + let _e149 = global_2; + let _e150 = global_3; + let _e151 = global_4; + let _e152 = global_5; + let _e153 = global_6; + let _e154 = global_7; + let _e155 = global_8; + let _e156 = global_9; + let _e160 = global.member[(_e149 + 9u)]; + let _e164 = global.member[(_e149 + 11u)]; + let _e168 = global.member[(_e149 + 17u)]; + let _e171 = global.member[_e168]; + let _e175 = global.member[(_e168 + 1u)]; + let _e179 = global.member[(_e168 + 4u)]; + switch bitcast(_e179) { + case 0: { + phi_722_ = 0u; + break; } - let _e375 = phi_879_; - phi_885_ = _e375; - } else { - if _e361 { - phi_884_ = (1f - _e368); - } else { - phi_884_ = _e368; + case 1: { + phi_722_ = 1u; + break; } - let _e372 = phi_884_; - phi_885_ = _e372; - } - let _e377 = phi_885_; - phi_887_ = _e377; - break; - } - case 0: { - if (_e293.x > 1f) { - phi_3922_ = 0.9999999f; - } else { - phi_3922_ = select(_e293.x, 0.00000011920929f, (_e293.x < 0f)); - } - let _e351 = phi_3922_; - phi_887_ = _e351; - break; - } - default: { - phi_887_ = f32(); - break; - } - } - let _e393 = phi_887_; - switch bitcast(_e342.member.member_1) { - case 1: { - let _e431 = abs(_e293.y); - let _e433 = (_e431 % 1f); - if (_e431 >= 1f) { - phi_4000_ = select(true, false, (_e433 == 0f)); - } else { - phi_4000_ = true; - } - let _e437 = phi_4000_; - let _e438 = select(1f, _e433, _e437); - if (select(-1f, 1f, (_e293.y >= 0f)) > 0f) { - phi_908_ = _e438; - } else { - phi_908_ = (1f - _e438); - } - let _e442 = phi_908_; - phi_945_ = _e442; - break; - } - case 2: { - 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_3983_ = select(true, false, (_e414 == 0f)); - } else { - phi_3983_ = true; - } - let _e418 = phi_3983_; - let _e419 = select(1f, _e414, _e418); - if (select(-1f, 1f, (_e293.y >= 0f)) > 0f) { - if _e412 { - phi_937_ = _e419; - } else { - phi_937_ = (1f - _e419); + case 2: { + phi_722_ = 2u; + break; } - let _e426 = phi_937_; - phi_943_ = _e426; - } else { - if _e412 { - phi_942_ = (1f - _e419); - } else { - phi_942_ = _e419; + case 3: { + phi_722_ = 3u; + break; + } + case 4: { + phi_722_ = 4u; + break; + } + case 5: { + phi_722_ = 5u; + break; + } + case 6: { + phi_722_ = 6u; + break; + } + case 7: { + phi_722_ = 7u; + break; + } + case 8: { + phi_722_ = 8u; + break; + } + case 9: { + phi_722_ = 9u; + break; + } + case 10: { + phi_722_ = 10u; + break; + } + case 11: { + phi_722_ = 11u; + break; + } + case 12: { + phi_722_ = 12u; + break; + } + case 13: { + phi_722_ = 13u; + break; + } + case 14: { + phi_722_ = 14u; + break; + } + case 15: { + phi_722_ = 15u; + break; + } + case 16: { + phi_722_ = 16u; + break; + } + case 17: { + phi_722_ = 17u; + break; + } + case 18: { + phi_722_ = 18u; + break; + } + case 19: { + phi_722_ = 19u; + break; + } + default: { + phi_722_ = 0u; + break; } - let _e423 = phi_942_; - phi_943_ = _e423; - } - let _e428 = phi_943_; - phi_945_ = _e428; - break; - } - case 0: { - if (_e293.y > 1f) { - phi_3970_ = 0.9999999f; - } else { - phi_3970_ = select(_e293.y, 0.00000011920929f, (_e293.y < 0f)); - } - let _e402 = phi_3970_; - phi_945_ = _e402; - break; - } - default: { - phi_945_ = f32(); - break; - } - } - 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_4036_ = (_e289.member_6 <= (_e110 - 8u)); - } else { - phi_4036_ = false; - } - let _e495 = phi_4036_; - 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_1028_ = 0u; - break; - } - case 1: { - phi_1028_ = 1u; - break; - } - case 2: { - phi_1028_ = 2u; - break; - } - default: { - phi_1028_ = 0u; - break; - } - } - let _e527 = phi_1028_; - let _e531 = global.member[(_e289.member_6 + 7u)]; - switch bitcast(_e531) { - case 0: { - phi_1037_ = 0u; - break; - } - case 1: { - phi_1037_ = 1u; - break; - } - case 2: { - phi_1037_ = 2u; - break; - } - default: { - phi_1037_ = 0u; - break; - } - } - let _e534 = phi_1037_; - phi_1050_ = type_32(type_24(_e527, _e534), vec2(_e498, _e502), vec2(_e507, _e511), _e516, _e520); - } else { - phi_1050_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); - } - let _e538 = phi_1050_; - switch bitcast(_e538.member.member) { - case 1: { - let _e576 = abs(_e490.x); - let _e578 = (_e576 % 1f); - if (_e576 >= 1f) { - phi_4087_ = select(true, false, (_e578 == 0f)); - } else { - phi_4087_ = true; - } - let _e582 = phi_4087_; - let _e583 = select(1f, _e578, _e582); - if (select(-1f, 1f, (_e490.x >= 0f)) > 0f) { - phi_1070_ = _e583; - } else { - phi_1070_ = (1f - _e583); } - let _e587 = phi_1070_; - phi_1107_ = _e587; - break; - } - case 2: { - 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_4070_ = select(true, false, (_e559 == 0f)); + let _e182 = phi_722_; + let _e186 = global.member[(_e168 + 5u)]; + if (_e164 == 4294967295u) { + phi_854_ = type_35(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 { - phi_4070_ = true; - } - let _e563 = phi_4070_; - let _e564 = select(1f, _e559, _e563); - if (select(-1f, 1f, (_e490.x >= 0f)) > 0f) { - if _e557 { - phi_1099_ = _e564; + if (_e146 >= 22u) { + phi_5803_ = (_e164 <= (_e146 - 22u)); } else { - phi_1099_ = (1f - _e564); + phi_5803_ = false; } - let _e571 = phi_1099_; - phi_1105_ = _e571; - } else { - if _e557 { - phi_1104_ = (1f - _e564); + let _e193 = phi_5803_; + if _e193 { + let _e196 = global.member[_e164]; + let _e201 = global.member[(_e164 + 1u)]; + let _e206 = global.member[(_e164 + 2u)]; + let _e212 = global.member[(_e164 + 3u)]; + let _e217 = global.member[(_e164 + 4u)]; + let _e222 = global.member[(_e164 + 5u)]; + let _e227 = global.member[(_e164 + 6u)]; + let _e232 = global.member[(_e164 + 7u)]; + let _e238 = global.member[(_e164 + 8u)]; + let _e243 = global.member[(_e164 + 9u)]; + let _e248 = global.member[(_e164 + 10u)]; + let _e252 = global.member[(_e164 + 11u)]; + let _e256 = global.member[(_e164 + 12u)]; + let _e260 = global.member[(_e164 + 13u)]; + let _e264 = global.member[(_e164 + 14u)]; + let _e268 = global.member[(_e164 + 15u)]; + let _e272 = global.member[(_e164 + 16u)]; + let _e276 = global.member[(_e164 + 17u)]; + let _e280 = global.member[(_e164 + 18u)]; + let _e284 = global.member[(_e164 + 19u)]; + let _e288 = global.member[(_e164 + 20u)]; + let _e293 = global.member[(_e164 + 21u)]; + phi_850_ = type_35(vec3(bitcast(_e196), bitcast(_e201), bitcast(_e206)), bitcast(_e212), vec4(bitcast(_e217), bitcast(_e222), bitcast(_e227), bitcast(_e232)), bitcast(_e238), bitcast(_e243), _e248, _e252, _e256, _e260, _e264, _e268, _e272, _e276, _e280, _e284, (_e288 == 1u), bitcast(_e293)); } else { - phi_1104_ = _e564; + phi_850_ = type_35(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 _e568 = phi_1104_; - phi_1105_ = _e568; - } - let _e573 = phi_1105_; - phi_1107_ = _e573; - break; - } - case 0: { - if (_e490.x > 1f) { - phi_4057_ = 0.9999999f; + let _e297 = phi_850_; + phi_854_ = type_35(_e297.member, _e297.member_1, _e297.member_2, _e297.member_3, _e297.member_4, _e297.member_5, _e297.member_6, _e297.member_7, _e297.member_8, _e297.member_9, _e297.member_10, _e297.member_11, _e297.member_12, _e297.member_13, _e297.member_14, (_e297.member_15 && (_e186 == 1u)), _e297.member_16); + } + let _e319 = phi_854_; + let _e323 = select(_e152, _e151, vec2((_e319.member_10 == 0u))); + let _e325 = (_e146 >= 8u); + if _e325 { + phi_5840_ = (_e319.member_5 <= (_e146 - 8u)); } else { - phi_4057_ = select(_e490.x, 0.00000011920929f, (_e490.x < 0f)); - } - let _e547 = phi_4057_; - phi_1107_ = _e547; - break; - } - default: { - phi_1107_ = f32(); - break; - } - } - let _e589 = phi_1107_; - switch bitcast(_e538.member.member_1) { - case 1: { - let _e627 = abs(_e490.y); - let _e629 = (_e627 % 1f); - if (_e627 >= 1f) { - phi_4135_ = select(true, false, (_e629 == 0f)); - } else { - phi_4135_ = true; - } - let _e633 = phi_4135_; - let _e634 = select(1f, _e629, _e633); - if (select(-1f, 1f, (_e490.y >= 0f)) > 0f) { - phi_1128_ = _e634; - } else { - phi_1128_ = (1f - _e634); - } - let _e638 = phi_1128_; - phi_1165_ = _e638; - break; - } - case 2: { - 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_4118_ = select(true, false, (_e610 == 0f)); - } else { - phi_4118_ = true; - } - let _e614 = phi_4118_; - let _e615 = select(1f, _e610, _e614); - if (select(-1f, 1f, (_e490.y >= 0f)) > 0f) { - if _e608 { - phi_1157_ = _e615; - } else { - phi_1157_ = (1f - _e615); + phi_5840_ = false; + } + let _e329 = phi_5840_; + if _e329 { + let _e332 = global.member[_e319.member_5]; + let _e336 = global.member[(_e319.member_5 + 1u)]; + let _e341 = global.member[(_e319.member_5 + 2u)]; + let _e345 = global.member[(_e319.member_5 + 3u)]; + let _e350 = global.member[(_e319.member_5 + 4u)]; + let _e354 = global.member[(_e319.member_5 + 5u)]; + let _e358 = global.member[(_e319.member_5 + 6u)]; + switch bitcast(_e358) { + case 0: { + phi_894_ = 0u; + break; + } + case 1: { + phi_894_ = 1u; + break; + } + case 2: { + phi_894_ = 2u; + break; + } + default: { + phi_894_ = 0u; + break; + } } - let _e622 = phi_1157_; - phi_1163_ = _e622; - } else { - if _e608 { - phi_1162_ = (1f - _e615); - } else { - phi_1162_ = _e615; + let _e361 = phi_894_; + let _e365 = global.member[(_e319.member_5 + 7u)]; + switch bitcast(_e365) { + case 0: { + phi_903_ = 0u; + break; + } + case 1: { + phi_903_ = 1u; + break; + } + case 2: { + phi_903_ = 2u; + break; + } + default: { + phi_903_ = 0u; + break; + } } - let _e619 = phi_1162_; - phi_1163_ = _e619; - } - let _e624 = phi_1163_; - phi_1165_ = _e624; - break; - } - case 0: { - if (_e490.y > 1f) { - phi_4105_ = 0.9999999f; + let _e368 = phi_903_; + phi_916_ = type_15(type_14(_e361, _e368), vec2(_e332, _e336), vec2(_e341, _e345), _e350, _e354); } else { - phi_4105_ = select(_e490.y, 0.00000011920929f, (_e490.y < 0f)); + phi_916_ = type_15(type_14(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e598 = phi_4105_; - phi_1165_ = _e598; - break; - } - default: { - phi_1165_ = f32(); - break; - } - } - 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_4171_ = (_e289.member_7 <= (_e110 - 8u)); - } else { - phi_4171_ = false; - } - let _e689 = phi_4171_; - 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_1248_ = 0u; - break; - } - case 1: { - phi_1248_ = 1u; - break; - } - case 2: { - phi_1248_ = 2u; - break; - } - default: { - phi_1248_ = 0u; - break; - } - } - let _e721 = phi_1248_; - let _e725 = global.member[(_e289.member_7 + 7u)]; - switch bitcast(_e725) { - case 0: { - phi_1257_ = 0u; - break; - } - case 1: { - phi_1257_ = 1u; - break; - } - case 2: { - phi_1257_ = 2u; - break; - } - default: { - phi_1257_ = 0u; - break; - } - } - let _e728 = phi_1257_; - phi_1270_ = type_32(type_24(_e721, _e728), vec2(_e692, _e696), vec2(_e701, _e705), _e710, _e714); - } else { - phi_1270_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); - } - let _e732 = phi_1270_; - switch bitcast(_e732.member.member) { - case 1: { - let _e770 = abs(_e684.x); - let _e772 = (_e770 % 1f); - if (_e770 >= 1f) { - phi_4222_ = select(true, false, (_e772 == 0f)); - } else { - phi_4222_ = true; - } - let _e776 = phi_4222_; - let _e777 = select(1f, _e772, _e776); - if (select(-1f, 1f, (_e684.x >= 0f)) > 0f) { - phi_1290_ = _e777; - } else { - phi_1290_ = (1f - _e777); - } - let _e781 = phi_1290_; - phi_1327_ = _e781; - break; - } - case 2: { - 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_4205_ = select(true, false, (_e753 == 0f)); - } else { - phi_4205_ = true; - } - let _e757 = phi_4205_; - let _e758 = select(1f, _e753, _e757); - if (select(-1f, 1f, (_e684.x >= 0f)) > 0f) { - if _e751 { - phi_1319_ = _e758; - } else { - phi_1319_ = (1f - _e758); + let _e372 = phi_916_; + switch bitcast(_e372.member.member) { + case 1: { + let _e410 = abs(_e323.x); + let _e412 = (_e410 % 1f); + if (_e410 >= 1f) { + phi_5892_ = select(true, false, (_e412 == 0f)); + } else { + phi_5892_ = true; + } + let _e416 = phi_5892_; + let _e417 = select(1f, _e412, _e416); + if (select(-1f, 1f, (_e323.x >= 0f)) > 0f) { + phi_936_ = _e417; + } else { + phi_936_ = (1f - _e417); + } + let _e421 = phi_936_; + phi_973_ = _e421; + break; } - let _e765 = phi_1319_; - phi_1325_ = _e765; - } else { - if _e751 { - phi_1324_ = (1f - _e758); - } else { - phi_1324_ = _e758; + case 2: { + let _e384 = abs(_e323.x); + let _e391 = ((select(select(u32(_e384), 0u, (_e384 < 0f)), 4294967295u, (_e384 > 4294967000f)) % 2u) == 0u); + let _e393 = (_e384 % 1f); + if (_e384 >= 1f) { + phi_5875_ = select(true, false, (_e393 == 0f)); + } else { + phi_5875_ = true; + } + let _e397 = phi_5875_; + let _e398 = select(1f, _e393, _e397); + if (select(-1f, 1f, (_e323.x >= 0f)) > 0f) { + if _e391 { + phi_965_ = _e398; + } else { + phi_965_ = (1f - _e398); + } + let _e405 = phi_965_; + phi_971_ = _e405; + } else { + if _e391 { + phi_970_ = (1f - _e398); + } else { + phi_970_ = _e398; + } + let _e402 = phi_970_; + phi_971_ = _e402; + } + let _e407 = phi_971_; + phi_973_ = _e407; + break; } - let _e762 = phi_1324_; - phi_1325_ = _e762; - } - let _e767 = phi_1325_; - phi_1327_ = _e767; - break; - } - case 0: { - if (_e684.x > 1f) { - phi_4192_ = 0.9999999f; - } else { - phi_4192_ = select(_e684.x, 0.00000011920929f, (_e684.x < 0f)); - } - let _e741 = phi_4192_; - phi_1327_ = _e741; - break; - } - default: { - phi_1327_ = f32(); - break; - } - } - let _e783 = phi_1327_; - switch bitcast(_e732.member.member_1) { - case 1: { - let _e821 = abs(_e684.y); - let _e823 = (_e821 % 1f); - if (_e821 >= 1f) { - phi_4270_ = select(true, false, (_e823 == 0f)); - } else { - phi_4270_ = true; - } - let _e827 = phi_4270_; - let _e828 = select(1f, _e823, _e827); - if (select(-1f, 1f, (_e684.y >= 0f)) > 0f) { - phi_1348_ = _e828; - } else { - phi_1348_ = (1f - _e828); - } - let _e832 = phi_1348_; - phi_1385_ = _e832; - break; - } - case 2: { - 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_4253_ = select(true, false, (_e804 == 0f)); - } else { - phi_4253_ = true; - } - let _e808 = phi_4253_; - let _e809 = select(1f, _e804, _e808); - if (select(-1f, 1f, (_e684.y >= 0f)) > 0f) { - if _e802 { - phi_1377_ = _e809; - } else { - phi_1377_ = (1f - _e809); + case 0: { + if (_e323.x > 1f) { + phi_5862_ = 0.9999999f; + } else { + phi_5862_ = select(_e323.x, 0.00000011920929f, (_e323.x < 0f)); + } + let _e381 = phi_5862_; + phi_973_ = _e381; + break; } - let _e816 = phi_1377_; - phi_1383_ = _e816; - } else { - if _e802 { - phi_1382_ = (1f - _e809); - } else { - phi_1382_ = _e809; + default: { + phi_973_ = f32(); + break; } - let _e813 = phi_1382_; - phi_1383_ = _e813; - } - let _e818 = phi_1383_; - phi_1385_ = _e818; - break; - } - case 0: { - if (_e684.y > 1f) { - phi_4240_ = 0.9999999f; - } else { - phi_4240_ = select(_e684.y, 0.00000011920929f, (_e684.y < 0f)); - } - let _e792 = phi_4240_; - phi_1385_ = _e792; - break; - } - default: { - phi_1385_ = f32(); - break; - } - } - 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_4306_ = (_e289.member_8 <= (_e110 - 8u)); - } else { - phi_4306_ = false; - } - let _e883 = phi_4306_; - 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_1468_ = 0u; - break; - } - case 1: { - phi_1468_ = 1u; - break; - } - case 2: { - phi_1468_ = 2u; - break; - } - default: { - phi_1468_ = 0u; - break; - } - } - let _e915 = phi_1468_; - let _e919 = global.member[(_e289.member_8 + 7u)]; - switch bitcast(_e919) { - case 0: { - phi_1477_ = 0u; - break; - } - case 1: { - phi_1477_ = 1u; - break; - } - case 2: { - phi_1477_ = 2u; - break; - } - default: { - phi_1477_ = 0u; - break; } - } - let _e922 = phi_1477_; - phi_1490_ = type_32(type_24(_e915, _e922), vec2(_e886, _e890), vec2(_e895, _e899), _e904, _e908); - } else { - phi_1490_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); - } - let _e926 = phi_1490_; - switch bitcast(_e926.member.member) { - case 1: { - let _e964 = abs(_e878.x); - let _e966 = (_e964 % 1f); - if (_e964 >= 1f) { - phi_4357_ = select(true, false, (_e966 == 0f)); - } else { - phi_4357_ = true; - } - let _e970 = phi_4357_; - let _e971 = select(1f, _e966, _e970); - if (select(-1f, 1f, (_e878.x >= 0f)) > 0f) { - phi_1510_ = _e971; - } else { - phi_1510_ = (1f - _e971); - } - let _e975 = phi_1510_; - phi_1547_ = _e975; - break; - } - case 2: { - 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_4340_ = select(true, false, (_e947 == 0f)); - } else { - phi_4340_ = true; - } - let _e951 = phi_4340_; - let _e952 = select(1f, _e947, _e951); - if (select(-1f, 1f, (_e878.x >= 0f)) > 0f) { - if _e945 { - phi_1539_ = _e952; - } else { - phi_1539_ = (1f - _e952); + let _e423 = phi_973_; + switch bitcast(_e372.member.member_1) { + case 1: { + let _e461 = abs(_e323.y); + let _e463 = (_e461 % 1f); + if (_e461 >= 1f) { + phi_5940_ = select(true, false, (_e463 == 0f)); + } else { + phi_5940_ = true; + } + let _e467 = phi_5940_; + let _e468 = select(1f, _e463, _e467); + if (select(-1f, 1f, (_e323.y >= 0f)) > 0f) { + phi_994_ = _e468; + } else { + phi_994_ = (1f - _e468); + } + let _e472 = phi_994_; + phi_1031_ = _e472; + break; } - let _e959 = phi_1539_; - phi_1545_ = _e959; - } else { - if _e945 { - phi_1544_ = (1f - _e952); - } else { - phi_1544_ = _e952; + case 2: { + let _e435 = abs(_e323.y); + let _e442 = ((select(select(u32(_e435), 0u, (_e435 < 0f)), 4294967295u, (_e435 > 4294967000f)) % 2u) == 0u); + let _e444 = (_e435 % 1f); + if (_e435 >= 1f) { + phi_5923_ = select(true, false, (_e444 == 0f)); + } else { + phi_5923_ = true; + } + let _e448 = phi_5923_; + let _e449 = select(1f, _e444, _e448); + if (select(-1f, 1f, (_e323.y >= 0f)) > 0f) { + if _e442 { + phi_1023_ = _e449; + } else { + phi_1023_ = (1f - _e449); + } + let _e456 = phi_1023_; + phi_1029_ = _e456; + } else { + if _e442 { + phi_1028_ = (1f - _e449); + } else { + phi_1028_ = _e449; + } + let _e453 = phi_1028_; + phi_1029_ = _e453; + } + let _e458 = phi_1029_; + phi_1031_ = _e458; + break; + } + case 0: { + if (_e323.y > 1f) { + phi_5910_ = 0.9999999f; + } else { + phi_5910_ = select(_e323.y, 0.00000011920929f, (_e323.y < 0f)); + } + let _e432 = phi_5910_; + phi_1031_ = _e432; + break; + } + default: { + phi_1031_ = f32(); + break; } - let _e956 = phi_1544_; - phi_1545_ = _e956; - } - let _e961 = phi_1545_; - phi_1547_ = _e961; - break; - } - case 0: { - if (_e878.x > 1f) { - phi_4327_ = 0.9999999f; - } else { - phi_4327_ = select(_e878.x, 0.00000011920929f, (_e878.x < 0f)); - } - let _e935 = phi_4327_; - phi_1547_ = _e935; - break; - } - default: { - phi_1547_ = f32(); - break; - } - } - let _e977 = phi_1547_; - switch bitcast(_e926.member.member_1) { - case 1: { - let _e1015 = abs(_e878.y); - let _e1017 = (_e1015 % 1f); - if (_e1015 >= 1f) { - phi_4405_ = select(true, false, (_e1017 == 0f)); - } else { - phi_4405_ = true; - } - let _e1021 = phi_4405_; - let _e1022 = select(1f, _e1017, _e1021); - if (select(-1f, 1f, (_e878.y >= 0f)) > 0f) { - phi_1568_ = _e1022; - } else { - phi_1568_ = (1f - _e1022); } - let _e1026 = phi_1568_; - phi_1605_ = _e1026; - break; - } - case 2: { - 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_4388_ = select(true, false, (_e998 == 0f)); + let _e474 = phi_1031_; + let _e478 = (_e423 * f32(_e372.member_2.x)); + let _e487 = (_e474 * f32(_e372.member_2.y)); + let _e499 = f32(_e171); + let _e500 = f32(_e175); + let _e507 = vec3((f32((select(select(u32(_e478), 0u, (_e478 < 0f)), 4294967295u, (_e478 > 4294967000f)) + _e372.member_1.x)) / _e499), (f32((select(select(u32(_e487), 0u, (_e487 < 0f)), 4294967295u, (_e487 > 4294967000f)) + _e372.member_1.y)) / _e500), f32(_e372.member_3)); + let _e513 = textureSampleLevel(global_11, global_10, vec2(_e507.x, _e507.y), i32(_e507.z), 0f); + let _e516 = select(_e513, vec4(1f, 1f, 1f, 1f), vec4((_e319.member_5 == 4294967295u))); + let _e520 = select(_e152, _e151, vec2((_e319.member_11 == 0u))); + if _e325 { + phi_5976_ = (_e319.member_6 <= (_e146 - 8u)); } else { - phi_4388_ = true; - } - let _e1002 = phi_4388_; - let _e1003 = select(1f, _e998, _e1002); - if (select(-1f, 1f, (_e878.y >= 0f)) > 0f) { - if _e996 { - phi_1597_ = _e1003; - } else { - phi_1597_ = (1f - _e1003); + phi_5976_ = false; + } + let _e525 = phi_5976_; + if _e525 { + let _e528 = global.member[_e319.member_6]; + let _e532 = global.member[(_e319.member_6 + 1u)]; + let _e537 = global.member[(_e319.member_6 + 2u)]; + let _e541 = global.member[(_e319.member_6 + 3u)]; + let _e546 = global.member[(_e319.member_6 + 4u)]; + let _e550 = global.member[(_e319.member_6 + 5u)]; + let _e554 = global.member[(_e319.member_6 + 6u)]; + switch bitcast(_e554) { + case 0: { + phi_1114_ = 0u; + break; + } + case 1: { + phi_1114_ = 1u; + break; + } + case 2: { + phi_1114_ = 2u; + break; + } + default: { + phi_1114_ = 0u; + break; + } } - let _e1010 = phi_1597_; - phi_1603_ = _e1010; - } else { - if _e996 { - phi_1602_ = (1f - _e1003); - } else { - phi_1602_ = _e1003; + let _e557 = phi_1114_; + let _e561 = global.member[(_e319.member_6 + 7u)]; + switch bitcast(_e561) { + case 0: { + phi_1123_ = 0u; + break; + } + case 1: { + phi_1123_ = 1u; + break; + } + case 2: { + phi_1123_ = 2u; + break; + } + default: { + phi_1123_ = 0u; + break; + } } - let _e1007 = phi_1602_; - phi_1603_ = _e1007; - } - let _e1012 = phi_1603_; - phi_1605_ = _e1012; - break; - } - case 0: { - if (_e878.y > 1f) { - phi_4375_ = 0.9999999f; + let _e564 = phi_1123_; + phi_1136_ = type_15(type_14(_e557, _e564), vec2(_e528, _e532), vec2(_e537, _e541), _e546, _e550); } else { - phi_4375_ = select(_e878.y, 0.00000011920929f, (_e878.y < 0f)); + phi_1136_ = type_15(type_14(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e986 = phi_4375_; - phi_1605_ = _e986; - break; - } - default: { - phi_1605_ = f32(); - break; - } - } - 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_4441_ = (_e289.member_9 <= (_e110 - 8u)); - } else { - phi_4441_ = false; - } - let _e1077 = phi_4441_; - 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_1688_ = 0u; - break; - } - case 1: { - phi_1688_ = 1u; - break; - } - case 2: { - phi_1688_ = 2u; - break; - } - default: { - phi_1688_ = 0u; - break; - } - } - let _e1109 = phi_1688_; - let _e1113 = global.member[(_e289.member_9 + 7u)]; - switch bitcast(_e1113) { - case 0: { - phi_1697_ = 0u; - break; - } - case 1: { - phi_1697_ = 1u; - break; - } - case 2: { - phi_1697_ = 2u; - break; - } - default: { - phi_1697_ = 0u; - break; + let _e568 = phi_1136_; + switch bitcast(_e568.member.member) { + case 1: { + let _e606 = abs(_e520.x); + let _e608 = (_e606 % 1f); + if (_e606 >= 1f) { + phi_6027_ = select(true, false, (_e608 == 0f)); + } else { + phi_6027_ = true; + } + let _e612 = phi_6027_; + let _e613 = select(1f, _e608, _e612); + if (select(-1f, 1f, (_e520.x >= 0f)) > 0f) { + phi_1156_ = _e613; + } else { + phi_1156_ = (1f - _e613); + } + let _e617 = phi_1156_; + phi_1193_ = _e617; + 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_6010_ = select(true, false, (_e589 == 0f)); + } else { + phi_6010_ = true; + } + let _e593 = phi_6010_; + let _e594 = select(1f, _e589, _e593); + if (select(-1f, 1f, (_e520.x >= 0f)) > 0f) { + if _e587 { + phi_1185_ = _e594; + } else { + phi_1185_ = (1f - _e594); + } + let _e601 = phi_1185_; + phi_1191_ = _e601; + } else { + if _e587 { + phi_1190_ = (1f - _e594); + } else { + phi_1190_ = _e594; + } + let _e598 = phi_1190_; + phi_1191_ = _e598; + } + let _e603 = phi_1191_; + phi_1193_ = _e603; + break; + } + case 0: { + if (_e520.x > 1f) { + phi_5997_ = 0.9999999f; + } else { + phi_5997_ = select(_e520.x, 0.00000011920929f, (_e520.x < 0f)); + } + let _e577 = phi_5997_; + phi_1193_ = _e577; + break; + } + default: { + phi_1193_ = f32(); + break; + } } - } - let _e1116 = phi_1697_; - phi_1710_ = type_32(type_24(_e1109, _e1116), vec2(_e1080, _e1084), vec2(_e1089, _e1093), _e1098, _e1102); - } else { - phi_1710_ = type_32(type_24(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); - } - let _e1120 = phi_1710_; - switch bitcast(_e1120.member.member) { - case 1: { - let _e1158 = abs(_e1072.x); - let _e1160 = (_e1158 % 1f); - if (_e1158 >= 1f) { - phi_4492_ = select(true, false, (_e1160 == 0f)); - } else { - phi_4492_ = true; + let _e619 = phi_1193_; + switch bitcast(_e568.member.member_1) { + case 1: { + let _e657 = abs(_e520.y); + let _e659 = (_e657 % 1f); + if (_e657 >= 1f) { + phi_6075_ = select(true, false, (_e659 == 0f)); + } else { + phi_6075_ = true; + } + let _e663 = phi_6075_; + let _e664 = select(1f, _e659, _e663); + if (select(-1f, 1f, (_e520.y >= 0f)) > 0f) { + phi_1214_ = _e664; + } else { + phi_1214_ = (1f - _e664); + } + let _e668 = phi_1214_; + phi_1251_ = _e668; + 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_6058_ = select(true, false, (_e640 == 0f)); + } else { + phi_6058_ = true; + } + let _e644 = phi_6058_; + let _e645 = select(1f, _e640, _e644); + if (select(-1f, 1f, (_e520.y >= 0f)) > 0f) { + if _e638 { + phi_1243_ = _e645; + } else { + phi_1243_ = (1f - _e645); + } + let _e652 = phi_1243_; + phi_1249_ = _e652; + } else { + if _e638 { + phi_1248_ = (1f - _e645); + } else { + phi_1248_ = _e645; + } + let _e649 = phi_1248_; + phi_1249_ = _e649; + } + let _e654 = phi_1249_; + phi_1251_ = _e654; + break; + } + case 0: { + if (_e520.y > 1f) { + phi_6045_ = 0.9999999f; + } else { + phi_6045_ = select(_e520.y, 0.00000011920929f, (_e520.y < 0f)); + } + let _e628 = phi_6045_; + phi_1251_ = _e628; + break; + } + default: { + phi_1251_ = f32(); + break; + } } - let _e1164 = phi_4492_; - let _e1165 = select(1f, _e1160, _e1164); - if (select(-1f, 1f, (_e1072.x >= 0f)) > 0f) { - phi_1730_ = _e1165; + let _e670 = phi_1251_; + 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)) / _e499), (f32((select(select(u32(_e683), 0u, (_e683 < 0f)), 4294967295u, (_e683 > 4294967000f)) + _e568.member_1.y)) / _e500), f32(_e568.member_3)); + let _e707 = textureSampleLevel(global_11, global_10, vec2(_e701.x, _e701.y), i32(_e701.z), 0f); + let _e710 = select(_e707, vec4(1f, 1f, 1f, 1f), vec4((_e319.member_6 == 4294967295u))); + let _e714 = select(_e152, _e151, vec2((_e319.member_12 == 0u))); + if _e325 { + phi_6111_ = (_e319.member_7 <= (_e146 - 8u)); } else { - phi_1730_ = (1f - _e1165); - } - let _e1169 = phi_1730_; - phi_1767_ = _e1169; - break; - } - case 2: { - 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_4475_ = select(true, false, (_e1141 == 0f)); + phi_6111_ = false; + } + let _e719 = phi_6111_; + if _e719 { + let _e722 = global.member[_e319.member_7]; + let _e726 = global.member[(_e319.member_7 + 1u)]; + let _e731 = global.member[(_e319.member_7 + 2u)]; + let _e735 = global.member[(_e319.member_7 + 3u)]; + let _e740 = global.member[(_e319.member_7 + 4u)]; + let _e744 = global.member[(_e319.member_7 + 5u)]; + let _e748 = global.member[(_e319.member_7 + 6u)]; + switch bitcast(_e748) { + case 0: { + phi_1334_ = 0u; + break; + } + case 1: { + phi_1334_ = 1u; + break; + } + case 2: { + phi_1334_ = 2u; + break; + } + default: { + phi_1334_ = 0u; + break; + } + } + let _e751 = phi_1334_; + let _e755 = global.member[(_e319.member_7 + 7u)]; + switch bitcast(_e755) { + case 0: { + phi_1343_ = 0u; + break; + } + case 1: { + phi_1343_ = 1u; + break; + } + case 2: { + phi_1343_ = 2u; + break; + } + default: { + phi_1343_ = 0u; + break; + } + } + let _e758 = phi_1343_; + phi_1356_ = type_15(type_14(_e751, _e758), vec2(_e722, _e726), vec2(_e731, _e735), _e740, _e744); } else { - phi_4475_ = true; + phi_1356_ = type_15(type_14(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e1145 = phi_4475_; - let _e1146 = select(1f, _e1141, _e1145); - if (select(-1f, 1f, (_e1072.x >= 0f)) > 0f) { - if _e1139 { - phi_1759_ = _e1146; - } else { - phi_1759_ = (1f - _e1146); + let _e762 = phi_1356_; + switch bitcast(_e762.member.member) { + case 1: { + let _e800 = abs(_e714.x); + let _e802 = (_e800 % 1f); + if (_e800 >= 1f) { + phi_6162_ = select(true, false, (_e802 == 0f)); + } else { + phi_6162_ = true; + } + let _e806 = phi_6162_; + let _e807 = select(1f, _e802, _e806); + if (select(-1f, 1f, (_e714.x >= 0f)) > 0f) { + phi_1376_ = _e807; + } else { + phi_1376_ = (1f - _e807); + } + let _e811 = phi_1376_; + phi_1413_ = _e811; + break; } - let _e1153 = phi_1759_; - phi_1765_ = _e1153; - } else { - if _e1139 { - phi_1764_ = (1f - _e1146); - } else { - phi_1764_ = _e1146; + 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_6145_ = select(true, false, (_e783 == 0f)); + } else { + phi_6145_ = true; + } + let _e787 = phi_6145_; + let _e788 = select(1f, _e783, _e787); + if (select(-1f, 1f, (_e714.x >= 0f)) > 0f) { + if _e781 { + phi_1405_ = _e788; + } else { + phi_1405_ = (1f - _e788); + } + let _e795 = phi_1405_; + phi_1411_ = _e795; + } else { + if _e781 { + phi_1410_ = (1f - _e788); + } else { + phi_1410_ = _e788; + } + let _e792 = phi_1410_; + phi_1411_ = _e792; + } + let _e797 = phi_1411_; + phi_1413_ = _e797; + break; + } + case 0: { + if (_e714.x > 1f) { + phi_6132_ = 0.9999999f; + } else { + phi_6132_ = select(_e714.x, 0.00000011920929f, (_e714.x < 0f)); + } + let _e771 = phi_6132_; + phi_1413_ = _e771; + break; + } + default: { + phi_1413_ = f32(); + break; } - let _e1150 = phi_1764_; - phi_1765_ = _e1150; } - let _e1155 = phi_1765_; - phi_1767_ = _e1155; - break; - } - case 0: { - if (_e1072.x > 1f) { - phi_4462_ = 0.9999999f; - } else { - phi_4462_ = select(_e1072.x, 0.00000011920929f, (_e1072.x < 0f)); + let _e813 = phi_1413_; + switch bitcast(_e762.member.member_1) { + case 1: { + let _e851 = abs(_e714.y); + let _e853 = (_e851 % 1f); + if (_e851 >= 1f) { + phi_6210_ = select(true, false, (_e853 == 0f)); + } else { + phi_6210_ = true; + } + let _e857 = phi_6210_; + let _e858 = select(1f, _e853, _e857); + if (select(-1f, 1f, (_e714.y >= 0f)) > 0f) { + phi_1434_ = _e858; + } else { + phi_1434_ = (1f - _e858); + } + let _e862 = phi_1434_; + phi_1471_ = _e862; + 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_6193_ = select(true, false, (_e834 == 0f)); + } else { + phi_6193_ = true; + } + let _e838 = phi_6193_; + let _e839 = select(1f, _e834, _e838); + if (select(-1f, 1f, (_e714.y >= 0f)) > 0f) { + if _e832 { + phi_1463_ = _e839; + } else { + phi_1463_ = (1f - _e839); + } + let _e846 = phi_1463_; + phi_1469_ = _e846; + } else { + if _e832 { + phi_1468_ = (1f - _e839); + } else { + phi_1468_ = _e839; + } + let _e843 = phi_1468_; + phi_1469_ = _e843; + } + let _e848 = phi_1469_; + phi_1471_ = _e848; + break; + } + case 0: { + if (_e714.y > 1f) { + phi_6180_ = 0.9999999f; + } else { + phi_6180_ = select(_e714.y, 0.00000011920929f, (_e714.y < 0f)); + } + let _e822 = phi_6180_; + phi_1471_ = _e822; + break; + } + default: { + phi_1471_ = f32(); + break; + } } - let _e1129 = phi_4462_; - phi_1767_ = _e1129; - break; - } - default: { - phi_1767_ = f32(); - break; - } - } - let _e1171 = phi_1767_; - switch bitcast(_e1120.member.member_1) { - case 1: { - let _e1209 = abs(_e1072.y); - let _e1211 = (_e1209 % 1f); - if (_e1209 >= 1f) { - phi_4540_ = select(true, false, (_e1211 == 0f)); + let _e864 = phi_1471_; + 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)) / _e499), (f32((select(select(u32(_e877), 0u, (_e877 < 0f)), 4294967295u, (_e877 > 4294967000f)) + _e762.member_1.y)) / _e500), f32(_e762.member_3)); + let _e901 = textureSampleLevel(global_11, global_10, vec2(_e895.x, _e895.y), i32(_e895.z), 0f); + let _e902 = (_e319.member_7 == 4294967295u); + let _e904 = select(_e901, vec4(1f, 1f, 1f, 1f), vec4(_e902)); + let _e908 = select(_e152, _e151, vec2((_e319.member_13 == 0u))); + if _e325 { + phi_6246_ = (_e319.member_8 <= (_e146 - 8u)); } else { - phi_4540_ = true; - } - let _e1215 = phi_4540_; - let _e1216 = select(1f, _e1211, _e1215); - if (select(-1f, 1f, (_e1072.y >= 0f)) > 0f) { - phi_1788_ = _e1216; + phi_6246_ = false; + } + let _e913 = phi_6246_; + if _e913 { + let _e916 = global.member[_e319.member_8]; + let _e920 = global.member[(_e319.member_8 + 1u)]; + let _e925 = global.member[(_e319.member_8 + 2u)]; + let _e929 = global.member[(_e319.member_8 + 3u)]; + let _e934 = global.member[(_e319.member_8 + 4u)]; + let _e938 = global.member[(_e319.member_8 + 5u)]; + let _e942 = global.member[(_e319.member_8 + 6u)]; + switch bitcast(_e942) { + case 0: { + phi_1554_ = 0u; + break; + } + case 1: { + phi_1554_ = 1u; + break; + } + case 2: { + phi_1554_ = 2u; + break; + } + default: { + phi_1554_ = 0u; + break; + } + } + let _e945 = phi_1554_; + let _e949 = global.member[(_e319.member_8 + 7u)]; + switch bitcast(_e949) { + case 0: { + phi_1563_ = 0u; + break; + } + case 1: { + phi_1563_ = 1u; + break; + } + case 2: { + phi_1563_ = 2u; + break; + } + default: { + phi_1563_ = 0u; + break; + } + } + let _e952 = phi_1563_; + phi_1576_ = type_15(type_14(_e945, _e952), vec2(_e916, _e920), vec2(_e925, _e929), _e934, _e938); } else { - phi_1788_ = (1f - _e1216); + phi_1576_ = type_15(type_14(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e1220 = phi_1788_; - phi_1825_ = _e1220; - break; - } - case 2: { - 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_4523_ = select(true, false, (_e1192 == 0f)); - } else { - phi_4523_ = true; + let _e956 = phi_1576_; + switch bitcast(_e956.member.member) { + case 1: { + let _e994 = abs(_e908.x); + let _e996 = (_e994 % 1f); + if (_e994 >= 1f) { + phi_6297_ = select(true, false, (_e996 == 0f)); + } else { + phi_6297_ = true; + } + let _e1000 = phi_6297_; + let _e1001 = select(1f, _e996, _e1000); + if (select(-1f, 1f, (_e908.x >= 0f)) > 0f) { + phi_1596_ = _e1001; + } else { + phi_1596_ = (1f - _e1001); + } + let _e1005 = phi_1596_; + phi_1633_ = _e1005; + 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_6280_ = select(true, false, (_e977 == 0f)); + } else { + phi_6280_ = true; + } + let _e981 = phi_6280_; + let _e982 = select(1f, _e977, _e981); + if (select(-1f, 1f, (_e908.x >= 0f)) > 0f) { + if _e975 { + phi_1625_ = _e982; + } else { + phi_1625_ = (1f - _e982); + } + let _e989 = phi_1625_; + phi_1631_ = _e989; + } else { + if _e975 { + phi_1630_ = (1f - _e982); + } else { + phi_1630_ = _e982; + } + let _e986 = phi_1630_; + phi_1631_ = _e986; + } + let _e991 = phi_1631_; + phi_1633_ = _e991; + break; + } + case 0: { + if (_e908.x > 1f) { + phi_6267_ = 0.9999999f; + } else { + phi_6267_ = select(_e908.x, 0.00000011920929f, (_e908.x < 0f)); + } + let _e965 = phi_6267_; + phi_1633_ = _e965; + break; + } + default: { + phi_1633_ = f32(); + break; + } } - let _e1196 = phi_4523_; - let _e1197 = select(1f, _e1192, _e1196); - if (select(-1f, 1f, (_e1072.y >= 0f)) > 0f) { - if _e1190 { - phi_1817_ = _e1197; - } else { - phi_1817_ = (1f - _e1197); + let _e1007 = phi_1633_; + switch bitcast(_e956.member.member_1) { + case 1: { + let _e1045 = abs(_e908.y); + let _e1047 = (_e1045 % 1f); + if (_e1045 >= 1f) { + phi_6345_ = select(true, false, (_e1047 == 0f)); + } else { + phi_6345_ = true; + } + let _e1051 = phi_6345_; + let _e1052 = select(1f, _e1047, _e1051); + if (select(-1f, 1f, (_e908.y >= 0f)) > 0f) { + phi_1654_ = _e1052; + } else { + phi_1654_ = (1f - _e1052); + } + let _e1056 = phi_1654_; + phi_1691_ = _e1056; + break; } - let _e1204 = phi_1817_; - phi_1823_ = _e1204; - } else { - if _e1190 { - phi_1822_ = (1f - _e1197); - } else { - phi_1822_ = _e1197; + 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_6328_ = select(true, false, (_e1028 == 0f)); + } else { + phi_6328_ = true; + } + let _e1032 = phi_6328_; + let _e1033 = select(1f, _e1028, _e1032); + if (select(-1f, 1f, (_e908.y >= 0f)) > 0f) { + if _e1026 { + phi_1683_ = _e1033; + } else { + phi_1683_ = (1f - _e1033); + } + let _e1040 = phi_1683_; + phi_1689_ = _e1040; + } else { + if _e1026 { + phi_1688_ = (1f - _e1033); + } else { + phi_1688_ = _e1033; + } + let _e1037 = phi_1688_; + phi_1689_ = _e1037; + } + let _e1042 = phi_1689_; + phi_1691_ = _e1042; + break; + } + case 0: { + if (_e908.y > 1f) { + phi_6315_ = 0.9999999f; + } else { + phi_6315_ = select(_e908.y, 0.00000011920929f, (_e908.y < 0f)); + } + let _e1016 = phi_6315_; + phi_1691_ = _e1016; + break; + } + default: { + phi_1691_ = f32(); + break; } - let _e1201 = phi_1822_; - phi_1823_ = _e1201; } - let _e1206 = phi_1823_; - phi_1825_ = _e1206; - break; - } - case 0: { - if (_e1072.y > 1f) { - phi_4510_ = 0.9999999f; + let _e1058 = phi_1691_; + 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)) / _e499), (f32((select(select(u32(_e1071), 0u, (_e1071 < 0f)), 4294967295u, (_e1071 > 4294967000f)) + _e956.member_1.y)) / _e500), f32(_e956.member_3)); + let _e1095 = textureSampleLevel(global_11, global_10, vec2(_e1089.x, _e1089.y), i32(_e1089.z), 0f); + let _e1102 = select(_e152, _e151, vec2((_e319.member_14 == 0u))); + if _e325 { + phi_6381_ = (_e319.member_9 <= (_e146 - 8u)); } else { - phi_4510_ = select(_e1072.y, 0.00000011920929f, (_e1072.y < 0f)); - } - let _e1180 = phi_4510_; - phi_1825_ = _e1180; - break; - } - default: { - phi_1825_ = f32(); - break; - } - } - 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 _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_4598_ = vec3(0f, 0f, 0f); - } else { - phi_4598_ = (vec3(_e1266, _e1267, _e1268) * (1f / _e1273)); - } - let _e1278 = phi_4598_; - let _e1285 = sqrt(fma(_e116.z, _e116.z, fma(_e116.x, _e116.x, (_e116.y * _e116.y)))); - if (_e1285 == 0f) { - phi_4633_ = vec3(0f, 0f, 0f); - } else { - phi_4633_ = (_e116 * (1f / _e1285)); - } - let _e1290 = phi_4633_; - let _e1297 = sqrt(fma(_e117.z, _e117.z, fma(_e117.x, _e117.x, (_e117.y * _e117.y)))); - if (_e1297 == 0f) { - phi_4668_ = vec3(0f, 0f, 0f); - } else { - phi_4668_ = (_e117 * (1f / _e1297)); - } - let _e1302 = phi_4668_; - let _e1309 = sqrt(fma(_e115.z, _e115.z, fma(_e115.x, _e115.x, (_e115.y * _e115.y)))); - if (_e1309 == 0f) { - phi_4703_ = vec3(0f, 0f, 0f); - } else { - phi_4703_ = (_e115 * (1f / _e1309)); - } - let _e1314 = phi_4703_; - 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_4738_ = vec3(0f, 0f, 0f); - } else { - phi_4738_ = (vec3(_e1333, _e1334, _e1335) * (1f / _e1340)); - } - let _e1345 = phi_4738_; - phi_1919_ = _e1278; - phi_1920_ = _e1345; - } - 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_4770_ = (_e122 <= (_e110 - 83u)); - } else { - phi_4770_ = false; - } - let _e1403 = phi_4770_; - 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_2127_ = type_24(0u, 6u); - loop { - let _e1591 = phi_2127_; - if (_e1591.member < _e1591.member_1) { - phi_2128_ = type_24((_e1591.member + 1u), _e1591.member_1); - phi_2151_ = type_24(1u, _e1591.member); + phi_6381_ = false; + } + let _e1107 = phi_6381_; + if _e1107 { + let _e1110 = global.member[_e319.member_9]; + let _e1114 = global.member[(_e319.member_9 + 1u)]; + let _e1119 = global.member[(_e319.member_9 + 2u)]; + let _e1123 = global.member[(_e319.member_9 + 3u)]; + let _e1128 = global.member[(_e319.member_9 + 4u)]; + let _e1132 = global.member[(_e319.member_9 + 5u)]; + let _e1136 = global.member[(_e319.member_9 + 6u)]; + switch bitcast(_e1136) { + case 0: { + phi_1774_ = 0u; + break; + } + case 1: { + phi_1774_ = 1u; + break; + } + case 2: { + phi_1774_ = 2u; + break; + } + default: { + phi_1774_ = 0u; + break; + } + } + let _e1139 = phi_1774_; + let _e1143 = global.member[(_e319.member_9 + 7u)]; + switch bitcast(_e1143) { + case 0: { + phi_1783_ = 0u; + break; + } + case 1: { + phi_1783_ = 1u; + break; + } + case 2: { + phi_1783_ = 2u; + break; + } + default: { + phi_1783_ = 0u; + break; + } + } + let _e1146 = phi_1783_; + phi_1796_ = type_15(type_14(_e1139, _e1146), vec2(_e1110, _e1114), vec2(_e1119, _e1123), _e1128, _e1132); } else { - phi_2128_ = _e1591; - phi_2151_ = type_24(0u, type_24().member_1); + phi_1796_ = type_15(type_14(0u, 0u), vec2(0u, 0u), vec2(0u, 0u), 0u, 0u); } - let _e1604 = phi_2128_; - let _e1606 = phi_2151_; - switch bitcast(_e1606.member) { - case 0: { - phi_2178_ = false; + let _e1150 = phi_1796_; + switch bitcast(_e1150.member.member) { + case 1: { + let _e1188 = abs(_e1102.x); + let _e1190 = (_e1188 % 1f); + if (_e1188 >= 1f) { + phi_6432_ = select(true, false, (_e1190 == 0f)); + } else { + phi_6432_ = true; + } + let _e1194 = phi_6432_; + let _e1195 = select(1f, _e1190, _e1194); + if (select(-1f, 1f, (_e1102.x >= 0f)) > 0f) { + phi_1816_ = _e1195; + } else { + phi_1816_ = (1f - _e1195); + } + let _e1199 = phi_1816_; + phi_1853_ = _e1199; + 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_6415_ = select(true, false, (_e1171 == 0f)); + } else { + phi_6415_ = true; + } + let _e1175 = phi_6415_; + let _e1176 = select(1f, _e1171, _e1175); + if (select(-1f, 1f, (_e1102.x >= 0f)) > 0f) { + if _e1169 { + phi_1845_ = _e1176; + } else { + phi_1845_ = (1f - _e1176); + } + let _e1183 = phi_1845_; + phi_1851_ = _e1183; + } else { + if _e1169 { + phi_1850_ = (1f - _e1176); + } else { + phi_1850_ = _e1176; + } + let _e1180 = phi_1850_; + phi_1851_ = _e1180; + } + let _e1185 = phi_1851_; + phi_1853_ = _e1185; break; } - case 1: { - 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_2178_ = true; + case 0: { + if (_e1102.x > 1f) { + phi_6402_ = 0.9999999f; + } else { + phi_6402_ = select(_e1102.x, 0.00000011920929f, (_e1102.x < 0f)); + } + let _e1159 = phi_6402_; + phi_1853_ = _e1159; break; } default: { - phi_2178_ = bool(); + phi_1853_ = f32(); break; } } - let _e1634 = phi_2178_; - continue; - continuing { - phi_2127_ = _e1604; - break if !(_e1634); - } - } - 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_2184_ = type_24(0u, 8u); - loop { - let _e1639 = phi_2184_; - if (_e1639.member < _e1639.member_1) { - phi_2185_ = type_24((_e1639.member + 1u), _e1639.member_1); - phi_2208_ = type_24(1u, _e1639.member); - } else { - phi_2185_ = _e1639; - phi_2208_ = type_24(0u, type_24().member_1); - } - let _e1652 = phi_2185_; - let _e1654 = phi_2208_; - switch bitcast(_e1654.member) { - case 0: { - phi_2231_ = false; + let _e1201 = phi_1853_; + switch bitcast(_e1150.member.member_1) { + case 1: { + let _e1239 = abs(_e1102.y); + let _e1241 = (_e1239 % 1f); + if (_e1239 >= 1f) { + phi_6480_ = select(true, false, (_e1241 == 0f)); + } else { + phi_6480_ = true; + } + let _e1245 = phi_6480_; + let _e1246 = select(1f, _e1241, _e1245); + if (select(-1f, 1f, (_e1102.y >= 0f)) > 0f) { + phi_1874_ = _e1246; + } else { + phi_1874_ = (1f - _e1246); + } + let _e1250 = phi_1874_; + phi_1911_ = _e1250; break; } - case 1: { - 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_2231_ = true; + 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_6463_ = select(true, false, (_e1222 == 0f)); + } else { + phi_6463_ = true; + } + let _e1226 = phi_6463_; + let _e1227 = select(1f, _e1222, _e1226); + if (select(-1f, 1f, (_e1102.y >= 0f)) > 0f) { + if _e1220 { + phi_1903_ = _e1227; + } else { + phi_1903_ = (1f - _e1227); + } + let _e1234 = phi_1903_; + phi_1909_ = _e1234; + } else { + if _e1220 { + phi_1908_ = (1f - _e1227); + } else { + phi_1908_ = _e1227; + } + let _e1231 = phi_1908_; + phi_1909_ = _e1231; + } + let _e1236 = phi_1909_; + phi_1911_ = _e1236; + break; + } + case 0: { + if (_e1102.y > 1f) { + phi_6450_ = 0.9999999f; + } else { + phi_6450_ = select(_e1102.y, 0.00000011920929f, (_e1102.y < 0f)); + } + let _e1210 = phi_6450_; + phi_1911_ = _e1210; break; } default: { - phi_2231_ = bool(); + phi_1911_ = f32(); break; } } - let _e1677 = phi_2231_; - continue; - continuing { - phi_2184_ = _e1652; - break if !(_e1677); - } - } - let _e1679 = local; - phi_2239_ = 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_2239_ = 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 _e1683 = phi_2239_; - 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_4842_ = vec3(0f, 0f, 0f); - } else { - phi_4842_ = (_e1685 * (1f / _e1692)); - } - let _e1697 = phi_4842_; - 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_4901_ = vec3(0f, 0f, 0f); - } else { - phi_4901_ = (_e1349 * (1f / _e1705)); - } - let _e1710 = phi_4901_; - 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_4975_ = vec3(0f, 0f, 0f); - } else { - phi_4975_ = (_e1685 * (1f / _e1692)); - } - let _e1734 = phi_4975_; - 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 _e289.member_15 { - if _e1706 { - phi_5368_ = vec3(0f, 0f, 0f); + let _e1252 = phi_1911_; + 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)) / _e499), (f32((select(select(u32(_e1265), 0u, (_e1265 < 0f)), 4294967295u, (_e1265 > 4294967000f)) + _e1150.member_1.y)) / _e500), f32(_e1150.member_3)); + let _e1289 = textureSampleLevel(global_11, global_10, vec2(_e1283.x, _e1283.y), i32(_e1283.z), 0f); + let _e1292 = select(_e1289, vec4(1f, 1f, 1f, 1f), vec4((_e319.member_9 == 4294967295u))); + if _e902 { + phi_2005_ = vec3(0f, 0f, 0f); + phi_2006_ = _e153; + } 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_6538_ = vec3(0f, 0f, 0f); + } else { + phi_6538_ = (vec3(_e1296, _e1297, _e1298) * (1f / _e1303)); + } + let _e1308 = phi_6538_; + let _e1315 = sqrt(fma(_e154.z, _e154.z, fma(_e154.x, _e154.x, (_e154.y * _e154.y)))); + if (_e1315 == 0f) { + phi_6573_ = vec3(0f, 0f, 0f); + } else { + phi_6573_ = (_e154 * (1f / _e1315)); + } + let _e1320 = phi_6573_; + let _e1327 = sqrt(fma(_e155.z, _e155.z, fma(_e155.x, _e155.x, (_e155.y * _e155.y)))); + if (_e1327 == 0f) { + phi_6608_ = vec3(0f, 0f, 0f); + } else { + phi_6608_ = (_e155 * (1f / _e1327)); + } + let _e1332 = phi_6608_; + let _e1339 = sqrt(fma(_e153.z, _e153.z, fma(_e153.x, _e153.x, (_e153.y * _e153.y)))); + if (_e1339 == 0f) { + phi_6643_ = vec3(0f, 0f, 0f); } else { - phi_5368_ = (_e1349 * (1f / _e1705)); + phi_6643_ = (_e153 * (1f / _e1339)); } - let _e1912 = phi_5368_; - if _e1693 { - phi_5403_ = vec3(0f, 0f, 0f); + let _e1344 = phi_6643_; + 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_6678_ = vec3(0f, 0f, 0f); } else { - phi_5403_ = (_e1685 * (1f / _e1692)); + phi_6678_ = (vec3(_e1363, _e1364, _e1365) * (1f / _e1370)); } - let _e1916 = phi_5403_; - phi_2279_ = type_24(0u, _e157); - phi_2282_ = vec3(0f, 0f, 0f); + let _e1375 = phi_6678_; + phi_2005_ = _e1308; + phi_2006_ = _e1375; + } + let _e1377 = phi_2005_; + let _e1379 = phi_2006_; + let _e1383 = (_e516.x * _e319.member_2.x); + let _e1386 = (_e516.y * _e319.member_2.y); + let _e1389 = (_e516.z * _e319.member_2.z); + let _e1394 = (_e1383 * _e150.x); + let _e1396 = (_e1386 * _e150.y); + let _e1398 = (_e1389 * _e150.z); + let _e1403 = (_e710.y * _e319.member_4); + let _e1406 = (_e710.z * _e319.member_3); + let _e1410 = fma(_e319.member_16, (select(_e1095, vec4(1f, 1f, 1f, 1f), vec4((_e319.member_8 == 4294967295u))).x - 1f), 1f); + let _e1416 = (_e1292.x * _e319.member.x); + let _e1418 = (_e1292.y * _e319.member.y); + let _e1420 = (_e1292.z * _e319.member.z); + let _e1425 = textureSampleLevel(global_12, global_13, _e1379, 0f); + if (_e146 >= 86u) { + phi_6710_ = (_e160 <= (_e146 - 86u)); + } else { + phi_6710_ = false; + } + let _e1433 = phi_6710_; + if _e1433 { + let _e1436 = global.member[_e160]; + let _e1441 = global.member[(_e160 + 1u)]; + let _e1446 = global.member[(_e160 + 2u)]; + let _e1451 = global.member[(_e160 + 3u)]; + let _e1457 = global.member[(_e160 + 4u)]; + let _e1462 = global.member[(_e160 + 5u)]; + let _e1467 = global.member[(_e160 + 6u)]; + let _e1472 = global.member[(_e160 + 7u)]; + let _e1478 = global.member[(_e160 + 8u)]; + let _e1483 = global.member[(_e160 + 9u)]; + let _e1488 = global.member[(_e160 + 10u)]; + let _e1493 = global.member[(_e160 + 11u)]; + let _e1499 = global.member[(_e160 + 12u)]; + let _e1504 = global.member[(_e160 + 13u)]; + let _e1509 = global.member[(_e160 + 14u)]; + let _e1514 = global.member[(_e160 + 15u)]; + let _e1521 = global.member[(_e160 + 16u)]; + let _e1526 = global.member[(_e160 + 17u)]; + let _e1531 = global.member[(_e160 + 18u)]; + let _e1536 = global.member[(_e160 + 19u)]; + let _e1542 = global.member[(_e160 + 20u)]; + let _e1547 = global.member[(_e160 + 21u)]; + let _e1552 = global.member[(_e160 + 22u)]; + let _e1557 = global.member[(_e160 + 23u)]; + let _e1563 = global.member[(_e160 + 24u)]; + let _e1568 = global.member[(_e160 + 25u)]; + let _e1573 = global.member[(_e160 + 26u)]; + let _e1578 = global.member[(_e160 + 27u)]; + let _e1584 = global.member[(_e160 + 28u)]; + let _e1589 = global.member[(_e160 + 29u)]; + let _e1594 = global.member[(_e160 + 30u)]; + let _e1599 = global.member[(_e160 + 31u)]; + let _e1606 = global.member[(_e160 + 32u)]; + let _e1611 = global.member[(_e160 + 33u)]; + let _e1616 = global.member[(_e160 + 34u)]; + local_2 = 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_2213_ = type_14(0u, 6u); loop { - let _e1919 = phi_2279_; - let _e1921 = phi_2282_; - local_2 = _e1921; - local_3 = _e1921; - local_4 = _e1921; - if (_e1919.member < _e1919.member_1) { - phi_2280_ = type_24((_e1919.member + 1u), _e1919.member_1); - phi_2305_ = type_24(1u, _e1919.member); + let _e1621 = phi_2213_; + if (_e1621.member < _e1621.member_1) { + phi_2214_ = type_14((_e1621.member + 1u), _e1621.member_1); + phi_2237_ = type_14(1u, _e1621.member); } else { - phi_2280_ = _e1919; - phi_2305_ = type_24(0u, type_24().member_1); + phi_2214_ = _e1621; + phi_2237_ = type_14(0u, type_14().member_1); } - let _e1934 = phi_2280_; - let _e1936 = phi_2305_; - switch bitcast(_e1936.member) { + let _e1634 = phi_2214_; + let _e1636 = phi_2237_; + switch bitcast(_e1636.member) { case 0: { - phi_2283_ = vec3(); - phi_3176_ = false; + phi_2264_ = false; break; } case 1: { - if (_e1936.member_1 >= _e157) { - phi_5420_ = 4294967295u; - } else { - phi_5420_ = (_e153 + _e1936.member_1); - } - let _e1943 = phi_5420_; - if (_e110 >= 1u) { - phi_5439_ = (_e1943 <= (_e110 - 1u)); - } else { - phi_5439_ = false; - } - let _e1948 = phi_5439_; - if _e1948 { - let _e1951 = global.member[_e1943]; - phi_2322_ = _e1951; + let _e1641 = ((_e160 + 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_2[_e1636.member_1] = vec4(bitcast(_e1644), bitcast(_e1649), bitcast(_e1654), bitcast(_e1659)); + phi_2264_ = true; + break; + } + default: { + phi_2264_ = bool(); + break; + } + } + let _e1664 = phi_2264_; + continue; + continuing { + phi_2213_ = _e1634; + break if !(_e1664); + } + } + let _e1666 = local_2; + local_1 = 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_2270_ = type_14(0u, 8u); + loop { + let _e1669 = phi_2270_; + if (_e1669.member < _e1669.member_1) { + phi_2271_ = type_14((_e1669.member + 1u), _e1669.member_1); + phi_2294_ = type_14(1u, _e1669.member); + } else { + phi_2271_ = _e1669; + phi_2294_ = type_14(0u, type_14().member_1); + } + let _e1682 = phi_2271_; + let _e1684 = phi_2294_; + switch bitcast(_e1684.member) { + case 0: { + phi_2317_ = false; + break; + } + case 1: { + let _e1689 = ((_e160 + 59u) + (_e1684.member_1 * 3u)); + let _e1692 = global.member[_e1689]; + let _e1697 = global.member[(_e1689 + 1u)]; + let _e1702 = global.member[(_e1689 + 2u)]; + local_1[_e1684.member_1] = vec3(bitcast(_e1692), bitcast(_e1697), bitcast(_e1702)); + phi_2317_ = true; + break; + } + default: { + phi_2317_ = bool(); + break; + } + } + let _e1707 = phi_2317_; + continue; + continuing { + phi_2270_ = _e1682; + break if !(_e1707); + } + } + let _e1709 = local_1; + let _e1713 = global.member[(_e160 + 83u)]; + let _e1718 = global.member[(_e160 + 84u)]; + let _e1723 = global.member[(_e160 + 85u)]; + phi_2338_ = type_25(type_23(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_23(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))), vec3(bitcast(_e1606), bitcast(_e1611), bitcast(_e1616)), type_24(_e1709, _e1666, vec3(bitcast(_e1713), bitcast(_e1718), bitcast(_e1723)))); + } else { + phi_2338_ = type_25(type_23(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_23(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), vec3(0f, 0f, 0f), type_24(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 _e1729 = phi_2338_; + let _e1731 = (_e1729.member_2 - _e156); + let _e1738 = sqrt(fma(_e1731.z, _e1731.z, fma(_e1731.x, _e1731.x, (_e1731.y * _e1731.y)))); + let _e1739 = (_e1738 == 0f); + if _e1739 { + phi_6782_ = vec3(0f, 0f, 0f); + } else { + phi_6782_ = (_e1731 * (1f / _e1738)); + } + let _e1743 = phi_6782_; + let _e1744 = -(_e1743); + let _e1751 = sqrt(fma(_e1379.z, _e1379.z, fma(_e1379.x, _e1379.x, (_e1379.y * _e1379.y)))); + let _e1752 = (_e1751 == 0f); + if _e1752 { + phi_6841_ = vec3(0f, 0f, 0f); + } else { + phi_6841_ = (_e1379 * (1f / _e1751)); + } + let _e1756 = phi_6841_; + let _e1766 = (2f * fma(_e1756.z, _e1744.z, fma(_e1756.x, _e1744.x, (_e1756.y * _e1744.y)))); + let _e1773 = textureSampleLevel(global_14, global_15, (_e1744 - vec3((_e1766 * _e1756.x), (_e1766 * _e1756.y), (_e1766 * _e1756.z))), (_e1403 * 4f)); + if _e1739 { + phi_6915_ = vec3(0f, 0f, 0f); + } else { + phi_6915_ = (_e1731 * (1f / _e1738)); + } + let _e1780 = phi_6915_; + let _e1789 = textureSampleLevel(global_16, global_17, vec2(max(fma(_e1379.z, _e1780.z, fma(_e1379.x, _e1780.x, (_e1379.y * _e1780.y))), 0f), _e1403), 0f); + switch bitcast(_e182) { + case 0: { + if _e319.member_15 { + if _e1752 { + phi_7308_ = vec3(0f, 0f, 0f); + } else { + phi_7308_ = (_e1379 * (1f / _e1751)); + } + let _e1958 = phi_7308_; + if _e1739 { + phi_7343_ = vec3(0f, 0f, 0f); + } else { + phi_7343_ = (_e1731 * (1f / _e1738)); + } + let _e1962 = phi_7343_; + let _e1965 = global_1.member[0u]; + let _e1968 = global_1.member[1u]; + let _e1971 = global_1.member[2u]; + phi_8882_ = false; + phi_2405_ = type_14(0u, _e1968); + phi_2408_ = vec3(0f, 0f, 0f); + loop { + let _e1974 = phi_8882_; + let _e1976 = phi_2405_; + let _e1978 = phi_2408_; + local_8 = _e1978; + local_9 = _e1978; + local_10 = _e1978; + if (_e1976.member < _e1976.member_1) { + phi_2406_ = type_14((_e1976.member + 1u), _e1976.member_1); + phi_2431_ = type_14(1u, _e1976.member); } else { - phi_2322_ = 4294967295u; + phi_2406_ = _e1976; + phi_2431_ = type_14(0u, type_14().member_1); } - let _e1953 = phi_2322_; - let _e1954 = (_e1953 == 4294967295u); - if _e1954 { - phi_3174_ = vec3(); - } else { - if (_e110 >= 3u) { - phi_5471_ = (_e1953 <= (_e110 - 3u)); - } else { - phi_5471_ = false; + let _e1991 = phi_2406_; + let _e1993 = phi_2431_; + switch bitcast(_e1993.member) { + case 0: { + phi_9057_ = _e1974; + phi_2409_ = vec3(); + phi_5003_ = false; + break; } - let _e1959 = phi_5471_; - if _e1959 { - let _e1962 = global.member[_e1953]; - switch bitcast(_e1962) { - case 0: { - phi_2339_ = 0u; - break; - } - case 1: { - phi_2339_ = 1u; - break; - } - case 2: { - phi_2339_ = 2u; - break; - } - default: { - phi_2339_ = 0u; - break; - } + case 1: { + if (_e1993.member_1 >= _e1968) { + phi_7369_ = 4294967295u; + } else { + phi_7369_ = (_e1965 + _e1993.member_1); } - let _e1965 = phi_2339_; - let _e1969 = global.member[(_e1953 + 1u)]; - let _e1973 = global.member[(_e1953 + 2u)]; - phi_2349_ = type_33(_e1965, _e1969, _e1973); - } else { - phi_2349_ = type_33(0u, 4294967295u, 4294967295u); - } - let _e1976 = phi_2349_; - if (_e110 >= 10u) { - phi_5501_ = (_e1976.member_2 <= (_e110 - 10u)); - } else { - phi_5501_ = false; - } - let _e1982 = phi_5501_; - 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_2399_ = 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_2399_ = type_29(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); - } - let _e2037 = phi_2399_; - 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 _e295 { - phi_5967_ = (_e1976.member_1 <= (_e110 - 8u)); - } else { - phi_5967_ = false; - } - let _e2572 = phi_5967_; - 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_2447_ = type_34(vec3(bitcast(_e2575), bitcast(_e2580), bitcast(_e2585)), vec4(bitcast(_e2591), bitcast(_e2596), bitcast(_e2601), bitcast(_e2606)), bitcast(_e2612)); - } else { - phi_2447_ = type_34(vec3(0f, -1f, 0f), vec4(1f, 1f, 1f, 1f), 1f); - } - let _e2616 = phi_2447_; - 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_6014_ = vec3(0f, 0f, 0f); - } else { - phi_6014_ = (vec3(_e2638, _e2639, _e2640) * (1f / _e2645)); - } - let _e2650 = phi_6014_; - 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_6049_ = vec3(0f, 0f, 0f); - } else { - phi_6049_ = (_e2673 * (1f / _e2680)); - } - let _e2685 = phi_6049_; - 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_3164_ = 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_3165_ = true; - break; + let _e2000 = phi_7369_; + if (_e148 >= 1u) { + phi_7388_ = (_e2000 <= (_e148 - 1u)); + } else { + phi_7388_ = false; } - case 1: { - if _e295 { - phi_5793_ = (_e1976.member_1 <= (_e110 - 8u)); - } else { - phi_5793_ = false; - } - let _e2361 = phi_5793_; - 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_2654_ = type_34(vec3(bitcast(_e2364), bitcast(_e2369), bitcast(_e2374)), vec4(bitcast(_e2380), bitcast(_e2385), bitcast(_e2390), bitcast(_e2395)), bitcast(_e2401)); - } else { - phi_2654_ = type_34(vec3(0f, 0f, 0f), vec4(1f, 1f, 1f, 1f), 1f); + let _e2005 = phi_7388_; + if _e2005 { + let _e2008 = global_1.member[_e2000]; + phi_2448_ = _e2008; + } else { + phi_2448_ = 4294967295u; + } + let _e2010 = phi_2448_; + if (_e148 >= 4u) { + phi_7412_ = (_e2010 <= (_e148 - 4u)); + } else { + phi_7412_ = false; + } + let _e2015 = phi_7412_; + if _e2015 { + let _e2018 = global_1.member[_e2010]; + switch bitcast(_e2018) { + case 0: { + phi_2460_ = 0u; + break; + } + case 1: { + phi_2460_ = 1u; + break; + } + case 2: { + phi_2460_ = 2u; + break; + } + default: { + phi_2460_ = 0u; + break; + } } - let _e2405 = phi_2654_; - 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_2844_ = vec3(); - } else { - if _e2442 { - phi_5840_ = vec3(0f, 0f, 0f); + let _e2021 = phi_2460_; + let _e2025 = global_1.member[(_e2010 + 1u)]; + let _e2029 = global_1.member[(_e2010 + 2u)]; + let _e2033 = global_1.member[(_e2010 + 3u)]; + phi_2474_ = type_30(_e2021, _e2025, _e2029, _e2033); + } else { + phi_2474_ = type_30(0u, 4294967295u, 4294967295u, 4294967295u); + } + let _e2036 = phi_2474_; + if (_e148 >= 10u) { + phi_7444_ = (_e2036.member_2 <= (_e148 - 10u)); + } else { + phi_7444_ = false; + } + let _e2042 = phi_7444_; + if _e2042 { + let _e2045 = global_1.member[_e2036.member_2]; + let _e2050 = global_1.member[(_e2036.member_2 + 1u)]; + let _e2055 = global_1.member[(_e2036.member_2 + 2u)]; + let _e2061 = global_1.member[(_e2036.member_2 + 3u)]; + let _e2066 = global_1.member[(_e2036.member_2 + 4u)]; + let _e2071 = global_1.member[(_e2036.member_2 + 5u)]; + let _e2076 = global_1.member[(_e2036.member_2 + 6u)]; + let _e2082 = global_1.member[(_e2036.member_2 + 7u)]; + let _e2087 = global_1.member[(_e2036.member_2 + 8u)]; + let _e2092 = global_1.member[(_e2036.member_2 + 9u)]; + phi_2524_ = type_31(vec3(bitcast(_e2045), bitcast(_e2050), bitcast(_e2055)), vec4(bitcast(_e2061), bitcast(_e2066), bitcast(_e2071), bitcast(_e2076)), vec3(bitcast(_e2082), bitcast(_e2087), bitcast(_e2092))); + } else { + phi_2524_ = type_31(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + } + let _e2097 = phi_2524_; + let _e2105 = (_e2097.member_1.x + _e2097.member_1.x); + let _e2106 = (_e2097.member_1.y + _e2097.member_1.y); + let _e2107 = (_e2097.member_1.z + _e2097.member_1.z); + let _e2109 = (_e2097.member_1.z * _e2107); + let _e2110 = (_e2097.member_1.w * _e2105); + let _e2111 = (_e2097.member_1.w * _e2106); + let _e2112 = (_e2097.member_1.w * _e2107); + let _e2132 = (vec4((1f - fma(_e2097.member_1.y, _e2106, _e2109)), fma(_e2097.member_1.x, _e2106, _e2112), fma(_e2097.member_1.x, _e2107, -(_e2111)), 0f) * _e2097.member_2.x); + let _e2134 = (vec4(fma(_e2097.member_1.x, _e2106, -(_e2112)), (1f - fma(_e2097.member_1.x, _e2105, _e2109)), fma(_e2097.member_1.y, _e2107, _e2110), 0f) * _e2097.member_2.y); + let _e2136 = (vec4(fma(_e2097.member_1.x, _e2107, _e2111), fma(_e2097.member_1.y, _e2107, -(_e2110)), (1f - fma(_e2097.member_1.x, _e2105, (_e2097.member_1.y * _e2106))), 0f) * _e2097.member_2.z); + switch bitcast(_e2036.member) { + case 0: { + if (_e148 >= 8u) { + phi_8343_ = (_e2036.member_1 <= (_e148 - 8u)); } else { - phi_5840_ = (_e2434 * (1f / _e2441)); + phi_8343_ = false; } - let _e2446 = phi_5840_; - 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_5875_ = vec3(0f, 0f, 0f); + let _e3568 = phi_8343_; + if _e3568 { + let _e3571 = global_1.member[_e2036.member_1]; + let _e3576 = global_1.member[(_e2036.member_1 + 1u)]; + let _e3581 = global_1.member[(_e2036.member_1 + 2u)]; + let _e3587 = global_1.member[(_e2036.member_1 + 3u)]; + let _e3592 = global_1.member[(_e2036.member_1 + 4u)]; + let _e3597 = global_1.member[(_e2036.member_1 + 5u)]; + let _e3602 = global_1.member[(_e2036.member_1 + 6u)]; + let _e3608 = global_1.member[(_e2036.member_1 + 7u)]; + phi_2572_ = type_36(vec3(bitcast(_e3571), bitcast(_e3576), bitcast(_e3581)), vec4(bitcast(_e3587), bitcast(_e3592), bitcast(_e3597), bitcast(_e3602)), bitcast(_e3608)); } else { - phi_5875_ = (_e2463 * (1f / _e2470)); + phi_2572_ = type_36(vec3(0f, -1f, 0f), vec4(1f, 1f, 1f, 1f), 1f); } - let _e2475 = phi_5875_; - 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_2844_ = 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 _e2566 = phi_2844_; - phi_3164_ = _e2566; - phi_3165_ = select(true, false, _e2442); - break; - } - case 2: { - if (_e110 >= 13u) { - phi_5581_ = (_e1976.member_1 <= (_e110 - 13u)); - } else { - phi_5581_ = false; + let _e3612 = phi_2572_; + let _e3634 = fma(_e2136.x, _e3612.member.z, fma(_e2134.x, _e3612.member.y, (_e2132.x * _e3612.member.x))); + let _e3635 = fma(_e2136.y, _e3612.member.z, fma(_e2134.y, _e3612.member.y, (_e2132.y * _e3612.member.x))); + let _e3636 = fma(_e2136.z, _e3612.member.z, fma(_e2134.z, _e3612.member.y, (_e2132.z * _e3612.member.x))); + let _e3641 = sqrt(fma(_e3636, _e3636, fma(_e3634, _e3634, (_e3635 * _e3635)))); + if (_e3641 == 0f) { + phi_8390_ = vec3(0f, 0f, 0f); + } else { + phi_8390_ = (vec3(_e3634, _e3635, _e3636) * (1f / _e3641)); + } + let _e3646 = phi_8390_; + let _e3648 = -(_e3646.x); + let _e3650 = -(_e3646.y); + let _e3652 = -(_e3646.z); + let _e3653 = -(_e3646); + let _e3655 = fma(-(_e710.z), _e319.member_3, 1f); + let _e3659 = fma(0.4f, _e3655, (_e1394 * _e1406)); + let _e3660 = fma(0.4f, _e3655, (_e1396 * _e1406)); + let _e3661 = fma(0.4f, _e3655, (_e1398 * _e1406)); + let _e3669 = (_e1962 + vec3(_e3648, _e3650, _e3652)); + let _e3676 = sqrt(fma(_e3669.z, _e3669.z, fma(_e3669.x, _e3669.x, (_e3669.y * _e3669.y)))); + if (_e3676 == 0f) { + phi_8425_ = vec3(0f, 0f, 0f); + } else { + phi_8425_ = (_e3669 * (1f / _e3676)); + } + let _e3681 = phi_8425_; + let _e3682 = (_e1403 * _e1403); + let _e3693 = max(fma(_e1958.z, _e3681.z, fma(_e1958.x, _e3681.x, (_e1958.y * _e3681.y))), 0f); + let _e3706 = max(fma(_e1958.z, _e1962.z, fma(_e1958.x, _e1962.x, (_e1958.y * _e1962.y))), 0f); + let _e3712 = fma(_e1958.z, _e3653.z, fma(_e1958.x, _e3653.x, (_e1958.y * _e3653.y))); + let _e3713 = max(_e3712, 0f); + let _e3714 = fma(_e710.y, _e319.member_4, 1f); + let _e3715 = (_e3714 * _e3714); + let _e3716 = (_e3715 * 0.125f); + let _e3718 = fma(-(_e3715), 0.125f, 1f); + let _e3731 = (1f - max(fma(_e3681.z, _e1962.z, fma(_e3681.x, _e1962.x, (_e3681.y * _e1962.y))), 0f)); + let _e3733 = select(_e3731, 0f, (_e3731 < 0f)); + let _e3736 = pow(select(_e3733, 1f, (_e3733 > 1f)), 5f); + let _e3737 = fma((1f - _e3659), _e3736, _e3659); + let _e3738 = fma((1f - _e3660), _e3736, _e3660); + let _e3739 = fma((1f - _e3661), _e3736, _e3661); + let _e3746 = (((_e3682 * _e3682) / (pow(fma((_e3693 * _e3693), fma(_e3682, _e3682, -1f), 1f), 2f) * 3.1415927f)) * ((_e3706 / fma(_e3706, _e3718, _e3716)) * (_e3713 / fma(_e3713, _e3718, _e3716)))); + let _e3753 = max(fma(_e1958.z, _e3652, fma(_e1958.x, _e3648, (_e1958.y * _e3650))), 0f); + let _e3755 = fma((4f * _e3706), _e3753, 0.0001f); + if ((_e2036.member_3 == 4294967295u) != true) { + let _e3777 = global_1.member[_e2036.member_3]; + let _e3781 = global_1.member[(_e2036.member_3 + 1u)]; + let _e3785 = global_1.member[(_e2036.member_3 + 4u)]; + let _e3789 = global_1.member[(_e2036.member_3 + 5u)]; + let _e3793 = global_1.member[(_e2036.member_3 + 6u)]; + let _e3798 = global_1.member[(_e2036.member_3 + 7u)]; + let _e3803 = global_1.member[(_e2036.member_3 + 8u)]; + let _e3806 = global_1.member[_e1971]; + let _e3810 = global_1.member[(_e1971 + 1u)]; + let _e3812 = select(_e3777, 4294967295u, (0u >= _e3781)); + let _e3815 = global_1.member[_e3812]; + let _e3820 = global_1.member[(_e3812 + 1u)]; + let _e3825 = global_1.member[(_e3812 + 2u)]; + let _e3830 = global_1.member[(_e3812 + 3u)]; + let _e3835 = global_1.member[(_e3812 + 4u)]; + let _e3840 = global_1.member[(_e3812 + 5u)]; + let _e3845 = global_1.member[(_e3812 + 6u)]; + let _e3850 = global_1.member[(_e3812 + 7u)]; + let _e3855 = global_1.member[(_e3812 + 8u)]; + let _e3860 = global_1.member[(_e3812 + 9u)]; + let _e3865 = global_1.member[(_e3812 + 10u)]; + let _e3870 = global_1.member[(_e3812 + 11u)]; + let _e3875 = global_1.member[(_e3812 + 12u)]; + let _e3880 = global_1.member[(_e3812 + 13u)]; + let _e3885 = global_1.member[(_e3812 + 14u)]; + let _e3890 = global_1.member[(_e3812 + 15u)]; + let _e3910 = (bitcast(_e3890) + fma(bitcast(_e3870), _e156.z, fma(bitcast(_e3850), _e156.y, (bitcast(_e3830) * _e156.x)))); + let _e3911 = ((bitcast(_e3875) + fma(bitcast(_e3855), _e156.z, fma(bitcast(_e3835), _e156.y, (bitcast(_e3815) * _e156.x)))) / _e3910); + let _e3912 = ((bitcast(_e3880) + fma(bitcast(_e3860), _e156.z, fma(bitcast(_e3840), _e156.y, (bitcast(_e3820) * _e156.x)))) / _e3910); + let _e3913 = ((bitcast(_e3885) + fma(bitcast(_e3865), _e156.z, fma(bitcast(_e3845), _e156.y, (bitcast(_e3825) * _e156.x)))) / _e3910); + if (abs(_e3911) <= 1f) { + let _e3917 = (abs(_e3912) <= 1f); + if _e3917 { + phi_8530_ = (abs(_e3913) <= 1f); + } else { + phi_8530_ = bool(); + } + let _e3921 = phi_8530_; + phi_8533_ = _e3921; + phi_8534_ = select(true, false, _e3917); + } else { + phi_8533_ = bool(); + phi_8534_ = true; + } + let _e3924 = phi_8533_; + let _e3926 = phi_8534_; + if select(_e3924, false, _e3926) { + let _e3934 = global_1.member[select(_e3785, 4294967295u, (0u >= _e3789))]; + let _e3937 = global_1.member[_e3934]; + let _e3941 = global_1.member[(_e3934 + 1u)]; + let _e3945 = global_1.member[(_e3934 + 2u)]; + let _e3949 = global_1.member[(_e3934 + 3u)]; + let _e3953 = global_1.member[(_e3934 + 4u)]; + let _e3957 = global_1.member[(_e3934 + 6u)]; + switch bitcast(_e3957) { + case 0: { + phi_2973_ = 0u; + break; + } + case 1: { + phi_2973_ = 1u; + break; + } + case 2: { + phi_2973_ = 2u; + break; + } + default: { + phi_2973_ = 0u; + break; + } + } + let _e3960 = phi_2973_; + let _e3964 = global_1.member[(_e3934 + 7u)]; + switch bitcast(_e3964) { + case 0: { + phi_2982_ = 0u; + break; + } + case 1: { + phi_2982_ = 1u; + break; + } + case 2: { + phi_2982_ = 2u; + break; + } + default: { + phi_2982_ = 0u; + break; + } + } + let _e3967 = phi_2982_; + let _e3968 = bitcast(_e3803); + let _e3970 = f32(_e3945); + let _e3971 = f32(_e3949); + let _e3975 = type_37((_e3968 / -2i), (_e3968 / 2i), false); + phi_9009_ = _e1974; + phi_3010_ = _e3975; + phi_3013_ = 0f; + phi_3015_ = 0f; + loop { + let _e3977 = phi_9009_; + let _e3979 = phi_3010_; + let _e3981 = phi_3013_; + let _e3983 = phi_3015_; + local_6 = _e3981; + local_7 = _e3983; + if _e3979.member_2 { + phi_3027_ = true; + } else { + phi_3027_ = ((_e3979.member <= _e3979.member_1) != true); + } + let _e3990 = phi_3027_; + if _e3990 { + phi_3011_ = _e3979; + phi_3070_ = type_38(0u, type_38().member_1); + } else { + if (_e3979.member < _e3979.member_1) { + let _e3998 = (_e3979.member + 1i); + if select(false, true, ((false == (_e3998 > _e3979.member)) != false)) { + phi_3055_ = type_38(0u, type_38().member_1); + } else { + phi_3055_ = type_38(1u, _e3998); + } + let _e4008 = phi_3055_; + switch bitcast(_e4008.member) { + case 0: { + phi_9054_ = true; + break; + } + case 1: { + break; + } + default: { + break; + } + } + phi_3067_ = type_37(_e4008.member_1, _e3979.member_1, _e3979.member_2); + } else { + phi_3067_ = type_37(_e3979.member, _e3979.member_1, true); + } + let _e4017 = phi_3067_; + phi_3011_ = _e4017; + phi_3070_ = type_38(1u, _e3979.member); + } + let _e4023 = phi_3011_; + let _e4025 = phi_3070_; + switch bitcast(_e4025.member) { + case 0: { + phi_9055_ = _e3977; + phi_3014_ = f32(); + phi_3016_ = f32(); + phi_3328_ = false; + break; + } + case 1: { + phi_3081_ = _e3975; + phi_3084_ = _e3981; + phi_3086_ = _e3983; + loop { + let _e4030 = phi_3081_; + let _e4032 = phi_3084_; + let _e4034 = phi_3086_; + local_13 = _e4032; + local_14 = _e4034; + if _e4030.member_2 { + phi_3098_ = true; + } else { + phi_3098_ = ((_e4030.member <= _e4030.member_1) != true); + } + let _e4041 = phi_3098_; + if _e4041 { + phi_3082_ = _e4030; + phi_3141_ = type_38(0u, type_38().member_1); + } else { + if (_e4030.member < _e4030.member_1) { + let _e4049 = (_e4030.member + 1i); + if select(false, true, ((false == (_e4049 > _e4030.member)) != false)) { + phi_3126_ = type_38(0u, type_38().member_1); + } else { + phi_3126_ = type_38(1u, _e4049); + } + let _e4059 = phi_3126_; + switch bitcast(_e4059.member) { + case 0: { + phi_8993_ = true; + break; + } + case 1: { + break; + } + default: { + break; + } + } + phi_3138_ = type_37(_e4059.member_1, _e4030.member_1, _e4030.member_2); + } else { + phi_3138_ = type_37(_e4030.member, _e4030.member_1, true); + } + let _e4068 = phi_3138_; + phi_3082_ = _e4068; + phi_3141_ = type_38(1u, _e4030.member); + } + let _e4074 = phi_3082_; + let _e4076 = phi_3141_; + switch bitcast(_e4076.member) { + case 0: { + phi_3085_ = f32(); + phi_3087_ = f32(); + phi_3327_ = false; + break; + } + case 1: { + let _e4084 = fma((_e3911 + 1f), 0.5f, (f32(_e4025.member_1) * (1f / _e3970))); + let _e4085 = fma(fma(_e3912, -1f, 1f), 0.5f, (f32(_e4076.member_1) * (1f / _e3971))); + switch bitcast(_e3960) { + case 1: { + let _e4120 = abs(_e4084); + let _e4122 = (_e4120 % 1f); + if (_e4120 >= 1f) { + phi_8586_ = select(true, false, (_e4122 == 0f)); + } else { + phi_8586_ = true; + } + let _e4126 = phi_8586_; + let _e4127 = select(1f, _e4122, _e4126); + if (select(-1f, 1f, (_e4084 >= 0f)) > 0f) { + phi_3173_ = _e4127; + } else { + phi_3173_ = (1f - _e4127); + } + let _e4131 = phi_3173_; + phi_3210_ = _e4131; + break; + } + case 2: { + let _e4094 = abs(_e4084); + let _e4101 = ((select(select(u32(_e4094), 0u, (_e4094 < 0f)), 4294967295u, (_e4094 > 4294967000f)) % 2u) == 0u); + let _e4103 = (_e4094 % 1f); + if (_e4094 >= 1f) { + phi_8569_ = select(true, false, (_e4103 == 0f)); + } else { + phi_8569_ = true; + } + let _e4107 = phi_8569_; + let _e4108 = select(1f, _e4103, _e4107); + if (select(-1f, 1f, (_e4084 >= 0f)) > 0f) { + if _e4101 { + phi_3202_ = _e4108; + } else { + phi_3202_ = (1f - _e4108); + } + let _e4115 = phi_3202_; + phi_3208_ = _e4115; + } else { + if _e4101 { + phi_3207_ = (1f - _e4108); + } else { + phi_3207_ = _e4108; + } + let _e4112 = phi_3207_; + phi_3208_ = _e4112; + } + let _e4117 = phi_3208_; + phi_3210_ = _e4117; + break; + } + case 0: { + if (_e4084 > 1f) { + phi_8556_ = 0.9999999f; + } else { + phi_8556_ = select(_e4084, 0.00000011920929f, (_e4084 < 0f)); + } + let _e4091 = phi_8556_; + phi_3210_ = _e4091; + break; + } + default: { + phi_3210_ = f32(); + break; + } + } + let _e4133 = phi_3210_; + switch bitcast(_e3967) { + case 1: { + let _e4168 = abs(_e4085); + let _e4170 = (_e4168 % 1f); + if (_e4168 >= 1f) { + phi_8634_ = select(true, false, (_e4170 == 0f)); + } else { + phi_8634_ = true; + } + let _e4174 = phi_8634_; + let _e4175 = select(1f, _e4170, _e4174); + if (select(-1f, 1f, (_e4085 >= 0f)) > 0f) { + phi_3229_ = _e4175; + } else { + phi_3229_ = (1f - _e4175); + } + let _e4179 = phi_3229_; + phi_3266_ = _e4179; + break; + } + case 2: { + let _e4142 = abs(_e4085); + let _e4149 = ((select(select(u32(_e4142), 0u, (_e4142 < 0f)), 4294967295u, (_e4142 > 4294967000f)) % 2u) == 0u); + let _e4151 = (_e4142 % 1f); + if (_e4142 >= 1f) { + phi_8617_ = select(true, false, (_e4151 == 0f)); + } else { + phi_8617_ = true; + } + let _e4155 = phi_8617_; + let _e4156 = select(1f, _e4151, _e4155); + if (select(-1f, 1f, (_e4085 >= 0f)) > 0f) { + if _e4149 { + phi_3258_ = _e4156; + } else { + phi_3258_ = (1f - _e4156); + } + let _e4163 = phi_3258_; + phi_3264_ = _e4163; + } else { + if _e4149 { + phi_3263_ = (1f - _e4156); + } else { + phi_3263_ = _e4156; + } + let _e4160 = phi_3263_; + phi_3264_ = _e4160; + } + let _e4165 = phi_3264_; + phi_3266_ = _e4165; + break; + } + case 0: { + if (_e4085 > 1f) { + phi_8604_ = 0.9999999f; + } else { + phi_8604_ = select(_e4085, 0.00000011920929f, (_e4085 < 0f)); + } + let _e4139 = phi_8604_; + phi_3266_ = _e4139; + break; + } + default: { + phi_3266_ = f32(); + break; + } + } + let _e4181 = phi_3266_; + let _e4182 = (_e4133 * _e3970); + let _e4188 = (_e4181 * _e3971); + let _e4203 = vec3((f32((select(select(u32(_e4182), 0u, (_e4182 < 0f)), 4294967295u, (_e4182 > 4294967000f)) + _e3937)) / f32(_e3806)), (f32((select(select(u32(_e4188), 0u, (_e4188 < 0f)), 4294967295u, (_e4188 > 4294967000f)) + _e3941)) / f32(_e3810)), f32(_e3953)); + let _e4209 = textureSampleLevel(global_19, global_18, vec2(_e4203.x, _e4203.y), i32(_e4203.z), 0f); + if ((_e3913 - max((bitcast(_e3798) * (1f - _e3712)), bitcast(_e3793))) > _e4209.x) { + phi_3325_ = (_e4034 + 1f); + } else { + phi_3325_ = _e4034; + } + let _e4218 = phi_3325_; + phi_3085_ = (_e4032 + 1f); + phi_3087_ = _e4218; + phi_3327_ = true; + break; + } + default: { + phi_3085_ = f32(); + phi_3087_ = f32(); + phi_3327_ = bool(); + break; + } + } + let _e4221 = phi_3085_; + let _e4223 = phi_3087_; + let _e4225 = phi_3327_; + continue; + continuing { + phi_3081_ = _e4074; + phi_3084_ = _e4221; + phi_3086_ = _e4223; + phi_8993_ = _e3977; + break if !(_e4225); + } + } + let _e4228 = phi_8993_; + phi_9054_ = _e4228; + if _e4228 { + break; + } + phi_9055_ = _e4228; + let _e4681 = local_13; + phi_3014_ = _e4681; + let _e4684 = local_14; + phi_3016_ = _e4684; + phi_3328_ = true; + break; + } + default: { + phi_9055_ = _e3977; + phi_3014_ = f32(); + phi_3016_ = f32(); + phi_3328_ = bool(); + break; + } + } + let _e4230 = phi_9055_; + let _e4232 = phi_3014_; + let _e4234 = phi_3016_; + let _e4236 = phi_3328_; + continue; + continuing { + phi_9009_ = _e4230; + phi_3010_ = _e4023; + phi_3013_ = _e4232; + phi_3015_ = _e4234; + phi_9054_ = _e4230; + break if !(_e4236); + } + } + let _e4239 = phi_9054_; + phi_9056_ = _e4239; + if _e4239 { + break; + } + let _e4241 = local_6; + let _e4244 = local_7; + phi_9067_ = _e4239; + phi_3331_ = (_e4244 / max(_e4241, 1f)); + } else { + phi_9067_ = _e1974; + phi_3331_ = 0f; + } + let _e4247 = phi_9067_; + let _e4249 = phi_3331_; + phi_9066_ = _e4247; + phi_3332_ = _e4249; + } else { + phi_9066_ = _e1974; + phi_3332_ = 0f; + } + let _e4251 = phi_9066_; + let _e4253 = phi_3332_; + phi_9060_ = _e4251; + phi_4975_ = _e4253; + phi_4976_ = vec3(((fma((((1f - _e3737) * _e3655) * _e1394), 0.31830987f, ((_e3746 * _e3737) / _e3755)) * (_e3612.member_1.x * _e3612.member_2)) * _e3753), ((fma((((1f - _e3738) * _e3655) * _e1396), 0.31830987f, ((_e3746 * _e3738) / _e3755)) * (_e3612.member_1.y * _e3612.member_2)) * _e3753), ((fma((((1f - _e3739) * _e3655) * _e1398), 0.31830987f, ((_e3746 * _e3739) / _e3755)) * (_e3612.member_1.z * _e3612.member_2)) * _e3753)); + phi_4977_ = true; + break; } - let _e2087 = phi_5581_; - 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_2907_ = 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_2907_ = type_35(vec3(0f, 0f, 0f), vec3(0f, -1f, 0f), 1.0471976f, 1.5707964f, vec4(1f, 1f, 1f, 1f), 1f); + case 1: { + if (_e148 >= 8u) { + phi_7890_ = (_e2036.member_1 <= (_e148 - 8u)); + } else { + phi_7890_ = false; + } + let _e2922 = phi_7890_; + if _e2922 { + let _e2925 = global_1.member[_e2036.member_1]; + let _e2930 = global_1.member[(_e2036.member_1 + 1u)]; + let _e2935 = global_1.member[(_e2036.member_1 + 2u)]; + let _e2941 = global_1.member[(_e2036.member_1 + 3u)]; + let _e2946 = global_1.member[(_e2036.member_1 + 4u)]; + let _e2951 = global_1.member[(_e2036.member_1 + 5u)]; + let _e2956 = global_1.member[(_e2036.member_1 + 6u)]; + let _e2962 = global_1.member[(_e2036.member_1 + 7u)]; + phi_3373_ = type_36(vec3(bitcast(_e2925), bitcast(_e2930), bitcast(_e2935)), vec4(bitcast(_e2941), bitcast(_e2946), bitcast(_e2951), bitcast(_e2956)), bitcast(_e2962)); + } else { + phi_3373_ = type_36(vec3(0f, 0f, 0f), vec4(1f, 1f, 1f, 1f), 1f); + } + let _e2966 = phi_3373_; + let _e2991 = (_e2097.member.x + fma(_e2136.x, _e2966.member.z, fma(_e2134.x, _e2966.member.y, (_e2132.x * _e2966.member.x)))); + let _e2992 = (_e2097.member.y + fma(_e2136.y, _e2966.member.z, fma(_e2134.y, _e2966.member.y, (_e2132.y * _e2966.member.x)))); + let _e2993 = (_e2097.member.z + fma(_e2136.z, _e2966.member.z, fma(_e2134.z, _e2966.member.y, (_e2132.z * _e2966.member.x)))); + let _e2995 = (vec3(_e2991, _e2992, _e2993) - _e156); + let _e3002 = sqrt(fma(_e2995.z, _e2995.z, fma(_e2995.x, _e2995.x, (_e2995.y * _e2995.y)))); + let _e3003 = (_e3002 == 0f); + if _e3003 { + phi_9064_ = _e1974; + phi_4040_ = f32(); + phi_4041_ = vec3(); + } else { + if _e3003 { + phi_7937_ = vec3(0f, 0f, 0f); + } else { + phi_7937_ = (_e2995 * (1f / _e3002)); + } + let _e3007 = phi_7937_; + let _e3009 = (_e2966.member_2 / (_e3002 * _e3002)); + let _e3011 = fma(-(_e710.z), _e319.member_3, 1f); + let _e3015 = fma(0.4f, _e3011, (_e1394 * _e1406)); + let _e3016 = fma(0.4f, _e3011, (_e1396 * _e1406)); + let _e3017 = fma(0.4f, _e3011, (_e1398 * _e1406)); + let _e3024 = (_e1962 + _e3007); + let _e3031 = sqrt(fma(_e3024.z, _e3024.z, fma(_e3024.x, _e3024.x, (_e3024.y * _e3024.y)))); + if (_e3031 == 0f) { + phi_7972_ = vec3(0f, 0f, 0f); + } else { + phi_7972_ = (_e3024 * (1f / _e3031)); + } + let _e3036 = phi_7972_; + let _e3037 = (_e1403 * _e1403); + let _e3048 = max(fma(_e1958.z, _e3036.z, fma(_e1958.x, _e3036.x, (_e1958.y * _e3036.y))), 0f); + let _e3061 = max(fma(_e1958.z, _e1962.z, fma(_e1958.x, _e1962.x, (_e1958.y * _e1962.y))), 0f); + let _e3067 = fma(_e1958.z, _e3007.z, fma(_e1958.x, _e3007.x, (_e1958.y * _e3007.y))); + let _e3068 = max(_e3067, 0f); + let _e3069 = fma(_e710.y, _e319.member_4, 1f); + let _e3070 = (_e3069 * _e3069); + let _e3071 = (_e3070 * 0.125f); + let _e3073 = fma(-(_e3070), 0.125f, 1f); + let _e3086 = (1f - max(fma(_e3036.z, _e1962.z, fma(_e3036.x, _e1962.x, (_e3036.y * _e1962.y))), 0f)); + let _e3088 = select(_e3086, 0f, (_e3086 < 0f)); + let _e3091 = pow(select(_e3088, 1f, (_e3088 > 1f)), 5f); + let _e3092 = fma((1f - _e3015), _e3091, _e3015); + let _e3093 = fma((1f - _e3016), _e3091, _e3016); + let _e3094 = fma((1f - _e3017), _e3091, _e3017); + let _e3101 = (((_e3037 * _e3037) / (pow(fma((_e3048 * _e3048), fma(_e3037, _e3037, -1f), 1f), 2f) * 3.1415927f)) * ((_e3061 / fma(_e3061, _e3073, _e3071)) * (_e3068 / fma(_e3068, _e3073, _e3071)))); + let _e3106 = fma((4f * _e3061), _e3068, 0.0001f); + if ((_e2036.member_3 == 4294967295u) != true) { + let _e3128 = global_1.member[_e2036.member_3]; + let _e3132 = global_1.member[(_e2036.member_3 + 1u)]; + let _e3136 = global_1.member[(_e2036.member_3 + 3u)]; + let _e3141 = global_1.member[(_e2036.member_3 + 4u)]; + let _e3145 = global_1.member[(_e2036.member_3 + 5u)]; + let _e3149 = global_1.member[(_e2036.member_3 + 6u)]; + let _e3154 = global_1.member[(_e2036.member_3 + 7u)]; + let _e3159 = global_1.member[(_e2036.member_3 + 8u)]; + let _e3162 = global_1.member[_e1971]; + let _e3166 = global_1.member[(_e1971 + 1u)]; + let _e3168 = (_e156.x - _e2991); + let _e3170 = (_e156.y - _e2992); + let _e3172 = (_e156.z - _e2993); + let _e3175 = min(max(f32(_e3159), 1f), 21f); + let _e3187 = ((1f + (sqrt(fma(_e3172, _e3172, fma(_e3168, _e3168, (_e3170 * _e3170)))) / bitcast(_e3136))) * 0.04f); + phi_3652_ = type_14(0u, select(select(u32(_e3175), 0u, (_e3175 < 0f)), 4294967295u, (_e3175 > 4294967000f))); + phi_3655_ = 0f; + loop { + let _e3190 = phi_3652_; + let _e3192 = phi_3655_; + local_5 = _e3192; + if (_e3190.member < _e3190.member_1) { + phi_3653_ = type_14((_e3190.member + 1u), _e3190.member_1); + phi_3678_ = type_14(1u, _e3190.member); + } else { + phi_3653_ = _e3190; + phi_3678_ = type_14(0u, type_14().member_1); + } + let _e3205 = phi_3653_; + let _e3207 = phi_3678_; + switch bitcast(_e3207.member) { + case 0: { + phi_3656_ = f32(); + phi_4037_ = false; + break; + } + case 1: { + local = array, 21>(vec3(0f, 0f, 0f), vec3(1f, 1f, 1f), vec3(1f, -1f, 1f), vec3(-1f, -1f, 1f), vec3(-1f, 1f, 1f), vec3(1f, 1f, -1f), vec3(1f, -1f, -1f), vec3(-1f, -1f, -1f), vec3(-1f, 1f, -1f), vec3(1f, 1f, 0f), vec3(1f, -1f, 0f), vec3(-1f, -1f, 0f), vec3(-1f, 1f, 0f), vec3(1f, 0f, 1f), vec3(-1f, 0f, 1f), vec3(1f, 0f, -1f), vec3(-1f, 0f, -1f), vec3(0f, 1f, 1f), vec3(0f, -1f, 1f), vec3(0f, -1f, -1f), vec3(0f, 1f, -1f)); + if (_e3207.member_1 < 21u) { + } else { + phi_8937_ = true; + break; + } + let _e3213 = local[_e3207.member_1]; + let _e3217 = fma(_e3213.x, _e3187, _e3168); + let _e3218 = fma(_e3213.y, _e3187, _e3170); + let _e3219 = fma(_e3213.z, _e3187, _e3172); + let _e3224 = sqrt(fma(_e3219, _e3219, fma(_e3217, _e3217, (_e3218 * _e3218)))); + if (_e3224 == 0f) { + phi_8093_ = vec3(0f, 0f, 0f); + } else { + phi_8093_ = (vec3(_e3217, _e3218, _e3219) * (1f / _e3224)); + } + let _e3229 = phi_8093_; + let _e3231 = abs(_e3229.x); + let _e3233 = abs(_e3229.y); + let _e3235 = abs(_e3229.z); + if (_e3231 >= _e3233) { + let _e3237 = (_e3231 >= _e3235); + if _e3237 { + let _e3238 = (_e3229.x > 0f); + if _e3238 { + phi_8127_ = vec2((-(_e3229.z) / _e3231), (-(_e3229.y) / _e3231)); + } else { + phi_8127_ = vec2((_e3229.z / _e3231), (-(_e3229.y) / _e3231)); + } + let _e3249 = phi_8127_; + phi_8130_ = _e3249; + phi_8131_ = select(1u, 0u, _e3238); + } else { + phi_8130_ = vec2(); + phi_8131_ = u32(); + } + let _e3252 = phi_8130_; + let _e3254 = phi_8131_; + phi_8134_ = _e3252; + phi_8135_ = _e3254; + phi_8136_ = select(true, false, _e3237); + } else { + phi_8134_ = vec2(); + phi_8135_ = u32(); + phi_8136_ = true; + } + let _e3257 = phi_8134_; + let _e3259 = phi_8135_; + let _e3261 = phi_8136_; + if _e3261 { + if (_e3233 >= _e3231) { + let _e3263 = (_e3233 >= _e3235); + if _e3263 { + let _e3264 = (_e3229.y > 0f); + if _e3264 { + phi_8161_ = vec2((_e3229.x / _e3233), (_e3229.z / _e3233)); + } else { + phi_8161_ = vec2((_e3229.x / _e3233), (-(_e3229.z) / _e3233)); + } + let _e3273 = phi_8161_; + phi_8164_ = _e3273; + phi_8165_ = select(3u, 2u, _e3264); + } else { + phi_8164_ = vec2(); + phi_8165_ = u32(); + } + let _e3276 = phi_8164_; + let _e3278 = phi_8165_; + phi_8168_ = _e3276; + phi_8169_ = _e3278; + phi_8170_ = select(true, false, _e3263); + } else { + phi_8168_ = vec2(); + phi_8169_ = u32(); + phi_8170_ = true; + } + let _e3281 = phi_8168_; + let _e3283 = phi_8169_; + let _e3285 = phi_8170_; + if _e3285 { + let _e3286 = (_e3229.z > 0f); + if _e3286 { + phi_8191_ = vec2((_e3229.x / _e3235), (-(_e3229.y) / _e3235)); + } else { + phi_8191_ = vec2((-(_e3229.x) / _e3235), (-(_e3229.y) / _e3235)); + } + let _e3297 = phi_8191_; + phi_8194_ = _e3297; + phi_8195_ = select(5u, 4u, _e3286); + } else { + phi_8194_ = _e3281; + phi_8195_ = _e3283; + } + let _e3300 = phi_8194_; + let _e3302 = phi_8195_; + phi_8197_ = _e3300; + phi_8198_ = _e3302; + } else { + phi_8197_ = _e3257; + phi_8198_ = _e3259; + } + let _e3304 = phi_8197_; + let _e3306 = phi_8198_; + let _e3311 = ((_e3304.x + 1f) * 0.5f); + let _e3312 = ((_e3304.y + 1f) * 0.5f); + if (_e3306 >= _e3132) { + phi_3715_ = 4294967295u; + } else { + phi_3715_ = (_e3128 + (16u * _e3306)); + } + let _e3317 = phi_3715_; + let _e3321 = global_1.member[(_e3317 + 2u)]; + let _e3326 = global_1.member[(_e3317 + 3u)]; + let _e3331 = global_1.member[(_e3317 + 6u)]; + let _e3336 = global_1.member[(_e3317 + 7u)]; + let _e3341 = global_1.member[(_e3317 + 10u)]; + let _e3346 = global_1.member[(_e3317 + 11u)]; + let _e3351 = global_1.member[(_e3317 + 14u)]; + let _e3356 = global_1.member[(_e3317 + 15u)]; + if (_e3306 >= _e3145) { + phi_3816_ = 4294967295u; + } else { + phi_3816_ = (_e3141 + _e3306); + } + let _e3370 = phi_3816_; + let _e3373 = global_1.member[_e3370]; + let _e3376 = global_1.member[_e3373]; + let _e3380 = global_1.member[(_e3373 + 1u)]; + let _e3384 = global_1.member[(_e3373 + 2u)]; + let _e3388 = global_1.member[(_e3373 + 3u)]; + let _e3392 = global_1.member[(_e3373 + 4u)]; + let _e3396 = global_1.member[(_e3373 + 6u)]; + switch bitcast(_e3396) { + case 0: { + phi_3847_ = 0u; + break; + } + case 1: { + phi_3847_ = 1u; + break; + } + case 2: { + phi_3847_ = 2u; + break; + } + default: { + phi_3847_ = 0u; + break; + } + } + let _e3399 = phi_3847_; + let _e3403 = global_1.member[(_e3373 + 7u)]; + switch bitcast(_e3403) { + case 0: { + phi_3856_ = 0u; + break; + } + case 1: { + phi_3856_ = 1u; + break; + } + case 2: { + phi_3856_ = 2u; + break; + } + default: { + phi_3856_ = 0u; + break; + } + } + let _e3406 = phi_3856_; + switch bitcast(_e3399) { + case 1: { + let _e3441 = abs(_e3311); + let _e3443 = (_e3441 % 1f); + if (_e3441 >= 1f) { + phi_8258_ = select(true, false, (_e3443 == 0f)); + } else { + phi_8258_ = true; + } + let _e3447 = phi_8258_; + let _e3448 = select(1f, _e3443, _e3447); + if (select(-1f, 1f, (_e3311 >= 0f)) > 0f) { + phi_3882_ = _e3448; + } else { + phi_3882_ = (1f - _e3448); + } + let _e3452 = phi_3882_; + phi_3919_ = _e3452; + break; + } + case 2: { + let _e3415 = abs(_e3311); + let _e3422 = ((select(select(u32(_e3415), 0u, (_e3415 < 0f)), 4294967295u, (_e3415 > 4294967000f)) % 2u) == 0u); + let _e3424 = (_e3415 % 1f); + if (_e3415 >= 1f) { + phi_8241_ = select(true, false, (_e3424 == 0f)); + } else { + phi_8241_ = true; + } + let _e3428 = phi_8241_; + let _e3429 = select(1f, _e3424, _e3428); + if (select(-1f, 1f, (_e3311 >= 0f)) > 0f) { + if _e3422 { + phi_3911_ = _e3429; + } else { + phi_3911_ = (1f - _e3429); + } + let _e3436 = phi_3911_; + phi_3917_ = _e3436; + } else { + if _e3422 { + phi_3916_ = (1f - _e3429); + } else { + phi_3916_ = _e3429; + } + let _e3433 = phi_3916_; + phi_3917_ = _e3433; + } + let _e3438 = phi_3917_; + phi_3919_ = _e3438; + break; + } + case 0: { + if (_e3311 > 1f) { + phi_8228_ = 0.9999999f; + } else { + phi_8228_ = select(_e3311, 0.00000011920929f, (_e3311 < 0f)); + } + let _e3412 = phi_8228_; + phi_3919_ = _e3412; + break; + } + default: { + phi_3919_ = f32(); + break; + } + } + let _e3454 = phi_3919_; + switch bitcast(_e3406) { + case 1: { + let _e3489 = abs(_e3312); + let _e3491 = (_e3489 % 1f); + if (_e3489 >= 1f) { + phi_8306_ = select(true, false, (_e3491 == 0f)); + } else { + phi_8306_ = true; + } + let _e3495 = phi_8306_; + let _e3496 = select(1f, _e3491, _e3495); + if (select(-1f, 1f, (_e3312 >= 0f)) > 0f) { + phi_3940_ = _e3496; + } else { + phi_3940_ = (1f - _e3496); + } + let _e3500 = phi_3940_; + phi_3977_ = _e3500; + break; + } + case 2: { + let _e3463 = abs(_e3312); + let _e3470 = ((select(select(u32(_e3463), 0u, (_e3463 < 0f)), 4294967295u, (_e3463 > 4294967000f)) % 2u) == 0u); + let _e3472 = (_e3463 % 1f); + if (_e3463 >= 1f) { + phi_8289_ = select(true, false, (_e3472 == 0f)); + } else { + phi_8289_ = true; + } + let _e3476 = phi_8289_; + let _e3477 = select(1f, _e3472, _e3476); + if (select(-1f, 1f, (_e3312 >= 0f)) > 0f) { + if _e3470 { + phi_3969_ = _e3477; + } else { + phi_3969_ = (1f - _e3477); + } + let _e3484 = phi_3969_; + phi_3975_ = _e3484; + } else { + if _e3470 { + phi_3974_ = (1f - _e3477); + } else { + phi_3974_ = _e3477; + } + let _e3481 = phi_3974_; + phi_3975_ = _e3481; + } + let _e3486 = phi_3975_; + phi_3977_ = _e3486; + break; + } + case 0: { + if (_e3312 > 1f) { + phi_8276_ = 0.9999999f; + } else { + phi_8276_ = select(_e3312, 0.00000011920929f, (_e3312 < 0f)); + } + let _e3460 = phi_8276_; + phi_3977_ = _e3460; + break; + } + default: { + phi_3977_ = f32(); + break; + } + } + let _e3502 = phi_3977_; + let _e3504 = (_e3454 * f32(_e3384)); + let _e3511 = (_e3502 * f32(_e3388)); + let _e3526 = vec3((f32((select(select(u32(_e3504), 0u, (_e3504 < 0f)), 4294967295u, (_e3504 > 4294967000f)) + _e3376)) / f32(_e3162)), (f32((select(select(u32(_e3511), 0u, (_e3511 < 0f)), 4294967295u, (_e3511 > 4294967000f)) + _e3380)) / f32(_e3166)), f32(_e3392)); + let _e3532 = textureSampleLevel(global_19, global_18, vec2(_e3526.x, _e3526.y), i32(_e3526.z), 0f); + if ((((bitcast(_e3351) + fma(bitcast(_e3341), _e156.z, fma(bitcast(_e3331), _e156.y, (bitcast(_e3321) * _e156.x)))) / (bitcast(_e3356) + fma(bitcast(_e3346), _e156.z, fma(bitcast(_e3336), _e156.y, (bitcast(_e3326) * _e156.x))))) - max((bitcast(_e3154) * (1f - _e3067)), bitcast(_e3149))) > _e3532.x) { + phi_4036_ = (_e3192 + 1f); + } else { + phi_4036_ = _e3192; + } + let _e3541 = phi_4036_; + phi_3656_ = _e3541; + phi_4037_ = true; + break; + } + default: { + phi_3656_ = f32(); + phi_4037_ = bool(); + break; + } + } + let _e3543 = phi_3656_; + let _e3545 = phi_4037_; + continue; + continuing { + phi_3652_ = _e3205; + phi_3655_ = _e3543; + phi_8937_ = _e1974; + break if !(_e3545); + } + } + let _e3548 = phi_8937_; + phi_9056_ = _e3548; + if _e3548 { + break; + } + let _e3550 = local_5; + phi_9065_ = _e3548; + phi_4039_ = (_e3550 / _e3175); + } else { + phi_9065_ = _e1974; + phi_4039_ = 0f; + } + let _e3553 = phi_9065_; + let _e3555 = phi_4039_; + phi_9064_ = _e3553; + phi_4040_ = _e3555; + phi_4041_ = vec3(((fma((((1f - _e3092) * _e3011) * _e1394), 0.31830987f, ((_e3101 * _e3092) / _e3106)) * (_e2966.member_1.x * _e3009)) * _e3068), ((fma((((1f - _e3093) * _e3011) * _e1396), 0.31830987f, ((_e3101 * _e3093) / _e3106)) * (_e2966.member_1.y * _e3009)) * _e3068), ((fma((((1f - _e3094) * _e3011) * _e1398), 0.31830987f, ((_e3101 * _e3094) / _e3106)) * (_e2966.member_1.z * _e3009)) * _e3068)); + } + let _e3557 = phi_9064_; + let _e3559 = phi_4040_; + let _e3561 = phi_4041_; + phi_9060_ = _e3557; + phi_4975_ = _e3559; + phi_4976_ = _e3561; + phi_4977_ = select(true, false, _e3003); + break; } - let _e2157 = phi_2907_; - 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_3162_ = vec3(); - } else { - if _e2197 { - phi_5631_ = vec3(0f, 0f, 0f); + case 2: { + if (_e148 >= 13u) { + phi_7524_ = (_e2036.member_1 <= (_e148 - 13u)); + } else { + phi_7524_ = false; + } + let _e2147 = phi_7524_; + if _e2147 { + let _e2150 = global_1.member[_e2036.member_1]; + let _e2155 = global_1.member[(_e2036.member_1 + 1u)]; + let _e2160 = global_1.member[(_e2036.member_1 + 2u)]; + let _e2166 = global_1.member[(_e2036.member_1 + 3u)]; + let _e2171 = global_1.member[(_e2036.member_1 + 4u)]; + let _e2176 = global_1.member[(_e2036.member_1 + 5u)]; + let _e2182 = global_1.member[(_e2036.member_1 + 6u)]; + let _e2187 = global_1.member[(_e2036.member_1 + 7u)]; + let _e2192 = global_1.member[(_e2036.member_1 + 8u)]; + let _e2197 = global_1.member[(_e2036.member_1 + 9u)]; + let _e2202 = global_1.member[(_e2036.member_1 + 10u)]; + let _e2207 = global_1.member[(_e2036.member_1 + 11u)]; + let _e2213 = global_1.member[(_e2036.member_1 + 12u)]; + phi_4104_ = type_39(vec3(bitcast(_e2150), bitcast(_e2155), bitcast(_e2160)), vec3(bitcast(_e2166), bitcast(_e2171), bitcast(_e2176)), bitcast(_e2182), bitcast(_e2187), vec4(bitcast(_e2192), bitcast(_e2197), bitcast(_e2202), bitcast(_e2207)), bitcast(_e2213)); } else { - phi_5631_ = (_e2189 * (1f / _e2196)); + phi_4104_ = type_39(vec3(0f, 0f, 0f), vec3(0f, -1f, 0f), 1.0471976f, 1.5707964f, vec4(1f, 1f, 1f, 1f), 1f); } - let _e2201 = phi_5631_; - 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_5666_ = vec3(0f, 0f, 0f); + let _e2217 = phi_4104_; + let _e2243 = vec3((_e2097.member.x + fma(_e2136.x, _e2217.member.z, fma(_e2134.x, _e2217.member.y, (_e2132.x * _e2217.member.x)))), (_e2097.member.y + fma(_e2136.y, _e2217.member.z, fma(_e2134.y, _e2217.member.y, (_e2132.y * _e2217.member.x)))), (_e2097.member.z + fma(_e2136.z, _e2217.member.z, fma(_e2134.z, _e2217.member.y, (_e2132.z * _e2217.member.x))))); + let _e2244 = (_e2243 - _e156); + let _e2251 = sqrt(fma(_e2244.z, _e2244.z, fma(_e2244.x, _e2244.x, (_e2244.y * _e2244.y)))); + let _e2252 = (_e2251 == 0f); + if _e2252 { + phi_4240_ = type_40(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), 0f, 0f, 0f, 0f, 0f, 0f, 0f, false, false); } else { - phi_5666_ = (vec3(_e2211, _e2212, _e2213) * (1f / _e2218)); + if _e2252 { + phi_7574_ = vec3(0f, 0f, 0f); + } else { + phi_7574_ = (_e2244 * (1f / _e2251)); + } + let _e2256 = phi_7574_; + let _e2267 = fma(_e2136.x, _e2217.member_1.z, fma(_e2134.x, _e2217.member_1.y, (_e2132.x * _e2217.member_1.x))); + let _e2268 = fma(_e2136.y, _e2217.member_1.z, fma(_e2134.y, _e2217.member_1.y, (_e2132.y * _e2217.member_1.x))); + let _e2269 = fma(_e2136.z, _e2217.member_1.z, fma(_e2134.z, _e2217.member_1.y, (_e2132.z * _e2217.member_1.x))); + let _e2274 = sqrt(fma(_e2269, _e2269, fma(_e2267, _e2267, (_e2268 * _e2268)))); + if (_e2274 == 0f) { + phi_7609_ = vec3(0f, 0f, 0f); + } else { + phi_7609_ = (vec3(_e2267, _e2268, _e2269) * (1f / _e2274)); + } + let _e2279 = phi_7609_; + let _e2281 = cos(_e2217.member_2); + let _e2283 = cos(_e2217.member_3); + let _e2284 = (_e2281 - _e2283); + let _e2296 = fma(_e2256.z, -(_e2279.z), fma(_e2256.x, -(_e2279.x), (_e2256.y * -(_e2279.y)))); + let _e2300 = ((_e2296 - _e2283) / _e2284); + let _e2302 = select(_e2300, 0f, (_e2300 < 0f)); + phi_4240_ = type_40(_e2243, _e156, _e2256, _e2279, _e2251, _e2281, _e2283, _e2284, _e2296, _e2300, select(_e2302, 1f, (_e2302 > 1f)), (_e2296 > _e2281), (_e2296 > _e2283)); } - let _e2223 = phi_5666_; - 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_5701_ = vec3(0f, 0f, 0f); + let _e2307 = phi_4240_; + let _e2309 = (_e2307.member_4 == 0f); + if _e2309 { + phi_9061_ = _e1974; + phi_4972_ = f32(); + phi_4973_ = vec3(); } else { - phi_5701_ = (_e2255 * (1f / _e2262)); + let _e2312 = (_e2217.member_5 * _e2307.member_10); + let _e2316 = fma(-(_e710.z), _e319.member_3, 1f); + let _e2320 = fma(0.4f, _e2316, (_e1394 * _e1406)); + let _e2321 = fma(0.4f, _e2316, (_e1396 * _e1406)); + let _e2322 = fma(0.4f, _e2316, (_e1398 * _e1406)); + let _e2329 = (_e1962 + _e2307.member_2); + let _e2336 = sqrt(fma(_e2329.z, _e2329.z, fma(_e2329.x, _e2329.x, (_e2329.y * _e2329.y)))); + if (_e2336 == 0f) { + phi_7644_ = vec3(0f, 0f, 0f); + } else { + phi_7644_ = (_e2329 * (1f / _e2336)); + } + let _e2341 = phi_7644_; + let _e2342 = (_e1403 * _e1403); + let _e2353 = max(fma(_e1958.z, _e2341.z, fma(_e1958.x, _e2341.x, (_e1958.y * _e2341.y))), 0f); + let _e2366 = max(fma(_e1958.z, _e1962.z, fma(_e1958.x, _e1962.x, (_e1958.y * _e1962.y))), 0f); + let _e2372 = fma(_e1958.z, _e2307.member_2.z, fma(_e1958.x, _e2307.member_2.x, (_e1958.y * _e2307.member_2.y))); + let _e2373 = max(_e2372, 0f); + let _e2374 = fma(_e710.y, _e319.member_4, 1f); + let _e2375 = (_e2374 * _e2374); + let _e2376 = (_e2375 * 0.125f); + let _e2378 = fma(-(_e2375), 0.125f, 1f); + let _e2391 = (1f - max(fma(_e2341.z, _e1962.z, fma(_e2341.x, _e1962.x, (_e2341.y * _e1962.y))), 0f)); + let _e2393 = select(_e2391, 0f, (_e2391 < 0f)); + let _e2396 = pow(select(_e2393, 1f, (_e2393 > 1f)), 5f); + let _e2397 = fma((1f - _e2320), _e2396, _e2320); + let _e2398 = fma((1f - _e2321), _e2396, _e2321); + let _e2399 = fma((1f - _e2322), _e2396, _e2322); + let _e2406 = (((_e2342 * _e2342) / (pow(fma((_e2353 * _e2353), fma(_e2342, _e2342, -1f), 1f), 2f) * 3.1415927f)) * ((_e2366 / fma(_e2366, _e2378, _e2376)) * (_e2373 / fma(_e2373, _e2378, _e2376)))); + let _e2411 = fma((4f * _e2366), _e2373, 0.0001f); + if ((_e2036.member_3 == 4294967295u) != true) { + let _e2433 = global_1.member[_e2036.member_3]; + let _e2437 = global_1.member[(_e2036.member_3 + 1u)]; + let _e2441 = global_1.member[(_e2036.member_3 + 4u)]; + let _e2445 = global_1.member[(_e2036.member_3 + 5u)]; + let _e2449 = global_1.member[(_e2036.member_3 + 6u)]; + let _e2454 = global_1.member[(_e2036.member_3 + 7u)]; + let _e2459 = global_1.member[(_e2036.member_3 + 8u)]; + let _e2462 = global_1.member[_e1971]; + let _e2466 = global_1.member[(_e1971 + 1u)]; + let _e2468 = select(_e2433, 4294967295u, (0u >= _e2437)); + let _e2471 = global_1.member[_e2468]; + let _e2476 = global_1.member[(_e2468 + 1u)]; + let _e2481 = global_1.member[(_e2468 + 2u)]; + let _e2486 = global_1.member[(_e2468 + 3u)]; + let _e2491 = global_1.member[(_e2468 + 4u)]; + let _e2496 = global_1.member[(_e2468 + 5u)]; + let _e2501 = global_1.member[(_e2468 + 6u)]; + let _e2506 = global_1.member[(_e2468 + 7u)]; + let _e2511 = global_1.member[(_e2468 + 8u)]; + let _e2516 = global_1.member[(_e2468 + 9u)]; + let _e2521 = global_1.member[(_e2468 + 10u)]; + let _e2526 = global_1.member[(_e2468 + 11u)]; + let _e2531 = global_1.member[(_e2468 + 12u)]; + let _e2536 = global_1.member[(_e2468 + 13u)]; + let _e2541 = global_1.member[(_e2468 + 14u)]; + let _e2546 = global_1.member[(_e2468 + 15u)]; + let _e2566 = (bitcast(_e2546) + fma(bitcast(_e2526), _e156.z, fma(bitcast(_e2506), _e156.y, (bitcast(_e2486) * _e156.x)))); + let _e2567 = ((bitcast(_e2531) + fma(bitcast(_e2511), _e156.z, fma(bitcast(_e2491), _e156.y, (bitcast(_e2471) * _e156.x)))) / _e2566); + let _e2568 = ((bitcast(_e2536) + fma(bitcast(_e2516), _e156.z, fma(bitcast(_e2496), _e156.y, (bitcast(_e2476) * _e156.x)))) / _e2566); + let _e2569 = ((bitcast(_e2541) + fma(bitcast(_e2521), _e156.z, fma(bitcast(_e2501), _e156.y, (bitcast(_e2481) * _e156.x)))) / _e2566); + if (abs(_e2567) <= 1f) { + let _e2573 = (abs(_e2568) <= 1f); + if _e2573 { + phi_7749_ = (abs(_e2569) <= 1f); + } else { + phi_7749_ = bool(); + } + let _e2577 = phi_7749_; + phi_7752_ = _e2577; + phi_7753_ = select(true, false, _e2573); + } else { + phi_7752_ = bool(); + phi_7753_ = true; + } + let _e2580 = phi_7752_; + let _e2582 = phi_7753_; + if select(_e2580, false, _e2582) { + let _e2590 = global_1.member[select(_e2441, 4294967295u, (0u >= _e2445))]; + let _e2593 = global_1.member[_e2590]; + let _e2597 = global_1.member[(_e2590 + 1u)]; + let _e2601 = global_1.member[(_e2590 + 2u)]; + let _e2605 = global_1.member[(_e2590 + 3u)]; + let _e2609 = global_1.member[(_e2590 + 4u)]; + let _e2613 = global_1.member[(_e2590 + 6u)]; + switch bitcast(_e2613) { + case 0: { + phi_4612_ = 0u; + break; + } + case 1: { + phi_4612_ = 1u; + break; + } + case 2: { + phi_4612_ = 2u; + break; + } + default: { + phi_4612_ = 0u; + break; + } + } + let _e2616 = phi_4612_; + let _e2620 = global_1.member[(_e2590 + 7u)]; + switch bitcast(_e2620) { + case 0: { + phi_4621_ = 0u; + break; + } + case 1: { + phi_4621_ = 1u; + break; + } + case 2: { + phi_4621_ = 2u; + break; + } + default: { + phi_4621_ = 0u; + break; + } + } + let _e2623 = phi_4621_; + let _e2624 = bitcast(_e2459); + let _e2626 = f32(_e2601); + let _e2627 = f32(_e2605); + let _e2631 = type_37((_e2624 / -2i), (_e2624 / 2i), false); + phi_8855_ = _e1974; + phi_4649_ = _e2631; + phi_4652_ = 0f; + phi_4654_ = 0f; + loop { + let _e2633 = phi_8855_; + let _e2635 = phi_4649_; + let _e2637 = phi_4652_; + let _e2639 = phi_4654_; + local_3 = _e2637; + local_4 = _e2639; + if _e2635.member_2 { + phi_4666_ = true; + } else { + phi_4666_ = ((_e2635.member <= _e2635.member_1) != true); + } + let _e2646 = phi_4666_; + if _e2646 { + phi_4650_ = _e2635; + phi_4709_ = type_38(0u, type_38().member_1); + } else { + if (_e2635.member < _e2635.member_1) { + let _e2654 = (_e2635.member + 1i); + if select(false, true, ((false == (_e2654 > _e2635.member)) != false)) { + phi_4694_ = type_38(0u, type_38().member_1); + } else { + phi_4694_ = type_38(1u, _e2654); + } + let _e2664 = phi_4694_; + switch bitcast(_e2664.member) { + case 0: { + phi_8935_ = true; + break; + } + case 1: { + break; + } + default: { + break; + } + } + phi_4706_ = type_37(_e2664.member_1, _e2635.member_1, _e2635.member_2); + } else { + phi_4706_ = type_37(_e2635.member, _e2635.member_1, true); + } + let _e2673 = phi_4706_; + phi_4650_ = _e2673; + phi_4709_ = type_38(1u, _e2635.member); + } + let _e2679 = phi_4650_; + let _e2681 = phi_4709_; + switch bitcast(_e2681.member) { + case 0: { + phi_8936_ = _e2633; + phi_4653_ = f32(); + phi_4655_ = f32(); + phi_4967_ = false; + break; + } + case 1: { + phi_4720_ = _e2631; + phi_4723_ = _e2637; + phi_4725_ = _e2639; + loop { + let _e2686 = phi_4720_; + let _e2688 = phi_4723_; + let _e2690 = phi_4725_; + local_11 = _e2688; + local_12 = _e2690; + if _e2686.member_2 { + phi_4737_ = true; + } else { + phi_4737_ = ((_e2686.member <= _e2686.member_1) != true); + } + let _e2697 = phi_4737_; + if _e2697 { + phi_4721_ = _e2686; + phi_4780_ = type_38(0u, type_38().member_1); + } else { + if (_e2686.member < _e2686.member_1) { + let _e2705 = (_e2686.member + 1i); + if select(false, true, ((false == (_e2705 > _e2686.member)) != false)) { + phi_4765_ = type_38(0u, type_38().member_1); + } else { + phi_4765_ = type_38(1u, _e2705); + } + let _e2715 = phi_4765_; + switch bitcast(_e2715.member) { + case 0: { + phi_8839_ = true; + break; + } + case 1: { + break; + } + default: { + break; + } + } + phi_4777_ = type_37(_e2715.member_1, _e2686.member_1, _e2686.member_2); + } else { + phi_4777_ = type_37(_e2686.member, _e2686.member_1, true); + } + let _e2724 = phi_4777_; + phi_4721_ = _e2724; + phi_4780_ = type_38(1u, _e2686.member); + } + let _e2730 = phi_4721_; + let _e2732 = phi_4780_; + switch bitcast(_e2732.member) { + case 0: { + phi_4724_ = f32(); + phi_4726_ = f32(); + phi_4966_ = false; + break; + } + case 1: { + let _e2740 = fma((_e2567 + 1f), 0.5f, (f32(_e2681.member_1) * (1f / _e2626))); + let _e2741 = fma(fma(_e2568, -1f, 1f), 0.5f, (f32(_e2732.member_1) * (1f / _e2627))); + switch bitcast(_e2616) { + case 1: { + let _e2776 = abs(_e2740); + let _e2778 = (_e2776 % 1f); + if (_e2776 >= 1f) { + phi_7805_ = select(true, false, (_e2778 == 0f)); + } else { + phi_7805_ = true; + } + let _e2782 = phi_7805_; + let _e2783 = select(1f, _e2778, _e2782); + if (select(-1f, 1f, (_e2740 >= 0f)) > 0f) { + phi_4812_ = _e2783; + } else { + phi_4812_ = (1f - _e2783); + } + let _e2787 = phi_4812_; + phi_4849_ = _e2787; + break; + } + case 2: { + let _e2750 = abs(_e2740); + let _e2757 = ((select(select(u32(_e2750), 0u, (_e2750 < 0f)), 4294967295u, (_e2750 > 4294967000f)) % 2u) == 0u); + let _e2759 = (_e2750 % 1f); + if (_e2750 >= 1f) { + phi_7788_ = select(true, false, (_e2759 == 0f)); + } else { + phi_7788_ = true; + } + let _e2763 = phi_7788_; + let _e2764 = select(1f, _e2759, _e2763); + if (select(-1f, 1f, (_e2740 >= 0f)) > 0f) { + if _e2757 { + phi_4841_ = _e2764; + } else { + phi_4841_ = (1f - _e2764); + } + let _e2771 = phi_4841_; + phi_4847_ = _e2771; + } else { + if _e2757 { + phi_4846_ = (1f - _e2764); + } else { + phi_4846_ = _e2764; + } + let _e2768 = phi_4846_; + phi_4847_ = _e2768; + } + let _e2773 = phi_4847_; + phi_4849_ = _e2773; + break; + } + case 0: { + if (_e2740 > 1f) { + phi_7775_ = 0.9999999f; + } else { + phi_7775_ = select(_e2740, 0.00000011920929f, (_e2740 < 0f)); + } + let _e2747 = phi_7775_; + phi_4849_ = _e2747; + break; + } + default: { + phi_4849_ = f32(); + break; + } + } + let _e2789 = phi_4849_; + switch bitcast(_e2623) { + case 1: { + let _e2824 = abs(_e2741); + let _e2826 = (_e2824 % 1f); + if (_e2824 >= 1f) { + phi_7853_ = select(true, false, (_e2826 == 0f)); + } else { + phi_7853_ = true; + } + let _e2830 = phi_7853_; + let _e2831 = select(1f, _e2826, _e2830); + if (select(-1f, 1f, (_e2741 >= 0f)) > 0f) { + phi_4868_ = _e2831; + } else { + phi_4868_ = (1f - _e2831); + } + let _e2835 = phi_4868_; + phi_4905_ = _e2835; + break; + } + case 2: { + let _e2798 = abs(_e2741); + let _e2805 = ((select(select(u32(_e2798), 0u, (_e2798 < 0f)), 4294967295u, (_e2798 > 4294967000f)) % 2u) == 0u); + let _e2807 = (_e2798 % 1f); + if (_e2798 >= 1f) { + phi_7836_ = select(true, false, (_e2807 == 0f)); + } else { + phi_7836_ = true; + } + let _e2811 = phi_7836_; + let _e2812 = select(1f, _e2807, _e2811); + if (select(-1f, 1f, (_e2741 >= 0f)) > 0f) { + if _e2805 { + phi_4897_ = _e2812; + } else { + phi_4897_ = (1f - _e2812); + } + let _e2819 = phi_4897_; + phi_4903_ = _e2819; + } else { + if _e2805 { + phi_4902_ = (1f - _e2812); + } else { + phi_4902_ = _e2812; + } + let _e2816 = phi_4902_; + phi_4903_ = _e2816; + } + let _e2821 = phi_4903_; + phi_4905_ = _e2821; + break; + } + case 0: { + if (_e2741 > 1f) { + phi_7823_ = 0.9999999f; + } else { + phi_7823_ = select(_e2741, 0.00000011920929f, (_e2741 < 0f)); + } + let _e2795 = phi_7823_; + phi_4905_ = _e2795; + break; + } + default: { + phi_4905_ = f32(); + break; + } + } + let _e2837 = phi_4905_; + let _e2838 = (_e2789 * _e2626); + let _e2844 = (_e2837 * _e2627); + let _e2859 = vec3((f32((select(select(u32(_e2838), 0u, (_e2838 < 0f)), 4294967295u, (_e2838 > 4294967000f)) + _e2593)) / f32(_e2462)), (f32((select(select(u32(_e2844), 0u, (_e2844 < 0f)), 4294967295u, (_e2844 > 4294967000f)) + _e2597)) / f32(_e2466)), f32(_e2609)); + let _e2865 = textureSampleLevel(global_19, global_18, vec2(_e2859.x, _e2859.y), i32(_e2859.z), 0f); + if ((_e2569 - max((bitcast(_e2454) * (1f - _e2372)), bitcast(_e2449))) > _e2865.x) { + phi_4964_ = (_e2690 + 1f); + } else { + phi_4964_ = _e2690; + } + let _e2874 = phi_4964_; + phi_4724_ = (_e2688 + 1f); + phi_4726_ = _e2874; + phi_4966_ = true; + break; + } + default: { + phi_4724_ = f32(); + phi_4726_ = f32(); + phi_4966_ = bool(); + break; + } + } + let _e2877 = phi_4724_; + let _e2879 = phi_4726_; + let _e2881 = phi_4966_; + continue; + continuing { + phi_4720_ = _e2730; + phi_4723_ = _e2877; + phi_4725_ = _e2879; + phi_8839_ = _e2633; + break if !(_e2881); + } + } + let _e2884 = phi_8839_; + phi_8935_ = _e2884; + if _e2884 { + break; + } + phi_8936_ = _e2884; + let _e4560 = local_11; + phi_4653_ = _e4560; + let _e4563 = local_12; + phi_4655_ = _e4563; + phi_4967_ = true; + break; + } + default: { + phi_8936_ = _e2633; + phi_4653_ = f32(); + phi_4655_ = f32(); + phi_4967_ = bool(); + break; + } + } + let _e2886 = phi_8936_; + let _e2888 = phi_4653_; + let _e2890 = phi_4655_; + let _e2892 = phi_4967_; + continue; + continuing { + phi_8855_ = _e2886; + phi_4649_ = _e2679; + phi_4652_ = _e2888; + phi_4654_ = _e2890; + phi_8935_ = _e2886; + break if !(_e2892); + } + } + let _e2895 = phi_8935_; + phi_9056_ = _e2895; + if _e2895 { + break; + } + let _e2897 = local_3; + let _e2900 = local_4; + phi_9063_ = _e2895; + phi_4970_ = (_e2900 / max(_e2897, 1f)); + } else { + phi_9063_ = _e1974; + phi_4970_ = 0f; + } + let _e2903 = phi_9063_; + let _e2905 = phi_4970_; + phi_9062_ = _e2903; + phi_4971_ = _e2905; + } else { + phi_9062_ = _e1974; + phi_4971_ = 0f; + } + let _e2907 = phi_9062_; + let _e2909 = phi_4971_; + phi_9061_ = _e2907; + phi_4972_ = _e2909; + phi_4973_ = vec3(((fma((((1f - _e2397) * _e2316) * _e1394), 0.31830987f, ((_e2406 * _e2397) / _e2411)) * (_e2217.member_4.x * _e2312)) * _e2373), ((fma((((1f - _e2398) * _e2316) * _e1396), 0.31830987f, ((_e2406 * _e2398) / _e2411)) * (_e2217.member_4.y * _e2312)) * _e2373), ((fma((((1f - _e2399) * _e2316) * _e1398), 0.31830987f, ((_e2406 * _e2399) / _e2411)) * (_e2217.member_4.z * _e2312)) * _e2373)); } - let _e2267 = phi_5701_; - 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_3162_ = 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 _e2911 = phi_9061_; + let _e2913 = phi_4972_; + let _e2915 = phi_4973_; + phi_9060_ = _e2911; + phi_4975_ = _e2913; + phi_4976_ = _e2915; + phi_4977_ = select(true, false, _e2309); + break; + } + default: { + phi_9060_ = _e1974; + phi_4975_ = f32(); + phi_4976_ = vec3(); + phi_4977_ = bool(); + break; } - let _e2355 = phi_3162_; - phi_3164_ = _e2355; - phi_3165_ = select(true, false, _e2197); - break; } - default: { - phi_3164_ = vec3(); - phi_3165_ = bool(); - break; + let _e4255 = phi_9060_; + let _e4257 = phi_4975_; + let _e4259 = phi_4976_; + let _e4261 = phi_4977_; + if _e4261 { + let _e4262 = (1f - _e4257); + phi_4997_ = vec3(fma(_e4259.x, _e4262, _e1978.x), fma(_e4259.y, _e4262, _e1978.y), fma(_e4259.z, _e4262, _e1978.z)); + } else { + phi_4997_ = vec3(); } + let _e4274 = phi_4997_; + phi_9057_ = _e4255; + phi_2409_ = select(_e4274, _e1978, vec3(select(true, false, _e4261))); + phi_5003_ = true; + break; + } + default: { + phi_9057_ = _e1974; + phi_2409_ = vec3(); + phi_5003_ = bool(); + break; } - let _e2780 = phi_3164_; - let _e2782 = phi_3165_; - phi_3174_ = select(_e2780, _e1921, vec3(select(true, false, _e2782))); } - let _e2787 = phi_3174_; - phi_2283_ = _e2787; - phi_3176_ = select(true, false, _e1954); - break; + let _e4279 = phi_9057_; + let _e4281 = phi_2409_; + let _e4283 = phi_5003_; + continue; + continuing { + phi_8882_ = _e4279; + phi_2405_ = _e1991; + phi_2408_ = _e4281; + phi_9056_ = _e4279; + break if !(_e4283); + } } - default: { - phi_2283_ = vec3(); - phi_3176_ = bool(); + let _e4286 = phi_9056_; + phi_9068_ = _e4286; + if _e4286 { break; } + let _e4288 = fma(-(_e710.z), _e319.member_3, 1f); + let _e4292 = fma(0.04f, _e4288, (_e1394 * _e1406)); + let _e4293 = fma(0.04f, _e4288, (_e1396 * _e1406)); + let _e4294 = fma(0.04f, _e4288, (_e1398 * _e1406)); + let _e4306 = fma(-(_e710.y), _e319.member_4, 1f); + let _e4313 = (1f - max(fma(_e1958.z, _e1962.z, fma(_e1958.x, _e1962.x, (_e1958.y * _e1962.y))), 0f)); + let _e4315 = select(_e4313, 0f, (_e4313 < 0f)); + let _e4318 = pow(select(_e4315, 1f, (_e4315 > 1f)), 5f); + let _e4319 = fma((max(_e4306, _e4292) - _e4292), _e4318, _e4292); + let _e4320 = fma((max(_e4306, _e4293) - _e4293), _e4318, _e4293); + let _e4321 = fma((max(_e4306, _e4294) - _e4294), _e4318, _e4294); + let _e4341 = local_8; + let _e4345 = local_9; + let _e4349 = local_10; + phi_9076_ = _e4286; + phi_5120_ = vec4(fma(_e1416, _e319.member_1, fma(fma(((1f - _e4319) * _e4288), (_e1425.x * _e1394), (_e1773.x * fma(_e4319, _e1789.x, _e1789.y))), _e1410, _e4341.x)), fma(_e1418, _e319.member_1, fma(fma(((1f - _e4320) * _e4288), (_e1425.y * _e1396), (_e1773.y * fma(_e4320, _e1789.x, _e1789.y))), _e1410, _e4345.y)), fma(_e1420, _e319.member_1, fma(fma(((1f - _e4321) * _e4288), (_e1425.z * _e1398), (_e1773.z * fma(_e4321, _e1789.x, _e1789.y))), _e1410, _e4349.z)), 1f); + } else { + phi_9076_ = false; + phi_5120_ = (vec4((_e150.x * _e516.x), (_e150.y * _e516.y), (_e150.z * _e516.z), (_e150.w * _e516.w)) * _e319.member_2); } - let _e2790 = phi_2283_; - let _e2792 = phi_3176_; - continue; - continuing { - phi_2279_ = _e1934; - phi_2282_ = _e2790; - break if !(_e2792); - } - } - 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_3293_ = 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_3293_ = (vec4((_e112.x * _e486.x), (_e112.y * _e486.y), (_e112.z * _e486.z), (_e112.w * _e486.w)) * _e289.member_2); - } - let _e2864 = phi_3293_; - global_17 = _e2864; - break; - } - case 1: { - let _e1885 = sqrt(fma(_e113.x, _e113.x, (_e113.y * _e113.y))); - if (_e1885 == 0f) { - phi_5329_ = vec3(0f, 0f, 0f); - } else { - phi_5329_ = (vec3(_e113.x, _e113.y, 0f) * (1f / _e1885)); - } - let _e1890 = phi_5329_; - global_17 = vec4(((_e1890.x + 1f) * 0.5f), ((_e1890.y + 1f) * 0.5f), ((_e1890.z + 1f) * 0.5f), 1f); - break; - } - case 2: { - let _e1864 = sqrt(fma(_e114.x, _e114.x, (_e114.y * _e114.y))); - if (_e1864 == 0f) { - phi_5280_ = vec3(0f, 0f, 0f); - } else { - phi_5280_ = (vec3(_e114.x, _e114.y, 0f) * (1f / _e1864)); - } - let _e1869 = phi_5280_; - global_17 = vec4(((_e1869.x + 1f) * 0.5f), ((_e1869.y + 1f) * 0.5f), ((_e1869.z + 1f) * 0.5f), 1f); - break; - } - case 3: { - if _e1706 { - phi_5231_ = vec3(0f, 0f, 0f); - } else { - phi_5231_ = (_e1349 * (1f / _e1705)); - } - let _e1848 = phi_5231_; - global_17 = vec4(((_e1848.x + 1f) * 0.5f), ((_e1848.y + 1f) * 0.5f), ((_e1848.z + 1f) * 0.5f), 1f); - break; - } - case 4: { - global_17 = _e112; - break; - } - case 5: { - let _e1829 = sqrt(fma(_e115.z, _e115.z, fma(_e115.x, _e115.x, (_e115.y * _e115.y)))); - if (_e1829 == 0f) { - phi_5182_ = vec3(0f, 0f, 0f); - } else { - phi_5182_ = (_e115 * (1f / _e1829)); - } - let _e1834 = phi_5182_; - global_17 = vec4(((_e1834.x + 1f) * 0.5f), ((_e1834.y + 1f) * 0.5f), ((_e1834.z + 1f) * 0.5f), 1f); - break; - } - case 6: { - let _e1807 = sqrt(fma(_e1347.z, _e1347.z, fma(_e1347.x, _e1347.x, (_e1347.y * _e1347.y)))); - if (_e1807 == 0f) { - phi_5133_ = vec3(0f, 0f, 0f); - } else { - phi_5133_ = (_e1347 * (1f / _e1807)); - } - let _e1812 = phi_5133_; - global_17 = vec4(((_e1812.x + 1f) * 0.5f), ((_e1812.y + 1f) * 0.5f), ((_e1812.z + 1f) * 0.5f), 1f); - break; - } - case 7: { - let _e1785 = sqrt(fma(_e116.z, _e116.z, fma(_e116.x, _e116.x, (_e116.y * _e116.y)))); - if (_e1785 == 0f) { - phi_5084_ = vec3(0f, 0f, 0f); - } else { - phi_5084_ = (_e116 * (1f / _e1785)); + let _e4357 = phi_9076_; + let _e4359 = phi_5120_; + global_20 = _e4359; + phi_9068_ = _e4357; + break; + } + case 1: { + let _e1931 = sqrt(fma(_e151.x, _e151.x, (_e151.y * _e151.y))); + if (_e1931 == 0f) { + phi_7269_ = vec3(0f, 0f, 0f); + } else { + phi_7269_ = (vec3(_e151.x, _e151.y, 0f) * (1f / _e1931)); + } + let _e1936 = phi_7269_; + global_20 = vec4(((_e1936.x + 1f) * 0.5f), ((_e1936.y + 1f) * 0.5f), ((_e1936.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 2: { + let _e1910 = sqrt(fma(_e152.x, _e152.x, (_e152.y * _e152.y))); + if (_e1910 == 0f) { + phi_7220_ = vec3(0f, 0f, 0f); + } else { + phi_7220_ = (vec3(_e152.x, _e152.y, 0f) * (1f / _e1910)); + } + let _e1915 = phi_7220_; + global_20 = vec4(((_e1915.x + 1f) * 0.5f), ((_e1915.y + 1f) * 0.5f), ((_e1915.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 3: { + if _e1752 { + phi_7171_ = vec3(0f, 0f, 0f); + } else { + phi_7171_ = (_e1379 * (1f / _e1751)); + } + let _e1894 = phi_7171_; + global_20 = vec4(((_e1894.x + 1f) * 0.5f), ((_e1894.y + 1f) * 0.5f), ((_e1894.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 4: { + global_20 = _e150; + phi_9068_ = false; + break; + } + case 5: { + let _e1875 = sqrt(fma(_e153.z, _e153.z, fma(_e153.x, _e153.x, (_e153.y * _e153.y)))); + if (_e1875 == 0f) { + phi_7122_ = vec3(0f, 0f, 0f); + } else { + phi_7122_ = (_e153 * (1f / _e1875)); + } + let _e1880 = phi_7122_; + global_20 = vec4(((_e1880.x + 1f) * 0.5f), ((_e1880.y + 1f) * 0.5f), ((_e1880.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 6: { + let _e1853 = sqrt(fma(_e1377.z, _e1377.z, fma(_e1377.x, _e1377.x, (_e1377.y * _e1377.y)))); + if (_e1853 == 0f) { + phi_7073_ = vec3(0f, 0f, 0f); + } else { + phi_7073_ = (_e1377 * (1f / _e1853)); + } + let _e1858 = phi_7073_; + global_20 = vec4(((_e1858.x + 1f) * 0.5f), ((_e1858.y + 1f) * 0.5f), ((_e1858.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 7: { + let _e1831 = sqrt(fma(_e154.z, _e154.z, fma(_e154.x, _e154.x, (_e154.y * _e154.y)))); + if (_e1831 == 0f) { + phi_7024_ = vec3(0f, 0f, 0f); + } else { + phi_7024_ = (_e154 * (1f / _e1831)); + } + let _e1836 = phi_7024_; + global_20 = vec4(((_e1836.x + 1f) * 0.5f), ((_e1836.y + 1f) * 0.5f), ((_e1836.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 8: { + let _e1809 = sqrt(fma(_e155.z, _e155.z, fma(_e155.x, _e155.x, (_e155.y * _e155.y)))); + if (_e1809 == 0f) { + phi_6975_ = vec3(0f, 0f, 0f); + } else { + phi_6975_ = (_e155 * (1f / _e1809)); + } + let _e1814 = phi_6975_; + global_20 = vec4(((_e1814.x + 1f) * 0.5f), ((_e1814.y + 1f) * 0.5f), ((_e1814.z + 1f) * 0.5f), 1f); + phi_9068_ = false; + break; + } + case 9: { + global_20 = vec4(_e1425.x, _e1425.y, _e1425.z, 1f); + phi_9068_ = false; + break; + } + case 10: { + global_20 = vec4(_e1773.x, _e1773.y, _e1773.z, 1f); + phi_9068_ = false; + break; + } + case 11: { + global_20 = vec4(_e1789.x, _e1789.y, 1f, 1f); + phi_9068_ = false; + break; + } + case 12: { + global_20 = (vec4(_e1383, _e1386, _e1389, (_e516.w * _e319.member_2.w)) * _e150); + phi_9068_ = false; + break; + } + case 13: { + global_20 = vec4(_e1403, _e1403, _e1403, 1f); + phi_9068_ = false; + break; + } + case 14: { + global_20 = vec4(_e1406, _e1406, _e1406, 1f); + phi_9068_ = false; + break; + } + case 15: { + global_20 = vec4(_e1410, _e1410, _e1410, 1f); + phi_9068_ = false; + break; + } + case 16: { + global_20 = vec4((_e1416 * _e319.member_1), (_e1418 * _e319.member_1), (_e1420 * _e319.member_1), 1f); + phi_9068_ = false; + break; + } + case 17: { + global_20 = vec4(_e1292.x, _e1292.y, _e1292.z, 1f); + phi_9068_ = false; + break; + } + case 18: { + global_20 = vec4(_e319.member.x, _e319.member.y, _e319.member.z, 1f); + phi_9068_ = false; + break; + } + case 19: { + global_20 = vec4(_e319.member_1, _e319.member_1, _e319.member_1, 1f); + phi_9068_ = false; + break; + } + default: { + phi_9068_ = false; + break; + } } - let _e1790 = phi_5084_; - global_17 = vec4(((_e1790.x + 1f) * 0.5f), ((_e1790.y + 1f) * 0.5f), ((_e1790.z + 1f) * 0.5f), 1f); - break; - } - case 8: { - let _e1763 = sqrt(fma(_e117.z, _e117.z, fma(_e117.x, _e117.x, (_e117.y * _e117.y)))); - if (_e1763 == 0f) { - phi_5035_ = vec3(0f, 0f, 0f); - } else { - phi_5035_ = (_e117 * (1f / _e1763)); + let _e4361 = phi_9068_; + if _e4361 { + break; } - let _e1768 = phi_5035_; - global_17 = vec4(((_e1768.x + 1f) * 0.5f), ((_e1768.y + 1f) * 0.5f), ((_e1768.z + 1f) * 0.5f), 1f); - break; - } - case 9: { - global_17 = vec4(_e1395.x, _e1395.y, _e1395.z, 1f); - break; - } - case 10: { - global_17 = vec4(_e1727.x, _e1727.y, _e1727.z, 1f); - break; - } - case 11: { - global_17 = vec4(_e1743.x, _e1743.y, 1f, 1f); - break; - } - case 12: { - global_17 = (vec4(_e1353, _e1356, _e1359, (_e486.w * _e289.member_2.w)) * _e112); - break; - } - case 13: { - global_17 = vec4(_e1373, _e1373, _e1373, 1f); - break; - } - case 14: { - global_17 = vec4(_e1376, _e1376, _e1376, 1f); - break; - } - case 15: { - global_17 = vec4(_e1380, _e1380, _e1380, 1f); - break; - } - case 16: { - global_17 = vec4((_e1386 * _e289.member_1), (_e1388 * _e289.member_1), (_e1390 * _e289.member_1), 1f); - break; - } - case 17: { - global_17 = vec4(_e1262.x, _e1262.y, _e1262.z, 1f); - break; - } - case 18: { - global_17 = vec4(_e289.member.x, _e289.member.y, _e289.member.z, 1f); - break; - } - case 19: { - global_17 = vec4(_e289.member_1, _e289.member_1, _e289.member_1, 1f); - break; - } - default: { break; } } @@ -2185,15 +3765,15 @@ fn function() { @fragment 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; - global_4 = param_3; - global_5 = param_4; - global_6 = param_5; - global_7 = param_6; - global_8 = param_7; + global_2 = param; + global_3 = param_1; + global_4 = param_2; + global_5 = param_3; + global_6 = param_4; + global_7 = param_5; + global_8 = param_6; + global_9 = param_7; function(); - let _e17 = global_17; + let _e17 = global_20; return _e17; } diff --git a/crates/renderling/shaders/stage-renderlet_vertex.spv b/crates/renderling/shaders/stage-renderlet_vertex.spv index 4c7b2b49..1dd9bd6b 100644 Binary files a/crates/renderling/shaders/stage-renderlet_vertex.spv and b/crates/renderling/shaders/stage-renderlet_vertex.spv differ diff --git a/crates/renderling/shaders/stage-renderlet_vertex.wgsl b/crates/renderling/shaders/stage-renderlet_vertex.wgsl index 8b8cf8fa..2b78978a 100644 --- a/crates/renderling/shaders/stage-renderlet_vertex.wgsl +++ b/crates/renderling/shaders/stage-renderlet_vertex.wgsl @@ -1,29 +1,30 @@ -struct type_12 { +struct type_3 { member: array, } -struct type_20 { +struct type_14 { + member: u32, + member_1: u32, +} + +struct type_21 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_21 { +struct type_22 { member: array, 8>, member_1: array, 6>, + member_2: vec3, } -struct type_22 { - member: type_20, - member_1: type_20, - member_2: type_21, - member_3: vec3, -} - -struct type_24 { - member: u32, - member_1: u32, +struct type_23 { + member: type_21, + member_1: type_21, + member_2: vec3, + member_3: type_22, } struct type_27 { @@ -50,8 +51,8 @@ struct type_33 { } struct type_34 { - member: type_24, - member_1: type_24, + member: type_14, + member_1: type_14, } struct VertexOutput { @@ -66,16 +67,16 @@ struct VertexOutput { @builtin(position) member_8: vec4, } -var global: u32; -var global_1: vec4 = vec4(0f, 0f, 0f, 1f); @group(0) @binding(0) -var global_2: type_12; +var global: type_3; +var global_1: u32; +var global_2: vec4 = vec4(0f, 0f, 0f, 1f); var global_3: u32; -var global_4: u32; -var global_5: vec4; -var global_6: vec2; +var global_4: type_21 = type_21(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); +var global_5: u32; +var global_6: vec4; 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_8: vec2; var global_9: vec3; var global_10: vec3; var global_11: vec3; @@ -88,1061 +89,1064 @@ fn function() { var local_3: array, 6>; var local_4: array; var local_5: array; - var phi_743_: u32; - var phi_2896_: 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_867_: type_24; - var phi_880_: bool; - var phi_886_: type_24; - var phi_887_: type_24; - var phi_910_: type_24; - var phi_924_: bool; - var phi_930_: type_24; - var phi_933_: type_30; - var phi_931_: type_24; - var phi_956_: type_24; - var phi_973_: u32; - var phi_2926_: bool; - var phi_991_: type_24; - var phi_2952_: u32; - var phi_2971_: bool; - var phi_1041_: type_33; - var phi_1051_: u32; - var phi_2993_: bool; - var phi_1059_: f32; - var phi_934_: type_30; - var phi_1112_: bool; + var phi_1156_: u32; + var phi_2871_: bool; + var phi_1163_: u32; + var phi_1164_: u32; + var phi_1174_: u32; + var phi_1256_: type_14; + var phi_1257_: type_14; + var phi_1280_: type_14; + var phi_1293_: bool; + var phi_1299_: type_14; + var phi_1300_: type_14; + var phi_1323_: type_14; + var phi_1337_: bool; + var phi_1343_: type_14; + var phi_1346_: type_30; + var phi_1344_: type_14; + var phi_1369_: type_14; + var phi_1386_: u32; + var phi_2901_: bool; + var phi_1404_: type_14; + var phi_2927_: u32; + var phi_2946_: bool; + var phi_1454_: type_33; + var phi_1464_: u32; + var phi_2968_: bool; + var phi_1472_: f32; + var phi_1347_: type_30; + var phi_1525_: bool; + var phi_2988_: bool; + var phi_1621_: type_34; var local_6: type_30; + var phi_1624_: type_14; + var phi_1627_: type_21; + var phi_1625_: type_14; + var phi_1650_: type_14; var local_7: type_30; - var local_8: type_30; - var phi_3016_: bool; - var phi_1236_: type_34; - var local_9: type_30; - var phi_1239_: type_24; - var phi_1242_: type_20; - var phi_1240_: type_24; - var phi_1265_: type_24; - var local_10: type_30; - var phi_1289_: u32; - var phi_3050_: bool; - var phi_1298_: u32; - var phi_3074_: bool; - var phi_1347_: type_27; - var phi_1357_: u32; - var phi_3099_: bool; - var phi_1430_: type_20; - var phi_1243_: type_20; - var phi_1667_: bool; - var phi_3915_: bool; - var local_11: type_20; - var local_12: type_20; - var local_13: type_20; - var local_14: type_20; - var phi_1694_: bool; - var phi_1696_: bool; - var phi_1697_: bool; - var phi_1698_: bool; - var phi_1699_: bool; - var local_15: type_20; - var local_16: type_20; - var local_17: type_20; - var local_18: type_20; - var phi_1733_: bool; - var phi_1735_: bool; - var phi_1736_: bool; - var phi_1737_: bool; - var phi_1738_: bool; - var local_19: type_20; - var local_20: type_20; - var local_21: type_20; - var local_22: type_20; - var phi_1772_: bool; - var phi_1774_: bool; - var phi_1775_: bool; - var phi_1776_: bool; - var phi_1777_: bool; - var local_23: type_20; - var local_24: type_20; - var local_25: type_20; - var local_26: type_20; - var phi_1811_: bool; - var phi_1813_: bool; - var phi_1814_: bool; - var phi_1815_: bool; - var phi_1816_: bool; - var phi_1821_: bool; - var phi_1823_: bool; - var phi_1824_: bool; - var phi_1825_: bool; - var phi_1826_: bool; - var phi_1834_: type_20; - var phi_3234_: bool; - var phi_3299_: vec4; - var phi_3329_: vec4; - var phi_3331_: vec4; - var phi_3340_: type_27; - var phi_3341_: type_27; - var phi_3346_: type_27; - var phi_3347_: type_27; - var phi_3348_: bool; - var phi_3352_: type_27; - var phi_1836_: type_27; - var phi_1838_: type_27; - var phi_1839_: bool; - var phi_3446_: bool; - var phi_1892_: type_27; - var phi_1893_: type_27; + var phi_1674_: u32; + var phi_3022_: bool; + var phi_1683_: u32; + var phi_3046_: bool; + var phi_1732_: type_27; + var phi_1742_: u32; + var phi_3071_: bool; + var phi_1815_: type_21; + var phi_1628_: type_21; + var phi_2052_: bool; + var phi_3887_: bool; + var local_8: type_21; + var local_9: type_21; + var local_10: type_21; + var local_11: type_21; + var phi_2079_: bool; + var phi_2081_: bool; + var phi_2082_: bool; + var phi_2083_: bool; + var phi_2084_: bool; + var local_12: type_21; + var local_13: type_21; + var local_14: type_21; + var local_15: type_21; + var phi_2118_: bool; + var phi_2120_: bool; + var phi_2121_: bool; + var phi_2122_: bool; + var phi_2123_: bool; + var local_16: type_21; + var local_17: type_21; + var local_18: type_21; + var local_19: type_21; + var phi_2157_: bool; + var phi_2159_: bool; + var phi_2160_: bool; + var phi_2161_: bool; + var phi_2162_: bool; + var local_20: type_21; + var local_21: type_21; + var local_22: type_21; + var local_23: type_21; + var phi_2196_: bool; + var phi_2198_: bool; + var phi_2199_: bool; + var phi_2200_: bool; + var phi_2201_: bool; + var phi_2206_: bool; + var phi_2208_: bool; + var phi_2209_: bool; + var phi_2210_: bool; + var phi_2211_: bool; + var phi_2219_: type_21; + var phi_3206_: bool; + var phi_3271_: vec4; + var phi_3301_: vec4; + var phi_3303_: vec4; + var phi_3312_: type_27; + var phi_3313_: type_27; + var phi_3318_: type_27; + var phi_3319_: type_27; + var phi_3320_: bool; + var phi_3324_: type_27; + var phi_2221_: type_27; + var phi_2223_: type_27; + var phi_2224_: bool; + var phi_3418_: bool; + var phi_2277_: type_27; + var phi_2278_: type_27; + var local_24: type_30; + var local_25: type_30; + var local_26: type_30; var local_27: type_30; - var phi_1937_: vec3; var local_28: type_30; - var phi_3490_: vec3; - var phi_3572_: vec3; - var phi_3607_: vec3; + var phi_2365_: vec3; var local_29: type_30; + var phi_3509_: vec3; + var phi_3544_: vec3; + var phi_3579_: vec3; var local_30: type_30; - var phi_3620_: bool; - var phi_2261_: type_24; - var phi_2262_: type_24; - var phi_2285_: type_24; - var phi_2312_: bool; - var phi_2318_: type_24; - var phi_2319_: type_24; - var phi_2342_: type_24; - var phi_2365_: bool; - var phi_2373_: type_22; - var local_31: type_20; + var phi_3592_: bool; + var phi_2649_: type_14; + var phi_2650_: type_14; + var phi_2673_: type_14; + var phi_2700_: bool; + var phi_2706_: type_14; + var phi_2707_: type_14; + var phi_2730_: type_14; + var phi_2753_: bool; + var phi_2774_: type_23; + var local_31: type_21; switch bitcast(0u) { default: { - 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; + let _e98 = global_3; + let _e99 = global_1; + let _e101 = arrayLength((&global.member)); + let _e104 = global.member[_e98]; + let _e109 = global.member[(_e98 + 1u)]; + let _e113 = global.member[(_e98 + 2u)]; + let _e117 = global.member[(_e98 + 7u)]; + let _e121 = global.member[(_e98 + 8u)]; + let _e125 = global.member[(_e98 + 9u)]; + let _e129 = global.member[(_e98 + 10u)]; + let _e133 = global.member[(_e98 + 12u)]; + let _e137 = global.member[(_e98 + 13u)]; + let _e141 = global.member[(_e98 + 14u)]; + let _e145 = global.member[(_e98 + 15u)]; + let _e149 = global.member[(_e98 + 16u)]; + let _e153 = global.member[(_e98 + 17u)]; + if (_e104 == 1u) { + global_5 = _e98; + if (_e117 == 4294967295u) { + phi_1164_ = _e99; } else { - if (_e96 >= _e118) { - phi_743_ = 4294967295u; + if (_e99 >= _e121) { + phi_1156_ = 4294967295u; } else { - phi_743_ = (_e114 + _e96); + phi_1156_ = (_e117 + _e99); } - let _e155 = phi_743_; - if (_e98 >= 1u) { - phi_2896_ = (_e155 <= (_e98 - 1u)); + let _e158 = phi_1156_; + if (_e101 >= 1u) { + phi_2871_ = (_e158 <= (_e101 - 1u)); } else { - phi_2896_ = false; + phi_2871_ = false; } - let _e160 = phi_2896_; - if _e160 { - let _e163 = global_2.member[_e155]; - phi_750_ = _e163; + let _e163 = phi_2871_; + if _e163 { + let _e166 = global.member[_e158]; + phi_1163_ = _e166; } else { - phi_750_ = 0u; + phi_1163_ = 0u; } - let _e165 = phi_750_; - phi_751_ = _e165; + let _e168 = phi_1163_; + phi_1164_ = _e168; } - let _e167 = phi_751_; - if (_e167 >= _e110) { - phi_761_ = 4294967295u; + let _e170 = phi_1164_; + if (_e170 >= _e113) { + phi_1174_ = 4294967295u; } else { - phi_761_ = (_e106 + (26u * _e167)); + phi_1174_ = (_e109 + (26u * _e170)); } - 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)]; + let _e175 = phi_1174_; + let _e178 = global.member[_e175]; + let _e183 = global.member[(_e175 + 1u)]; + let _e188 = global.member[(_e175 + 2u)]; + let _e194 = global.member[(_e175 + 3u)]; + let _e199 = global.member[(_e175 + 4u)]; + let _e204 = global.member[(_e175 + 5u)]; + let _e209 = global.member[(_e175 + 6u)]; + let _e215 = global.member[(_e175 + 7u)]; + let _e220 = global.member[(_e175 + 8u)]; + let _e226 = global.member[(_e175 + 9u)]; + let _e231 = global.member[(_e175 + 10u)]; + let _e237 = global.member[(_e175 + 11u)]; + let _e242 = global.member[(_e175 + 12u)]; + let _e247 = global.member[(_e175 + 13u)]; + let _e253 = global.member[(_e175 + 14u)]; + let _e258 = global.member[(_e175 + 15u)]; + let _e263 = global.member[(_e175 + 16u)]; + let _e268 = global.member[(_e175 + 17u)]; local_5 = array(0u, 0u, 0u, 0u); - phi_843_ = type_24(0u, 4u); + phi_1256_ = type_14(0u, 4u); loop { - let _e270 = phi_843_; - if (_e270.member < _e270.member_1) { - phi_844_ = type_24((_e270.member + 1u), _e270.member_1); - phi_867_ = type_24(1u, _e270.member); + let _e273 = phi_1256_; + if (_e273.member < _e273.member_1) { + phi_1257_ = type_14((_e273.member + 1u), _e273.member_1); + phi_1280_ = type_14(1u, _e273.member); } else { - phi_844_ = _e270; - phi_867_ = type_24(0u, type_24().member_1); + phi_1257_ = _e273; + phi_1280_ = type_14(0u, type_14().member_1); } - let _e283 = phi_844_; - let _e285 = phi_867_; - switch bitcast(_e285.member) { + let _e286 = phi_1257_; + let _e288 = phi_1280_; + switch bitcast(_e288.member) { case 0: { - phi_880_ = false; + phi_1293_ = false; break; } case 1: { - let _e292 = global_2.member[((_e172 + 18u) + _e285.member_1)]; - local_5[_e285.member_1] = _e292; - phi_880_ = true; + let _e295 = global.member[((_e175 + 18u) + _e288.member_1)]; + local_5[_e288.member_1] = _e295; + phi_1293_ = true; break; } default: { - phi_880_ = bool(); + phi_1293_ = bool(); break; } } - let _e295 = phi_880_; + let _e298 = phi_1293_; continue; continuing { - phi_843_ = _e283; - break if !(_e295); + phi_1256_ = _e286; + break if !(_e298); } } - let _e297 = local_5; + let _e300 = local_5; local_4 = array(0f, 0f, 0f, 0f); - phi_886_ = type_24(0u, 4u); + phi_1299_ = type_14(0u, 4u); loop { - let _e300 = phi_886_; - if (_e300.member < _e300.member_1) { - phi_887_ = type_24((_e300.member + 1u), _e300.member_1); - phi_910_ = type_24(1u, _e300.member); + let _e303 = phi_1299_; + if (_e303.member < _e303.member_1) { + phi_1300_ = type_14((_e303.member + 1u), _e303.member_1); + phi_1323_ = type_14(1u, _e303.member); } else { - phi_887_ = _e300; - phi_910_ = type_24(0u, type_24().member_1); + phi_1300_ = _e303; + phi_1323_ = type_14(0u, type_14().member_1); } - let _e313 = phi_887_; - let _e315 = phi_910_; - switch bitcast(_e315.member) { + let _e316 = phi_1300_; + let _e318 = phi_1323_; + switch bitcast(_e318.member) { case 0: { - phi_924_ = false; + phi_1337_ = false; break; } case 1: { - let _e322 = global_2.member[((_e172 + 22u) + _e315.member_1)]; - local_4[_e315.member_1] = bitcast(_e322); - phi_924_ = true; + let _e325 = global.member[((_e175 + 22u) + _e318.member_1)]; + local_4[_e318.member_1] = bitcast(_e325); + phi_1337_ = true; break; } default: { - phi_924_ = bool(); + phi_1337_ = bool(); break; } } - let _e326 = phi_924_; + let _e329 = phi_1337_; continue; continuing { - phi_886_ = _e313; - break if !(_e326); + phi_1299_ = _e316; + break if !(_e329); } } - let _e328 = local_4; - phi_930_ = type_24(0u, _e138); - phi_933_ = 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))); + let _e331 = local_4; + phi_1343_ = type_14(0u, _e141); + phi_1346_ = type_30(vec3(bitcast(_e178), bitcast(_e183), bitcast(_e188)), vec4(bitcast(_e194), bitcast(_e199), bitcast(_e204), bitcast(_e209)), vec3(bitcast(_e237), bitcast(_e242), bitcast(_e247)), vec4(bitcast(_e253), bitcast(_e258), bitcast(_e263), bitcast(_e268)), _e300, _e331, vec2(bitcast(_e215), bitcast(_e220)), vec2(bitcast(_e226), bitcast(_e231))); loop { - let _e332 = phi_930_; - let _e334 = phi_933_; - 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_931_ = type_24((_e332.member + 1u), _e332.member_1); - phi_956_ = type_24(1u, _e332.member); + let _e335 = phi_1343_; + let _e337 = phi_1346_; + local_6 = _e337; + local_7 = _e337; + local_24 = _e337; + local_25 = _e337; + local_26 = _e337; + local_27 = _e337; + local_28 = _e337; + local_29 = _e337; + local_30 = _e337; + if (_e335.member < _e335.member_1) { + phi_1344_ = type_14((_e335.member + 1u), _e335.member_1); + phi_1369_ = type_14(1u, _e335.member); } else { - phi_931_ = _e332; - phi_956_ = type_24(0u, type_24().member_1); + phi_1344_ = _e335; + phi_1369_ = type_14(0u, type_14().member_1); } - let _e347 = phi_931_; - let _e349 = phi_956_; - switch bitcast(_e349.member) { + let _e350 = phi_1344_; + let _e352 = phi_1369_; + switch bitcast(_e352.member) { case 0: { - phi_934_ = type_30(); - phi_1112_ = false; + phi_1347_ = type_30(); + phi_1525_ = false; break; } case 1: { - if (_e349.member_1 >= _e138) { - phi_973_ = 4294967295u; + if (_e352.member_1 >= _e141) { + phi_1386_ = 4294967295u; } else { - phi_973_ = (_e134 + (2u * _e349.member_1)); + phi_1386_ = (_e137 + (2u * _e352.member_1)); } - let _e357 = phi_973_; - if (_e98 >= 2u) { - phi_2926_ = (_e357 <= (_e98 - 2u)); + let _e360 = phi_1386_; + if (_e101 >= 2u) { + phi_2901_ = (_e360 <= (_e101 - 2u)); } else { - phi_2926_ = false; + phi_2901_ = false; } - let _e362 = phi_2926_; - if _e362 { - let _e365 = global_2.member[_e357]; - let _e369 = global_2.member[(_e357 + 1u)]; - phi_991_ = type_24(_e365, _e369); + let _e365 = phi_2901_; + if _e365 { + let _e368 = global.member[_e360]; + let _e372 = global.member[(_e360 + 1u)]; + phi_1404_ = type_14(_e368, _e372); } else { - phi_991_ = type_24(4294967295u, 0u); + phi_1404_ = type_14(4294967295u, 0u); } - let _e372 = phi_991_; - if (_e167 >= _e372.member_1) { - phi_2952_ = 4294967295u; + let _e375 = phi_1404_; + if (_e170 >= _e375.member_1) { + phi_2927_ = 4294967295u; } else { - phi_2952_ = (_e372.member + (9u * _e167)); + phi_2927_ = (_e375.member + (9u * _e170)); } - let _e379 = phi_2952_; - if (_e98 >= 9u) { - phi_2971_ = (_e379 <= (_e98 - 9u)); + let _e382 = phi_2927_; + if (_e101 >= 9u) { + phi_2946_ = (_e382 <= (_e101 - 9u)); } else { - phi_2971_ = false; + phi_2946_ = false; } - let _e384 = phi_2971_; - 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_1041_ = type_33(vec3(bitcast(_e387), bitcast(_e392), bitcast(_e397)), vec3(bitcast(_e403), bitcast(_e408), bitcast(_e413)), vec3(bitcast(_e419), bitcast(_e424), bitcast(_e429))); + let _e387 = phi_2946_; + if _e387 { + let _e390 = global.member[_e382]; + let _e395 = global.member[(_e382 + 1u)]; + let _e400 = global.member[(_e382 + 2u)]; + let _e406 = global.member[(_e382 + 3u)]; + let _e411 = global.member[(_e382 + 4u)]; + let _e416 = global.member[(_e382 + 5u)]; + let _e422 = global.member[(_e382 + 6u)]; + let _e427 = global.member[(_e382 + 7u)]; + let _e432 = global.member[(_e382 + 8u)]; + phi_1454_ = type_33(vec3(bitcast(_e390), bitcast(_e395), bitcast(_e400)), vec3(bitcast(_e406), bitcast(_e411), bitcast(_e416)), vec3(bitcast(_e422), bitcast(_e427), bitcast(_e432))); } else { - phi_1041_ = type_33(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); + phi_1454_ = type_33(vec3(0f, 0f, 0f), vec3(0f, 0f, 0f), vec3(0f, 0f, 0f)); } - let _e434 = phi_1041_; - if (_e349.member_1 >= _e146) { - phi_1051_ = 4294967295u; + let _e437 = phi_1454_; + if (_e352.member_1 >= _e149) { + phi_1464_ = 4294967295u; } else { - phi_1051_ = (_e142 + _e349.member_1); + phi_1464_ = (_e145 + _e352.member_1); } - let _e438 = phi_1051_; - if (_e98 >= 1u) { - phi_2993_ = (_e438 <= (_e98 - 1u)); + let _e441 = phi_1464_; + if (_e101 >= 1u) { + phi_2968_ = (_e441 <= (_e101 - 1u)); } else { - phi_2993_ = false; + phi_2968_ = false; } - let _e443 = phi_2993_; - if _e443 { - let _e446 = global_2.member[_e438]; - phi_1059_ = bitcast(_e446); + let _e446 = phi_2968_; + if _e446 { + let _e449 = global.member[_e441]; + phi_1472_ = bitcast(_e449); } else { - phi_1059_ = 0f; + phi_1472_ = 0f; } - let _e449 = phi_1059_; - 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_934_ = 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_1112_ = true; + let _e452 = phi_1472_; + let _e475 = type_30(vec3(fma(_e452, _e437.member.x, _e337.member.x), fma(_e452, _e437.member.y, _e337.member.y), fma(_e452, _e437.member.z, _e337.member.z)), _e337.member_1, _e337.member_2, _e337.member_3, _e337.member_4, _e337.member_5, _e337.member_6, _e337.member_7); + let _e498 = type_30(_e475.member, _e475.member_1, vec3(fma(_e452, _e437.member_1.x, _e337.member_2.x), fma(_e452, _e437.member_1.y, _e337.member_2.y), fma(_e452, _e437.member_1.z, _e337.member_2.z)), _e475.member_3, _e475.member_4, _e475.member_5, _e475.member_6, _e475.member_7); + phi_1347_ = type_30(_e498.member, _e498.member_1, _e498.member_2, vec4(fma(_e452, _e437.member_2.x, _e337.member_3.x), fma(_e452, _e437.member_2.y, _e337.member_3.y), fma(_e452, _e437.member_2.z, _e337.member_3.z), _e337.member_3.w), _e498.member_4, _e498.member_5, _e498.member_6, _e498.member_7); + phi_1525_ = true; break; } default: { - phi_934_ = type_30(); - phi_1112_ = bool(); + phi_1347_ = type_30(); + phi_1525_ = bool(); break; } } - let _e522 = phi_934_; - let _e524 = phi_1112_; + let _e525 = phi_1347_; + let _e527 = phi_1525_; continue; continuing { - phi_930_ = _e347; - phi_933_ = _e522; - break if !(_e524); + phi_1343_ = _e350; + phi_1346_ = _e525; + break if !(_e527); } } - 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_3016_ = (_e130 <= (_e98 - 4u)); + let _e532 = global.member[(_e153 + 6u)]; + if (_e532 == 1u) { + let _e535 = ((_e133 == 4294967295u) != true); + if _e535 { + if (_e101 >= 4u) { + phi_2988_ = (_e133 <= (_e101 - 4u)); } else { - phi_3016_ = false; + phi_2988_ = false; } - let _e546 = phi_3016_; - 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_1236_ = type_34(type_24(_e549, _e553), type_24(_e557, _e561)); + let _e540 = phi_2988_; + if _e540 { + let _e543 = global.member[_e133]; + let _e547 = global.member[(_e133 + 1u)]; + let _e551 = global.member[(_e133 + 2u)]; + let _e555 = global.member[(_e133 + 3u)]; + phi_1621_ = type_34(type_14(_e543, _e547), type_14(_e551, _e555)); } else { - phi_1236_ = type_34(type_24(4294967295u, 0u), type_24(4294967295u, 0u)); + phi_1621_ = type_34(type_14(4294967295u, 0u), type_14(4294967295u, 0u)); } - let _e566 = phi_1236_; - let _e568 = local_9; - local = _e568.member_5; - phi_1239_ = type_24(0u, 4u); - phi_1242_ = type_20(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); + let _e560 = phi_1621_; + let _e562 = local_6; + local = _e562.member_5; + phi_1624_ = type_14(0u, 4u); + phi_1627_ = type_21(vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f), vec4(0f, 0f, 0f, 0f)); loop { - let _e571 = phi_1239_; - let _e573 = phi_1242_; - 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_1240_ = type_24((_e571.member + 1u), _e571.member_1); - phi_1265_ = type_24(1u, _e571.member); + let _e565 = phi_1624_; + let _e567 = phi_1627_; + local_8 = _e567; + local_9 = _e567; + local_10 = _e567; + local_11 = _e567; + local_12 = _e567; + local_13 = _e567; + local_14 = _e567; + local_15 = _e567; + local_16 = _e567; + local_17 = _e567; + local_18 = _e567; + local_19 = _e567; + local_20 = _e567; + local_21 = _e567; + local_22 = _e567; + local_23 = _e567; + local_31 = _e567; + if (_e565.member < _e565.member_1) { + phi_1625_ = type_14((_e565.member + 1u), _e565.member_1); + phi_1650_ = type_14(1u, _e565.member); } else { - phi_1240_ = _e571; - phi_1265_ = type_24(0u, type_24().member_1); + phi_1625_ = _e565; + phi_1650_ = type_14(0u, type_14().member_1); } - let _e586 = phi_1240_; - let _e588 = phi_1265_; - switch bitcast(_e588.member) { + let _e580 = phi_1625_; + let _e582 = phi_1650_; + switch bitcast(_e582.member) { case 0: { - phi_1243_ = type_20(); - phi_1667_ = false; + phi_1628_ = type_21(); + phi_2052_ = false; break; } case 1: { - let _e593 = local_10; - local_1 = _e593.member_4; - let _e595 = (_e588.member_1 < 4u); - if _e595 { + let _e587 = local_7; + local_1 = _e587.member_4; + let _e589 = (_e582.member_1 < 4u); + if _e589 { } else { - phi_3915_ = true; + phi_3887_ = true; break; } - let _e597 = local_1[_e588.member_1]; - if (_e597 >= _e566.member.member_1) { - phi_1289_ = 4294967295u; + let _e591 = local_1[_e582.member_1]; + if (_e591 >= _e560.member.member_1) { + phi_1674_ = 4294967295u; } else { - phi_1289_ = (_e566.member.member + _e597); + phi_1674_ = (_e560.member.member + _e591); } - let _e605 = phi_1289_; - if (_e98 >= 1u) { - phi_3050_ = (_e605 <= (_e98 - 1u)); + let _e599 = phi_1674_; + if (_e101 >= 1u) { + phi_3022_ = (_e599 <= (_e101 - 1u)); } else { - phi_3050_ = false; + phi_3022_ = false; } - let _e610 = phi_3050_; - if _e610 { - let _e613 = global_2.member[_e605]; - phi_1298_ = _e613; + let _e604 = phi_3022_; + if _e604 { + let _e607 = global.member[_e599]; + phi_1683_ = _e607; } else { - phi_1298_ = 4294967295u; + phi_1683_ = 4294967295u; } - let _e615 = phi_1298_; - if (_e98 >= 10u) { - phi_3074_ = (_e615 <= (_e98 - 10u)); + let _e609 = phi_1683_; + if (_e101 >= 10u) { + phi_3046_ = (_e609 <= (_e101 - 10u)); } else { - phi_3074_ = false; + phi_3046_ = false; } - let _e620 = phi_3074_; - 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_1347_ = 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))); + let _e614 = phi_3046_; + if _e614 { + let _e617 = global.member[_e609]; + let _e622 = global.member[(_e609 + 1u)]; + let _e627 = global.member[(_e609 + 2u)]; + let _e633 = global.member[(_e609 + 3u)]; + let _e638 = global.member[(_e609 + 4u)]; + let _e643 = global.member[(_e609 + 5u)]; + let _e648 = global.member[(_e609 + 6u)]; + let _e654 = global.member[(_e609 + 7u)]; + let _e659 = global.member[(_e609 + 8u)]; + let _e664 = global.member[(_e609 + 9u)]; + phi_1732_ = type_27(vec3(bitcast(_e617), bitcast(_e622), bitcast(_e627)), vec4(bitcast(_e633), bitcast(_e638), bitcast(_e643), bitcast(_e648)), vec3(bitcast(_e654), bitcast(_e659), bitcast(_e664))); } else { - phi_1347_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_1732_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e675 = phi_1347_; - if (_e597 >= _e566.member_1.member_1) { - phi_1357_ = 4294967295u; + let _e669 = phi_1732_; + if (_e591 >= _e560.member_1.member_1) { + phi_1742_ = 4294967295u; } else { - phi_1357_ = (_e566.member_1.member + (16u * _e597)); + phi_1742_ = (_e560.member_1.member + (16u * _e591)); } - let _e684 = phi_1357_; - if (_e98 >= 16u) { - phi_3099_ = (_e684 <= (_e98 - 16u)); + let _e678 = phi_1742_; + if (_e101 >= 16u) { + phi_3071_ = (_e678 <= (_e101 - 16u)); } else { - phi_3099_ = false; + phi_3071_ = false; } - let _e689 = phi_3099_; - 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_1430_ = 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))); + let _e683 = phi_3071_; + if _e683 { + let _e686 = global.member[_e678]; + let _e691 = global.member[(_e678 + 1u)]; + let _e696 = global.member[(_e678 + 2u)]; + let _e701 = global.member[(_e678 + 3u)]; + let _e707 = global.member[(_e678 + 4u)]; + let _e712 = global.member[(_e678 + 5u)]; + let _e717 = global.member[(_e678 + 6u)]; + let _e722 = global.member[(_e678 + 7u)]; + let _e728 = global.member[(_e678 + 8u)]; + let _e733 = global.member[(_e678 + 9u)]; + let _e738 = global.member[(_e678 + 10u)]; + let _e743 = global.member[(_e678 + 11u)]; + let _e749 = global.member[(_e678 + 12u)]; + let _e754 = global.member[(_e678 + 13u)]; + let _e759 = global.member[(_e678 + 14u)]; + let _e764 = global.member[(_e678 + 15u)]; + phi_1815_ = type_21(vec4(bitcast(_e686), bitcast(_e691), bitcast(_e696), bitcast(_e701)), vec4(bitcast(_e707), bitcast(_e712), bitcast(_e717), bitcast(_e722)), vec4(bitcast(_e728), bitcast(_e733), bitcast(_e738), bitcast(_e743)), vec4(bitcast(_e749), bitcast(_e754), bitcast(_e759), bitcast(_e764))); } else { - phi_1430_ = type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); + phi_1815_ = type_21(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); } - let _e775 = phi_1430_; - 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 { + let _e769 = phi_1815_; + let _e777 = (_e669.member_1.x + _e669.member_1.x); + let _e778 = (_e669.member_1.y + _e669.member_1.y); + let _e779 = (_e669.member_1.z + _e669.member_1.z); + let _e781 = (_e669.member_1.z * _e779); + let _e782 = (_e669.member_1.w * _e777); + let _e783 = (_e669.member_1.w * _e778); + let _e784 = (_e669.member_1.w * _e779); + let _e804 = (vec4((1f - fma(_e669.member_1.y, _e778, _e781)), fma(_e669.member_1.x, _e778, _e784), fma(_e669.member_1.x, _e779, -(_e783)), 0f) * _e669.member_2.x); + let _e806 = (vec4(fma(_e669.member_1.x, _e778, -(_e784)), (1f - fma(_e669.member_1.x, _e777, _e781)), fma(_e669.member_1.y, _e779, _e782), 0f) * _e669.member_2.y); + let _e808 = (vec4(fma(_e669.member_1.x, _e779, _e783), fma(_e669.member_1.y, _e779, -(_e782)), (1f - fma(_e669.member_1.x, _e777, (_e669.member_1.y * _e778))), 0f) * _e669.member_2.z); + if _e589 { } else { - phi_3915_ = true; + phi_3887_ = true; break; } - let _e919 = local[_e588.member_1]; - phi_1243_ = 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_1667_ = true; + let _e913 = local[_e582.member_1]; + phi_1628_ = type_21((_e567.member + (vec4(fma(_e669.member.x, _e769.member.w, fma(_e808.x, _e769.member.z, fma(_e804.x, _e769.member.x, (_e806.x * _e769.member.y)))), fma(_e669.member.y, _e769.member.w, fma(_e808.y, _e769.member.z, fma(_e804.y, _e769.member.x, (_e806.y * _e769.member.y)))), fma(_e669.member.z, _e769.member.w, fma(_e808.z, _e769.member.z, fma(_e804.z, _e769.member.x, (_e806.z * _e769.member.y)))), (fma(_e808.w, _e769.member.z, fma(_e804.w, _e769.member.x, (_e806.w * _e769.member.y))) + _e769.member.w)) * _e913)), (_e567.member_1 + (vec4(fma(_e669.member.x, _e769.member_1.w, fma(_e808.x, _e769.member_1.z, fma(_e804.x, _e769.member_1.x, (_e806.x * _e769.member_1.y)))), fma(_e669.member.y, _e769.member_1.w, fma(_e808.y, _e769.member_1.z, fma(_e804.y, _e769.member_1.x, (_e806.y * _e769.member_1.y)))), fma(_e669.member.z, _e769.member_1.w, fma(_e808.z, _e769.member_1.z, fma(_e804.z, _e769.member_1.x, (_e806.z * _e769.member_1.y)))), (fma(_e808.w, _e769.member_1.z, fma(_e804.w, _e769.member_1.x, (_e806.w * _e769.member_1.y))) + _e769.member_1.w)) * _e913)), (_e567.member_2 + (vec4(fma(_e669.member.x, _e769.member_2.w, fma(_e808.x, _e769.member_2.z, fma(_e804.x, _e769.member_2.x, (_e806.x * _e769.member_2.y)))), fma(_e669.member.y, _e769.member_2.w, fma(_e808.y, _e769.member_2.z, fma(_e804.y, _e769.member_2.x, (_e806.y * _e769.member_2.y)))), fma(_e669.member.z, _e769.member_2.w, fma(_e808.z, _e769.member_2.z, fma(_e804.z, _e769.member_2.x, (_e806.z * _e769.member_2.y)))), (fma(_e808.w, _e769.member_2.z, fma(_e804.w, _e769.member_2.x, (_e806.w * _e769.member_2.y))) + _e769.member_2.w)) * _e913)), (_e567.member_3 + (vec4(fma(_e669.member.x, _e769.member_3.w, fma(_e808.x, _e769.member_3.z, fma(_e804.x, _e769.member_3.x, (_e806.x * _e769.member_3.y)))), fma(_e669.member.y, _e769.member_3.w, fma(_e808.y, _e769.member_3.z, fma(_e804.y, _e769.member_3.x, (_e806.y * _e769.member_3.y)))), fma(_e669.member.z, _e769.member_3.w, fma(_e808.z, _e769.member_3.z, fma(_e804.z, _e769.member_3.x, (_e806.z * _e769.member_3.y)))), (fma(_e808.w, _e769.member_3.z, fma(_e804.w, _e769.member_3.x, (_e806.w * _e769.member_3.y))) + _e769.member_3.w)) * _e913))); + phi_2052_ = true; break; } default: { - phi_1243_ = type_20(); - phi_1667_ = bool(); + phi_1628_ = type_21(); + phi_2052_ = bool(); break; } } - let _e934 = phi_1243_; - let _e936 = phi_1667_; + let _e928 = phi_1628_; + let _e930 = phi_2052_; continue; continuing { - phi_1239_ = _e586; - phi_1242_ = _e934; - phi_3915_ = false; - break if !(_e936); + phi_1624_ = _e580; + phi_1627_ = _e928; + phi_3887_ = false; + break if !(_e930); } } - let _e939 = phi_3915_; - if _e939 { + let _e933 = phi_3887_; + if _e933 { break; } - 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_1694_ = (_e965.member.w == _e970); + let _e935 = local_8; + let _e940 = global_4.member[0u]; + if (_e935.member.x == _e940) { + let _e943 = local_9; + let _e948 = global_4.member[1u]; + if (_e943.member.y == _e948) { + let _e951 = local_10; + let _e956 = global_4.member[2u]; + let _e957 = (_e951.member.z == _e956); + if _e957 { + let _e959 = local_11; + let _e964 = global_4.member[3u]; + phi_2079_ = (_e959.member.w == _e964); } else { - phi_1694_ = bool(); + phi_2079_ = bool(); } - let _e973 = phi_1694_; - phi_1696_ = _e973; - phi_1697_ = select(true, false, _e963); + let _e967 = phi_2079_; + phi_2081_ = _e967; + phi_2082_ = select(true, false, _e957); } else { - phi_1696_ = bool(); - phi_1697_ = true; + phi_2081_ = bool(); + phi_2082_ = true; } - let _e976 = phi_1696_; - let _e978 = phi_1697_; - phi_1698_ = _e976; - phi_1699_ = _e978; + let _e970 = phi_2081_; + let _e972 = phi_2082_; + phi_2083_ = _e970; + phi_2084_ = _e972; } else { - phi_1698_ = bool(); - phi_1699_ = true; + phi_2083_ = bool(); + phi_2084_ = true; } - let _e980 = phi_1698_; - let _e982 = phi_1699_; - 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_1733_ = (_e1009.member_1.w == _e1014); + let _e974 = phi_2083_; + let _e976 = phi_2084_; + if select(_e974, false, _e976) { + let _e979 = local_12; + let _e984 = global_4.member_1[0u]; + if (_e979.member_1.x == _e984) { + let _e987 = local_13; + let _e992 = global_4.member_1[1u]; + if (_e987.member_1.y == _e992) { + let _e995 = local_14; + let _e1000 = global_4.member_1[2u]; + let _e1001 = (_e995.member_1.z == _e1000); + if _e1001 { + let _e1003 = local_15; + let _e1008 = global_4.member_1[3u]; + phi_2118_ = (_e1003.member_1.w == _e1008); } else { - phi_1733_ = bool(); + phi_2118_ = bool(); } - let _e1017 = phi_1733_; - phi_1735_ = _e1017; - phi_1736_ = select(true, false, _e1007); + let _e1011 = phi_2118_; + phi_2120_ = _e1011; + phi_2121_ = select(true, false, _e1001); } else { - phi_1735_ = bool(); - phi_1736_ = true; + phi_2120_ = bool(); + phi_2121_ = true; } - let _e1020 = phi_1735_; - let _e1022 = phi_1736_; - phi_1737_ = _e1020; - phi_1738_ = _e1022; + let _e1014 = phi_2120_; + let _e1016 = phi_2121_; + phi_2122_ = _e1014; + phi_2123_ = _e1016; } else { - phi_1737_ = bool(); - phi_1738_ = true; + phi_2122_ = bool(); + phi_2123_ = true; } - let _e1024 = phi_1737_; - let _e1026 = phi_1738_; - 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_1772_ = (_e1053.member_2.w == _e1058); + let _e1018 = phi_2122_; + let _e1020 = phi_2123_; + if select(_e1018, false, _e1020) { + let _e1023 = local_16; + let _e1028 = global_4.member_2[0u]; + if (_e1023.member_2.x == _e1028) { + let _e1031 = local_17; + let _e1036 = global_4.member_2[1u]; + if (_e1031.member_2.y == _e1036) { + let _e1039 = local_18; + let _e1044 = global_4.member_2[2u]; + let _e1045 = (_e1039.member_2.z == _e1044); + if _e1045 { + let _e1047 = local_19; + let _e1052 = global_4.member_2[3u]; + phi_2157_ = (_e1047.member_2.w == _e1052); } else { - phi_1772_ = bool(); + phi_2157_ = bool(); } - let _e1061 = phi_1772_; - phi_1774_ = _e1061; - phi_1775_ = select(true, false, _e1051); + let _e1055 = phi_2157_; + phi_2159_ = _e1055; + phi_2160_ = select(true, false, _e1045); } else { - phi_1774_ = bool(); - phi_1775_ = true; + phi_2159_ = bool(); + phi_2160_ = true; } - let _e1064 = phi_1774_; - let _e1066 = phi_1775_; - phi_1776_ = _e1064; - phi_1777_ = _e1066; + let _e1058 = phi_2159_; + let _e1060 = phi_2160_; + phi_2161_ = _e1058; + phi_2162_ = _e1060; } else { - phi_1776_ = bool(); - phi_1777_ = true; + phi_2161_ = bool(); + phi_2162_ = true; } - let _e1068 = phi_1776_; - let _e1070 = phi_1777_; - 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_1811_ = (_e1097.member_3.w == _e1102); + let _e1062 = phi_2161_; + let _e1064 = phi_2162_; + let _e1065 = select(_e1062, false, _e1064); + if _e1065 { + let _e1067 = local_20; + let _e1072 = global_4.member_3[0u]; + if (_e1067.member_3.x == _e1072) { + let _e1075 = local_21; + let _e1080 = global_4.member_3[1u]; + if (_e1075.member_3.y == _e1080) { + let _e1083 = local_22; + let _e1088 = global_4.member_3[2u]; + let _e1089 = (_e1083.member_3.z == _e1088); + if _e1089 { + let _e1091 = local_23; + let _e1096 = global_4.member_3[3u]; + phi_2196_ = (_e1091.member_3.w == _e1096); } else { - phi_1811_ = bool(); + phi_2196_ = bool(); } - let _e1105 = phi_1811_; - phi_1813_ = _e1105; - phi_1814_ = select(true, false, _e1095); + let _e1099 = phi_2196_; + phi_2198_ = _e1099; + phi_2199_ = select(true, false, _e1089); } else { - phi_1813_ = bool(); - phi_1814_ = true; + phi_2198_ = bool(); + phi_2199_ = true; } - let _e1108 = phi_1813_; - let _e1110 = phi_1814_; - phi_1815_ = _e1108; - phi_1816_ = _e1110; + let _e1102 = phi_2198_; + let _e1104 = phi_2199_; + phi_2200_ = _e1102; + phi_2201_ = _e1104; } else { - phi_1815_ = bool(); - phi_1816_ = true; + phi_2200_ = bool(); + phi_2201_ = true; } - let _e1112 = phi_1815_; - let _e1114 = phi_1816_; - phi_1821_ = select(_e1112, false, _e1114); + let _e1106 = phi_2200_; + let _e1108 = phi_2201_; + phi_2206_ = select(_e1106, false, _e1108); } else { - phi_1821_ = bool(); + phi_2206_ = bool(); } - let _e1117 = phi_1821_; - phi_1823_ = _e1117; - phi_1824_ = select(true, false, _e1071); + let _e1111 = phi_2206_; + phi_2208_ = _e1111; + phi_2209_ = select(true, false, _e1065); } else { - phi_1823_ = bool(); - phi_1824_ = true; + phi_2208_ = bool(); + phi_2209_ = true; } - let _e1120 = phi_1823_; - let _e1122 = phi_1824_; - phi_1825_ = _e1120; - phi_1826_ = _e1122; + let _e1114 = phi_2208_; + let _e1116 = phi_2209_; + phi_2210_ = _e1114; + phi_2211_ = _e1116; } else { - phi_1825_ = bool(); - phi_1826_ = true; + phi_2210_ = bool(); + phi_2211_ = true; } - let _e1124 = phi_1825_; - let _e1126 = phi_1826_; - if select(_e1124, false, _e1126) { - phi_1834_ = type_20(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); + let _e1118 = phi_2210_; + let _e1120 = phi_2211_; + if select(_e1118, false, _e1120) { + phi_2219_ = type_21(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)); } else { - let _e2056 = local_31; - phi_1834_ = _e2056; + let _e2072 = local_31; + phi_2219_ = _e2072; } - let _e1129 = phi_1834_; - 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_3346_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); - phi_3347_ = type_27(); - phi_3348_ = true; + let _e1123 = phi_2219_; + let _e1146 = fma(_e1123.member_2.z, _e1123.member_3.w, -((_e1123.member_2.w * _e1123.member_3.z))); + let _e1149 = fma(_e1123.member_2.y, _e1123.member_3.w, -((_e1123.member_2.w * _e1123.member_3.y))); + let _e1152 = fma(_e1123.member_2.y, _e1123.member_3.z, -((_e1123.member_2.z * _e1123.member_3.y))); + let _e1155 = fma(_e1123.member_2.x, _e1123.member_3.w, -((_e1123.member_2.w * _e1123.member_3.x))); + let _e1158 = fma(_e1123.member_2.x, _e1123.member_3.z, -((_e1123.member_2.z * _e1123.member_3.x))); + let _e1161 = fma(_e1123.member_2.x, _e1123.member_3.y, -((_e1123.member_2.y * _e1123.member_3.x))); + let _e1183 = fma(-(_e1123.member.w), fma(_e1123.member_1.z, _e1161, fma(_e1123.member_1.x, _e1152, -((_e1123.member_1.y * _e1158)))), fma(_e1123.member.z, fma(_e1123.member_1.w, _e1161, fma(_e1123.member_1.x, _e1149, -((_e1123.member_1.y * _e1155)))), fma(_e1123.member.x, fma(_e1123.member_1.w, _e1152, fma(_e1123.member_1.y, _e1146, -((_e1123.member_1.z * _e1149)))), -((_e1123.member.y * fma(_e1123.member_1.w, _e1158, fma(_e1123.member_1.x, _e1146, -((_e1123.member_1.z * _e1155))))))))); + if (_e1183 == 0f) { + phi_3318_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); + phi_3319_ = type_27(); + phi_3320_ = true; } else { - 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_3234_ = select(true, false, (_e1203 != 0f)); + let _e1192 = (sqrt(fma(_e1123.member.w, _e1123.member.w, fma(_e1123.member.z, _e1123.member.z, fma(_e1123.member.x, _e1123.member.x, (_e1123.member.y * _e1123.member.y))))) * select(-1f, 1f, (_e1183 >= 0f))); + let _e1197 = sqrt(fma(_e1123.member_1.w, _e1123.member_1.w, fma(_e1123.member_1.z, _e1123.member_1.z, fma(_e1123.member_1.x, _e1123.member_1.x, (_e1123.member_1.y * _e1123.member_1.y))))); + let _e1202 = sqrt(fma(_e1123.member_2.w, _e1123.member_2.w, fma(_e1123.member_2.z, _e1123.member_2.z, fma(_e1123.member_2.x, _e1123.member_2.x, (_e1123.member_2.y * _e1123.member_2.y))))); + if (_e1192 != 0f) { + phi_3206_ = select(true, false, (_e1197 != 0f)); } else { - phi_3234_ = true; + phi_3206_ = true; } - let _e1215 = phi_3234_; - 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 _e1259 = fma(_e1129.member_1.y, _e1218, -(_e1220)); - let _e1261 = fma(-(_e1129.member_2.z), _e1219, 1f); - if (_e1259 <= 0f) { - let _e1275 = (_e1261 - _e1259); - let _e1277 = (0.5f / sqrt(_e1275)); - phi_3329_ = vec4((_e1275 * _e1277), (fma(_e1129.member.y, _e1217, _e1222) * _e1277), (fma(_e1129.member.z, _e1217, _e1223) * _e1277), (fma(_e1129.member_1.z, _e1218, -(_e1224)) * _e1277)); + let _e1209 = phi_3206_; + let _e1210 = select((_e1202 != 0f), false, _e1209); + if _e1210 { + let _e1211 = (1f / _e1192); + let _e1212 = (1f / _e1197); + let _e1213 = (1f / _e1202); + let _e1214 = (_e1123.member.x * _e1211); + let _e1215 = (_e1123.member.z * _e1211); + let _e1216 = (_e1123.member_1.x * _e1212); + let _e1217 = (_e1123.member_2.x * _e1213); + let _e1218 = (_e1123.member_2.y * _e1213); + if ((_e1123.member_2.z * _e1213) <= 0f) { + let _e1253 = fma(_e1123.member_1.y, _e1212, -(_e1214)); + let _e1255 = fma(-(_e1123.member_2.z), _e1213, 1f); + if (_e1253 <= 0f) { + let _e1269 = (_e1255 - _e1253); + let _e1271 = (0.5f / sqrt(_e1269)); + phi_3301_ = vec4((_e1269 * _e1271), (fma(_e1123.member.y, _e1211, _e1216) * _e1271), (fma(_e1123.member.z, _e1211, _e1217) * _e1271), (fma(_e1123.member_1.z, _e1212, -(_e1218)) * _e1271)); } else { - let _e1263 = (_e1261 + _e1259); - let _e1265 = (0.5f / sqrt(_e1263)); - phi_3329_ = vec4((fma(_e1129.member.y, _e1217, _e1222) * _e1265), (_e1263 * _e1265), (fma(_e1129.member_1.z, _e1218, _e1224) * _e1265), (fma(_e1129.member_2.x, _e1219, -(_e1221)) * _e1265)); + let _e1257 = (_e1255 + _e1253); + let _e1259 = (0.5f / sqrt(_e1257)); + phi_3301_ = vec4((fma(_e1123.member.y, _e1211, _e1216) * _e1259), (_e1257 * _e1259), (fma(_e1123.member_1.z, _e1212, _e1218) * _e1259), (fma(_e1123.member_2.x, _e1213, -(_e1215)) * _e1259)); } - let _e1288 = phi_3329_; - phi_3331_ = _e1288; + let _e1282 = phi_3301_; + phi_3303_ = _e1282; } else { - let _e1227 = fma(_e1129.member_1.y, _e1218, _e1220); - let _e1228 = fma(_e1129.member_2.z, _e1219, 1f); - if (_e1227 <= 0f) { - let _e1244 = (_e1228 - _e1227); - let _e1246 = (0.5f / sqrt(_e1244)); - phi_3299_ = vec4((fma(_e1129.member.z, _e1217, _e1223) * _e1246), (fma(_e1129.member_1.z, _e1218, _e1224) * _e1246), (_e1244 * _e1246), (fma(_e1129.member.y, _e1217, -(_e1222)) * _e1246)); + let _e1221 = fma(_e1123.member_1.y, _e1212, _e1214); + let _e1222 = fma(_e1123.member_2.z, _e1213, 1f); + if (_e1221 <= 0f) { + let _e1238 = (_e1222 - _e1221); + let _e1240 = (0.5f / sqrt(_e1238)); + phi_3271_ = vec4((fma(_e1123.member.z, _e1211, _e1217) * _e1240), (fma(_e1123.member_1.z, _e1212, _e1218) * _e1240), (_e1238 * _e1240), (fma(_e1123.member.y, _e1211, -(_e1216)) * _e1240)); } else { - let _e1230 = (_e1228 + _e1227); - let _e1232 = (0.5f / sqrt(_e1230)); - phi_3299_ = vec4((fma(_e1129.member_1.z, _e1218, -(_e1224)) * _e1232), (fma(_e1129.member_2.x, _e1219, -(_e1221)) * _e1232), (fma(_e1129.member.y, _e1217, -(_e1222)) * _e1232), (_e1230 * _e1232)); + let _e1224 = (_e1222 + _e1221); + let _e1226 = (0.5f / sqrt(_e1224)); + phi_3271_ = vec4((fma(_e1123.member_1.z, _e1212, -(_e1218)) * _e1226), (fma(_e1123.member_2.x, _e1213, -(_e1215)) * _e1226), (fma(_e1123.member.y, _e1211, -(_e1216)) * _e1226), (_e1224 * _e1226)); } - let _e1257 = phi_3299_; - phi_3331_ = _e1257; + let _e1251 = phi_3271_; + phi_3303_ = _e1251; } - let _e1290 = phi_3331_; - phi_3340_ = type_27(vec3(_e1198, _e1203, _e1208), _e1290, vec3(_e1129.member_3.x, _e1129.member_3.y, _e1129.member_3.z)); - phi_3341_ = type_27(); + let _e1284 = phi_3303_; + phi_3312_ = type_27(vec3(_e1192, _e1197, _e1202), _e1284, vec3(_e1123.member_3.x, _e1123.member_3.y, _e1123.member_3.z)); + phi_3313_ = type_27(); } else { - phi_3340_ = type_27(); - phi_3341_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); + phi_3312_ = type_27(); + phi_3313_ = type_27(vec3(1f, 1f, 1f), vec4(0f, 0f, 0f, 1f), vec3(0f, 0f, 0f)); } - let _e1294 = phi_3340_; - let _e1296 = phi_3341_; - phi_3346_ = _e1296; - phi_3347_ = _e1294; - phi_3348_ = select(true, false, _e1216); + let _e1288 = phi_3312_; + let _e1290 = phi_3313_; + phi_3318_ = _e1290; + phi_3319_ = _e1288; + phi_3320_ = select(true, false, _e1210); } - let _e1299 = phi_3346_; - let _e1301 = phi_3347_; - let _e1303 = phi_3348_; - if _e1303 { - phi_3352_ = _e1299; + let _e1293 = phi_3318_; + let _e1295 = phi_3319_; + let _e1297 = phi_3320_; + if _e1297 { + phi_3324_ = _e1293; } else { - phi_3352_ = _e1301; + phi_3324_ = _e1295; } - let _e1305 = phi_3352_; - phi_1836_ = type_27(_e1305.member_2, _e1305.member_1, _e1305.member); + let _e1299 = phi_3324_; + phi_2221_ = type_27(_e1299.member_2, _e1299.member_1, _e1299.member); } else { - phi_1836_ = type_27(); + phi_2221_ = type_27(); } - let _e1311 = phi_1836_; - phi_1838_ = _e1311; - phi_1839_ = select(true, false, _e541); + let _e1305 = phi_2221_; + phi_2223_ = _e1305; + phi_2224_ = select(true, false, _e535); } else { - phi_1838_ = type_27(); - phi_1839_ = true; + phi_2223_ = type_27(); + phi_2224_ = true; } - let _e1314 = phi_1838_; - let _e1316 = phi_1839_; - if _e1316 { - if (_e98 >= 10u) { - phi_3446_ = (_e126 <= (_e98 - 10u)); + let _e1308 = phi_2223_; + let _e1310 = phi_2224_; + if _e1310 { + if (_e101 >= 10u) { + phi_3418_ = (_e129 <= (_e101 - 10u)); } else { - phi_3446_ = false; + phi_3418_ = false; } - let _e1321 = phi_3446_; - 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_1892_ = 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))); + let _e1315 = phi_3418_; + if _e1315 { + let _e1318 = global.member[_e129]; + let _e1323 = global.member[(_e129 + 1u)]; + let _e1328 = global.member[(_e129 + 2u)]; + let _e1334 = global.member[(_e129 + 3u)]; + let _e1339 = global.member[(_e129 + 4u)]; + let _e1344 = global.member[(_e129 + 5u)]; + let _e1349 = global.member[(_e129 + 6u)]; + let _e1355 = global.member[(_e129 + 7u)]; + let _e1360 = global.member[(_e129 + 8u)]; + let _e1365 = global.member[(_e129 + 9u)]; + phi_2277_ = type_27(vec3(bitcast(_e1318), bitcast(_e1323), bitcast(_e1328)), vec4(bitcast(_e1334), bitcast(_e1339), bitcast(_e1344), bitcast(_e1349)), vec3(bitcast(_e1355), bitcast(_e1360), bitcast(_e1365))); } else { - phi_1892_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); + phi_2277_ = type_27(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e1376 = phi_1892_; - phi_1893_ = _e1376; + let _e1370 = phi_2277_; + phi_2278_ = _e1370; } else { - phi_1893_ = _e1314; + phi_2278_ = _e1308; } - let _e1378 = phi_1893_; - 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_1937_ = vec3(0f, 0f, 0f); + let _e1372 = phi_2278_; + let _e1380 = (_e1372.member_1.x + _e1372.member_1.x); + let _e1381 = (_e1372.member_1.y + _e1372.member_1.y); + let _e1382 = (_e1372.member_1.z + _e1372.member_1.z); + let _e1384 = (_e1372.member_1.z * _e1382); + let _e1385 = (_e1372.member_1.w * _e1380); + let _e1386 = (_e1372.member_1.w * _e1381); + let _e1387 = (_e1372.member_1.w * _e1382); + let _e1407 = (vec4((1f - fma(_e1372.member_1.y, _e1381, _e1384)), fma(_e1372.member_1.x, _e1381, _e1387), fma(_e1372.member_1.x, _e1382, -(_e1386)), 0f) * _e1372.member_2.x); + let _e1409 = (vec4(fma(_e1372.member_1.x, _e1381, -(_e1387)), (1f - fma(_e1372.member_1.x, _e1380, _e1384)), fma(_e1372.member_1.y, _e1382, _e1385), 0f) * _e1372.member_2.y); + let _e1411 = (vec4(fma(_e1372.member_1.x, _e1382, _e1386), fma(_e1372.member_1.y, _e1382, -(_e1385)), (1f - fma(_e1372.member_1.x, _e1380, (_e1372.member_1.y * _e1381))), 0f) * _e1372.member_2.z); + let _e1416 = local_24; + let _e1439 = (_e1372.member.x + fma(_e1411.x, _e1416.member.z, fma(_e1409.x, _e1416.member.y, (_e1407.x * _e1416.member.x)))); + let _e1440 = (_e1372.member.y + fma(_e1411.y, _e1416.member.z, fma(_e1409.y, _e1416.member.y, (_e1407.y * _e1416.member.x)))); + let _e1441 = (_e1372.member.z + fma(_e1411.z, _e1416.member.z, fma(_e1409.z, _e1416.member.y, (_e1407.z * _e1416.member.x)))); + let _e1444 = local_25; + global_6 = _e1444.member_1; + let _e1447 = local_26; + global_7 = _e1447.member_6; + let _e1450 = local_27; + global_8 = _e1450.member_7; + global_9 = vec3(_e1439, _e1440, _e1441); + let _e1456 = local_28; + let _e1464 = sqrt(fma(_e1456.member_2.z, _e1456.member_2.z, fma(_e1456.member_2.x, _e1456.member_2.x, (_e1456.member_2.y * _e1456.member_2.y)))); + if (_e1464 == 0f) { + phi_2365_ = vec3(0f, 0f, 0f); } else { - phi_1937_ = (_e1387.member_2 * (1f / _e1395)); + phi_2365_ = (_e1456.member_2 * (1f / _e1464)); } - let _e1400 = phi_1937_; - 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_3490_ = vec3(0f, 0f, 0f); + let _e1469 = phi_2365_; + let _e1471 = local_29; + let _e1480 = sqrt(fma(_e1471.member_3.z, _e1471.member_3.z, fma(_e1471.member_3.x, _e1471.member_3.x, (_e1471.member_3.y * _e1471.member_3.y)))); + if (_e1480 == 0f) { + phi_3509_ = vec3(0f, 0f, 0f); } else { - phi_3490_ = (vec3(_e1402.member_3.x, _e1402.member_3.y, _e1402.member_3.z) * (1f / _e1411)); + phi_3509_ = (vec3(_e1471.member_3.x, _e1471.member_3.y, _e1471.member_3.z) * (1f / _e1480)); } - let _e1416 = phi_3490_; - 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_3572_ = vec3(0f, 0f, 0f); - } else { - phi_3572_ = (vec3(_e1476, _e1477, _e1478) * (1f / _e1483)); - } - let _e1488 = phi_3572_; - 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 _e1485 = phi_3509_; + let _e1487 = (_e1469.x / (_e1372.member_2.x * _e1372.member_2.x)); + let _e1489 = (_e1469.y / (_e1372.member_2.y * _e1372.member_2.y)); + let _e1491 = (_e1469.z / (_e1372.member_2.z * _e1372.member_2.z)); + let _e1498 = fma(_e1411.x, _e1491, fma(_e1407.x, _e1487, (_e1409.x * _e1489))); + let _e1499 = fma(_e1411.y, _e1491, fma(_e1407.y, _e1487, (_e1409.y * _e1489))); + let _e1500 = fma(_e1411.z, _e1491, fma(_e1407.z, _e1487, (_e1409.z * _e1489))); let _e1505 = sqrt(fma(_e1500, _e1500, fma(_e1498, _e1498, (_e1499 * _e1499)))); if (_e1505 == 0f) { - phi_3607_ = vec3(0f, 0f, 0f); + phi_3544_ = vec3(0f, 0f, 0f); } else { - phi_3607_ = (vec3(_e1498, _e1499, _e1500) * (1f / _e1505)); + phi_3544_ = (vec3(_e1498, _e1499, _e1500) * (1f / _e1505)); } - let _e1510 = phi_3607_; + let _e1510 = phi_3544_; 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_3620_ = (_e122 <= (_e98 - 83u)); + let _e1520 = fma(_e1411.x, _e1485.z, fma(_e1407.x, _e1485.x, (_e1409.x * _e1485.y))); + let _e1521 = fma(_e1411.y, _e1485.z, fma(_e1407.y, _e1485.x, (_e1409.y * _e1485.y))); + let _e1522 = fma(_e1411.z, _e1485.z, fma(_e1407.z, _e1485.x, (_e1409.z * _e1485.y))); + let _e1527 = sqrt(fma(_e1522, _e1522, fma(_e1520, _e1520, (_e1521 * _e1521)))); + if (_e1527 == 0f) { + phi_3579_ = vec3(0f, 0f, 0f); + } else { + phi_3579_ = (vec3(_e1520, _e1521, _e1522) * (1f / _e1527)); + } + let _e1532 = phi_3579_; + global_11 = _e1532; + let _e1549 = local_30; + let _e1553 = select(-1f, 1f, (_e1549.member_3.w >= 0f)); + global_12 = vec3((fma(_e1510.y, _e1532.z, -((_e1532.y * _e1510.z))) * _e1553), (fma(_e1510.z, _e1532.x, -((_e1532.z * _e1510.x))) * _e1553), (fma(_e1510.x, _e1532.y, -((_e1532.x * _e1510.y))) * _e1553)); + if (_e101 >= 86u) { + phi_3592_ = (_e125 <= (_e101 - 86u)); } else { - phi_3620_ = false; + phi_3592_ = false; } - let _e1559 = phi_3620_; - 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)]; + let _e1562 = phi_3592_; + if _e1562 { + let _e1565 = global.member[_e125]; + let _e1570 = global.member[(_e125 + 1u)]; + let _e1575 = global.member[(_e125 + 2u)]; + let _e1580 = global.member[(_e125 + 3u)]; + let _e1586 = global.member[(_e125 + 4u)]; + let _e1591 = global.member[(_e125 + 5u)]; + let _e1596 = global.member[(_e125 + 6u)]; + let _e1601 = global.member[(_e125 + 7u)]; + let _e1607 = global.member[(_e125 + 8u)]; + let _e1612 = global.member[(_e125 + 9u)]; + let _e1617 = global.member[(_e125 + 10u)]; + let _e1622 = global.member[(_e125 + 11u)]; + let _e1628 = global.member[(_e125 + 12u)]; + let _e1633 = global.member[(_e125 + 13u)]; + let _e1638 = global.member[(_e125 + 14u)]; + let _e1643 = global.member[(_e125 + 15u)]; + let _e1650 = global.member[(_e125 + 16u)]; + let _e1655 = global.member[(_e125 + 17u)]; + let _e1660 = global.member[(_e125 + 18u)]; + let _e1665 = global.member[(_e125 + 19u)]; + let _e1671 = global.member[(_e125 + 20u)]; + let _e1676 = global.member[(_e125 + 21u)]; + let _e1681 = global.member[(_e125 + 22u)]; + let _e1686 = global.member[(_e125 + 23u)]; + let _e1692 = global.member[(_e125 + 24u)]; + let _e1697 = global.member[(_e125 + 25u)]; + let _e1702 = global.member[(_e125 + 26u)]; + let _e1707 = global.member[(_e125 + 27u)]; + let _e1713 = global.member[(_e125 + 28u)]; + let _e1718 = global.member[(_e125 + 29u)]; + let _e1723 = global.member[(_e125 + 30u)]; + let _e1728 = global.member[(_e125 + 31u)]; + let _e1735 = global.member[(_e125 + 32u)]; + let _e1740 = global.member[(_e125 + 33u)]; + let _e1745 = global.member[(_e125 + 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_2261_ = type_24(0u, 6u); + phi_2649_ = type_14(0u, 6u); loop { - let _e1747 = phi_2261_; - if (_e1747.member < _e1747.member_1) { - phi_2262_ = type_24((_e1747.member + 1u), _e1747.member_1); - phi_2285_ = type_24(1u, _e1747.member); + let _e1750 = phi_2649_; + if (_e1750.member < _e1750.member_1) { + phi_2650_ = type_14((_e1750.member + 1u), _e1750.member_1); + phi_2673_ = type_14(1u, _e1750.member); } else { - phi_2262_ = _e1747; - phi_2285_ = type_24(0u, type_24().member_1); + phi_2650_ = _e1750; + phi_2673_ = type_14(0u, type_14().member_1); } - let _e1760 = phi_2262_; - let _e1762 = phi_2285_; - switch bitcast(_e1762.member) { + let _e1763 = phi_2650_; + let _e1765 = phi_2673_; + switch bitcast(_e1765.member) { case 0: { - phi_2312_ = false; + phi_2700_ = false; break; } case 1: { - 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_2312_ = true; + let _e1770 = ((_e125 + 35u) + (_e1765.member_1 * 4u)); + let _e1773 = global.member[_e1770]; + let _e1778 = global.member[(_e1770 + 1u)]; + let _e1783 = global.member[(_e1770 + 2u)]; + let _e1788 = global.member[(_e1770 + 3u)]; + local_3[_e1765.member_1] = vec4(bitcast(_e1773), bitcast(_e1778), bitcast(_e1783), bitcast(_e1788)); + phi_2700_ = true; break; } default: { - phi_2312_ = bool(); + phi_2700_ = bool(); break; } } - let _e1790 = phi_2312_; + let _e1793 = phi_2700_; continue; continuing { - phi_2261_ = _e1760; - break if !(_e1790); + phi_2649_ = _e1763; + break if !(_e1793); } } - let _e1792 = local_3; + let _e1795 = 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_2318_ = type_24(0u, 8u); + phi_2706_ = type_14(0u, 8u); loop { - let _e1795 = phi_2318_; - if (_e1795.member < _e1795.member_1) { - phi_2319_ = type_24((_e1795.member + 1u), _e1795.member_1); - phi_2342_ = type_24(1u, _e1795.member); + let _e1798 = phi_2706_; + if (_e1798.member < _e1798.member_1) { + phi_2707_ = type_14((_e1798.member + 1u), _e1798.member_1); + phi_2730_ = type_14(1u, _e1798.member); } else { - phi_2319_ = _e1795; - phi_2342_ = type_24(0u, type_24().member_1); + phi_2707_ = _e1798; + phi_2730_ = type_14(0u, type_14().member_1); } - let _e1808 = phi_2319_; - let _e1810 = phi_2342_; - switch bitcast(_e1810.member) { + let _e1811 = phi_2707_; + let _e1813 = phi_2730_; + switch bitcast(_e1813.member) { case 0: { - phi_2365_ = false; + phi_2753_ = false; break; } case 1: { - 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_2365_ = true; + let _e1818 = ((_e125 + 59u) + (_e1813.member_1 * 3u)); + let _e1821 = global.member[_e1818]; + let _e1826 = global.member[(_e1818 + 1u)]; + let _e1831 = global.member[(_e1818 + 2u)]; + local_2[_e1813.member_1] = vec3(bitcast(_e1821), bitcast(_e1826), bitcast(_e1831)); + phi_2753_ = true; break; } default: { - phi_2365_ = bool(); + phi_2753_ = bool(); break; } } - let _e1833 = phi_2365_; + let _e1836 = phi_2753_; continue; continuing { - phi_2318_ = _e1808; - break if !(_e1833); + phi_2706_ = _e1811; + break if !(_e1836); } } - let _e1835 = local_2; - phi_2373_ = 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))); + let _e1838 = local_2; + let _e1842 = global.member[(_e125 + 83u)]; + let _e1847 = global.member[(_e125 + 84u)]; + let _e1852 = global.member[(_e125 + 85u)]; + phi_2774_ = type_23(type_21(vec4(bitcast(_e1565), bitcast(_e1570), bitcast(_e1575), bitcast(_e1580)), vec4(bitcast(_e1586), bitcast(_e1591), bitcast(_e1596), bitcast(_e1601)), vec4(bitcast(_e1607), bitcast(_e1612), bitcast(_e1617), bitcast(_e1622)), vec4(bitcast(_e1628), bitcast(_e1633), bitcast(_e1638), bitcast(_e1643))), type_21(vec4(bitcast(_e1650), bitcast(_e1655), bitcast(_e1660), bitcast(_e1665)), vec4(bitcast(_e1671), bitcast(_e1676), bitcast(_e1681), bitcast(_e1686)), vec4(bitcast(_e1692), bitcast(_e1697), bitcast(_e1702), bitcast(_e1707)), vec4(bitcast(_e1713), bitcast(_e1718), bitcast(_e1723), bitcast(_e1728))), vec3(bitcast(_e1735), bitcast(_e1740), bitcast(_e1745)), type_22(_e1838, _e1795, vec3(bitcast(_e1842), bitcast(_e1847), bitcast(_e1852)))); } else { - phi_2373_ = 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_2774_ = type_23(type_21(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_21(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), vec3(0f, 0f, 0f), type_22(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 _e1839 = phi_2373_; - 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)))))); + let _e1858 = phi_2774_; + global_2 = vec4((fma(fma(_e1858.member.member_3.x, _e1858.member_1.member_2.w, fma(_e1858.member.member_2.x, _e1858.member_1.member_2.z, fma(_e1858.member.member.x, _e1858.member_1.member_2.x, (_e1858.member.member_1.x * _e1858.member_1.member_2.y)))), _e1441, fma(fma(_e1858.member.member_3.x, _e1858.member_1.member.w, fma(_e1858.member.member_2.x, _e1858.member_1.member.z, fma(_e1858.member.member.x, _e1858.member_1.member.x, (_e1858.member.member_1.x * _e1858.member_1.member.y)))), _e1439, (fma(_e1858.member.member_3.x, _e1858.member_1.member_1.w, fma(_e1858.member.member_2.x, _e1858.member_1.member_1.z, fma(_e1858.member.member.x, _e1858.member_1.member_1.x, (_e1858.member.member_1.x * _e1858.member_1.member_1.y)))) * _e1440))) + fma(_e1858.member.member_3.x, _e1858.member_1.member_3.w, fma(_e1858.member.member_2.x, _e1858.member_1.member_3.z, fma(_e1858.member.member.x, _e1858.member_1.member_3.x, (_e1858.member.member_1.x * _e1858.member_1.member_3.y))))), (fma(fma(_e1858.member.member_3.y, _e1858.member_1.member_2.w, fma(_e1858.member.member_2.y, _e1858.member_1.member_2.z, fma(_e1858.member.member.y, _e1858.member_1.member_2.x, (_e1858.member.member_1.y * _e1858.member_1.member_2.y)))), _e1441, fma(fma(_e1858.member.member_3.y, _e1858.member_1.member.w, fma(_e1858.member.member_2.y, _e1858.member_1.member.z, fma(_e1858.member.member.y, _e1858.member_1.member.x, (_e1858.member.member_1.y * _e1858.member_1.member.y)))), _e1439, (fma(_e1858.member.member_3.y, _e1858.member_1.member_1.w, fma(_e1858.member.member_2.y, _e1858.member_1.member_1.z, fma(_e1858.member.member.y, _e1858.member_1.member_1.x, (_e1858.member.member_1.y * _e1858.member_1.member_1.y)))) * _e1440))) + fma(_e1858.member.member_3.y, _e1858.member_1.member_3.w, fma(_e1858.member.member_2.y, _e1858.member_1.member_3.z, fma(_e1858.member.member.y, _e1858.member_1.member_3.x, (_e1858.member.member_1.y * _e1858.member_1.member_3.y))))), (fma(fma(_e1858.member.member_3.z, _e1858.member_1.member_2.w, fma(_e1858.member.member_2.z, _e1858.member_1.member_2.z, fma(_e1858.member.member.z, _e1858.member_1.member_2.x, (_e1858.member.member_1.z * _e1858.member_1.member_2.y)))), _e1441, fma(fma(_e1858.member.member_3.z, _e1858.member_1.member.w, fma(_e1858.member.member_2.z, _e1858.member_1.member.z, fma(_e1858.member.member.z, _e1858.member_1.member.x, (_e1858.member.member_1.z * _e1858.member_1.member.y)))), _e1439, (fma(_e1858.member.member_3.z, _e1858.member_1.member_1.w, fma(_e1858.member.member_2.z, _e1858.member_1.member_1.z, fma(_e1858.member.member.z, _e1858.member_1.member_1.x, (_e1858.member.member_1.z * _e1858.member_1.member_1.y)))) * _e1440))) + fma(_e1858.member.member_3.z, _e1858.member_1.member_3.w, fma(_e1858.member.member_2.z, _e1858.member_1.member_3.z, fma(_e1858.member.member.z, _e1858.member_1.member_3.x, (_e1858.member.member_1.z * _e1858.member_1.member_3.y))))), (fma(fma(_e1858.member.member_3.w, _e1858.member_1.member_2.w, fma(_e1858.member.member_2.w, _e1858.member_1.member_2.z, fma(_e1858.member.member.w, _e1858.member_1.member_2.x, (_e1858.member.member_1.w * _e1858.member_1.member_2.y)))), _e1441, fma(fma(_e1858.member.member_3.w, _e1858.member_1.member.w, fma(_e1858.member.member_2.w, _e1858.member_1.member.z, fma(_e1858.member.member.w, _e1858.member_1.member.x, (_e1858.member.member_1.w * _e1858.member_1.member.y)))), _e1439, (fma(_e1858.member.member_3.w, _e1858.member_1.member_1.w, fma(_e1858.member.member_2.w, _e1858.member_1.member_1.z, fma(_e1858.member.member.w, _e1858.member_1.member_1.x, (_e1858.member.member_1.w * _e1858.member_1.member_1.y)))) * _e1440))) + fma(_e1858.member.member_3.w, _e1858.member_1.member_3.w, fma(_e1858.member.member_2.w, _e1858.member_1.member_3.z, fma(_e1858.member.member.w, _e1858.member_1.member_3.x, (_e1858.member.member_1.w * _e1858.member_1.member_3.y)))))); } else { - global_1 = vec4(10f, 10f, 10f, 1f); + global_2 = vec4(10f, 10f, 10f, 1f); } break; } @@ -1153,18 +1157,18 @@ fn function() { @vertex fn stagerenderlet_vertex(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { global_3 = param; - global = param_1; + global_1 = param_1; function(); - 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; + let _e14 = global_2.y; + global_2.y = -(_e14); + let _e16 = global_5; + let _e17 = global_6; + let _e18 = global_7; + let _e19 = global_8; + let _e20 = global_10; + let _e21 = global_11; + let _e22 = global_12; + let _e23 = global_9; + let _e24 = global_2; 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 98edd89b..c982db1f 100644 Binary files a/crates/renderling/shaders/tonemapping-tonemapping_fragment.spv and b/crates/renderling/shaders/tonemapping-tonemapping_fragment.spv differ diff --git a/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl b/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl index 7012bf25..18d497dd 100644 --- a/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl +++ b/crates/renderling/shaders/tonemapping-tonemapping_fragment.wgsl @@ -1,4 +1,4 @@ -struct type_7 { +struct type_2 { member: array, } @@ -8,7 +8,7 @@ struct type_14 { } @group(0) @binding(0) -var global: type_7; +var global: type_2; var global_1: vec2; @group(0) @binding(2) var global_2: sampler; diff --git a/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv b/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv index 7ad18552..2dd7a0e9 100644 Binary files a/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv and b/crates/renderling/shaders/tonemapping-tonemapping_vertex.spv differ diff --git a/crates/renderling/shaders/tonemapping-tonemapping_vertex.wgsl b/crates/renderling/shaders/tonemapping-tonemapping_vertex.wgsl index a6309c0c..488c2164 100644 --- a/crates/renderling/shaders/tonemapping-tonemapping_vertex.wgsl +++ b/crates/renderling/shaders/tonemapping-tonemapping_vertex.wgsl @@ -8,8 +8,8 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: vec2; -var global_1: u32; +var global: u32; +var global_1: vec2; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); fn function() { @@ -17,7 +17,7 @@ fn function() { switch bitcast(0u) { default: { - let _e23 = global_1; + let _e23 = global; local = array(type_9(vec2(-1f, 1f), vec2(0f, 0f)), type_9(vec2(-1f, -1f), vec2(0f, 1f)), type_9(vec2(1f, -1f), vec2(1f, 1f)), type_9(vec2(-1f, 1f), vec2(0f, 0f)), type_9(vec2(1f, -1f), vec2(1f, 1f)), type_9(vec2(1f, 1f), vec2(1f, 0f))); if (_e23 < 6u) { } else { @@ -25,7 +25,7 @@ fn function() { } let _e27 = local[_e23].member; let _e30 = local[_e23].member_1; - global = _e30; + global_1 = _e30; global_2 = vec4(_e27.x, _e27.y, 0f, 1f); break; } @@ -35,11 +35,11 @@ fn function() { @vertex fn tonemappingtonemapping_vertex(@builtin(vertex_index) param: u32) -> VertexOutput { - global_1 = param; + global = param; function(); let _e5 = global_2.y; global_2.y = -(_e5); - let _e7 = global; + let _e7 = global_1; let _e8 = global_2; return VertexOutput(_e7, _e8); } diff --git a/crates/renderling/shaders/tutorial-tutorial_implicit_isosceles_vertex.spv b/crates/renderling/shaders/tutorial-tutorial_implicit_isosceles_vertex.spv index a8e40545..0abe2554 100644 Binary files a/crates/renderling/shaders/tutorial-tutorial_implicit_isosceles_vertex.spv and b/crates/renderling/shaders/tutorial-tutorial_implicit_isosceles_vertex.spv differ diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv index 203b6a85..09782bb6 100644 Binary files a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv and b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.spv differ diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl index af3719af..1ec01068 100644 --- a/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl +++ b/crates/renderling/shaders/tutorial-tutorial_slabbed_renderlet.wgsl @@ -1,29 +1,30 @@ -struct type_11 { +struct type_3 { member: array, } -struct type_18 { +struct type_13 { + member: u32, + member_1: u32, +} + +struct type_19 { member: vec4, member_1: vec4, member_2: vec4, member_3: vec4, } -struct type_19 { +struct type_20 { member: array, 8>, member_1: array, 6>, + member_2: vec3, } -struct type_20 { - member: type_18, - member_1: type_18, - member_2: type_19, - member_3: vec3, -} - -struct type_22 { - member: u32, - member_1: u32, +struct type_21 { + member: type_19, + member_1: type_19, + member_2: vec3, + member_3: type_20, } struct type_25 { @@ -48,12 +49,12 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: u32; @group(0) @binding(0) -var global_1: type_11; +var global: type_3; +var global_1: u32; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); -var global_3: vec4; -var global_4: u32; +var global_3: u32; +var global_4: vec4; fn function() { var local: array, 8>; @@ -61,88 +62,88 @@ fn function() { var local_2: array; var local_3: array; var phi_613_: u32; - var phi_1413_: bool; - var phi_699_: type_22; - var phi_700_: type_22; - var phi_723_: type_22; + var phi_1426_: bool; + var phi_699_: type_13; + var phi_700_: type_13; + var phi_723_: type_13; var phi_736_: bool; - var phi_742_: type_22; - var phi_743_: type_22; - var phi_766_: type_22; + var phi_742_: type_13; + var phi_743_: type_13; + var phi_766_: type_13; var phi_780_: bool; var phi_784_: type_28; - var phi_1443_: bool; + var phi_1456_: bool; var phi_835_: type_25; - var phi_1513_: bool; - var phi_996_: type_22; - var phi_997_: type_22; - var phi_1020_: type_22; + var phi_1526_: bool; + var phi_996_: type_13; + var phi_997_: type_13; + var phi_1020_: type_13; var phi_1047_: bool; - var phi_1053_: type_22; - var phi_1054_: type_22; - var phi_1077_: type_22; + var phi_1053_: type_13; + var phi_1054_: type_13; + var phi_1077_: type_13; var phi_1100_: bool; - var phi_1108_: type_20; + var phi_1121_: type_21; - let _e76 = global_4; - let _e77 = global; - let _e79 = arrayLength((&global_1.member)); - let _e83 = global_1.member[(_e76 + 1u)]; - let _e87 = global_1.member[(_e76 + 2u)]; - let _e91 = global_1.member[(_e76 + 9u)]; - let _e95 = global_1.member[(_e76 + 10u)]; - if (_e77 >= _e87) { + let _e79 = global_3; + let _e80 = global_1; + let _e82 = arrayLength((&global.member)); + let _e86 = global.member[(_e79 + 1u)]; + let _e90 = global.member[(_e79 + 2u)]; + let _e94 = global.member[(_e79 + 9u)]; + let _e98 = global.member[(_e79 + 10u)]; + if (_e80 >= _e90) { phi_613_ = 4294967295u; } else { - phi_613_ = (_e83 + (26u * _e77)); + phi_613_ = (_e86 + (26u * _e80)); } - let _e100 = phi_613_; - if (_e79 >= 26u) { - phi_1413_ = (_e100 <= (_e79 - 26u)); + let _e103 = phi_613_; + if (_e82 >= 26u) { + phi_1426_ = (_e103 <= (_e82 - 26u)); } else { - phi_1413_ = false; + phi_1426_ = false; } - let _e105 = phi_1413_; - if _e105 { - let _e108 = global_1.member[_e100]; - let _e113 = global_1.member[(_e100 + 1u)]; - let _e118 = global_1.member[(_e100 + 2u)]; - let _e124 = global_1.member[(_e100 + 3u)]; - let _e129 = global_1.member[(_e100 + 4u)]; - let _e134 = global_1.member[(_e100 + 5u)]; - let _e139 = global_1.member[(_e100 + 6u)]; - let _e145 = global_1.member[(_e100 + 7u)]; - let _e150 = global_1.member[(_e100 + 8u)]; - let _e156 = global_1.member[(_e100 + 9u)]; - let _e161 = global_1.member[(_e100 + 10u)]; - let _e167 = global_1.member[(_e100 + 11u)]; - let _e172 = global_1.member[(_e100 + 12u)]; - let _e177 = global_1.member[(_e100 + 13u)]; - let _e183 = global_1.member[(_e100 + 14u)]; - let _e188 = global_1.member[(_e100 + 15u)]; - let _e193 = global_1.member[(_e100 + 16u)]; - let _e198 = global_1.member[(_e100 + 17u)]; + let _e108 = phi_1426_; + if _e108 { + let _e111 = global.member[_e103]; + let _e116 = global.member[(_e103 + 1u)]; + let _e121 = global.member[(_e103 + 2u)]; + let _e127 = global.member[(_e103 + 3u)]; + let _e132 = global.member[(_e103 + 4u)]; + let _e137 = global.member[(_e103 + 5u)]; + let _e142 = global.member[(_e103 + 6u)]; + let _e148 = global.member[(_e103 + 7u)]; + let _e153 = global.member[(_e103 + 8u)]; + let _e159 = global.member[(_e103 + 9u)]; + let _e164 = global.member[(_e103 + 10u)]; + let _e170 = global.member[(_e103 + 11u)]; + let _e175 = global.member[(_e103 + 12u)]; + let _e180 = global.member[(_e103 + 13u)]; + let _e186 = global.member[(_e103 + 14u)]; + let _e191 = global.member[(_e103 + 15u)]; + let _e196 = global.member[(_e103 + 16u)]; + let _e201 = global.member[(_e103 + 17u)]; local_3 = array(0u, 0u, 0u, 0u); - phi_699_ = type_22(0u, 4u); + phi_699_ = type_13(0u, 4u); loop { - let _e203 = phi_699_; - if (_e203.member < _e203.member_1) { - phi_700_ = type_22((_e203.member + 1u), _e203.member_1); - phi_723_ = type_22(1u, _e203.member); + let _e206 = phi_699_; + if (_e206.member < _e206.member_1) { + phi_700_ = type_13((_e206.member + 1u), _e206.member_1); + phi_723_ = type_13(1u, _e206.member); } else { - phi_700_ = _e203; - phi_723_ = type_22(0u, type_22().member_1); + phi_700_ = _e206; + phi_723_ = type_13(0u, type_13().member_1); } - let _e216 = phi_700_; - let _e218 = phi_723_; - switch bitcast(_e218.member) { + let _e219 = phi_700_; + let _e221 = phi_723_; + switch bitcast(_e221.member) { case 0: { phi_736_ = false; break; } case 1: { - let _e225 = global_1.member[((_e100 + 18u) + _e218.member_1)]; - local_3[_e218.member_1] = _e225; + let _e228 = global.member[((_e103 + 18u) + _e221.member_1)]; + local_3[_e221.member_1] = _e228; phi_736_ = true; break; } @@ -151,35 +152,35 @@ fn function() { break; } } - let _e228 = phi_736_; + let _e231 = phi_736_; continue; continuing { - phi_699_ = _e216; - break if !(_e228); + phi_699_ = _e219; + break if !(_e231); } } - let _e230 = local_3; + let _e233 = local_3; local_2 = array(0f, 0f, 0f, 0f); - phi_742_ = type_22(0u, 4u); + phi_742_ = type_13(0u, 4u); loop { - let _e233 = phi_742_; - if (_e233.member < _e233.member_1) { - phi_743_ = type_22((_e233.member + 1u), _e233.member_1); - phi_766_ = type_22(1u, _e233.member); + let _e236 = phi_742_; + if (_e236.member < _e236.member_1) { + phi_743_ = type_13((_e236.member + 1u), _e236.member_1); + phi_766_ = type_13(1u, _e236.member); } else { - phi_743_ = _e233; - phi_766_ = type_22(0u, type_22().member_1); + phi_743_ = _e236; + phi_766_ = type_13(0u, type_13().member_1); } - let _e246 = phi_743_; - let _e248 = phi_766_; - switch bitcast(_e248.member) { + let _e249 = phi_743_; + let _e251 = phi_766_; + switch bitcast(_e251.member) { case 0: { phi_780_ = false; break; } case 1: { - let _e255 = global_1.member[((_e100 + 22u) + _e248.member_1)]; - local_2[_e248.member_1] = bitcast(_e255); + let _e258 = global.member[((_e103 + 22u) + _e251.member_1)]; + local_2[_e251.member_1] = bitcast(_e258); phi_780_ = true; break; } @@ -188,119 +189,119 @@ fn function() { break; } } - let _e259 = phi_780_; + let _e262 = phi_780_; continue; continuing { - phi_742_ = _e246; - break if !(_e259); + phi_742_ = _e249; + break if !(_e262); } } - let _e261 = local_2; - phi_784_ = type_28(vec3(bitcast(_e108), bitcast(_e113), bitcast(_e118)), vec4(bitcast(_e124), bitcast(_e129), bitcast(_e134), bitcast(_e139)), vec3(bitcast(_e167), bitcast(_e172), bitcast(_e177)), vec4(bitcast(_e183), bitcast(_e188), bitcast(_e193), bitcast(_e198)), _e230, _e261, vec2(bitcast(_e145), bitcast(_e150)), vec2(bitcast(_e156), bitcast(_e161))); + let _e264 = local_2; + phi_784_ = type_28(vec3(bitcast(_e111), bitcast(_e116), bitcast(_e121)), vec4(bitcast(_e127), bitcast(_e132), bitcast(_e137), bitcast(_e142)), vec3(bitcast(_e170), bitcast(_e175), bitcast(_e180)), vec4(bitcast(_e186), bitcast(_e191), bitcast(_e196), bitcast(_e201)), _e233, _e264, vec2(bitcast(_e148), bitcast(_e153)), vec2(bitcast(_e159), bitcast(_e164))); } else { phi_784_ = type_28(vec3(0f, 0f, 0f), vec4(1f, 1f, 1f, 1f), vec3(0f, 0f, 1f), vec4(0f, 1f, 0f, 0f), array(0u, 0u, 0u, 0u), array(0f, 0f, 0f, 0f), vec2(0f, 0f), vec2(0f, 0f)); } - let _e264 = phi_784_; - global_3 = _e264.member_1; - if (_e79 >= 10u) { - phi_1443_ = (_e95 <= (_e79 - 10u)); + let _e267 = phi_784_; + global_4 = _e267.member_1; + if (_e82 >= 10u) { + phi_1456_ = (_e98 <= (_e82 - 10u)); } else { - phi_1443_ = false; + phi_1456_ = false; } - let _e270 = phi_1443_; - if _e270 { - let _e273 = global_1.member[_e95]; - let _e278 = global_1.member[(_e95 + 1u)]; - let _e283 = global_1.member[(_e95 + 2u)]; - let _e289 = global_1.member[(_e95 + 3u)]; - let _e294 = global_1.member[(_e95 + 4u)]; - let _e299 = global_1.member[(_e95 + 5u)]; - let _e304 = global_1.member[(_e95 + 6u)]; - let _e310 = global_1.member[(_e95 + 7u)]; - let _e315 = global_1.member[(_e95 + 8u)]; - let _e320 = global_1.member[(_e95 + 9u)]; - phi_835_ = type_25(vec3(bitcast(_e273), bitcast(_e278), bitcast(_e283)), vec4(bitcast(_e289), bitcast(_e294), bitcast(_e299), bitcast(_e304)), vec3(bitcast(_e310), bitcast(_e315), bitcast(_e320))); + let _e273 = phi_1456_; + if _e273 { + let _e276 = global.member[_e98]; + let _e281 = global.member[(_e98 + 1u)]; + let _e286 = global.member[(_e98 + 2u)]; + let _e292 = global.member[(_e98 + 3u)]; + let _e297 = global.member[(_e98 + 4u)]; + let _e302 = global.member[(_e98 + 5u)]; + let _e307 = global.member[(_e98 + 6u)]; + let _e313 = global.member[(_e98 + 7u)]; + let _e318 = global.member[(_e98 + 8u)]; + let _e323 = global.member[(_e98 + 9u)]; + phi_835_ = type_25(vec3(bitcast(_e276), bitcast(_e281), bitcast(_e286)), vec4(bitcast(_e292), bitcast(_e297), bitcast(_e302), bitcast(_e307)), vec3(bitcast(_e313), bitcast(_e318), bitcast(_e323))); } else { phi_835_ = type_25(vec3(0f, 0f, 0f), vec4(0f, 0f, 0f, 1f), vec3(1f, 1f, 1f)); } - let _e325 = phi_835_; - let _e333 = (_e325.member_1.x + _e325.member_1.x); - let _e334 = (_e325.member_1.y + _e325.member_1.y); - let _e335 = (_e325.member_1.z + _e325.member_1.z); - let _e337 = (_e325.member_1.z * _e335); - let _e338 = (_e325.member_1.w * _e333); - let _e339 = (_e325.member_1.w * _e334); - let _e340 = (_e325.member_1.w * _e335); - let _e360 = (vec4((1f - fma(_e325.member_1.y, _e334, _e337)), fma(_e325.member_1.x, _e334, _e340), fma(_e325.member_1.x, _e335, -(_e339)), 0f) * _e325.member_2.x); - 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_1513_ = (_e91 <= (_e79 - 83u)); + let _e328 = phi_835_; + let _e336 = (_e328.member_1.x + _e328.member_1.x); + let _e337 = (_e328.member_1.y + _e328.member_1.y); + let _e338 = (_e328.member_1.z + _e328.member_1.z); + let _e340 = (_e328.member_1.z * _e338); + let _e341 = (_e328.member_1.w * _e336); + let _e342 = (_e328.member_1.w * _e337); + let _e343 = (_e328.member_1.w * _e338); + let _e363 = (vec4((1f - fma(_e328.member_1.y, _e337, _e340)), fma(_e328.member_1.x, _e337, _e343), fma(_e328.member_1.x, _e338, -(_e342)), 0f) * _e328.member_2.x); + let _e365 = (vec4(fma(_e328.member_1.x, _e337, -(_e343)), (1f - fma(_e328.member_1.x, _e336, _e340)), fma(_e328.member_1.y, _e338, _e341), 0f) * _e328.member_2.y); + let _e367 = (vec4(fma(_e328.member_1.x, _e338, _e342), fma(_e328.member_1.y, _e338, -(_e341)), (1f - fma(_e328.member_1.x, _e336, (_e328.member_1.y * _e337))), 0f) * _e328.member_2.z); + if (_e82 >= 86u) { + phi_1526_ = (_e94 <= (_e82 - 86u)); } else { - phi_1513_ = false; + phi_1526_ = false; } - let _e372 = phi_1513_; - if _e372 { - let _e375 = global_1.member[_e91]; - let _e380 = global_1.member[(_e91 + 1u)]; - let _e385 = global_1.member[(_e91 + 2u)]; - let _e390 = global_1.member[(_e91 + 3u)]; - let _e396 = global_1.member[(_e91 + 4u)]; - let _e401 = global_1.member[(_e91 + 5u)]; - let _e406 = global_1.member[(_e91 + 6u)]; - let _e411 = global_1.member[(_e91 + 7u)]; - let _e417 = global_1.member[(_e91 + 8u)]; - let _e422 = global_1.member[(_e91 + 9u)]; - let _e427 = global_1.member[(_e91 + 10u)]; - let _e432 = global_1.member[(_e91 + 11u)]; - let _e438 = global_1.member[(_e91 + 12u)]; - let _e443 = global_1.member[(_e91 + 13u)]; - let _e448 = global_1.member[(_e91 + 14u)]; - let _e453 = global_1.member[(_e91 + 15u)]; - let _e460 = global_1.member[(_e91 + 16u)]; - let _e465 = global_1.member[(_e91 + 17u)]; - let _e470 = global_1.member[(_e91 + 18u)]; - let _e475 = global_1.member[(_e91 + 19u)]; - let _e481 = global_1.member[(_e91 + 20u)]; - let _e486 = global_1.member[(_e91 + 21u)]; - let _e491 = global_1.member[(_e91 + 22u)]; - let _e496 = global_1.member[(_e91 + 23u)]; - let _e502 = global_1.member[(_e91 + 24u)]; - let _e507 = global_1.member[(_e91 + 25u)]; - let _e512 = global_1.member[(_e91 + 26u)]; - let _e517 = global_1.member[(_e91 + 27u)]; - let _e523 = global_1.member[(_e91 + 28u)]; - let _e528 = global_1.member[(_e91 + 29u)]; - let _e533 = global_1.member[(_e91 + 30u)]; - let _e538 = global_1.member[(_e91 + 31u)]; - let _e545 = global_1.member[(_e91 + 32u)]; - let _e550 = global_1.member[(_e91 + 33u)]; - let _e555 = global_1.member[(_e91 + 34u)]; + let _e375 = phi_1526_; + if _e375 { + let _e378 = global.member[_e94]; + let _e383 = global.member[(_e94 + 1u)]; + let _e388 = global.member[(_e94 + 2u)]; + let _e393 = global.member[(_e94 + 3u)]; + let _e399 = global.member[(_e94 + 4u)]; + let _e404 = global.member[(_e94 + 5u)]; + let _e409 = global.member[(_e94 + 6u)]; + let _e414 = global.member[(_e94 + 7u)]; + let _e420 = global.member[(_e94 + 8u)]; + let _e425 = global.member[(_e94 + 9u)]; + let _e430 = global.member[(_e94 + 10u)]; + let _e435 = global.member[(_e94 + 11u)]; + let _e441 = global.member[(_e94 + 12u)]; + let _e446 = global.member[(_e94 + 13u)]; + let _e451 = global.member[(_e94 + 14u)]; + let _e456 = global.member[(_e94 + 15u)]; + let _e463 = global.member[(_e94 + 16u)]; + let _e468 = global.member[(_e94 + 17u)]; + let _e473 = global.member[(_e94 + 18u)]; + let _e478 = global.member[(_e94 + 19u)]; + let _e484 = global.member[(_e94 + 20u)]; + let _e489 = global.member[(_e94 + 21u)]; + let _e494 = global.member[(_e94 + 22u)]; + let _e499 = global.member[(_e94 + 23u)]; + let _e505 = global.member[(_e94 + 24u)]; + let _e510 = global.member[(_e94 + 25u)]; + let _e515 = global.member[(_e94 + 26u)]; + let _e520 = global.member[(_e94 + 27u)]; + let _e526 = global.member[(_e94 + 28u)]; + let _e531 = global.member[(_e94 + 29u)]; + let _e536 = global.member[(_e94 + 30u)]; + let _e541 = global.member[(_e94 + 31u)]; + let _e548 = global.member[(_e94 + 32u)]; + let _e553 = global.member[(_e94 + 33u)]; + let _e558 = global.member[(_e94 + 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_996_ = type_22(0u, 6u); + phi_996_ = type_13(0u, 6u); loop { - let _e560 = phi_996_; - if (_e560.member < _e560.member_1) { - phi_997_ = type_22((_e560.member + 1u), _e560.member_1); - phi_1020_ = type_22(1u, _e560.member); + let _e563 = phi_996_; + if (_e563.member < _e563.member_1) { + phi_997_ = type_13((_e563.member + 1u), _e563.member_1); + phi_1020_ = type_13(1u, _e563.member); } else { - phi_997_ = _e560; - phi_1020_ = type_22(0u, type_22().member_1); + phi_997_ = _e563; + phi_1020_ = type_13(0u, type_13().member_1); } - let _e573 = phi_997_; - let _e575 = phi_1020_; - switch bitcast(_e575.member) { + let _e576 = phi_997_; + let _e578 = phi_1020_; + switch bitcast(_e578.member) { case 0: { phi_1047_ = false; break; } case 1: { - let _e580 = ((_e91 + 35u) + (_e575.member_1 * 4u)); - let _e583 = global_1.member[_e580]; - let _e588 = global_1.member[(_e580 + 1u)]; - let _e593 = global_1.member[(_e580 + 2u)]; - let _e598 = global_1.member[(_e580 + 3u)]; - local_1[_e575.member_1] = vec4(bitcast(_e583), bitcast(_e588), bitcast(_e593), bitcast(_e598)); + let _e583 = ((_e94 + 35u) + (_e578.member_1 * 4u)); + let _e586 = global.member[_e583]; + let _e591 = global.member[(_e583 + 1u)]; + let _e596 = global.member[(_e583 + 2u)]; + let _e601 = global.member[(_e583 + 3u)]; + local_1[_e578.member_1] = vec4(bitcast(_e586), bitcast(_e591), bitcast(_e596), bitcast(_e601)); phi_1047_ = true; break; } @@ -309,38 +310,38 @@ fn function() { break; } } - let _e603 = phi_1047_; + let _e606 = phi_1047_; continue; continuing { - phi_996_ = _e573; - break if !(_e603); + phi_996_ = _e576; + break if !(_e606); } } - let _e605 = local_1; + let _e608 = 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_1053_ = type_22(0u, 8u); + phi_1053_ = type_13(0u, 8u); loop { - let _e608 = phi_1053_; - if (_e608.member < _e608.member_1) { - phi_1054_ = type_22((_e608.member + 1u), _e608.member_1); - phi_1077_ = type_22(1u, _e608.member); + let _e611 = phi_1053_; + if (_e611.member < _e611.member_1) { + phi_1054_ = type_13((_e611.member + 1u), _e611.member_1); + phi_1077_ = type_13(1u, _e611.member); } else { - phi_1054_ = _e608; - phi_1077_ = type_22(0u, type_22().member_1); + phi_1054_ = _e611; + phi_1077_ = type_13(0u, type_13().member_1); } - let _e621 = phi_1054_; - let _e623 = phi_1077_; - switch bitcast(_e623.member) { + let _e624 = phi_1054_; + let _e626 = phi_1077_; + switch bitcast(_e626.member) { case 0: { phi_1100_ = false; break; } case 1: { - let _e628 = ((_e91 + 59u) + (_e623.member_1 * 3u)); - let _e631 = global_1.member[_e628]; - let _e636 = global_1.member[(_e628 + 1u)]; - let _e641 = global_1.member[(_e628 + 2u)]; - local[_e623.member_1] = vec3(bitcast(_e631), bitcast(_e636), bitcast(_e641)); + let _e631 = ((_e94 + 59u) + (_e626.member_1 * 3u)); + let _e634 = global.member[_e631]; + let _e639 = global.member[(_e631 + 1u)]; + let _e644 = global.member[(_e631 + 2u)]; + local[_e626.member_1] = vec3(bitcast(_e634), bitcast(_e639), bitcast(_e644)); phi_1100_ = true; break; } @@ -349,47 +350,50 @@ fn function() { break; } } - let _e646 = phi_1100_; + let _e649 = phi_1100_; continue; continuing { - phi_1053_ = _e621; - break if !(_e646); + phi_1053_ = _e624; + break if !(_e649); } } - let _e648 = local; - phi_1108_ = type_20(type_18(vec4(bitcast(_e375), bitcast(_e380), bitcast(_e385), bitcast(_e390)), vec4(bitcast(_e396), bitcast(_e401), bitcast(_e406), bitcast(_e411)), vec4(bitcast(_e417), bitcast(_e422), bitcast(_e427), bitcast(_e432)), vec4(bitcast(_e438), bitcast(_e443), bitcast(_e448), bitcast(_e453))), type_18(vec4(bitcast(_e460), bitcast(_e465), bitcast(_e470), bitcast(_e475)), vec4(bitcast(_e481), bitcast(_e486), bitcast(_e491), bitcast(_e496)), vec4(bitcast(_e502), bitcast(_e507), bitcast(_e512), bitcast(_e517)), vec4(bitcast(_e523), bitcast(_e528), bitcast(_e533), bitcast(_e538))), type_19(_e648, _e605), vec3(bitcast(_e545), bitcast(_e550), bitcast(_e555))); + let _e651 = local; + let _e655 = global.member[(_e94 + 83u)]; + let _e660 = global.member[(_e94 + 84u)]; + let _e665 = global.member[(_e94 + 85u)]; + phi_1121_ = type_21(type_19(vec4(bitcast(_e378), bitcast(_e383), bitcast(_e388), bitcast(_e393)), vec4(bitcast(_e399), bitcast(_e404), bitcast(_e409), bitcast(_e414)), vec4(bitcast(_e420), bitcast(_e425), bitcast(_e430), bitcast(_e435)), vec4(bitcast(_e441), bitcast(_e446), bitcast(_e451), bitcast(_e456))), type_19(vec4(bitcast(_e463), bitcast(_e468), bitcast(_e473), bitcast(_e478)), vec4(bitcast(_e484), bitcast(_e489), bitcast(_e494), bitcast(_e499)), vec4(bitcast(_e505), bitcast(_e510), bitcast(_e515), bitcast(_e520)), vec4(bitcast(_e526), bitcast(_e531), bitcast(_e536), bitcast(_e541))), vec3(bitcast(_e548), bitcast(_e553), bitcast(_e558)), type_20(_e651, _e608, vec3(bitcast(_e655), bitcast(_e660), bitcast(_e665)))); } else { - phi_1108_ = type_20(type_18(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_18(vec4(1f, 0f, 0f, 0f), vec4(0f, 1f, 0f, 0f), vec4(0f, 0f, 1f, 0f), vec4(0f, 0f, 0f, 1f)), type_19(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_1121_ = 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)), vec3(0f, 0f, 0f), 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 _e652 = phi_1108_; - let _e692 = fma(_e652.member.member_3.x, _e652.member_1.member.w, fma(_e652.member.member_2.x, _e652.member_1.member.z, fma(_e652.member.member.x, _e652.member_1.member.x, (_e652.member.member_1.x * _e652.member_1.member.y)))); - let _e693 = fma(_e652.member.member_3.y, _e652.member_1.member.w, fma(_e652.member.member_2.y, _e652.member_1.member.z, fma(_e652.member.member.y, _e652.member_1.member.x, (_e652.member.member_1.y * _e652.member_1.member.y)))); - let _e694 = fma(_e652.member.member_3.z, _e652.member_1.member.w, fma(_e652.member.member_2.z, _e652.member_1.member.z, fma(_e652.member.member.z, _e652.member_1.member.x, (_e652.member.member_1.z * _e652.member_1.member.y)))); - let _e695 = fma(_e652.member.member_3.w, _e652.member_1.member.w, fma(_e652.member.member_2.w, _e652.member_1.member.z, fma(_e652.member.member.w, _e652.member_1.member.x, (_e652.member.member_1.w * _e652.member_1.member.y)))); - let _e713 = fma(_e652.member.member_3.x, _e652.member_1.member_1.w, fma(_e652.member.member_2.x, _e652.member_1.member_1.z, fma(_e652.member.member.x, _e652.member_1.member_1.x, (_e652.member.member_1.x * _e652.member_1.member_1.y)))); - let _e714 = fma(_e652.member.member_3.y, _e652.member_1.member_1.w, fma(_e652.member.member_2.y, _e652.member_1.member_1.z, fma(_e652.member.member.y, _e652.member_1.member_1.x, (_e652.member.member_1.y * _e652.member_1.member_1.y)))); - let _e715 = fma(_e652.member.member_3.z, _e652.member_1.member_1.w, fma(_e652.member.member_2.z, _e652.member_1.member_1.z, fma(_e652.member.member.z, _e652.member_1.member_1.x, (_e652.member.member_1.z * _e652.member_1.member_1.y)))); - let _e716 = fma(_e652.member.member_3.w, _e652.member_1.member_1.w, fma(_e652.member.member_2.w, _e652.member_1.member_1.z, fma(_e652.member.member.w, _e652.member_1.member_1.x, (_e652.member.member_1.w * _e652.member_1.member_1.y)))); - let _e734 = fma(_e652.member.member_3.x, _e652.member_1.member_2.w, fma(_e652.member.member_2.x, _e652.member_1.member_2.z, fma(_e652.member.member.x, _e652.member_1.member_2.x, (_e652.member.member_1.x * _e652.member_1.member_2.y)))); - let _e735 = fma(_e652.member.member_3.y, _e652.member_1.member_2.w, fma(_e652.member.member_2.y, _e652.member_1.member_2.z, fma(_e652.member.member.y, _e652.member_1.member_2.x, (_e652.member.member_1.y * _e652.member_1.member_2.y)))); - let _e736 = fma(_e652.member.member_3.z, _e652.member_1.member_2.w, fma(_e652.member.member_2.z, _e652.member_1.member_2.z, fma(_e652.member.member.z, _e652.member_1.member_2.x, (_e652.member.member_1.z * _e652.member_1.member_2.y)))); - let _e737 = fma(_e652.member.member_3.w, _e652.member_1.member_2.w, fma(_e652.member.member_2.w, _e652.member_1.member_2.z, fma(_e652.member.member.w, _e652.member_1.member_2.x, (_e652.member.member_1.w * _e652.member_1.member_2.y)))); - let _e755 = fma(_e652.member.member_3.x, _e652.member_1.member_3.w, fma(_e652.member.member_2.x, _e652.member_1.member_3.z, fma(_e652.member.member.x, _e652.member_1.member_3.x, (_e652.member.member_1.x * _e652.member_1.member_3.y)))); - let _e756 = fma(_e652.member.member_3.y, _e652.member_1.member_3.w, fma(_e652.member.member_2.y, _e652.member_1.member_3.z, fma(_e652.member.member.y, _e652.member_1.member_3.x, (_e652.member.member_1.y * _e652.member_1.member_3.y)))); - let _e757 = fma(_e652.member.member_3.z, _e652.member_1.member_3.w, fma(_e652.member.member_2.z, _e652.member_1.member_3.z, fma(_e652.member.member.z, _e652.member_1.member_3.x, (_e652.member.member_1.z * _e652.member_1.member_3.y)))); - let _e758 = fma(_e652.member.member_3.w, _e652.member_1.member_3.w, fma(_e652.member.member_2.w, _e652.member_1.member_3.z, fma(_e652.member.member.w, _e652.member_1.member_3.x, (_e652.member.member_1.w * _e652.member_1.member_3.y)))); - global_2 = vec4((fma(fma(_e755, _e364.w, fma(_e734, _e364.z, fma(_e692, _e364.x, (_e713 * _e364.y)))), _e264.member.z, fma(fma(_e755, _e360.w, fma(_e734, _e360.z, fma(_e692, _e360.x, (_e713 * _e360.y)))), _e264.member.x, (fma(_e755, _e362.w, fma(_e734, _e362.z, fma(_e692, _e362.x, (_e713 * _e362.y)))) * _e264.member.y))) + (fma(_e734, _e325.member.z, fma(_e692, _e325.member.x, (_e713 * _e325.member.y))) + _e755)), (fma(fma(_e756, _e364.w, fma(_e735, _e364.z, fma(_e693, _e364.x, (_e714 * _e364.y)))), _e264.member.z, fma(fma(_e756, _e360.w, fma(_e735, _e360.z, fma(_e693, _e360.x, (_e714 * _e360.y)))), _e264.member.x, (fma(_e756, _e362.w, fma(_e735, _e362.z, fma(_e693, _e362.x, (_e714 * _e362.y)))) * _e264.member.y))) + (fma(_e735, _e325.member.z, fma(_e693, _e325.member.x, (_e714 * _e325.member.y))) + _e756)), (fma(fma(_e757, _e364.w, fma(_e736, _e364.z, fma(_e694, _e364.x, (_e715 * _e364.y)))), _e264.member.z, fma(fma(_e757, _e360.w, fma(_e736, _e360.z, fma(_e694, _e360.x, (_e715 * _e360.y)))), _e264.member.x, (fma(_e757, _e362.w, fma(_e736, _e362.z, fma(_e694, _e362.x, (_e715 * _e362.y)))) * _e264.member.y))) + (fma(_e736, _e325.member.z, fma(_e694, _e325.member.x, (_e715 * _e325.member.y))) + _e757)), (fma(fma(_e758, _e364.w, fma(_e737, _e364.z, fma(_e695, _e364.x, (_e716 * _e364.y)))), _e264.member.z, fma(fma(_e758, _e360.w, fma(_e737, _e360.z, fma(_e695, _e360.x, (_e716 * _e360.y)))), _e264.member.x, (fma(_e758, _e362.w, fma(_e737, _e362.z, fma(_e695, _e362.x, (_e716 * _e362.y)))) * _e264.member.y))) + (fma(_e737, _e325.member.z, fma(_e695, _e325.member.x, (_e716 * _e325.member.y))) + _e758))); + let _e671 = phi_1121_; + let _e711 = fma(_e671.member.member_3.x, _e671.member_1.member.w, fma(_e671.member.member_2.x, _e671.member_1.member.z, fma(_e671.member.member.x, _e671.member_1.member.x, (_e671.member.member_1.x * _e671.member_1.member.y)))); + let _e712 = fma(_e671.member.member_3.y, _e671.member_1.member.w, fma(_e671.member.member_2.y, _e671.member_1.member.z, fma(_e671.member.member.y, _e671.member_1.member.x, (_e671.member.member_1.y * _e671.member_1.member.y)))); + let _e713 = fma(_e671.member.member_3.z, _e671.member_1.member.w, fma(_e671.member.member_2.z, _e671.member_1.member.z, fma(_e671.member.member.z, _e671.member_1.member.x, (_e671.member.member_1.z * _e671.member_1.member.y)))); + let _e714 = fma(_e671.member.member_3.w, _e671.member_1.member.w, fma(_e671.member.member_2.w, _e671.member_1.member.z, fma(_e671.member.member.w, _e671.member_1.member.x, (_e671.member.member_1.w * _e671.member_1.member.y)))); + let _e732 = fma(_e671.member.member_3.x, _e671.member_1.member_1.w, fma(_e671.member.member_2.x, _e671.member_1.member_1.z, fma(_e671.member.member.x, _e671.member_1.member_1.x, (_e671.member.member_1.x * _e671.member_1.member_1.y)))); + let _e733 = fma(_e671.member.member_3.y, _e671.member_1.member_1.w, fma(_e671.member.member_2.y, _e671.member_1.member_1.z, fma(_e671.member.member.y, _e671.member_1.member_1.x, (_e671.member.member_1.y * _e671.member_1.member_1.y)))); + let _e734 = fma(_e671.member.member_3.z, _e671.member_1.member_1.w, fma(_e671.member.member_2.z, _e671.member_1.member_1.z, fma(_e671.member.member.z, _e671.member_1.member_1.x, (_e671.member.member_1.z * _e671.member_1.member_1.y)))); + let _e735 = fma(_e671.member.member_3.w, _e671.member_1.member_1.w, fma(_e671.member.member_2.w, _e671.member_1.member_1.z, fma(_e671.member.member.w, _e671.member_1.member_1.x, (_e671.member.member_1.w * _e671.member_1.member_1.y)))); + let _e753 = fma(_e671.member.member_3.x, _e671.member_1.member_2.w, fma(_e671.member.member_2.x, _e671.member_1.member_2.z, fma(_e671.member.member.x, _e671.member_1.member_2.x, (_e671.member.member_1.x * _e671.member_1.member_2.y)))); + let _e754 = fma(_e671.member.member_3.y, _e671.member_1.member_2.w, fma(_e671.member.member_2.y, _e671.member_1.member_2.z, fma(_e671.member.member.y, _e671.member_1.member_2.x, (_e671.member.member_1.y * _e671.member_1.member_2.y)))); + let _e755 = fma(_e671.member.member_3.z, _e671.member_1.member_2.w, fma(_e671.member.member_2.z, _e671.member_1.member_2.z, fma(_e671.member.member.z, _e671.member_1.member_2.x, (_e671.member.member_1.z * _e671.member_1.member_2.y)))); + let _e756 = fma(_e671.member.member_3.w, _e671.member_1.member_2.w, fma(_e671.member.member_2.w, _e671.member_1.member_2.z, fma(_e671.member.member.w, _e671.member_1.member_2.x, (_e671.member.member_1.w * _e671.member_1.member_2.y)))); + let _e774 = fma(_e671.member.member_3.x, _e671.member_1.member_3.w, fma(_e671.member.member_2.x, _e671.member_1.member_3.z, fma(_e671.member.member.x, _e671.member_1.member_3.x, (_e671.member.member_1.x * _e671.member_1.member_3.y)))); + let _e775 = fma(_e671.member.member_3.y, _e671.member_1.member_3.w, fma(_e671.member.member_2.y, _e671.member_1.member_3.z, fma(_e671.member.member.y, _e671.member_1.member_3.x, (_e671.member.member_1.y * _e671.member_1.member_3.y)))); + let _e776 = fma(_e671.member.member_3.z, _e671.member_1.member_3.w, fma(_e671.member.member_2.z, _e671.member_1.member_3.z, fma(_e671.member.member.z, _e671.member_1.member_3.x, (_e671.member.member_1.z * _e671.member_1.member_3.y)))); + let _e777 = fma(_e671.member.member_3.w, _e671.member_1.member_3.w, fma(_e671.member.member_2.w, _e671.member_1.member_3.z, fma(_e671.member.member.w, _e671.member_1.member_3.x, (_e671.member.member_1.w * _e671.member_1.member_3.y)))); + global_2 = vec4((fma(fma(_e774, _e367.w, fma(_e753, _e367.z, fma(_e711, _e367.x, (_e732 * _e367.y)))), _e267.member.z, fma(fma(_e774, _e363.w, fma(_e753, _e363.z, fma(_e711, _e363.x, (_e732 * _e363.y)))), _e267.member.x, (fma(_e774, _e365.w, fma(_e753, _e365.z, fma(_e711, _e365.x, (_e732 * _e365.y)))) * _e267.member.y))) + (fma(_e753, _e328.member.z, fma(_e711, _e328.member.x, (_e732 * _e328.member.y))) + _e774)), (fma(fma(_e775, _e367.w, fma(_e754, _e367.z, fma(_e712, _e367.x, (_e733 * _e367.y)))), _e267.member.z, fma(fma(_e775, _e363.w, fma(_e754, _e363.z, fma(_e712, _e363.x, (_e733 * _e363.y)))), _e267.member.x, (fma(_e775, _e365.w, fma(_e754, _e365.z, fma(_e712, _e365.x, (_e733 * _e365.y)))) * _e267.member.y))) + (fma(_e754, _e328.member.z, fma(_e712, _e328.member.x, (_e733 * _e328.member.y))) + _e775)), (fma(fma(_e776, _e367.w, fma(_e755, _e367.z, fma(_e713, _e367.x, (_e734 * _e367.y)))), _e267.member.z, fma(fma(_e776, _e363.w, fma(_e755, _e363.z, fma(_e713, _e363.x, (_e734 * _e363.y)))), _e267.member.x, (fma(_e776, _e365.w, fma(_e755, _e365.z, fma(_e713, _e365.x, (_e734 * _e365.y)))) * _e267.member.y))) + (fma(_e755, _e328.member.z, fma(_e713, _e328.member.x, (_e734 * _e328.member.y))) + _e776)), (fma(fma(_e777, _e367.w, fma(_e756, _e367.z, fma(_e714, _e367.x, (_e735 * _e367.y)))), _e267.member.z, fma(fma(_e777, _e363.w, fma(_e756, _e363.z, fma(_e714, _e363.x, (_e735 * _e363.y)))), _e267.member.x, (fma(_e777, _e365.w, fma(_e756, _e365.z, fma(_e714, _e365.x, (_e735 * _e365.y)))) * _e267.member.y))) + (fma(_e756, _e328.member.z, fma(_e714, _e328.member.x, (_e735 * _e328.member.y))) + _e777))); return; } @vertex fn tutorialtutorial_slabbed_renderlet(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { - global_4 = param; - global = param_1; + global_3 = param; + global_1 = param_1; function(); let _e7 = global_2.y; global_2.y = -(_e7); - let _e9 = global_3; + let _e9 = global_4; let _e10 = global_2; return VertexOutput(_e9, _e10); } diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv index c9e9a679..4878b810 100644 Binary files a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv and b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.spv differ diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.wgsl b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.wgsl index 433cb757..20dd251f 100644 --- a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.wgsl +++ b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices.wgsl @@ -1,8 +1,8 @@ -struct type_8 { +struct type_3 { member: array, } -struct type_13 { +struct type_11 { member: u32, member_1: u32, } @@ -23,9 +23,9 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: u32; @group(0) @binding(0) -var global_1: type_8; +var global: type_3; +var global_1: u32; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); var global_3: vec4; var global_4: u32; @@ -34,22 +34,22 @@ fn function() { var local: array; var local_1: array; var phi_381_: bool; - var phi_148_: type_13; + var phi_148_: type_11; var phi_407_: u32; var phi_426_: bool; - var phi_239_: type_13; - var phi_240_: type_13; - var phi_263_: type_13; + var phi_239_: type_11; + var phi_240_: type_11; + var phi_263_: type_11; var phi_276_: bool; - var phi_282_: type_13; - var phi_283_: type_13; - var phi_306_: type_13; + var phi_282_: type_11; + var phi_283_: type_11; + var phi_306_: type_11; var phi_320_: bool; var phi_324_: type_18; let _e45 = global_4; - let _e46 = global; - let _e48 = arrayLength((&global_1.member)); + let _e46 = global_1; + let _e48 = arrayLength((&global.member)); if (_e48 >= 2u) { phi_381_ = (_e45 <= (_e48 - 2u)); } else { @@ -57,11 +57,11 @@ fn function() { } let _e53 = phi_381_; if _e53 { - let _e56 = global_1.member[_e45]; - let _e60 = global_1.member[(_e45 + 1u)]; - phi_148_ = type_13(_e56, _e60); + let _e56 = global.member[_e45]; + let _e60 = global.member[(_e45 + 1u)]; + phi_148_ = type_11(_e56, _e60); } else { - phi_148_ = type_13(4294967295u, 0u); + phi_148_ = type_11(4294967295u, 0u); } let _e63 = phi_148_; if (_e46 >= _e63.member_1) { @@ -77,34 +77,34 @@ fn function() { } let _e75 = phi_426_; if _e75 { - let _e78 = global_1.member[_e70]; - let _e83 = global_1.member[(_e70 + 1u)]; - let _e88 = global_1.member[(_e70 + 2u)]; - let _e94 = global_1.member[(_e70 + 3u)]; - let _e99 = global_1.member[(_e70 + 4u)]; - let _e104 = global_1.member[(_e70 + 5u)]; - let _e109 = global_1.member[(_e70 + 6u)]; - let _e115 = global_1.member[(_e70 + 7u)]; - let _e120 = global_1.member[(_e70 + 8u)]; - let _e126 = global_1.member[(_e70 + 9u)]; - let _e131 = global_1.member[(_e70 + 10u)]; - let _e137 = global_1.member[(_e70 + 11u)]; - let _e142 = global_1.member[(_e70 + 12u)]; - let _e147 = global_1.member[(_e70 + 13u)]; - let _e153 = global_1.member[(_e70 + 14u)]; - let _e158 = global_1.member[(_e70 + 15u)]; - let _e163 = global_1.member[(_e70 + 16u)]; - let _e168 = global_1.member[(_e70 + 17u)]; + let _e78 = global.member[_e70]; + let _e83 = global.member[(_e70 + 1u)]; + let _e88 = global.member[(_e70 + 2u)]; + let _e94 = global.member[(_e70 + 3u)]; + let _e99 = global.member[(_e70 + 4u)]; + let _e104 = global.member[(_e70 + 5u)]; + let _e109 = global.member[(_e70 + 6u)]; + let _e115 = global.member[(_e70 + 7u)]; + let _e120 = global.member[(_e70 + 8u)]; + let _e126 = global.member[(_e70 + 9u)]; + let _e131 = global.member[(_e70 + 10u)]; + let _e137 = global.member[(_e70 + 11u)]; + let _e142 = global.member[(_e70 + 12u)]; + let _e147 = global.member[(_e70 + 13u)]; + let _e153 = global.member[(_e70 + 14u)]; + let _e158 = global.member[(_e70 + 15u)]; + let _e163 = global.member[(_e70 + 16u)]; + let _e168 = global.member[(_e70 + 17u)]; local_1 = array(0u, 0u, 0u, 0u); - phi_239_ = type_13(0u, 4u); + phi_239_ = type_11(0u, 4u); loop { let _e173 = phi_239_; if (_e173.member < _e173.member_1) { - phi_240_ = type_13((_e173.member + 1u), _e173.member_1); - phi_263_ = type_13(1u, _e173.member); + phi_240_ = type_11((_e173.member + 1u), _e173.member_1); + phi_263_ = type_11(1u, _e173.member); } else { phi_240_ = _e173; - phi_263_ = type_13(0u, type_13().member_1); + phi_263_ = type_11(0u, type_11().member_1); } let _e186 = phi_240_; let _e188 = phi_263_; @@ -114,7 +114,7 @@ fn function() { break; } case 1: { - let _e195 = global_1.member[((_e70 + 18u) + _e188.member_1)]; + let _e195 = global.member[((_e70 + 18u) + _e188.member_1)]; local_1[_e188.member_1] = _e195; phi_276_ = true; break; @@ -133,15 +133,15 @@ fn function() { } let _e200 = local_1; local = array(0f, 0f, 0f, 0f); - phi_282_ = type_13(0u, 4u); + phi_282_ = type_11(0u, 4u); loop { let _e203 = phi_282_; if (_e203.member < _e203.member_1) { - phi_283_ = type_13((_e203.member + 1u), _e203.member_1); - phi_306_ = type_13(1u, _e203.member); + phi_283_ = type_11((_e203.member + 1u), _e203.member_1); + phi_306_ = type_11(1u, _e203.member); } else { phi_283_ = _e203; - phi_306_ = type_13(0u, type_13().member_1); + phi_306_ = type_11(0u, type_11().member_1); } let _e216 = phi_283_; let _e218 = phi_306_; @@ -151,7 +151,7 @@ fn function() { break; } case 1: { - let _e225 = global_1.member[((_e70 + 22u) + _e218.member_1)]; + let _e225 = global.member[((_e70 + 22u) + _e218.member_1)]; local[_e218.member_1] = bitcast(_e225); phi_320_ = true; break; @@ -182,7 +182,7 @@ fn function() { @vertex fn tutorialtutorial_slabbed_vertices(@builtin(instance_index) param: u32, @builtin(vertex_index) param_1: u32) -> VertexOutput { global_4 = param; - global = param_1; + global_1 = param_1; function(); let _e7 = global_2.y; global_2.y = -(_e7); diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.spv b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.spv index bba8dfb1..d7addc79 100644 Binary files a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.spv and b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.spv differ diff --git a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.wgsl b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.wgsl index 49acbdde..15d5239d 100644 --- a/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.wgsl +++ b/crates/renderling/shaders/tutorial-tutorial_slabbed_vertices_no_instance.wgsl @@ -1,8 +1,8 @@ -struct type_8 { +struct type_3 { member: array, } -struct type_13 { +struct type_11 { member: u32, member_1: u32, } @@ -23,9 +23,9 @@ struct VertexOutput { @builtin(position) member_1: vec4, } -var global: u32; @group(0) @binding(0) -var global_1: type_8; +var global: type_3; +var global_1: u32; var global_2: vec4 = vec4(0f, 0f, 0f, 1f); var global_3: vec4; @@ -33,18 +33,18 @@ fn function() { var local: array; var local_1: array; var phi_312_: bool; - var phi_180_: type_13; - var phi_181_: type_13; - var phi_204_: type_13; + var phi_180_: type_11; + var phi_181_: type_11; + var phi_204_: type_11; var phi_217_: bool; - var phi_223_: type_13; - var phi_224_: type_13; - var phi_247_: type_13; + var phi_223_: type_11; + var phi_224_: type_11; + var phi_247_: type_11; var phi_261_: bool; var phi_265_: type_18; - let _e42 = global; - let _e44 = arrayLength((&global_1.member)); + let _e42 = global_1; + let _e44 = arrayLength((&global.member)); let _e45 = (_e42 * 26u); if (_e44 >= 26u) { phi_312_ = (_e45 <= (_e44 - 26u)); @@ -53,34 +53,34 @@ fn function() { } let _e50 = phi_312_; if _e50 { - let _e53 = global_1.member[_e45]; - let _e58 = global_1.member[(_e45 + 1u)]; - let _e63 = global_1.member[(_e45 + 2u)]; - let _e69 = global_1.member[(_e45 + 3u)]; - let _e74 = global_1.member[(_e45 + 4u)]; - let _e79 = global_1.member[(_e45 + 5u)]; - let _e84 = global_1.member[(_e45 + 6u)]; - let _e90 = global_1.member[(_e45 + 7u)]; - let _e95 = global_1.member[(_e45 + 8u)]; - let _e101 = global_1.member[(_e45 + 9u)]; - let _e106 = global_1.member[(_e45 + 10u)]; - let _e112 = global_1.member[(_e45 + 11u)]; - let _e117 = global_1.member[(_e45 + 12u)]; - let _e122 = global_1.member[(_e45 + 13u)]; - let _e128 = global_1.member[(_e45 + 14u)]; - let _e133 = global_1.member[(_e45 + 15u)]; - let _e138 = global_1.member[(_e45 + 16u)]; - let _e143 = global_1.member[(_e45 + 17u)]; + let _e53 = global.member[_e45]; + let _e58 = global.member[(_e45 + 1u)]; + let _e63 = global.member[(_e45 + 2u)]; + let _e69 = global.member[(_e45 + 3u)]; + let _e74 = global.member[(_e45 + 4u)]; + let _e79 = global.member[(_e45 + 5u)]; + let _e84 = global.member[(_e45 + 6u)]; + let _e90 = global.member[(_e45 + 7u)]; + let _e95 = global.member[(_e45 + 8u)]; + let _e101 = global.member[(_e45 + 9u)]; + let _e106 = global.member[(_e45 + 10u)]; + let _e112 = global.member[(_e45 + 11u)]; + let _e117 = global.member[(_e45 + 12u)]; + let _e122 = global.member[(_e45 + 13u)]; + let _e128 = global.member[(_e45 + 14u)]; + let _e133 = global.member[(_e45 + 15u)]; + let _e138 = global.member[(_e45 + 16u)]; + let _e143 = global.member[(_e45 + 17u)]; local_1 = array(0u, 0u, 0u, 0u); - phi_180_ = type_13(0u, 4u); + phi_180_ = type_11(0u, 4u); loop { let _e148 = phi_180_; if (_e148.member < _e148.member_1) { - phi_181_ = type_13((_e148.member + 1u), _e148.member_1); - phi_204_ = type_13(1u, _e148.member); + phi_181_ = type_11((_e148.member + 1u), _e148.member_1); + phi_204_ = type_11(1u, _e148.member); } else { phi_181_ = _e148; - phi_204_ = type_13(0u, type_13().member_1); + phi_204_ = type_11(0u, type_11().member_1); } let _e161 = phi_181_; let _e163 = phi_204_; @@ -90,7 +90,7 @@ fn function() { break; } case 1: { - let _e170 = global_1.member[((_e45 + 18u) + _e163.member_1)]; + let _e170 = global.member[((_e45 + 18u) + _e163.member_1)]; local_1[_e163.member_1] = _e170; phi_217_ = true; break; @@ -109,15 +109,15 @@ fn function() { } let _e175 = local_1; local = array(0f, 0f, 0f, 0f); - phi_223_ = type_13(0u, 4u); + phi_223_ = type_11(0u, 4u); loop { let _e178 = phi_223_; if (_e178.member < _e178.member_1) { - phi_224_ = type_13((_e178.member + 1u), _e178.member_1); - phi_247_ = type_13(1u, _e178.member); + phi_224_ = type_11((_e178.member + 1u), _e178.member_1); + phi_247_ = type_11(1u, _e178.member); } else { phi_224_ = _e178; - phi_247_ = type_13(0u, type_13().member_1); + phi_247_ = type_11(0u, type_11().member_1); } let _e191 = phi_224_; let _e193 = phi_247_; @@ -127,7 +127,7 @@ fn function() { break; } case 1: { - let _e200 = global_1.member[((_e45 + 22u) + _e193.member_1)]; + let _e200 = global.member[((_e45 + 22u) + _e193.member_1)]; local[_e193.member_1] = bitcast(_e200); phi_261_ = true; break; @@ -157,7 +157,7 @@ fn function() { @vertex fn tutorialtutorial_slabbed_vertices_no_instance(@builtin(vertex_index) param: u32) -> VertexOutput { - global = param; + global_1 = param; function(); let _e5 = global_2.y; global_2.y = -(_e5); diff --git a/crates/renderling/src/atlas.rs b/crates/renderling/src/atlas.rs index 9a03ea87..abde7f57 100644 --- a/crates/renderling/src/atlas.rs +++ b/crates/renderling/src/atlas.rs @@ -10,10 +10,8 @@ //! on web. //! //! `Atlas` is only available on CPU. Not available in shaders. -use crabslab::SlabItem; -use glam::{UVec2, Vec2, Vec3}; -#[cfg(target_arch = "spirv")] -use spirv_std::num_traits::*; +use crabslab::{Id, Slab, SlabItem}; +use glam::{UVec2, UVec3, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; #[cfg(not(target_arch = "spirv"))] mod atlas_image; @@ -23,6 +21,13 @@ pub use atlas_image::*; mod cpu; #[cfg(not(target_arch = "spirv"))] pub use cpu::*; +use spirv_std::{image::Image2d, spirv, Sampler}; + +/// Describes various qualities of the atlas, to be used on the GPU. +#[derive(Clone, Copy, core::fmt::Debug, Default, PartialEq, SlabItem)] +pub struct AtlasDescriptor { + pub size: UVec3, +} /// Method of addressing the edges of a texture. #[cfg_attr(not(target_arch = "spirv"), derive(Debug))] @@ -71,6 +76,47 @@ impl AtlasTexture { Vec2::new(uv_s, uv_t).extend(self.layer_index as f32) } + + /// Constrain the input `clip_pos` to be within the bounds of this texture + /// within its atlas, in texture space. + pub fn constrain_clip_coords_to_texture_space( + &self, + clip_pos: Vec2, + atlas_size: UVec2, + ) -> Vec2 { + // Convert `clip_pos` into uv coords to figure out where in the texture + // this point lives + let input_uv = (clip_pos * Vec2::new(1.0, -1.0) + Vec2::splat(1.0)) * Vec2::splat(0.5); + self.uv(input_uv, atlas_size).xy() + } + + /// Constrain the input `clip_pos` to be within the bounds of this texture + /// within its atlas. + pub fn constrain_clip_coords(&self, clip_pos: Vec2, atlas_size: UVec2) -> Vec2 { + let uv = self.constrain_clip_coords_to_texture_space(clip_pos, atlas_size); + // Convert `uv` back into clip space + (uv * Vec2::new(2.0, 2.0) - Vec2::splat(1.0)) * Vec2::new(1.0, -1.0) + } + + #[cfg(cpu)] + /// Returns the frame of this texture as a [`wgpu::Origin3d`]. + pub fn origin(&self) -> wgpu::Origin3d { + wgpu::Origin3d { + x: self.offset_px.x, + y: self.offset_px.y, + z: self.layer_index, + } + } + + #[cfg(cpu)] + /// Returns the frame of this texture as a [`wgpu::Extent3d`]. + pub fn size_as_extent(&self) -> wgpu::Extent3d { + wgpu::Extent3d { + width: self.size_px.x, + height: self.size_px.y, + depth_or_array_layers: 1, + } + } } /// Infinitely wrap the input between 0.0 and 1.0. @@ -154,6 +200,54 @@ impl TextureAddressMode { } } +#[derive(Clone, Copy, Default, SlabItem, core::fmt::Debug)] +pub struct AtlasBlittingDescriptor { + pub atlas_texture_id: Id, + pub atlas_desc_id: Id, +} + +/// Vertex shader for blitting a texture into a the frame of an [`AtlasTexture`]. +/// +/// This is useful for copying textures of unsupported formats, or +/// textures of different sizes. +#[spirv(vertex)] +pub fn atlas_blit_vertex( + #[spirv(vertex_index)] vertex_id: u32, + #[spirv(instance_index)] atlas_blitting_desc_id: Id, + #[spirv(descriptor_set = 0, binding = 0, storage_buffer)] slab: &[u32], + out_uv: &mut Vec2, + #[spirv(position)] out_pos: &mut Vec4, +) { + let i = vertex_id as usize; + *out_uv = crate::math::UV_COORD_QUAD_CCW[i]; + + crate::println!("atlas_blitting_desc_id: {atlas_blitting_desc_id:?}"); + let atlas_blitting_desc = slab.read_unchecked(atlas_blitting_desc_id); + crate::println!("atlas_blitting_desc: {atlas_blitting_desc:?}"); + let atlas_texture = slab.read_unchecked(atlas_blitting_desc.atlas_texture_id); + crate::println!("atlas_texture: {atlas_texture:?}"); + let atlas_desc = slab.read_unchecked(atlas_blitting_desc.atlas_desc_id); + crate::println!("atlas_desc: {atlas_desc:?}"); + let clip_pos = crate::math::CLIP_SPACE_COORD_QUAD_CCW[i]; + crate::println!("clip_pos: {clip_pos:?}"); + *out_pos = atlas_texture + .constrain_clip_coords(clip_pos.xy(), atlas_desc.size.xy()) + .extend(clip_pos.z) + .extend(clip_pos.w); + crate::println!("out_pos: {out_pos}"); +} + +/// Fragment shader for blitting a texture into a frame of an atlas. +#[spirv(fragment)] +pub fn atlas_blit_fragment( + #[spirv(descriptor_set = 0, binding = 1)] texture: &Image2d, + #[spirv(descriptor_set = 0, binding = 2)] sampler: &Sampler, + in_uv: Vec2, + frag_color: &mut Vec4, +) { + *frag_color = texture.sample(*sampler, in_uv); +} + #[cfg(test)] mod test { use super::*; @@ -164,4 +258,70 @@ mod test { assert_eq!(1.0, TextureAddressMode::Repeat.wrap(2.0)); assert_eq!(1.0, TextureAddressMode::Repeat.wrap(3.0)); } + + #[test] + /// Tests that clip coordinates can be converted into texture coords within + /// a specific `AtlasTexture`, and back again. + fn constrain_clip_coords_sanity() { + let atlas_texture = AtlasTexture { + offset_px: UVec2::splat(0), + size_px: UVec2::splat(800), + layer_index: 0, + frame_index: 0, + modes: TextureModes { + s: TextureAddressMode::ClampToEdge, + t: TextureAddressMode::ClampToEdge, + }, + }; + let atlas_size = UVec3::new(1024, 1024, 4); + let corners @ [tl, tr, br, bl] = [ + crate::math::CLIP_SPACE_COORD_QUAD_CCW_TL, + crate::math::CLIP_SPACE_COORD_QUAD_CCW_TR, + crate::math::CLIP_SPACE_COORD_QUAD_CCW_BR, + crate::math::CLIP_SPACE_COORD_QUAD_CCW_BL, + ] + .map(|coord| { + atlas_texture.constrain_clip_coords_to_texture_space(coord.xy(), atlas_size.xy()) + }); + log::info!("uv_corners: {corners:#?}"); + + let clip_br = crate::math::CLIP_SPACE_COORD_QUAD_CCW_BR.xy(); + log::info!("clip_br: {clip_br}"); + let input_uv_br = (clip_br * Vec2::new(1.0, -1.0) + Vec2::splat(1.0)) * Vec2::splat(0.5); + log::info!("input_uv_br: {input_uv_br}"); + assert_eq!(Vec2::ONE, input_uv_br, "incorrect uv"); + + let d = 800.0 / 1024.0; + assert_eq!(Vec2::splat(0.0), tl, "incorrect tl"); + assert_eq!(Vec2::new(d, 0.0), tr, "incorrect tr"); + assert_eq!(Vec2::new(d, d), br, "incorrect br"); + assert_eq!(Vec2::new(0.0, d), bl, "incorrect bl"); + + let corners = [ + crate::math::CLIP_SPACE_COORD_QUAD_CCW_TL, + crate::math::CLIP_SPACE_COORD_QUAD_CCW_TR, + crate::math::CLIP_SPACE_COORD_QUAD_CCW_BR, + crate::math::CLIP_SPACE_COORD_QUAD_CCW_BL, + ] + .map(|coord| atlas_texture.constrain_clip_coords(coord.xy(), atlas_size.xy())); + log::info!("clip_corners: {corners:#?}"); + // [ + // Vec2( + // -1.0, + // 1.0, + // ), + // Vec2( + // 0.5625, + // 1.0, + // ), + // Vec2( + // 0.5625, + // -0.5625, + // ), + // Vec2( + // -1.0, + // -0.5625, + // ), + // ] + } } diff --git a/crates/renderling/src/atlas/atlas_image.rs b/crates/renderling/src/atlas/atlas_image.rs index ef6d3fb5..08aa9aee 100644 --- a/crates/renderling/src/atlas/atlas_image.rs +++ b/crates/renderling/src/atlas/atlas_image.rs @@ -1,7 +1,6 @@ //! Images and texture formats. //! -//! Used to represent textures before they are sent to the GPU, in the -//! [`AtlasBuilder`]. +//! Used to represent textures before they are sent to the GPU. use glam::UVec2; use image::EncodableLayout; use snafu::prelude::*; @@ -41,8 +40,10 @@ pub enum AtlasImageFormat { R16G16B16, R16G16B16A16, R16G16B16A16FLOAT, + R32FLOAT, R32G32B32FLOAT, R32G32B32A32FLOAT, + D32FLOAT, } impl AtlasImageFormat { @@ -50,12 +51,33 @@ impl AtlasImageFormat { match value { wgpu::TextureFormat::R8Uint => Some(AtlasImageFormat::R8), wgpu::TextureFormat::R16Uint => Some(AtlasImageFormat::R16), + wgpu::TextureFormat::R32Float => Some(AtlasImageFormat::R32FLOAT), wgpu::TextureFormat::Rg8Uint => Some(AtlasImageFormat::R8G8), wgpu::TextureFormat::Rg16Uint => Some(AtlasImageFormat::R16G16), wgpu::TextureFormat::Rgba16Float => Some(AtlasImageFormat::R16G16B16A16FLOAT), + wgpu::TextureFormat::Depth32Float => Some(AtlasImageFormat::D32FLOAT), _ => None, } } + + pub fn zero_pixel(&self) -> &[u8] { + match self { + AtlasImageFormat::R8 => &[0], + AtlasImageFormat::R8G8 => &[0, 0], + AtlasImageFormat::R8G8B8 => &[0, 0, 0], + AtlasImageFormat::R8G8B8A8 => &[0, 0, 0, 0], + AtlasImageFormat::R16 => &[0, 0], + AtlasImageFormat::R16G16 => &[0, 0, 0, 0], + AtlasImageFormat::R16G16B16 => &[0, 0, 0, 0, 0, 0], + AtlasImageFormat::R16G16B16A16 => &[0, 0, 0, 0, 0, 0, 0, 0], + AtlasImageFormat::R16G16B16A16FLOAT => &[0, 0, 0, 0, 0, 0, 0, 0], + AtlasImageFormat::R32FLOAT | AtlasImageFormat::D32FLOAT => &[0, 0, 0, 0], + AtlasImageFormat::R32G32B32FLOAT => &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + AtlasImageFormat::R32G32B32A32FLOAT => { + &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + } + } } /// Image data in transit from CPU to GPU. @@ -177,55 +199,85 @@ impl AtlasImage { } pub fn into_rgba8(self) -> Option { - let pixels = convert_to_rgba8_bytes(self.pixels, self.format, self.apply_linear_transfer); + let pixels = convert_pixels( + self.pixels, + self.format, + wgpu::TextureFormat::Rgba8Unorm, + self.apply_linear_transfer, + ); image::RgbaImage::from_vec(self.size.x, self.size.y, pixels) } + + /// Returns a new [`AtlasImage`] with zeroed data. + pub fn new(size: UVec2, format: AtlasImageFormat) -> Self { + Self { + pixels: std::iter::repeat_n(format.zero_pixel(), (size.x * size.y) as usize) + .flatten() + .copied() + .collect(), + size, + format, + apply_linear_transfer: false, + } + } } -/// Interpret/convert the pixel data into rgba8 pixels. +fn apply_linear_xfer(bytes: &mut [u8], format: AtlasImageFormat) { + use crate::color::*; + match format { + AtlasImageFormat::R8 + | AtlasImageFormat::R8G8 + | AtlasImageFormat::R8G8B8 + | AtlasImageFormat::R8G8B8A8 => { + bytes.iter_mut().for_each(linear_xfer_u8); + } + AtlasImageFormat::R16 + | AtlasImageFormat::R16G16 + | AtlasImageFormat::R16G16B16 + | AtlasImageFormat::R16G16B16A16 => { + let bytes: &mut [u16] = bytemuck::cast_slice_mut(bytes); + bytes.iter_mut().for_each(linear_xfer_u16); + } + AtlasImageFormat::R16G16B16A16FLOAT => { + let bytes: &mut [u16] = bytemuck::cast_slice_mut(bytes); + bytes.iter_mut().for_each(linear_xfer_f16); + } + AtlasImageFormat::R32G32B32FLOAT + | AtlasImageFormat::R32G32B32A32FLOAT + | AtlasImageFormat::D32FLOAT + | AtlasImageFormat::R32FLOAT => { + let bytes: &mut [f32] = bytemuck::cast_slice_mut(bytes); + bytes.iter_mut().for_each(linear_xfer_f32); + } + } +} + +/// Interpret/convert the `AtlasImage` pixel data into `wgpu::TextureFormat` pixels, +/// if possible. /// /// This applies the linear transfer function if `apply_linear_transfer` is /// `true`. -pub fn convert_to_rgba8_bytes( +pub fn convert_pixels( bytes: impl IntoIterator, - format: AtlasImageFormat, + from_format: AtlasImageFormat, + to_format: wgpu::TextureFormat, apply_linear_transfer: bool, ) -> Vec { use crate::color::*; let mut bytes = bytes.into_iter().collect::>(); - log::trace!("converting image of format {format:?}"); + log::trace!("converting image of format {from_format:?}"); // Convert using linear transfer, if needed if apply_linear_transfer { log::trace!(" converting to linear color space (from sRGB)"); - match format { - AtlasImageFormat::R8 - | AtlasImageFormat::R8G8 - | AtlasImageFormat::R8G8B8 - | AtlasImageFormat::R8G8B8A8 => { - bytes.iter_mut().for_each(linear_xfer_u8); - } - AtlasImageFormat::R16 - | AtlasImageFormat::R16G16 - | AtlasImageFormat::R16G16B16 - | AtlasImageFormat::R16G16B16A16 => { - let bytes: &mut [u16] = bytemuck::cast_slice_mut(&mut bytes); - bytes.iter_mut().for_each(linear_xfer_u16); - } - AtlasImageFormat::R16G16B16A16FLOAT => { - let bytes: &mut [u16] = bytemuck::cast_slice_mut(&mut bytes); - bytes.iter_mut().for_each(linear_xfer_f16); - } - AtlasImageFormat::R32G32B32FLOAT | AtlasImageFormat::R32G32B32A32FLOAT => { - let bytes: &mut [f32] = bytemuck::cast_slice_mut(&mut bytes); - bytes.iter_mut().for_each(linear_xfer_f32); - } - } + apply_linear_xfer(&mut bytes, from_format); } - // Convert to rgba8 - match format { - AtlasImageFormat::R8 => bytes.into_iter().flat_map(|r| [r, 0, 0, 255]).collect(), - AtlasImageFormat::R8G8 => bytes + // Hamfisted conversion to `to_format` + match (from_format, to_format) { + (AtlasImageFormat::R8, wgpu::TextureFormat::Rgba8Unorm) => { + bytes.into_iter().flat_map(|r| [r, 0, 0, 255]).collect() + } + (AtlasImageFormat::R8G8, wgpu::TextureFormat::Rgba8Unorm) => bytes .chunks_exact(2) .flat_map(|p| { if let [r, g] = p { @@ -235,7 +287,7 @@ pub fn convert_to_rgba8_bytes( } }) .collect(), - AtlasImageFormat::R8G8B8 => bytes + (AtlasImageFormat::R8G8B8, wgpu::TextureFormat::Rgba8Unorm) => bytes .chunks_exact(3) .flat_map(|p| { if let [r, g, b] = p { @@ -245,64 +297,83 @@ pub fn convert_to_rgba8_bytes( } }) .collect(), - AtlasImageFormat::R8G8B8A8 => bytes, - AtlasImageFormat::R16 => bytemuck::cast_slice::(&bytes) - .iter() - .flat_map(|r| [u16_to_u8(*r), 0, 0, 255]) - .collect(), - AtlasImageFormat::R16G16 => bytemuck::cast_slice::(&bytes) - .chunks_exact(2) - .flat_map(|p| { - if let [r, g] = p { - [u16_to_u8(*r), u16_to_u8(*g), 0, 255] - } else { - unreachable!() - } - }) - .collect(), - AtlasImageFormat::R16G16B16 => bytemuck::cast_slice::(&bytes) - .chunks_exact(3) - .flat_map(|p| { - if let [r, g, b] = p { - [u16_to_u8(*r), u16_to_u8(*g), u16_to_u8(*b), 255] - } else { - unreachable!() - } - }) - .collect(), + (AtlasImageFormat::R8G8B8A8, wgpu::TextureFormat::Rgba8Unorm) => bytes, + (AtlasImageFormat::R16, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .iter() + .flat_map(|r| [u16_to_u8(*r), 0, 0, 255]) + .collect() + } + (AtlasImageFormat::R16G16, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .chunks_exact(2) + .flat_map(|p| { + if let [r, g] = p { + [u16_to_u8(*r), u16_to_u8(*g), 0, 255] + } else { + unreachable!() + } + }) + .collect() + } + (AtlasImageFormat::R16G16B16, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .chunks_exact(3) + .flat_map(|p| { + if let [r, g, b] = p { + [u16_to_u8(*r), u16_to_u8(*g), u16_to_u8(*b), 255] + } else { + unreachable!() + } + }) + .collect() + } - AtlasImageFormat::R16G16B16A16 => bytemuck::cast_slice::(&bytes) - .iter() - .copied() - .map(u16_to_u8) - .collect(), - AtlasImageFormat::R16G16B16A16FLOAT => bytemuck::cast_slice::(&bytes) - .iter() - .map(|bits| half::f16::from_bits(*bits).to_f32()) - .collect::>() - .chunks_exact(4) - .flat_map(|p| { - if let [r, g, b, a] = p { - [f32_to_u8(*r), f32_to_u8(*g), f32_to_u8(*b), f32_to_u8(*a)] - } else { - unreachable!() - } - }) - .collect(), - AtlasImageFormat::R32G32B32FLOAT => bytemuck::cast_slice::(&bytes) - .chunks_exact(3) - .flat_map(|p| { - if let [r, g, b] = p { - [f32_to_u8(*r), f32_to_u8(*g), f32_to_u8(*b), 255] - } else { - unreachable!() - } - }) - .collect(), - AtlasImageFormat::R32G32B32A32FLOAT => bytemuck::cast_slice::(&bytes) - .iter() - .copied() - .map(f32_to_u8) - .collect(), + (AtlasImageFormat::R16G16B16A16, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .iter() + .copied() + .map(u16_to_u8) + .collect() + } + (AtlasImageFormat::R16G16B16A16FLOAT, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .iter() + .map(|bits| half::f16::from_bits(*bits).to_f32()) + .collect::>() + .chunks_exact(4) + .flat_map(|p| { + if let [r, g, b, a] = p { + [f32_to_u8(*r), f32_to_u8(*g), f32_to_u8(*b), f32_to_u8(*a)] + } else { + unreachable!() + } + }) + .collect() + } + (AtlasImageFormat::R32G32B32FLOAT, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .chunks_exact(3) + .flat_map(|p| { + if let [r, g, b] = p { + [f32_to_u8(*r), f32_to_u8(*g), f32_to_u8(*b), 255] + } else { + unreachable!() + } + }) + .collect() + } + (AtlasImageFormat::R32G32B32A32FLOAT, wgpu::TextureFormat::Rgba8Unorm) + | (AtlasImageFormat::R32FLOAT, wgpu::TextureFormat::Rgba8Unorm) + | (AtlasImageFormat::D32FLOAT, wgpu::TextureFormat::Rgba8Unorm) => { + bytemuck::cast_slice::(&bytes) + .iter() + .copied() + .map(f32_to_u8) + .collect() + } + (AtlasImageFormat::R32FLOAT, wgpu::TextureFormat::R32Float) => bytes, + // TODO: add more atlas format conversions + (from, to) => panic!("cannot convert from atlas format {from:?} to {to:?}"), } } diff --git a/crates/renderling/src/atlas/cpu.rs b/crates/renderling/src/atlas/cpu.rs index a711c744..49dbcfb7 100644 --- a/crates/renderling/src/atlas/cpu.rs +++ b/crates/renderling/src/atlas/cpu.rs @@ -1,19 +1,25 @@ -use core::ops::Deref; -use std::sync::{Arc, RwLock}; +use core::{ops::Deref, sync::atomic::AtomicUsize}; +use std::sync::{Arc, Mutex, RwLock}; use craballoc::{ prelude::{Hybrid, SlabAllocator, WeakHybrid}, runtime::WgpuRuntime, + slab::SlabBuffer, }; -use glam::UVec2; +use crabslab::Id; +use glam::{UVec2, UVec3}; use image::RgbaImage; use snafu::{prelude::*, OptionExt}; -use crate::texture::Texture; +use crate::{ + atlas::AtlasDescriptor, + bindgroup::ManagedBindGroup, + texture::{CopiedTextureBuffer, Texture}, +}; use super::{ - atlas_image::{convert_to_rgba8_bytes, AtlasImage}, - AtlasTexture, + atlas_image::{convert_pixels, AtlasImage}, + AtlasBlittingDescriptor, AtlasTexture, }; pub(crate) const ATLAS_SUGGESTED_SIZE: u32 = 2048; @@ -32,6 +38,9 @@ pub enum AtlasError { #[snafu(display("Missing slab during staging"))] StagingMissingSlab, + + #[snafu(display("Missing bindgroup {layer}"))] + MissingBindgroup { layer: u32 }, } /// Used to track textures internally. @@ -66,15 +75,13 @@ impl InternalAtlasTexture { } } -pub(crate) fn check_size(size: wgpu::Extent3d) -> Result<(), AtlasError> { +pub(crate) fn check_size(size: wgpu::Extent3d) { let conditions = size.depth_or_array_layers >= 2 && size.width == size.height && (size.width & (size.width - 1)) == 0; if !conditions { - return SizeSnafu { size }.fail(); + log::error!("{}", AtlasError::Size { size }); } - - Ok(()) } fn fan_split_n(n: usize, input: impl IntoIterator) -> Vec> { @@ -128,43 +135,41 @@ pub struct Layer { /// Clones of `Atlas` all point to the same internal data. #[derive(Clone)] pub struct Atlas { + pub(crate) slab: SlabAllocator, texture_array: Arc>, layers: Arc>>, + label: Option, + descriptor: Hybrid, } impl Atlas { - /// Create a new atlas with `size` and `num_layers` layers. - /// - /// `size` **must be a power of two**. - /// - /// ## Panics - /// Panics if `size` is _not_ a power of two. - fn new_with_texture(texture: Texture) -> Self { - let num_layers = texture.texture.size().depth_or_array_layers as usize; - let layers = vec![Layer::default(); num_layers]; - log::trace!("created atlas with {num_layers} layers"); - Atlas { - layers: Arc::new(RwLock::new(layers)), - texture_array: Arc::new(RwLock::new(texture)), - } + const LABEL: Option<&str> = Some("atlas-texture"); + + pub fn device(&self) -> &wgpu::Device { + self.slab.device() } /// Create the initial texture to use. fn create_texture( runtime: impl AsRef, size: wgpu::Extent3d, - ) -> Result { + format: Option, + label: Option<&str>, + usage: Option, + ) -> Texture { let device = &runtime.as_ref().device; let queue = &runtime.as_ref().queue; - check_size(size)?; + check_size(size); + let usage = usage.unwrap_or(wgpu::TextureUsages::empty()); let texture = device.create_texture(&wgpu::TextureDescriptor { - label: Some("atlas texture"), + label: Some(label.unwrap_or(Self::LABEL.unwrap())), size, mip_level_count: 1, sample_count: 1, dimension: wgpu::TextureDimension::D2, - format: wgpu::TextureFormat::Rgba8Unorm, - usage: wgpu::TextureUsages::TEXTURE_BINDING + format: format.unwrap_or(wgpu::TextureFormat::Rgba8Unorm), + usage: usage + | wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::COPY_SRC, view_formats: &[], @@ -197,12 +202,7 @@ impl Atlas { ..Default::default() }; - Ok(Texture::from_wgpu_tex( - device, - texture, - Some(sampler_desc), - None, - )) + Texture::from_wgpu_tex(device, texture, Some(sampler_desc), None) } /// Create a new atlas. @@ -211,10 +211,33 @@ impl Atlas { /// /// ## Panics /// Panics if `size` is not a power of two. - pub fn new(runtime: impl AsRef, size: wgpu::Extent3d) -> Result { - log::trace!("creating new atlas with dimensions {size:?}"); - let texture = Self::create_texture(runtime, size)?; - Ok(Self::new_with_texture(texture)) + pub fn new( + slab: &SlabAllocator, + size: wgpu::Extent3d, + format: Option, + label: Option<&str>, + usage: Option, + ) -> Self { + let texture = Self::create_texture(slab.runtime(), size, format, label, usage); + let num_layers = texture.texture.size().depth_or_array_layers as usize; + let layers = vec![Layer::default(); num_layers]; + log::trace!("creating new atlas with dimensions {size:?}, {num_layers} layers"); + let descriptor = slab.new_value(AtlasDescriptor { + size: UVec3::new(size.width, size.height, size.depth_or_array_layers), + }); + let label = label.map(|s| s.to_owned()); + + Atlas { + slab: slab.clone(), + layers: Arc::new(RwLock::new(layers)), + texture_array: Arc::new(RwLock::new(texture)), + descriptor, + label, + } + } + + pub fn descriptor_id(&self) -> Id { + self.descriptor.id() } pub fn len(&self) -> usize { @@ -228,10 +251,10 @@ impl Atlas { self.len() == 0 } - /// Returns a clone of the current atlas texture array. - pub fn get_texture(&self) -> Texture { + /// Returns a reference to the current atlas texture array. + pub fn get_texture(&self) -> impl Deref + '_ { // UNWRAP: panic on purpose - self.texture_array.read().unwrap().clone() + self.texture_array.read().unwrap() } pub fn get_layers(&self) -> impl Deref> + '_ { @@ -244,7 +267,6 @@ impl Atlas { /// Any existing `Hybrid`s will be invalidated. pub fn set_images( &self, - slab: &SlabAllocator, images: &[AtlasImage], ) -> Result>, AtlasError> { log::debug!("setting images"); @@ -257,7 +279,7 @@ impl Atlas { vec![Layer::default(); texture.texture.size().depth_or_array_layers as usize]; let _old_layers = std::mem::replace(layers, new_layers); } - self.add_images(slab, images) + self.add_images(images) } pub fn get_size(&self) -> wgpu::Extent3d { @@ -265,11 +287,10 @@ impl Atlas { self.texture_array.read().unwrap().texture.size() } - // TODO: Atlas should probably clone a reference to the runtime and the slab. - pub fn add_images( + /// Add the given images + pub fn add_images<'a>( &self, - slab: &SlabAllocator, - images: &[AtlasImage], + images: impl IntoIterator, ) -> Result>, AtlasError> { // UNWRAP: POP let mut layers = self.layers.write().unwrap(); @@ -280,11 +301,12 @@ impl Atlas { .context(CannotPackTexturesSnafu { size: extent })?; let mut staged = StagedResources::try_staging( - slab.runtime(), + self.slab.runtime(), extent, newly_packed_layers, - Some(slab), + Some(&self.slab), &texture_array, + self.label.as_deref(), )?; // Commit our newly staged values, now that everything is done. @@ -319,6 +341,7 @@ impl Atlas { newly_packed_layers, None::<&SlabAllocator>, &texture_array, + self.label.as_deref(), )?; // Commit our newly staged values, now that everything is done. @@ -363,39 +386,68 @@ impl Atlas { } } - /// Read the atlas image from the GPU. + /// Read the atlas image from the GPU into a [`CopiedTextureBuffer`]. /// /// This is primarily for testing. /// - /// The resulting image will be in a **linear** color space. - /// /// ## Panics - /// Panics if the pixels read from the GPU cannot be converted into an - /// `RgbaImage`. - pub fn atlas_img(&self, ctx: &crate::Context, layer: u32) -> RgbaImage { + /// Panics if the pixels read from the GPU cannot be read. + pub fn atlas_img_buffer( + &self, + runtime: impl AsRef, + layer: u32, + ) -> CopiedTextureBuffer { + let runtime = runtime.as_ref(); let tex = self.get_texture(); let size = tex.texture.size(); - let buffer = Texture::read_from( - ctx, + let (channels, subpixel_bytes) = + crate::texture::wgpu_texture_format_channels_and_subpixel_bytes(tex.texture.format()); + log::info!("atlas_texture_format: {:#?}", tex.texture.format()); + log::info!("atlas_texture_channels: {channels:#?}"); + log::info!("atlas_texture_subpixel_bytes: {subpixel_bytes:#?}"); + Texture::read_from( + runtime, &tex.texture, size.width as usize, size.height as usize, - 4, - 1, + channels as usize, + subpixel_bytes as usize, 0, Some(wgpu::Origin3d { x: 0, y: 0, z: layer, }), - ); - buffer.into_linear_rgba(ctx.get_device()).unwrap() + ) + } + + /// Read the atlas image from the GPU. + /// + /// This is primarily for testing. + /// + /// The resulting image will be in a **linear** color space. + /// + /// ## Panics + /// Panics if the pixels read from the GPU cannot be converted into an + /// `RgbaImage`. + pub fn atlas_img(&self, runtime: impl AsRef, layer: u32) -> RgbaImage { + let runtime = runtime.as_ref(); + let buffer = self.atlas_img_buffer(runtime, layer); + buffer.into_linear_rgba(&runtime.device).unwrap() + } + + pub fn read_images(&self, runtime: impl AsRef) -> Vec { + let mut images = vec![]; + for i in 0..self.layers.read().unwrap().len() { + images.push(self.atlas_img(runtime.as_ref(), i as u32)); + } + images } } fn pack_images<'a>( layers: &[Layer], - images: &'a [AtlasImage], + images: impl IntoIterator, extent: wgpu::Extent3d, ) -> Option>>> { let mut new_packing: Vec = { @@ -414,7 +466,7 @@ fn pack_images<'a>( }) .chain( images - .iter() + .into_iter() .enumerate() .map(|(i, image)| AnotherPacking::Img { original_index: i, @@ -462,9 +514,16 @@ impl StagedResources { newly_packed_layers: Vec>, slab: Option<&SlabAllocator>, old_texture_array: &Texture, + label: Option<&str>, ) -> Result { let runtime = runtime.as_ref(); - let new_texture_array = Atlas::create_texture(runtime, extent)?; + let new_texture_array = Atlas::create_texture( + runtime, + extent, + Some(old_texture_array.texture.format()), + label, + Some(old_texture_array.texture.usage()), + ); let mut output = vec![]; let mut encoder = runtime .device @@ -504,9 +563,10 @@ impl StagedResources { .push(InternalAtlasTexture::from_hybrid(&texture)); output.push((original_index, texture)); - let bytes = convert_to_rgba8_bytes( + let bytes = convert_pixels( image.pixels.clone(), image.format, + old_texture_array.texture.format(), image.apply_linear_transfer, ); @@ -529,14 +589,14 @@ impl StagedResources { // write the new image from the CPU to the new texture runtime.queue.write_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &new_texture_array.texture, mip_level: 0, origin, aspect: wgpu::TextureAspect::All, }, &bytes, - wgpu::ImageDataLayout { + wgpu::TexelCopyBufferLayout { offset: 0, bytes_per_row: Some(4 * size_px.x), rows_per_image: Some(size_px.y), @@ -551,17 +611,13 @@ impl StagedResources { // copy the frame from the old texture to the new texture // in a new destination encoder.copy_texture_to_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &old_texture_array.texture, mip_level: 0, - origin: wgpu::Origin3d { - x: t.offset_px.x, - y: t.offset_px.y, - z: t.layer_index, - }, + origin: t.origin(), aspect: wgpu::TextureAspect::All, }, - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &new_texture_array.texture, mip_level: 0, origin: wgpu::Origin3d { @@ -571,11 +627,7 @@ impl StagedResources { }, aspect: wgpu::TextureAspect::All, }, - wgpu::Extent3d { - width: size_px.x, - height: size_px.y, - depth_or_array_layers: 1, - }, + t.size_as_extent(), ); t.layer_index = layer_index as u32; @@ -597,6 +649,275 @@ impl StagedResources { } } +/// A reusable blitting operation that copies a source texture into a specific +/// frame of an [`Atlas`]. +#[derive(Clone)] +pub struct AtlasBlittingOperation { + atlas_slab_buffer: Arc>>, + pipeline: Arc, + bindgroups: Arc>, + bindgroup_layout: Arc, + sampler: Arc, + from_texture_id: Arc, + pub(crate) desc: Hybrid, +} + +impl AtlasBlittingOperation { + /// Copies the data from texture this [`AtlasBlittingOperation`] was created with + /// into the atlas. + /// + /// The original items used to create the inner bind group are required here, to + /// determine whether or not the bind group needs to be invalidated. + pub fn run( + &self, + runtime: impl AsRef, + encoder: &mut wgpu::CommandEncoder, + from_texture: &crate::texture::Texture, + layer: u32, + to_atlas: &Atlas, + atlas_texture: &Hybrid, + ) -> Result<(), AtlasError> { + let runtime = runtime.as_ref(); + + // update the descriptor + self.desc.set(AtlasBlittingDescriptor { + atlas_texture_id: atlas_texture.id(), + atlas_desc_id: to_atlas.descriptor_id(), + }); + // sync the update + let _ = to_atlas.slab.commit(); + + let to_atlas_texture = to_atlas.get_texture(); + let mut atlas_slab_buffer = self.atlas_slab_buffer.lock().unwrap(); + let atlas_slab_invalid = atlas_slab_buffer.update_if_invalid(); + let from_texture_has_been_replaced = { + let prev_id = self + .from_texture_id + .swap(from_texture.id(), std::sync::atomic::Ordering::Relaxed); + from_texture.id() != prev_id + }; + let should_invalidate = atlas_slab_invalid || from_texture_has_been_replaced; + let view = from_texture + .texture + .create_view(&wgpu::TextureViewDescriptor { + label: Some("atlas-blitting"), + base_array_layer: layer, + array_layer_count: Some(1), + dimension: Some(wgpu::TextureViewDimension::D2), + ..Default::default() + }); + let bindgroup = self + .bindgroups + .get(layer as usize) + .context(MissingBindgroupSnafu { layer })? + .get(should_invalidate, || { + runtime + .device + .create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("atlas-blitting"), + layout: &self.bindgroup_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Buffer( + atlas_slab_buffer.deref().as_entire_buffer_binding(), + ), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&self.sampler), + }, + ], + }) + }); + + let atlas_texture = atlas_texture.get(); + let atlas_view = to_atlas_texture + .texture + .create_view(&wgpu::TextureViewDescriptor { + label: Some("atlas-blitting"), + format: None, + dimension: Some(wgpu::TextureViewDimension::D2), + usage: None, + aspect: wgpu::TextureAspect::All, + base_mip_level: 0, + mip_level_count: None, + base_array_layer: atlas_texture.layer_index, + array_layer_count: Some(1), + }); + let mut pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("atlas-blitter"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &atlas_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, + }); + pass.set_pipeline(&self.pipeline); + pass.set_bind_group(0, Some(bindgroup.as_ref()), &[]); + let id = self.desc.id(); + pass.draw(0..6, id.inner()..id.inner() + 1); + Ok(()) + } +} + +/// A texture blitting utility. +/// +/// [`AtlasBlitter`] copies textures to specific frames within the texture atlas. +/// +/// Use this if you want to just render/copy texture A to texture B where +/// [CommandEncoder::copy_texture_to_texture] would not work because of either +/// - Textures are in incompatible formats +/// - Textures are of different sizes +#[derive(Clone)] +pub struct AtlasBlitter { + pipeline: Arc, + bind_group_layout: Arc, + sampler: Arc, +} + +impl AtlasBlitter { + /// Returns a new [`TextureBlitter`] + /// # Arguments + /// - `device` - A [`Device`] + /// - `format` - The [`TextureFormat`] of the texture that will be copied to. This has to be renderable. + /// - `sample_type` - The [`Sampler`] Filtering Mode + pub fn new( + device: &wgpu::Device, + format: wgpu::TextureFormat, + sample_type: wgpu::FilterMode, + ) -> Self { + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + label: Some("atlas-blitter"), + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: sample_type, + ..Default::default() + }); + + let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("atlas-blitter"), + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { + filterable: sample_type == wgpu::FilterMode::Linear, + }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(if sample_type == wgpu::FilterMode::Linear { + wgpu::SamplerBindingType::Filtering + } else { + wgpu::SamplerBindingType::NonFiltering + }), + count: None, + }, + ], + }); + + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("atlas-blitter"), + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + + let vertex = crate::linkage::atlas_blit_vertex::linkage(device); + let fragment = crate::linkage::atlas_blit_fragment::linkage(device); + let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("atlas-blitter"), + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &vertex.module, + entry_point: Some(vertex.entry_point), + 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: Some(fragment.entry_point), + compilation_options: wgpu::PipelineCompilationOptions::default(), + targets: &[Some(wgpu::ColorTargetState { + format, + blend: None, + write_mask: wgpu::ColorWrites::ALL, + })], + }), + multiview: None, + cache: None, + }); + + Self { + pipeline: pipeline.into(), + bind_group_layout: bind_group_layout.into(), + sampler: sampler.into(), + } + } + + pub fn new_blitting_operation( + &self, + into_atlas: &Atlas, + layers: usize, + ) -> AtlasBlittingOperation { + AtlasBlittingOperation { + desc: into_atlas + .slab + .new_value(AtlasBlittingDescriptor::default()), + atlas_slab_buffer: Arc::new(Mutex::new(into_atlas.slab.commit())), + bindgroups: { + let mut bgs = vec![]; + for _ in 0..layers { + bgs.push(ManagedBindGroup::default()); + } + Arc::new(bgs) + }, + pipeline: self.pipeline.clone(), + sampler: self.sampler.clone(), + bindgroup_layout: self.bind_group_layout.clone(), + from_texture_id: Default::default(), + } + } +} + #[cfg(test)] mod test { use crate::{ diff --git a/crates/renderling/src/bindgroup.rs b/crates/renderling/src/bindgroup.rs new file mode 100644 index 00000000..e90b68de --- /dev/null +++ b/crates/renderling/src/bindgroup.rs @@ -0,0 +1,59 @@ +//! A helper wrapper around `Arc>>` that provides invalidation. + +use std::sync::{Arc, RwLock}; + +/// A [`wgpu::BindGroup`] with invalidation. +/// +/// This struct exists to simplify the common pattern of invalidating and +/// re-creating bindgroups. +#[derive(Clone)] +pub struct ManagedBindGroup { + bindgroup: Arc>>>, +} + +impl Default for ManagedBindGroup { + fn default() -> Self { + Self::new() + } +} + +impl From for ManagedBindGroup { + fn from(value: wgpu::BindGroup) -> Self { + let mbg = ManagedBindGroup::new(); + // UNWRAP: POP + *mbg.bindgroup.write().unwrap() = Some(value.into()); + mbg + } +} + +impl ManagedBindGroup { + pub fn new() -> Self { + Self { + bindgroup: Arc::new(RwLock::new(None)), + } + } + + pub fn get( + &self, + should_invalidate: bool, + fn_recreate: impl FnOnce() -> wgpu::BindGroup, + ) -> Arc { + let recreate = || { + let mut guard = self.bindgroup.write().unwrap(); + + let bg = Arc::new(fn_recreate()); + *guard = Some(bg.clone()); + bg + }; + if should_invalidate { + recreate() + } else { + let maybe_buffer = self.bindgroup.read().unwrap().clone(); + if let Some(buffer) = maybe_buffer { + buffer + } else { + recreate() + } + } + } +} diff --git a/crates/renderling/src/bloom/cpu.rs b/crates/renderling/src/bloom/cpu.rs index 1ad04d13..0bab8bd8 100644 --- a/crates/renderling/src/bloom/cpu.rs +++ b/crates/renderling/src/bloom/cpu.rs @@ -5,6 +5,7 @@ use std::sync::{Arc, RwLock}; use craballoc::{ prelude::{Hybrid, HybridArray, SlabAllocator}, runtime::WgpuRuntime, + slab::SlabBuffer, }; use crabslab::Id; use glam::{UVec2, Vec2}; @@ -384,6 +385,7 @@ fn create_mix_bindgroup( #[derive(Clone)] pub struct Bloom { slab: SlabAllocator, + slab_buffer: SlabBuffer, downsample_pixel_sizes: HybridArray, downsample_pipeline: Arc, @@ -414,7 +416,7 @@ impl Bloom { let upsample_filter_radius = slab.new_value(1.0 / Vec2::new(resolution.x as f32, resolution.y as f32)); let mix_strength = slab.new_value(0.04f32); - let slab_buffer = slab.get_updated_buffer(); + let slab_buffer = slab.commit(); let downsample_pipeline = Arc::new(create_bloom_downsample_pipeline(&runtime.device)); let upsample_pipeline = Arc::new(create_bloom_upsample_pipeline(&runtime.device)); @@ -452,6 +454,7 @@ impl Bloom { Self { slab, + slab_buffer, downsample_pixel_sizes, downsample_pipeline, upsample_filter_radius, @@ -681,8 +684,9 @@ impl Bloom { } pub fn bloom(&self, device: &wgpu::Device, queue: &wgpu::Queue) { + self.slab.commit(); assert!( - self.slab.upkeep().is_none(), + self.slab_buffer.is_valid(), "bloom slab buffer should never resize" ); self.render_downsamples(device, queue); diff --git a/crates/renderling/src/bvol.rs b/crates/renderling/src/bvol.rs index 6ed86821..4ed69a51 100644 --- a/crates/renderling/src/bvol.rs +++ b/crates/renderling/src/bvol.rs @@ -192,7 +192,10 @@ pub struct Frustum { /// each expressed as a normal vector (xyz) and the distance (w) /// from the origin along that vector. pub planes: [Vec4; 6], + /// Points representing the corners of the frustum pub points: [Vec3; 8], + /// Centroid of the corners of the frustum + pub center: Vec3, } impl Frustum { @@ -254,6 +257,7 @@ impl Frustum { let nrb = intersect_planes(&near, &right, &bottom); Self { + center: (nlt + nrt + nlb + nrb) / 4.0, planes: [near, left, right, bottom, top, far], points: [nlt, nrt, nlb, nrb, flt, frt, flb, frb], } @@ -306,6 +310,10 @@ impl Frustum { } true } + + pub fn depth(&self) -> f32 { + (self.planes[0].w - self.planes[5].w).abs() + } } /// Bounding sphere consisting of a center and radius. diff --git a/crates/renderling/src/camera.rs b/crates/renderling/src/camera.rs index a9f96561..0e0ab952 100644 --- a/crates/renderling/src/camera.rs +++ b/crates/renderling/src/camera.rs @@ -1,6 +1,6 @@ //! Camera projection, view and utilities. use crabslab::SlabItem; -use glam::{Mat4, Vec3}; +use glam::{Mat4, Vec3, Vec4}; use crate::bvol::{dist_bpp, Frustum}; @@ -81,6 +81,14 @@ impl Camera { self.projection * self.view } + pub fn near_plane(&self) -> Vec4 { + self.frustum.planes[0] + } + + pub fn far_plane(&self) -> Vec4 { + self.frustum.planes[5] + } + /// Returns **roughly** the location of the znear plane. pub fn z_near(&self) -> f32 { dist_bpp(&self.frustum.planes[0], self.position) @@ -89,6 +97,18 @@ impl Camera { pub fn z_far(&self) -> f32 { dist_bpp(&self.frustum.planes[5], self.position) } + + pub fn depth(&self) -> f32 { + self.frustum.depth() + } + + #[warn(soft_unstable, reason = "depth linearization is currently unreliable")] + pub fn linearize_depth(&self, d: f32) -> f32 { + // TODO: figure out why z_near and z_far come out equal in ortho + let z_near = self.z_near(); + let z_far = self.z_far(); + z_near * z_far / (z_far + d * (z_near - z_far)) + } } /// Returns the projection and view matrices for a camera with default diff --git a/crates/renderling/src/context.rs b/crates/renderling/src/context.rs index 770fa11a..c9667322 100644 --- a/crates/renderling/src/context.rs +++ b/crates/renderling/src/context.rs @@ -170,7 +170,7 @@ fn new_instance(backends: Option) -> wgpu::Instance { ); // BackendBit::PRIMARY => Vulkan + Metal + DX12 + Browser WebGPU let backends = backends.unwrap_or(wgpu::Backends::PRIMARY); - let instance = wgpu::Instance::new(wgpu::InstanceDescriptor { + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { backends, ..Default::default() }); @@ -338,9 +338,9 @@ impl Frame { // Copy the data from the surface texture to the buffer encoder.copy_texture_to_buffer( texture.as_image_copy(), - wgpu::ImageCopyBuffer { + wgpu::TexelCopyBufferInfo { buffer: &buffer, - layout: wgpu::ImageDataLayout { + layout: wgpu::TexelCopyBufferLayout { offset: 0, bytes_per_row: Some(dimensions.padded_bytes_per_row as u32), rows_per_image: None, @@ -601,6 +601,10 @@ impl Context { Texture::from_wgpu_tex(self.get_device(), texture, sampler, None) } + pub fn runtime(&self) -> &WgpuRuntime { + &self.runtime + } + pub fn get_device(&self) -> &wgpu::Device { &self.runtime.device } @@ -662,7 +666,7 @@ impl Context { height: size.y, depth_or_array_layers: size.z, }; - crate::atlas::check_size(size).unwrap(); + crate::atlas::check_size(size); *self.atlas_size.write().unwrap() = size; self } diff --git a/crates/renderling/src/cubemap.rs b/crates/renderling/src/cubemap.rs index aef2a8fd..c986fda3 100644 --- a/crates/renderling/src/cubemap.rs +++ b/crates/renderling/src/cubemap.rs @@ -1,121 +1,202 @@ -//! Render pipelines and layouts for creating cubemaps. - -use crate::texture::Texture; - -pub fn cubemap_making_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { - device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { - label: Some("cubemap-making bindgroup"), - entries: &[ - wgpu::BindGroupLayoutEntry { - binding: 0, - visibility: wgpu::ShaderStages::VERTEX, - ty: wgpu::BindingType::Buffer { - ty: wgpu::BufferBindingType::Storage { read_only: true }, - has_dynamic_offset: false, - min_binding_size: None, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 1, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Texture { - sample_type: wgpu::TextureSampleType::Float { filterable: false }, - view_dimension: wgpu::TextureViewDimension::D2, - multisampled: false, - }, - count: None, - }, - wgpu::BindGroupLayoutEntry { - binding: 2, - visibility: wgpu::ShaderStages::FRAGMENT, - ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering), - count: None, - }, - ], - }) +//! Cubemap utilities. +//! +//! Shaders, render pipelines and layouts for creating and sampling cubemaps. +//! +//! For more info see: +//! * +use crabslab::{Array, Id, Slab}; +use glam::{Mat4, Vec2, Vec3, Vec3Swizzles, Vec4}; +use spirv_std::{num_traits::Zero, spirv}; + +#[cfg(cpu)] +mod cpu; +#[cfg(cpu)] +pub use cpu::*; + +use crate::{ + atlas::{AtlasDescriptor, AtlasTexture}, + math::{IsSampler, Sample2dArray}, +}; + +/// Vertex shader for testing cubemap sampling. +#[spirv(vertex)] +pub fn cubemap_sampling_test_vertex( + #[spirv(vertex_index)] vertex_index: u32, + #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] uv: &Vec3, + out_uv: &mut Vec3, + #[spirv(position)] out_clip_coords: &mut Vec4, +) { + let vertex_index = vertex_index as usize % 6; + *out_clip_coords = crate::math::CLIP_SPACE_COORD_QUAD_CCW[vertex_index]; + *out_uv = *uv; +} + +/// Vertex shader for testing cubemap sampling. +#[spirv(fragment)] +pub fn cubemap_sampling_test_fragment( + #[spirv(descriptor_set = 0, binding = 1)] cubemap: &spirv_std::image::Cubemap, + #[spirv(descriptor_set = 0, binding = 2)] sampler: &spirv_std::Sampler, + in_uv: Vec3, + frag_color: &mut Vec4, +) { + *frag_color = cubemap.sample(*sampler, in_uv); +} + +/// Represents one side of a cubemap. +/// +/// Assumes the camera is at the origin, inside the cube, with +/// a left-handed coordinate system (+Z going into the screen). +#[derive(Clone, Copy)] +pub struct CubemapFaceDirection { + /// Where is the camera + pub eye: Vec3, + /// Where is the camera looking + pub dir: Vec3, + /// Which direction is up + pub up: Vec3, } -pub fn cubemap_making_bindgroup( - device: &wgpu::Device, - label: Option<&str>, - buffer: &wgpu::Buffer, - // The texture to sample the environment from - texture: &Texture, -) -> wgpu::BindGroup { - device.create_bind_group(&wgpu::BindGroupDescriptor { - label, - layout: &cubemap_making_bindgroup_layout(device), - entries: &[ - wgpu::BindGroupEntry { - binding: 0, - resource: wgpu::BindingResource::Buffer(buffer.as_entire_buffer_binding()), - }, - wgpu::BindGroupEntry { - binding: 1, - resource: wgpu::BindingResource::TextureView(&texture.view), - }, - wgpu::BindGroupEntry { - binding: 2, - resource: wgpu::BindingResource::Sampler(&texture.sampler), - }, - ], - }) +impl CubemapFaceDirection { + pub const X: Self = Self { + eye: Vec3::ZERO, + dir: Vec3::X, + up: Vec3::Y, + }; + pub const NEG_X: Self = Self { + eye: Vec3::ZERO, + dir: Vec3::NEG_X, + up: Vec3::Y, + }; + + pub const Y: Self = Self { + eye: Vec3::ZERO, + dir: Vec3::Y, + up: Vec3::NEG_Z, + }; + pub const NEG_Y: Self = Self { + eye: Vec3::ZERO, + dir: Vec3::NEG_Y, + up: Vec3::Z, + }; + + pub const Z: Self = Self { + eye: Vec3::ZERO, + dir: Vec3::Z, + up: Vec3::Y, + }; + pub const NEG_Z: Self = Self { + eye: Vec3::ZERO, + dir: Vec3::NEG_Z, + up: Vec3::Y, + }; + + pub const FACES: [Self; 6] = [ + CubemapFaceDirection::X, + CubemapFaceDirection::NEG_X, + CubemapFaceDirection::Y, + CubemapFaceDirection::NEG_Y, + CubemapFaceDirection::Z, + CubemapFaceDirection::NEG_Z, + ]; + + pub fn right(&self) -> Vec3 { + -self.dir.cross(self.up) + } + + /// The view from _inside_ the cube. + pub fn view(&self) -> Mat4 { + Mat4::look_at_lh(self.eye, self.eye + self.dir, self.up) + } } -pub struct CubemapMakingRenderPipeline(pub wgpu::RenderPipeline); - -impl CubemapMakingRenderPipeline { - /// Create the rendering pipeline that creates cubemaps from equirectangular - /// images. - pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { - log::trace!("creating cubemap-making render pipeline with format '{format:?}'"); - let vertex_linkage = crate::linkage::skybox_cubemap_vertex::linkage(device); - let fragment_linkage = crate::linkage::skybox_equirectangular_fragment::linkage(device); - let bg_layout = cubemap_making_bindgroup_layout(device); - let pp_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label: Some("cubemap-making pipeline layout"), - bind_group_layouts: &[&bg_layout], - push_constant_ranges: &[], - }); - CubemapMakingRenderPipeline(device.create_render_pipeline( - &wgpu::RenderPipelineDescriptor { - label: Some("cubemap-making pipeline"), - 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, - 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 { - mask: !0, - alpha_to_coverage_enabled: false, - count: 1, - }, - fragment: Some(wgpu::FragmentState { - module: &fragment_linkage.module, - entry_point: Some(fragment_linkage.entry_point), - targets: &[Some(wgpu::ColorTargetState { - format, - blend: Some(wgpu::BlendState::ALPHA_BLENDING), - write_mask: wgpu::ColorWrites::ALL, - })], - compilation_options: Default::default(), - }), - multiview: None, - cache: None, - }, - )) +pub struct CubemapDescriptor { + atlas_descriptor_id: Id, + faces: Array, +} + +impl CubemapDescriptor { + /// Return the face index and UV coordinates that can be used to sample + /// a cubemap from the given directional coordinate. + pub fn get_face_index_and_uv(coord: Vec3) -> (usize, Vec2) { + let abs_x = coord.x.abs(); + let abs_y = coord.y.abs(); + let abs_z = coord.z.abs(); + + let (face_index, uv) = if abs_x >= abs_y && abs_x >= abs_z { + if coord.x > 0.0 { + (0, Vec2::new(-coord.z, -coord.y) / abs_x) + } else { + (1, Vec2::new(coord.z, -coord.y) / abs_x) + } + } else if abs_y >= abs_x && abs_y >= abs_z { + if coord.y > 0.0 { + (2, Vec2::new(coord.x, coord.z) / abs_y) + } else { + (3, Vec2::new(coord.x, -coord.z) / abs_y) + } + } else if coord.z > 0.0 { + (4, Vec2::new(coord.x, -coord.y) / abs_z) + } else { + (5, Vec2::new(-coord.x, -coord.y) / abs_z) + }; + + (face_index, (uv + Vec2::ONE) / 2.0) + } + + /// Sample the cubemap with a directional coordinate. + pub fn sample(&self, coord: Vec3, slab: &[u32], atlas: &A, sampler: &S) -> Vec4 + where + A: Sample2dArray, + S: IsSampler, + { + let coord = if coord.length().is_zero() { + Vec3::X + } else { + coord.normalize() + }; + let (face_index, uv) = Self::get_face_index_and_uv(coord); + let atlas_image = slab.read_unchecked(self.faces.at(face_index)); + let atlas_desc = slab.read_unchecked(self.atlas_descriptor_id); + let uv = atlas_image.uv(uv, atlas_desc.size.xy()); + atlas.sample_by_lod(*sampler, uv, 0.0) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn cubemap_right() { + assert_eq!(Vec3::NEG_Z, CubemapFaceDirection::X.right()); + assert_eq!(Vec3::Z, CubemapFaceDirection::NEG_X.right()); + assert_eq!(Vec3::X, CubemapFaceDirection::Y.right()); + assert_eq!(Vec3::X, CubemapFaceDirection::NEG_Y.right()); + assert_eq!(Vec3::X, CubemapFaceDirection::Z.right()); + assert_eq!(Vec3::NEG_X, CubemapFaceDirection::NEG_Z.right()); + + assert_eq!( + (1, Vec2::new(0.0, 1.0)), + CubemapDescriptor::get_face_index_and_uv(Vec3::NEG_ONE) + ); + } + + #[test] + fn cubemap_face_index() { + let center = Vec2::splat(0.5); + let data = [ + (Vec3::X, 0, center), + (Vec3::NEG_X, 1, center), + (Vec3::Y, 2, center), + (Vec3::NEG_Y, 3, center), + (Vec3::Z, 4, center), + (Vec3::NEG_Z, 5, center), + ]; + for (coord, expected_face_index, expected_uv) in data { + let (seen_face_index, seen_uv) = CubemapDescriptor::get_face_index_and_uv(coord); + dbg!((coord, seen_face_index, seen_uv)); + assert_eq!(expected_face_index, seen_face_index); + assert_eq!(expected_uv, seen_uv); + } } } diff --git a/crates/renderling/src/cubemap/cpu.rs b/crates/renderling/src/cubemap/cpu.rs new file mode 100644 index 00000000..fcc277e5 --- /dev/null +++ b/crates/renderling/src/cubemap/cpu.rs @@ -0,0 +1,632 @@ +//! CPU side of the cubemap module. +use std::sync::Arc; + +use glam::{Mat4, UVec2, Vec3, Vec4}; +use image::GenericImageView; + +use crate::{ + camera::Camera, + stage::{Stage, StageRendering}, + texture::Texture, +}; + +use super::{CubemapDescriptor, CubemapFaceDirection}; + +pub fn cpu_sample_cubemap(cubemap: &[image::DynamicImage; 6], coord: Vec3) -> Vec4 { + let coord = coord.normalize_or(Vec3::X); + let (face_index, uv) = CubemapDescriptor::get_face_index_and_uv(coord); + + // Get the selected image + let image = &cubemap[face_index]; + + // Convert 2D UV to pixel coordinates + let (width, height) = image.dimensions(); + let px = uv.x * (width as f32 - 1.0); + let py = uv.y * (height as f32 - 1.0); + + // Sample using the nearest neighbor for simplicity + let image::Rgba([r, g, b, a]) = image.get_pixel(px.round() as u32, py.round() as u32); + + // Convert the sampled pixel to Vec4 + Vec4::new( + r as f32 / 255.0, + g as f32 / 255.0, + b as f32 / 255.0, + a as f32 / 255.0, + ) +} + +/// A cubemap that acts as a render target for an entire scene. +/// +/// Use this to create and update a skybox with scene geometry. +pub struct SceneCubemap { + pipeline: Arc, + cubemap_texture: wgpu::Texture, + depth_texture: crate::texture::Texture, + clear_color: wgpu::Color, +} + +impl SceneCubemap { + pub fn new( + device: &wgpu::Device, + size: UVec2, + format: wgpu::TextureFormat, + clear_color: Vec4, + ) -> Self { + let label = Some("scene-to-cubemap"); + let cubemap_texture = device.create_texture(&wgpu::TextureDescriptor { + label, + size: wgpu::Extent3d { + width: size.x, + height: size.y, + depth_or_array_layers: 6, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT + | wgpu::TextureUsages::TEXTURE_BINDING + | wgpu::TextureUsages::COPY_DST + | wgpu::TextureUsages::COPY_SRC, + view_formats: &[], + }); + let depth_texture = Texture::create_depth_texture(device, size.x, size.y, 1, label); + let pipeline = Arc::new(Stage::create_stage_render_pipeline(device, format, 1)); + Self { + pipeline, + cubemap_texture, + depth_texture, + clear_color: wgpu::Color { + r: clear_color.x as f64, + g: clear_color.y as f64, + b: clear_color.z as f64, + a: clear_color.w as f64, + }, + } + } + + pub fn run(&self, stage: &Stage) { + // create a camera for our cube + let camera = stage.new_value(Camera::default()); + + let mut prev_camera_ids = vec![]; + for rlet in stage.renderlets_iter() { + if let Some(rlet) = rlet.upgrade() { + let mut guard = rlet.lock(); + prev_camera_ids.push(guard.camera_id); + // Overwrite the renderlet's camera + guard.camera_id = camera.id(); + } + } + + // By setting this to 90 degrees (PI/2 radians) we make sure the viewing field + // is exactly large enough to fill a single face of the cubemap such that all + // faces align correctly to each other at the edges. + let fovy = std::f32::consts::FRAC_PI_2; + let aspect = self.cubemap_texture.width() as f32 / self.cubemap_texture.height() as f32; + let projection = Mat4::perspective_lh(fovy, aspect, 1.0, 25.0); + // Render each face by rendering the scene from each camera angle into the cubemap + for (i, face) in CubemapFaceDirection::FACES.iter().enumerate() { + // Update the camera angle, no need to sync as calling `Stage::render` does this + // implicitly + camera.modify(|c| c.set_projection_and_view(projection, face.view())); + let label_s = format!("scene-to-cubemap-{i}"); + let view = self + .cubemap_texture + .create_view(&wgpu::TextureViewDescriptor { + label: Some(&label_s), + base_array_layer: i as u32, + array_layer_count: Some(1), + dimension: Some(wgpu::TextureViewDimension::D2), + ..Default::default() + }); + let color_attachment = wgpu::RenderPassColorAttachment { + view: &view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(self.clear_color), + store: wgpu::StoreOp::Store, + }, + }; + let depth_stencil_attachment = wgpu::RenderPassDepthStencilAttachment { + view: &self.depth_texture.view, + depth_ops: Some(wgpu::Operations { + load: wgpu::LoadOp::Clear(1.0), + store: wgpu::StoreOp::Store, + }), + stencil_ops: None, + }; + let (_, _) = StageRendering { + pipeline: &self.pipeline, + stage, + color_attachment, + depth_stencil_attachment, + } + .run(); + } + } +} + +/// A render pipeline for blitting an equirectangular image as a cubemap. +pub struct EquirectangularImageToCubemapBlitter(pub wgpu::RenderPipeline); + +impl EquirectangularImageToCubemapBlitter { + pub fn create_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("cubemap-making bindgroup"), + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: false }, + view_dimension: wgpu::TextureViewDimension::D2, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering), + count: None, + }, + ], + }) + } + + pub fn create_bindgroup( + device: &wgpu::Device, + label: Option<&str>, + buffer: &wgpu::Buffer, + // The texture to sample the environment from + texture: &Texture, + ) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label, + layout: &Self::create_bindgroup_layout(device), + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Buffer(buffer.as_entire_buffer_binding()), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&texture.view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&texture.sampler), + }, + ], + }) + } + + /// Create the rendering pipeline that creates cubemaps from equirectangular + /// images. + pub fn new(device: &wgpu::Device, format: wgpu::TextureFormat) -> Self { + log::trace!("creating cubemap-making render pipeline with format '{format:?}'"); + let vertex_linkage = crate::linkage::skybox_cubemap_vertex::linkage(device); + let fragment_linkage = crate::linkage::skybox_equirectangular_fragment::linkage(device); + let bg_layout = Self::create_bindgroup_layout(device); + let pp_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: Some("cubemap-making pipeline layout"), + bind_group_layouts: &[&bg_layout], + push_constant_ranges: &[], + }); + EquirectangularImageToCubemapBlitter(device.create_render_pipeline( + &wgpu::RenderPipelineDescriptor { + label: Some("cubemap-making pipeline"), + 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, + 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 { + mask: !0, + alpha_to_coverage_enabled: false, + count: 1, + }, + fragment: Some(wgpu::FragmentState { + module: &fragment_linkage.module, + entry_point: Some(fragment_linkage.entry_point), + targets: &[Some(wgpu::ColorTargetState { + format, + blend: Some(wgpu::BlendState::ALPHA_BLENDING), + write_mask: wgpu::ColorWrites::ALL, + })], + compilation_options: Default::default(), + }), + multiview: None, + cache: None, + }, + )) + } +} + +#[cfg(test)] +mod test { + use craballoc::slab::SlabAllocator; + use glam::Vec4; + use image::GenericImageView; + + use crate::{ + math::{UNIT_INDICES, UNIT_POINTS}, + stage::{Renderlet, Vertex}, + }; + + use super::*; + + #[test] + fn hand_rolled_cubemap_sampling() { + let width = 256; + let height = 256; + let ctx = crate::Context::headless(width, height); + let stage = ctx + .new_stage() + .with_background_color(Vec4::ZERO) + .with_lighting(false) + .with_msaa_sample_count(4); + let camera = + stage.new_value( + Camera::default_perspective(width as f32, height as f32) + .with_view(Mat4::look_at_rh(Vec3::splat(3.0), Vec3::ZERO, Vec3::Y)), + ); + // geometry is the "clip cube" where colors are normalized 3d space coords + let vertices = stage.new_array(UNIT_POINTS.map(|unit_cube_point| { + Vertex::default() + // multiply by 2.0 because the unit cube's AABB bounds are at 0.5, and we want 1.0 + .with_position(unit_cube_point * 2.0) + // "normalize" (really "shift") the space coord from [-0.5, 0.5] to [0.0, 1.0] + .with_color((unit_cube_point + 0.5).extend(1.0)) + })); + let indices = stage.new_array(UNIT_INDICES.map(|u| u as u32)); + let renderlet = stage.new_value(Renderlet { + vertices_array: vertices.array(), + indices_array: indices.array(), + camera_id: camera.id(), + ..Default::default() + }); + stage.add_renderlet(&renderlet); + + let scene_cubemap = SceneCubemap::new( + ctx.get_device(), + UVec2::new(width, height), + wgpu::TextureFormat::Rgba8Unorm, + Vec4::ZERO, + ); + + scene_cubemap.run(&stage); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq("cubemap/hand_rolled_cubemap_sampling/cube.png", img); + frame.present(); + + let slab = SlabAllocator::new(&ctx, wgpu::BufferUsages::empty()); + let uv = slab.new_value(Vec3::ZERO); + let buffer = slab.commit(); + let label = Some("cubemap-sampling-test"); + let bind_group_layout = + ctx.get_device() + .create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: true }, + view_dimension: wgpu::TextureViewDimension::Cube, + multisampled: false, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering), + count: None, + }, + ], + }); + let cubemap_sampling_pipeline_layout = + ctx.get_device() + .create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label, + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + let vertex = crate::linkage::cubemap_sampling_test_vertex::linkage(ctx.get_device()); + let fragment = crate::linkage::cubemap_sampling_test_fragment::linkage(ctx.get_device()); + let cubemap_sampling_pipeline = + ctx.get_device() + .create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label, + layout: Some(&cubemap_sampling_pipeline_layout), + vertex: wgpu::VertexState { + module: &vertex.module, + entry_point: Some(vertex.entry_point), + 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: Some(fragment.entry_point), + compilation_options: Default::default(), + targets: &[Some(wgpu::ColorTargetState { + format: wgpu::TextureFormat::Rgba8Unorm, + blend: None, + write_mask: wgpu::ColorWrites::all(), + })], + }), + multiview: None, + cache: None, + }); + + let cubemap_view = + scene_cubemap + .cubemap_texture + .create_view(&wgpu::TextureViewDescriptor { + label, + dimension: Some(wgpu::TextureViewDimension::Cube), + ..Default::default() + }); + let cubemap_sampler = ctx.get_device().create_sampler(&wgpu::SamplerDescriptor { + label, + ..Default::default() + }); + let bind_group = ctx + .get_device() + .create_bind_group(&wgpu::BindGroupDescriptor { + label, + layout: &bind_group_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: buffer.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&cubemap_view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&cubemap_sampler), + }, + ], + }); + let render_target = ctx.get_device().create_texture(&wgpu::TextureDescriptor { + label, + size: wgpu::Extent3d { + width: 1, + height: 1, + depth_or_array_layers: 1, + }, + mip_level_count: 1, + sample_count: 1, + dimension: wgpu::TextureDimension::D2, + format: wgpu::TextureFormat::Rgba8Unorm, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT | wgpu::TextureUsages::COPY_SRC, + view_formats: &[], + }); + let render_target_view = render_target.create_view(&wgpu::TextureViewDescriptor::default()); + + let sample = |dir: Vec3| -> Vec4 { + uv.set(dir.normalize_or(Vec3::ZERO)); + slab.commit(); + + let mut encoder = ctx + .get_device() + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label }); + { + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label, + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &render_target_view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color { + r: 0.0, + g: 0.0, + b: 0.0, + a: 0.0, + }), + store: wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }); + render_pass.set_pipeline(&cubemap_sampling_pipeline); + render_pass.set_bind_group(0, &bind_group, &[]); + render_pass.draw(0..6, 0..1); + } + let submission_index = ctx.get_queue().submit(Some(encoder.finish())); + ctx.get_device() + .poll(wgpu::Maintain::wait_for(submission_index)); + + let img = Texture::read(&ctx, &render_target, 1, 1, 4, 1) + .into_image::>(ctx.get_device()) + .unwrap(); + let image::Rgba([r, g, b, a]) = img.get_pixel(0, 0); + Vec4::new( + r as f32 / 255.0, + g as f32 / 255.0, + b as f32 / 255.0, + a as f32 / 255.0, + ) + }; + + fn index_to_face_string(index: usize) -> &'static str { + match index { + 0 => "+X", + 1 => "-X", + 2 => "+Y", + 3 => "-Y", + 4 => "+Z", + 5 => "-Z", + _ => "?", + } + } + + let mut cpu_cubemap = vec![]; + for i in 0..6 { + let img = Texture::read_from( + &ctx, + &scene_cubemap.cubemap_texture, + width as usize, + height as usize, + 4, + 1, + 0, + Some(wgpu::Origin3d { x: 0, y: 0, z: i }), + ) + .into_image::>(ctx.get_device()) + .unwrap(); + + img_diff::assert_img_eq( + &format!( + "cubemap/hand_rolled_cubemap_sampling/face_{}.png", + index_to_face_string(i as usize) + ), + img.clone(), + ); + + cpu_cubemap.push(img); + } + let cpu_cubemap = [ + cpu_cubemap.remove(0), + cpu_cubemap.remove(0), + cpu_cubemap.remove(0), + cpu_cubemap.remove(0), + cpu_cubemap.remove(0), + cpu_cubemap.remove(0), + ]; + + { + // assert a few sanity checks on the cpu cubemap + println!("x samples sanity"); + let x_samples_uv = [ + UVec2::ZERO, + UVec2::new(255, 0), + UVec2::new(127, 127), + UVec2::new(255, 255), + UVec2::new(0, 255), + ]; + + for uv in x_samples_uv { + let image::Rgba([r, g, b, a]) = cpu_cubemap[0].get_pixel(uv.x, uv.y); + println!("uv: {uv}"); + println!("rgba: {r} {g} {b} {a}"); + } + } + + let mut uvs = vec![ + // start with cardinal directions + Vec3::X, + Vec3::NEG_X, + Vec3::Y, + Vec3::NEG_Y, + Vec3::Z, + Vec3::NEG_Z, + ]; + + // add corners to the uvs to sample + for x in [-1.0, 1.0] { + for y in [-1.0, 1.0] { + for z in [-1.0, 1.0] { + let uv = Vec3::new(x, y, z); + uvs.push(uv); + } + } + } + + // add in some deterministic pseudo-randomn points + { + let order = acorn_prng::Order::new(666); + let seed = acorn_prng::Seed::new(1_000_000); + let mut prng = acorn_prng::Acorn::new(order, seed); + let mut rf32 = move || { + let u = prng.generate_u32_between_range(0..=u32::MAX); + f32::from_bits(u) + }; + let mut rxvec3 = { || Vec3::new(f32::MAX, rf32(), rf32()).normalize_or(Vec3::X) }; + // let mut rvec3 = || Vec3::new(rf32(), rf32(), rf32()); + uvs.extend((0..20).map(|_| rxvec3())); + } + + const THRESHOLD: f32 = 0.005; + for uv in uvs.into_iter() { + let nuv = uv.normalize_or(Vec3::X); + let color = sample(uv); + let (face_index, uv2d) = + CubemapDescriptor::get_face_index_and_uv(uv.normalize_or(Vec3::X)); + let px = (uv2d.x * (width as f32 - 1.0)).round() as u32; + let py = (uv2d.y * (height as f32 - 1.0)).round() as u32; + let puv = UVec2::new(px, py); + let cpu_color = cpu_sample_cubemap(&cpu_cubemap, uv); + let dir_string = index_to_face_string(face_index); + println!( + "__uv: {uv},\n\ + _nuv: {nuv},\n\ + _gpu: {color}\n\ + _cpu: {cpu_color}\n\ + from: {dir_string}({face_index}) {uv2d} {puv}\n" + ); + let cmp = pretty_assertions::Comparison::new(&color, &cpu_color); + let distance = color.distance(cpu_color); + if distance > THRESHOLD { + println!("distance: {distance}"); + println!("{cmp}"); + panic!("distance {distance} greater than {THRESHOLD}"); + } + } + } +} diff --git a/crates/renderling/src/cull.rs b/crates/renderling/src/cull.rs index 8a204bd9..9f60b43a 100644 --- a/crates/renderling/src/cull.rs +++ b/crates/renderling/src/cull.rs @@ -19,7 +19,7 @@ mod cpu; #[cfg(not(target_arch = "spirv"))] pub use cpu::*; -#[spirv(compute(threads(32)))] +#[spirv(compute(threads(16)))] 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], @@ -167,7 +167,7 @@ pub type DepthImage2dMultisampled = Image!(2D, type=f32, sampled, depth, multisa /// /// It is assumed that a [`DepthPyramidDescriptor`] is stored at index `0` in /// the given slab. -#[spirv(compute(threads(32, 32, 1)))] +#[spirv(compute(threads(16, 16, 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, @@ -189,7 +189,7 @@ pub fn compute_copy_depth_to_pyramid( /// /// It is assumed that a [`DepthPyramidDescriptor`] is stored at index `0` in /// the given slab. -#[spirv(compute(threads(32, 32, 1)))] +#[spirv(compute(threads(16, 16, 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, @@ -217,7 +217,7 @@ pub fn compute_copy_depth_to_pyramid_multisampled( /// 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)))] +#[spirv(compute(threads(16, 16, 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, diff --git a/crates/renderling/src/cull/cpu.rs b/crates/renderling/src/cull/cpu.rs index 1e47175f..52b483a9 100644 --- a/crates/renderling/src/cull/cpu.rs +++ b/crates/renderling/src/cull/cpu.rs @@ -3,13 +3,13 @@ use craballoc::{ prelude::{GpuArray, Hybrid, SlabAllocator, SlabAllocatorError}, runtime::WgpuRuntime, + slab::SlabBuffer, }; use crabslab::{Array, Slab}; use glam::UVec2; use snafu::{OptionExt, Snafu}; -use std::sync::Arc; -use crate::texture::Texture; +use crate::{bindgroup::ManagedBindGroup, texture::Texture}; use super::DepthPyramidDescriptor; @@ -40,8 +40,14 @@ impl From for CullingError { /// Computes frustum and occlusion culling on the GPU. pub struct ComputeCulling { pipeline: wgpu::ComputePipeline, + + pyramid_slab_buffer: SlabBuffer, + stage_slab_buffer: SlabBuffer, + indirect_slab_buffer: SlabBuffer, + bindgroup_layout: wgpu::BindGroupLayout, - bindgroup: Option, + bindgroup: ManagedBindGroup, + pub(crate) compute_depth_pyramid: ComputeDepthPyramid, } @@ -81,8 +87,14 @@ impl ComputeCulling { }) } - pub fn new(runtime: impl AsRef, size: UVec2, sample_count: u32) -> Self { - let device = &runtime.as_ref().device; + pub fn new( + runtime: impl AsRef, + stage_slab_buffer: &SlabBuffer, + indirect_slab_buffer: &SlabBuffer, + depth_texture: &Texture, + ) -> Self { + let runtime = runtime.as_ref(); + let device = &runtime.device; let bindgroup_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { label: Self::LABEL, entries: &[ @@ -133,72 +145,73 @@ impl ComputeCulling { compilation_options: wgpu::PipelineCompilationOptions::default(), cache: None, }); + let compute_depth_pyramid = ComputeDepthPyramid::new(runtime, depth_texture); + let pyramid_slab_buffer = compute_depth_pyramid + .compute_copy_depth + .pyramid_slab_buffer + .clone(); + let bindgroup = Self::new_bindgroup( + stage_slab_buffer, + &pyramid_slab_buffer, + indirect_slab_buffer, + &bindgroup_layout, + device, + ); Self { pipeline, bindgroup_layout, - bindgroup: None, - compute_depth_pyramid: ComputeDepthPyramid::new(runtime, size, sample_count), + bindgroup: ManagedBindGroup::from(bindgroup), + compute_depth_pyramid, + pyramid_slab_buffer, + stage_slab_buffer: stage_slab_buffer.clone(), + indirect_slab_buffer: indirect_slab_buffer.clone(), } } - pub fn invalidate_bindgroup(&mut self) { - self.bindgroup = None; + fn runtime(&self) -> &WgpuRuntime { + self.compute_depth_pyramid.depth_pyramid.slab.runtime() } - fn get_bindgroup( - &mut self, - device: &wgpu::Device, - 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( - stage_slab_buffer, - hzb_slab_buffer, - indirect_draw_buffer, - &self.bindgroup_layout, - device, - )); - } - // UNWRAP: safe because we just set it - self.bindgroup.as_ref().unwrap() - } - - pub fn run( - &mut self, - device: &wgpu::Device, - queue: &wgpu::Queue, - stage_slab_buffer: &wgpu::Buffer, - indirect_draw_buffer: &wgpu::Buffer, - indirect_draw_count: u32, - depth_texture: &Texture, - ) -> Result<(), CullingError> { + pub fn run(&mut self, indirect_draw_count: u32, depth_texture: &Texture) { + log::trace!( + "indirect_draw_count: {indirect_draw_count}, sample_count: {}", + depth_texture.texture.sample_count() + ); // Compute the depth pyramid from last frame's depth buffer - self.compute_depth_pyramid.run(depth_texture)?; - let (hzb_buffer, invalidate) = self - .compute_depth_pyramid - .depth_pyramid - .slab - .get_updated_buffer_and_check(); - if invalidate { - self.invalidate_bindgroup(); - } - let mut encoder = - device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); + self.compute_depth_pyramid.run(depth_texture); + + let stage_slab_invalid = self.stage_slab_buffer.update_if_invalid(); + let indirect_slab_invalid = self.indirect_slab_buffer.update_if_invalid(); + let pyramid_slab_invalid = self.pyramid_slab_buffer.update_if_invalid(); + let should_recreate_bindgroup = + stage_slab_invalid || indirect_slab_invalid || pyramid_slab_invalid; + log::trace!("stage_slab_invalid: {stage_slab_invalid}"); + log::trace!("indirect_slab_invalid: {indirect_slab_invalid}"); + log::trace!("pyramid_slab_invalid: {pyramid_slab_invalid}"); + let bindgroup = self.bindgroup.get(should_recreate_bindgroup, || { + log::debug!("recreating compute-culling bindgroup"); + Self::new_bindgroup( + &self.stage_slab_buffer, + &self.pyramid_slab_buffer, + &self.indirect_slab_buffer, + &self.bindgroup_layout, + self.compute_depth_pyramid.depth_pyramid.slab.device(), + ) + }); + let runtime = self.runtime(); + let mut encoder = runtime + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); { let mut compute_pass = encoder.begin_compute_pass(&wgpu::ComputePassDescriptor { label: Self::LABEL, timestamp_writes: None, }); compute_pass.set_pipeline(&self.pipeline); - 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); + compute_pass.set_bind_group(0, Some(bindgroup.as_ref()), &[]); + compute_pass.dispatch_workgroups(indirect_draw_count / 16 + 1, 1, 1); } - queue.submit(Some(encoder.finish())); - Ok(()) + runtime.queue.submit(Some(encoder.finish())); } } @@ -248,15 +261,16 @@ impl DepthPyramid { } } - pub fn resize(&mut self, size: UVec2) -> (Arc, bool) { + pub fn resize(&mut self, size: UVec2) { log::info!("resizing depth pyramid to {size}"); + // drop the buffers 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(); + self.slab.commit(); // Reallocate let (mip_data, mip) = Self::allocate(size, &self.desc, &self.slab); @@ -264,8 +278,7 @@ impl DepthPyramid { self.mip = mip; // Run upkeep one more time to sync the resize - let (buffer, should_invalidate_b) = self.slab.get_updated_buffer_and_check(); - (buffer, should_invalidate_a || should_invalidate_b) + self.slab.commit(); } pub fn size(&self) -> UVec2 { @@ -307,7 +320,8 @@ struct ComputeCopyDepth { pipeline: wgpu::ComputePipeline, bindgroup_layout: wgpu::BindGroupLayout, sample_count: u32, - bindgroup: Option, + pyramid_slab_buffer: SlabBuffer, + bindgroup: ManagedBindGroup, } impl ComputeCopyDepth { @@ -409,70 +423,81 @@ impl ComputeCopyDepth { }) } - pub fn new(device: &wgpu::Device, sample_count: u32) -> Self { + pub fn new(depth_pyramid: &DepthPyramid, depth_texture: &Texture) -> Self { + let device = depth_pyramid.slab.device(); + let sample_count = depth_texture.texture.sample_count(); let bindgroup_layout = Self::create_bindgroup_layout(device, sample_count); let pipeline = Self::create_pipeline(device, &bindgroup_layout, sample_count > 1); + let pyramid_slab_buffer = depth_pyramid.slab.commit(); + let buffer = Self::create_bindgroup( + device, + &bindgroup_layout, + &pyramid_slab_buffer, + &depth_texture.view, + ); Self { pipeline, - bindgroup: None, + bindgroup: ManagedBindGroup::from(buffer), bindgroup_layout, + pyramid_slab_buffer, sample_count, } } - pub fn invalidate(&mut self) { - self.bindgroup = None; - } - - pub fn run(&mut self, pyramid: &DepthPyramid, depth_texture: &Texture) { - let size = pyramid.desc.modify(|desc| { + pub fn run(&mut self, pyramid: &mut DepthPyramid, depth_texture: &Texture) { + let _ = pyramid.desc.modify(|desc| { desc.mip_level = 0; desc.size }); - let (slab_buffer, slab_buffer_is_new) = pyramid.slab.get_updated_buffer_and_check(); - - if slab_buffer_is_new { - self.bindgroup = None; - } + let runtime = pyramid.slab.runtime().clone(); let sample_count = depth_texture.texture.sample_count(); let sample_count_mismatch = sample_count != self.sample_count; - let device = pyramid.slab.device(); - if sample_count_mismatch { - log::info!( + log::debug!( "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; + self.bindgroup_layout = Self::create_bindgroup_layout(&runtime.device, sample_count); + self.pipeline = + Self::create_pipeline(&runtime.device, &self.bindgroup_layout, sample_count > 1); } - if self.bindgroup.is_none() { - self.bindgroup = Some(Self::create_bindgroup( - device, + let extent = depth_texture.texture.size(); + let size = UVec2::new(extent.width, extent.height); + let size_changed = size != pyramid.size(); + if size_changed { + pyramid.resize(size); + } + + // TODO: check if we need to upkeep the depth pyramid slab here. + let _ = pyramid.slab.commit(); + let should_recreate_bindgroup = + self.pyramid_slab_buffer.update_if_invalid() || sample_count_mismatch || size_changed; + let bindgroup = self.bindgroup.get(should_recreate_bindgroup, || { + Self::create_bindgroup( + &runtime.device, &self.bindgroup_layout, - &slab_buffer, + &self.pyramid_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 encoder = runtime + .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; + compute_pass.set_bind_group(0, Some(bindgroup.as_ref()), &[]); + let x = size.x / 16 + 1; + let y = size.y / 16 + 1; let z = 1; compute_pass.dispatch_workgroups(x, y, z); } @@ -483,7 +508,8 @@ impl ComputeCopyDepth { /// Downsamples the depth texture from one mip to the next. struct ComputeDownsampleDepth { pipeline: wgpu::ComputePipeline, - bindgroup: Option, + pyramid_slab_buffer: SlabBuffer, + bindgroup: wgpu::BindGroup, bindgroup_layout: wgpu::BindGroupLayout, } @@ -547,41 +573,41 @@ impl ComputeDownsampleDepth { }) } - pub fn new(device: &wgpu::Device) -> Self { + pub fn new(pyramid: &DepthPyramid) -> Self { + let device = pyramid.slab.device(); let bindgroup_layout = Self::create_bindgroup_layout(device); let pipeline = Self::create_pipeline(device, &bindgroup_layout); + let pyramid_slab_buffer = pyramid.slab.commit(); + let bindgroup = Self::create_bindgroup(device, &bindgroup_layout, &pyramid_slab_buffer); Self { pipeline, - bindgroup: None, + bindgroup, bindgroup_layout, + pyramid_slab_buffer, } } - pub fn invalidate(&mut self) { - self.bindgroup = None; - } - pub fn run(&mut self, pyramid: &DepthPyramid) { let device = pyramid.slab.device(); - if self.bindgroup.is_none() { - self.bindgroup = Some(Self::create_bindgroup( - device, - &self.bindgroup_layout, - &pyramid.slab.get_updated_buffer(), - )); + + if self.pyramid_slab_buffer.update_if_invalid() { + self.bindgroup = + Self::create_bindgroup(device, &self.bindgroup_layout, &self.pyramid_slab_buffer); } + 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(); + log::trace!("downsampling to mip {i}..{}", pyramid.mip_data.len()); // 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(); - debug_assert!(!should_invalidate, "pyramid slab should never resize here"); + pyramid.slab.commit(); + debug_assert!( + self.pyramid_slab_buffer.is_valid(), + "pyramid slab should never resize here" + ); let mut encoder = device .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); @@ -591,11 +617,11 @@ impl ComputeDownsampleDepth { ..Default::default() }); compute_pass.set_pipeline(&self.pipeline); - compute_pass.set_bind_group(0, Some(bindgroup), &[]); + compute_pass.set_bind_group(0, Some(&self.bindgroup), &[]); let w = size.x >> i; let h = size.y >> i; - let x = w / 32 + 1; - let y = h / 32 + 1; + let x = w / 16 + 1; + let y = h / 16 + 1; let z = 1; compute_pass.dispatch_workgroups(x, y, z); } @@ -606,7 +632,6 @@ impl ComputeDownsampleDepth { /// 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, @@ -615,58 +640,31 @@ pub struct ComputeDepthPyramid { impl ComputeDepthPyramid { const _LABEL: Option<&'static str> = Some("compute-depth-pyramid"); - pub fn new(runtime: impl AsRef, size: UVec2, sample_count: u32) -> Self { + pub fn new(runtime: impl AsRef, depth_texture: &Texture) -> Self { let runtime = runtime.as_ref(); - let depth_pyramid = DepthPyramid::new(runtime, size); - let compute_copy_depth = ComputeCopyDepth::new(&runtime.device, sample_count); - let compute_downsample_depth = ComputeDownsampleDepth::new(&runtime.device); + let depth_pyramid = DepthPyramid::new(runtime, depth_texture.size()); + let compute_copy_depth = ComputeCopyDepth::new(&depth_pyramid, depth_texture); + let compute_downsample_depth = ComputeDownsampleDepth::new(&depth_pyramid); 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, 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; - } - + /// Run depth pyramid copy and downsampling, then return the updated HZB buffer. + pub fn run(&mut self, depth_texture: &Texture) { 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(size) - } else { - self.depth_pyramid.slab.get_updated_buffer_and_check() - }; - if should_invalidate { - self.compute_copy_depth.invalidate(); - self.compute_downsample_depth.invalidate(); + if size != self.depth_pyramid.size() { + log::debug!("depth texture size changed"); + self.depth_pyramid.resize(size); } self.compute_copy_depth - .run(&self.depth_pyramid, depth_texture); + .run(&mut self.depth_pyramid, depth_texture); self.compute_downsample_depth.run(&self.depth_pyramid); - - Ok(()) } } diff --git a/crates/renderling/src/debug.rs b/crates/renderling/src/debug.rs index 72b5e924..d839a99b 100644 --- a/crates/renderling/src/debug.rs +++ b/crates/renderling/src/debug.rs @@ -1,8 +1,6 @@ //! 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}; diff --git a/crates/renderling/src/draw/cpu.rs b/crates/renderling/src/draw/cpu.rs index 179a661c..a8ec0653 100644 --- a/crates/renderling/src/draw/cpu.rs +++ b/crates/renderling/src/draw/cpu.rs @@ -1,10 +1,10 @@ //! CPU-only side of renderling/draw.rs -use std::sync::Arc; - -use craballoc::prelude::{Gpu, Hybrid, SlabAllocator, WeakHybrid, WgpuRuntime}; +use craballoc::{ + prelude::{Gpu, Hybrid, SlabAllocator, WeakHybrid, WgpuRuntime}, + slab::SlabBuffer, +}; use crabslab::Id; -use glam::UVec2; use rustc_hash::FxHashMap; use crate::{ @@ -34,7 +34,12 @@ impl InternalRenderlet { } fn copy_inner(&self) -> Option { - self.inner.upgrade().map(|hy| hy.get()) + let hy = self.get_hybrid()?; + Some(hy.get()) + } + + fn get_hybrid(&self) -> Option> { + self.inner.upgrade() } } @@ -48,10 +53,25 @@ pub struct IndirectDraws { } impl IndirectDraws { - fn new(runtime: impl AsRef, size: UVec2, sample_count: u32) -> Self { + fn new( + runtime: impl AsRef, + stage_slab_buffer: &SlabBuffer, + depth_texture: &Texture, + ) -> Self { + let runtime = runtime.as_ref(); + let indirect_slab = SlabAllocator::new_with_label( + runtime, + wgpu::BufferUsages::INDIRECT, + Some("indirect-slab"), + ); Self { - compute_culling: ComputeCulling::new(runtime.as_ref(), size, sample_count), - slab: SlabAllocator::new(runtime, wgpu::BufferUsages::INDIRECT), + compute_culling: ComputeCulling::new( + runtime, + stage_slab_buffer, + &indirect_slab.commit(), + depth_texture, + ), + slab: indirect_slab, draws: vec![], } } @@ -62,22 +82,22 @@ impl IndirectDraws { } } - fn get_indirect_buffer(&self) -> Arc { - self.slab.get_updated_buffer() + fn get_indirect_buffer(&self) -> SlabBuffer { + self.slab.commit() } fn sync_with_internal_renderlets( &mut self, internal_renderlets: &[InternalRenderlet], redraw_args: bool, - ) -> Arc { + ) -> SlabBuffer { if redraw_args || self.draws.len() != internal_renderlets.len() { self.invalidate(); // Pre-upkeep to reclaim resources - this is necessary because // the draw buffer has to be contiguous (it can't start with a bunch of trash) - if let Some(_indirect_buffer) = self.slab.upkeep() { - // Invalidate the compute culling buffer, it will be regenerated later... - self.compute_culling.invalidate_bindgroup(); + let indirect_buffer = self.slab.commit(); + if indirect_buffer.is_new_this_commit() { + log::warn!("new indirect buffer"); } self.draws = internal_renderlets .iter() @@ -145,6 +165,7 @@ pub struct DrawCalls { /// Internal representation of all staged renderlets. internal_renderlets: Vec, pub(crate) drawing_strategy: DrawingStrategy, + stage_slab_buffer: SlabBuffer, } impl DrawCalls { @@ -152,7 +173,16 @@ impl 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, size: UVec2, sample_count: u32) -> Self { + /// + /// ## Note + /// A [`Context`] is required because `DrawCalls` needs to query for the set of available driver + /// features. + pub fn new( + ctx: &Context, + use_compute_culling: bool, + stage_slab_buffer: &SlabBuffer, + depth_texture: &Texture, + ) -> Self { let can_use_multi_draw_indirect = ctx.get_adapter().features().contains( wgpu::Features::INDIRECT_FIRST_INSTANCE | wgpu::Features::MULTI_DRAW_INDIRECT, ); @@ -168,12 +198,17 @@ impl DrawCalls { drawing_strategy: { if can_use_compute_culling { log::debug!("Using indirect drawing method and compute culling"); - DrawingStrategy::Indirect(IndirectDraws::new(ctx, size, sample_count)) + DrawingStrategy::Indirect(IndirectDraws::new( + ctx, + stage_slab_buffer, + depth_texture, + )) } else { log::debug!("Using direct drawing method"); DrawingStrategy::Direct } }, + stage_slab_buffer: stage_slab_buffer.clone(), } } @@ -237,20 +272,8 @@ 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) { - if let DrawingStrategy::Indirect(indirect) = &mut self.drawing_strategy { - indirect.compute_culling.invalidate_bindgroup(); - } + pub fn renderlets_iter(&self) -> impl Iterator> + '_ { + self.internal_renderlets.iter().map(|ir| ir.inner.clone()) } /// Perform upkeep on queued draw calls and synchronize internal buffers. @@ -287,11 +310,8 @@ impl DrawCalls { /// Returns the indirect draw buffer. pub fn pre_draw( &mut self, - device: &wgpu::Device, - queue: &wgpu::Queue, - slab_buffer: &wgpu::Buffer, depth_texture: &Texture, - ) -> Result>, CullingError> { + ) -> 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: @@ -304,23 +324,19 @@ impl DrawCalls { // copying `indirect_buffer` back to the CPU. if let DrawingStrategy::Indirect(indirect) = &mut self.drawing_strategy { let maybe_buffer = indirect.slab.get_buffer(); - if let Some(indirect_buffer) = maybe_buffer.as_ref() { + if let Some(indirect_buffer) = maybe_buffer { log::trace!("performing culling on {num_draw_calls} renderlets"); - indirect.compute_culling.run( - device, - queue, - slab_buffer, - indirect_buffer, - num_draw_calls as u32, - depth_texture, - )?; + indirect + .compute_culling + .run(num_draw_calls as u32, depth_texture); + Ok(Some(indirect_buffer)) } else { log::warn!( "DrawCalls::pre_render called without first calling `upkeep` - no culling \ was performed" ); + Ok(None) } - Ok(maybe_buffer) } else { Ok(None) } diff --git a/crates/renderling/src/lib.rs b/crates/renderling/src/lib.rs index a8129881..e5956709 100644 --- a/crates/renderling/src/lib.rs +++ b/crates/renderling/src/lib.rs @@ -139,6 +139,8 @@ #![deny(clippy::disallowed_methods)] pub mod atlas; +#[cfg(cpu)] +pub mod bindgroup; pub mod bits; pub mod bloom; pub mod bvol; @@ -147,12 +149,12 @@ pub mod color; #[cfg(not(target_arch = "spirv"))] mod context; pub mod convolution; -#[cfg(not(target_arch = "spirv"))] pub mod cubemap; pub mod cull; pub mod debug; pub mod draw; pub mod ibl; +pub mod light; #[cfg(not(target_arch = "spirv"))] mod linkage; pub mod math; @@ -181,12 +183,7 @@ pub mod prelude { pub use craballoc::prelude::*; pub use crabslab::{Array, Id}; - pub use crate::{ - camera::*, - pbr::{light::*, Material}, - stage::*, - transform::Transform, - }; + pub use crate::{camera::*, light::*, pbr::Material, stage::*, transform::Transform}; #[cfg(cpu)] pub use crate::context::*; @@ -224,6 +221,62 @@ mod test { let _ = env_logger::builder().is_test(true).try_init(); } + pub fn workspace_dir() -> std::path::PathBuf { + std::path::PathBuf::from(std::env!("CARGO_WORKSPACE_DIR")) + } + + pub fn capture_gpu_frame( + ctx: &Context, + path: impl AsRef, + f: impl FnOnce() -> T, + ) -> T { + let path = workspace_dir().join("test_output").join(path); + let parent = path.parent().unwrap(); + std::fs::create_dir_all(parent).unwrap(); + + #[cfg(target_os = "macos")] + { + if path.exists() { + log::info!( + "deleting {} before writing gpu frame capture", + path.display() + ); + std::fs::remove_dir_all(&path).unwrap(); + } + + if std::env::var("METAL_CAPTURE_ENABLED").is_err() { + log::error!("Env var METAL_CAPTURE_ENABLED must be set"); + panic!("missing METAL_CAPTURE_ENABLED=1"); + } + + let m = metal::CaptureManager::shared(); + let desc = metal::CaptureDescriptor::new(); + + desc.set_destination(metal::MTLCaptureDestination::GpuTraceDocument); + desc.set_output_url(path); + unsafe { + ctx.get_device() + .as_hal::(|maybe_metal_device| { + if let Some(metal_device) = maybe_metal_device { + desc.set_capture_device( + metal_device.raw_device().try_lock().unwrap().as_ref(), + ); + } else { + panic!("not a capturable device") + } + }) + }; + m.start_capture(&desc).unwrap(); + let t = f(); + m.stop_capture(); + t + } + #[cfg(not(target_os = "macos"))] + { + f() + } + } + #[test] fn sanity_transmute() { let zerof32 = 0f32; @@ -276,7 +329,16 @@ mod test { frame.present(); let depth_texture = stage.get_depth_texture(); - let depth_img = depth_texture.read_image().unwrap(); + let mut depth_img = depth_texture.read_image().unwrap(); + let mut min = u8::MAX; + let mut max = u8::MIN; + // depth_img.pixels_mut().for_each(|image::Luma([d])| { + // min = min.min(*d); + // max = max.max(*d); + // let f = crate::math::scaled_u8_to_f32(*d); + // *d = crate::math::scaled_f32_to_u8(camera.get().linearize_depth(f)); + // }); + // log::warn!("minmax: ({min}, {max})"); img_diff::assert_img_eq("cmy_triangle_depth.png", depth_img.clone()); img_diff::save("cmy_triangle/depth.png", depth_img); @@ -758,7 +820,7 @@ mod test { #[test] /// Tests shading with directional light. fn scene_cube_directional() { - use crate::pbr::light::{DirectionalLight, Light, LightStyle}; + use crate::light::{DirectionalLightDescriptor, Light, LightStyle}; let ctx = Context::headless(100, 100); let stage = ctx @@ -773,33 +835,38 @@ mod test { let red = Vec3::X.extend(1.0); let green = Vec3::Y.extend(1.0); let blue = Vec3::Z.extend(1.0); - let dir_red = stage.new_value(DirectionalLight { - direction: Vec3::NEG_Y, - color: red, - intensity: 10.0, - }); - let dir_green = stage.new_value(DirectionalLight { - direction: Vec3::NEG_X, - color: green, - intensity: 10.0, - }); - let dir_blue = stage.new_value(DirectionalLight { - direction: Vec3::NEG_Z, - color: blue, - intensity: 10.0, - }); + let dir_red = stage.lighting().new_analytical_light( + DirectionalLightDescriptor { + direction: Vec3::NEG_Y, + color: red, + intensity: 10.0, + }, + None, + ); + let _dir_green = stage.lighting().new_analytical_light( + DirectionalLightDescriptor { + direction: Vec3::NEG_X, + color: green, + intensity: 10.0, + }, + None, + ); + let _dir_blue = stage.lighting().new_analytical_light( + DirectionalLightDescriptor { + direction: Vec3::NEG_Z, + color: blue, + intensity: 10.0, + }, + None, + ); assert_eq!( Light { light_type: LightStyle::Directional, - index: dir_red.id().inner(), + index: dir_red.light_details.as_directional().unwrap().id().inner(), ..Default::default() }, - dir_red.id().into() + Light::from(dir_red.light_details.as_directional().unwrap().id()) ); - let dir_red = stage.new_value(Light::from(dir_red.id())); - let dir_green = stage.new_value(Light::from(dir_green.id())); - let dir_blue = stage.new_value(Light::from(dir_blue.id())); - stage.set_lights(vec![dir_red.id(), dir_green.id(), dir_blue.id()]); let material = stage.new_value(Material::default()); let geometry = stage.new_array( diff --git a/crates/renderling/src/light.rs b/crates/renderling/src/light.rs new file mode 100644 index 00000000..c543a573 --- /dev/null +++ b/crates/renderling/src/light.rs @@ -0,0 +1,779 @@ +//! Lighting. +//! +//! Directional, point and spot lights. +//! +//! Shadow mapping. +use crabslab::{Array, Id, Slab, SlabItem}; +use glam::{Mat4, UVec2, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; +use spirv_std::spirv; + +use crate::{ + atlas::{AtlasDescriptor, AtlasTexture}, + cubemap::{CubemapDescriptor, CubemapFaceDirection}, + math::{IsSampler, IsVector, Sample2dArray}, + stage::Renderlet, + transform::Transform, +}; + +#[cfg(cpu)] +mod cpu; +#[cfg(cpu)] +pub use cpu::*; + +#[cfg(cpu)] +mod shadow_map; +#[cfg(cpu)] +pub use shadow_map::*; + +/// Root descriptor of the lighting system. +#[derive(Clone, Copy, Default, SlabItem, core::fmt::Debug)] +#[offsets] +pub struct LightingDescriptor { + /// List of all analytical lights in the scene. + pub analytical_lights_array: Array>, + /// Shadow mapping atlas info. + pub shadow_map_atlas_descriptor_id: Id, + /// `Id` of the [`ShadowMapDescriptor`] to use when updating + /// a shadow map. + /// + /// This changes from each run of the `shadow_mapping_vertex`. + pub update_shadow_map_id: Id, + /// The index of the shadow map atlas texture to update. + pub update_shadow_map_texture_index: u32, +} + +#[derive(Clone, Copy, Default, SlabItem, core::fmt::Debug)] +pub struct ShadowMapDescriptor { + pub light_space_transforms_array: Array, + /// Near plane of the projection matrix + pub z_near: f32, + /// Far plane of the projection matrix + pub z_far: f32, + /// Pointers to the atlas textures where the shadow map depth + /// data is stored. + /// + /// This will be an array of one `Id` for directional and spot lights, + /// and an array of four `Id`s for a point light. + pub atlas_textures_array: Array>, + pub bias_min: f32, + pub bias_max: f32, + pub pcf_samples: u32, +} + +#[cfg(test)] +#[derive(Default, Debug, Clone, Copy, PartialEq)] +pub struct ShadowMappingVertexInfo { + pub renderlet_id: Id, + pub vertex_index: u32, + pub vertex: crate::stage::Vertex, + pub transform: Transform, + pub model_matrix: Mat4, + pub world_pos: Vec3, + pub view_projection: Mat4, + pub clip_pos: Vec4, +} + +/// Shadow mapping vertex shader. +/// +/// It is assumed that a [`LightingDescriptor`] is stored at `Id(0)` of the +/// `light_slab`. +/// +/// This shader reads the [`LightingDescriptor`] to find the shadow map to +/// be updated, then determines the clip positions to emit based on the +/// shadow map's atlas texture. +/// +/// It then renders the renderlet into the designated atlas frame. +// Note: +// If this is taking too long to render for each renderlet, think about +// a frustum and occlusion culling pass to generate the list of renderlets. +#[spirv(vertex)] +#[allow(clippy::too_many_arguments)] +pub fn shadow_mapping_vertex( + // Points at a `Renderlet` + #[spirv(instance_index)] renderlet_id: Id, + // Which vertex within the renderlet are we rendering + #[spirv(vertex_index)] vertex_index: u32, + // The slab where the renderlet's geometry is staged + #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] geometry_slab: &[u32], + // The slab where the scene's lighting data is staged + #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] light_slab: &[u32], + + #[spirv(position)] out_clip_pos: &mut Vec4, + #[cfg(test)] out_comparison_info: &mut ShadowMappingVertexInfo, +) { + let renderlet = geometry_slab.read_unchecked(renderlet_id); + if !renderlet.visible { + // put it outside the clipping frustum + *out_clip_pos = Vec4::new(10.0, 10.0, 10.0, 1.0); + return; + } + + let (_vertex, _transform, _model_matrix, world_pos) = + renderlet.get_vertex_info(vertex_index, geometry_slab); + + let lighting_desc = light_slab.read_unchecked(Id::::new(0)); + let shadow_desc = light_slab.read_unchecked(lighting_desc.update_shadow_map_id); + let light_space_transform_id = shadow_desc + .light_space_transforms_array + .at(lighting_desc.update_shadow_map_texture_index as usize); + let light_space_transform = light_slab.read_unchecked(light_space_transform_id); + let clip_pos = light_space_transform * world_pos.extend(1.0); + #[cfg(test)] + { + *out_comparison_info = ShadowMappingVertexInfo { + renderlet_id, + vertex_index, + vertex: _vertex, + transform: _transform, + model_matrix: _model_matrix, + world_pos, + view_projection: light_space_transform, + clip_pos, + }; + } + *out_clip_pos = clip_pos; +} + +#[spirv(fragment)] +pub fn shadow_mapping_fragment(clip_pos: Vec4, frag_color: &mut Vec4) { + *frag_color = (clip_pos.xyz() / clip_pos.w).extend(1.0); +} + +/// Contains values needed to determine the outgoing radiance of a fragment. +/// +/// For more info, see the **Spotlight** section of the +/// [learnopengl](https://learnopengl.com/Lighting/Light-casters) +/// article. +#[derive(Clone, Copy, Default, core::fmt::Debug)] +pub struct SpotLightCalculation { + /// Position of the light in world space + pub light_position: Vec3, + /// Position of the fragment in world space + pub frag_position: Vec3, + /// Unit vector (LightDir) pointing from the fragment to the light + pub frag_to_light: Vec3, + /// Distance from the fragment to the light + pub frag_to_light_distance: f32, + /// Unit vector (SpotDir) direction that the light is pointing in + pub light_direction: Vec3, + /// The cosine of the cutoff angle (Phi Ï•) that specifies the spotlight's radius. + /// + /// Everything inside this angle is lit by the spotlight. + pub cos_inner_cutoff: f32, + /// The cosine of the cutoff angle (Gamma γ) that specifies the spotlight's outer radius. + /// + /// Everything outside this angle is not lit by the spotlight. + /// + /// Fragments between `inner_cutoff` and `outer_cutoff` have an intensity + /// between `1.0` and `0.0`. + pub cos_outer_cutoff: f32, + /// Whether the fragment is inside the `inner_cutoff` cone. + pub fragment_is_inside_inner_cone: bool, + /// Whether the fragment is inside the `outer_cutoff` cone. + pub fragment_is_inside_outer_cone: bool, + /// `outer_cutoff` - `inner_cutoff` + pub epsilon: f32, + /// Cosine of the angle (Theta θ) between `frag_to_light` (LightDir) vector and the + /// `light_direction` (SpotDir) vector. + /// + /// θ should be smaller than `outer_cutoff` (Gamma γ) to be + /// inside the spotlight, but since these are all cosines of angles, we actually + /// compare using `>`. + pub cos_theta: f32, + pub contribution_unclamped: f32, + /// The intensity level between `0.0` and `1.0` that should be used to determine + /// outgoing radiance. + pub contribution: f32, +} + +impl SpotLightCalculation { + /// Calculate the values required to determine outgoing radiance of a spot light. + pub fn new( + spot_light_descriptor: SpotLightDescriptor, + node_transform: Mat4, + fragment_world_position: Vec3, + ) -> Self { + #[cfg(gpu)] + use spirv_std::num_traits::Float; + + let light_position = node_transform.transform_point3(spot_light_descriptor.position); + let frag_position = fragment_world_position; + let frag_to_light = light_position - frag_position; + let frag_to_light_distance = frag_to_light.length(); + if frag_to_light_distance == 0.0 { + return Self::default(); + } + let frag_to_light = frag_to_light.alt_norm_or_zero(); + let light_direction = node_transform + .transform_vector3(spot_light_descriptor.direction) + .alt_norm_or_zero(); + let cos_inner_cutoff = spot_light_descriptor.inner_cutoff.cos(); + let cos_outer_cutoff = spot_light_descriptor.outer_cutoff.cos(); + let epsilon = cos_inner_cutoff - cos_outer_cutoff; + let cos_theta = frag_to_light.dot(-light_direction); + let fragment_is_inside_inner_cone = cos_theta > cos_inner_cutoff; + let fragment_is_inside_outer_cone = cos_theta > cos_outer_cutoff; + let contribution_unclamped = (cos_theta - cos_outer_cutoff) / epsilon; + let contribution = contribution_unclamped.clamp(0.0, 1.0); + Self { + light_position, + frag_position, + frag_to_light, + frag_to_light_distance, + light_direction, + cos_inner_cutoff, + cos_outer_cutoff, + fragment_is_inside_inner_cone, + fragment_is_inside_outer_cone, + epsilon, + cos_theta, + contribution_unclamped, + contribution, + } + } +} + +#[repr(C)] +#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] +#[derive(Copy, Clone, SlabItem)] +pub struct SpotLightDescriptor { + pub position: Vec3, + pub direction: Vec3, + pub inner_cutoff: f32, + pub outer_cutoff: f32, + pub color: Vec4, + pub intensity: f32, +} + +impl Default for SpotLightDescriptor { + fn default() -> Self { + let white = Vec4::splat(1.0); + let inner_cutoff = core::f32::consts::PI / 3.0; + let outer_cutoff = core::f32::consts::PI / 2.0; + let direction = Vec3::new(0.0, -1.0, 0.0); + let color = white; + let intensity = 1.0; + + Self { + position: Default::default(), + direction, + inner_cutoff, + outer_cutoff, + color, + intensity, + } + } +} + +impl SpotLightDescriptor { + pub fn shadow_mapping_projection_and_view( + &self, + parent_light_transform: &Mat4, + z_near: f32, + z_far: f32, + ) -> (Mat4, Mat4) { + let fovy = 2.0 * self.outer_cutoff; + let aspect = 1.0; + let projection = Mat4::perspective_rh(fovy, aspect, z_near, z_far); + let direction = parent_light_transform + .transform_vector3(self.direction) + .alt_norm_or_zero(); + let position = parent_light_transform.transform_point3(self.position); + let view = Mat4::look_to_rh(position, direction, Vec3::Z); + (projection, view) + } +} + +#[repr(C)] +#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] +#[derive(Copy, Clone, SlabItem)] +pub struct DirectionalLightDescriptor { + pub direction: Vec3, + pub color: Vec4, + pub intensity: f32, +} + +impl Default for DirectionalLightDescriptor { + fn default() -> Self { + let direction = Vec3::new(0.0, -1.0, 0.0); + let color = Vec4::splat(1.0); + let intensity = 1.0; + + Self { + direction, + color, + intensity, + } + } +} + +impl DirectionalLightDescriptor { + pub fn shadow_mapping_projection_and_view( + &self, + parent_light_transform: &Mat4, + // Near limits of the light's reach + // + // The maximum should be the `Camera`'s `Frustum::depth()`. + // TODO: in `DirectionalLightDescriptor::shadow_mapping_projection_and_view`, take Frustum + // as a parameter and then figure out the minimal view projection that includes that frustum + z_near: f32, + // Far limits of the light's reach + z_far: f32, + ) -> (Mat4, Mat4) { + let depth = (z_far - z_near).abs(); + let hd = depth * 0.5; + let projection = Mat4::orthographic_rh(-hd, hd, -hd, hd, z_near, z_far); + let direction = parent_light_transform + .transform_vector3(self.direction) + .alt_norm_or_zero(); + let position = -direction * depth * 0.5; + crate::println!("direction: {direction}"); + crate::println!("position: {position}"); + let view = Mat4::look_to_rh(position, direction, Vec3::Z); + (projection, view) + } +} + +#[repr(C)] +#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] +#[derive(Copy, Clone, SlabItem)] +pub struct PointLightDescriptor { + pub position: Vec3, + pub color: Vec4, + pub intensity: f32, +} + +impl Default for PointLightDescriptor { + fn default() -> Self { + let color = Vec4::splat(1.0); + let intensity = 1.0; + + Self { + position: Default::default(), + color, + intensity, + } + } +} + +impl PointLightDescriptor { + pub fn shadow_mapping_view_matrix( + &self, + face_index: usize, + parent_light_transform: &Mat4, + ) -> Mat4 { + let eye = parent_light_transform.transform_point3(self.position); + let mut face = CubemapFaceDirection::FACES[face_index]; + face.eye = eye; + face.view() + } + + pub fn shadow_mapping_projection_matrix(z_near: f32, z_far: f32) -> Mat4 { + Mat4::perspective_lh(core::f32::consts::FRAC_PI_2, 1.0, z_near, z_far) + } + + pub fn shadow_mapping_projection_and_view_matrices( + &self, + parent_light_transform: &Mat4, + z_near: f32, + z_far: f32, + ) -> (Mat4, [Mat4; 6]) { + let p = Self::shadow_mapping_projection_matrix(z_near, z_far); + let eye = parent_light_transform.transform_point3(self.position); + ( + p, + CubemapFaceDirection::FACES.map(|mut face| { + face.eye = eye; + face.view() + }), + ) + } +} + +#[repr(u32)] +#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] +#[derive(Copy, Clone, PartialEq)] +pub enum LightStyle { + Directional = 0, + Point = 1, + Spot = 2, +} + +impl SlabItem for LightStyle { + const SLAB_SIZE: usize = { 1 }; + + fn read_slab(index: usize, slab: &[u32]) -> Self { + let proxy = u32::read_slab(index, slab); + match proxy { + 0 => LightStyle::Directional, + 1 => LightStyle::Point, + 2 => LightStyle::Spot, + _ => LightStyle::Directional, + } + } + + fn write_slab(&self, index: usize, slab: &mut [u32]) -> usize { + let proxy = *self as u32; + proxy.write_slab(index, slab) + } +} + +/// A type-erased/generic light that is used as a slab pointer to a +/// specific light type. +// TODO: rename to `LightDescriptor` +#[repr(C)] +#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] +#[derive(Copy, Clone, PartialEq, SlabItem)] +pub struct Light { + /// The type of the light + pub light_type: LightStyle, + /// The index of the light in the lighting slab + pub index: u32, + /// The id of a transform to apply to the position and direction of the light. + /// + /// This `Id` points to a transform on the geometry slab. + pub transform_id: Id, + /// The id of the shadow map in use by this light. + pub shadow_map_desc_id: Id, +} + +impl Default for Light { + fn default() -> Self { + Self { + light_type: LightStyle::Directional, + index: Id::<()>::NONE.inner(), + transform_id: Id::NONE, + shadow_map_desc_id: Id::NONE, + } + } +} + +impl From> for Light { + fn from(id: Id) -> Self { + Self { + light_type: LightStyle::Directional, + index: id.inner(), + transform_id: Id::NONE, + shadow_map_desc_id: Id::NONE, + } + } +} + +impl From> for Light { + fn from(id: Id) -> Self { + Self { + light_type: LightStyle::Spot, + index: id.inner(), + transform_id: Id::NONE, + shadow_map_desc_id: Id::NONE, + } + } +} + +impl From> for Light { + fn from(id: Id) -> Self { + Self { + light_type: LightStyle::Point, + index: id.inner(), + transform_id: Id::NONE, + shadow_map_desc_id: Id::NONE, + } + } +} + +impl Light { + pub fn into_directional_id(self) -> Id { + Id::from(self.index) + } + + pub fn into_spot_id(self) -> Id { + Id::from(self.index) + } + + pub fn into_point_id(self) -> Id { + Id::from(self.index) + } +} + +/// Parameters to the shadow mapping calculation function. +/// +/// This is mostly just to appease clippy. +pub struct ShadowCalculation { + pub shadow_map_desc: ShadowMapDescriptor, + pub shadow_map_atlas_size: UVec2, + pub surface_normal_in_world_space: Vec3, + pub frag_pos_in_world_space: Vec3, + pub frag_to_light_in_world_space: Vec3, + pub bias_min: f32, + pub bias_max: f32, + pub pcf_samples: u32, +} + +impl ShadowCalculation { + /// Reads various required parameters from the slab and creates a `ShadowCalculation`. + pub fn new( + light_slab: &[u32], + light: crate::prelude::Light, + in_pos: Vec3, + surface_normal: Vec3, + light_direction: Vec3, + ) -> Self { + let shadow_map_desc = light_slab.read_unchecked(light.shadow_map_desc_id); + let atlas_size = { + let lighting_desc_id = Id::::new(0); + let atlas_desc_id = light_slab.read_unchecked( + lighting_desc_id + LightingDescriptor::OFFSET_OF_SHADOW_MAP_ATLAS_DESCRIPTOR_ID, + ); + let atlas_desc = light_slab.read_unchecked(atlas_desc_id); + atlas_desc.size + }; + + ShadowCalculation { + shadow_map_desc, + shadow_map_atlas_size: atlas_size.xy(), + surface_normal_in_world_space: surface_normal, + frag_pos_in_world_space: in_pos, + frag_to_light_in_world_space: light_direction, + bias_min: shadow_map_desc.bias_min, + bias_max: shadow_map_desc.bias_max, + pcf_samples: shadow_map_desc.pcf_samples, + } + } + + fn get_atlas_texture_at(&self, light_slab: &[u32], index: usize) -> AtlasTexture { + let atlas_texture_id = + light_slab.read_unchecked(self.shadow_map_desc.atlas_textures_array.at(index)); + light_slab.read_unchecked(atlas_texture_id) + } + + fn get_frag_pos_in_light_space(&self, light_slab: &[u32], index: usize) -> Vec3 { + let light_space_transform_id = self.shadow_map_desc.light_space_transforms_array.at(index); + let light_space_transform = light_slab.read_unchecked(light_space_transform_id); + light_space_transform.project_point3(self.frag_pos_in_world_space) + } + + /// Returns shadow _intensity_ for directional and spot lights. + /// + /// Returns `0.0` when the fragment is in full light. + /// Returns `1.0` when the fragment is in full shadow. + pub fn run_directional_or_spot( + &self, + light_slab: &[u32], + shadow_map: &T, + shadow_map_sampler: &S, + ) -> f32 + where + S: IsSampler, + T: Sample2dArray, + { + let ShadowCalculation { + shadow_map_desc: _, + shadow_map_atlas_size, + frag_pos_in_world_space: _, + surface_normal_in_world_space: surface_normal, + frag_to_light_in_world_space: light_direction, + bias_min, + bias_max, + pcf_samples, + } = self; + let frag_pos_in_light_space = self.get_frag_pos_in_light_space(light_slab, 0); + crate::println!("frag_pos_in_light_space: {frag_pos_in_light_space}"); + if !crate::math::is_inside_clip_space(frag_pos_in_light_space.xyz()) { + return 0.0; + } + // The range of coordinates in the light's clip space is -1.0 to 1.0 for x and y, + // but the texture space is [0, 1], and Y increases downward, so we do this + // conversion to flip Y and also normalize to the range [0.0, 1.0]. + // Z should already be 0.0 to 1.0. + let proj_coords_uv = (frag_pos_in_light_space.xy() * Vec2::new(1.0, -1.0) + + Vec2::splat(1.0)) + * Vec2::splat(0.5); + crate::println!("proj_coords_uv: {proj_coords_uv}"); + + let shadow_map_atlas_texture = self.get_atlas_texture_at(light_slab, 0); + // With these projected coordinates we can sample the depth map as the + // resulting [0,1] coordinates from proj_coords directly correspond to + // the transformed NDC coordinates from the `ShadowMap::update` render pass. + // This gives us the closest depth from the light's point of view: + let pcf_samples_2 = *pcf_samples as i32 / 2; + let texel_size = 1.0 + / Vec2::new( + shadow_map_atlas_texture.size_px.x as f32, + shadow_map_atlas_texture.size_px.y as f32, + ); + let mut shadow = 0.0f32; + let mut total = 0.0f32; + for x in -pcf_samples_2..=pcf_samples_2 { + for y in -pcf_samples_2..=pcf_samples_2 { + let proj_coords = shadow_map_atlas_texture.uv( + proj_coords_uv + Vec2::new(x as f32, y as f32) * texel_size, + *shadow_map_atlas_size, + ); + let shadow_map_depth = shadow_map + .sample_by_lod(*shadow_map_sampler, proj_coords, 0.0) + .x; + // To get the current depth at this fragment we simply retrieve the projected vector's z + // coordinate which equals the depth of this fragment from the light's perspective. + let fragment_depth = frag_pos_in_light_space.z; + + // If the `current_depth`, which is the depth of the fragment from the lights POV, is + // greater than the `closest_depth` of the shadow map at that fragment, the fragment + // is in shadow + crate::println!("current_depth: {fragment_depth}"); + crate::println!("closest_depth: {shadow_map_depth}"); + let bias = (bias_max * (1.0 - surface_normal.dot(*light_direction))).max(*bias_min); + + if (fragment_depth - bias) > shadow_map_depth { + shadow += 1.0 + } + total += 1.0; + } + } + shadow / total.max(1.0) + } + + pub const POINT_SAMPLE_OFFSET_DIRECTIONS: [Vec3; 21] = [ + Vec3::ZERO, + Vec3::new(1.0, 1.0, 1.0), + Vec3::new(1.0, -1.0, 1.0), + Vec3::new(-1.0, -1.0, 1.0), + Vec3::new(-1.0, 1.0, 1.0), + Vec3::new(1.0, 1.0, -1.0), + Vec3::new(1.0, -1.0, -1.0), + Vec3::new(-1.0, -1.0, -1.0), + Vec3::new(-1.0, 1.0, -1.0), + Vec3::new(1.0, 1.0, 0.0), + Vec3::new(1.0, -1.0, 0.0), + Vec3::new(-1.0, -1.0, 0.0), + Vec3::new(-1.0, 1.0, 0.0), + Vec3::new(1.0, 0.0, 1.0), + Vec3::new(-1.0, 0.0, 1.0), + Vec3::new(1.0, 0.0, -1.0), + Vec3::new(-1.0, 0.0, -1.0), + Vec3::new(0.0, 1.0, 1.0), + Vec3::new(0.0, -1.0, 1.0), + Vec3::new(0.0, -1.0, -1.0), + Vec3::new(0.0, 1.0, -1.0), + ]; + /// Returns shadow _intensity_ for point lights. + /// + /// Returns `0.0` when the fragment is in full light. + /// Returns `1.0` when the fragment is in full shadow. + pub fn run_point( + &self, + light_slab: &[u32], + shadow_map: &T, + shadow_map_sampler: &S, + light_pos_in_world_space: Vec3, + ) -> f32 + where + S: IsSampler, + T: Sample2dArray, + { + let ShadowCalculation { + shadow_map_desc, + shadow_map_atlas_size, + frag_pos_in_world_space, + surface_normal_in_world_space: surface_normal, + frag_to_light_in_world_space: frag_to_light, + bias_min, + bias_max, + pcf_samples, + } = self; + + let light_to_frag_dir = frag_pos_in_world_space - light_pos_in_world_space; + crate::println!("light_to_frag_dir: {light_to_frag_dir}"); + + let pcf_samplesf = (*pcf_samples as f32) + .max(1.0) + .min(Self::POINT_SAMPLE_OFFSET_DIRECTIONS.len() as f32); + let pcf_samples = pcf_samplesf as usize; + let view_distance = light_to_frag_dir.length(); + let disk_radius = (1.0 + view_distance / shadow_map_desc.z_far) / 25.0; + let mut shadow = 0.0f32; + for i in 0..pcf_samples { + let sample_offset = Self::POINT_SAMPLE_OFFSET_DIRECTIONS[i] * disk_radius; + crate::println!("sample_offset: {sample_offset}"); + let sample_dir = (light_to_frag_dir + sample_offset).alt_norm_or_zero(); + let (face_index, uv) = CubemapDescriptor::get_face_index_and_uv(sample_dir); + crate::println!("face_index: {face_index}",); + crate::println!("uv: {uv}"); + let frag_pos_in_light_space = self.get_frag_pos_in_light_space(light_slab, face_index); + let face_texture = self.get_atlas_texture_at(light_slab, face_index); + let uv_tex = face_texture.uv(uv, *shadow_map_atlas_size); + let shadow_map_depth = shadow_map.sample_by_lod(*shadow_map_sampler, uv_tex, 0.0).x; + let fragment_depth = frag_pos_in_light_space.z; + let bias = (bias_max * (1.0 - surface_normal.dot(*frag_to_light))).max(*bias_min); + if (fragment_depth - bias) > shadow_map_depth { + shadow += 1.0 + } + } + + shadow / pcf_samplesf + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[cfg(feature = "gltf")] + #[test] + fn position_direction_sanity() { + // With GLTF, the direction of a light is given by the light's node's transform. + // Specifically we get the node's transform and use the rotation quaternion to + // rotate the vector Vec3::NEG_Z - the result is our direction. + + use glam::{Mat4, Quat}; + println!("{:#?}", std::env::current_dir()); + let (document, _buffers, _images) = gltf::import("../../gltf/four_spotlights.glb").unwrap(); + for node in document.nodes() { + println!("node: {} {:?}", node.index(), node.name()); + + let gltf_transform = node.transform(); + let (translation, rotation, _scale) = gltf_transform.decomposed(); + let position = Vec3::from_array(translation); + let direction = + Mat4::from_quat(Quat::from_array(rotation)).transform_vector3(Vec3::NEG_Z); + println!("position: {position}"); + println!("direction: {direction}"); + + // In Blender, our lights are sitting at (0, 0, 1) pointing at -Z, +Z, +X and + // +Y. But alas, it is a bit more complicated than that because this + // file is exported with UP being +Y, so Z and Y have been + // flipped... + assert_eq!(Vec3::Y, position); + let expected_direction = match node.name() { + Some("light_negative_z") => Vec3::NEG_Y, + Some("light_positive_z") => Vec3::Y, + Some("light_positive_x") => Vec3::X, + Some("light_positive_y") => Vec3::NEG_Z, + n => panic!("unexpected node '{n:?}'"), + }; + // And also there are rounding ... imprecisions... + assert_approx_eq::assert_approx_eq!(expected_direction.x, direction.x); + assert_approx_eq::assert_approx_eq!(expected_direction.y, direction.y); + assert_approx_eq::assert_approx_eq!(expected_direction.z, direction.z); + } + } + + #[test] + /// Test that we can determine if a point is inside clip space or not. + fn clip_space_bounds_sanity() { + let inside = Vec3::ONE; + assert!( + crate::math::is_inside_clip_space(inside), + "should be inside" + ); + let inside = Vec3::new(0.5, -0.5, -0.8); + assert!( + crate::math::is_inside_clip_space(inside), + "should be inside" + ); + let outside = Vec3::new(0.5, 0.0, 1.3); + assert!( + !crate::math::is_inside_clip_space(outside), + "should be outside" + ); + } +} diff --git a/crates/renderling/src/light/cpu.rs b/crates/renderling/src/light/cpu.rs new file mode 100644 index 00000000..4c00248a --- /dev/null +++ b/crates/renderling/src/light/cpu.rs @@ -0,0 +1,620 @@ +//! CPU-only lighting and shadows. + +use std::sync::{Arc, Mutex, RwLock}; + +use craballoc::{ + prelude::{Hybrid, SlabAllocator, WgpuRuntime}, + slab::SlabBuffer, + value::{HybridArray, HybridContainer, IsContainer, WeakContainer, WeakHybrid}, +}; +use crabslab::{Id, SlabItem}; +use glam::{Mat4, UVec2}; +use snafu::prelude::*; + +use crate::{ + atlas::{Atlas, AtlasBlitter, AtlasError}, + stage::NestedTransform, +}; + +use super::{ + DirectionalLightDescriptor, Light, LightStyle, LightingDescriptor, PointLightDescriptor, + SpotLightDescriptor, +}; + +pub use super::shadow_map::ShadowMap; + +#[derive(Debug, Snafu)] +#[snafu(visibility(pub(crate)))] +pub enum LightingError { + #[snafu(display("{source}"))] + Atlas { source: AtlasError }, + + #[snafu(display("AnalyticalLightBundle attached to this ShadowMap was dropped"))] + DroppedAnalyticalLightBundle, +} + +impl From for LightingError { + fn from(source: AtlasError) -> Self { + LightingError::Atlas { source } + } +} + +/// A wrapper around all types of analytical lighting. +#[derive(Clone, Debug)] +pub enum LightDetails { + Directional(C::Container), + Point(C::Container), + Spot(C::Container), +} + +impl From> for LightDetails { + fn from(value: Hybrid) -> Self { + LightDetails::Directional(value) + } +} + +impl From> for LightDetails { + fn from(value: Hybrid) -> Self { + LightDetails::Spot(value) + } +} + +impl From> for LightDetails { + fn from(value: Hybrid) -> Self { + LightDetails::Point(value) + } +} + +impl LightDetails { + pub fn as_directional(&self) -> Option<&C::Container> { + if let LightDetails::Directional(d) = self { + Some(d) + } else { + None + } + } + + pub fn as_spot(&self) -> Option<&C::Container> { + if let LightDetails::Spot(s) = self { + Some(s) + } else { + None + } + } + + pub fn as_point(&self) -> Option<&C::Container> { + if let LightDetails::Point(p) = self { + Some(p) + } else { + None + } + } + + pub fn style(&self) -> LightStyle { + match self { + LightDetails::Directional(_) => LightStyle::Directional, + LightDetails::Point(_) => LightStyle::Point, + LightDetails::Spot(_) => LightStyle::Spot, + } + } +} + +impl LightDetails { + pub(crate) fn from_hybrid(hybrid: &LightDetails) -> Self { + match hybrid { + LightDetails::Directional(d) => LightDetails::Directional(WeakHybrid::from_hybrid(d)), + LightDetails::Point(p) => LightDetails::Point(WeakHybrid::from_hybrid(p)), + LightDetails::Spot(s) => LightDetails::Spot(WeakHybrid::from_hybrid(s)), + } + } + + pub(crate) fn upgrade(&self) -> Option { + Some(match self { + LightDetails::Directional(d) => LightDetails::Directional(d.upgrade()?), + LightDetails::Point(p) => LightDetails::Point(p.upgrade()?), + LightDetails::Spot(s) => LightDetails::Spot(s.upgrade()?), + }) + } +} + +/// A bundle of lighting resources representing one analytical light in a scene. +/// +/// Create an `AnalyticalLightBundle` with the `Lighting::new_*_light` functions: +/// - [`Lighting::new_directional_light`] +pub struct AnalyticalLightBundle { + pub light: Ct::Container, + pub light_details: LightDetails, + pub transform: NestedTransform, +} + +impl Clone for AnalyticalLightBundle +where + Ct::Container: Clone, + LightDetails: Clone, + NestedTransform: Clone, +{ + fn clone(&self) -> Self { + Self { + light: self.light.clone(), + light_details: self.light_details.clone(), + transform: self.transform.clone(), + } + } +} + +impl AnalyticalLightBundle { + pub(crate) fn from_hybrid(light: &AnalyticalLightBundle) -> Self { + AnalyticalLightBundle { + light: WeakHybrid::from_hybrid(&light.light), + light_details: LightDetails::from_hybrid(&light.light_details), + transform: NestedTransform::from_hybrid(&light.transform), + } + } + + pub(crate) fn upgrade(&self) -> Option { + Some(AnalyticalLightBundle { + light: self.light.upgrade()?, + light_details: self.light_details.upgrade()?, + transform: self.transform.upgrade()?, + }) + } +} + +impl AnalyticalLightBundle { + pub fn weak(&self) -> AnalyticalLightBundle { + AnalyticalLightBundle::from_hybrid(self) + } + + pub fn light_space_transforms(&self, z_near: f32, z_far: f32) -> Vec { + let t = self.transform.get(); + let m = Mat4::from(t); + match &self.light_details { + LightDetails::Directional(d) => vec![{ + let (p, v) = d + .get() + .shadow_mapping_projection_and_view(&m, z_near, z_far); + p * v + }], + LightDetails::Point(point) => { + let (p, vs) = point + .get() + .shadow_mapping_projection_and_view_matrices(&m, z_near, z_far); + vs.into_iter().map(|v| p * v).collect() + } + LightDetails::Spot(spot) => vec![{ + let (p, v) = spot + .get() + .shadow_mapping_projection_and_view(&m, z_near, z_far); + p * v + }], + } + } +} + +/// Manages lighting for an entire scene. +#[derive(Clone)] +pub struct Lighting { + pub(crate) geometry_slab: SlabAllocator, + pub(crate) light_slab: SlabAllocator, + pub(crate) light_slab_buffer: Arc>>, + pub(crate) geometry_slab_buffer: Arc>>, + pub(crate) lighting_descriptor: Hybrid, + pub(crate) analytical_lights: Arc>>>, + pub(crate) analytical_lights_array: Arc>>>, + pub(crate) bindgroup_layout: Arc, + pub(crate) shadow_map_update_pipeline: Arc, + pub(crate) shadow_map_update_bindgroup_layout: Arc, + pub(crate) shadow_map_update_blitter: AtlasBlitter, + pub(crate) shadow_map_atlas: Atlas, +} + +impl Lighting { + const LABEL: Option<&str> = Some("lighting"); + + /// Create the atlas used to store all shadow maps. + fn create_shadow_map_atlas( + light_slab: &SlabAllocator, + size: wgpu::Extent3d, + ) -> Atlas { + let usage = wgpu::TextureUsages::RENDER_ATTACHMENT + | wgpu::TextureUsages::TEXTURE_BINDING + | wgpu::TextureUsages::COPY_SRC; + Atlas::new( + light_slab, + size, + Some(wgpu::TextureFormat::R32Float), + Some("shadow-map-atlas"), + Some(usage), + ) + } + + pub(crate) fn create_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Self::LABEL, + entries: &[ + // light 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, + }, + // shadow map texture view + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Texture { + sample_type: wgpu::TextureSampleType::Float { filterable: false }, + view_dimension: wgpu::TextureViewDimension::D2Array, + multisampled: false, + }, + count: None, + }, + // shadow map texture sampler + wgpu::BindGroupLayoutEntry { + binding: 2, + visibility: wgpu::ShaderStages::FRAGMENT, + ty: wgpu::BindingType::Sampler(wgpu::SamplerBindingType::NonFiltering), + count: None, + }, + ], + }) + } + + pub fn create_bindgroup( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + light_slab_buffer: &wgpu::Buffer, + shadow_map_depth_texture: &crate::texture::Texture, + ) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Self::LABEL, + layout: bindgroup_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: light_slab_buffer.as_entire_binding(), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::TextureView(&shadow_map_depth_texture.view), + }, + wgpu::BindGroupEntry { + binding: 2, + resource: wgpu::BindingResource::Sampler(&shadow_map_depth_texture.sampler), + }, + ], + }) + } + + /// Returns the lighting bindgroup. + pub fn get_bindgroup(&self) -> wgpu::BindGroup { + let mut light_slab_buffer = self.light_slab_buffer.write().unwrap(); + // TODO: invalidate + let _should_invalidate = light_slab_buffer.update_if_invalid(); + + Self::create_bindgroup( + self.light_slab.device(), + &self.bindgroup_layout, + &light_slab_buffer, + &self.shadow_map_atlas.get_texture(), + ) + } + + /// Create a new [`Lighting`] manager. + pub fn new(geometry_slab: &SlabAllocator) -> Self { + let runtime = geometry_slab.runtime(); + let light_slab = + SlabAllocator::new_with_label(runtime, wgpu::BufferUsages::empty(), Some("light-slab")); + let lighting_descriptor = light_slab.new_value(LightingDescriptor::default()); + let light_slab_buffer = light_slab.commit(); + let bindgroup_layout = Self::create_bindgroup_layout(&runtime.device); + + let shadow_map_update_bindgroup_layout: Arc<_> = + ShadowMap::create_update_bindgroup_layout(&runtime.device).into(); + let shadow_map_update_pipeline = + ShadowMap::create_update_pipeline(&runtime.device, &shadow_map_update_bindgroup_layout) + .into(); + Self { + shadow_map_atlas: Self::create_shadow_map_atlas( + &light_slab, + // TODO: make the shadow map atlas size configurable + wgpu::Extent3d { + width: 1024, + height: 1024, + depth_or_array_layers: 4, + }, + ), + analytical_lights: Default::default(), + analytical_lights_array: Arc::new(Mutex::new(light_slab.new_array([]))), + geometry_slab: geometry_slab.clone(), + light_slab, + light_slab_buffer: Arc::new(RwLock::new(light_slab_buffer)), + lighting_descriptor, + geometry_slab_buffer: Arc::new(RwLock::new(geometry_slab.commit())), + bindgroup_layout: bindgroup_layout.into(), + shadow_map_update_pipeline, + shadow_map_update_bindgroup_layout, + shadow_map_update_blitter: AtlasBlitter::new( + &runtime.device, + wgpu::TextureFormat::R32Float, + wgpu::FilterMode::Nearest, + ), + } + } + + pub fn slab(&self) -> &SlabAllocator { + &self.light_slab + } + + /// Add an [`AnalyticalLightBundle`] to the internal list of lights. + /// + /// This is called implicitly by [`Lighting::new_analytical_light`]. + /// + /// This can be used to add the light back to the scene after using + /// [`Lighting::remove_light`]. + pub fn add_light(&self, bundle: &AnalyticalLightBundle) { + { + // Update the array of light ids + // UNWRAP: POP + let mut analytical_lights_array_guard = self.analytical_lights_array.lock().unwrap(); + let mut analytical_light_ids_vec = analytical_lights_array_guard.get_vec(); + analytical_light_ids_vec.push(bundle.light.id()); + *analytical_lights_array_guard = self.light_slab.new_array(analytical_light_ids_vec); + } + { + // Update our list of weakly ref'd light bundles + self.analytical_lights + .lock() + .unwrap() + .push(AnalyticalLightBundle::::from_hybrid(bundle)); + } + } + + /// Remove an [`AnalyticalLightBundle`] from the internal list of lights. + /// + /// Use this to exclude a light from rendering, without dropping the light. + /// + /// After calling this function you can include the light again using [`Lighting::add_light`]. + pub fn remove_light(&self, bundle: &AnalyticalLightBundle) { + let ids = { + let mut guard = self.analytical_lights.lock().unwrap(); + guard.retain(|stored_light| stored_light.light.id() != bundle.light.id()); + guard + .iter() + .map(|stored_light| stored_light.light.id()) + .collect::>() + }; + *self.analytical_lights_array.lock().unwrap() = self.light_slab.new_array(ids); + } + + /// Create a new [`AnalyticalLightBundle`] for the given descriptor `T`. + /// + /// `T` must be one of: + /// - [`DirectionalLightDescriptor`] + /// - [`SpotLightDescriptor`] + /// - [`PointLightDescirptor`] + pub fn new_analytical_light( + &self, + light_descriptor: T, + nested_transform: Option, + ) -> AnalyticalLightBundle + where + T: Clone + Copy + SlabItem + Send + Sync, + Light: From>, + LightDetails: From>, + { + let transform = nested_transform.unwrap_or_else(|| NestedTransform::new(&self.light_slab)); + let light_inner = self.light_slab.new_value(light_descriptor); + let light = self.light_slab.new_value({ + let mut light = Light::from(light_inner.id()); + light.transform_id = transform.global_transform_id(); + light + }); + let light_details = LightDetails::from(light_inner); + let bundle = AnalyticalLightBundle { + light, + light_details, + transform, + }; + + self.add_light(&bundle); + + bundle + } + + /// Enable shadow mapping for the given [`AnalyticalLightBundle`], creating + /// a new [`ShadowMap`]. + pub fn new_shadow_map( + &self, + analytical_light_bundle: &AnalyticalLightBundle, + // Size of the shadow map + size: UVec2, + // Distance to the near plane of the shadow map's frustum. + // + // Only objects within the shadow map's frustum will cast shadows. + z_near: f32, + // Distance to the far plane of the shadow map's frustum + // + // Only objects within the shadow map's frustum will cast shadows. + z_far: f32, + ) -> Result { + ShadowMap::new(self, analytical_light_bundle, size, z_near, z_far) + } + + pub fn upkeep(&self) { + { + // Drop any analytical lights that don't have external references, + // and update our lights array. + let mut guard = self.analytical_lights.lock().unwrap(); + let mut changed = false; + guard.retain(|light_bundle| { + let has_refs = light_bundle.light.has_external_references(); + changed = changed || !has_refs; + has_refs + }); + if changed { + *self.analytical_lights_array.lock().unwrap() = self + .light_slab + .new_array(guard.iter().map(|bundle| bundle.light.id())); + } + } + self.lighting_descriptor.set(LightingDescriptor { + analytical_lights_array: self.analytical_lights_array.lock().unwrap().array(), + shadow_map_atlas_descriptor_id: self.shadow_map_atlas.descriptor_id(), + update_shadow_map_id: Id::NONE, + update_shadow_map_texture_index: 0, + }); + self.light_slab.commit(); + } +} + +#[cfg(test)] +mod test { + + use glam::Vec3; + + use crate::{camera::Camera, light::SpotLightCalculation, prelude::Transform}; + + use super::*; + + #[test] + /// Ensures that a spot light can determine if a point lies inside or outside its cone + /// of emission. + fn spot_one_calc() { + let (doc, _, _) = gltf::import( + crate::test::workspace_dir() + .join("gltf") + .join("spot_one.glb"), + ) + .unwrap(); + let light = doc.lights().unwrap().next().unwrap(); + let spot = if let gltf::khr_lights_punctual::Kind::Spot { + inner_cone_angle, + outer_cone_angle, + } = light.kind() + { + (inner_cone_angle, outer_cone_angle) + } else { + panic!("not a spot light"); + }; + log::info!("spot: {spot:#?}"); + + let light_node = doc.nodes().find(|node| node.light().is_some()).unwrap(); + let parent_transform = Transform::from(light_node.transform()); + log::info!("parent_transform: {parent_transform:#?}"); + + let spot_descriptor = SpotLightDescriptor { + position: Vec3::ZERO, + direction: Vec3::NEG_Z, + inner_cutoff: spot.0, + outer_cutoff: spot.1, + color: Vec3::from(light.color()).extend(1.0), + intensity: light.intensity(), + }; + + let specific_points = [ + (Vec3::ZERO, true, true, Some(1.0)), + (Vec3::new(0.5, 0.0, 0.0), false, true, None), + (Vec3::new(0.5, 0.0, 0.5), false, false, None), + (Vec3::new(1.0, 0.0, 0.0), false, false, Some(0.0)), + ]; + for (i, (point, inside_inner, inside_outer, maybe_contribution)) in + specific_points.into_iter().enumerate() + { + log::info!("{i} descriptor: {spot_descriptor:#?}"); + let spot_calc = + SpotLightCalculation::new(spot_descriptor, parent_transform.into(), point); + log::info!("{i} spot_calc@{point}:\n{spot_calc:#?}"); + assert_eq!( + (inside_inner, inside_outer), + ( + spot_calc.fragment_is_inside_inner_cone, + spot_calc.fragment_is_inside_outer_cone + ), + ); + if let Some(expected_contribution) = maybe_contribution { + assert_eq!(expected_contribution, spot_calc.contribution); + } + } + } + + #[test] + /// Ensures that a spot light illuminates only the objects within its cone of + /// emission. + fn spot_one_frame() { + let m = 32.0; + let (w, h) = (16.0f32 * m, 9.0 * m); + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx.new_stage().with_msaa_sample_count(4); + let camera = stage.new_value(Camera::default()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("spot_one.glb"), + camera.id(), + ) + .unwrap(); + let mut c = doc.cameras.first().unwrap().get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + camera.set(c); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq("lights/spot_lights/one.png", img); + frame.present(); + } + + #[test] + /// Test the spot lights. + /// + /// This should render a cube with two spot lights illuminating a spot on two + /// of its sides. + fn spot_lights() { + let w = 800.0; + let h = 800.0; + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx + .new_stage() + .with_lighting(true) + .with_msaa_sample_count(4); + + let camera = stage.new_value(Camera::default()); + log::info!("camera_id: {:?}", camera.id()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("spot_lights.glb"), + camera.id(), + ) + .unwrap(); + let gltf_camera = doc.cameras.first().unwrap(); + // TODO: investigate using the camera's aspect for any frame size. + // A `TextureView` of the frame could be created that renders to the frame + // within the camera's expected aspect ratio. + // + // We'd probably need to constrain rendering to one camera, though. + let mut c = gltf_camera.get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + camera.set(c); + + let down_light = doc.lights.first().unwrap(); + log::info!( + "down_light: {:#?}", + down_light.light_details.as_spot().unwrap().get() + ); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq("lights/spot_lights/frame.png", img); + frame.present(); + } +} diff --git a/crates/renderling/src/light/shadow_map.rs b/crates/renderling/src/light/shadow_map.rs new file mode 100644 index 00000000..df3cb5ca --- /dev/null +++ b/crates/renderling/src/light/shadow_map.rs @@ -0,0 +1,708 @@ +//! Shadow mapping. + +use core::{ops::Deref, sync::atomic::AtomicUsize}; +use std::sync::Arc; + +use craballoc::{ + prelude::Hybrid, + value::{HybridArray, HybridWriteGuard, WeakContainer}, +}; +use crabslab::Id; +use glam::{Mat4, UVec2}; +use snafu::OptionExt; + +use crate::{ + atlas::{AtlasBlittingOperation, AtlasImage, AtlasTexture}, + bindgroup::ManagedBindGroup, + stage::Renderlet, +}; + +use super::{ + AnalyticalLightBundle, DroppedAnalyticalLightBundleSnafu, Lighting, LightingError, + ShadowMapDescriptor, +}; + +/// A depth map rendering of the scene from a light's point of view. +/// +/// Used to project shadows from one light source for specific objects. +#[derive(Clone)] +pub struct ShadowMap { + /// Last time the stage slab was bound. + pub(crate) stage_slab_buffer_creation_time: Arc, + /// Last time the light slab was bound. + pub(crate) light_slab_buffer_creation_time: Arc, + /// This shadow map's light transform, + pub(crate) shadowmap_descriptor: Hybrid, + /// This shadow map's transforms. + /// + /// Directional and spot lights have 1, point lights + /// have 6. + pub(crate) light_space_transforms: HybridArray, + /// Bindgroup for the shadow map update shader + pub(crate) update_bindgroup: ManagedBindGroup, + pub(crate) atlas_textures: Vec>, + pub(crate) _atlas_textures_array: HybridArray>, + pub(crate) update_texture: crate::texture::Texture, + pub(crate) blitting_op: AtlasBlittingOperation, + pub(crate) light_bundle: AnalyticalLightBundle, +} + +impl ShadowMap { + const LABEL: Option<&str> = Some("shadow-map"); + + pub fn create_update_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Self::LABEL, + entries: &[ + wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + wgpu::BindGroupLayoutEntry { + binding: 1, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Storage { read_only: true }, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }, + ], + }) + } + + pub fn create_update_pipeline( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + ) -> wgpu::RenderPipeline { + let shadow_map_update_layout = + device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: ShadowMap::LABEL, + bind_group_layouts: &[bindgroup_layout], + push_constant_ranges: &[], + }); + let shadow_map_update_vertex = crate::linkage::shadow_mapping_vertex::linkage(device); + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Self::LABEL, + layout: Some(&shadow_map_update_layout), + vertex: wgpu::VertexState { + module: &shadow_map_update_vertex.module, + entry_point: Some(shadow_map_update_vertex.entry_point), + compilation_options: wgpu::PipelineCompilationOptions::default(), + buffers: &[], + }, + primitive: wgpu::PrimitiveState { + topology: wgpu::PrimitiveTopology::TriangleList, + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: Some(wgpu::Face::Front), + unclipped_depth: false, + polygon_mode: wgpu::PolygonMode::Fill, + conservative: false, + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: wgpu::TextureFormat::Depth32Float, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::Less, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState::default(), + fragment: None, + multiview: None, + cache: None, + }) + } + + /// Create the bindgroup for the shadow map update shader. + fn create_update_bindgroup( + device: &wgpu::Device, + bindgroup_layout: &wgpu::BindGroupLayout, + geometry_slab_buffer: &wgpu::Buffer, + light_slab_buffer: &wgpu::Buffer, + ) -> wgpu::BindGroup { + device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Self::LABEL, + layout: bindgroup_layout, + entries: &[ + wgpu::BindGroupEntry { + binding: 0, + resource: wgpu::BindingResource::Buffer( + geometry_slab_buffer.as_entire_buffer_binding(), + ), + }, + wgpu::BindGroupEntry { + binding: 1, + resource: wgpu::BindingResource::Buffer( + light_slab_buffer.as_entire_buffer_binding(), + ), + }, + ], + }) + } + + /// Returns the [`Id`] of the inner [`ShadowMapDescriptor`]. + pub fn descriptor_id(&self) -> Id { + self.shadowmap_descriptor.id() + } + + /// Returns a guard on the inner [`ShadowMapDescriptor`]. + /// + /// Use this to update descriptor values before calling `ShadowMap::update`. + pub fn descriptor_lock(&self) -> HybridWriteGuard<'_, ShadowMapDescriptor> { + self.shadowmap_descriptor.lock() + } + + /// Enable shadow mapping for the given [`AnalyticalLightBundle`], creating + /// a new [`ShadowMap`]. + pub fn new( + lighting: &Lighting, + analytical_light_bundle: &AnalyticalLightBundle, + // Size of the shadow map + size: UVec2, + // Distance to the shadow map frustum's near plane + z_near: f32, + // Distance to the shadow map frustum's far plane + z_far: f32, + ) -> Result { + let stage_slab_buffer = lighting.geometry_slab_buffer.read().unwrap(); + let is_point_light = + analytical_light_bundle.light_details.style() == super::LightStyle::Point; + let count = if is_point_light { 6 } else { 1 }; + let atlas = &lighting.shadow_map_atlas; + let image = AtlasImage::new(size, crate::atlas::AtlasImageFormat::R32FLOAT); + // UNWRAP: safe because we know there's one in here + let atlas_textures = atlas.add_images(vec![ℑ count])?; + let atlas_len = atlas.len(); + // Regardless of light type, we only create one depth texture, + // but that texture may be of layer 1 or 6 + let label = format!("shadow-map-{atlas_len}"); + let update_texture = crate::texture::Texture::create_depth_texture_for_shadow_map( + atlas.device(), + size.x, + size.y, + 1, + Some(&label), + is_point_light, + ); + let atlas_textures_array = lighting + .light_slab + .new_array(atlas_textures.iter().map(|t| t.id())); + let blitting_op = lighting + .shadow_map_update_blitter + .new_blitting_operation(atlas, if is_point_light { 6 } else { 1 }); + let light_space_transforms = lighting + .light_slab + .new_array(analytical_light_bundle.light_space_transforms(z_near, z_far)); + let shadowmap_descriptor = lighting.light_slab.new_value(ShadowMapDescriptor { + light_space_transforms_array: light_space_transforms.array(), + z_near, + z_far, + atlas_textures_array: atlas_textures_array.array(), + bias_min: 0.0005, + bias_max: 0.005, + pcf_samples: 4, + }); + // Set the descriptor in the light, so the shader knows to use it + analytical_light_bundle.light.modify(|light| { + light.shadow_map_desc_id = shadowmap_descriptor.id(); + }); + let light_slab_buffer = lighting.light_slab.commit(); + let update_bindgroup = ManagedBindGroup::from(ShadowMap::create_update_bindgroup( + lighting.light_slab.device(), + &lighting.shadow_map_update_bindgroup_layout, + stage_slab_buffer.deref(), + &light_slab_buffer, + )); + + Ok(ShadowMap { + stage_slab_buffer_creation_time: Arc::new(stage_slab_buffer.creation_time().into()), + light_slab_buffer_creation_time: Arc::new(light_slab_buffer.creation_time().into()), + shadowmap_descriptor, + light_space_transforms, + update_bindgroup, + atlas_textures, + _atlas_textures_array: atlas_textures_array, + update_texture, + blitting_op, + light_bundle: analytical_light_bundle.weak(), + }) + } + + /// Update the `ShadowMap`, rendering the given [`Renderlet`]s to the map as shadow casters. + /// + /// The `ShadowMap` contains a weak referenc to the [`AnalyticalLightBundle`] used to create + /// it. Updates made to this `AnalyticalLightBundle` will automatically propogate to this + /// `ShadowMap`. + /// + /// ## Errors + /// If the `AnalyticalLightBundle` used to create this `ShadowMap` has been + /// dropped, calling this function will err. + pub fn update<'a>( + &self, + lighting: &Lighting, + renderlets: impl IntoIterator>, + ) -> Result<(), LightingError> { + let light_bundle = self + .light_bundle + .upgrade() + .context(DroppedAnalyticalLightBundleSnafu)?; + let shadow_desc = self.shadowmap_descriptor.get(); + let new_transforms = + light_bundle.light_space_transforms(shadow_desc.z_near, shadow_desc.z_far); + for (i, t) in (0..self.light_space_transforms.len()).zip(new_transforms) { + self.light_space_transforms.set_item(i, t); + } + if lighting.geometry_slab.has_queued_updates() { + lighting.geometry_slab.commit(); + } + let renderlets = renderlets.into_iter().collect::>(); + + let device = lighting.light_slab.device(); + let queue = lighting.light_slab.queue(); + let mut light_slab_buffer = lighting.light_slab_buffer.write().unwrap(); + let mut stage_slab_buffer = lighting.geometry_slab_buffer.write().unwrap(); + + let bindgroup = { + light_slab_buffer.update_if_invalid(); + stage_slab_buffer.update_if_invalid(); + let stored_light_buffer_creation_time = self.light_slab_buffer_creation_time.swap( + light_slab_buffer.creation_time(), + std::sync::atomic::Ordering::Relaxed, + ); + let stored_stage_buffer_creation_time = self.stage_slab_buffer_creation_time.swap( + stage_slab_buffer.creation_time(), + std::sync::atomic::Ordering::Relaxed, + ); + let should_invalidate = light_slab_buffer.creation_time() + > stored_light_buffer_creation_time + || stage_slab_buffer.creation_time() > stored_stage_buffer_creation_time; + self.update_bindgroup.get(should_invalidate, || { + log::trace!("recreating shadow mapping bindgroup"); + Self::create_update_bindgroup( + device, + &lighting.shadow_map_update_bindgroup_layout, + &stage_slab_buffer, + &light_slab_buffer, + ) + }) + }; + for (i, atlas_texture) in self.atlas_textures.iter().enumerate() { + let mut encoder = device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Self::LABEL }); + + // Update the lighting descriptor to point to this shadow map, which tells the + // vertex shader which shadow map we're updating. + lighting.lighting_descriptor.modify(|ld| { + let id = self.shadowmap_descriptor.id(); + log::trace!("updating the shadow map {id:?} {i}"); + ld.update_shadow_map_id = id; + ld.update_shadow_map_texture_index = i as u32; + }); + // Sync those changes + let _ = lighting.light_slab.commit(); + let label = format!("{}-view-{i}", Self::LABEL.unwrap()); + let view = self + .update_texture + .texture + .create_view(&wgpu::TextureViewDescriptor { + label: Some(&label), + base_array_layer: i as u32, + array_layer_count: Some(1), + dimension: Some(wgpu::TextureViewDimension::D2), + ..Default::default() + }); + { + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Self::LABEL, + color_attachments: &[], + depth_stencil_attachment: Some(wgpu::RenderPassDepthStencilAttachment { + view: &view, + depth_ops: Some(wgpu::Operations { + load: wgpu::LoadOp::Clear(1.0), + store: wgpu::StoreOp::Store, + }), + stencil_ops: None, + }), + ..Default::default() + }); + render_pass.set_pipeline(&lighting.shadow_map_update_pipeline); + render_pass.set_bind_group(0, Some(bindgroup.as_ref()), &[]); + let mut count = 0; + for rlet in renderlets.iter() { + let id = rlet.id(); + let rlet = rlet.get(); + let vertex_range = 0..rlet.get_vertex_count(); + let instance_range = id.inner()..id.inner() + 1; + render_pass.draw(vertex_range, instance_range); + count += 1; + } + log::trace!("rendered {count} renderlets to the shadow map"); + } + // Then copy the depth texture to our shadow map atlas in the lighting struct + self.blitting_op.run( + lighting.light_slab.runtime(), + &mut encoder, + &self.update_texture, + i as u32, + &lighting.shadow_map_atlas, + atlas_texture, + )?; + let submission = queue.submit(Some(encoder.finish())); + device.poll(wgpu::Maintain::wait_for(submission)); + } + Ok(()) + } +} + +#[cfg(test)] +mod test { + use image::Luma; + + use crate::{camera::Camera, texture::DepthTexture}; + + use super::super::*; + + #[test] + fn shadow_mapping_just_cuboid() { + let w = 800.0; + let h = 800.0; + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx + .new_stage() + .with_lighting(true) + .with_msaa_sample_count(4); + + // let hdr_path = + // std::path::PathBuf::from(std::env!("CARGO_WORKSPACE_DIR")).join("img/hdr/night.hdr"); + // let hdr_img = AtlasImage::from_hdr_path(hdr_path).unwrap(); + + let camera = stage.new_value(Camera::default()); + // let skybox = Skybox::new(&ctx, hdr_img, camera.id()); + // stage.set_skybox(skybox); + log::info!("camera_id: {:?}", camera.id()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_only_cuboid.gltf"), + camera.id(), + ) + .unwrap(); + let gltf_camera = doc.cameras.first().unwrap(); + let mut c = gltf_camera.get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + camera.set(c); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + frame.present(); + + // Rendering the scene without shadows as a sanity check + img_diff::assert_img_eq("shadows/shadow_mapping_just_cuboid/scene_before.png", img); + + let gltf_light = doc.lights.first().unwrap(); + let shadow_map = stage + .lighting() + .new_shadow_map(gltf_light, UVec2::splat(256), 0.0, 20.0) + .unwrap(); + shadow_map.shadowmap_descriptor.modify(|desc| { + desc.bias_min = 0.00008; + desc.bias_max = 0.00008; + }); + shadow_map + .update(stage.lighting(), doc.renderlets_iter()) + .unwrap(); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq("shadows/shadow_mapping_just_cuboid/scene_after.png", img); + frame.present(); + } + + #[test] + fn shadow_mapping_just_cuboid_red_and_blue() { + let w = 800.0; + let h = 800.0; + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx + .new_stage() + .with_lighting(true) + .with_msaa_sample_count(4); + + let camera = stage.new_value(Camera::default()); + log::info!("camera_id: {:?}", camera.id()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_only_cuboid_red_and_blue.gltf"), + camera.id(), + ) + .unwrap(); + let gltf_camera = doc.cameras.first().unwrap(); + let mut c = gltf_camera.get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + camera.set(c); + + let gltf_light_a = doc.lights.first().unwrap(); + let gltf_light_b = doc.lights.get(1).unwrap(); + let shadow_map_a = stage + .lighting() + .new_shadow_map(gltf_light_a, UVec2::splat(256), 0.0, 20.0) + .unwrap(); + shadow_map_a.shadowmap_descriptor.modify(|desc| { + desc.bias_min = 0.00008; + desc.bias_max = 0.00008; + }); + shadow_map_a + .update(stage.lighting(), doc.renderlets_iter()) + .unwrap(); + let shadow_map_b = stage + .lighting() + .new_shadow_map(gltf_light_b, UVec2::splat(256), 0.0, 20.0) + .unwrap(); + shadow_map_b.shadowmap_descriptor.modify(|desc| { + desc.bias_min = 0.00008; + desc.bias_max = 0.00008; + }); + shadow_map_b + .update(stage.lighting(), doc.renderlets_iter()) + .unwrap(); + + let frame = ctx.get_next_frame().unwrap(); + + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq( + "shadows/shadow_mapping_just_cuboid/red_and_blue/frame.png", + img, + ); + frame.present(); + } + + #[test] + fn shadow_mapping_sanity() { + let w = 800.0; + let h = 800.0; + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx.new_stage().with_lighting(true); + + let camera = stage.new_value(Camera::default()); + + log::info!("camera_id: {:?}", camera.id()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_sanity.gltf"), + camera.id(), + ) + .unwrap(); + let gltf_camera = doc.cameras.first().unwrap(); + let mut c = gltf_camera.get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + camera.set(c); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + frame.present(); + + // Rendering the scene without shadows as a sanity check + img_diff::assert_img_eq("shadows/shadow_mapping_sanity/scene_before.png", img); + + let gltf_light = doc.lights.first().unwrap(); + assert_eq!( + gltf_light.light.get().transform_id, + gltf_light.transform.global_transform_id(), + "light's global transform id is different from its transform_id" + ); + + let shadows = stage + .lighting() + .new_shadow_map(gltf_light, UVec2::new(w as u32, h as u32), 0.0, 20.0) + .unwrap(); + shadows + .update(stage.lighting(), doc.renderlets_iter()) + .unwrap(); + + { + // Ensure the state of the "update texture", which receives the depth of the scene on update + let shadow_map_update_texture = + DepthTexture::try_new_from(&ctx, shadows.update_texture.clone()).unwrap(); + let mut shadow_map_update_img = shadow_map_update_texture.read_image().unwrap(); + img_diff::normalize_gray_img(&mut shadow_map_update_img); + img_diff::assert_img_eq( + "shadows/shadow_mapping_sanity/shadows_update_texture.png", + shadow_map_update_img, + ); + } + + let shadow_depth_buffer = stage.lighting().shadow_map_atlas.atlas_img_buffer(&ctx, 0); + let shadow_depth_img = shadow_depth_buffer + .into_image::>(ctx.get_device()) + .unwrap(); + let shadow_depth_img = shadow_depth_img.into_luma8(); + let mut depth_img = shadow_depth_img.clone(); + img_diff::normalize_gray_img(&mut depth_img); + img_diff::assert_img_eq("shadows/shadow_mapping_sanity/depth.png", depth_img); + + // Now do the rendering *with the shadow map* to see if it works. + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + + let img = frame.read_image().unwrap(); + frame.present(); + img_diff::assert_img_eq("shadows/shadow_mapping_sanity/stage_render.png", img); + } + + #[test] + fn shadow_mapping_spot_lights() { + let w = 800.0; + let h = 800.0; + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx + .new_stage() + .with_lighting(true) + .with_msaa_sample_count(4); + + let camera = stage.new_value(Camera::default()); + log::info!("camera_id: {:?}", camera.id()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_spots.glb"), + camera.id(), + ) + .unwrap(); + let gltf_camera = doc.cameras.first().unwrap(); + let mut c = gltf_camera.get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + camera.set(c); + + let mut shadow_maps = vec![]; + let z_near = 0.1; + let z_far = 100.0; + for (i, light_bundle) in doc.lights.iter().enumerate() { + { + let desc = light_bundle.light_details.as_spot().unwrap().get(); + let (p, v) = desc.shadow_mapping_projection_and_view( + &light_bundle.transform.get_global_transform().into(), + z_near, + z_far, + ); + camera.set(Camera::new(p, v)); + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq( + &format!("shadows/shadow_mapping_spots/light_pov_{i}.png"), + img, + ); + frame.present(); + } + let shadow = stage + .lighting() + .new_shadow_map(light_bundle, UVec2::splat(256), z_near, z_far) + .unwrap(); + shadow.shadowmap_descriptor.modify(|desc| { + desc.bias_min = f32::EPSILON; + desc.bias_max = f32::EPSILON; + }); + + shadow + .update(stage.lighting(), doc.renderlets_iter()) + .unwrap(); + shadow_maps.push(shadow); + } + camera.set(c); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq("shadows/shadow_mapping_spots/frame.png", img); + frame.present(); + } + + #[test] + fn shadow_mapping_point_lights() { + let w = 800.0; + let h = 800.0; + let ctx = crate::Context::headless(w as u32, h as u32); + let mut stage = ctx + .new_stage() + .with_lighting(true) + .with_background_color(Vec3::splat(0.05087).extend(1.0)) + .with_msaa_sample_count(4); + let camera = stage.new_value(Camera::default()); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_points.glb"), + camera.id(), + ) + .unwrap(); + let gltf_camera = doc.cameras.first().unwrap(); + let mut c = gltf_camera.get_camera(); + c.set_projection(crate::camera::perspective(w, h)); + + camera.set(c); + + let mut shadows = vec![]; + let z_near = 0.1; + let z_far = 100.0; + for (i, light_bundle) in doc.lights.iter().enumerate() { + { + let desc = light_bundle.light_details.as_point().unwrap().get(); + let (p, vs) = desc.shadow_mapping_projection_and_view_matrices( + &light_bundle.transform.get_global_transform().into(), + z_near, + z_far, + ); + for (j, v) in vs.into_iter().enumerate() { + camera.set(Camera::new(p, v)); + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq( + &format!("shadows/shadow_mapping_points/light_{i}_pov_{j}.png"), + img, + ); + frame.present(); + } + } + let shadow = stage + .lighting() + .new_shadow_map(light_bundle, UVec2::splat(256), z_near, z_far) + .unwrap(); + shadow.shadowmap_descriptor.modify(|desc| { + desc.pcf_samples = 16; + desc.bias_min = 0.00010; + desc.bias_max = 0.010; + }); + shadow + .update(stage.lighting(), doc.renderlets_iter()) + .unwrap(); + shadows.push(shadow); + } + camera.set(c); + + let frame = ctx.get_next_frame().unwrap(); + stage.render(&frame.view()); + let img = frame.read_image().unwrap(); + img_diff::assert_img_eq("shadows/shadow_mapping_points/frame.png", img); + frame.present(); + } +} diff --git a/crates/renderling/src/linkage.rs b/crates/renderling/src/linkage.rs index bbffe8f8..3bcbaff6 100644 --- a/crates/renderling/src/linkage.rs +++ b/crates/renderling/src/linkage.rs @@ -2,10 +2,12 @@ //! //! # 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/`. +//! The files there are all auto-generated by the shader compilation machinery. //! It is common to delete everything in that directory and regenerate. use std::sync::Arc; +pub mod atlas_blit_fragment; +pub mod atlas_blit_vertex; pub mod bloom_downsample_fragment; pub mod bloom_mix_fragment; pub mod bloom_upsample_fragment; @@ -16,6 +18,8 @@ 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 cubemap_sampling_test_fragment; +pub mod cubemap_sampling_test_vertex; pub mod debug_overlay_fragment; pub mod debug_overlay_vertex; pub mod di_convolution_fragment; @@ -25,6 +29,8 @@ pub mod prefilter_environment_cubemap_fragment; pub mod prefilter_environment_cubemap_vertex; pub mod renderlet_fragment; pub mod renderlet_vertex; +pub mod shadow_mapping_fragment; +pub mod shadow_mapping_vertex; pub mod skybox_cubemap_fragment; pub mod skybox_cubemap_vertex; pub mod skybox_equirectangular_fragment; @@ -48,6 +54,8 @@ pub struct ShaderLinkage { pub entry_point: &'static str, } +// TODO: move the bindgroup stuff out of linkage.rs + pub fn slab_bindgroup_layout(device: &wgpu::Device) -> wgpu::BindGroupLayout { let visibility = wgpu::ShaderStages::VERTEX | wgpu::ShaderStages::FRAGMENT | wgpu::ShaderStages::COMPUTE; diff --git a/crates/renderling/src/linkage/atlas_blit_fragment.rs b/crates/renderling/src/linkage/atlas_blit_fragment.rs new file mode 100644 index 00000000..f4ce010d --- /dev/null +++ b/crates/renderling/src/linkage/atlas_blit_fragment.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 = "atlas::atlas_blit_fragment"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/atlas-atlas_blit_fragment.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating native linkage for {}", "atlas_blit_fragment"); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "atlasatlas_blit_fragment"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/atlas-atlas_blit_fragment.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating web linkage for {}", "atlas_blit_fragment"); + 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/atlas_blit_vertex.rs b/crates/renderling/src/linkage/atlas_blit_vertex.rs new file mode 100644 index 00000000..e3cfab71 --- /dev/null +++ b/crates/renderling/src/linkage/atlas_blit_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 = "atlas::atlas_blit_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/atlas-atlas_blit_vertex.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating native linkage for {}", "atlas_blit_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 = "atlasatlas_blit_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/atlas-atlas_blit_vertex.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating web linkage for {}", "atlas_blit_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/linkage/cubemap_sampling_test_fragment.rs b/crates/renderling/src/linkage/cubemap_sampling_test_fragment.rs new file mode 100644 index 00000000..8783ec44 --- /dev/null +++ b/crates/renderling/src/linkage/cubemap_sampling_test_fragment.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 = "cubemap::cubemap_sampling_test_fragment"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/cubemap-cubemap_sampling_test_fragment.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!( + "creating native linkage for {}", + "cubemap_sampling_test_fragment" + ); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "cubemapcubemap_sampling_test_fragment"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/cubemap-cubemap_sampling_test_fragment.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!( + "creating web linkage for {}", + "cubemap_sampling_test_fragment" + ); + 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/cubemap_sampling_test_vertex.rs b/crates/renderling/src/linkage/cubemap_sampling_test_vertex.rs new file mode 100644 index 00000000..40c8ba5f --- /dev/null +++ b/crates/renderling/src/linkage/cubemap_sampling_test_vertex.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 = "cubemap::cubemap_sampling_test_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/cubemap-cubemap_sampling_test_vertex.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!( + "creating native linkage for {}", + "cubemap_sampling_test_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 = "cubemapcubemap_sampling_test_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/cubemap-cubemap_sampling_test_vertex.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!( + "creating web linkage for {}", + "cubemap_sampling_test_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/linkage/shadow_mapping_fragment.rs b/crates/renderling/src/linkage/shadow_mapping_fragment.rs new file mode 100644 index 00000000..a730025a --- /dev/null +++ b/crates/renderling/src/linkage/shadow_mapping_fragment.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 = "light::shadow_mapping_fragment"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/light-shadow_mapping_fragment.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating native linkage for {}", "shadow_mapping_fragment"); + super::ShaderLinkage { + entry_point: ENTRY_POINT, + module: device.create_shader_module(descriptor()).into(), + } + } +} +#[cfg(target_arch = "wasm32")] +mod target { + pub const ENTRY_POINT: &str = "lightshadow_mapping_fragment"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/light-shadow_mapping_fragment.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating web linkage for {}", "shadow_mapping_fragment"); + 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/shadow_mapping_vertex.rs b/crates/renderling/src/linkage/shadow_mapping_vertex.rs new file mode 100644 index 00000000..bb5ece96 --- /dev/null +++ b/crates/renderling/src/linkage/shadow_mapping_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 = "light::shadow_mapping_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_spirv!("../../shaders/light-shadow_mapping_vertex.spv") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating native linkage for {}", "shadow_mapping_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 = "lightshadow_mapping_vertex"; + pub fn descriptor() -> wgpu::ShaderModuleDescriptor<'static> { + wgpu::include_wgsl!("../../shaders/light-shadow_mapping_vertex.wgsl") + } + pub fn linkage(device: &wgpu::Device) -> super::ShaderLinkage { + log::debug!("creating web linkage for {}", "shadow_mapping_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 3a09b2a8..530d13ae 100644 --- a/crates/renderling/src/math.rs +++ b/crates/renderling/src/math.rs @@ -9,13 +9,16 @@ use core::ops::Mul; use spirv_std::{ image::{Cubemap, Image2d, Image2dArray}, - Sampler, + Image, Sampler, }; pub use glam::*; pub use spirv_std::num_traits::{clamp, Float, Zero}; + pub trait IsSampler: Copy + Clone {} +impl IsSampler for () {} + impl IsSampler for Sampler {} pub trait Sample2d { @@ -32,6 +35,14 @@ impl Sample2d for Image2d { } } +impl Sample2d for Image!(2D, type=f32, sampled, depth) { + type Sampler = Sampler; + + fn sample_by_lod(&self, sampler: Self::Sampler, uv: glam::Vec2, lod: f32) -> glam::Vec4 { + self.sample_by_lod(sampler, uv, lod) + } +} + pub trait Sample2dArray { type Sampler: IsSampler; @@ -46,6 +57,14 @@ impl Sample2dArray for Image2dArray { } } +impl Sample2dArray for Image!(2D, type=f32, sampled, arrayed, depth) { + type Sampler = Sampler; + + fn sample_by_lod(&self, sampler: Self::Sampler, uv: glam::Vec3, lod: f32) -> glam::Vec4 { + self.sample_by_lod(sampler, uv, lod) + } +} + pub trait SampleCube { type Sampler: IsSampler; @@ -62,45 +81,111 @@ impl SampleCube for Cubemap { #[cfg(not(target_arch = "spirv"))] mod cpu { - use image::GenericImageView; use super::*; - /// A CPU-side texture sampler. - /// - /// Provided primarily for testing purposes. - #[derive(Debug, Clone, Copy, Default)] - pub struct CpuSampler; + /// A CPU texture with no dimensions that always returns the same + /// value when sampled. + pub struct ConstTexture(Vec4); + + impl Sample2d for ConstTexture { + type Sampler = (); + + fn sample_by_lod(&self, _sampler: Self::Sampler, _uv: glam::Vec2, _lod: f32) -> Vec4 { + self.0 + } + } + + impl Sample2dArray for ConstTexture { + type Sampler = (); + + fn sample_by_lod(&self, _sampler: Self::Sampler, _uv: glam::Vec3, _lod: f32) -> glam::Vec4 { + self.0 + } + } + + impl SampleCube for ConstTexture { + type Sampler = (); + + fn sample_by_lod(&self, _sampler: Self::Sampler, _uv: Vec3, _lod: f32) -> glam::Vec4 { + self.0 + } + } + + impl ConstTexture { + pub fn new(value: Vec4) -> Self { + Self(value) + } + } - impl IsSampler for CpuSampler {} + #[derive(Debug)] + pub struct CpuTexture2d { + pub image: image::ImageBuffer, + convert_fn: fn(&P) -> Vec4, + } - #[derive(Debug, Default)] - pub struct CpuTexture2d { - pub image: image::DynamicImage, + impl CpuTexture2d { + pub fn from_image( + image: image::ImageBuffer, + convert_fn: fn(&P) -> Vec4, + ) -> Self { + Self { image, convert_fn } + } } - impl Sample2d for CpuTexture2d { - type Sampler = CpuSampler; + impl Sample2d for CpuTexture2d + where + P: image::Pixel, + Container: std::ops::Deref, + { + type Sampler = (); - fn sample_by_lod(&self, _sampler: Self::Sampler, uv: glam::Vec2, _lod: f32) -> glam::Vec4 { + fn sample_by_lod(&self, _sampler: Self::Sampler, uv: glam::Vec2, _lod: f32) -> Vec4 { // TODO: lerp the CPU texture sampling - let x = uv.x as u32; - if x >= self.image.width() { - return glam::Vec4::ZERO; - } + // TODO: use configurable wrap mode on CPU sampling + let px = uv.x.clamp(0.0, 1.0) * self.image.width() as f32; + let py = uv.y.clamp(0.0, 1.0) * self.image.height() as f32; + println!("sampling: ({px}, {py})"); + let p = self.image.get_pixel( + px.round().min(self.image.width() as f32) as u32, + py.round().min(self.image.height() as f32) as u32, + ); + (self.convert_fn)(p) + } + } - let y = uv.y as u32; - if y >= self.image.height() { - return glam::Vec4::ZERO; - } + pub struct CpuTexture2dArray { + pub images: Vec>, + convert_fn: fn(&P) -> Vec4, + } - let image::Rgba([r, g, b, a]) = self.image.get_pixel(uv.x as u32, uv.y as u32); - glam::Vec4::new( - r as f32 / 255.0, - g as f32 / 255.0, - b as f32 / 255.0, - a as f32 / 255.0, - ) + impl CpuTexture2dArray { + pub fn from_images( + images: impl IntoIterator>, + convert_fn: fn(&P) -> Vec4, + ) -> Self { + let images = images.into_iter().collect(); + Self { images, convert_fn } + } + } + + impl Sample2dArray for CpuTexture2dArray + where + P: image::Pixel, + Container: std::ops::Deref, + { + type Sampler = (); + + /// Panics if `uv.z` is greater than length of images. + fn sample_by_lod(&self, _sampler: Self::Sampler, uv: glam::Vec3, _lod: f32) -> Vec4 { + // TODO: lerp the CPU texture sampling + // TODO: use configurable wrap mode on CPU sampling + let img = &self.images[uv.z as usize]; + let px = (uv.x.clamp(0.0, 1.0) * (img.width() as f32 - 1.0)).round() as u32; + let py = (uv.y.clamp(0.0, 1.0) * (img.height() as f32 - 1.0)).round() as u32; + println!("sampling: ({px}, {py})"); + let p = img.get_pixel(px, py); + (self.convert_fn)(p) } } @@ -113,7 +198,7 @@ mod cpu { } impl SampleCube for CpuCubemap { - type Sampler = CpuSampler; + type Sampler = (); fn sample_by_lod( &self, @@ -121,49 +206,18 @@ mod cpu { direction: glam::Vec3, _lod: f32, ) -> glam::Vec4 { - // Take the absolute value of the direction vector components - let abs_direction = direction.abs(); - let (max_dim, u, v): (usize, f32, f32); - - // Determine which face of the cubemap the direction vector is pointing towards - // by finding the largest component of the vector. - // The u and v texture coordinates within that face are calculated by dividing - // the other two components of the direction vector by the largest component. - if abs_direction.x >= abs_direction.y && abs_direction.x >= abs_direction.z { - max_dim = if direction.x >= 0.0 { 0 } else { 1 }; - u = -direction.z / abs_direction.x; - v = -direction.y / abs_direction.x; - } else if abs_direction.y >= abs_direction.x && abs_direction.y >= abs_direction.z { - max_dim = if direction.y >= 0.0 { 2 } else { 3 }; - u = direction.x / abs_direction.y; - v = -direction.z / abs_direction.y; - } else { - max_dim = if direction.z >= 0.0 { 4 } else { 5 }; - u = direction.x / abs_direction.z; - v = direction.y / abs_direction.z; - } + crate::cubemap::cpu_sample_cubemap(&self.images, direction) + } + } - // Get the dimensions of the cubemap image - let (width, height) = self.images[max_dim].dimensions(); - // Convert the u and v coordinates from [-1, 1] to [0, width/height] - let tex_u = ((u + 1.0) * 0.5 * (width as f32 - 1.0)).round() as u32; - if tex_u >= self.images[max_dim].width() { - return glam::Vec4::ZERO; - } - let tex_v = ((1.0 - v) * 0.5 * (height as f32 - 1.0)).round() as u32; - if tex_v >= self.images[max_dim].height() { - return glam::Vec4::ZERO; - } + /// Convert a u8 in range 0-255 to an f32 in range 0.0 - 1.0. + pub fn scaled_u8_to_f32(u: u8) -> f32 { + u as f32 / 255.0 + } - // Sample and return the color from the appropriate image in the cubemap - let pixel = self.images[max_dim].get_pixel(tex_u, tex_v); - glam::Vec4::new( - pixel[0] as f32 / 255.0, - pixel[1] as f32 / 255.0, - pixel[2] as f32 / 255.0, - pixel[3] as f32 / 255.0, - ) - } + /// Convert an f32 in range 0.0 - 1.0 into a u8 in range 0-255. + pub fn scaled_f32_to_u8(f: f32) -> u8 { + (f * 255.0) as u8 } } #[cfg(not(target_arch = "spirv"))] @@ -418,12 +472,20 @@ pub const CLIP_QUAD_CCW: [Vec3; 6] = { [bl, br, tr, tr, tl, bl] }; +pub const CLIP_SPACE_COORD_QUAD_CCW_TL: Vec4 = Vec4::new(-1.0, 1.0, 0.5, 1.0); +pub const CLIP_SPACE_COORD_QUAD_CCW_BL: Vec4 = Vec4::new(-1.0, -1.0, 0.5, 1.0); +pub const CLIP_SPACE_COORD_QUAD_CCW_TR: Vec4 = Vec4::new(1.0, 1.0, 0.5, 1.0); +pub const CLIP_SPACE_COORD_QUAD_CCW_BR: Vec4 = Vec4::new(1.0, -1.0, 0.5, 1.0); + pub const CLIP_SPACE_COORD_QUAD_CCW: [Vec4; 6] = { - let tl = Vec4::new(-1.0, 1.0, 0.5, 1.0); - let tr = Vec4::new(1.0, 1.0, 0.5, 1.0); - let bl = Vec4::new(-1.0, -1.0, 0.5, 1.0); - let br = Vec4::new(1.0, -1.0, 0.5, 1.0); - [bl, br, tr, tr, tl, bl] + [ + CLIP_SPACE_COORD_QUAD_CCW_BL, + CLIP_SPACE_COORD_QUAD_CCW_BR, + CLIP_SPACE_COORD_QUAD_CCW_TR, + CLIP_SPACE_COORD_QUAD_CCW_TR, + CLIP_SPACE_COORD_QUAD_CCW_TL, + CLIP_SPACE_COORD_QUAD_CCW_BL, + ] }; pub const UV_COORD_QUAD_CCW: [Vec2; 6] = { @@ -513,9 +575,8 @@ pub fn reflect(i: Vec3, n: Vec3) -> Vec3 { i - 2.0 * n.dot(i) * n } -pub struct Plane { - pub point: Vec3, - pub norm: Vec3, +pub fn is_inside_clip_space(p: Vec3) -> bool { + p.x.abs() <= 1.0 && p.y.abs() <= 1.0 && p.z.abs() <= 1.0 } pub const fn convex_mesh([p0, p1, p2, p3, p4, p5, p6, p7]: [Vec3; 8]) -> [Vec3; 36] { diff --git a/crates/renderling/src/pbr.rs b/crates/renderling/src/pbr.rs index fea28e9c..d895fa2e 100644 --- a/crates/renderling/src/pbr.rs +++ b/crates/renderling/src/pbr.rs @@ -4,17 +4,19 @@ //! * //! * //! * -use crabslab::{Array, Id, Slab, SlabItem}; +use crabslab::{Id, Slab, SlabItem}; use glam::{Mat4, Vec2, Vec3, Vec4, Vec4Swizzles}; -use light::Light; -#[cfg(target_arch = "spirv")] -use spirv_std::num_traits::Float; +#[allow(unused)] +use spirv_std::num_traits::{Float, Zero}; use crate::{ atlas::AtlasTexture, + light::{ + DirectionalLightDescriptor, LightStyle, LightingDescriptor, PointLightDescriptor, + ShadowCalculation, SpotLightCalculation, + }, math::{self, IsSampler, IsVector, Sample2d, Sample2dArray, SampleCube}, - pbr::light::{DirectionalLight, PointLight, SpotLight}, println as my_println, stage::Renderlet, }; @@ -22,9 +24,6 @@ use crate::{ pub mod debug; use debug::DebugChannel; -pub mod light; -use light::LightStyle; - /// Represents a material on the GPU. #[repr(C)] #[cfg_attr(not(target_arch = "spirv"), derive(Debug))] @@ -241,7 +240,6 @@ pub struct PbrConfig { pub has_skinning: bool, pub perform_frustum_culling: bool, pub perform_occlusion_culling: bool, - pub light_array: Array>, } impl Default for PbrConfig { @@ -254,7 +252,6 @@ impl Default for PbrConfig { has_skinning: true, perform_frustum_culling: true, perform_occlusion_culling: false, - light_array: Default::default(), } } } @@ -296,7 +293,7 @@ pub fn texture_color, S: IsSampler>( /// PBR fragment shader capable of being run on CPU or GPU. #[allow(clippy::too_many_arguments)] -pub fn fragment_impl( +pub fn fragment_impl( atlas: &A, atlas_sampler: &S, irradiance: &C, @@ -305,7 +302,11 @@ pub fn fragment_impl( prefiltered_sampler: &S, brdf: &T, brdf_sampler: &S, + shadow_map: &DtA, + shadow_map_sampler: &S, + slab: &[u32], + lighting_slab: &[u32], renderlet_id: Id, @@ -321,10 +322,15 @@ pub fn fragment_impl( ) where A: Sample2dArray, T: Sample2d, + DtA: Sample2dArray, C: SampleCube, S: IsSampler, { let renderlet = slab.read_unchecked(renderlet_id); + // TODO: rename `PbrConfig` to `PbrShaderDescriptor` + let pbr_desc = slab.read_unchecked(renderlet.pbr_config_id); + crate::println!("pbr_desc_id: {:?}", renderlet.pbr_config_id); + crate::println!("pbr_desc: {pbr_desc:#?}"); let PbrConfig { atlas_size, resolution: _, @@ -333,11 +339,10 @@ pub fn fragment_impl( has_skinning: _, perform_frustum_culling: _, perform_occlusion_culling: _, - light_array, - } = slab.read_unchecked(renderlet.pbr_config_id); + } = pbr_desc; let material = get_material(renderlet.material_id, has_lighting, slab); - my_println!("material: {:?}", material); + crate::println!("material: {:#?}", material); let albedo_tex_uv = if material.albedo_tex_coord == 0 { in_uv0 @@ -537,6 +542,8 @@ pub fn fragment_impl( *output = if material.has_lighting { shade_fragment( + shadow_map, + shadow_map_sampler, camera.position(), n, in_pos, @@ -548,8 +555,7 @@ pub fn fragment_impl( irradiance, specular, brdf, - light_array, - slab, + lighting_slab, ) } else { crate::println!("no shading!"); @@ -558,7 +564,9 @@ pub fn fragment_impl( } #[allow(clippy::too_many_arguments)] -pub fn shade_fragment( +pub fn shade_fragment( + shadow_map: &T, + shadow_map_sampler: &S, // camera's position in world space camera_pos: Vec3, // normal of the fragment @@ -575,34 +583,39 @@ pub fn shade_fragment( prefiltered: Vec3, brdf: Vec2, - lights: Array>, - slab: &[u32], -) -> Vec4 { + light_slab: &[u32], +) -> Vec4 +where + S: IsSampler, + T: Sample2dArray, +{ let n = in_norm.alt_norm_or_zero(); let v = (camera_pos - in_pos).alt_norm_or_zero(); - my_println!("lights: {lights:?}"); + // There is always a `LightingDescriptor` stored at index `0` of the + // light slab. + let lighting_desc = light_slab.read_unchecked(Id::::new(0)); + let analytical_lights_array = lighting_desc.analytical_lights_array; + my_println!("lights: {analytical_lights_array:?}"); my_println!("n: {n:?}"); my_println!("v: {v:?}"); - // reflectance + + // accumulated outgoing radiance let mut lo = Vec3::ZERO; - for i in 0..lights.len() { + for i in 0..analytical_lights_array.len() { // calculate per-light radiance - let light_id = slab.read(lights.at(i)); - if light_id.is_none() { - break; - } - let light = slab.read(light_id); - let transform = slab.read(light.transform); + let light_id = light_slab.read(analytical_lights_array.at(i)); + let light = light_slab.read(light_id); + let transform = light_slab.read(light.transform_id); let transform = Mat4::from(transform); // determine the light ray and the radiance - match light.light_type { + let (radiance, shadow) = match light.light_type { LightStyle::Point => { - let PointLight { + let PointLightDescriptor { position, color, intensity, - } = slab.read(light.into_point_id()); + } = light_slab.read(light.into_point_id()); let position = transform.transform_point3(position); let frag_to_light = position - in_pos; let distance = frag_to_light.length(); @@ -611,48 +624,76 @@ pub fn shade_fragment( } let l = frag_to_light.alt_norm_or_zero(); let attenuation = intensity * 1.0 / (distance * distance); - lo += outgoing_radiance(color, albedo, attenuation, v, l, n, metallic, roughness); + let radiance = + outgoing_radiance(color, albedo, attenuation, v, l, n, metallic, roughness); + let shadow = if light.shadow_map_desc_id.is_some() { + // Shadow is 1.0 when the fragment is in the shadow of this light, + // and 0.0 in darkness + ShadowCalculation::new(light_slab, light, in_pos, n, l).run_point( + light_slab, + shadow_map, + shadow_map_sampler, + position, + ) + } else { + 0.0 + }; + (radiance, shadow) } LightStyle::Spot => { - let SpotLight { - position, - direction, - inner_cutoff, - outer_cutoff, - color, - intensity, - } = slab.read(light.into_spot_id()); - let position = transform.transform_point3(position); - let frag_to_light = position - in_pos; - let distance = frag_to_light.length(); - if distance == 0.0 { + let spot_light_descriptor = light_slab.read(light.into_spot_id()); + let calculation = + SpotLightCalculation::new(spot_light_descriptor, transform, in_pos); + if calculation.frag_to_light_distance == 0.0 { continue; } - let l = frag_to_light.alt_norm_or_zero(); - let direction = transform.transform_vector3(direction).alt_norm_or_zero(); - let theta: f32 = l.dot(direction); - let epsilon: f32 = inner_cutoff - outer_cutoff; - let attenuation: f32 = - intensity * ((theta - outer_cutoff) / epsilon).clamp(0.0, 1.0); - lo += outgoing_radiance(color, albedo, attenuation, v, l, n, metallic, roughness); + let attenuation: f32 = spot_light_descriptor.intensity * calculation.contribution; + let radiance = outgoing_radiance( + spot_light_descriptor.color, + albedo, + attenuation, + v, + calculation.frag_to_light, + n, + metallic, + roughness, + ); + let shadow = if light.shadow_map_desc_id.is_some() { + // Shadow is 1.0 when the fragment is in the shadow of this light, + // and 0.0 in darkness + ShadowCalculation::new(light_slab, light, in_pos, n, calculation.frag_to_light) + .run_directional_or_spot(light_slab, shadow_map, shadow_map_sampler) + } else { + 0.0 + }; + (radiance, shadow) } LightStyle::Directional => { - let DirectionalLight { + let DirectionalLightDescriptor { direction, color, intensity, - } = slab.read(light.into_directional_id()); + } = light_slab.read(light.into_directional_id()); let direction = transform.transform_vector3(direction); let l = -direction.alt_norm_or_zero(); let attenuation = intensity; let radiance = outgoing_radiance(color, albedo, attenuation, v, l, n, metallic, roughness); - my_println!("radiance: {radiance:?}"); - lo += radiance; + let shadow = + if light.shadow_map_desc_id.is_some() { + // Shadow is 1.0 when the fragment is in the shadow of this light, + // and 0.0 in darkness + ShadowCalculation::new(light_slab, light, in_pos, n, l) + .run_directional_or_spot(light_slab, shadow_map, shadow_map_sampler) + } else { + 0.0 + }; + (radiance, shadow) } - } + }; + lo += radiance * (1.0 - shadow); } my_println!("lo: {lo:?}"); diff --git a/crates/renderling/src/pbr/light.rs b/crates/renderling/src/pbr/light.rs deleted file mode 100644 index 7a4dd5fe..00000000 --- a/crates/renderling/src/pbr/light.rs +++ /dev/null @@ -1,223 +0,0 @@ -//! Stage lighting. -use crabslab::{Id, SlabItem}; -use glam::{Vec3, Vec4}; - -use crate::transform::Transform; - -#[repr(C)] -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Copy, Clone, SlabItem)] -pub struct SpotLight { - pub position: Vec3, - pub direction: Vec3, - pub inner_cutoff: f32, - pub outer_cutoff: f32, - pub color: Vec4, - pub intensity: f32, -} - -impl Default for SpotLight { - fn default() -> Self { - let white = Vec4::splat(1.0); - let inner_cutoff = core::f32::consts::PI / 3.0; - let outer_cutoff = core::f32::consts::PI / 2.0; - let direction = Vec3::new(0.0, -1.0, 0.0); - let color = white; - let intensity = 1.0; - - Self { - position: Default::default(), - direction, - inner_cutoff, - outer_cutoff, - color, - intensity, - } - } -} - -#[repr(C)] -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Copy, Clone, SlabItem)] -pub struct DirectionalLight { - pub direction: Vec3, - pub color: Vec4, - pub intensity: f32, -} - -impl Default for DirectionalLight { - fn default() -> Self { - let direction = Vec3::new(0.0, -1.0, 0.0); - let color = Vec4::splat(1.0); - let intensity = 1.0; - - Self { - direction, - color, - intensity, - } - } -} - -#[repr(C)] -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Copy, Clone, SlabItem)] -pub struct PointLight { - pub position: Vec3, - pub color: Vec4, - pub intensity: f32, -} - -impl Default for PointLight { - fn default() -> Self { - let color = Vec4::splat(1.0); - let intensity = 1.0; - - Self { - position: Default::default(), - color, - intensity, - } - } -} - -#[repr(u32)] -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Copy, Clone, PartialEq)] -pub enum LightStyle { - Directional = 0, - Point = 1, - Spot = 2, -} - -impl SlabItem for LightStyle { - const SLAB_SIZE: usize = { 1 }; - - fn read_slab(index: usize, slab: &[u32]) -> Self { - let proxy = u32::read_slab(index, slab); - match proxy { - 0 => LightStyle::Directional, - 1 => LightStyle::Point, - 2 => LightStyle::Spot, - _ => LightStyle::Directional, - } - } - - fn write_slab(&self, index: usize, slab: &mut [u32]) -> usize { - let proxy = *self as u32; - proxy.write_slab(index, slab) - } -} - -/// A type-erased linked-list-of-lights that is used as a slab pointer to any -/// light type. -#[repr(C)] -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Copy, Clone, PartialEq, SlabItem)] -pub struct Light { - // The type of the light - pub light_type: LightStyle, - // The index of the light in the slab - pub index: u32, - // The id of a transform to apply to the position and direction of the light. - pub transform: Id, -} - -impl Default for Light { - fn default() -> Self { - Self { - light_type: LightStyle::Directional, - index: Id::<()>::NONE.inner(), - transform: Id::NONE, - } - } -} - -impl From> for Light { - fn from(id: Id) -> Self { - Self { - light_type: LightStyle::Directional, - index: id.inner(), - transform: Id::NONE, - } - } -} - -impl From> for Light { - fn from(id: Id) -> Self { - Self { - light_type: LightStyle::Spot, - index: id.inner(), - transform: Id::NONE, - } - } -} - -impl From> for Light { - fn from(id: Id) -> Self { - Self { - light_type: LightStyle::Point, - index: id.inner(), - transform: Id::NONE, - } - } -} - -impl Light { - pub fn into_directional_id(self) -> Id { - Id::from(self.index) - } - - pub fn into_spot_id(self) -> Id { - Id::from(self.index) - } - - pub fn into_point_id(self) -> Id { - Id::from(self.index) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[cfg(feature = "gltf")] - #[test] - fn position_direction_sanity() { - // With GLTF, the direction of a light is given by the light's node's transform. - // Specifically we get the node's transform and use the rotation quaternion to - // rotate the vector Vec3::NEG_Z - the result is our direction. - - use glam::{Mat4, Quat}; - println!("{:#?}", std::env::current_dir()); - let (document, _buffers, _images) = gltf::import("../../gltf/four_spotlights.glb").unwrap(); - for node in document.nodes() { - println!("node: {} {:?}", node.index(), node.name()); - - let gltf_transform = node.transform(); - let (translation, rotation, _scale) = gltf_transform.decomposed(); - let position = Vec3::from_array(translation); - let direction = - Mat4::from_quat(Quat::from_array(rotation)).transform_vector3(Vec3::NEG_Z); - println!("position: {position}"); - println!("direction: {direction}"); - - // In Blender, our lights are sitting at (0, 0, 1) pointing at -Z, +Z, +X and - // +Y. But alas, it is a bit more complicated than that because this - // file is exported with UP being +Y, so Z and Y have been - // flipped... - assert_eq!(Vec3::Y, position); - let expected_direction = match node.name() { - Some("light_negative_z") => Vec3::NEG_Y, - Some("light_positive_z") => Vec3::Y, - Some("light_positive_x") => Vec3::X, - Some("light_positive_y") => Vec3::NEG_Z, - n => panic!("unexpected node '{n:?}'"), - }; - // And also there are rounding ... imprecisions... - assert_approx_eq::assert_approx_eq!(expected_direction.x, direction.x); - assert_approx_eq::assert_approx_eq!(expected_direction.y, direction.y); - assert_approx_eq::assert_approx_eq!(expected_direction.z, direction.z); - } - } -} diff --git a/crates/renderling/src/skybox/cpu.rs b/crates/renderling/src/skybox/cpu.rs index 126e2540..52079f89 100644 --- a/crates/renderling/src/skybox/cpu.rs +++ b/crates/renderling/src/skybox/cpu.rs @@ -8,7 +8,7 @@ use glam::{Mat4, UVec2, Vec3}; use crate::{ atlas::AtlasImage, camera::Camera, convolution::VertexPrefilterEnvironmentCubemapIds, - texture::Texture, + cubemap::EquirectangularImageToCubemapBlitter, texture::Texture, }; /// Render pipeline used to draw a skybox. @@ -151,6 +151,10 @@ pub(crate) fn create_skybox_render_pipeline( /// A clone of a skybox is a reference to the same skybox. /// /// Only available on the CPU. Not available in shaders. +// TODO: spilt Skybox into Skybox and IBL components. +// Skybox and IBL are different things. Sometimes you want to use a +// skybox without having it shade things. +// Also, the brdf_lut doesn't change, so should probably live in `Lighting` #[derive(Debug, Clone)] pub struct Skybox { // Cubemap texture of the environment cubemap @@ -191,7 +195,8 @@ impl Skybox { let runtime = runtime.as_ref(); log::trace!("creating skybox"); - let slab = SlabAllocator::new(runtime, wgpu::BufferUsages::VERTEX); + let slab = + SlabAllocator::new_with_label(runtime, wgpu::BufferUsages::VERTEX, Some("skybox-slab")); let proj = Mat4::perspective_rh(std::f32::consts::FRAC_PI_2, 1.0, 0.1, 10.0); let camera = slab.new_value(Camera::default().with_projection(proj)); @@ -201,10 +206,10 @@ impl Skybox { roughness: roughness.id(), }); - let buffer = slab.get_updated_buffer(); + let buffer = slab.commit(); let mut buffer_upkeep = || { - let maybe_resized_buffer = slab.upkeep(); - debug_assert!(maybe_resized_buffer.is_none()); + let possibly_new_buffer = slab.commit(); + debug_assert!(!possibly_new_buffer.is_new_this_commit()); }; let equirectangular_texture = Skybox::hdr_texture_from_atlas_image(runtime, hdr_img); @@ -329,10 +334,8 @@ impl Skybox { let device = &runtime.device; let queue = &runtime.queue; // Create the cubemap-making pipeline. - let pipeline = crate::cubemap::CubemapMakingRenderPipeline::new( - device, - wgpu::TextureFormat::Rgba16Float, - ); + let pipeline = + EquirectangularImageToCubemapBlitter::new(device, wgpu::TextureFormat::Rgba16Float); let resources = ( device, @@ -340,8 +343,12 @@ impl Skybox { Some("hdr environment map"), wgpu::BufferUsages::VERTEX, ); - let bindgroup = - crate::cubemap::cubemap_making_bindgroup(device, resources.2, buffer, hdr_texture); + let bindgroup = EquirectangularImageToCubemapBlitter::create_bindgroup( + device, + resources.2, + buffer, + hdr_texture, + ); Self::render_cubemap( runtime, diff --git a/crates/renderling/src/stage.rs b/crates/renderling/src/stage.rs index 91e741a7..0737fba2 100644 --- a/crates/renderling/src/stage.rs +++ b/crates/renderling/src/stage.rs @@ -8,7 +8,7 @@ use glam::UVec2; use glam::{Mat4, Vec2, Vec3, Vec4, Vec4Swizzles}; use spirv_std::{ image::{Cubemap, Image2d, Image2dArray}, - spirv, Sampler, + spirv, Image, Sampler, }; use crate::{ @@ -203,6 +203,8 @@ pub struct Renderlet { /// Bounding sphere of the entire renderlet, in local space. pub bounds: BoundingSphere, pub indices_array: Array, + // TODO: Move camera to PbrConfig or something higher up, + // because it doesn't change all that often. pub camera_id: Id, pub transform_id: Id, pub material_id: Id, @@ -231,6 +233,33 @@ impl Default for Renderlet { } impl Renderlet { + /// Returns the vertex at the given index and its related values. + /// + /// These values are often used in shaders, so they are grouped together. + pub fn get_vertex_info( + &self, + vertex_index: u32, + slab: &[u32], + ) -> (Vertex, Transform, Mat4, Vec3) { + let vertex = self.get_vertex(vertex_index, slab); + let transform = self.get_transform(vertex, slab); + let model_matrix = Mat4::from(transform); + let world_pos = model_matrix.transform_point3(vertex.position); + (vertex, transform, model_matrix, world_pos) + } + /// Retrieve the transform of this `Renderlet`. + /// + /// This takes into consideration all skinning matrices. + pub fn get_transform(&self, vertex: Vertex, slab: &[u32]) -> Transform { + let config = slab.read_unchecked(self.pbr_config_id); + if config.has_skinning && self.skin_id.is_some() { + let skin = slab.read(self.skin_id); + Transform::from(skin.get_skinning_matrix(vertex, slab)) + } else { + slab.read(self.transform_id) + } + } + /// Retrieve the vertex from the slab, calculating any displacement due to /// morph targets. pub fn get_vertex(&self, vertex_index: u32, slab: &[u32]) -> Vertex { @@ -261,6 +290,27 @@ impl Renderlet { } } +#[cfg(test)] +/// A helper struct that contains all outputs of the Renderlet's PBR vertex shader. +#[derive(Default, Debug, Clone, Copy, PartialEq)] +pub struct RenderletPbrVertexInfo { + pub renderlet: Renderlet, + pub renderlet_id: Id, + pub vertex_index: u32, + pub vertex: Vertex, + pub transform: Transform, + pub model_matrix: Mat4, + pub view_projection: Mat4, + pub out_color: Vec4, + pub out_uv0: Vec2, + pub out_uv1: Vec2, + pub out_norm: Vec3, + pub out_tangent: Vec3, + pub out_bitangent: Vec3, + pub out_pos: Vec3, + pub out_clip_pos: Vec4, +} + /// Renderlet vertex shader. #[spirv(vertex)] #[allow(clippy::too_many_arguments)] @@ -272,6 +322,7 @@ pub fn renderlet_vertex( #[spirv(storage_buffer, descriptor_set = 0, binding = 0)] slab: &[u32], #[spirv(flat)] out_renderlet: &mut Id, + // TODO: Think about placing all these out values in a G-Buffer out_color: &mut Vec4, out_uv0: &mut Vec2, out_uv1: &mut Vec2, @@ -280,6 +331,8 @@ pub fn renderlet_vertex( out_bitangent: &mut Vec3, out_world_pos: &mut Vec3, #[spirv(position)] out_clip_pos: &mut Vec4, + // test-only info struct + #[cfg(test)] out_info: &mut RenderletPbrVertexInfo, ) { let renderlet = slab.read_unchecked(renderlet_id); if !renderlet.visible { @@ -290,23 +343,16 @@ pub fn renderlet_vertex( *out_renderlet = renderlet_id; - let vertex = renderlet.get_vertex(vertex_index, slab); + let (vertex, transform, model_matrix, world_pos) = + renderlet.get_vertex_info(vertex_index, slab); *out_color = vertex.color; *out_uv0 = vertex.uv0; *out_uv1 = vertex.uv1; + *out_world_pos = world_pos; - let config = slab.read_unchecked(renderlet.pbr_config_id); - - let transform = if config.has_skinning && renderlet.skin_id.is_some() { - let skin = slab.read(renderlet.skin_id); - Transform::from(skin.get_skinning_matrix(vertex, slab)) - } else { - slab.read(renderlet.transform_id) - }; let scale2 = transform.scale * transform.scale; let normal = vertex.normal.alt_norm_or_zero(); let tangent = vertex.tangent.xyz().alt_norm_or_zero(); - let model_matrix = Mat4::from(transform); let normal_w: Vec3 = (model_matrix * (normal / scale2).extend(0.0)) .xyz() .alt_norm_or_zero(); @@ -320,11 +366,29 @@ pub fn renderlet_vertex( let bitangent_w = normal_w.cross(tangent_w) * if vertex.tangent.w >= 0.0 { 1.0 } else { -1.0 }; *out_bitangent = bitangent_w; - let world_pos = model_matrix.transform_point3(vertex.position); - *out_world_pos = world_pos; - let camera = slab.read(renderlet.camera_id); - *out_clip_pos = camera.view_projection() * world_pos.extend(1.0); + let clip_pos = camera.view_projection() * world_pos.extend(1.0); + *out_clip_pos = clip_pos; + #[cfg(test)] + { + *out_info = RenderletPbrVertexInfo { + renderlet_id, + vertex_index, + vertex, + transform, + model_matrix, + view_projection: camera.view_projection(), + out_clip_pos: clip_pos, + renderlet, + out_color: *out_color, + out_uv0: *out_uv0, + out_uv1: *out_uv1, + out_norm: *out_norm, + out_tangent: *out_tangent, + out_bitangent: *out_bitangent, + out_pos: *out_world_pos, + }; + } } /// Renderlet fragment shader @@ -342,7 +406,13 @@ 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(storage_buffer, descriptor_set = 2, binding = 0)] light_slab: &[u32], + #[spirv(descriptor_set = 2, binding = 1)] shadow_map: &Image!(2D, type=f32, sampled, arrayed), + #[spirv(descriptor_set = 2, binding = 2)] shadow_map_sampler: &Sampler, + #[spirv(flat)] renderlet_id: Id, in_color: Vec4, in_uv0: Vec2, @@ -362,7 +432,10 @@ pub fn renderlet_fragment( prefiltered_sampler, brdf, brdf_sampler, + shadow_map, + shadow_map_sampler, slab, + light_slab, renderlet_id, in_color, in_uv0, diff --git a/crates/renderling/src/stage/cpu.rs b/crates/renderling/src/stage/cpu.rs index b0ef9ac6..601cee0b 100644 --- a/crates/renderling/src/stage/cpu.rs +++ b/crates/renderling/src/stage/cpu.rs @@ -13,11 +13,13 @@ use std::{ use crate::{ atlas::{Atlas, AtlasError, AtlasImage, AtlasImageError, AtlasTexture}, + bindgroup::ManagedBindGroup, bloom::Bloom, camera::Camera, debug::DebugOverlay, draw::DrawCalls, - pbr::{debug::DebugChannel, light::Light, PbrConfig}, + light::Lighting, + pbr::{debug::DebugChannel, PbrConfig}, skybox::{Skybox, SkyboxRenderPipeline}, stage::Renderlet, texture::{DepthTexture, Texture}, @@ -64,65 +66,101 @@ fn create_msaa_textureview( .create_view(&wgpu::TextureViewDescriptor::default()) } -fn create_stage_render_pipeline( - device: &wgpu::Device, - multisample_count: u32, -) -> wgpu::RenderPipeline { - log::trace!("creating stage render pipeline"); - let label = Some("stage render"); - let vertex_linkage = crate::linkage::renderlet_vertex::linkage(device); - let fragment_linkage = crate::linkage::renderlet_fragment::linkage(device); - let stage_slab_buffers_layout = crate::linkage::slab_bindgroup_layout(device); - let atlas_and_skybox_layout = crate::linkage::atlas_and_skybox_bindgroup_layout(device); - let layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { - label, - bind_group_layouts: &[&stage_slab_buffers_layout, &atlas_and_skybox_layout], - push_constant_ranges: &[], - }); - - device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { - label, - layout: Some(&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, - strip_index_format: None, - front_face: wgpu::FrontFace::Ccw, - cull_mode: None, - unclipped_depth: false, - polygon_mode: wgpu::PolygonMode::Fill, - conservative: false, - }, - depth_stencil: Some(wgpu::DepthStencilState { - format: wgpu::TextureFormat::Depth32Float, - depth_write_enabled: true, - depth_compare: wgpu::CompareFunction::Less, - stencil: wgpu::StencilState::default(), - bias: wgpu::DepthBiasState::default(), - }), - multisample: wgpu::MultisampleState { - mask: !0, - alpha_to_coverage_enabled: false, - count: multisample_count, - }, - fragment: Some(wgpu::FragmentState { - module: &fragment_linkage.module, - entry_point: Some(fragment_linkage.entry_point), - targets: &[Some(wgpu::ColorTargetState { - format: wgpu::TextureFormat::Rgba16Float, - blend: Some(wgpu::BlendState::ALPHA_BLENDING), - write_mask: wgpu::ColorWrites::ALL, - })], - compilation_options: Default::default(), - }), - multiview: None, - cache: None, - }) +/// Performs a rendering of an entire scene, given the resources at hand. +pub struct StageRendering<'a> { + // TODO: include the rest of the needed paramaters from `stage`, and then remove `stage` + pub stage: &'a Stage, + pub pipeline: &'a wgpu::RenderPipeline, + pub color_attachment: wgpu::RenderPassColorAttachment<'a>, + pub depth_stencil_attachment: wgpu::RenderPassDepthStencilAttachment<'a>, +} + +impl StageRendering<'_> { + /// Run the stage rendering. + /// + /// Returns the queue submission index and the indirect draw buffer, if available. + pub fn run(self) -> (wgpu::SubmissionIndex, Option>) { + self.stage.tick_internal(); + self.stage.lighting.upkeep(); + + let mut draw_calls = self.stage.draw_calls.write().unwrap(); + let depth_texture = self.stage.depth_texture.read().unwrap(); + // UNWRAP: safe because we know the depth texture format will always match + let maybe_indirect_buffer = draw_calls.pre_draw(&depth_texture).unwrap(); + { + log::info!("rendering"); + let label = Some("stage render"); + + log::info!("getting slab buffers bindgroup"); + let slab_buffers_bindgroup = { + log::info!("getting write lock"); + let mut stage_slab_buffer = self.stage.stage_slab_buffer.write().unwrap(); + log::info!("got write lock"); + let should_invalidate_buffers_bindgroup = stage_slab_buffer.update_if_invalid(); + self.stage + .buffers_bindgroup + .get(should_invalidate_buffers_bindgroup, || { + log::info!("renewing invalid stage slab buffers bindgroup"); + crate::linkage::slab_bindgroup( + self.stage.device(), + &stage_slab_buffer, + // UNWRAP: POP + &self + .stage + .stage_pipeline + .read() + .unwrap() + .get_bind_group_layout(0), + ) + }) + }; + + log::info!("getting stage slab buffer"); + let stage_slab_buffer = self.stage.stage_slab_buffer.read().unwrap(); + let textures_bindgroup = self.stage.get_textures_bindgroup(); + log::info!("got stage slab buffer and shadow map depth texture"); + + let light_bindgroup = self.stage.lighting.get_bindgroup(); + let has_skybox = self.stage.has_skybox.load(Ordering::Relaxed); + let may_skybox_pipeline_and_bindgroup = if has_skybox { + Some( + self.stage + .get_skybox_pipeline_and_bindgroup(&stage_slab_buffer), + ) + } else { + None + }; + + let mut encoder = self + .stage + .device() + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label }); + { + let mut render_pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label, + color_attachments: &[Some(self.color_attachment)], + depth_stencil_attachment: Some(self.depth_stencil_attachment), + ..Default::default() + }); + + render_pass.set_pipeline(self.pipeline); + render_pass.set_bind_group(0, Some(slab_buffers_bindgroup.as_ref()), &[]); + render_pass.set_bind_group(1, Some(textures_bindgroup.as_ref()), &[]); + render_pass.set_bind_group(2, Some(&light_bindgroup), &[]); + 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.stage.skybox.read().unwrap(); + render_pass.set_pipeline(&pipeline.pipeline); + render_pass.set_bind_group(0, Some(bindgroup.as_ref()), &[]); + render_pass.draw(0..36, skybox.camera.inner()..skybox.camera.inner() + 1); + } + } + let sindex = self.stage.queue().submit(std::iter::once(encoder.finish())); + (sindex, maybe_indirect_buffer) + } + } } /// Represents an entire scene worth of rendering data. @@ -136,7 +174,6 @@ pub struct Stage { pub(crate) mngr: SlabAllocator, pub(crate) pbr_config: Hybrid, - pub(crate) lights: Arc>>>, pub(crate) stage_pipeline: Arc>, pub(crate) skybox_pipeline: Arc>>>, @@ -151,6 +188,7 @@ pub struct Stage { pub(crate) atlas: Atlas, pub(crate) bloom: Bloom, pub(crate) skybox: Arc>, + pub(crate) lighting: Lighting, pub(crate) tonemapping: Tonemapping, pub(crate) debug_overlay: DebugOverlay, pub(crate) background_color: Arc>, @@ -159,8 +197,10 @@ pub struct Stage { pub(crate) has_bloom: Arc, pub(crate) has_debug_overlay: Arc, + pub(crate) stage_slab_buffer: Arc>>, + pub(crate) skybox_bindgroup: Arc>>>, - pub(crate) buffers_bindgroup: Arc>>>, + pub(crate) buffers_bindgroup: ManagedBindGroup, pub(crate) textures_bindgroup: Arc>>>, pub(crate) draw_calls: Arc>, @@ -175,33 +215,98 @@ impl Deref for Stage { } impl Stage { + pub fn create_stage_render_pipeline( + device: &wgpu::Device, + fragment_color_format: wgpu::TextureFormat, + multisample_count: u32, + ) -> wgpu::RenderPipeline { + log::trace!("creating stage render pipeline"); + let label = Some("stage render"); + let vertex_linkage = crate::linkage::renderlet_vertex::linkage(device); + let fragment_linkage = crate::linkage::renderlet_fragment::linkage(device); + let stage_slab_buffers_layout = crate::linkage::slab_bindgroup_layout(device); + let atlas_and_skybox_layout = crate::linkage::atlas_and_skybox_bindgroup_layout(device); + let light_bindgroup_layout = crate::light::Lighting::create_bindgroup_layout(device); + let layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label, + bind_group_layouts: &[ + &stage_slab_buffers_layout, + &atlas_and_skybox_layout, + &light_bindgroup_layout, + ], + push_constant_ranges: &[], + }); + + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label, + layout: Some(&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, + strip_index_format: None, + front_face: wgpu::FrontFace::Ccw, + cull_mode: None, + unclipped_depth: false, + polygon_mode: wgpu::PolygonMode::Fill, + conservative: false, + }, + depth_stencil: Some(wgpu::DepthStencilState { + format: wgpu::TextureFormat::Depth32Float, + depth_write_enabled: true, + depth_compare: wgpu::CompareFunction::Less, + stencil: wgpu::StencilState::default(), + bias: wgpu::DepthBiasState::default(), + }), + multisample: wgpu::MultisampleState { + mask: !0, + alpha_to_coverage_enabled: false, + count: multisample_count, + }, + fragment: Some(wgpu::FragmentState { + module: &fragment_linkage.module, + entry_point: Some(fragment_linkage.entry_point), + targets: &[Some(wgpu::ColorTargetState { + format: fragment_color_format, + blend: Some(wgpu::BlendState::ALPHA_BLENDING), + write_mask: wgpu::ColorWrites::ALL, + })], + compilation_options: Default::default(), + }), + multiview: None, + cache: None, + }) + } + /// Create a new stage. pub fn new(ctx: &crate::Context) -> Self { - let runtime = ctx.as_ref(); + let runtime = ctx.runtime(); let device = &runtime.device; let resolution @ UVec2 { x: w, y: h } = ctx.get_size(); let atlas_size = *ctx.atlas_size.read().unwrap(); - let atlas = Atlas::new(ctx, atlas_size).unwrap(); - let mngr = SlabAllocator::new(runtime, wgpu::BufferUsages::empty()); + + let mngr = + SlabAllocator::new_with_label(runtime, wgpu::BufferUsages::empty(), Some("stage-slab")); let pbr_config = mngr.new_value(PbrConfig { atlas_size: UVec2::new(atlas_size.width, atlas_size.height), resolution, ..Default::default() }); + + let atlas = Atlas::new(&mngr, atlas_size, None, Some("stage-atlas"), None); let multisample_count = 1; - let lights = mngr.new_array(vec![Id::::NONE; 16]); let hdr_texture = Arc::new(RwLock::new(Texture::create_hdr_texture( device, w, h, multisample_count, ))); - let depth_texture = Arc::new(RwLock::new(Texture::create_depth_texture( - device, - w, - h, - multisample_count, - ))); + let depth_texture = + Texture::create_depth_texture(device, w, h, multisample_count, Some("stage-depth")); let msaa_render_target = Default::default(); // UNWRAP: safe because no other references at this point (created above^) let bloom = Bloom::new(ctx, &hdr_texture.read().unwrap()); @@ -210,16 +315,33 @@ impl Stage { ctx.get_render_target().format().add_srgb_suffix(), &bloom.get_mix_texture(), ); + let stage_pipeline = Self::create_stage_render_pipeline( + device, + wgpu::TextureFormat::Rgba16Float, + multisample_count, + ); + let stage_slab_buffer = mngr.commit(); + + let lighting = Lighting::new(&mngr); Self { + draw_calls: Arc::new(RwLock::new(DrawCalls::new( + ctx, + true, + &mngr.commit(), + &depth_texture, + ))), + lighting, + depth_texture: Arc::new(RwLock::new(depth_texture)), + buffers_bindgroup: ManagedBindGroup::from(crate::linkage::slab_bindgroup( + device, + &stage_slab_buffer, + &stage_pipeline.get_bind_group_layout(0), + )), + stage_slab_buffer: Arc::new(RwLock::new(stage_slab_buffer)), mngr, pbr_config, - lights: Arc::new(RwLock::new(lights)), - - stage_pipeline: Arc::new(RwLock::new(create_stage_render_pipeline( - device, - multisample_count, - ))), + stage_pipeline: Arc::new(RwLock::new(stage_pipeline)), atlas, skybox: Arc::new(RwLock::new(Skybox::empty(runtime))), skybox_bindgroup: Default::default(), @@ -228,18 +350,10 @@ impl Stage { bloom, tonemapping, has_bloom: AtomicBool::from(true).into(), - buffers_bindgroup: Default::default(), textures_bindgroup: Default::default(), - 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, msaa_sample_count: Arc::new(multisample_count.into()), clear_color_attachments: Arc::new(true.into()), @@ -279,12 +393,20 @@ impl Stage { log::debug!("setting multisample count to {multisample_count}"); // UNWRAP: POP - *self.stage_pipeline.write().unwrap() = - create_stage_render_pipeline(self.device(), multisample_count); + *self.stage_pipeline.write().unwrap() = Self::create_stage_render_pipeline( + self.device(), + wgpu::TextureFormat::Rgba16Float, + multisample_count, + ); let size = self.get_size(); // UNWRAP: POP - *self.depth_texture.write().unwrap() = - Texture::create_depth_texture(self.device(), size.x, size.y, multisample_count); + *self.depth_texture.write().unwrap() = Texture::create_depth_texture( + self.device(), + size.x, + size.y, + multisample_count, + Some("stage-depth"), + ); // UNWRAP: POP let format = self.hdr_texture.read().unwrap().texture.format(); *self.msaa_render_target.write().unwrap() = if multisample_count == 1 { @@ -415,17 +537,6 @@ impl Stage { self } - /// Set the lights to use for shading. - pub fn set_lights(&self, lights: impl IntoIterator>) { - log::trace!("setting lights"); - let lights = self.mngr.new_array(lights); - self.pbr_config.modify(|cfg| { - cfg.light_array = lights.array(); - }); - // UNWRAP: POP - *self.lights.write().unwrap() = lights; - } - pub fn get_size(&self) -> UVec2 { // UNWRAP: panic on purpose let hdr = self.hdr_texture.read().unwrap(); @@ -453,8 +564,13 @@ impl Stage { } // UNWRAP: panic on purpose - *self.depth_texture.write().unwrap() = - Texture::create_depth_texture(self.device(), size.x, size.y, sample_count); + *self.depth_texture.write().unwrap() = Texture::create_depth_texture( + self.device(), + size.x, + size.y, + sample_count, + Some("stage-depth"), + ); self.bloom.set_hdr_texture(self.runtime(), &hdr_texture); self.tonemapping .set_hdr_texture(self.device(), &hdr_texture); @@ -498,7 +614,7 @@ impl Stage { images: impl IntoIterator>, ) -> Result>, StageError> { let images = images.into_iter().map(|i| i.into()).collect::>(); - let frames = self.atlas.add_images(self, &images)?; + let frames = self.atlas.add_images(&images)?; // The textures bindgroup will have to be remade let _ = self.textures_bindgroup.lock().unwrap().take(); @@ -528,7 +644,7 @@ impl Stage { images: impl IntoIterator>, ) -> Result>, StageError> { let images = images.into_iter().map(|i| i.into()).collect::>(); - let frames = self.atlas.set_images(self, &images)?; + let frames = self.atlas.set_images(&images)?; // The textures bindgroup will have to be remade let _ = self.textures_bindgroup.lock().unwrap().take(); @@ -628,26 +744,6 @@ impl Stage { (pipeline, bindgroup) } - fn get_slab_buffers_bindgroup(&self, slab_buffer: &wgpu::Buffer) -> Arc { - // UNWRAP: safe because we're only ever called from the render thread. - let mut bindgroup = self.buffers_bindgroup.lock().unwrap(); - if let Some(bindgroup) = bindgroup.as_ref() { - bindgroup.clone() - } else { - let b = Arc::new({ - let device: &wgpu::Device = self.device(); - crate::linkage::slab_bindgroup( - device, - slab_buffer, - // UNWRAP: POP - &self.stage_pipeline.read().unwrap().get_bind_group_layout(0), - ) - }); - *bindgroup = Some(b.clone()); - b - } - } - fn get_textures_bindgroup(&self) -> Arc { // UNWRAP: safe because we're only ever called from the render thread. let mut bindgroup = self.textures_bindgroup.lock().unwrap(); @@ -707,10 +803,16 @@ impl Stage { } /// Iterator over all staged [`Renderlet`]s. - pub fn renderlets_iter(&self) -> impl Iterator { + /// + /// This iterator returns `Renderlets` wrapped in `WeakHybrid`, because they + /// are stored by weak references internally. + /// + /// You should have references of your own, but this is here as a convenience + /// method, and is used internally. + pub fn renderlets_iter(&self) -> impl Iterator> { // UNWRAP: panic on purpose let guard = self.draw_calls.read().unwrap(); - guard.renderlets_iter() + guard.renderlets_iter().collect::>().into_iter() } /// Returns a clone of the current depth texture. @@ -734,24 +836,15 @@ impl Stage { NestedTransform::new(&self.mngr) } - fn invalidate_compute_culling_bindgroup(&self) { - let mut guard = self.draw_calls.write().unwrap(); - guard.invalidate_external_slab_buffer(); - } - - fn tick_internal(&self) -> Arc { + fn tick_internal(&self) { self.draw_calls.write().unwrap().upkeep(); - if let Some(new_slab_buffer) = self.mngr.upkeep() { + let stage_slab_buffer = self.mngr.commit(); + if stage_slab_buffer.is_new_this_commit() { // invalidate our bindgroups, etc + // TODO: we shouldn't have to invalidate skybox and other bindgroups, + // they can do this in their own `run` functions let _ = self.skybox_bindgroup.lock().unwrap().take(); - let _ = self.buffers_bindgroup.lock().unwrap().take(); - self.invalidate_compute_culling_bindgroup(); - new_slab_buffer - } else { - // UNWRAP: safe because we called `SlabManager::upkeep` above^, which ensures - // the buffer exists - self.mngr.get_buffer().unwrap() } } @@ -761,30 +854,162 @@ impl Stage { /// slab. pub fn tick(&self) { self.atlas.upkeep(self.runtime()); - let _ = self.tick_internal(); + self.tick_internal(); + } + + pub fn lighting(&self) -> &Lighting { + &self.lighting } pub fn render(&self, view: &wgpu::TextureView) { - let slab_buffer = self.tick_internal(); + // UNWRAP: POP + let background_color = *self.background_color.read().unwrap(); + // UNWRAP: POP + let msaa_target = self.msaa_render_target.read().unwrap(); + let clear_colors = self.clear_color_attachments.load(Ordering::Relaxed); + let hdr_texture = self.hdr_texture.read().unwrap(); + + let mk_ops = |store| wgpu::Operations { + load: if clear_colors { + wgpu::LoadOp::Clear(background_color) + } else { + wgpu::LoadOp::Load + }, + store, + }; + let render_pass_color_attachment = if let Some(msaa_view) = msaa_target.as_ref() { + wgpu::RenderPassColorAttachment { + ops: mk_ops(wgpu::StoreOp::Discard), + view: msaa_view, + resolve_target: Some(&hdr_texture.view), + } + } else { + wgpu::RenderPassColorAttachment { + ops: mk_ops(wgpu::StoreOp::Store), + view: &hdr_texture.view, + resolve_target: None, + } + }; + + let depth_texture = self.depth_texture.read().unwrap(); + let clear_depth = self.clear_depth_attachments.load(Ordering::Relaxed); + let render_pass_depth_attachment = wgpu::RenderPassDepthStencilAttachment { + view: &depth_texture.view, + depth_ops: Some(wgpu::Operations { + load: if clear_depth { + wgpu::LoadOp::Clear(1.0) + } else { + wgpu::LoadOp::Load + }, + store: wgpu::StoreOp::Store, + }), + stencil_ops: None, + }; + let pipeline_guard = self.stage_pipeline.read().unwrap(); + let (_submission_index, maybe_indirect_buffer) = StageRendering { + pipeline: &pipeline_guard, + stage: self, + color_attachment: render_pass_color_attachment, + depth_stencil_attachment: render_pass_depth_attachment, + } + .run(); + + // then render bloom + if self.has_bloom.load(Ordering::Relaxed) { + self.bloom.bloom(self.device(), self.queue()); + } else { + // copy the input hdr texture to the bloom mix texture + let mut encoder = + self.device() + .create_command_encoder(&wgpu::CommandEncoderDescriptor { + label: Some("no bloom copy"), + }); + let bloom_mix_texture = self.bloom.get_mix_texture(); + encoder.copy_texture_to_texture( + wgpu::TexelCopyTextureInfo { + texture: &self.hdr_texture.read().unwrap().texture, + mip_level: 0, + origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, + aspect: wgpu::TextureAspect::All, + }, + wgpu::TexelCopyTextureInfo { + texture: &bloom_mix_texture.texture, + mip_level: 0, + origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, + aspect: wgpu::TextureAspect::All, + }, + wgpu::Extent3d { + width: bloom_mix_texture.width(), + height: bloom_mix_texture.height(), + depth_or_array_layers: 1, + }, + ); + self.queue().submit(std::iter::once(encoder.finish())); + } + + // then render tonemapping + self.tonemapping.render(self.device(), self.queue(), view); + + // then render the debug overlay + 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, + &self.stage_slab_buffer.read().unwrap(), + &indirect_draw_buffer, + ); + } + } + } + + pub fn render_old(&self, view: &wgpu::TextureView) { + self.tick_internal(); + self.lighting.upkeep(); + let mut draw_calls = self.draw_calls.write().unwrap(); 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 maybe_indirect_buffer = draw_calls.pre_draw(&depth_texture).unwrap(); { + log::info!("rendering"); let label = Some("stage render"); + + log::info!("getting slab buffers bindgroup"); + let slab_buffers_bindgroup = { + log::info!("getting write lock"); + let mut stage_slab_buffer = self.stage_slab_buffer.write().unwrap(); + log::info!("got write lock"); + let should_invalidate_buffers_bindgroup = stage_slab_buffer.update_if_invalid(); + self.buffers_bindgroup + .get(should_invalidate_buffers_bindgroup, || { + log::info!("renewing invalid stage slab buffers bindgroup"); + crate::linkage::slab_bindgroup( + self.device(), + &stage_slab_buffer, + // UNWRAP: POP + &self.stage_pipeline.read().unwrap().get_bind_group_layout(0), + ) + }) + }; + + log::info!("getting stage slab buffer"); + let stage_slab_buffer = self.stage_slab_buffer.read().unwrap(); + let textures_bindgroup = self.get_textures_bindgroup(); + log::info!("got stage slab buffer and shadow map depth texture"); + // UNWRAP: POP let background_color = *self.background_color.read().unwrap(); // UNWRAP: POP let pipeline = self.stage_pipeline.read().unwrap(); // UNWRAP: POP let msaa_target = self.msaa_render_target.read().unwrap(); - let slab_buffers_bindgroup = self.get_slab_buffers_bindgroup(&slab_buffer); - let textures_bindgroup = self.get_textures_bindgroup(); + + let light_bindgroup = self.lighting.get_bindgroup(); let has_skybox = self.has_skybox.load(Ordering::Relaxed); let may_skybox_pipeline_and_bindgroup = if has_skybox { - Some(self.get_skybox_pipeline_and_bindgroup(&slab_buffer)) + Some(self.get_skybox_pipeline_and_bindgroup(&stage_slab_buffer)) } else { None }; @@ -839,6 +1064,7 @@ impl Stage { render_pass.set_pipeline(&pipeline); render_pass.set_bind_group(0, Some(slab_buffers_bindgroup.as_ref()), &[]); render_pass.set_bind_group(1, Some(textures_bindgroup.as_ref()), &[]); + render_pass.set_bind_group(2, Some(&light_bindgroup), &[]); draw_calls.draw(&mut render_pass); if let Some((pipeline, bindgroup)) = may_skybox_pipeline_and_bindgroup.as_ref() { @@ -864,13 +1090,13 @@ impl Stage { }); let bloom_mix_texture = self.bloom.get_mix_texture(); encoder.copy_texture_to_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &self.hdr_texture.read().unwrap().texture, mip_level: 0, origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, aspect: wgpu::TextureAspect::All, }, - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &bloom_mix_texture.texture, mip_level: 0, origin: wgpu::Origin3d { x: 0, y: 0, z: 0 }, @@ -893,7 +1119,7 @@ impl Stage { self.device(), self.queue(), view, - &slab_buffer, + &self.stage_slab_buffer.read().unwrap(), &indirect_draw_buffer, ); } @@ -907,8 +1133,8 @@ impl Stage { /// /// Only available on CPU. #[derive(Clone)] -pub struct NestedTransform { - global_transform: Gpu, +pub struct NestedTransform { + global_transform: Ct::Container, local_transform: Arc>, children: Arc>>, parent: Arc>>, @@ -937,11 +1163,31 @@ impl core::fmt::Debug for NestedTransform { } } +impl NestedTransform { + pub fn from_hybrid(hybrid: &NestedTransform) -> Self { + Self { + global_transform: WeakHybrid::from_hybrid(&hybrid.global_transform), + local_transform: hybrid.local_transform.clone(), + children: hybrid.children.clone(), + parent: hybrid.parent.clone(), + } + } + + pub(crate) fn upgrade(&self) -> Option { + Some(NestedTransform { + global_transform: self.global_transform.upgrade()?, + local_transform: self.local_transform.clone(), + children: self.children.clone(), + parent: self.parent.clone(), + }) + } +} + impl NestedTransform { pub fn new(mngr: &SlabAllocator) -> Self { let nested = NestedTransform { local_transform: Arc::new(RwLock::new(Transform::default())), - global_transform: mngr.new_value(Transform::default()).into_gpu_only(), + global_transform: mngr.new_value(Transform::default()), children: Default::default(), parent: Default::default(), }; @@ -949,6 +1195,17 @@ impl NestedTransform { nested } + /// Moves the inner `Gpu` of the global transform to a different + /// slab. + /// + /// This is used by the GLTF parser to move light's node transforms to the + /// light slab after they are created, which keeping any geometry's node + /// transforms untouched. + pub(crate) fn move_gpu_to_slab(&mut self, slab: &SlabAllocator) { + self.global_transform = slab.new_value(Transform::default()); + self.mark_dirty(); + } + pub fn get_notifier_index(&self) -> usize { self.global_transform.notifier_index() } @@ -1025,11 +1282,12 @@ impl NestedTransform { #[cfg(test)] mod test { use craballoc::runtime::CpuRuntime; - use crabslab::{Array, Slab}; + use crabslab::{Array, Id, Slab}; use glam::{Mat4, Vec2, Vec3}; use crate::{ camera::Camera, + pbr::PbrConfig, stage::{cpu::SlabAllocator, NestedTransform, Renderlet, Vertex}, transform::Transform, Context, @@ -1170,4 +1428,17 @@ mod test { stage.add_renderlet(&r); assert_eq!(1, r.ref_count()); } + + #[test] + /// Tests that the PBR descriptor is written to slot 0 of the geometry buffer, + /// and that it contains what we think it contains. + fn stage_pbr_desc_sanity() { + let ctx = Context::headless(100, 100); + let stage = ctx.new_stage(); + stage.commit(); + + let slab = futures_lite::future::block_on(stage.read(..)).unwrap(); + let pbr_desc = slab.read_unchecked(Id::::new(0)); + pretty_assertions::assert_eq!(stage.pbr_config.get(), pbr_desc); + } } diff --git a/crates/renderling/src/stage/gltf_support.rs b/crates/renderling/src/stage/gltf_support.rs index bbfee254..d017a83f 100644 --- a/crates/renderling/src/stage/gltf_support.rs +++ b/crates/renderling/src/stage/gltf_support.rs @@ -10,10 +10,11 @@ use snafu::{OptionExt, ResultExt, Snafu}; use crate::{ atlas::{AtlasError, AtlasImage, AtlasTexture, TextureAddressMode, TextureModes}, camera::Camera, - pbr::{ - light::{DirectionalLight, Light, LightStyle, PointLight, SpotLight}, - Material, + light::{ + AnalyticalLightBundle, DirectionalLightDescriptor, LightStyle, PointLightDescriptor, + SpotLightDescriptor, }, + pbr::Material, stage::{MorphTarget, NestedTransform, Renderlet, Skin, Stage, Vertex}, transform::Transform, }; @@ -96,6 +97,17 @@ impl From for StageGltfError { } } +impl From for Transform { + fn from(transform: gltf::scene::Transform) -> Self { + let (translation, rotation, scale) = transform.decomposed(); + Transform { + translation: Vec3::from_array(translation), + rotation: Quat::from_array(rotation), + scale: Vec3::from_array(scale), + } + } +} + pub fn from_gltf_light_kind(kind: gltf::khr_lights_punctual::Kind) -> LightStyle { match kind { gltf::khr_lights_punctual::Kind::Directional => LightStyle::Directional, @@ -598,6 +610,8 @@ pub struct GltfCamera { impl GltfCamera { fn new(stage: &mut Stage, gltf_camera: gltf::Camera<'_>, transform: &NestedTransform) -> Self { + log::debug!("camera: {}", gltf_camera.name().unwrap_or("unknown")); + log::debug!(" transform: {:#?}", transform.get_global_transform()); let projection = match gltf_camera.projection() { gltf::camera::Projection::Orthographic(o) => glam::Mat4::orthographic_rh( -o.xmag(), @@ -638,20 +652,6 @@ impl GltfCamera { } } -#[derive(Clone, Debug)] -pub enum LightDetails { - Directional(Hybrid), - Point(Hybrid), - Spot(Hybrid), -} - -#[derive(Debug)] -pub struct GltfLight { - pub details: LightDetails, - pub node_transform: NestedTransform, - pub light: Hybrid, -} - /// A node in a GLTF document, ready to be 'drawn'. #[derive(Clone, Debug)] pub struct GltfNode { @@ -759,7 +759,7 @@ impl GltfSkin { } } -#[derive(Debug)] +/// A loaded GLTF document. pub struct GltfDocument { pub animations: Vec, pub cameras: Vec, @@ -767,7 +767,7 @@ pub struct GltfDocument { pub default_scene: Option, pub extensions: Option, pub textures: Vec>, - pub lights: Vec, + pub lights: Vec, pub meshes: Vec, pub nodes: Vec, pub materials: HybridArray, @@ -908,13 +908,7 @@ impl GltfDocument { nt.clone() } else { let transform = stage.new_nested_transform(); - let (translation, rotation, scale) = &node.transform().decomposed(); - let t = Transform { - translation: Vec3::from_array(*translation), - rotation: Quat::from_array(*rotation), - scale: Vec3::from_array(*scale), - }; - transform.set(t); + transform.set(node.transform().into()); for node in node.children() { let child_transform = transform_for_node(nesting_level + 1, stage, cache, &node); @@ -993,7 +987,7 @@ impl GltfDocument { index: camera_index, })?; let transform = node_transforms - .get(&camera_index) + .get(&node_index) .context(MissingNodeSnafu { index: node_index })?; cameras.push(GltfCamera::new(stage, camera, transform)); } @@ -1002,58 +996,71 @@ impl GltfDocument { let mut lights = vec![]; if let Some(gltf_lights) = document.lights() { for gltf_light in gltf_lights { + let node_index = *light_index_to_node_index.get(&gltf_light.index()).context( + MissingCameraSnafu { + index: gltf_light.index(), + }, + )?; + + let mut node_transform = node_transforms + .get(&node_index) + .context(MissingNodeSnafu { index: node_index })? + .clone(); + node_transform.move_gpu_to_slab(stage.lighting().slab()); + let color = Vec3::from(gltf_light.color()).extend(1.0); let intensity = gltf_light.intensity(); - let (mut light, details): (Light, _) = match gltf_light.kind() { + let light_bundle = match gltf_light.kind() { gltf::khr_lights_punctual::Kind::Directional => { - let light = stage.new_value(DirectionalLight { - direction: Vec3::NEG_Z, - color, - intensity, - }); - - (light.id().into(), LightDetails::Directional(light)) + stage.lighting().new_analytical_light( + DirectionalLightDescriptor { + direction: Vec3::NEG_Z, + color, + // TODO: Set a unit for lighting. + // We don't yet use a unit for our lighting, and we should. + // https://www.realtimerendering.com/blog/physical-units-for-lights/ + // + // NOTE: + // glTF spec [1] says directional light is in lux, whereas spot and point are + // in candelas. I haven't really set a unit, it's implicit in the shader, but it seems we + // can roughly get candelas from lux by dividing by 683 [2]. + // 1. https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual/README.md + // 2. https://depts.washington.edu/mictech/optics/me557/Radiometry.pdf + // 3. https://projects.blender.org/blender/blender-addons/commit/9d903a93f03b + intensity: intensity / 683.0, + }, + Some(node_transform), + ) } + gltf::khr_lights_punctual::Kind::Point => { - let light = stage.new_value(PointLight { - position: Vec3::ZERO, - color, - intensity, - }); - (light.id().into(), LightDetails::Point(light)) + stage.lighting().new_analytical_light( + PointLightDescriptor { + position: Vec3::ZERO, + color, + intensity: intensity / 683.0, + }, + Some(node_transform), + ) } + gltf::khr_lights_punctual::Kind::Spot { inner_cone_angle, outer_cone_angle, - } => { - let light = stage.new_value(SpotLight { + } => stage.lighting().new_analytical_light( + SpotLightDescriptor { position: Vec3::ZERO, direction: Vec3::NEG_Z, inner_cutoff: inner_cone_angle, outer_cutoff: outer_cone_angle, color, - intensity, - }); - (light.id().into(), LightDetails::Spot(light)) - } + intensity: intensity / (683.0 * 4.0 * std::f32::consts::PI), + }, + Some(node_transform), + ), }; - let node_index = *light_index_to_node_index.get(&gltf_light.index()).context( - MissingCameraSnafu { - index: gltf_light.index(), - }, - )?; - let node_transform = node_transforms - .get(&node_index) - .context(MissingNodeSnafu { index: node_index })? - .clone(); - light.transform = node_transform.global_transform_id(); - let light = stage.new_value(light); - lights.push(GltfLight { - details, - node_transform, - light, - }); + lights.push(light_bundle); } } @@ -1189,13 +1196,13 @@ impl Stage { mod test { use crate::{ camera::Camera, - pbr::{Material, PbrConfig}, + pbr::Material, stage::{Renderlet, Vertex}, transform::Transform, Context, }; - use crabslab::{Id, Slab}; - use glam::{Vec2, Vec3, Vec4, Vec4Swizzles}; + use crabslab::Id; + use glam::{Vec3, Vec4}; #[test] fn get_vertex_count_primitive_sanity() { @@ -1376,8 +1383,18 @@ mod test { r.camera_id = gltf_camera.camera.id(); }); }); - - stage.set_lights(doc.lights.iter().map(|gltf_light| gltf_light.light.id())); + // A change to the lighting units for directional lights causes this test to fail. + // + // Instead of changing the saved picture, we'll adjust the intensity. + // + // See for more info. + doc.lights.iter().for_each(|bundle| { + if let crate::light::LightDetails::Directional(d) = &bundle.light_details { + d.modify(|dir| { + dir.intensity *= 683.0; + }); + } + }); let frame = ctx.get_next_frame().unwrap(); stage.render(&frame.view()); @@ -1385,59 +1402,6 @@ mod test { img_diff::assert_img_eq("gltf/normal_mapping_brick_sphere.png", img); } - /// A helper struct that contains all outputs of the vertex shader. - #[allow(unused)] - #[derive(Clone, Debug, Default, PartialEq)] - pub struct GltfVertexInvocation { - pub instance_index: u32, - pub vertex_index: u32, - pub renderlet_id: Id, - pub renderlet: Renderlet, - pub out_camera: Id, - pub out_material: Id, - pub out_pbr_config: Id, - pub out_color: Vec4, - pub out_uv0: Vec2, - pub out_uv1: Vec2, - pub out_norm: Vec3, - pub out_tangent: Vec3, - pub out_bitangent: Vec3, - pub out_pos: Vec3, - // output clip coordinates - pub clip_pos: Vec4, - // output normalized device coordinates - pub ndc_pos: Vec3, - } - - impl GltfVertexInvocation { - #[allow(dead_code)] - pub fn invoke(instance_index: u32, vertex_index: u32, slab: &[u32]) -> Self { - let mut v = Self { - instance_index, - vertex_index, - ..Default::default() - }; - v.renderlet_id = Id::from(v.instance_index); - v.renderlet = slab.read(v.renderlet_id); - crate::stage::renderlet_vertex( - v.renderlet_id, - v.vertex_index, - slab, - &mut v.renderlet_id, - &mut v.out_color, - &mut v.out_uv0, - &mut v.out_uv1, - &mut v.out_norm, - &mut v.out_tangent, - &mut v.out_bitangent, - &mut v.out_pos, - &mut v.clip_pos, - ); - v.ndc_pos = v.clip_pos.xyz() / v.clip_pos.w; - v - } - } - #[test] fn rigged_fox() { let ctx = Context::headless(256, 256); @@ -1518,4 +1482,49 @@ mod test { // // skin.get_joint_matrix(, , ) // } } + + #[test] + fn camera_position_sanity() { + // Test that the camera has the expected translation, + // taking into account that the gltf files may have been + // saved with Y up, or with Z up + let ctx = Context::headless(100, 100); + let mut stage = ctx.new_stage(); + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_sanity_camera.gltf"), + Id::NONE, + ) + .unwrap(); + let camera_a = doc.cameras.first().unwrap(); + + let eq = |p: Vec3| p.distance(camera_a.get_camera().position()) <= 10e-6; + let either_y_up_or_z_up = eq(Vec3::new(14.699949, 4.958309, 12.676651)) + || eq(Vec3::new(14.699949, -12.676651, 4.958309)); + assert!(either_y_up_or_z_up); + + let doc = stage + .load_gltf_document_from_path( + crate::test::workspace_dir() + .join("gltf") + .join("shadow_mapping_sanity.gltf"), + Id::NONE, + ) + .unwrap(); + let camera_b = doc.cameras.first().unwrap(); + + let eq = |a: Vec3, b: Vec3| { + let c = Vec3::new(b.x, -b.z, b.y); + println!("a: {a}"); + println!("b: {b}"); + println!("c: {c}"); + a.distance(b) <= 10e-6 || c.distance(c) <= 10e-6 + }; + assert!(eq( + camera_a.get_camera().position(), + camera_b.get_camera().position() + )); + } } diff --git a/crates/renderling/src/texture.rs b/crates/renderling/src/texture.rs index 06a0d16a..c844abbe 100644 --- a/crates/renderling/src/texture.rs +++ b/crates/renderling/src/texture.rs @@ -1,5 +1,9 @@ //! Wrapper around [`wgpu::Texture`]. -use std::{ops::Deref, sync::Arc}; +use core::sync::atomic::AtomicUsize; +use std::{ + ops::Deref, + sync::{Arc, LazyLock}, +}; use craballoc::runtime::WgpuRuntime; use glam::UVec2; @@ -43,23 +47,45 @@ type Result = std::result::Result; pub fn wgpu_texture_format_channels_and_subpixel_bytes(format: wgpu::TextureFormat) -> (u32, u32) { match format { + wgpu::TextureFormat::Depth32Float => (1, 4), + wgpu::TextureFormat::R32Float => (1, 4), wgpu::TextureFormat::Rg16Float => (2, 2), + wgpu::TextureFormat::Rgba8Unorm => (4, 1), wgpu::TextureFormat::Rgba16Float => (4, 2), wgpu::TextureFormat::Rgba32Float => (4, 4), wgpu::TextureFormat::Rgba8UnormSrgb => (4, 1), + wgpu::TextureFormat::R8Unorm => (1, 1), _ => todo!("temporarily unsupported format '{format:?}'"), } } +static NEXT_TEXTURE_ID: LazyLock> = LazyLock::new(|| Arc::new(0.into())); + +pub(crate) fn get_next_texture_id() -> usize { + NEXT_TEXTURE_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed) +} + /// A texture living on the GPU. #[derive(Debug, Clone)] pub struct Texture { pub texture: Arc, pub view: Arc, pub sampler: Arc, + pub(crate) id: usize, } impl Texture { + /// Returns the id of this texture. + /// + /// The id is a monotonically increasing count of all textures created. + /// + /// This can be used to determine if a texture has been + /// replaced by another, which can be used, for example, to invalidate + /// a [`wgpu::BindGroup`]. + pub fn id(&self) -> usize { + self.id + } + pub fn width(&self) -> u32 { self.texture.width() } @@ -68,6 +94,10 @@ impl Texture { self.texture.height() } + pub fn size(&self) -> UVec2 { + UVec2::new(self.width(), self.height()) + } + /// Create a cubemap texture from 6 faces. pub fn new_cubemap_texture( runtime: impl AsRef, @@ -106,13 +136,13 @@ impl Texture { let index = i * mip_levels as usize + mip_level; let texture = &face_textures[index].texture; encoder.copy_texture_to_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture, mip_level: 0, origin: wgpu::Origin3d::ZERO, aspect: wgpu::TextureAspect::All, }, - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &cubemap_texture, mip_level: mip_level as u32, origin: wgpu::Origin3d { @@ -153,6 +183,7 @@ impl Texture { texture: cubemap_texture.into(), view: view.into(), sampler: sampler.into(), + id: get_next_texture_id(), } } @@ -195,14 +226,14 @@ impl Texture { if !data.is_empty() { queue.write_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &texture, mip_level: 0, origin: wgpu::Origin3d::ZERO, aspect: wgpu::TextureAspect::All, }, data, - wgpu::ImageDataLayout { + wgpu::TexelCopyBufferLayout { offset: 0, bytes_per_row: Some(color_channels * color_channel_bytes * width), rows_per_image: None, @@ -228,6 +259,7 @@ impl Texture { texture: Arc::new(texture), view: Arc::new(view), sampler: Arc::new(sampler), + id: get_next_texture_id(), } } @@ -331,14 +363,14 @@ impl Texture { }); queue.write_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &texture, mip_level: 0, origin: wgpu::Origin3d::ZERO, aspect: wgpu::TextureAspect::All, }, img.as_bytes(), - wgpu::ImageDataLayout { + wgpu::TexelCopyBufferLayout { offset: 0, bytes_per_row: Some(channels * dimensions.0), rows_per_image: Some(dimensions.1), @@ -393,14 +425,14 @@ impl Texture { }); runtime.queue.write_texture( - wgpu::ImageCopyTexture { + wgpu::TexelCopyTextureInfo { texture: &texture, mip_level: 0, origin: wgpu::Origin3d::ZERO, aspect: wgpu::TextureAspect::All, }, img.deref(), - wgpu::ImageDataLayout { + wgpu::TexelCopyBufferLayout { offset: 0, bytes_per_row: Some(P::CHANNEL_COUNT as u32 * dimensions.0), rows_per_image: Some(dimensions.1), @@ -442,6 +474,7 @@ impl Texture { texture, view, sampler, + id: get_next_texture_id(), } } @@ -452,6 +485,7 @@ impl Texture { width: u32, height: u32, multisample_count: u32, + label: Option<&str>, ) -> Self { let size = wgpu::Extent3d { width, @@ -459,7 +493,56 @@ impl Texture { depth_or_array_layers: 1, }; let desc = wgpu::TextureDescriptor { - label: Some("depth_texture"), + label, + size, + mip_level_count: 1, + sample_count: multisample_count, + dimension: wgpu::TextureDimension::D2, + format: Self::DEPTH_FORMAT, + usage: wgpu::TextureUsages::RENDER_ATTACHMENT + | wgpu::TextureUsages::TEXTURE_BINDING + | wgpu::TextureUsages::COPY_SRC, + view_formats: &[], + }; + let texture = device.create_texture(&desc); + + let view = texture.create_view(&wgpu::TextureViewDescriptor::default()); + let sampler = device.create_sampler(&wgpu::SamplerDescriptor { + address_mode_u: wgpu::AddressMode::ClampToEdge, + address_mode_v: wgpu::AddressMode::ClampToEdge, + address_mode_w: wgpu::AddressMode::ClampToEdge, + mag_filter: wgpu::FilterMode::Linear, + min_filter: wgpu::FilterMode::Linear, + mipmap_filter: wgpu::FilterMode::Nearest, + compare: Some(wgpu::CompareFunction::LessEqual), + lod_min_clamp: 0.0, + lod_max_clamp: 100.0, + ..Default::default() + }); + + Self { + texture: Arc::new(texture), + view: Arc::new(view), + sampler: Arc::new(sampler), + id: get_next_texture_id(), + } + } + + pub fn create_depth_texture_for_shadow_map( + device: &wgpu::Device, + width: u32, + height: u32, + multisample_count: u32, + label: Option<&str>, + is_point_light: bool, + ) -> Self { + let size = wgpu::Extent3d { + width, + height, + depth_or_array_layers: if is_point_light { 6 } else { 1 }, + }; + let desc = wgpu::TextureDescriptor { + label, size, mip_level_count: 1, sample_count: multisample_count, @@ -490,6 +573,7 @@ impl Texture { texture: Arc::new(texture), view: Arc::new(view), sampler: Arc::new(sampler), + id: get_next_texture_id(), } } @@ -558,9 +642,9 @@ impl Texture { // Copy the data from the surface texture to the buffer encoder.copy_texture_to_buffer( source, - wgpu::ImageCopyBuffer { + wgpu::TexelCopyBufferInfo { buffer: &buffer, - layout: wgpu::ImageDataLayout { + layout: wgpu::TexelCopyBufferLayout { offset: 0, bytes_per_row: Some(dimensions.padded_bytes_per_row as u32), rows_per_image: None, @@ -670,6 +754,7 @@ impl Texture { texture, view, sampler, + id: get_next_texture_id(), } } } @@ -716,6 +801,20 @@ impl DepthTexture { } } + pub fn try_new_from( + runtime: impl AsRef, + value: Texture, + ) -> Result { + if value.texture.format() != wgpu::TextureFormat::Depth32Float { + return UnsupportedFormatSnafu.fail(); + } + + Ok(Self { + runtime: runtime.as_ref().clone(), + texture: value.texture, + }) + } + /// Converts the depth texture into an image. /// /// Assumes the format is single channel 32bit. @@ -828,16 +927,25 @@ impl CopiedTextureBuffer { } /// Convert the post render buffer into an image. - pub fn into_image

(self, device: &wgpu::Device) -> Result + /// + /// `Sp` is the sub-pixel type. eg, `u8` or `f32` + /// + /// `P` is the pixel type. eg, `Rgba` or `Luma` + pub fn into_image( + self, + device: &wgpu::Device, + ) -> Result where - P: image::Pixel, - image::DynamicImage: From>>, + Sp: bytemuck::AnyBitPattern, + P: image::Pixel, + image::DynamicImage: From>>, { let pixels = self.pixels(device); - let img_buffer: image::ImageBuffer> = image::ImageBuffer::from_raw( + let coerced_pixels: &[Sp] = bytemuck::cast_slice(&pixels); + let img_buffer: image::ImageBuffer> = image::ImageBuffer::from_raw( self.dimensions.width as u32, self.dimensions.height as u32, - pixels, + coerced_pixels.to_vec(), ) .context(CouldNotConvertImageBufferSnafu)?; Ok(image::DynamicImage::from(img_buffer)) @@ -860,6 +968,8 @@ impl CopiedTextureBuffer { /// /// Ensures that the pixels are in the given color space by applying the /// correct transfer function if needed. + /// + /// Assumes the texture is in `Rgba8` format. pub fn into_rgba( self, device: &wgpu::Device, @@ -868,7 +978,7 @@ impl CopiedTextureBuffer { linear: bool, ) -> Result { let format = self.format; - let mut img_buffer = self.into_image::>(device)?.into_rgba8(); + let mut img_buffer = self.into_image::>(device)?.into_rgba8(); let linear_xfer = format.is_srgb() && linear; let opto_xfer = !format.is_srgb() && !linear; let should_xfer = linear_xfer || opto_xfer; @@ -903,7 +1013,7 @@ impl CopiedTextureBuffer { /// linear transfer if the texture this buffer was copied from was sRGB. pub fn into_linear_rgba(self, device: &wgpu::Device) -> Result { let format = self.format; - let mut img_buffer = self.into_image::>(device)?.into_rgba8(); + let mut img_buffer = self.into_image::>(device)?.into_rgba8(); if format.is_srgb() { log::trace!( "converting by applying linear transfer fn to srgb pixels (sRGB -> linear)" @@ -926,7 +1036,7 @@ impl CopiedTextureBuffer { /// linear transfer if the texture this buffer was copied from was sRGB. pub fn into_srgba(self, device: &wgpu::Device) -> Result { let format = self.format; - let mut img_buffer = self.into_image::>(device)?.into_rgba8(); + let mut img_buffer = self.into_image::>(device)?.into_rgba8(); if !format.is_srgb() { log::trace!( "converting by applying opto transfer fn to linear pixels (linear -> sRGB)" diff --git a/crates/renderling/src/tonemapping/cpu.rs b/crates/renderling/src/tonemapping/cpu.rs index 22bc044f..18e0f7fd 100644 --- a/crates/renderling/src/tonemapping/cpu.rs +++ b/crates/renderling/src/tonemapping/cpu.rs @@ -100,11 +100,15 @@ impl Tonemapping { frame_texture_format: wgpu::TextureFormat, hdr_texture: &Texture, ) -> Self { - let slab = SlabAllocator::new(runtime, wgpu::BufferUsages::empty()); + let slab = SlabAllocator::new_with_label( + runtime, + wgpu::BufferUsages::empty(), + Some("tonemapping-slab"), + ); let config = slab.new_value(TonemapConstants::default()); let label = Some("tonemapping"); - let slab_buffer = slab.get_updated_buffer(); + let slab_buffer = slab.commit(); let bindgroup = Arc::new(RwLock::new(create_bindgroup( &runtime.device, label, @@ -185,7 +189,7 @@ impl Tonemapping { pub fn render(&self, device: &wgpu::Device, queue: &wgpu::Queue, view: &wgpu::TextureView) { let label = Some("tonemapping render"); - assert!(self.slab.upkeep().is_none()); + assert!(!self.slab.commit().is_new_this_commit()); // UNWRAP: not safe but we want to panic let bindgroup = self.bindgroup.read().unwrap(); diff --git a/crates/renderling/src/tutorial.rs b/crates/renderling/src/tutorial.rs index c7bd2a8e..7d5e0791 100644 --- a/crates/renderling/src/tutorial.rs +++ b/crates/renderling/src/tutorial.rs @@ -107,7 +107,10 @@ pub fn tutorial_slabbed_renderlet( #[cfg(test)] mod test { - use craballoc::prelude::{SlabAllocator, WgpuRuntime}; + use craballoc::{ + prelude::{SlabAllocator, WgpuRuntime}, + slab::SlabBuffer, + }; use crate::{ camera::Camera, @@ -123,7 +126,7 @@ mod test { let ctx = Context::headless(100, 100); let WgpuRuntime { device, queue } = ctx.as_ref(); let label = Some("implicit isosceles triangle"); - let depth = Texture::create_depth_texture(device, 100, 100, 1); + let depth = Texture::create_depth_texture(device, 100, 100, 1, None); let vertex = crate::linkage::tutorial_implicit_isosceles_vertex::linkage(device); let fragment = crate::linkage::tutorial_passthru_fragment::linkage(device); let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { @@ -211,7 +214,11 @@ mod test { let WgpuRuntime { device, queue } = ctx.as_ref(); // Create our geometry on the slab. - let slab = SlabAllocator::new(&ctx, wgpu::BufferUsages::empty()); + let slab = SlabAllocator::new_with_label( + &ctx, + wgpu::BufferUsages::empty(), + Some("isosceles-triangle-no-instance"), + ); let initial_vertices = [ Vertex { position: Vec3::new(0.5, -0.5, 0.0), @@ -299,7 +306,7 @@ mod test { cache: None, }); - let slab_buffer = slab.get_updated_buffer(); + let slab_buffer: SlabBuffer = slab.commit(); let bindgroup = device.create_bind_group(&wgpu::BindGroupDescriptor { label, layout: &bindgroup_layout, @@ -309,7 +316,7 @@ mod test { }], }); - let depth = Texture::create_depth_texture(device, 100, 100, 1); + let depth = Texture::create_depth_texture(device, 100, 100, 1, None); let frame = ctx.get_next_frame().unwrap(); let view = frame.view(); @@ -369,7 +376,11 @@ mod test { let WgpuRuntime { device, queue } = ctx.as_ref(); // Create our geometry on the slab. - let slab = SlabAllocator::new(&ctx, wgpu::BufferUsages::empty()); + let slab: SlabAllocator = SlabAllocator::new_with_label( + &ctx, + wgpu::BufferUsages::empty(), + Some("slabbed-isosceles-triangle"), + ); let geometry = vec![ Vertex { position: Vec3::new(0.5, -0.5, 0.0), @@ -471,7 +482,7 @@ mod test { cache: None, }); - let slab_buffer = slab.get_updated_buffer(); + let slab_buffer: SlabBuffer = slab.commit(); let bindgroup = device.create_bind_group(&wgpu::BindGroupDescriptor { label, layout: &bindgroup_layout, @@ -481,7 +492,7 @@ mod test { }], }); - let depth = Texture::create_depth_texture(device, 100, 100, 1); + let depth = Texture::create_depth_texture(device, 100, 100, 1, None); let frame = ctx.get_next_frame().unwrap(); let view = frame.view(); @@ -528,7 +539,11 @@ mod test { // Create our geometry on the slab. // Don't worry too much about capacity, it can grow. - let slab = SlabAllocator::new(&ctx, wgpu::BufferUsages::empty()); + let slab: SlabAllocator = SlabAllocator::new_with_label( + &ctx, + wgpu::BufferUsages::empty(), + Some("slabbed-renderlet"), + ); let geometry = slab.new_array([ Vertex { position: Vec3::new(0.5, -0.5, 0.0), @@ -642,7 +657,7 @@ mod test { cache: None, }); - let slab_buffer = slab.get_updated_buffer(); + let slab_buffer: SlabBuffer = slab.commit(); let bindgroup = device.create_bind_group(&wgpu::BindGroupDescriptor { label, layout: &bindgroup_layout, @@ -652,7 +667,7 @@ mod test { }], }); - let depth = Texture::create_depth_texture(device, 100, 100, 1); + let depth = Texture::create_depth_texture(device, 100, 100, 1, None); let frame = ctx.get_next_frame().unwrap(); let view = frame.view(); diff --git a/crates/xtask/src/main.rs b/crates/xtask/src/main.rs index 7735b020..c55a387b 100644 --- a/crates/xtask/src/main.rs +++ b/crates/xtask/src/main.rs @@ -25,18 +25,18 @@ fn main() { Command::CompileShaders => { let paths = renderling_build::RenderlingPaths::new().unwrap(); - log::info!( - "Calling `cargo gpu toml {}", - paths.renderling_crate.display() - ); + log::info!("Calling `cargo gpu {}", paths.renderling_crate.display()); - std::process::Command::new("cargo") - .args(["gpu", "toml"]) + let output = std::process::Command::new("cargo") + .args(["gpu", "build", "--shader-crate"]) .arg(&paths.renderling_crate) .stdout(std::process::Stdio::inherit()) .stderr(std::process::Stdio::inherit()) .output() .unwrap(); + if !output.status.success() { + panic!("Building shaders failed :("); + } } Command::GenerateLinkage => { log::info!("Generating linkage for shaders"); diff --git a/gltf/shadow_mapping_only_cuboid.bin b/gltf/shadow_mapping_only_cuboid.bin new file mode 100644 index 00000000..807653c0 Binary files /dev/null and b/gltf/shadow_mapping_only_cuboid.bin differ diff --git a/gltf/shadow_mapping_only_cuboid.gltf b/gltf/shadow_mapping_only_cuboid.gltf new file mode 100644 index 00000000..213ef92e --- /dev/null +++ b/gltf/shadow_mapping_only_cuboid.gltf @@ -0,0 +1,281 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.3.47", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_lights_punctual" + ], + "extensionsRequired":[ + "KHR_lights_punctual" + ], + "extensions":{ + "KHR_lights_punctual":{ + "lights":[ + { + "color":[ + 1, + 1, + 1 + ], + "intensity":6830, + "type":"directional", + "name":"Light" + } + ] + } + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0, + 1, + 2, + 3 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube", + "translation":[ + 0, + 0.8984647393226624, + 0 + ] + }, + { + "extensions":{ + "KHR_lights_punctual":{ + "light":0 + } + }, + "name":"Light", + "rotation":[ + 0.09542951732873917, + 0.8279411792755127, + 0.3013063669204712, + 0.4632721543312073 + ], + "translation":[ + 4.076245307922363, + 5.903861999511719, + -1.0054539442062378 + ] + }, + { + "camera":0, + "name":"Camera", + "rotation":[ + -0.03457474336028099, + 0.4687580168247223, + 0.004934974014759064, + 0.8826359510421753 + ], + "translation":[ + 14.699949264526367, + 4.958309173583984, + 12.676651000976562 + ] + }, + { + "mesh":1, + "name":"Plane" + } + ], + "cameras":[ + { + "name":"Camera", + "perspective":{ + "aspectRatio":1.7777777777777777, + "yfov":0.39959648408210363, + "zfar":100, + "znear":0.10000000149011612 + }, + "type":"perspective" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.8004003763198853, + 0.013363108038902283, + 0.020213128998875618, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "doubleSided":true, + "name":"Material.001", + "pbrMetallicRoughness":{ + "metallicFactor":0, + "roughnessFactor":0.8815789222717285 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + }, + { + "name":"Plane", + "primitives":[ + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 3.7387936115264893, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":24, + "max":[ + 23.336652755737305, + 0, + 23.336652755737305 + ], + "min":[ + -23.336652755737305, + -0.2270890176296234, + -23.336652755737305 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":840, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1416, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":1608, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":1680, + "uri":"shadow_mapping_only_cuboid.bin" + } + ] +} diff --git a/gltf/shadow_mapping_only_cuboid_red_and_blue.bin b/gltf/shadow_mapping_only_cuboid_red_and_blue.bin new file mode 100644 index 00000000..807653c0 Binary files /dev/null and b/gltf/shadow_mapping_only_cuboid_red_and_blue.bin differ diff --git a/gltf/shadow_mapping_only_cuboid_red_and_blue.gltf b/gltf/shadow_mapping_only_cuboid_red_and_blue.gltf new file mode 100644 index 00000000..0ae80178 --- /dev/null +++ b/gltf/shadow_mapping_only_cuboid_red_and_blue.gltf @@ -0,0 +1,311 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.3.47", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_lights_punctual" + ], + "extensionsRequired":[ + "KHR_lights_punctual" + ], + "extensions":{ + "KHR_lights_punctual":{ + "lights":[ + { + "color":[ + 1, + 0, + 0.006205391138792038 + ], + "intensity":3415, + "type":"directional", + "name":"Light" + }, + { + "color":[ + 0.007022588513791561, + 0.0040604667738080025, + 1 + ], + "intensity":3415, + "type":"directional", + "name":"Sun" + } + ] + } + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0, + 1, + 2, + 3, + 4 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube", + "translation":[ + 0, + 0.8984647393226624, + 0 + ] + }, + { + "extensions":{ + "KHR_lights_punctual":{ + "light":0 + } + }, + "name":"Light", + "rotation":[ + 0.09542951732873917, + 0.8279411792755127, + 0.3013063669204712, + 0.4632721543312073 + ], + "translation":[ + 6.54069709777832, + 5.903861999511719, + -0.4569058418273926 + ] + }, + { + "camera":0, + "name":"Camera", + "rotation":[ + -0.03457474336028099, + 0.4687580168247223, + 0.004934974014759064, + 0.8826359510421753 + ], + "translation":[ + 14.699949264526367, + 4.958309173583984, + 12.676651000976562 + ] + }, + { + "mesh":1, + "name":"Plane" + }, + { + "extensions":{ + "KHR_lights_punctual":{ + "light":1 + } + }, + "name":"Sun", + "rotation":[ + -0.24051783978939056, + 0.49573880434036255, + 0.08695897459983826, + 0.8299592733383179 + ], + "translation":[ + 10.709425926208496, + 5.903861999511719, + 7.419057846069336 + ] + } + ], + "cameras":[ + { + "name":"Camera", + "perspective":{ + "aspectRatio":1.7777777777777777, + "yfov":0.39959648408210363, + "zfar":100, + "znear":0.10000000149011612 + }, + "type":"perspective" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.8004003763198853, + 0.013363108038902283, + 0.020213128998875618, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "doubleSided":true, + "name":"Material.001", + "pbrMetallicRoughness":{ + "metallicFactor":0, + "roughnessFactor":0.8815789222717285 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + }, + { + "name":"Plane", + "primitives":[ + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 3.7387936115264893, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":24, + "max":[ + 23.336652755737305, + 0, + 23.336652755737305 + ], + "min":[ + -23.336652755737305, + -0.2270890176296234, + -23.336652755737305 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":840, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1416, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":1608, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":1680, + "uri":"shadow_mapping_only_cuboid_red_and_blue.bin" + } + ] +} diff --git a/gltf/shadow_mapping_point.glb b/gltf/shadow_mapping_point.glb new file mode 100644 index 00000000..9008568f Binary files /dev/null and b/gltf/shadow_mapping_point.glb differ diff --git a/gltf/shadow_mapping_points.glb b/gltf/shadow_mapping_points.glb new file mode 100644 index 00000000..6d309c7f Binary files /dev/null and b/gltf/shadow_mapping_points.glb differ diff --git a/gltf/shadow_mapping_sanity.bin b/gltf/shadow_mapping_sanity.bin new file mode 100644 index 00000000..292c849c Binary files /dev/null and b/gltf/shadow_mapping_sanity.bin differ diff --git a/gltf/shadow_mapping_sanity.glb b/gltf/shadow_mapping_sanity.glb new file mode 100644 index 00000000..eed1086f Binary files /dev/null and b/gltf/shadow_mapping_sanity.glb differ diff --git a/gltf/shadow_mapping_sanity.gltf b/gltf/shadow_mapping_sanity.gltf new file mode 100644 index 00000000..2c888fc8 --- /dev/null +++ b/gltf/shadow_mapping_sanity.gltf @@ -0,0 +1,670 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.3.47", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_materials_emissive_strength", + "KHR_lights_punctual" + ], + "extensionsRequired":[ + "KHR_lights_punctual" + ], + "extensions":{ + "KHR_lights_punctual":{ + "lights":[ + { + "color":[ + 1, + 1, + 1 + ], + "intensity":6830, + "type":"directional", + "name":"Light" + } + ] + } + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube", + "translation":[ + 0, + 0, + 0.8984647393226624 + ] + }, + { + "extensions":{ + "KHR_lights_punctual":{ + "light":0 + } + }, + "name":"Light", + "rotation":[ + 0.39506182074546814, + 0.3723870813846588, + 0.7984986901283264, + 0.26010406017303467 + ], + "translation":[ + 4.076245307922363, + 1.0054539442062378, + 5.903861999511719 + ] + }, + { + "camera":0, + "name":"Camera", + "rotation":[ + 0.599669873714447, + 0.327972412109375, + 0.3349515199661255, + 0.6485658884048462 + ], + "translation":[ + 14.699949264526367, + -12.676651000976562, + 4.958309173583984 + ] + }, + { + "mesh":1, + "name":"Plane" + }, + { + "mesh":2, + "name":"Sphere", + "translation":[ + 2.62099552154541, + 0.7535718679428101, + 1.7896754741668701 + ] + }, + { + "mesh":3, + "name":"Sphere.001", + "translation":[ + -3.5589241981506348, + -1.1574621200561523, + 1.4128384590148926 + ] + }, + { + "mesh":4, + "name":"Cylinder", + "rotation":[ + -0.14098228514194489, + 0.5328636765480042, + 0.2134113311767578, + 0.8066200613975525 + ], + "scale":[ + 0.2753068208694458, + 0.2753068506717682, + 0.2753068208694458 + ], + "translation":[ + 4.076245307922363, + 1.0054539442062378, + 5.903861999511719 + ] + }, + { + "mesh":5, + "name":"Cylinder.001", + "rotation":[ + -0.14098228514194489, + 0.5328636765480042, + 0.2134113311767578, + 0.8066200613975525 + ], + "scale":[ + 0.2753068208694458, + 0.2753068506717682, + 0.2753068208694458 + ], + "translation":[ + -6.663036346435547, + -4.068678855895996, + 0.5199804306030273 + ] + } + ], + "cameras":[ + { + "name":"Camera", + "perspective":{ + "aspectRatio":1.7777777777777777, + "yfov":0.39959648408210363, + "zfar":100, + "znear":0.10000000149011612 + }, + "type":"perspective" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.8004003763198853, + 0.013363108038902283, + 0.020213128998875618, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "doubleSided":true, + "name":"Material.001", + "pbrMetallicRoughness":{ + "metallicFactor":0, + "roughnessFactor":0.8815789222717285 + } + }, + { + "doubleSided":true, + "name":"SphereMaterial", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.14135831594467163, + 0.19362950325012207, + 0.8004969358444214, + 1 + ], + "metallicFactor":0.6710526347160339, + "roughnessFactor":0.21052631735801697 + } + }, + { + "doubleSided":true, + "name":"Material.002", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.13696487247943878, + 0.8001965880393982, + 0.11292669177055359, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "doubleSided":true, + "emissiveFactor":[ + 0, + 0.31788796186447144, + 1 + ], + "extensions":{ + "KHR_materials_emissive_strength":{ + "emissiveStrength":10 + } + }, + "name":"LightCone", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0, + 0, + 0, + 1 + ] + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + }, + { + "name":"Plane", + "primitives":[ + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + }, + { + "name":"Sphere", + "primitives":[ + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + }, + { + "name":"Sphere.001", + "primitives":[ + { + "attributes":{ + "POSITION":12, + "NORMAL":13, + "TEXCOORD_0":14 + }, + "indices":15, + "material":3 + } + ] + }, + { + "name":"Cylinder", + "primitives":[ + { + "attributes":{ + "POSITION":16, + "NORMAL":17, + "TEXCOORD_0":18 + }, + "indices":19, + "material":4 + } + ] + }, + { + "name":"Cylinder.001", + "primitives":[ + { + "attributes":{ + "POSITION":20, + "NORMAL":21, + "TEXCOORD_0":22 + }, + "indices":19, + "material":4 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 1, + 3.7387936115264893 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":24, + "max":[ + 23.336652755737305, + 23.336652755737305, + 0 + ], + "min":[ + -23.336652755737305, + -23.336652755737305, + -0.2270890176296234 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":1984, + "max":[ + 0.9999997019767761, + 1, + 1 + ], + "min":[ + -0.9999990463256836, + -0.9999993443489075, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":1984, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":1984, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":2880, + "type":"SCALAR" + }, + { + "bufferView":12, + "componentType":5126, + "count":1984, + "max":[ + 0.9999997019767761, + 1, + -0.09411358833312988 + ], + "min":[ + -0.9999990463256836, + -0.9999993443489075, + -2.09411358833313 + ], + "type":"VEC3" + }, + { + "bufferView":13, + "componentType":5126, + "count":1984, + "type":"VEC3" + }, + { + "bufferView":14, + "componentType":5126, + "count":1984, + "type":"VEC2" + }, + { + "bufferView":15, + "componentType":5123, + "count":2880, + "type":"SCALAR" + }, + { + "bufferView":16, + "componentType":5126, + "count":192, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":17, + "componentType":5126, + "count":192, + "type":"VEC3" + }, + { + "bufferView":18, + "componentType":5126, + "count":192, + "type":"VEC2" + }, + { + "bufferView":19, + "componentType":5123, + "count":372, + "type":"SCALAR" + }, + { + "bufferView":20, + "componentType":5126, + "count":192, + "max":[ + 1, + 1, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":21, + "componentType":5126, + "count":192, + "type":"VEC3" + }, + { + "bufferView":22, + "componentType":5126, + "count":192, + "type":"VEC2" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":840, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":1128, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":1416, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":1608, + "target":34963 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":1680, + "target":34962 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":25488, + "target":34962 + }, + { + "buffer":0, + "byteLength":15872, + "byteOffset":49296, + "target":34962 + }, + { + "buffer":0, + "byteLength":5760, + "byteOffset":65168, + "target":34963 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":70928, + "target":34962 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":94736, + "target":34962 + }, + { + "buffer":0, + "byteLength":15872, + "byteOffset":118544, + "target":34962 + }, + { + "buffer":0, + "byteLength":5760, + "byteOffset":134416, + "target":34963 + }, + { + "buffer":0, + "byteLength":2304, + "byteOffset":140176, + "target":34962 + }, + { + "buffer":0, + "byteLength":2304, + "byteOffset":142480, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":144784, + "target":34962 + }, + { + "buffer":0, + "byteLength":744, + "byteOffset":146320, + "target":34963 + }, + { + "buffer":0, + "byteLength":2304, + "byteOffset":147064, + "target":34962 + }, + { + "buffer":0, + "byteLength":2304, + "byteOffset":149368, + "target":34962 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":151672, + "target":34962 + } + ], + "buffers":[ + { + "byteLength":153208, + "uri":"shadow_mapping_sanity.bin" + } + ] +} diff --git a/gltf/shadow_mapping_sanity_camera.bin b/gltf/shadow_mapping_sanity_camera.bin new file mode 100644 index 00000000..e8bc98e3 Binary files /dev/null and b/gltf/shadow_mapping_sanity_camera.bin differ diff --git a/gltf/shadow_mapping_sanity_camera.gltf b/gltf/shadow_mapping_sanity_camera.gltf new file mode 100644 index 00000000..8baf2207 --- /dev/null +++ b/gltf/shadow_mapping_sanity_camera.gltf @@ -0,0 +1,383 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v4.3.47", + "version":"2.0" + }, + "extensionsUsed":[ + "KHR_lights_punctual" + ], + "extensionsRequired":[ + "KHR_lights_punctual" + ], + "extensions":{ + "KHR_lights_punctual":{ + "lights":[ + { + "color":[ + 1, + 1, + 1 + ], + "intensity":6830, + "type":"directional", + "name":"Light" + } + ] + } + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0, + 1, + 2, + 3, + 4 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Cube", + "translation":[ + 0, + 1.5244084596633911, + 0 + ] + }, + { + "extensions":{ + "KHR_lights_punctual":{ + "light":0 + } + }, + "name":"Light", + "rotation":[ + 0.09542951732873917, + 0.8279411792755127, + 0.3013063669204712, + 0.4632721543312073 + ], + "translation":[ + 4.076245307922363, + 5.903861999511719, + -1.0054539442062378 + ] + }, + { + "camera":0, + "name":"Camera", + "rotation":[ + -0.03457474336028099, + 0.4687580168247223, + 0.004934974014759064, + 0.8826359510421753 + ], + "translation":[ + 14.699949264526367, + 4.958309173583984, + 12.676651000976562 + ] + }, + { + "mesh":1, + "name":"Plane" + }, + { + "mesh":2, + "name":"Sphere", + "translation":[ + 2.62099552154541, + 1.7896754741668701, + -0.7535718679428101 + ] + } + ], + "cameras":[ + { + "name":"Camera", + "perspective":{ + "aspectRatio":1.7777777777777777, + "yfov":0.39959648408210363, + "zfar":100, + "znear":0.10000000149011612 + }, + "type":"perspective" + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Material", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.8004003763198853, + 0.013363108038902283, + 0.020213128998875618, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.5 + } + }, + { + "doubleSided":true, + "name":"Material.001", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.4381273686885834, + 0.4381273686885834, + 0.4381273686885834, + 1 + ], + "metallicFactor":0, + "roughnessFactor":0.8815789222717285 + } + }, + { + "doubleSided":true, + "name":"SphereMaterial", + "pbrMetallicRoughness":{ + "baseColorFactor":[ + 0.14135831594467163, + 0.19362950325012207, + 0.8004969358444214, + 1 + ], + "metallicFactor":0.6710526347160339, + "roughnessFactor":0.21052631735801697 + } + } + ], + "meshes":[ + { + "name":"Cube", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2 + }, + "indices":3, + "material":0 + } + ] + }, + { + "name":"Plane", + "primitives":[ + { + "attributes":{ + "POSITION":4, + "NORMAL":5, + "TEXCOORD_0":6 + }, + "indices":7, + "material":1 + } + ] + }, + { + "name":"Sphere", + "primitives":[ + { + "attributes":{ + "POSITION":8, + "NORMAL":9, + "TEXCOORD_0":10 + }, + "indices":11, + "material":2 + } + ] + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 1, + 3.7387936115264893, + 1 + ], + "min":[ + -1, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":4, + "componentType":5126, + "count":4, + "max":[ + 23.336652755737305, + 0, + 23.336652755737305 + ], + "min":[ + -23.336652755737305, + 0, + -23.336652755737305 + ], + "type":"VEC3" + }, + { + "bufferView":5, + "componentType":5126, + "count":4, + "type":"VEC3" + }, + { + "bufferView":6, + "componentType":5126, + "count":4, + "type":"VEC2" + }, + { + "bufferView":7, + "componentType":5123, + "count":6, + "type":"SCALAR" + }, + { + "bufferView":8, + "componentType":5126, + "count":1984, + "max":[ + 0.9999997019767761, + 1, + 0.9999993443489075 + ], + "min":[ + -0.9999990463256836, + -1, + -1 + ], + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":1984, + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":1984, + "type":"VEC2" + }, + { + "bufferView":11, + "componentType":5123, + "count":2880, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":768, + "target":34963 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":840, + "target":34962 + }, + { + "buffer":0, + "byteLength":48, + "byteOffset":888, + "target":34962 + }, + { + "buffer":0, + "byteLength":32, + "byteOffset":936, + "target":34962 + }, + { + "buffer":0, + "byteLength":12, + "byteOffset":968, + "target":34963 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":980, + "target":34962 + }, + { + "buffer":0, + "byteLength":23808, + "byteOffset":24788, + "target":34962 + }, + { + "buffer":0, + "byteLength":15872, + "byteOffset":48596, + "target":34962 + }, + { + "buffer":0, + "byteLength":5760, + "byteOffset":64468, + "target":34963 + } + ], + "buffers":[ + { + "byteLength":70228, + "uri":"shadow_mapping_sanity_camera.bin" + } + ] +} diff --git a/gltf/shadow_mapping_spots.glb b/gltf/shadow_mapping_spots.glb new file mode 100644 index 00000000..7e671079 Binary files /dev/null and b/gltf/shadow_mapping_spots.glb differ diff --git a/gltf/spot_lights.glb b/gltf/spot_lights.glb new file mode 100644 index 00000000..ca120522 Binary files /dev/null and b/gltf/spot_lights.glb differ diff --git a/gltf/spot_one.glb b/gltf/spot_one.glb new file mode 100644 index 00000000..d1aea795 Binary files /dev/null and b/gltf/spot_one.glb differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/cube.png b/test_img/cubemap/hand_rolled_cubemap_sampling/cube.png new file mode 100644 index 00000000..4da9f70d Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/cube.png differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/face_+X.png b/test_img/cubemap/hand_rolled_cubemap_sampling/face_+X.png new file mode 100644 index 00000000..8a16c0d4 Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/face_+X.png differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/face_+Y.png b/test_img/cubemap/hand_rolled_cubemap_sampling/face_+Y.png new file mode 100644 index 00000000..58b24c73 Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/face_+Y.png differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/face_+Z.png b/test_img/cubemap/hand_rolled_cubemap_sampling/face_+Z.png new file mode 100644 index 00000000..3431e572 Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/face_+Z.png differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/face_-X.png b/test_img/cubemap/hand_rolled_cubemap_sampling/face_-X.png new file mode 100644 index 00000000..06fab6c7 Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/face_-X.png differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/face_-Y.png b/test_img/cubemap/hand_rolled_cubemap_sampling/face_-Y.png new file mode 100644 index 00000000..4d504ac9 Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/face_-Y.png differ diff --git a/test_img/cubemap/hand_rolled_cubemap_sampling/face_-Z.png b/test_img/cubemap/hand_rolled_cubemap_sampling/face_-Z.png new file mode 100644 index 00000000..80c49975 Binary files /dev/null and b/test_img/cubemap/hand_rolled_cubemap_sampling/face_-Z.png differ diff --git a/test_img/lights/spot_lights/frame.png b/test_img/lights/spot_lights/frame.png new file mode 100644 index 00000000..de5d53f5 Binary files /dev/null and b/test_img/lights/spot_lights/frame.png differ diff --git a/test_img/lights/spot_lights/one.png b/test_img/lights/spot_lights/one.png new file mode 100644 index 00000000..5f0c00c7 Binary files /dev/null and b/test_img/lights/spot_lights/one.png differ diff --git a/test_img/shadows/shadow_mapping_just_cuboid/red_and_blue/frame.png b/test_img/shadows/shadow_mapping_just_cuboid/red_and_blue/frame.png new file mode 100644 index 00000000..4b4a53a4 Binary files /dev/null and b/test_img/shadows/shadow_mapping_just_cuboid/red_and_blue/frame.png differ diff --git a/test_img/shadows/shadow_mapping_just_cuboid/scene_after.png b/test_img/shadows/shadow_mapping_just_cuboid/scene_after.png new file mode 100644 index 00000000..7927fb32 Binary files /dev/null and b/test_img/shadows/shadow_mapping_just_cuboid/scene_after.png differ diff --git a/test_img/shadows/shadow_mapping_just_cuboid/scene_before.png b/test_img/shadows/shadow_mapping_just_cuboid/scene_before.png new file mode 100644 index 00000000..4e0357e9 Binary files /dev/null and b/test_img/shadows/shadow_mapping_just_cuboid/scene_before.png differ diff --git a/test_img/shadows/shadow_mapping_points/frame.png b/test_img/shadows/shadow_mapping_points/frame.png new file mode 100644 index 00000000..0c2a962d Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/frame.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_0_pov_0.png b/test_img/shadows/shadow_mapping_points/light_0_pov_0.png new file mode 100644 index 00000000..f3c3f7a5 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_0_pov_0.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_0_pov_1.png b/test_img/shadows/shadow_mapping_points/light_0_pov_1.png new file mode 100644 index 00000000..7115d72c Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_0_pov_1.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_0_pov_2.png b/test_img/shadows/shadow_mapping_points/light_0_pov_2.png new file mode 100644 index 00000000..ae5ab94e Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_0_pov_2.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_0_pov_3.png b/test_img/shadows/shadow_mapping_points/light_0_pov_3.png new file mode 100644 index 00000000..c38fcf28 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_0_pov_3.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_0_pov_4.png b/test_img/shadows/shadow_mapping_points/light_0_pov_4.png new file mode 100644 index 00000000..e2cf8b2f Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_0_pov_4.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_0_pov_5.png b/test_img/shadows/shadow_mapping_points/light_0_pov_5.png new file mode 100644 index 00000000..b9116b2e Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_0_pov_5.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_1_pov_0.png b/test_img/shadows/shadow_mapping_points/light_1_pov_0.png new file mode 100644 index 00000000..9b0563a5 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_1_pov_0.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_1_pov_1.png b/test_img/shadows/shadow_mapping_points/light_1_pov_1.png new file mode 100644 index 00000000..894f2fea Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_1_pov_1.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_1_pov_2.png b/test_img/shadows/shadow_mapping_points/light_1_pov_2.png new file mode 100644 index 00000000..a1d185f5 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_1_pov_2.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_1_pov_3.png b/test_img/shadows/shadow_mapping_points/light_1_pov_3.png new file mode 100644 index 00000000..a6cf0b2a Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_1_pov_3.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_1_pov_4.png b/test_img/shadows/shadow_mapping_points/light_1_pov_4.png new file mode 100644 index 00000000..b5425edf Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_1_pov_4.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_1_pov_5.png b/test_img/shadows/shadow_mapping_points/light_1_pov_5.png new file mode 100644 index 00000000..5bd8474c Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_1_pov_5.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_2_pov_0.png b/test_img/shadows/shadow_mapping_points/light_2_pov_0.png new file mode 100644 index 00000000..1d0fdc9e Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_2_pov_0.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_2_pov_1.png b/test_img/shadows/shadow_mapping_points/light_2_pov_1.png new file mode 100644 index 00000000..ef4b785d Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_2_pov_1.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_2_pov_2.png b/test_img/shadows/shadow_mapping_points/light_2_pov_2.png new file mode 100644 index 00000000..22117716 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_2_pov_2.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_2_pov_3.png b/test_img/shadows/shadow_mapping_points/light_2_pov_3.png new file mode 100644 index 00000000..21412898 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_2_pov_3.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_2_pov_4.png b/test_img/shadows/shadow_mapping_points/light_2_pov_4.png new file mode 100644 index 00000000..567fbf12 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_2_pov_4.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_2_pov_5.png b/test_img/shadows/shadow_mapping_points/light_2_pov_5.png new file mode 100644 index 00000000..8669d934 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_2_pov_5.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_3_pov_0.png b/test_img/shadows/shadow_mapping_points/light_3_pov_0.png new file mode 100644 index 00000000..be1f7820 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_3_pov_0.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_3_pov_1.png b/test_img/shadows/shadow_mapping_points/light_3_pov_1.png new file mode 100644 index 00000000..b49f1d7b Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_3_pov_1.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_3_pov_2.png b/test_img/shadows/shadow_mapping_points/light_3_pov_2.png new file mode 100644 index 00000000..6a781e8d Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_3_pov_2.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_3_pov_3.png b/test_img/shadows/shadow_mapping_points/light_3_pov_3.png new file mode 100644 index 00000000..d0ec85b9 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_3_pov_3.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_3_pov_4.png b/test_img/shadows/shadow_mapping_points/light_3_pov_4.png new file mode 100644 index 00000000..99b7c83c Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_3_pov_4.png differ diff --git a/test_img/shadows/shadow_mapping_points/light_3_pov_5.png b/test_img/shadows/shadow_mapping_points/light_3_pov_5.png new file mode 100644 index 00000000..0f6d8cc7 Binary files /dev/null and b/test_img/shadows/shadow_mapping_points/light_3_pov_5.png differ diff --git a/test_img/shadows/shadow_mapping_sanity/depth.png b/test_img/shadows/shadow_mapping_sanity/depth.png new file mode 100644 index 00000000..c25bd548 Binary files /dev/null and b/test_img/shadows/shadow_mapping_sanity/depth.png differ diff --git a/test_img/shadows/shadow_mapping_sanity/light_pov_depth.png b/test_img/shadows/shadow_mapping_sanity/light_pov_depth.png new file mode 100644 index 00000000..6cf43cb6 Binary files /dev/null and b/test_img/shadows/shadow_mapping_sanity/light_pov_depth.png differ diff --git a/test_img/shadows/shadow_mapping_sanity/scene_before.png b/test_img/shadows/shadow_mapping_sanity/scene_before.png new file mode 100644 index 00000000..c5ffeb4c Binary files /dev/null and b/test_img/shadows/shadow_mapping_sanity/scene_before.png differ diff --git a/test_img/shadows/shadow_mapping_sanity/scene_light_pov.png b/test_img/shadows/shadow_mapping_sanity/scene_light_pov.png new file mode 100644 index 00000000..e58ba2a1 Binary files /dev/null and b/test_img/shadows/shadow_mapping_sanity/scene_light_pov.png differ diff --git a/test_img/shadows/shadow_mapping_sanity/shadows_update_texture.png b/test_img/shadows/shadow_mapping_sanity/shadows_update_texture.png new file mode 100644 index 00000000..d344ca27 Binary files /dev/null and b/test_img/shadows/shadow_mapping_sanity/shadows_update_texture.png differ diff --git a/test_img/shadows/shadow_mapping_sanity/stage_render.png b/test_img/shadows/shadow_mapping_sanity/stage_render.png new file mode 100644 index 00000000..2353e296 Binary files /dev/null and b/test_img/shadows/shadow_mapping_sanity/stage_render.png differ diff --git a/test_img/shadows/shadow_mapping_spots/frame.png b/test_img/shadows/shadow_mapping_spots/frame.png new file mode 100644 index 00000000..4190d402 Binary files /dev/null and b/test_img/shadows/shadow_mapping_spots/frame.png differ diff --git a/test_img/shadows/shadow_mapping_spots/light_pov_0.png b/test_img/shadows/shadow_mapping_spots/light_pov_0.png new file mode 100644 index 00000000..071d2a1e Binary files /dev/null and b/test_img/shadows/shadow_mapping_spots/light_pov_0.png differ diff --git a/test_img/shadows/shadow_mapping_spots/light_pov_1.png b/test_img/shadows/shadow_mapping_spots/light_pov_1.png new file mode 100644 index 00000000..df393270 Binary files /dev/null and b/test_img/shadows/shadow_mapping_spots/light_pov_1.png differ