@babylonjs/lite 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +51 -0
- package/THIRD_PARTY_NOTICES.txt +318 -0
- package/{_mat4-storage-f64-CjDoht2w.js → _mat4-storage-f64-WeexU-hd.js} +2 -2
- package/{_mat4-storage-f64-CjDoht2w.js.map → _mat4-storage-f64-WeexU-hd.js.map} +1 -1
- package/{alpha-test-fragment-B7DjSnF7.js → alpha-test-fragment-x2mnjLgC.js} +2 -2
- package/{alpha-test-fragment-B7DjSnF7.js.map → alpha-test-fragment-x2mnjLgC.js.map} +1 -1
- package/{background-dds-skybox-BEX309u3.js → background-dds-skybox-BpcDr-9c.js} +3 -3
- package/{background-dds-skybox-BEX309u3.js.map → background-dds-skybox-BpcDr-9c.js.map} +1 -1
- package/{background-ground-BU0HOcM4.js → background-ground-Bm6gjWqx.js} +2 -2
- package/{background-ground-BU0HOcM4.js.map → background-ground-Bm6gjWqx.js.map} +1 -1
- package/{background-hdr-skybox--RRRic_K.js → background-hdr-skybox-CSFo8RX6.js} +3 -3
- package/{background-hdr-skybox--RRRic_K.js.map → background-hdr-skybox-CSFo8RX6.js.map} +1 -1
- package/{background-solid-skybox-BrH2fXSu.js → background-solid-skybox-DOOBeDIz.js} +2 -2
- package/{background-solid-skybox-BrH2fXSu.js.map → background-solid-skybox-DOOBeDIz.js.map} +1 -1
- package/{billboard-renderable-BHWryAeC.js → billboard-renderable-IJfCpeDS.js} +2 -2
- package/{billboard-renderable-BHWryAeC.js.map → billboard-renderable-IJfCpeDS.js.map} +1 -1
- package/{clamp-block-DqbwnQGW.js → clamp-block-BD_t8I89.js} +2 -2
- package/{clamp-block-DqbwnQGW.js.map → clamp-block-BD_t8I89.js.map} +1 -1
- package/{clearcoat-fragment-D6FSCie1.js → clearcoat-fragment-Dj7vGX2u.js} +2 -2
- package/{clearcoat-fragment-D6FSCie1.js.map → clearcoat-fragment-Dj7vGX2u.js.map} +1 -1
- package/{create-skeleton-D_uplboC.js → create-skeleton-s0hjrC3A.js} +2 -2
- package/{create-skeleton-D_uplboC.js.map → create-skeleton-s0hjrC3A.js.map} +1 -1
- package/{cubemap-skybox-material-DQcMMdf-.js → cubemap-skybox-material-8lzbgi7K.js} +2 -2
- package/{cubemap-skybox-material-DQcMMdf-.js.map → cubemap-skybox-material-8lzbgi7K.js.map} +1 -1
- package/{curve-block-21rT0JjG.js → curve-block-Ditr4R7V.js} +2 -2
- package/{curve-block-21rT0JjG.js.map → curve-block-Ditr4R7V.js.map} +1 -1
- package/{emissive-fragment-C5FtBs3y.js → emissive-fragment-BOAezkfk.js} +2 -2
- package/{emissive-fragment-C5FtBs3y.js.map → emissive-fragment-BOAezkfk.js.map} +1 -1
- package/{esm-shadow-view-c5YV4Eg9.js → esm-shadow-view-DRpyRAfa.js} +2 -2
- package/{esm-shadow-view-c5YV4Eg9.js.map → esm-shadow-view-DRpyRAfa.js.map} +1 -1
- package/{esm-shadow-view-Gtd1LWRP.js → esm-shadow-view-DmIORQGZ.js} +2 -2
- package/{esm-shadow-view-Gtd1LWRP.js.map → esm-shadow-view-DmIORQGZ.js.map} +1 -1
- package/{esm-shadow-view-Cl3rPGof.js → esm-shadow-view-JCPaOOi7.js} +2 -2
- package/{esm-shadow-view-Cl3rPGof.js.map → esm-shadow-view-JCPaOOi7.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-7J31V23x.js → gaussian-splatting-pipeline-sh-B30Mu56i.js} +2 -2
- package/{gaussian-splatting-pipeline-sh-7J31V23x.js.map → gaussian-splatting-pipeline-sh-B30Mu56i.js.map} +1 -1
- package/{geometry-texture-output-dXk4E9uu.js → geometry-texture-output-DURiaJ_n.js} +2 -2
- package/{geometry-texture-output-dXk4E9uu.js.map → geometry-texture-output-DURiaJ_n.js.map} +1 -1
- package/{geometry-view-BsFJpBJa.js → geometry-view-DRrscyWU.js} +4 -4
- package/{geometry-view-BsFJpBJa.js.map → geometry-view-DRrscyWU.js.map} +1 -1
- package/{gltf-animation-K_zZxj_d.js → gltf-animation-BjnXkop6.js} +2 -2
- package/{gltf-animation-K_zZxj_d.js.map → gltf-animation-BjnXkop6.js.map} +1 -1
- package/{gltf-ext-basisu-CDbPclzZ.js → gltf-ext-basisu-DtzVV1Xx.js} +2 -202
- package/gltf-ext-basisu-DtzVV1Xx.js.map +1 -0
- package/{gltf-ext-node-visibility-DXCJEYr6.js → gltf-ext-node-visibility-BhX0DmiP.js} +2 -2
- package/{gltf-ext-node-visibility-DXCJEYr6.js.map → gltf-ext-node-visibility-BhX0DmiP.js.map} +1 -1
- package/{gltf-ext-quantization-CvHI_0Vg.js → gltf-ext-quantization-DaymajCR.js} +2 -2
- package/{gltf-ext-quantization-CvHI_0Vg.js.map → gltf-ext-quantization-DaymajCR.js.map} +1 -1
- package/{gltf-ext-uv-transform-DgYazJBs.js → gltf-ext-uv-transform-DFmNJ8kA.js} +2 -2
- package/{gltf-ext-uv-transform-DgYazJBs.js.map → gltf-ext-uv-transform-DFmNJ8kA.js.map} +1 -1
- package/{gltf-feature-animation-pointer-D1RJRFBw.js → gltf-feature-animation-pointer-C40tqOhL.js} +3 -3
- package/{gltf-feature-animation-pointer-D1RJRFBw.js.map → gltf-feature-animation-pointer-C40tqOhL.js.map} +1 -1
- package/{gltf-feature-animations-Cmc1uoIu.js → gltf-feature-animations-v0S_yb4T.js} +2 -2
- package/{gltf-feature-animations-Cmc1uoIu.js.map → gltf-feature-animations-v0S_yb4T.js.map} +1 -1
- package/{gltf-feature-draco-CKKzT5E3.js → gltf-feature-draco-CljWrsna.js} +2 -2
- package/{gltf-feature-draco-CKKzT5E3.js.map → gltf-feature-draco-CljWrsna.js.map} +1 -1
- package/{gltf-feature-gpu-instancing-n87SO6Vh.js → gltf-feature-gpu-instancing-BoeSm6Tn.js} +2 -2
- package/{gltf-feature-gpu-instancing-n87SO6Vh.js.map → gltf-feature-gpu-instancing-BoeSm6Tn.js.map} +1 -1
- package/{gltf-feature-lights-punctual-Ckm3ciL8.js → gltf-feature-lights-punctual-BCTwgyi_.js} +5 -5
- package/{gltf-feature-lights-punctual-Ckm3ciL8.js.map → gltf-feature-lights-punctual-BCTwgyi_.js.map} +1 -1
- package/{gltf-feature-meshopt-DLC4SF1E.js → gltf-feature-meshopt-DItMkOMt.js} +2 -2
- package/{gltf-feature-meshopt-DLC4SF1E.js.map → gltf-feature-meshopt-DItMkOMt.js.map} +1 -1
- package/{gltf-feature-morph-Cjtu7hYa.js → gltf-feature-morph-Cv0mEYIq.js} +3 -3
- package/{gltf-feature-morph-Cjtu7hYa.js.map → gltf-feature-morph-Cv0mEYIq.js.map} +1 -1
- package/{gltf-feature-registry-C63Hjp9w.js → gltf-feature-registry-wNbt6UC-.js} +15 -15
- package/{gltf-feature-registry-C63Hjp9w.js.map → gltf-feature-registry-wNbt6UC-.js.map} +1 -1
- package/{gltf-feature-skeleton-DKbOGidp.js → gltf-feature-skeleton-Deh2UBAn.js} +3 -3
- package/{gltf-feature-skeleton-DKbOGidp.js.map → gltf-feature-skeleton-Deh2UBAn.js.map} +1 -1
- package/{gltf-feature-variants-Cmzu0O0e.js → gltf-feature-variants-DGSdFNJq.js} +2 -2
- package/{gltf-feature-variants-Cmzu0O0e.js.map → gltf-feature-variants-DGSdFNJq.js.map} +1 -1
- package/{gltf-glb-parser-Cj5MHS-v.js → gltf-glb-parser-DSQWsT4r.js} +2 -2
- package/{gltf-glb-parser-Cj5MHS-v.js.map → gltf-glb-parser-DSQWsT4r.js.map} +1 -1
- package/{gltf-interleave-gHf9_t0i.js → gltf-interleave-OBqmlu-h.js} +11 -5
- package/gltf-interleave-OBqmlu-h.js.map +1 -0
- package/{gltf-normals-b2h74380.js → gltf-normals-D_P0KA4b.js} +10 -2
- package/gltf-normals-D_P0KA4b.js.map +1 -0
- package/{gltf-pbr-builder-ext-edNcjwPf.js → gltf-pbr-builder-ext-3imk8Tev.js} +2 -2
- package/{gltf-pbr-builder-ext-edNcjwPf.js.map → gltf-pbr-builder-ext-3imk8Tev.js.map} +1 -1
- package/{gltf-variants-CPxNdtP4.js → gltf-variants-Dyr54wwg.js} +4 -4
- package/{gltf-variants-CPxNdtP4.js.map → gltf-variants-Dyr54wwg.js.map} +1 -1
- package/gpu-task-timer-DVBNZfq5.js +236 -0
- package/gpu-task-timer-DVBNZfq5.js.map +1 -0
- package/gpu-timer-CUpqT_hK.js +55 -0
- package/gpu-timer-CUpqT_hK.js.map +1 -0
- package/{gs-picking-pipeline-DYaW_Lg3.js → gs-picking-pipeline-CERN-Trj.js} +2 -2
- package/{gs-picking-pipeline-DYaW_Lg3.js.map → gs-picking-pipeline-CERN-Trj.js.map} +1 -1
- package/{havok-floating-origin-Dr-18Nds.js → havok-floating-origin-VVdJRUYc.js} +2 -2
- package/{havok-floating-origin-Dr-18Nds.js.map → havok-floating-origin-VVdJRUYc.js.map} +1 -1
- package/{index-CYZDclhF.js → index-7Bk-uLSM.js} +2 -2
- package/{index-CYZDclhF.js.map → index-7Bk-uLSM.js.map} +1 -1
- package/{index-CLElg2Bo.js → index-BgY3QEzL.js} +4774 -1276
- package/index-BgY3QEzL.js.map +1 -0
- package/{index-SMJ67XwT.js → index-Dr5LK2tg.js} +2 -2
- package/{index-SMJ67XwT.js.map → index-Dr5LK2tg.js.map} +1 -1
- package/index.d.ts +1047 -13
- package/index.js +508 -444
- package/{input-block-DqEedWF2.js → input-block-DjdlndCL.js} +2 -2
- package/{input-block-DqEedWF2.js.map → input-block-DjdlndCL.js.map} +1 -1
- package/{iridescence-fragment-BHU59-gQ.js → iridescence-fragment-kfsCs8lN.js} +2 -2
- package/{iridescence-fragment-BHU59-gQ.js.map → iridescence-fragment-kfsCs8lN.js.map} +1 -1
- package/{light-block-Bv37V8vl.js → light-block-qjCrz3de.js} +2 -2
- package/{light-block-Bv37V8vl.js.map → light-block-qjCrz3de.js.map} +1 -1
- package/{loop-block-qTg8vb99.js → loop-block-C8vkQ2bz.js} +2 -2
- package/{loop-block-qTg8vb99.js.map → loop-block-C8vkQ2bz.js.map} +1 -1
- package/{manifold-AS8POaOr.js → manifold-DeXMNgxT.js} +3 -3
- package/{manifold-AS8POaOr.js.map → manifold-DeXMNgxT.js.map} +1 -1
- package/{morph-fragment-BRCUr2wQ.js → morph-fragment-NpZYyIIU.js} +2 -2
- package/{morph-fragment-BRCUr2wQ.js.map → morph-fragment-NpZYyIIU.js.map} +1 -1
- package/{multilight-wgsl-DMeppAdZ.js → multilight-wgsl-I5SncF0q.js} +2 -2
- package/{multilight-wgsl-DMeppAdZ.js.map → multilight-wgsl-I5SncF0q.js.map} +1 -1
- package/{node-env-Bc559GmY.js → node-env-D7Aee08u.js} +2 -2
- package/{node-env-Bc559GmY.js.map → node-env-D7Aee08u.js.map} +1 -1
- package/{node-geometry-view-COmWsRXK.js → node-geometry-view-DfKXWNfV.js} +3 -3
- package/{node-geometry-view-COmWsRXK.js.map → node-geometry-view-DfKXWNfV.js.map} +1 -1
- package/{node-registry-extra-compat-dWrv7gpS.js → node-registry-extra-compat-CDLeBR1P.js} +2 -2
- package/{node-registry-extra-compat-dWrv7gpS.js.map → node-registry-extra-compat-CDLeBR1P.js.map} +1 -1
- package/{node-registry-extra-math-Bn854sX9.js → node-registry-extra-math-BA8_l4lB.js} +2 -2
- package/{node-registry-extra-math-Bn854sX9.js.map → node-registry-extra-math-BA8_l4lB.js.map} +1 -1
- package/{node-renderable-B5G8WcdH.js → node-renderable-EwLLnaL1.js} +2 -2
- package/{node-renderable-B5G8WcdH.js.map → node-renderable-EwLLnaL1.js.map} +1 -1
- package/{node-shadow-CVIUlNf0.js → node-shadow-CeTmT6g4.js} +2 -2
- package/{node-shadow-CVIUlNf0.js.map → node-shadow-CeTmT6g4.js.map} +1 -1
- package/{normal-map-fragment-CQSxhjCy.js → normal-map-fragment-BHImLyM-.js} +2 -2
- package/{normal-map-fragment-CQSxhjCy.js.map → normal-map-fragment-BHImLyM-.js.map} +1 -1
- package/package.json +10 -3
- package/{parse-camera-pBRT_6i5.js → parse-camera-5IGdctAS.js} +2 -2
- package/{parse-camera-pBRT_6i5.js.map → parse-camera-5IGdctAS.js.map} +1 -1
- package/{pbr-geometry-view-NiZY_juX.js → pbr-geometry-view-Dthf9Aut.js} +3 -3
- package/{pbr-geometry-view-NiZY_juX.js.map → pbr-geometry-view-Dthf9Aut.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-Ta9lR2cz.js → pbr-metallic-roughness-block-full-DD6zI_Lx.js} +2 -2
- package/{pbr-metallic-roughness-block-full-Ta9lR2cz.js.map → pbr-metallic-roughness-block-full-DD6zI_Lx.js.map} +1 -1
- package/{pbr-metallic-roughness-block-JBSi-tQN.js → pbr-metallic-roughness-block-g7wjzwN_.js} +2 -2
- package/{pbr-metallic-roughness-block-JBSi-tQN.js.map → pbr-metallic-roughness-block-g7wjzwN_.js.map} +1 -1
- package/{pbr-mr-helper-core-BVWNR08D.js → pbr-mr-helper-core-CWROQ7OA.js} +2 -2
- package/{pbr-mr-helper-core-BVWNR08D.js.map → pbr-mr-helper-core-CWROQ7OA.js.map} +1 -1
- package/{pbr-refraction-C9FvFmAp.js → pbr-refraction-Dxsm_gii.js} +2 -2
- package/{pbr-refraction-C9FvFmAp.js.map → pbr-refraction-Dxsm_gii.js.map} +1 -1
- package/{pbr-renderable-DzUF2QIk.js → pbr-renderable-CuKWalEM.js} +22 -22
- package/{pbr-renderable-DzUF2QIk.js.map → pbr-renderable-CuKWalEM.js.map} +1 -1
- package/{pbr-shadow-fragment-CnqnbGYS.js → pbr-shadow-fragment-waeIBQUq.js} +2 -2
- package/{pbr-shadow-fragment-CnqnbGYS.js.map → pbr-shadow-fragment-waeIBQUq.js.map} +1 -1
- package/{pbr-tracking-3tU1kqea.js → pbr-tracking-CdeqbBrh.js} +2 -2
- package/{pbr-tracking-3tU1kqea.js.map → pbr-tracking-CdeqbBrh.js.map} +1 -1
- package/{pbr-transmission-ext-BcLjRxfB.js → pbr-transmission-ext-BNiXngZc.js} +2 -2
- package/{pbr-transmission-ext-BcLjRxfB.js.map → pbr-transmission-ext-BNiXngZc.js.map} +1 -1
- package/{recast-navigation.wasm-DG_0AFuk.js → recast-navigation.wasm-VC4lGlEe.js} +3 -3
- package/{recast-navigation.wasm-DG_0AFuk.js.map → recast-navigation.wasm-VC4lGlEe.js.map} +1 -1
- package/{recast-navigation.wasm-compat-C-Bf2ylB.js → recast-navigation.wasm-compat-CTwYOzRz.js} +3 -3
- package/{recast-navigation.wasm-compat-C-Bf2ylB.js.map → recast-navigation.wasm-compat-CTwYOzRz.js.map} +1 -1
- package/{reflectance-fragment-Dbpgw3Jt.js → reflectance-fragment-BQFZ_pgy.js} +2 -2
- package/{reflectance-fragment-Dbpgw3Jt.js.map → reflectance-fragment-BQFZ_pgy.js.map} +1 -1
- package/{rgbd-decode-DoyUquy3.js → rgbd-decode-duTlXMWd.js} +2 -2
- package/{rgbd-decode-DoyUquy3.js.map → rgbd-decode-duTlXMWd.js.map} +1 -1
- package/{scene-material-swap-nNUH4nGn.js → scene-material-swap-4qM0tpBK.js} +1 -2
- package/scene-material-swap-4qM0tpBK.js.map +1 -0
- package/{screenshot-readback-D0Sj9qq3.js → screenshot-readback-DnxR4rhp.js} +2 -2
- package/{screenshot-readback-D0Sj9qq3.js.map → screenshot-readback-DnxR4rhp.js.map} +1 -1
- package/{shader-composer-BUD_pSX4.js → shader-composer-CBy2i8nU.js} +2 -2
- package/{shader-composer-BUD_pSX4.js.map → shader-composer-CBy2i8nU.js.map} +1 -1
- package/{shader-renderable-D7-RyVxa.js → shader-renderable-DVMVD6zP.js} +41 -9
- package/shader-renderable-DVMVD6zP.js.map +1 -0
- package/{shader-thin-instance-DuBotxDO.js → shader-thin-instance-CsDo3ULk.js} +2 -2
- package/{shader-thin-instance-DuBotxDO.js.map → shader-thin-instance-CsDo3ULk.js.map} +1 -1
- package/{sheen-fragment-1MkEMcbc.js → sheen-fragment-B_Jd7wrr.js} +2 -2
- package/{sheen-fragment-1MkEMcbc.js.map → sheen-fragment-B_Jd7wrr.js.map} +1 -1
- package/{singlelight-directional-wgsl-BsV8G456.js → singlelight-directional-wgsl-Bw84txva.js} +2 -2
- package/{singlelight-directional-wgsl-BsV8G456.js.map → singlelight-directional-wgsl-Bw84txva.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-Bo0jKlW5.js → singlelight-hemispheric-wgsl-DjxhgI8r.js} +2 -2
- package/{singlelight-hemispheric-wgsl-Bo0jKlW5.js.map → singlelight-hemispheric-wgsl-DjxhgI8r.js.map} +1 -1
- package/{singlelight-point-wgsl-DV39UP5Y.js → singlelight-point-wgsl-iA1aRkXA.js} +2 -2
- package/{singlelight-point-wgsl-DV39UP5Y.js.map → singlelight-point-wgsl-iA1aRkXA.js.map} +1 -1
- package/{singlelight-spot-wgsl-yg3od6vL.js → singlelight-spot-wgsl-MDdTdstF.js} +2 -2
- package/{singlelight-spot-wgsl-yg3od6vL.js.map → singlelight-spot-wgsl-MDdTdstF.js.map} +1 -1
- package/{skeleton-fragment-DdxYG6kv.js → skeleton-fragment-COdHWFcK.js} +2 -2
- package/{skeleton-fragment-DdxYG6kv.js.map → skeleton-fragment-COdHWFcK.js.map} +1 -1
- package/{skybox-renderable-CJD4XmX5.js → skybox-renderable-DJYkfw32.js} +2 -2
- package/{skybox-renderable-CJD4XmX5.js.map → skybox-renderable-DJYkfw32.js.map} +1 -1
- package/{splat-ply-compressed-DHjyiVmI.js → splat-ply-compressed-SxMlsKNK.js} +2 -2
- package/{splat-ply-compressed-DHjyiVmI.js.map → splat-ply-compressed-SxMlsKNK.js.map} +1 -1
- package/{standard-pipeline-XTbHL7MY.js → standard-pipeline-DXFOUqU_.js} +3 -3
- package/{standard-pipeline-XTbHL7MY.js.map → standard-pipeline-DXFOUqU_.js.map} +1 -1
- package/{standard-renderable-CREWLNHI.js → standard-renderable-BAc-i-ig.js} +3 -3
- package/{standard-renderable-CREWLNHI.js.map → standard-renderable-BAc-i-ig.js.map} +1 -1
- package/{std-ambient-fragment-Bjx3VFrr.js → std-ambient-fragment-P8dHZ4An.js} +2 -2
- package/{std-ambient-fragment-Bjx3VFrr.js.map → std-ambient-fragment-P8dHZ4An.js.map} +1 -1
- package/{std-cube-reflection-fragment-y9WWdXUt.js → std-cube-reflection-fragment-CF03MuQt.js} +2 -2
- package/{std-cube-reflection-fragment-y9WWdXUt.js.map → std-cube-reflection-fragment-CF03MuQt.js.map} +1 -1
- package/{std-emissive-fragment-C8Lnmojh.js → std-emissive-fragment-P8yJGclx.js} +2 -2
- package/{std-emissive-fragment-C8Lnmojh.js.map → std-emissive-fragment-P8yJGclx.js.map} +1 -1
- package/{std-lightmap-fragment-DFxGcoA5.js → std-lightmap-fragment-CymEG79z.js} +9 -6
- package/std-lightmap-fragment-CymEG79z.js.map +1 -0
- package/{std-opacity-fragment-EXzFWiSp.js → std-opacity-fragment-DLa1zV06.js} +2 -2
- package/{std-opacity-fragment-EXzFWiSp.js.map → std-opacity-fragment-DLa1zV06.js.map} +1 -1
- package/{std-reflection-fragment-BoJORqpG.js → std-reflection-fragment-BLySsYos.js} +2 -2
- package/{std-reflection-fragment-BoJORqpG.js.map → std-reflection-fragment-BLySsYos.js.map} +1 -1
- package/{std-shadow-fragment-Bq-Wc8UJ.js → std-shadow-fragment-C_q27Mdi.js} +2 -2
- package/{std-shadow-fragment-Bq-Wc8UJ.js.map → std-shadow-fragment-C_q27Mdi.js.map} +1 -1
- package/{std-specular-fragment-CM5R5j2g.js → std-specular-fragment-CaBXyAWY.js} +2 -2
- package/{std-specular-fragment-CM5R5j2g.js.map → std-specular-fragment-CaBXyAWY.js.map} +1 -1
- package/{std-tracking-Cif_wXeT.js → std-tracking-Bw61Dv98.js} +2 -2
- package/{std-tracking-Cif_wXeT.js.map → std-tracking-Bw61Dv98.js.map} +1 -1
- package/{subsurface-fragment-BEaAXYXz.js → subsurface-fragment-BNQoG9gr.js} +2 -2
- package/{subsurface-fragment-BEaAXYXz.js.map → subsurface-fragment-BNQoG9gr.js.map} +1 -1
- package/{thin-instance-cull-binding-DWKUt5ZN.js → thin-instance-cull-binding-BNC5JiGw.js} +3 -3
- package/{thin-instance-cull-binding-DWKUt5ZN.js.map → thin-instance-cull-binding-BNC5JiGw.js.map} +1 -1
- package/{thin-instance-gpu-BDdRcNAh.js → thin-instance-gpu-C1DGstap.js} +2 -2
- package/{thin-instance-gpu-BDdRcNAh.js.map → thin-instance-gpu-C1DGstap.js.map} +1 -1
- package/{tracking-primitives-CglRNTlX.js → tracking-primitives-CMBWLxGr.js} +2 -2
- package/{tracking-primitives-CglRNTlX.js.map → tracking-primitives-CMBWLxGr.js.map} +1 -1
- package/{unlit-fragment-kxfZWlnp.js → unlit-fragment-BsHrS9XX.js} +2 -2
- package/{unlit-fragment-kxfZWlnp.js.map → unlit-fragment-BsHrS9XX.js.map} +1 -1
- package/gltf-ext-basisu-CDbPclzZ.js.map +0 -1
- package/gltf-interleave-gHf9_t0i.js.map +0 -1
- package/gltf-normals-b2h74380.js.map +0 -1
- package/index-CLElg2Bo.js.map +0 -1
- package/scene-material-swap-nNUH4nGn.js.map +0 -1
- package/shader-renderable-D7-RyVxa.js.map +0 -1
- package/std-lightmap-fragment-DFxGcoA5.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-metallic-roughness-block-full-Ta9lR2cz.js","sources":["../src/material/node/blocks/pbr-mr-helper-full.ts","../src/material/node/blocks/pbr-metallic-roughness-block-full.ts"],"sourcesContent":["/** PBRMetallicRoughnessBlock — direct lighting + optional IBL + optional clearcoat + optional sheen.\n *\n * When the `reflection` input is connected (typically to a ReflectionBlock),\n * this emitter runs the GGX direct-lighting path PLUS a split-sum IBL\n * contribution (specular cube + BRDF LUT + SH irradiance).\n *\n * When the `clearcoat` input is connected (to a ClearCoatBlock), an extra\n * GGX clear-coat layer is added on top: per-light Schlick fresnel + Kelemen\n * visibility GGX specular, and the base layer (diffuse + specular + IBL)\n * is modulated by (1 - ccFresnel * ccIntensity).\n *\n * When the `sheen` input is connected (to a SheenBlock), an extra Charlie\n * NDF + Ashikhmin visibility cloth/velvet sheen layer is added: per-light\n * direct sheen contribution and a sheen IBL term that uses the BRDF LUT\n * blue channel for the sheen-roughness lookup.\n *\n * Outputs implemented (others stub to a zero vector):\n * - lighting / diffuseDir / specularDir / shadow / alpha\n * - diffuseInd / specularInd (only meaningful when IBL is on)\n */\n\nimport type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nfunction ccDirectBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n const NdotLcc = \"ccNdotL\";\n const declCcNdotL = `let ccNdotL = clamp(dot(ccNormalW, L), 0.0000001, 1.0);`;\n return `\n${declCcNdotL}\nif (${NdotLcc} > 0.0 && atten > 0.0) {\nlet ccH = normalize(V + L);\nlet ccNdotH = clamp(dot(${Ncc}, ccH), 0.0000001, 1.0);\nlet ccVdotH = saturate(dot(V, ccH));\nlet ccD = nme_pbr_distGGX(ccNdotH, ccAlphaG);\nlet ccVis = 0.25 / (ccVdotH * ccVdotH + 0.0000001);\nlet ccF_d = nme_pbr_ccSchlick(ccF0, ccVdotH);\nlet ccTerm = ccF_d * ccD * ccVis * ${NdotLcc};\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm) * color * atten * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_d * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract = -refract(L, ${Ncc}, ccIorInv);\nlet ccNdotLRefract = clamp(dot(${Ncc}, ccLRefract), 0.0000001, 1.0);\nlet ccDirectAbsorption = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract + ccNdotVRefract) / (ccNdotLRefract * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction ccHemiBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n return `\nlet ccNdotL_h = clamp(dot(${Ncc}, Ldir), 0.0000001, 1.0);\nif (nl > 0.0) {\nlet ccH_h = normalize(V + Ldir);\nlet ccNdotH_h = clamp(dot(${Ncc}, ccH_h), 0.0000001, 1.0);\nlet ccVdotH_h = saturate(dot(V, ccH_h));\nlet ccD_h = nme_pbr_distGGX(ccNdotH_h, ccAlphaG);\nlet ccVis_h = 0.25 / (ccVdotH_h * ccVdotH_h + 0.0000001);\nlet ccF_h = nme_pbr_ccSchlick(ccF0, ccVdotH_h);\nlet ccTerm_h = ccF_h * ccD_h * ccVis_h * ccNdotL_h;\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm_h) * entry.vLightDiffuse.rgb * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_h * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract_h = -refract(Ldir, ${Ncc}, ccIorInv);\nlet ccNdotLRefract_h = clamp(dot(${Ncc}, ccLRefract_h), 0.0000001, 1.0);\nlet ccDirectAbsorption_h = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract_h + ccNdotVRefract) / (ccNdotLRefract_h * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption_h, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction shDirectBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (NdotL > 0.0 && atten > 0.0) {\nlet shH = normalize(V + L);\nlet shNdotH = clamp(dot(N, shH), 0.0000001, 1.0);\nlet shD = nme_pbr_charlieD(shNdotH, shAlphaG);\nlet shV = 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD * shV * NdotL * color * atten * sh * baseLayerAtten;\n}`;\n}\n\nfunction shHemiBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (nl > 0.0) {\nlet shH_h = normalize(V + Ldir);\nlet shNdotH_h = clamp(dot(N, shH_h), 0.0000001, 1.0);\nlet shD_h = nme_pbr_charlieD(shNdotH_h, shAlphaG);\nlet shV_h = 1.0 / (4.0 * (nl + NdotV - nl * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD_h * shV_h * nl * entry.vLightSpecular.rgb * sh * baseLayerAtten;\n}`;\n}\n\n/** Subsurface IBL block — runs inside the env IBL section. Computes refraction\n * (refract V through N, sample env at refractionLOD, apply Coca-Lambert tint\n * absorption + reflectance complement) and translucency (back-scattered SH\n * irradiance with Burley transmittance). Contributes:\n * - finalRefraction (vec3, added to lighting)\n * - refractionOpacity (f32, scales finalIrradiance: 1 - refrIntensity)\n * - mutates finalIrradiance to include refractionIrradiance + (1-translucency) scale.\n *\n * Always declares finalRefraction/refractionOpacity even when sub-features are\n * off so the downstream composition can reference them unconditionally. */\nfunction ssBlock(useSubsurface: boolean, useRefraction: boolean, useAnisotropy: boolean): string {\n if (!useSubsurface && !useRefraction) {\n return `let finalRefraction = v3(0.0);\nlet refractionOpacity = 1.0;\nlet ssRefractionIrradiance = v3(0.0);`;\n }\n const refrPart = useRefraction\n ? `// Refraction: refract V through N at IOR, sample env at refraction LOD.\n let refrIntensity = clamp(refrIntensityIn, 0.0, 1.0);\n let invIor = 1.0 / max(refrIor, 1.0001);\n let refrV_raw = refract(-V, ${useAnisotropy ? \"aniN\" : \"N\"}, invIor);\n let refrV = v3(refrV_raw.x * cosA + refrV_raw.z * sinA, refrV_raw.y, -refrV_raw.x * sinA + refrV_raw.z * cosA);\n let refrAlphaG = mix(alphaG, 0.0, clamp(invIor * 3.0 - 2.0, 0.0, 1.0));\n let refrLod = log2(cubemapDim * refrAlphaG) * sceneU.vImageInfos.z;\n let envRefr = textureSampleLevel(nmeIblTexture, nmeIblSampler, refrV, clamp(refrLod, 0.0, maxLod)).rgb;\n let volumeAlbedo = nme_pbr_colorAtDistance(ssTintColor, refrTintAtDistance);\n let refrTransmittance = v3(refrIntensity) * nme_pbr_cocaLambert(volumeAlbedo, ssThickness);\n let finalRefractionRaw = envRefr * refrTransmittance * (v3(1.0) - refractionSpecEnvReflectance);\n let refractionOpacity = 1.0 - refrIntensity;`\n : `let finalRefractionRaw = v3(0.0);\nlet refractionOpacity = 1.0;`;\n const ssPart = useSubsurface\n ? `// Translucency: back-scattered SH irradiance with Burley transmittance.\n let nN_raw = -N;\n let nN_env = v3(nN_raw.x * cosA + nN_raw.z * sinA, nN_raw.y, -nN_raw.x * sinA + nN_raw.z * cosA);\n let backIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * nN_env.y + sceneU.vSphericalL10.xyz * nN_env.z + sceneU.vSphericalL11.xyz * nN_env.x\n + sceneU.vSphericalL2_2.xyz * (nN_env.y * nN_env.x) + sceneU.vSphericalL2_1.xyz * (nN_env.y * nN_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * nN_env.z * nN_env.z - 1.0) + sceneU.vSphericalL21.xyz * (nN_env.z * nN_env.x)\n + sceneU.vSphericalL22.xyz * (nN_env.x * nN_env.x - nN_env.y * nN_env.y));\n let ssRefractionIrradiance = backIrradiance * ssTransmittance;\n finalIrradiance = finalIrradiance * refractionOpacity;\n finalIrradiance = finalIrradiance * (1.0 - translucencyIntensity);`\n : `let ssRefractionIrradiance = v3(0.0);\nfinalIrradiance = finalIrradiance * refractionOpacity;`;\n return `${refrPart}\n${ssPart}\nlet finalRefraction = finalRefractionRaw;`;\n}\n\nexport function buildPbrMrHelperFull(request: NodePbrMrHelperRequest): string {\n return HELPER_WGSL(\n request.useEnv,\n request.useClearcoat,\n request.useSheen,\n request.useRefraction,\n request.useSubsurface,\n request.useAnisotropy,\n request.useIridescence,\n request.useShAlbedoScaling,\n request.useCcBump,\n request.useCcTint,\n request.useSpecularAA,\n request.remapClearcoatF0\n );\n}\n\nfunction HELPER_WGSL(\n useEnv: boolean,\n useClearcoat: boolean,\n useSheen: boolean,\n useRefraction: boolean,\n useSubsurface: boolean,\n useAnisotropy: boolean,\n useIridescence: boolean,\n useShAlbedoScaling: boolean,\n useCcBump: boolean,\n useCcTint: boolean,\n useSpecularAA: boolean,\n remapClearcoatF0: boolean\n): string {\n const ccDecls = useClearcoat\n ? `let ccIntensity = clamp(ccIntensityIn, 0.0, 1.0);\nlet ccRough = clamp(ccRoughnessIn, 0.0, 1.0);\nlet ccF0_raw = (ccIor - 1.0) / (ccIor + 1.0);\nlet ccF0 = ccF0_raw * ccF0_raw;\nvar ccDirectSpecAcc = v3(0.0);`\n : `let ccDirectSpecAcc = v3(0.0);`;\n\n const ccAlphaSetup = useClearcoat\n ? `var ccAA_factor_y = 0.0;\n${\n useSpecularAA\n ? `{ let ccNdfdx_AA = dpdx(ccNormalW);\nlet ccNdfdy_AA = dpdy(ccNormalW);\nlet ccSlopeSquare_AA = max(dot(ccNdfdx_AA, ccNdfdx_AA), dot(ccNdfdy_AA, ccNdfdy_AA));\nccAA_factor_y = sqrt(ccSlopeSquare_AA) * 0.75; }`\n : ``\n}\nlet ccAlphaG = ccRough * ccRough + 0.0005 + ccAA_factor_y;`\n : ``;\n\n const ccNormalSetup = useClearcoat\n ? useCcBump\n ? `let ccNormalW = nme_perturbNormal(worldPos, Ng, ccBumpUv, ccBumpColor, 1.0);\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = Ng;\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = N;\nlet ccNdotV: f32 = 0.0;`;\n\n const shDecls = useSheen\n ? `let shIntensityRaw = clamp(shIntensityIn, 0.0, 1.0);\n${\n useShAlbedoScaling\n ? `let shIntensity = shIntensityRaw;`\n : `let reflectanceF0 = max(colorF0.r, max(colorF0.g, colorF0.b));\nlet shIntensity = shIntensityRaw * (1.0 - reflectanceF0);`\n}\nlet shRough = clamp(shRoughnessIn, 0.0, 1.0);\nlet shAlphaG = shRough * shRough + 0.0005;\nlet shColorScaled = shColorIn * shIntensity;\nvar shDirectAcc = v3(0.0);`\n : `let shDirectAcc = v3(0.0);`;\n\n const shIblTerm =\n useEnv && useSheen\n ? `let shSpecLod = log2(cubemapDim * shAlphaG) * sceneU.vImageInfos.z;\n let shEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(shSpecLod, 0.0, maxLod)).rgb;\n let shBrdfBlue = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, shRough)).b;\n let shFinalIbl = shEnvRadiance * shColorScaled * shBrdfBlue * seo * eho;\n ${\n useShAlbedoScaling\n ? `// SHEEN_ALBEDOSCALING: surface albedo and base specular scale by (1 - shInt × max(shColor) × envSheenBrdf.b).\n let shAlbedoScaling = 1.0 - shIntensity * max(max(shColorIn.r, shColorIn.g), shColorIn.b) * shBrdfBlue;`\n : `let shAlbedoScaling: f32 = 1.0;`\n }`\n : `let shFinalIbl = v3(0.0);\nlet shAlbedoScaling: f32 = 1.0;`;\n\n const directSpecR0Decl =\n useClearcoat && remapClearcoatF0\n ? `let _directF0S = sqrt(max(colorF0, v3(0.0)));\nlet _directF0T = ((1.0 - ccIor) + (1.0 + ccIor) * _directF0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _directF0S);\nlet directSpecR0 = mix(colorF0, clamp(_directF0T * _directF0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let directSpecR0 = colorF0;`;\n\n const shIblScale = useClearcoat ? ` * ccConsIBL${useCcTint ? \" * ccAbsorption\" : \"\"}` : \"\";\n const refrCcScale = useClearcoat ? \" * ccConsIBL\" : \"\";\n const ccIblPre = useClearcoat\n ? `let ccFresnelIBL = nme_pbr_ccSchlick(ccF0, ccNdotV);\n let ccConsIBL = 1.0 - ccFresnelIBL * ccIntensity;\n let ccBrdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(ccNdotV, ccRough)).rgb;\n let ccSpecEnvReflRaw = (v3(ccF0) * ccBrdfSample.y + (v3(1.0) - v3(ccF0)) * ccBrdfSample.x) * ccIntensity;\n let ccEnergyConservation = 1.0 + _coloredR0 * (1.0 / max(ccBrdfSample.y, 0.001) - 1.0);\n let ccEhoT = clamp(1.0 + 1.1 * dot(reflect(-V, ccNormalW), Ng), 0.0, 1.0);\n let ccSpecEnvRefl = ccSpecEnvReflRaw * (ccEhoT * ccEhoT);\n let ccSpecLod = log2(cubemapDim * ccAlphaG) * sceneU.vImageInfos.z;\n let ccR_raw = reflect(-V, ccNormalW);\n let ccR = v3(ccR_raw.x * cosA + ccR_raw.z * sinA, ccR_raw.y, -ccR_raw.x * sinA + ccR_raw.z * cosA);\n let ccEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, ccR, clamp(ccSpecLod, 0.0, maxLod)).rgb;\n ${\n useCcTint\n ? `// Clearcoat absorption: BJS Beer-Lambert path length through the coat.\n let ccAbsorption = mix(v3(1.0), nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotVRefract + ccNdotVRefract) / (ccNdotVRefract * ccNdotVRefract))), v3(ccIntensity));`\n : `let ccAbsorption = v3(1.0);`\n }\n let ccFinalRadiance = ccEnvRadiance * ccSpecEnvRefl;`\n : ``;\n const ccTintScale = useCcTint ? \" * ccAbsorption\" : \"\";\n const ccIblFinal = useClearcoat\n ? `${ccIblPre}\n${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ finalRadianceScaled * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ ssRefractionIrradiance * ao_c\n+ finalSpecularScaledDirect * shAlbedoScaling\n+ diffuseAcc * shAlbedoScaling\n+ diffuseTransmissionAcc\n+ ccDirectSpecAcc * ccEnergyConservation\n+ ccFinalRadiance\n+ shDirectAcc\n+ shFinalIbl${shIblScale}\n+ finalRefraction${refrCcScale}${ccTintScale};`\n : `${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`;\n\n const ccDirectFinal = useClearcoat\n ? `r.lighting = diffuseAcc + specAcc + diffuseTransmissionAcc + ccDirectSpecAcc + shDirectAcc;`\n : `r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n const refractionSpecEnvReflectanceDecl = useRefraction ? `let refractionSpecEnvReflectance = baseSpecEnvReflectance;` : ``;\n\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = ${useAnisotropy ? \"aniN\" : \"N\"};\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n ${\n useClearcoat && remapClearcoatF0\n ? `let _f0S = sqrt(max(colorF0, v3(0.0)));\n let _f0T = ((1.0 - ccIor) + (1.0 + ccIor) * _f0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _f0S);\n let _coloredR0 = mix(colorF0, clamp(_f0T * _f0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let _coloredR0 = colorF0;`\n }\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n ${refractionSpecEnvReflectanceDecl}\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n ${ssBlock(useSubsurface, useRefraction, useAnisotropy)}\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n ${ccIblFinal}`\n : `\nr.diffuseInd = v3(0.0);\nr.specularInd = v3(0.0);\n${ccDirectFinal}`;\n\n const ccSchlickFn = useClearcoat\n ? `fn nme_pbr_ccSchlick(f0: f32, cosTheta: f32) -> f32 {\nlet t = 1.0 - cosTheta;\nlet t2 = t * t;\nreturn f0 + (1.0 - f0) * (t2 * t2 * t);\n}\n`\n : ``;\n\n const charlieFn = useSheen\n ? `fn nme_pbr_charlieD(NdotH: f32, alphaG: f32) -> f32 {\nlet invR = 1.0 / max(alphaG, 0.0005);\nlet cos2h = NdotH * NdotH;\nlet sin2h = 1.0 - cos2h;\nreturn (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * NME_PBR_PI);\n}\n`\n : ``;\n\n const anisoFns = useAnisotropy\n ? `fn nme_pbr_anisoRoughness(alphaG: f32, anisotropy: f32) -> v2 {\nlet alphaT = max(alphaG * (1.0 + anisotropy), 0.0005);\nlet alphaB = max(alphaG * (1.0 - anisotropy), 0.0005);\nreturn v2(alphaT, alphaB);\n}\nfn nme_pbr_anisoBentNormal(T: v3, B: v3, N: v3, V: v3, anisotropy: f32) -> v3 {\nvar anisotropicFrameDirection = B;\nif (anisotropy < 0.0) {\nanisotropicFrameDirection = T;\n}\nlet anisoTan = cross(normalize(anisotropicFrameDirection), V);\nlet anisoNormal = cross(anisoTan, anisotropicFrameDirection);\nreturn normalize(mix(N, anisoNormal, abs(anisotropy)));\n}\nfn nme_pbr_burleyAnisoD(NdotH: f32, TdotH: f32, BdotH: f32, alphaTB: v2) -> f32 {\nlet a2 = alphaTB.x * alphaTB.y;\nlet v = v3(alphaTB.y * TdotH, alphaTB.x * BdotH, a2 * NdotH);\nlet v2 = dot(v, v);\nlet w2 = a2 / max(v2, 0.0000001);\nreturn a2 * w2 * w2 * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_visAnisoSmith(NdotL: f32, NdotV: f32, TdotV: f32, BdotV: f32, TdotL: f32, BdotL: f32, alphaTB: v2) -> f32 {\nlet lambdaV = NdotL * length(v3(alphaTB.x * TdotV, alphaTB.y * BdotV, NdotV));\nlet lambdaL = NdotV * length(v3(alphaTB.x * TdotL, alphaTB.y * BdotL, NdotL));\nreturn 0.5 / max(lambdaV + lambdaL, 0.0000001);\n}\n`\n : ``;\n\n const ssFns =\n useSubsurface || useRefraction || useCcTint\n ? `fn nme_pbr_transmittanceBurley(tintColor: v3, diffusionDist: v3, thickness: f32) -> v3 {\nlet S = v3(1.0) / max(diffusionDist, v3(0.0000001));\nlet temp = exp(-0.333333333 * thickness * S);\nreturn tintColor * 0.25 * (temp * temp * temp + 3.0 * temp);\n}\nfn nme_pbr_cocaLambert(volumeAlbedo: v3, distance: f32) -> v3 {\nreturn exp(-volumeAlbedo * distance);\n}\nfn nme_pbr_colorAtDistance(color: v3, distance: f32) -> v3 {\nreturn -log(color) / distance;\n}\n`\n : ``;\n\n const anisoSetup = useAnisotropy\n ? `let _adp1 = dpdx(worldPos);\nlet _adp2 = -dpdy(worldPos);\nlet _aduv1 = dpdx(anisoUv);\nlet _aduv2 = -dpdy(anisoUv);\nlet _adp2perp = cross(_adp2, Ng);\nlet _adp1perp = cross(Ng, _adp1);\nlet _atan = _adp2perp * _aduv1.x + _adp1perp * _aduv2.x;\nlet _abit = _adp2perp * _aduv1.y + _adp1perp * _aduv2.y;\nlet _adet = max(dot(_atan, _atan), dot(_abit, _abit));\nlet _ainvmax = select(0.0, inverseSqrt(_adet), _adet > 0.0);\nlet _aTBN0 = normalize(_atan * _ainvmax);\nlet _aTBN1 = normalize(_abit * _ainvmax);\nlet anisoIntensity = clamp(anisoIntensityIn, -1.0, 1.0);\nlet anisoDir = v3(anisoDirection, 0.0);\nlet anisoT_raw = _aTBN0 * anisoDir.x + _aTBN1 * anisoDir.y;\nlet anisoT = normalize(anisoT_raw);\nlet anisoB = normalize(cross(Ng, anisoT));\nlet aniAlphaTB = nme_pbr_anisoRoughness(alphaG, anisoIntensity);\nlet aniN = nme_pbr_anisoBentNormal(anisoT, anisoB, N, V, anisoIntensity);`\n : `let anisoT = v3(1.0, 0.0, 0.0);\nlet anisoB = v3(0.0, 0.0, 1.0);\nlet aniAlphaTB = v2(alphaG, alphaG);\nlet aniN = N;`;\n\n const specularAABlock = useSpecularAA\n ? `var AA_factor_x = 0.0;\nvar AA_factor_y = 0.0;\n{ let nDfdx_AA = dpdx(N);\nlet nDfdy_AA = dpdy(N);\nlet slopeSquare_AA = max(dot(nDfdx_AA, nDfdx_AA), dot(nDfdy_AA, nDfdy_AA));\nAA_factor_x = pow(saturate(slopeSquare_AA), 0.333);\nAA_factor_y = sqrt(slopeSquare_AA) * 0.75;\nalphaG = alphaG + AA_factor_y; }`\n : `let AA_factor_x = 0.0;\nlet AA_factor_y = 0.0;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\nlighting: v3,\ndiffuseDir: v3,\nspecularDir: v3,\ndiffuseInd: v3,\nspecularInd: v3,\nshadow: f32,\nlumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet d = NdotH * NdotH * (a2 - 1.0) + 1.0;\nreturn a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\nlet gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\nreturn 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\nlet t = 1.0 - c;\nlet t2 = t * t;\nreturn F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\nreturn albedo * (1.0 / NME_PBR_PI);\n}\n${ccSchlickFn}${charlieFn}${anisoFns}${ssFns}fn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n iridescenceIntensityIn: f32, iridescenceIorIn: f32, iridescenceThicknessIn: f32,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n ${specularAABlock}\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0Base = mix(dielectricF0, baseColor, metallic_c);\n let colorF0 = ${\n useIridescence\n ? `mix(colorF0Base, nme_pbr_evalIridescence(1.0, max(iridescenceIorIn, 1.0001), NdotV, max(iridescenceThicknessIn, 0.0), colorF0Base), clamp(iridescenceIntensityIn, 0.0, 1.0))`\n : `colorF0Base`\n };\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n ${anisoSetup}\n ${ccDecls}\n ${directSpecR0Decl}\n ${ccNormalSetup}\n ${ccAlphaSetup}\n ${shDecls}\n let translucencyIntensity = ${useSubsurface ? \"clamp(ssTranslucencyIntensityIn, 0.0, 1.0)\" : \"0.0\"};\n let ssTransmittance = ${useSubsurface ? \"nme_pbr_transmittanceBurley(ssTintColor, ssDiffusionDist, max(ssThickness, 0.0000001)) * translucencyIntensity\" : \"v3(0.0)\"};\n let directDiffuseTranslucencyScale = 1.0 - translucencyIntensity;\n ${\n useRefraction\n ? `// LEGACY_SPECULAR_ENERGY_CONSERVATION is on for BJS NME PBR-MR. When refraction\n let _refractionOpacityPre = 1.0 - clamp(refrIntensityIn, 0.0, 1.0);\n surfaceAlbedo = surfaceAlbedo * _refractionOpacityPre;`\n : ``\n }\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccHemiBlock(useClearcoat, useCcTint)}\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH_h = dot(anisoT, H_h);\n let BdotH_h = dot(anisoB, H_h);\n let TdotV_h = dot(anisoT, V);\n let BdotV_h = dot(anisoB, V);\n let TdotL_h = dot(anisoT, Ldir);\n let BdotL_h = dot(anisoB, Ldir);\n let D_h = nme_pbr_burleyAnisoD(NdotH_h, TdotH_h, BdotH_h, aniAlphaTB);\n let Vis_h = nme_pbr_visAnisoSmith(nl, NdotV, TdotV_h, BdotV_h, TdotL_h, BdotL_h, aniAlphaTB);\n specAcc = specAcc + cF_h * D_h * Vis_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;${shHemiBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccDirectBlock(useClearcoat, useCcTint)}\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH = dot(anisoT, H);\n let BdotH = dot(anisoB, H);\n let TdotV = dot(anisoT, V);\n let BdotV = dot(anisoB, V);\n let TdotL = dot(anisoT, L);\n let BdotL = dot(anisoB, L);\n let D = nme_pbr_burleyAnisoD(NdotH, TdotH, BdotH, aniAlphaTB);\n let Vis = nme_pbr_visAnisoSmith(NdotL, NdotV, TdotV, BdotV, TdotL, BdotL, aniAlphaTB);\n specAcc = specAcc + cF * D * Vis * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n }${shDirectBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling${useClearcoat ? ` * ccConsIBL${ccTintScale}` : ``}, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);${\n useClearcoat\n ? `\n let _ccLum = clamp(dot(ccFinalRadiance, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum + _ccLum;`\n : `\n r.lumOverAlpha = _radLum + _specLum;`\n }`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n","import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\nimport { buildPbrMrHelperFull } from \"./pbr-mr-helper-full.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const ccInputRef = block.inputs.get(\"clearcoat\")?.source;\n let ccIntensityExpr = \"0.0\";\n let ccRoughnessExpr = \"0.0\";\n let ccIorExpr = \"1.5\";\n let ccBumpExpr = \"v3(0.5, 0.5, 1.0)\";\n let ccBumpUvExpr = \"v2(0.0)\";\n let useCcBump = false;\n let ccTintColorExpr = \"v3(1.0)\";\n let ccTintAtDistanceExpr = \"1.0\";\n let ccTintThicknessExpr = \"0.0\";\n let useCcTint = false;\n let useClearcoat = false;\n let remapClearcoatF0 = false;\n if (ccInputRef) {\n const ccBlock = ctx.graph.blocks.get(ccInputRef.blockId);\n if (ccBlock && ccBlock.className === \"ClearCoatBlock\") {\n useClearcoat = true;\n remapClearcoatF0 = (ccBlock.serialized as { remapF0OnInterfaceChange?: boolean }).remapF0OnInterfaceChange === true;\n state.usesClearcoat = true;\n ctx.resolveOutput(ccBlock, ccInputRef.outputName, stage, state);\n ccIntensityExpr = resolveOptional(ccBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n ccRoughnessExpr = resolveOptional(ccBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx);\n ccIorExpr = resolveOptional(ccBlock, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n if (ccBlock.inputs.get(\"normalMapColor\")?.source) {\n useCcBump = true;\n ccBumpExpr = resolveOptional(ccBlock, \"normalMapColor\", \"v3(0.5, 0.5, 1.0)\", \"vec3f\", stage, state, ctx);\n const uvIn = ccBlock.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(ccBlock, \"uv\", stage, state);\n ccBumpUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n if (ccBlock.inputs.get(\"tintColor\")?.source) {\n useCcTint = true;\n ccTintColorExpr = resolveOptional(ccBlock, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ccTintAtDistanceExpr = resolveOptional(ccBlock, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n ccTintThicknessExpr = resolveOptional(ccBlock, \"tintThickness\", \"0.0\", \"f32\", stage, state, ctx);\n }\n }\n }\n const shInputRef = block.inputs.get(\"sheen\")?.source;\n let shIntensityExpr = \"0.0\";\n let shColorExpr = \"v3(1.0)\";\n let shRoughnessExpr = \"0.0\";\n let useSheen = false;\n let useShAlbedoScaling = false;\n if (shInputRef) {\n const shBlock = ctx.graph.blocks.get(shInputRef.blockId);\n if (shBlock && shBlock.className === \"SheenBlock\") {\n useSheen = true;\n state.usesSheen = true;\n useShAlbedoScaling = (shBlock.serialized as { albedoScaling?: boolean }).albedoScaling === true;\n ctx.resolveOutput(shBlock, shInputRef.outputName, stage, state);\n shIntensityExpr = resolveOptional(shBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n shColorExpr = resolveOptional(shBlock, \"color\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const shrIn = shBlock.inputs.get(\"roughness\");\n shRoughnessExpr = shrIn?.source\n ? resolveOptional(shBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx)\n : `clamp(${resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx)}, 0.0, 1.0)`;\n }\n }\n const ssInputRef = block.inputs.get(\"subsurface\")?.source;\n let useSubsurface = false;\n let useRefraction = false;\n let ssTintColorExpr = \"v3(1.0)\";\n let ssThicknessExpr = \"0.0\";\n let ssTranslucencyIntensityExpr = \"0.0\";\n let ssDiffusionDistExpr = \"v3(1.0)\";\n let refrIntensityExpr = \"0.0\";\n let refrIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n let refrTintAtDistanceExpr = \"1.0\";\n if (ssInputRef) {\n const ssBlk = ctx.graph.blocks.get(ssInputRef.blockId);\n if (ssBlk && ssBlk.className === \"SubSurfaceBlock\") {\n useSubsurface = true;\n state.usesSubsurface = true;\n ctx.resolveOutput(ssBlk, ssInputRef.outputName, stage, state);\n ssTintColorExpr = resolveOptional(ssBlk, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ssThicknessExpr = resolveOptional(ssBlk, \"thickness\", \"0.0\", \"f32\", stage, state, ctx);\n ssTranslucencyIntensityExpr = resolveOptional(ssBlk, \"translucencyIntensity\", \"0.0\", \"f32\", stage, state, ctx);\n ssDiffusionDistExpr = resolveOptional(ssBlk, \"translucencyDiffusionDist\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const refrInputRef = ssBlk.inputs.get(\"refraction\")?.source;\n if (refrInputRef) {\n const refrBlk = ctx.graph.blocks.get(refrInputRef.blockId);\n if (refrBlk && refrBlk.className === \"RefractionBlock\") {\n useRefraction = true;\n ctx.resolveOutput(refrBlk, refrInputRef.outputName, stage, state);\n refrIntensityExpr = resolveOptional(refrBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n refrTintAtDistanceExpr = resolveOptional(refrBlk, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n const volIor = refrBlk.inputs.get(\"volumeIndexOfRefraction\");\n if (volIor?.source) {\n refrIorExpr = resolveOptional(refrBlk, \"volumeIndexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n }\n }\n }\n }\n }\n const aniInputRef = block.inputs.get(\"anisotropy\")?.source;\n let useAnisotropy = false;\n let anisoIntensityExpr = \"0.0\";\n let anisoDirectionExpr = \"v2(1.0, 0.0)\";\n let anisoUvExpr = \"v2(0.0)\";\n if (aniInputRef) {\n const aniBlk = ctx.graph.blocks.get(aniInputRef.blockId);\n if (aniBlk && aniBlk.className === \"AnisotropyBlock\") {\n useAnisotropy = true;\n state.usesAnisotropy = true;\n ctx.resolveOutput(aniBlk, aniInputRef.outputName, stage, state);\n anisoIntensityExpr = resolveOptional(aniBlk, \"intensity\", \"0.0\", \"f32\", stage, state, ctx);\n anisoDirectionExpr = resolveOptional(aniBlk, \"direction\", \"v2(1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const dirIn = aniBlk.inputs.get(\"direction\");\n if (dirIn?.source) {\n const e = ctx.resolve(aniBlk, \"direction\", stage, state);\n anisoDirectionExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n const uvIn = aniBlk.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(aniBlk, \"uv\", stage, state);\n anisoUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n }\n const iriInputRef = block.inputs.get(\"iridescence\")?.source;\n let useIridescence = false;\n let iriIntensityExpr = \"1.0\";\n let iriIorExpr = \"1.3\";\n let iriThicknessExpr = \"400.0\";\n if (iriInputRef) {\n const iriBlk = ctx.graph.blocks.get(iriInputRef.blockId);\n if (iriBlk && iriBlk.className === \"IridescenceBlock\") {\n useIridescence = true;\n state.usesIridescence = true;\n ctx.resolveOutput(iriBlk, iriInputRef.outputName, stage, state);\n iriIntensityExpr = resolveOptional(iriBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n iriIorExpr = resolveOptional(iriBlk, \"indexOfRefraction\", \"1.3\", \"f32\", stage, state, ctx);\n iriThicknessExpr = resolveOptional(iriBlk, \"thickness\", \"400.0\", \"f32\", stage, state, ctx);\n }\n }\n const useSpecularAA = (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true;\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_${useClearcoat ? \"cc\" : \"nocc\"}_${remapClearcoatF0 ? \"ccF0R\" : \"ccF0\"}_${useSheen ? \"sh\" : \"nosh\"}_${useRefraction ? \"refr\" : \"norefr\"}_${useSubsurface ? \"ss\" : \"noss\"}_${useAnisotropy ? \"ani\" : \"noani\"}_${useIridescence ? \"iri\" : \"noiri\"}_${useShAlbedoScaling ? \"shAS\" : \"noShAS\"}_${useCcBump ? \"ccB\" : \"\"}_${useCcTint ? \"ccT\" : \"\"}_${useSpecularAA ? \"aa\" : \"noaa\"}`;\n state.fragment.helpers.set(\n helperKey,\n buildPbrMrHelperFull({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat,\n useSheen,\n useRefraction,\n useSubsurface,\n useAnisotropy,\n useIridescence,\n useShAlbedoScaling,\n useCcBump,\n useCcTint,\n useSpecularAA,\n remapClearcoatF0,\n })\n );\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, ${ccIntensityExpr}, ${ccRoughnessExpr}, ${ccIorExpr}, ${ccBumpExpr}, ${ccBumpUvExpr}, ${ccTintColorExpr}, ${ccTintAtDistanceExpr}, ${ccTintThicknessExpr}, ${shIntensityExpr}, ${shColorExpr}, ${shRoughnessExpr}, ${baseIorExpr}, ${refrIntensityExpr}, ${refrIorExpr}, ${refrTintAtDistanceExpr}, ${ssTintColorExpr}, ${ssThicknessExpr}, ${ssTranslucencyIntensityExpr}, ${ssDiffusionDistExpr}, ${anisoIntensityExpr}, ${anisoDirectionExpr}, ${anisoUvExpr}, ${iriIntensityExpr}, ${iriIorExpr}, ${iriThicknessExpr}, ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pbr-metallic-roughness-block-full-DD6zI_Lx.js","sources":["../src/material/node/blocks/pbr-mr-helper-full.ts","../src/material/node/blocks/pbr-metallic-roughness-block-full.ts"],"sourcesContent":["/** PBRMetallicRoughnessBlock — direct lighting + optional IBL + optional clearcoat + optional sheen.\n *\n * When the `reflection` input is connected (typically to a ReflectionBlock),\n * this emitter runs the GGX direct-lighting path PLUS a split-sum IBL\n * contribution (specular cube + BRDF LUT + SH irradiance).\n *\n * When the `clearcoat` input is connected (to a ClearCoatBlock), an extra\n * GGX clear-coat layer is added on top: per-light Schlick fresnel + Kelemen\n * visibility GGX specular, and the base layer (diffuse + specular + IBL)\n * is modulated by (1 - ccFresnel * ccIntensity).\n *\n * When the `sheen` input is connected (to a SheenBlock), an extra Charlie\n * NDF + Ashikhmin visibility cloth/velvet sheen layer is added: per-light\n * direct sheen contribution and a sheen IBL term that uses the BRDF LUT\n * blue channel for the sheen-roughness lookup.\n *\n * Outputs implemented (others stub to a zero vector):\n * - lighting / diffuseDir / specularDir / shadow / alpha\n * - diffuseInd / specularInd (only meaningful when IBL is on)\n */\n\nimport type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nfunction ccDirectBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n const NdotLcc = \"ccNdotL\";\n const declCcNdotL = `let ccNdotL = clamp(dot(ccNormalW, L), 0.0000001, 1.0);`;\n return `\n${declCcNdotL}\nif (${NdotLcc} > 0.0 && atten > 0.0) {\nlet ccH = normalize(V + L);\nlet ccNdotH = clamp(dot(${Ncc}, ccH), 0.0000001, 1.0);\nlet ccVdotH = saturate(dot(V, ccH));\nlet ccD = nme_pbr_distGGX(ccNdotH, ccAlphaG);\nlet ccVis = 0.25 / (ccVdotH * ccVdotH + 0.0000001);\nlet ccF_d = nme_pbr_ccSchlick(ccF0, ccVdotH);\nlet ccTerm = ccF_d * ccD * ccVis * ${NdotLcc};\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm) * color * atten * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_d * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract = -refract(L, ${Ncc}, ccIorInv);\nlet ccNdotLRefract = clamp(dot(${Ncc}, ccLRefract), 0.0000001, 1.0);\nlet ccDirectAbsorption = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract + ccNdotVRefract) / (ccNdotLRefract * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction ccHemiBlock(useClearcoat: boolean, useCcTint: boolean): string {\n if (!useClearcoat) {\n return \"\";\n }\n const Ncc = \"ccNormalW\";\n return `\nlet ccNdotL_h = clamp(dot(${Ncc}, Ldir), 0.0000001, 1.0);\nif (nl > 0.0) {\nlet ccH_h = normalize(V + Ldir);\nlet ccNdotH_h = clamp(dot(${Ncc}, ccH_h), 0.0000001, 1.0);\nlet ccVdotH_h = saturate(dot(V, ccH_h));\nlet ccD_h = nme_pbr_distGGX(ccNdotH_h, ccAlphaG);\nlet ccVis_h = 0.25 / (ccVdotH_h * ccVdotH_h + 0.0000001);\nlet ccF_h = nme_pbr_ccSchlick(ccF0, ccVdotH_h);\nlet ccTerm_h = ccF_h * ccD_h * ccVis_h * ccNdotL_h;\nccDirectSpecAcc = ccDirectSpecAcc + v3(ccTerm_h) * entry.vLightDiffuse.rgb * ccIntensity * sh;\nbaseLayerAtten = 1.0 - ccF_h * ccIntensity;\n${\n useCcTint\n ? `let ccLRefract_h = -refract(Ldir, ${Ncc}, ccIorInv);\nlet ccNdotLRefract_h = clamp(dot(${Ncc}, ccLRefract_h), 0.0000001, 1.0);\nlet ccDirectAbsorption_h = nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotLRefract_h + ccNdotVRefract) / (ccNdotLRefract_h * ccNdotVRefract)));\nbaseLayerAbsorption = mix(v3(1.0), ccDirectAbsorption_h, v3(ccIntensity));`\n : ``\n}\n}`;\n}\n\nfunction shDirectBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (NdotL > 0.0 && atten > 0.0) {\nlet shH = normalize(V + L);\nlet shNdotH = clamp(dot(N, shH), 0.0000001, 1.0);\nlet shD = nme_pbr_charlieD(shNdotH, shAlphaG);\nlet shV = 1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD * shV * NdotL * color * atten * sh * baseLayerAtten;\n}`;\n}\n\nfunction shHemiBlock(useSheen: boolean): string {\n if (!useSheen) {\n return \"\";\n }\n return `\nif (nl > 0.0) {\nlet shH_h = normalize(V + Ldir);\nlet shNdotH_h = clamp(dot(N, shH_h), 0.0000001, 1.0);\nlet shD_h = nme_pbr_charlieD(shNdotH_h, shAlphaG);\nlet shV_h = 1.0 / (4.0 * (nl + NdotV - nl * NdotV) + 0.0000001);\nshDirectAcc = shDirectAcc + shColorScaled * shD_h * shV_h * nl * entry.vLightSpecular.rgb * sh * baseLayerAtten;\n}`;\n}\n\n/** Subsurface IBL block — runs inside the env IBL section. Computes refraction\n * (refract V through N, sample env at refractionLOD, apply Coca-Lambert tint\n * absorption + reflectance complement) and translucency (back-scattered SH\n * irradiance with Burley transmittance). Contributes:\n * - finalRefraction (vec3, added to lighting)\n * - refractionOpacity (f32, scales finalIrradiance: 1 - refrIntensity)\n * - mutates finalIrradiance to include refractionIrradiance + (1-translucency) scale.\n *\n * Always declares finalRefraction/refractionOpacity even when sub-features are\n * off so the downstream composition can reference them unconditionally. */\nfunction ssBlock(useSubsurface: boolean, useRefraction: boolean, useAnisotropy: boolean): string {\n if (!useSubsurface && !useRefraction) {\n return `let finalRefraction = v3(0.0);\nlet refractionOpacity = 1.0;\nlet ssRefractionIrradiance = v3(0.0);`;\n }\n const refrPart = useRefraction\n ? `// Refraction: refract V through N at IOR, sample env at refraction LOD.\n let refrIntensity = clamp(refrIntensityIn, 0.0, 1.0);\n let invIor = 1.0 / max(refrIor, 1.0001);\n let refrV_raw = refract(-V, ${useAnisotropy ? \"aniN\" : \"N\"}, invIor);\n let refrV = v3(refrV_raw.x * cosA + refrV_raw.z * sinA, refrV_raw.y, -refrV_raw.x * sinA + refrV_raw.z * cosA);\n let refrAlphaG = mix(alphaG, 0.0, clamp(invIor * 3.0 - 2.0, 0.0, 1.0));\n let refrLod = log2(cubemapDim * refrAlphaG) * sceneU.vImageInfos.z;\n let envRefr = textureSampleLevel(nmeIblTexture, nmeIblSampler, refrV, clamp(refrLod, 0.0, maxLod)).rgb;\n let volumeAlbedo = nme_pbr_colorAtDistance(ssTintColor, refrTintAtDistance);\n let refrTransmittance = v3(refrIntensity) * nme_pbr_cocaLambert(volumeAlbedo, ssThickness);\n let finalRefractionRaw = envRefr * refrTransmittance * (v3(1.0) - refractionSpecEnvReflectance);\n let refractionOpacity = 1.0 - refrIntensity;`\n : `let finalRefractionRaw = v3(0.0);\nlet refractionOpacity = 1.0;`;\n const ssPart = useSubsurface\n ? `// Translucency: back-scattered SH irradiance with Burley transmittance.\n let nN_raw = -N;\n let nN_env = v3(nN_raw.x * cosA + nN_raw.z * sinA, nN_raw.y, -nN_raw.x * sinA + nN_raw.z * cosA);\n let backIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * nN_env.y + sceneU.vSphericalL10.xyz * nN_env.z + sceneU.vSphericalL11.xyz * nN_env.x\n + sceneU.vSphericalL2_2.xyz * (nN_env.y * nN_env.x) + sceneU.vSphericalL2_1.xyz * (nN_env.y * nN_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * nN_env.z * nN_env.z - 1.0) + sceneU.vSphericalL21.xyz * (nN_env.z * nN_env.x)\n + sceneU.vSphericalL22.xyz * (nN_env.x * nN_env.x - nN_env.y * nN_env.y));\n let ssRefractionIrradiance = backIrradiance * ssTransmittance;\n finalIrradiance = finalIrradiance * refractionOpacity;\n finalIrradiance = finalIrradiance * (1.0 - translucencyIntensity);`\n : `let ssRefractionIrradiance = v3(0.0);\nfinalIrradiance = finalIrradiance * refractionOpacity;`;\n return `${refrPart}\n${ssPart}\nlet finalRefraction = finalRefractionRaw;`;\n}\n\nexport function buildPbrMrHelperFull(request: NodePbrMrHelperRequest): string {\n return HELPER_WGSL(\n request.useEnv,\n request.useClearcoat,\n request.useSheen,\n request.useRefraction,\n request.useSubsurface,\n request.useAnisotropy,\n request.useIridescence,\n request.useShAlbedoScaling,\n request.useCcBump,\n request.useCcTint,\n request.useSpecularAA,\n request.remapClearcoatF0\n );\n}\n\nfunction HELPER_WGSL(\n useEnv: boolean,\n useClearcoat: boolean,\n useSheen: boolean,\n useRefraction: boolean,\n useSubsurface: boolean,\n useAnisotropy: boolean,\n useIridescence: boolean,\n useShAlbedoScaling: boolean,\n useCcBump: boolean,\n useCcTint: boolean,\n useSpecularAA: boolean,\n remapClearcoatF0: boolean\n): string {\n const ccDecls = useClearcoat\n ? `let ccIntensity = clamp(ccIntensityIn, 0.0, 1.0);\nlet ccRough = clamp(ccRoughnessIn, 0.0, 1.0);\nlet ccF0_raw = (ccIor - 1.0) / (ccIor + 1.0);\nlet ccF0 = ccF0_raw * ccF0_raw;\nvar ccDirectSpecAcc = v3(0.0);`\n : `let ccDirectSpecAcc = v3(0.0);`;\n\n const ccAlphaSetup = useClearcoat\n ? `var ccAA_factor_y = 0.0;\n${\n useSpecularAA\n ? `{ let ccNdfdx_AA = dpdx(ccNormalW);\nlet ccNdfdy_AA = dpdy(ccNormalW);\nlet ccSlopeSquare_AA = max(dot(ccNdfdx_AA, ccNdfdx_AA), dot(ccNdfdy_AA, ccNdfdy_AA));\nccAA_factor_y = sqrt(ccSlopeSquare_AA) * 0.75; }`\n : ``\n}\nlet ccAlphaG = ccRough * ccRough + 0.0005 + ccAA_factor_y;`\n : ``;\n\n const ccNormalSetup = useClearcoat\n ? useCcBump\n ? `let ccNormalW = nme_perturbNormal(worldPos, Ng, ccBumpUv, ccBumpColor, 1.0);\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = Ng;\nlet ccNdotV = abs(dot(ccNormalW, V)) + 0.0000001;${\n useCcTint\n ? `\nlet ccIorInv = 1.0 / max(ccIor, 1.0001);\nlet ccAbsorptionColor = nme_pbr_colorAtDistance(max(ccTintColor, v3(0.0000001)), max(ccTintAtDistance, 0.0000001));\nlet ccVRefract = refract(-V, ccNormalW, ccIorInv);\nlet ccNdotVRefract = abs(dot(ccNormalW, ccVRefract)) + 0.0000001;`\n : ``\n }`\n : `let ccNormalW = N;\nlet ccNdotV: f32 = 0.0;`;\n\n const shDecls = useSheen\n ? `let shIntensityRaw = clamp(shIntensityIn, 0.0, 1.0);\n${\n useShAlbedoScaling\n ? `let shIntensity = shIntensityRaw;`\n : `let reflectanceF0 = max(colorF0.r, max(colorF0.g, colorF0.b));\nlet shIntensity = shIntensityRaw * (1.0 - reflectanceF0);`\n}\nlet shRough = clamp(shRoughnessIn, 0.0, 1.0);\nlet shAlphaG = shRough * shRough + 0.0005;\nlet shColorScaled = shColorIn * shIntensity;\nvar shDirectAcc = v3(0.0);`\n : `let shDirectAcc = v3(0.0);`;\n\n const shIblTerm =\n useEnv && useSheen\n ? `let shSpecLod = log2(cubemapDim * shAlphaG) * sceneU.vImageInfos.z;\n let shEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(shSpecLod, 0.0, maxLod)).rgb;\n let shBrdfBlue = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, shRough)).b;\n let shFinalIbl = shEnvRadiance * shColorScaled * shBrdfBlue * seo * eho;\n ${\n useShAlbedoScaling\n ? `// SHEEN_ALBEDOSCALING: surface albedo and base specular scale by (1 - shInt × max(shColor) × envSheenBrdf.b).\n let shAlbedoScaling = 1.0 - shIntensity * max(max(shColorIn.r, shColorIn.g), shColorIn.b) * shBrdfBlue;`\n : `let shAlbedoScaling: f32 = 1.0;`\n }`\n : `let shFinalIbl = v3(0.0);\nlet shAlbedoScaling: f32 = 1.0;`;\n\n const directSpecR0Decl =\n useClearcoat && remapClearcoatF0\n ? `let _directF0S = sqrt(max(colorF0, v3(0.0)));\nlet _directF0T = ((1.0 - ccIor) + (1.0 + ccIor) * _directF0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _directF0S);\nlet directSpecR0 = mix(colorF0, clamp(_directF0T * _directF0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let directSpecR0 = colorF0;`;\n\n const shIblScale = useClearcoat ? ` * ccConsIBL${useCcTint ? \" * ccAbsorption\" : \"\"}` : \"\";\n const refrCcScale = useClearcoat ? \" * ccConsIBL\" : \"\";\n const ccIblPre = useClearcoat\n ? `let ccFresnelIBL = nme_pbr_ccSchlick(ccF0, ccNdotV);\n let ccConsIBL = 1.0 - ccFresnelIBL * ccIntensity;\n let ccBrdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(ccNdotV, ccRough)).rgb;\n let ccSpecEnvReflRaw = (v3(ccF0) * ccBrdfSample.y + (v3(1.0) - v3(ccF0)) * ccBrdfSample.x) * ccIntensity;\n let ccEnergyConservation = 1.0 + _coloredR0 * (1.0 / max(ccBrdfSample.y, 0.001) - 1.0);\n let ccEhoT = clamp(1.0 + 1.1 * dot(reflect(-V, ccNormalW), Ng), 0.0, 1.0);\n let ccSpecEnvRefl = ccSpecEnvReflRaw * (ccEhoT * ccEhoT);\n let ccSpecLod = log2(cubemapDim * ccAlphaG) * sceneU.vImageInfos.z;\n let ccR_raw = reflect(-V, ccNormalW);\n let ccR = v3(ccR_raw.x * cosA + ccR_raw.z * sinA, ccR_raw.y, -ccR_raw.x * sinA + ccR_raw.z * cosA);\n let ccEnvRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, ccR, clamp(ccSpecLod, 0.0, maxLod)).rgb;\n ${\n useCcTint\n ? `// Clearcoat absorption: BJS Beer-Lambert path length through the coat.\n let ccAbsorption = mix(v3(1.0), nme_pbr_cocaLambert(ccAbsorptionColor, ccTintThickness * ((ccNdotVRefract + ccNdotVRefract) / (ccNdotVRefract * ccNdotVRefract))), v3(ccIntensity));`\n : `let ccAbsorption = v3(1.0);`\n }\n let ccFinalRadiance = ccEnvRadiance * ccSpecEnvRefl;`\n : ``;\n const ccTintScale = useCcTint ? \" * ccAbsorption\" : \"\";\n const ccIblFinal = useClearcoat\n ? `${ccIblPre}\n${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ finalRadianceScaled * shAlbedoScaling * ccConsIBL${ccTintScale}\n+ ssRefractionIrradiance * ao_c\n+ finalSpecularScaledDirect * shAlbedoScaling\n+ diffuseAcc * shAlbedoScaling\n+ diffuseTransmissionAcc\n+ ccDirectSpecAcc * ccEnergyConservation\n+ ccFinalRadiance\n+ shDirectAcc\n+ shFinalIbl${shIblScale}\n+ finalRefraction${refrCcScale}${ccTintScale};`\n : `${shIblTerm}\nr.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`;\n\n const ccDirectFinal = useClearcoat\n ? `r.lighting = diffuseAcc + specAcc + diffuseTransmissionAcc + ccDirectSpecAcc + shDirectAcc;`\n : `r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n const refractionSpecEnvReflectanceDecl = useRefraction ? `let refractionSpecEnvReflectance = baseSpecEnvReflectance;` : ``;\n\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = ${useAnisotropy ? \"aniN\" : \"N\"};\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n ${\n useClearcoat && remapClearcoatF0\n ? `let _f0S = sqrt(max(colorF0, v3(0.0)));\n let _f0T = ((1.0 - ccIor) + (1.0 + ccIor) * _f0S) / ((1.0 + ccIor) + (1.0 - ccIor) * _f0S);\n let _coloredR0 = mix(colorF0, clamp(_f0T * _f0T, v3(0.0), v3(1.0)), ccIntensity);`\n : `let _coloredR0 = colorF0;`\n }\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n ${refractionSpecEnvReflectanceDecl}\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n ${ssBlock(useSubsurface, useRefraction, useAnisotropy)}\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n ${ccIblFinal}`\n : `\nr.diffuseInd = v3(0.0);\nr.specularInd = v3(0.0);\n${ccDirectFinal}`;\n\n const ccSchlickFn = useClearcoat\n ? `fn nme_pbr_ccSchlick(f0: f32, cosTheta: f32) -> f32 {\nlet t = 1.0 - cosTheta;\nlet t2 = t * t;\nreturn f0 + (1.0 - f0) * (t2 * t2 * t);\n}\n`\n : ``;\n\n const charlieFn = useSheen\n ? `fn nme_pbr_charlieD(NdotH: f32, alphaG: f32) -> f32 {\nlet invR = 1.0 / max(alphaG, 0.0005);\nlet cos2h = NdotH * NdotH;\nlet sin2h = 1.0 - cos2h;\nreturn (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * NME_PBR_PI);\n}\n`\n : ``;\n\n const anisoFns = useAnisotropy\n ? `fn nme_pbr_anisoRoughness(alphaG: f32, anisotropy: f32) -> v2 {\nlet alphaT = max(alphaG * (1.0 + anisotropy), 0.0005);\nlet alphaB = max(alphaG * (1.0 - anisotropy), 0.0005);\nreturn v2(alphaT, alphaB);\n}\nfn nme_pbr_anisoBentNormal(T: v3, B: v3, N: v3, V: v3, anisotropy: f32) -> v3 {\nvar anisotropicFrameDirection = B;\nif (anisotropy < 0.0) {\nanisotropicFrameDirection = T;\n}\nlet anisoTan = cross(normalize(anisotropicFrameDirection), V);\nlet anisoNormal = cross(anisoTan, anisotropicFrameDirection);\nreturn normalize(mix(N, anisoNormal, abs(anisotropy)));\n}\nfn nme_pbr_burleyAnisoD(NdotH: f32, TdotH: f32, BdotH: f32, alphaTB: v2) -> f32 {\nlet a2 = alphaTB.x * alphaTB.y;\nlet v = v3(alphaTB.y * TdotH, alphaTB.x * BdotH, a2 * NdotH);\nlet v2 = dot(v, v);\nlet w2 = a2 / max(v2, 0.0000001);\nreturn a2 * w2 * w2 * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_visAnisoSmith(NdotL: f32, NdotV: f32, TdotV: f32, BdotV: f32, TdotL: f32, BdotL: f32, alphaTB: v2) -> f32 {\nlet lambdaV = NdotL * length(v3(alphaTB.x * TdotV, alphaTB.y * BdotV, NdotV));\nlet lambdaL = NdotV * length(v3(alphaTB.x * TdotL, alphaTB.y * BdotL, NdotL));\nreturn 0.5 / max(lambdaV + lambdaL, 0.0000001);\n}\n`\n : ``;\n\n const ssFns =\n useSubsurface || useRefraction || useCcTint\n ? `fn nme_pbr_transmittanceBurley(tintColor: v3, diffusionDist: v3, thickness: f32) -> v3 {\nlet S = v3(1.0) / max(diffusionDist, v3(0.0000001));\nlet temp = exp(-0.333333333 * thickness * S);\nreturn tintColor * 0.25 * (temp * temp * temp + 3.0 * temp);\n}\nfn nme_pbr_cocaLambert(volumeAlbedo: v3, distance: f32) -> v3 {\nreturn exp(-volumeAlbedo * distance);\n}\nfn nme_pbr_colorAtDistance(color: v3, distance: f32) -> v3 {\nreturn -log(color) / distance;\n}\n`\n : ``;\n\n const anisoSetup = useAnisotropy\n ? `let _adp1 = dpdx(worldPos);\nlet _adp2 = -dpdy(worldPos);\nlet _aduv1 = dpdx(anisoUv);\nlet _aduv2 = -dpdy(anisoUv);\nlet _adp2perp = cross(_adp2, Ng);\nlet _adp1perp = cross(Ng, _adp1);\nlet _atan = _adp2perp * _aduv1.x + _adp1perp * _aduv2.x;\nlet _abit = _adp2perp * _aduv1.y + _adp1perp * _aduv2.y;\nlet _adet = max(dot(_atan, _atan), dot(_abit, _abit));\nlet _ainvmax = select(0.0, inverseSqrt(_adet), _adet > 0.0);\nlet _aTBN0 = normalize(_atan * _ainvmax);\nlet _aTBN1 = normalize(_abit * _ainvmax);\nlet anisoIntensity = clamp(anisoIntensityIn, -1.0, 1.0);\nlet anisoDir = v3(anisoDirection, 0.0);\nlet anisoT_raw = _aTBN0 * anisoDir.x + _aTBN1 * anisoDir.y;\nlet anisoT = normalize(anisoT_raw);\nlet anisoB = normalize(cross(Ng, anisoT));\nlet aniAlphaTB = nme_pbr_anisoRoughness(alphaG, anisoIntensity);\nlet aniN = nme_pbr_anisoBentNormal(anisoT, anisoB, N, V, anisoIntensity);`\n : `let anisoT = v3(1.0, 0.0, 0.0);\nlet anisoB = v3(0.0, 0.0, 1.0);\nlet aniAlphaTB = v2(alphaG, alphaG);\nlet aniN = N;`;\n\n const specularAABlock = useSpecularAA\n ? `var AA_factor_x = 0.0;\nvar AA_factor_y = 0.0;\n{ let nDfdx_AA = dpdx(N);\nlet nDfdy_AA = dpdy(N);\nlet slopeSquare_AA = max(dot(nDfdx_AA, nDfdx_AA), dot(nDfdy_AA, nDfdy_AA));\nAA_factor_x = pow(saturate(slopeSquare_AA), 0.333);\nAA_factor_y = sqrt(slopeSquare_AA) * 0.75;\nalphaG = alphaG + AA_factor_y; }`\n : `let AA_factor_x = 0.0;\nlet AA_factor_y = 0.0;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\nlighting: v3,\ndiffuseDir: v3,\nspecularDir: v3,\ndiffuseInd: v3,\nspecularInd: v3,\nshadow: f32,\nlumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet d = NdotH * NdotH * (a2 - 1.0) + 1.0;\nreturn a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\nlet a2 = alphaG * alphaG;\nlet gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\nlet gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\nreturn 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\nlet t = 1.0 - c;\nlet t2 = t * t;\nreturn F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\nreturn albedo * (1.0 / NME_PBR_PI);\n}\n${ccSchlickFn}${charlieFn}${anisoFns}${ssFns}fn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n iridescenceIntensityIn: f32, iridescenceIorIn: f32, iridescenceThicknessIn: f32,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n ${specularAABlock}\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0Base = mix(dielectricF0, baseColor, metallic_c);\n let colorF0 = ${\n useIridescence\n ? `mix(colorF0Base, nme_pbr_evalIridescence(1.0, max(iridescenceIorIn, 1.0001), NdotV, max(iridescenceThicknessIn, 0.0), colorF0Base), clamp(iridescenceIntensityIn, 0.0, 1.0))`\n : `colorF0Base`\n };\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n ${anisoSetup}\n ${ccDecls}\n ${directSpecR0Decl}\n ${ccNormalSetup}\n ${ccAlphaSetup}\n ${shDecls}\n let translucencyIntensity = ${useSubsurface ? \"clamp(ssTranslucencyIntensityIn, 0.0, 1.0)\" : \"0.0\"};\n let ssTransmittance = ${useSubsurface ? \"nme_pbr_transmittanceBurley(ssTintColor, ssDiffusionDist, max(ssThickness, 0.0000001)) * translucencyIntensity\" : \"v3(0.0)\"};\n let directDiffuseTranslucencyScale = 1.0 - translucencyIntensity;\n ${\n useRefraction\n ? `// LEGACY_SPECULAR_ENERGY_CONSERVATION is on for BJS NME PBR-MR. When refraction\n let _refractionOpacityPre = 1.0 - clamp(refrIntensityIn, 0.0, 1.0);\n surfaceAlbedo = surfaceAlbedo * _refractionOpacityPre;`\n : ``\n }\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccHemiBlock(useClearcoat, useCcTint)}\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH_h = dot(anisoT, H_h);\n let BdotH_h = dot(anisoB, H_h);\n let TdotV_h = dot(anisoT, V);\n let BdotV_h = dot(anisoB, V);\n let TdotL_h = dot(anisoT, Ldir);\n let BdotL_h = dot(anisoB, Ldir);\n let D_h = nme_pbr_burleyAnisoD(NdotH_h, TdotH_h, BdotH_h, aniAlphaTB);\n let Vis_h = nme_pbr_visAnisoSmith(nl, NdotV, TdotV_h, BdotV_h, TdotL_h, BdotL_h, aniAlphaTB);\n specAcc = specAcc + cF_h * D_h * Vis_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;${shHemiBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);${ccDirectBlock(useClearcoat, useCcTint)}\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n ${\n useAnisotropy\n ? `let TdotH = dot(anisoT, H);\n let BdotH = dot(anisoB, H);\n let TdotV = dot(anisoT, V);\n let BdotV = dot(anisoB, V);\n let TdotL = dot(anisoT, L);\n let BdotL = dot(anisoB, L);\n let D = nme_pbr_burleyAnisoD(NdotH, TdotH, BdotH, aniAlphaTB);\n let Vis = nme_pbr_visAnisoSmith(NdotL, NdotV, TdotV, BdotV, TdotL, BdotL, aniAlphaTB);\n specAcc = specAcc + cF * D * Vis * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n : `let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;`\n }\n }${shDirectBlock(useSheen)}\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling${useClearcoat ? ` * ccConsIBL${ccTintScale}` : ``}, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);${\n useClearcoat\n ? `\n let _ccLum = clamp(dot(ccFinalRadiance, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum + _ccLum;`\n : `\n r.lumOverAlpha = _radLum + _specLum;`\n }`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n","import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\nimport { buildPbrMrHelperFull } from \"./pbr-mr-helper-full.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const ccInputRef = block.inputs.get(\"clearcoat\")?.source;\n let ccIntensityExpr = \"0.0\";\n let ccRoughnessExpr = \"0.0\";\n let ccIorExpr = \"1.5\";\n let ccBumpExpr = \"v3(0.5, 0.5, 1.0)\";\n let ccBumpUvExpr = \"v2(0.0)\";\n let useCcBump = false;\n let ccTintColorExpr = \"v3(1.0)\";\n let ccTintAtDistanceExpr = \"1.0\";\n let ccTintThicknessExpr = \"0.0\";\n let useCcTint = false;\n let useClearcoat = false;\n let remapClearcoatF0 = false;\n if (ccInputRef) {\n const ccBlock = ctx.graph.blocks.get(ccInputRef.blockId);\n if (ccBlock && ccBlock.className === \"ClearCoatBlock\") {\n useClearcoat = true;\n remapClearcoatF0 = (ccBlock.serialized as { remapF0OnInterfaceChange?: boolean }).remapF0OnInterfaceChange === true;\n state.usesClearcoat = true;\n ctx.resolveOutput(ccBlock, ccInputRef.outputName, stage, state);\n ccIntensityExpr = resolveOptional(ccBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n ccRoughnessExpr = resolveOptional(ccBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx);\n ccIorExpr = resolveOptional(ccBlock, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n if (ccBlock.inputs.get(\"normalMapColor\")?.source) {\n useCcBump = true;\n ccBumpExpr = resolveOptional(ccBlock, \"normalMapColor\", \"v3(0.5, 0.5, 1.0)\", \"vec3f\", stage, state, ctx);\n const uvIn = ccBlock.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(ccBlock, \"uv\", stage, state);\n ccBumpUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n if (ccBlock.inputs.get(\"tintColor\")?.source) {\n useCcTint = true;\n ccTintColorExpr = resolveOptional(ccBlock, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ccTintAtDistanceExpr = resolveOptional(ccBlock, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n ccTintThicknessExpr = resolveOptional(ccBlock, \"tintThickness\", \"0.0\", \"f32\", stage, state, ctx);\n }\n }\n }\n const shInputRef = block.inputs.get(\"sheen\")?.source;\n let shIntensityExpr = \"0.0\";\n let shColorExpr = \"v3(1.0)\";\n let shRoughnessExpr = \"0.0\";\n let useSheen = false;\n let useShAlbedoScaling = false;\n if (shInputRef) {\n const shBlock = ctx.graph.blocks.get(shInputRef.blockId);\n if (shBlock && shBlock.className === \"SheenBlock\") {\n useSheen = true;\n state.usesSheen = true;\n useShAlbedoScaling = (shBlock.serialized as { albedoScaling?: boolean }).albedoScaling === true;\n ctx.resolveOutput(shBlock, shInputRef.outputName, stage, state);\n shIntensityExpr = resolveOptional(shBlock, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n shColorExpr = resolveOptional(shBlock, \"color\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const shrIn = shBlock.inputs.get(\"roughness\");\n shRoughnessExpr = shrIn?.source\n ? resolveOptional(shBlock, \"roughness\", \"0.0\", \"f32\", stage, state, ctx)\n : `clamp(${resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx)}, 0.0, 1.0)`;\n }\n }\n const ssInputRef = block.inputs.get(\"subsurface\")?.source;\n let useSubsurface = false;\n let useRefraction = false;\n let ssTintColorExpr = \"v3(1.0)\";\n let ssThicknessExpr = \"0.0\";\n let ssTranslucencyIntensityExpr = \"0.0\";\n let ssDiffusionDistExpr = \"v3(1.0)\";\n let refrIntensityExpr = \"0.0\";\n let refrIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n let refrTintAtDistanceExpr = \"1.0\";\n if (ssInputRef) {\n const ssBlk = ctx.graph.blocks.get(ssInputRef.blockId);\n if (ssBlk && ssBlk.className === \"SubSurfaceBlock\") {\n useSubsurface = true;\n state.usesSubsurface = true;\n ctx.resolveOutput(ssBlk, ssInputRef.outputName, stage, state);\n ssTintColorExpr = resolveOptional(ssBlk, \"tintColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n ssThicknessExpr = resolveOptional(ssBlk, \"thickness\", \"0.0\", \"f32\", stage, state, ctx);\n ssTranslucencyIntensityExpr = resolveOptional(ssBlk, \"translucencyIntensity\", \"0.0\", \"f32\", stage, state, ctx);\n ssDiffusionDistExpr = resolveOptional(ssBlk, \"translucencyDiffusionDist\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const refrInputRef = ssBlk.inputs.get(\"refraction\")?.source;\n if (refrInputRef) {\n const refrBlk = ctx.graph.blocks.get(refrInputRef.blockId);\n if (refrBlk && refrBlk.className === \"RefractionBlock\") {\n useRefraction = true;\n ctx.resolveOutput(refrBlk, refrInputRef.outputName, stage, state);\n refrIntensityExpr = resolveOptional(refrBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n refrTintAtDistanceExpr = resolveOptional(refrBlk, \"tintAtDistance\", \"1.0\", \"f32\", stage, state, ctx);\n const volIor = refrBlk.inputs.get(\"volumeIndexOfRefraction\");\n if (volIor?.source) {\n refrIorExpr = resolveOptional(refrBlk, \"volumeIndexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n }\n }\n }\n }\n }\n const aniInputRef = block.inputs.get(\"anisotropy\")?.source;\n let useAnisotropy = false;\n let anisoIntensityExpr = \"0.0\";\n let anisoDirectionExpr = \"v2(1.0, 0.0)\";\n let anisoUvExpr = \"v2(0.0)\";\n if (aniInputRef) {\n const aniBlk = ctx.graph.blocks.get(aniInputRef.blockId);\n if (aniBlk && aniBlk.className === \"AnisotropyBlock\") {\n useAnisotropy = true;\n state.usesAnisotropy = true;\n ctx.resolveOutput(aniBlk, aniInputRef.outputName, stage, state);\n anisoIntensityExpr = resolveOptional(aniBlk, \"intensity\", \"0.0\", \"f32\", stage, state, ctx);\n anisoDirectionExpr = resolveOptional(aniBlk, \"direction\", \"v2(1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const dirIn = aniBlk.inputs.get(\"direction\");\n if (dirIn?.source) {\n const e = ctx.resolve(aniBlk, \"direction\", stage, state);\n anisoDirectionExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n const uvIn = aniBlk.inputs.get(\"uv\");\n if (uvIn?.source) {\n const e = ctx.resolve(aniBlk, \"uv\", stage, state);\n anisoUvExpr = e.type === \"vec2f\" ? e.expr : `(${e.expr}).xy`;\n }\n }\n }\n const iriInputRef = block.inputs.get(\"iridescence\")?.source;\n let useIridescence = false;\n let iriIntensityExpr = \"1.0\";\n let iriIorExpr = \"1.3\";\n let iriThicknessExpr = \"400.0\";\n if (iriInputRef) {\n const iriBlk = ctx.graph.blocks.get(iriInputRef.blockId);\n if (iriBlk && iriBlk.className === \"IridescenceBlock\") {\n useIridescence = true;\n state.usesIridescence = true;\n ctx.resolveOutput(iriBlk, iriInputRef.outputName, stage, state);\n iriIntensityExpr = resolveOptional(iriBlk, \"intensity\", \"1.0\", \"f32\", stage, state, ctx);\n iriIorExpr = resolveOptional(iriBlk, \"indexOfRefraction\", \"1.3\", \"f32\", stage, state, ctx);\n iriThicknessExpr = resolveOptional(iriBlk, \"thickness\", \"400.0\", \"f32\", stage, state, ctx);\n }\n }\n const useSpecularAA = (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true;\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_${useClearcoat ? \"cc\" : \"nocc\"}_${remapClearcoatF0 ? \"ccF0R\" : \"ccF0\"}_${useSheen ? \"sh\" : \"nosh\"}_${useRefraction ? \"refr\" : \"norefr\"}_${useSubsurface ? \"ss\" : \"noss\"}_${useAnisotropy ? \"ani\" : \"noani\"}_${useIridescence ? \"iri\" : \"noiri\"}_${useShAlbedoScaling ? \"shAS\" : \"noShAS\"}_${useCcBump ? \"ccB\" : \"\"}_${useCcTint ? \"ccT\" : \"\"}_${useSpecularAA ? \"aa\" : \"noaa\"}`;\n state.fragment.helpers.set(\n helperKey,\n buildPbrMrHelperFull({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat,\n useSheen,\n useRefraction,\n useSubsurface,\n useAnisotropy,\n useIridescence,\n useShAlbedoScaling,\n useCcBump,\n useCcTint,\n useSpecularAA,\n remapClearcoatF0,\n })\n );\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, ${ccIntensityExpr}, ${ccRoughnessExpr}, ${ccIorExpr}, ${ccBumpExpr}, ${ccBumpUvExpr}, ${ccTintColorExpr}, ${ccTintAtDistanceExpr}, ${ccTintThicknessExpr}, ${shIntensityExpr}, ${shColorExpr}, ${shRoughnessExpr}, ${baseIorExpr}, ${refrIntensityExpr}, ${refrIorExpr}, ${refrTintAtDistanceExpr}, ${ssTintColorExpr}, ${ssThicknessExpr}, ${ssTranslucencyIntensityExpr}, ${ssDiffusionDistExpr}, ${anisoIntensityExpr}, ${anisoDirectionExpr}, ${anisoUvExpr}, ${iriIntensityExpr}, ${iriIorExpr}, ${iriThicknessExpr}, ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
package/{pbr-metallic-roughness-block-JBSi-tQN.js → pbr-metallic-roughness-block-g7wjzwN_.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-BgY3QEzL.js";
|
|
2
2
|
const HELPER_KEY_PREFIX = "nme_pbr_mr";
|
|
3
3
|
const SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill("1.0").join(", ")})`;
|
|
4
4
|
function resolveOptional(block, inputName, fallback, target, stage, state, ctx) {
|
|
@@ -101,4 +101,4 @@ const emitter = {
|
|
|
101
101
|
export {
|
|
102
102
|
emitter
|
|
103
103
|
};
|
|
104
|
-
//# sourceMappingURL=pbr-metallic-roughness-block-
|
|
104
|
+
//# sourceMappingURL=pbr-metallic-roughness-block-g7wjzwN_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-metallic-roughness-block-
|
|
1
|
+
{"version":3,"file":"pbr-metallic-roughness-block-g7wjzwN_.js","sources":["../src/material/node/blocks/pbr-metallic-roughness-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n if (\n (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true ||\n block.inputs.get(\"clearcoat\")?.source ||\n block.inputs.get(\"sheen\")?.source ||\n block.inputs.get(\"subsurface\")?.source ||\n block.inputs.get(\"anisotropy\")?.source ||\n block.inputs.get(\"iridescence\")?.source\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core emitter cannot emit optional PBR feature code\");\n }\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_nocc_ccF0_nosh_norefr_noss_noani_noShAS___noaa`;\n if (!state.pbrMrHelperRequests.some((request) => request.key === helperKey)) {\n state.pbrMrHelperRequests.push({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat: false,\n useSheen: false,\n useRefraction: false,\n useSubsurface: false,\n useAnisotropy: false,\n useIridescence: false,\n useShAlbedoScaling: false,\n useCcBump: false,\n useCcTint: false,\n useSpecularAA: false,\n remapClearcoatF0: false,\n });\n }\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, 0.0, 0.0, 1.5, v3(0.5, 0.5, 1.0), v2(0.0), v3(1.0), 1.0, 0.0, 0.0, v3(1.0), 0.0, ${baseIorExpr}, 0.0, 1.5, 1.0, v3(1.0), 0.0, 0.0, v3(1.0), 0.0, v2(1.0, 0.0), v2(0.0), ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-BgY3QEzL.js";
|
|
2
2
|
function buildPbrMrHelperCore(request) {
|
|
3
3
|
if (request.useClearcoat || request.useSheen || request.useRefraction || request.useSubsurface || request.useAnisotropy || request.useIridescence || request.useShAlbedoScaling || request.useCcBump || request.useCcTint || request.useSpecularAA || request.remapClearcoatF0) {
|
|
4
4
|
throw new Error("NodeMaterial: PBR-MR core helper cannot emit optional PBR feature code");
|
|
@@ -234,4 +234,4 @@ ${iblBlock}
|
|
|
234
234
|
export {
|
|
235
235
|
buildPbrMrHelperCore
|
|
236
236
|
};
|
|
237
|
-
//# sourceMappingURL=pbr-mr-helper-core-
|
|
237
|
+
//# sourceMappingURL=pbr-mr-helper-core-CWROQ7OA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-mr-helper-core-BVWNR08D.js","sources":["../src/material/node/blocks/pbr-mr-helper-core.ts"],"sourcesContent":["import type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function buildPbrMrHelperCore(request: NodePbrMrHelperRequest): string {\n if (\n request.useClearcoat ||\n request.useSheen ||\n request.useRefraction ||\n request.useSubsurface ||\n request.useAnisotropy ||\n request.useIridescence ||\n request.useShAlbedoScaling ||\n request.useCcBump ||\n request.useCcTint ||\n request.useSpecularAA ||\n request.remapClearcoatF0\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core helper cannot emit optional PBR feature code\");\n }\n return HELPER_WGSL(request.useEnv);\n}\n\nfunction HELPER_WGSL(useEnv: boolean): string {\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = N;\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n let _coloredR0 = colorF0;\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n let finalRefraction = v3(0.0);\n let refractionOpacity = 1.0;\n let ssRefractionIrradiance = v3(0.0);\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n let shFinalIbl = v3(0.0);\n let shAlbedoScaling: f32 = 1.0;\n r.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`\n : `\n r.diffuseInd = v3(0.0);\n r.specularInd = v3(0.0);\n r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\n lighting: v3,\n diffuseDir: v3,\n specularDir: v3,\n diffuseInd: v3,\n specularInd: v3,\n shadow: f32,\n lumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let d = NdotH * NdotH * (a2 - 1.0) + 1.0;\n return a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\n let gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\n return 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\n let t = 1.0 - c;\n let t2 = t * t;\n return F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\n return albedo * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n let AA_factor_x = 0.0;\n let AA_factor_y = 0.0;\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0 = mix(dielectricF0, baseColor, metallic_c);\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n let anisoT = v3(1.0, 0.0, 0.0);\n let anisoB = v3(0.0, 0.0, 1.0);\n let aniAlphaTB = v2(alphaG, alphaG);\n let aniN = N;\n let ccDirectSpecAcc = v3(0.0);\n let directSpecR0 = colorF0;\n let ccNormalW = N;\n let ccNdotV: f32 = 0.0;\n let shDirectAcc = v3(0.0);\n let translucencyIntensity = 0.0;\n let ssTransmittance = v3(0.0);\n let directDiffuseTranslucencyScale = 1.0;\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum;`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n"],"names":[],"mappings":";AAGO,SAAS,qBAAqB,SAAyC;AAC1E,MACI,QAAQ,gBACR,QAAQ,YACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,kBACR,QAAQ,sBACR,QAAQ,aACR,QAAQ,aACR,QAAQ,iBACR,QAAQ,kBACV;AACE,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC5F;AACA,SAAO,YAAY,QAAQ,MAAM;AACrC;AAEA,SAAS,YAAY,QAAyB;AAC1C,QAAM,WAAW,SACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gPAwCA;AAAA;AAAA;AAAA;AAKN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCA4CqB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAuCb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4ErC,QAAQ;AAAA,MAEF,SACM;AAAA;AAAA,4CAGA;AAAA,+BAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBJ;"}
|
|
1
|
+
{"version":3,"file":"pbr-mr-helper-core-CWROQ7OA.js","sources":["../src/material/node/blocks/pbr-mr-helper-core.ts"],"sourcesContent":["import type { NodePbrMrHelperRequest } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function buildPbrMrHelperCore(request: NodePbrMrHelperRequest): string {\n if (\n request.useClearcoat ||\n request.useSheen ||\n request.useRefraction ||\n request.useSubsurface ||\n request.useAnisotropy ||\n request.useIridescence ||\n request.useShAlbedoScaling ||\n request.useCcBump ||\n request.useCcTint ||\n request.useSpecularAA ||\n request.remapClearcoatF0\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core helper cannot emit optional PBR feature code\");\n }\n return HELPER_WGSL(request.useEnv);\n}\n\nfunction HELPER_WGSL(useEnv: boolean): string {\n const iblBlock = useEnv\n ? `\n let envRot = sceneU.envRotationY;\n let cosA = cos(envRot); let sinA = sin(envRot);\n let N_specSrc = N;\n let R_raw = reflect(-V, N_specSrc);\n let R = v3(R_raw.x * cosA + R_raw.z * sinA, R_raw.y, -R_raw.x * sinA + R_raw.z * cosA);\n let N_env = v3(Ng.x * cosA + Ng.z * sinA, Ng.y, -Ng.x * sinA + Ng.z * cosA);\n let environmentIrradiance = (sceneU.vSphericalL00.xyz\n + sceneU.vSphericalL1_1.xyz * N_env.y + sceneU.vSphericalL10.xyz * N_env.z + sceneU.vSphericalL11.xyz * N_env.x\n + sceneU.vSphericalL2_2.xyz * (N_env.y * N_env.x) + sceneU.vSphericalL2_1.xyz * (N_env.y * N_env.z)\n + sceneU.vSphericalL20.xyz * (3.0 * N_env.z * N_env.z - 1.0) + sceneU.vSphericalL21.xyz * (N_env.z * N_env.x)\n + sceneU.vSphericalL22.xyz * (N_env.x * N_env.x - N_env.y * N_env.y));\n let brdfSample = textureSample(nmeBrdfLUT, nmeBrdfSampler, v2(NdotV, rough_c));\n let envBrdf = brdfSample.rgb;\n let reflectanceF0Scalar = max(colorF0.r, max(colorF0.g, colorF0.b));\n let baseSpecEnvReflectance = (colorF90 - v3(reflectanceF0Scalar)) * envBrdf.x + v3(reflectanceF0Scalar) * envBrdf.y;\n let seo = clamp((NdotVUnclamped + ao_c) * (NdotVUnclamped + ao_c) - 1.0 + ao_c, 0.0, 1.0);\n let _geoNF = select(-Ng, Ng, dot(Ng, V) > 0.0);\n let _ehoRefl = reflect(-V, N);\n let _ehoT = clamp(1.0 + 1.1 * dot(_ehoRefl, _geoNF), 0.0, 1.0);\n let eho = _ehoT * _ehoT;\n let _coloredR0 = colorF0;\n let colorSpecEnvReflectance = ((colorF90 - _coloredR0) * envBrdf.x + _coloredR0 * envBrdf.y) * seo * eho;\n let energyConservation = 1.0 + _coloredR0 * (1.0 / max(envBrdf.y, 0.001) - 1.0);\n let maxLod = f32(textureNumLevels(nmeIblTexture) - 1);\n let cubemapDim = f32(textureDimensions(nmeIblTexture).x);\n let specLod = log2(cubemapDim * alphaG) * sceneU.vImageInfos.z;\n var environmentRadiance = textureSampleLevel(nmeIblTexture, nmeIblSampler, R, clamp(specLod, 0.0, maxLod)).rgb;\n var finalIrradiance = environmentIrradiance * surfaceAlbedo;\n let finalRadianceScaled = environmentRadiance * colorSpecEnvReflectance * energyConservation;\n let finalSpecularScaledDirect = specAcc * energyConservation;\n let finalRefraction = v3(0.0);\n let refractionOpacity = 1.0;\n let ssRefractionIrradiance = v3(0.0);\n finalIrradiance = finalIrradiance * ao_c;\n r.diffuseInd = finalIrradiance;\n r.specularInd = finalRadianceScaled;\n let shFinalIbl = v3(0.0);\n let shAlbedoScaling: f32 = 1.0;\n r.lighting = finalIrradiance * shAlbedoScaling + ssRefractionIrradiance * ao_c + (finalRadianceScaled + finalSpecularScaledDirect + diffuseAcc) * shAlbedoScaling + diffuseTransmissionAcc + shDirectAcc + shFinalIbl + finalRefraction;`\n : `\n r.diffuseInd = v3(0.0);\n r.specularInd = v3(0.0);\n r.lighting = diffuseAcc + diffuseTransmissionAcc + specAcc + shDirectAcc;`;\n\n return `alias v2 = vec2<f32>;\nalias v3 = vec3<f32>;\nalias v4 = vec4<f32>;\nstruct NmePbrMrResult {\n lighting: v3,\n diffuseDir: v3,\n specularDir: v3,\n diffuseInd: v3,\n specularInd: v3,\n shadow: f32,\n lumOverAlpha: f32,\n};\nconst NME_PBR_PI: f32 = 3.14159265358979323846;\nfn nme_pbr_distGGX(NdotH: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let d = NdotH * NdotH * (a2 - 1.0) + 1.0;\n return a2 / (NME_PBR_PI * d * d);\n}\nfn nme_pbr_geomGGX(NdotL: f32, NdotV: f32, alphaG: f32) -> f32 {\n let a2 = alphaG * alphaG;\n let gl = NdotL * sqrt(NdotV * (NdotV - a2 * NdotV) + a2);\n let gv = NdotV * sqrt(NdotL * (NdotL - a2 * NdotL) + a2);\n return 0.5 / max(gl + gv, 0.00001);\n}\nfn nme_pbr_fresSchlick(c: f32, F0: v3, F90: v3) -> v3 {\n let t = 1.0 - c;\n let t2 = t * t;\n return F0 + (F90 - F0) * (t2 * t2 * t);\n}\nfn nme_pbr_diffuseEON(albedo: v3, sigma: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> v3 {\n return albedo * (1.0 / NME_PBR_PI);\n}\nfn nme_pbr_mr_compute(\n worldPos: v3, geometricNormal: v3, worldNormal: v3, cameraPos: v3,\n baseColor: v3, metallic: f32, roughness: f32, ao: f32,\n ccIntensityIn: f32, ccRoughnessIn: f32, ccIor: f32,\n ccBumpColor: v3, ccBumpUv: v2,\n ccTintColor: v3, ccTintAtDistance: f32, ccTintThickness: f32,\n shIntensityIn: f32, shColorIn: v3, shRoughnessIn: f32,\n baseIor: f32,\n refrIntensityIn: f32, refrIor: f32, refrTintAtDistance: f32,\n ssTintColor: v3, ssThickness: f32,\n ssTranslucencyIntensityIn: f32, ssDiffusionDist: v3,\n anisoIntensityIn: f32, anisoDirection: v2, anisoUv: v2,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmePbrMrResult {\n var r: NmePbrMrResult;\n let Ng = normalize(geometricNormal);\n let N = normalize(worldNormal);\n let V = normalize(cameraPos - worldPos);\n let NdotVUnclamped = dot(N, V);\n let NdotV = abs(NdotVUnclamped) + 0.0000001;\n let metallic_c = clamp(metallic, 0.0, 1.0);\n let rough_c = clamp(roughness, 0.0, 1.0);\n var alphaG = rough_c * rough_c + 0.0005;\n let AA_factor_x = 0.0;\n let AA_factor_y = 0.0;\n let dielectricF0Raw = (baseIor - 1.0) / (baseIor + 1.0);\n let dielectricF0Scalar = dielectricF0Raw * dielectricF0Raw;\n let dielectricF0 = v3(dielectricF0Scalar);\n var surfaceAlbedo = baseColor * (1.0 - metallic_c) * (1.0 - dielectricF0Scalar);\n let colorF0 = mix(dielectricF0, baseColor, metallic_c);\n let colorF90 = v3(1.0);\n let ao_c = clamp(ao, 0.0, 1.0);\n let directRoughness = max(rough_c, AA_factor_x);\n let directAlphaG = directRoughness * directRoughness + 0.0005;\n let anisoT = v3(1.0, 0.0, 0.0);\n let anisoB = v3(0.0, 0.0, 1.0);\n let aniAlphaTB = v2(alphaG, alphaG);\n let aniN = N;\n let ccDirectSpecAcc = v3(0.0);\n let directSpecR0 = colorF0;\n let ccNormalW = N;\n let ccNdotV: f32 = 0.0;\n let shDirectAcc = v3(0.0);\n let translucencyIntensity = 0.0;\n let ssTransmittance = v3(0.0);\n let directDiffuseTranslucencyScale = 1.0;\n var diffuseAcc = v3(0.0);\n var diffuseTransmissionAcc = v3(0.0);\n var specAcc = v3(0.0);\n var aggShadow: f32 = 0.0;\n var nLights: f32 = 0.0;\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let entry = nmeLights.lights[lightIndex];\n let t = u32(entry.vLightData.w);\n let sh = shadowFactors[lightIndex];\n if (t == 3u) {\n let Ldir = normalize(entry.vLightData.xyz);\n let nl = clamp(0.5 + 0.5 * dot(N, Ldir), 0.0000001, 1.0);\n let groundSky = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, nl);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let H_h = normalize(V + Ldir);\n let NdotH_h = clamp(dot(N, H_h), 0.0000001, 1.0);\n let VdotH_h = saturate(dot(V, H_h));\n let cF_h = nme_pbr_fresSchlick(VdotH_h, directSpecR0, colorF90);\n let D_h = nme_pbr_distGGX(NdotH_h, directAlphaG);\n let G_h = nme_pbr_geomGGX(nl, NdotV, directAlphaG);\n specAcc = specAcc + cF_h * D_h * G_h * nl * entry.vLightDiffuse.rgb * sh * baseLayerAtten * baseLayerAbsorption;\n diffuseAcc = diffuseAcc + groundSky * surfaceAlbedo * sh * baseLayerAtten * baseLayerAbsorption;\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n continue;\n }\n var L: v3;\n var atten: f32 = 1.0;\n let color = entry.vLightDiffuse.rgb;\n if (t == 1u) {\n L = normalize(-entry.vLightData.xyz);\n } else {\n let toL = entry.vLightData.xyz - worldPos;\n let d2 = dot(toL, toL);\n let dist = sqrt(d2);\n L = toL / max(dist, 0.0001);\n let range = entry.vLightDiffuse.a;\n if (t == 2u) {\n let invD2 = 1.0 / max(d2, 0.0000001);\n let cosHalfAngle = entry.vLightDirection.w;\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let cd = dot(-entry.vLightDirection.xyz, L);\n let dirFall = exp2(kappa * (cd - 1.0));\n atten = invD2 * dirFall;\n } else {\n atten = 1.0 / max(d2, 0.0000001);\n }\n }\n let NdotLUnclamped = dot(N, L);\n let NdotL = clamp(NdotLUnclamped, 0.0000001, 1.0);\n var baseLayerAtten: f32 = 1.0;\n var baseLayerAbsorption = v3(1.0);\n let _LdotV = select(0.0, dot(L, V), t == 1u);\n let _eonDiffuse = nme_pbr_diffuseEON(surfaceAlbedo, 0.0, NdotL, NdotV, _LdotV);\n diffuseAcc = diffuseAcc + _eonDiffuse * directDiffuseTranslucencyScale * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n if (NdotLUnclamped < 0.0 && translucencyIntensity > 0.0) {\n let _trNdotL = abs(NdotLUnclamped) + 0.0000001;\n let _wrapW = 0.02;\n let _wrapT = 1.0 + _wrapW;\n let _wrapNdotL = clamp((_trNdotL + _wrapW) / (_wrapT * _wrapT), 0.0, 1.0);\n let _clampedAlbT = clamp(surfaceAlbedo, v3(0.1), v3(1.0));\n let _eonTransmit = nme_pbr_diffuseEON(_clampedAlbT, 0.0, max(NdotL, 0.0000001), NdotV, _LdotV) / _clampedAlbT;\n diffuseTransmissionAcc = diffuseTransmissionAcc + _eonTransmit * (ssTransmittance * _wrapNdotL) * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n if (NdotL > 0.0 && atten > 0.0) {\n let H = normalize(V + L);\n let NdotH = clamp(dot(N, H), 0.0000001, 1.0);\n let VdotH = saturate(dot(V, H));\n let cF = nme_pbr_fresSchlick(VdotH, directSpecR0, colorF90);\n let D = nme_pbr_distGGX(NdotH, directAlphaG);\n let G = nme_pbr_geomGGX(NdotL, NdotV, directAlphaG);\n specAcc = specAcc + cF * D * G * NdotL * color * atten * sh * baseLayerAtten * baseLayerAbsorption;\n }\n aggShadow = aggShadow + sh;\n nLights = nLights + 1.0;\n }\n r.diffuseDir = diffuseAcc;\n r.specularDir = specAcc;\n${iblBlock}\n ${\n useEnv\n ? `let _radLum = clamp(dot(finalRadianceScaled * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n let _specLum = clamp(dot(finalSpecularScaledDirect * shAlbedoScaling, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _radLum + _specLum;`\n : `let _specLum = clamp(dot(specAcc, v3(0.2126, 0.7152, 0.0722)), 0.0, 1.0);\n r.lumOverAlpha = _specLum;`\n }\n var colorOut = max(r.lighting, v3(0.0)) * sceneU.vImageInfos.x;\n if (sceneU.vImageInfos.w > 0.5) {\n colorOut = 1.0 - exp2(-1.590579 * colorOut);\n }\n colorOut = pow(max(colorOut, v3(0.0)), v3(0.45454545));\n colorOut = clamp(colorOut, v3(0.0), v3(1.0));\n let highContrast = colorOut * colorOut * (v3(3.0) - colorOut * 2.0);\n if (sceneU.vImageInfos.y < 1.0) {\n colorOut = mix(v3(0.5), colorOut, sceneU.vImageInfos.y);\n } else {\n colorOut = mix(colorOut, highContrast, sceneU.vImageInfos.y - 1.0);\n }\n r.lighting = max(colorOut, v3(0.0));\n if (nLights > 0.0) { r.shadow = aggShadow / nLights; } else { r.shadow = 1.0; }\n return r;\n}\n`;\n}\n"],"names":[],"mappings":";AAGO,SAAS,qBAAqB,SAAyC;AAC1E,MACI,QAAQ,gBACR,QAAQ,YACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,iBACR,QAAQ,kBACR,QAAQ,sBACR,QAAQ,aACR,QAAQ,aACR,QAAQ,iBACR,QAAQ,kBACV;AACE,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC5F;AACA,SAAO,YAAY,QAAQ,MAAM;AACrC;AAEA,SAAS,YAAY,QAAyB;AAC1C,QAAM,WAAW,SACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gPAwCA;AAAA;AAAA;AAAA;AAKN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCA4CqB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAuCb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4ErC,QAAQ;AAAA,MAEF,SACM;AAAA;AAAA,4CAGA;AAAA,+BAEV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBJ;"}
|
|
@@ -8,10 +8,10 @@ async function registerPbrRefraction(scene, engine, register) {
|
|
|
8
8
|
break;
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
-
const mod = await import("./pbr-transmission-ext-
|
|
11
|
+
const mod = await import("./pbr-transmission-ext-BNiXngZc.js");
|
|
12
12
|
mod.registerPbrTransmission(scene, engine, register, dispersionSampleWgsl);
|
|
13
13
|
}
|
|
14
14
|
export {
|
|
15
15
|
registerPbrRefraction
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=pbr-refraction-
|
|
17
|
+
//# sourceMappingURL=pbr-refraction-Dxsm_gii.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-refraction-
|
|
1
|
+
{"version":3,"file":"pbr-refraction-Dxsm_gii.js","sources":["../src/material/pbr/pbr-refraction.ts"],"sourcesContent":["import type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { PbrExt } from \"./pbr-flags.js\";\nimport type { PbrMaterialProps } from \"./pbr-material.js\";\n\nexport async function registerPbrRefraction(scene: SceneContext, engine: EngineContext, register: (ext: PbrExt) => void): Promise<void> {\n // Load the per-RGB chromatic-dispersion sample WGSL only when a material in the\n // scene actually uses KHR_materials_dispersion, so its 3-ray code chunk is fetched\n // solely by dispersion scenes and never weighs on other transmission scenes. The\n // string is injected into the refraction fragment (no shared module mutation).\n let dispersionSampleWgsl: string | undefined;\n for (const mesh of scene.meshes) {\n const refr = (mesh.material as PbrMaterialProps | undefined)?.subsurface?.refraction;\n if (refr?.dispersion) {\n dispersionSampleWgsl = (await import(\"./fragments/refraction-dispersion-wgsl.js\")).DISPERSION_SAMPLE_WGSL;\n break;\n }\n }\n const mod = await import(\"./pbr-transmission-ext.js\");\n mod.registerPbrTransmission(scene, engine, register, dispersionSampleWgsl);\n}\n"],"names":[],"mappings":"AAKA,eAAsB,sBAAsB,OAAqB,QAAuB,UAAgD;AAAxI;AAKI,MAAI;AACJ,aAAW,QAAQ,MAAM,QAAQ;AAC7B,UAAM,QAAQ,gBAAK,aAAL,mBAAgD,eAAhD,mBAA4D;AAC1E,QAAI,6BAAM,YAAY;AAClB,8BAAwB,MAAM,OAAO,0CAA2C,GAAG;AACnF;AAAA,IACJ;AAAA,EACJ;AACA,QAAM,MAAM,MAAM,OAAO,oCAA2B;AACpD,MAAI,wBAAwB,OAAO,QAAQ,UAAU,oBAAoB;AAC7E;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as composeShader } from "./shader-composer-
|
|
1
|
+
import { cg as _getPbrExtsSorted, aP as PBR2_HAS_UV2, cc as MSH_HAS_UV2, b5 as PBR_HAS_EMISSIVE, ch as PBR_HAS_SPEC_GLOSS, V as PBR2_ESM_SHADOW_OUTPUT, y as targetSignatureKey, A as getSceneBindGroupLayout, H as CW, bN as REVERSE_DEPTH_COMPARE, ca as PBR_HAS_NORMAL_MAP, cb as MSH_HAS_TANGENTS, ci as PBR2_NO_COLOR_OUTPUT, W as PBR_HAS_ALPHA_BLEND, ce as PBR_HAS_DOUBLE_SIDED, bH as appendMeshLightUboFields, bI as meshLightIndexWGSL, cj as _getPbrExts, ck as PBR2_HAS_UV_TRANSFORM, cl as PBR_HAS_ANISOTROPY, cm as PBR_HAS_SKYBOX, cn as PBR_HAS_SPECULAR_AA, c7 as PBR_HAS_ENV, aH as MSH_RECEIVE_SHADOWS, aG as MSH_HAS_THIN_INSTANCES, cd as MSH_HAS_VERTEX_COLOR, co as PBR_HAS_FOG, aE as MSH_HAS_INSTANCE_COLOR, cp as PBR_HAS_OCCLUSION, cq as PBR2_HAS_BASE_COLOR_FACTOR, cr as PBR_HAS_GAMMA_ALBEDO, cs as PBR_HAS_TONEMAP, b9 as MSH_HAS_MORPH_TARGETS, b4 as PBR_HAS_EMISSIVE_COLOR, aM as PBR_HAS_METALLIC_REFLECTANCE_MAP, aN as PBR_HAS_REFLECTANCE_MAP, aO as PBR2_HAS_REFLECTANCE_FACTORS, b as writeMeshLightSelection, c5 as _registerPbrExt, au as clearSamplerCache, c8 as _computePbrMaterialFeatures, aw as _computeMeshFeatures, a as F32, p as packMat4IntoF32, ay as createUniformBuffer, bZ as PBR2_HAS_REFRACTION, c9 as collectPbrBoundTextures, aA as acquireTexture, aB as releaseTexture } from "./index-BgY3QEzL.js";
|
|
2
|
+
import { c as composeShader } from "./shader-composer-CBy2i8nU.js";
|
|
3
3
|
const _bindingsCache = /* @__PURE__ */ new Map();
|
|
4
4
|
let _cachedDevice = null;
|
|
5
5
|
function ensureDevice(engine) {
|
|
@@ -663,12 +663,12 @@ async function buildPbrRenderables(scene, meshes, envTextures) {
|
|
|
663
663
|
};
|
|
664
664
|
}
|
|
665
665
|
if (needsMultiLightPath) {
|
|
666
|
-
const wgslMod = await import("./multilight-wgsl-
|
|
666
|
+
const wgslMod = await import("./multilight-wgsl-I5SncF0q.js");
|
|
667
667
|
_multiLightWGSL = wgslMod.MULTI_LIGHT_STRUCTS() + wgslMod.COMPUTE_PBR_LIGHT;
|
|
668
668
|
_multiLightLoop = wgslMod.getMultiLightLoop();
|
|
669
669
|
}
|
|
670
670
|
if (hasAnyAffectedLight && hasSomeShadows) {
|
|
671
|
-
const shadowMod = await import("./pbr-shadow-fragment-
|
|
671
|
+
const shadowMod = await import("./pbr-shadow-fragment-waeIBQUq.js");
|
|
672
672
|
_createPbrShadowFragment = shadowMod.createPbrShadowFragment;
|
|
673
673
|
}
|
|
674
674
|
const _drainPbrExts = async (loaders) => {
|
|
@@ -679,22 +679,22 @@ async function buildPbrRenderables(scene, meshes, envTextures) {
|
|
|
679
679
|
}
|
|
680
680
|
};
|
|
681
681
|
await _drainPbrExts([
|
|
682
|
-
[hasAlphaTest, () => import("./alpha-test-fragment-
|
|
683
|
-
[hasMetallicReflectance, () => import("./reflectance-fragment-
|
|
684
|
-
[hasClearcoat, () => import("./clearcoat-fragment-
|
|
685
|
-
[hasSheen, () => import("./sheen-fragment-
|
|
686
|
-
[hasIridescence, () => import("./iridescence-fragment-
|
|
687
|
-
[hasAnySubsurface, () => import("./subsurface-fragment-
|
|
682
|
+
[hasAlphaTest, () => import("./alpha-test-fragment-x2mnjLgC.js")],
|
|
683
|
+
[hasMetallicReflectance, () => import("./reflectance-fragment-BQFZ_pgy.js")],
|
|
684
|
+
[hasClearcoat, () => import("./clearcoat-fragment-Dj7vGX2u.js")],
|
|
685
|
+
[hasSheen, () => import("./sheen-fragment-B_Jd7wrr.js")],
|
|
686
|
+
[hasIridescence, () => import("./iridescence-fragment-kfsCs8lN.js")],
|
|
687
|
+
[hasAnySubsurface, () => import("./subsurface-fragment-BNQoG9gr.js")]
|
|
688
688
|
]);
|
|
689
689
|
if (hasTransmissionRefraction) {
|
|
690
|
-
const mod = await import("./pbr-refraction-
|
|
690
|
+
const mod = await import("./pbr-refraction-Dxsm_gii.js");
|
|
691
691
|
await mod.registerPbrRefraction(scene, engine, _registerPbrExt);
|
|
692
692
|
}
|
|
693
693
|
await _drainPbrExts([
|
|
694
|
-
[needsEmissiveColor, () => import("./emissive-fragment-
|
|
695
|
-
[hasAnyUnlit, () => import("./unlit-fragment-
|
|
696
|
-
[hasSomeSkeletons, () => import("./skeleton-fragment-
|
|
697
|
-
[hasSomeMorphs, () => import("./morph-fragment-
|
|
694
|
+
[needsEmissiveColor, () => import("./emissive-fragment-BOAezkfk.js")],
|
|
695
|
+
[hasAnyUnlit, () => import("./unlit-fragment-BsHrS9XX.js")],
|
|
696
|
+
[hasSomeSkeletons, () => import("./skeleton-fragment-COdHWFcK.js")],
|
|
697
|
+
[hasSomeMorphs, () => import("./morph-fragment-NpZYyIIU.js")],
|
|
698
698
|
[hasAnyUvTransform, () => import("./uv-transform-fragment-hYujGpZg.js")]
|
|
699
699
|
]);
|
|
700
700
|
let _anisoExt = null;
|
|
@@ -714,10 +714,10 @@ async function buildPbrRenderables(scene, meshes, envTextures) {
|
|
|
714
714
|
if (hasSomeThinInstances) {
|
|
715
715
|
const mod = await import("./thin-instance-fragment-hsv-RyDs.js");
|
|
716
716
|
_createThinInstanceFragment = mod.createThinInstanceFragment;
|
|
717
|
-
const gpuMod = await import("./thin-instance-gpu-
|
|
717
|
+
const gpuMod = await import("./thin-instance-gpu-C1DGstap.js");
|
|
718
718
|
_syncThinInstanceBuffers = gpuMod.syncThinInstanceBuffers;
|
|
719
719
|
if (hasCullingTI) {
|
|
720
|
-
_cull = await import("./thin-instance-cull-binding-
|
|
720
|
+
_cull = await import("./thin-instance-cull-binding-BNC5JiGw.js");
|
|
721
721
|
}
|
|
722
722
|
_syncThinInstanceGpuData = gpuMod.syncThinInstanceGpuData;
|
|
723
723
|
}
|
|
@@ -971,15 +971,15 @@ function getPackedSingleLightType(lights, packedIndex) {
|
|
|
971
971
|
}
|
|
972
972
|
async function importSingleLightWgsl(type) {
|
|
973
973
|
if (type === "hemispheric") {
|
|
974
|
-
return import("./singlelight-hemispheric-wgsl-
|
|
974
|
+
return import("./singlelight-hemispheric-wgsl-DjxhgI8r.js");
|
|
975
975
|
}
|
|
976
976
|
if (type === "directional") {
|
|
977
|
-
return import("./singlelight-directional-wgsl-
|
|
977
|
+
return import("./singlelight-directional-wgsl-Bw84txva.js");
|
|
978
978
|
}
|
|
979
979
|
if (type === "spot") {
|
|
980
|
-
return import("./singlelight-spot-wgsl-
|
|
980
|
+
return import("./singlelight-spot-wgsl-MDdTdstF.js");
|
|
981
981
|
}
|
|
982
|
-
return import("./singlelight-point-wgsl-
|
|
982
|
+
return import("./singlelight-point-wgsl-iA1aRkXA.js");
|
|
983
983
|
}
|
|
984
984
|
function _writeMaterialData(data, material, spec) {
|
|
985
985
|
data[0] = material.environmentIntensity ?? 1;
|
|
@@ -1018,4 +1018,4 @@ export {
|
|
|
1018
1018
|
createPbrMeshBindGroup as c,
|
|
1019
1019
|
pbrRenderable as p
|
|
1020
1020
|
};
|
|
1021
|
-
//# sourceMappingURL=pbr-renderable-
|
|
1021
|
+
//# sourceMappingURL=pbr-renderable-CuKWalEM.js.map
|