@babylonjs/lite 0.1.1 → 1.0.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/_mat4-storage-f64-CjDoht2w.js +11 -0
- package/_mat4-storage-f64-CjDoht2w.js.map +1 -0
- package/{alpha-test-fragment-CUiHCw7W.js → alpha-test-fragment-B7DjSnF7.js} +2 -2
- package/{alpha-test-fragment-CUiHCw7W.js.map → alpha-test-fragment-B7DjSnF7.js.map} +1 -1
- package/assets/splat-sort-worker-DT3eybMZ.js.map +1 -0
- package/{background-dds-skybox-yHTqabU3.js → background-dds-skybox-BEX309u3.js} +14 -14
- package/background-dds-skybox-BEX309u3.js.map +1 -0
- package/{background-ground-DIw6D3qf.js → background-ground-BU0HOcM4.js} +20 -20
- package/background-ground-BU0HOcM4.js.map +1 -0
- package/{background-hdr-skybox-c4uuTmkP.js → background-hdr-skybox--RRRic_K.js} +10 -10
- package/background-hdr-skybox--RRRic_K.js.map +1 -0
- package/{background-solid-skybox-DPGBpPbm.js → background-solid-skybox-BrH2fXSu.js} +12 -13
- package/background-solid-skybox-BrH2fXSu.js.map +1 -0
- package/{billboard-renderable-D8mlVGCd.js → billboard-renderable-BHWryAeC.js} +46 -10
- package/billboard-renderable-BHWryAeC.js.map +1 -0
- package/{clamp-block-BdII67hT.js → clamp-block-DqbwnQGW.js} +2 -2
- package/{clamp-block-BdII67hT.js.map → clamp-block-DqbwnQGW.js.map} +1 -1
- package/{clearcoat-fragment-LCiG98Rf.js → clearcoat-fragment-D6FSCie1.js} +2 -2
- package/{clearcoat-fragment-LCiG98Rf.js.map → clearcoat-fragment-D6FSCie1.js.map} +1 -1
- package/{create-skeleton-C9JdIJnb.js → create-skeleton-D_uplboC.js} +9 -9
- package/create-skeleton-D_uplboC.js.map +1 -0
- package/{cubemap-skybox-material-DvXMVc4k.js → cubemap-skybox-material-DQcMMdf-.js} +6 -7
- package/cubemap-skybox-material-DQcMMdf-.js.map +1 -0
- package/{curve-block-BlJpXVYv.js → curve-block-21rT0JjG.js} +2 -2
- package/{curve-block-BlJpXVYv.js.map → curve-block-21rT0JjG.js.map} +1 -1
- package/{emissive-fragment-BnNvbBCw.js → emissive-fragment-C5FtBs3y.js} +3 -3
- package/emissive-fragment-C5FtBs3y.js.map +1 -0
- package/{esm-shadow-view-DN9HIaM4.js → esm-shadow-view-Cl3rPGof.js} +2 -2
- package/{esm-shadow-view-DN9HIaM4.js.map → esm-shadow-view-Cl3rPGof.js.map} +1 -1
- package/{esm-shadow-view-Dk9NFtLq.js → esm-shadow-view-Gtd1LWRP.js} +2 -2
- package/{esm-shadow-view-Dk9NFtLq.js.map → esm-shadow-view-Gtd1LWRP.js.map} +1 -1
- package/{esm-shadow-view-DGKdF1NI.js → esm-shadow-view-c5YV4Eg9.js} +2 -2
- package/{esm-shadow-view-DGKdF1NI.js.map → esm-shadow-view-c5YV4Eg9.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-DgJl7l56.js → gaussian-splatting-pipeline-sh-7J31V23x.js} +19 -19
- package/gaussian-splatting-pipeline-sh-7J31V23x.js.map +1 -0
- package/geometry-texture-output-dXk4E9uu.js +41 -0
- package/geometry-texture-output-dXk4E9uu.js.map +1 -0
- package/geometry-view-BsFJpBJa.js +404 -0
- package/geometry-view-BsFJpBJa.js.map +1 -0
- package/{gltf-animation-D7uyTyO3.js → gltf-animation-K_zZxj_d.js} +7 -7
- package/gltf-animation-K_zZxj_d.js.map +1 -0
- package/gltf-color-normalize-Qxl-9C48.js +29 -0
- package/gltf-color-normalize-Qxl-9C48.js.map +1 -0
- package/{gltf-ext-basisu-CPg5kPrx.js → gltf-ext-basisu-CDbPclzZ.js} +53 -18
- package/gltf-ext-basisu-CDbPclzZ.js.map +1 -0
- package/{gltf-ext-node-visibility-MafA9ot2.js → gltf-ext-node-visibility-DXCJEYr6.js} +2 -2
- package/{gltf-ext-node-visibility-MafA9ot2.js.map → gltf-ext-node-visibility-DXCJEYr6.js.map} +1 -1
- package/{gltf-ext-quantization-CpZyLDIz.js → gltf-ext-quantization-CvHI_0Vg.js} +4 -3
- package/gltf-ext-quantization-CvHI_0Vg.js.map +1 -0
- package/{gltf-ext-uv-transform-CE_-T1Tr.js → gltf-ext-uv-transform-DgYazJBs.js} +2 -2
- package/{gltf-ext-uv-transform-CE_-T1Tr.js.map → gltf-ext-uv-transform-DgYazJBs.js.map} +1 -1
- package/{gltf-feature-animation-pointer-BjpwOOqo.js → gltf-feature-animation-pointer-D1RJRFBw.js} +9 -9
- package/gltf-feature-animation-pointer-D1RJRFBw.js.map +1 -0
- package/{gltf-feature-animations-CCizegp8.js → gltf-feature-animations-Cmc1uoIu.js} +2 -2
- package/{gltf-feature-animations-CCizegp8.js.map → gltf-feature-animations-Cmc1uoIu.js.map} +1 -1
- package/{gltf-feature-draco-yGSMGTE3.js → gltf-feature-draco-CKKzT5E3.js} +6 -5
- package/gltf-feature-draco-CKKzT5E3.js.map +1 -0
- package/{gltf-feature-gpu-instancing-2e_CFQnl.js → gltf-feature-gpu-instancing-n87SO6Vh.js} +7 -6
- package/gltf-feature-gpu-instancing-n87SO6Vh.js.map +1 -0
- package/{gltf-feature-lights-punctual-DDDg4j0U.js → gltf-feature-lights-punctual-Ckm3ciL8.js} +5 -5
- package/{gltf-feature-lights-punctual-DDDg4j0U.js.map → gltf-feature-lights-punctual-Ckm3ciL8.js.map} +1 -1
- package/{gltf-feature-meshopt-Des96YFI.js → gltf-feature-meshopt-DLC4SF1E.js} +7 -6
- package/gltf-feature-meshopt-DLC4SF1E.js.map +1 -0
- package/{gltf-feature-morph-CKCw6tkX.js → gltf-feature-morph-Cjtu7hYa.js} +4 -4
- package/gltf-feature-morph-Cjtu7hYa.js.map +1 -0
- package/gltf-feature-registry-C63Hjp9w.js +59 -0
- package/gltf-feature-registry-C63Hjp9w.js.map +1 -0
- package/{gltf-feature-skeleton-D8hWLqi2.js → gltf-feature-skeleton-DKbOGidp.js} +3 -3
- package/{gltf-feature-skeleton-D8hWLqi2.js.map → gltf-feature-skeleton-DKbOGidp.js.map} +1 -1
- package/{gltf-feature-variants-Ds6v9byg.js → gltf-feature-variants-Cmzu0O0e.js} +2 -2
- package/{gltf-feature-variants-Ds6v9byg.js.map → gltf-feature-variants-Cmzu0O0e.js.map} +1 -1
- package/{gltf-glb-parser-D6UZWFuC.js → gltf-glb-parser-Cj5MHS-v.js} +5 -4
- package/gltf-glb-parser-Cj5MHS-v.js.map +1 -0
- package/{gltf-interleave-DGnUlz28.js → gltf-interleave-gHf9_t0i.js} +14 -14
- package/gltf-interleave-gHf9_t0i.js.map +1 -0
- package/gltf-normals-b2h74380.js +37 -0
- package/gltf-normals-b2h74380.js.map +1 -0
- package/{gltf-pbr-builder-ext-BFOxOCnQ.js → gltf-pbr-builder-ext-edNcjwPf.js} +5 -5
- package/gltf-pbr-builder-ext-edNcjwPf.js.map +1 -0
- package/{gltf-variants-DFbr8EES.js → gltf-variants-CPxNdtP4.js} +4 -4
- package/{gltf-variants-DFbr8EES.js.map → gltf-variants-CPxNdtP4.js.map} +1 -1
- package/{gs-picking-pipeline-DzfMASL9.js → gs-picking-pipeline-DYaW_Lg3.js} +14 -14
- package/gs-picking-pipeline-DYaW_Lg3.js.map +1 -0
- package/havok-floating-origin-Dr-18Nds.js +198 -0
- package/havok-floating-origin-Dr-18Nds.js.map +1 -0
- package/index-CLElg2Bo.js +39209 -0
- package/index-CLElg2Bo.js.map +1 -0
- package/index-CYZDclhF.js +918 -0
- package/index-CYZDclhF.js.map +1 -0
- package/index-SMJ67XwT.js +3330 -0
- package/index-SMJ67XwT.js.map +1 -0
- package/index.d.ts +2508 -119
- package/index.js +444 -302
- package/{input-block-DgAJBzN_.js → input-block-DqEedWF2.js} +2 -2
- package/{input-block-DgAJBzN_.js.map → input-block-DqEedWF2.js.map} +1 -1
- package/{iridescence-fragment-Gymp7or5.js → iridescence-fragment-BHU59-gQ.js} +2 -2
- package/{iridescence-fragment-Gymp7or5.js.map → iridescence-fragment-BHU59-gQ.js.map} +1 -1
- package/{light-block-B11ew7FA.js → light-block-Bv37V8vl.js} +2 -2
- package/{light-block-B11ew7FA.js.map → light-block-Bv37V8vl.js.map} +1 -1
- package/{loop-block-Bb23EOMb.js → loop-block-qTg8vb99.js} +2 -2
- package/{loop-block-Bb23EOMb.js.map → loop-block-qTg8vb99.js.map} +1 -1
- package/{morph-fragment-DOVo70gP.js → morph-fragment-BRCUr2wQ.js} +2 -2
- package/{morph-fragment-DOVo70gP.js.map → morph-fragment-BRCUr2wQ.js.map} +1 -1
- package/{multilight-wgsl-BGyiIOp3.js → multilight-wgsl-DMeppAdZ.js} +4 -4
- package/{multilight-wgsl-BGyiIOp3.js.map → multilight-wgsl-DMeppAdZ.js.map} +1 -1
- package/{node-env-BPZXZzBf.js → node-env-Bc559GmY.js} +6 -5
- package/node-env-Bc559GmY.js.map +1 -0
- package/node-geometry-view-COmWsRXK.js +291 -0
- package/node-geometry-view-COmWsRXK.js.map +1 -0
- package/{node-registry-extra-compat-Dhrw8fDQ.js → node-registry-extra-compat-dWrv7gpS.js} +2 -2
- package/{node-registry-extra-compat-Dhrw8fDQ.js.map → node-registry-extra-compat-dWrv7gpS.js.map} +1 -1
- package/{node-registry-extra-math-CsAHvIZo.js → node-registry-extra-math-Bn854sX9.js} +2 -2
- package/{node-registry-extra-math-CsAHvIZo.js.map → node-registry-extra-math-Bn854sX9.js.map} +1 -1
- package/{node-renderable-DlLIdBmd.js → node-renderable-B5G8WcdH.js} +41 -22
- package/node-renderable-B5G8WcdH.js.map +1 -0
- package/{node-shadow-DKrcqmNg.js → node-shadow-CVIUlNf0.js} +7 -7
- package/node-shadow-CVIUlNf0.js.map +1 -0
- package/{normal-map-fragment-DpsIXrJf.js → normal-map-fragment-CQSxhjCy.js} +3 -3
- package/{normal-map-fragment-DpsIXrJf.js.map → normal-map-fragment-CQSxhjCy.js.map} +1 -1
- package/pack-mat4-with-offset-BqB8Jqo7.js +37 -0
- package/pack-mat4-with-offset-BqB8Jqo7.js.map +1 -0
- package/package.json +3 -10
- package/{parse-camera-DM3oJJeT.js → parse-camera-pBRT_6i5.js} +2 -2
- package/{parse-camera-DM3oJJeT.js.map → parse-camera-pBRT_6i5.js.map} +1 -1
- package/pbr-fog-wgsl-BqdCid6r.js +8 -0
- package/pbr-fog-wgsl-BqdCid6r.js.map +1 -0
- package/pbr-geometry-view-NiZY_juX.js +491 -0
- package/pbr-geometry-view-NiZY_juX.js.map +1 -0
- package/{pbr-metallic-roughness-block-h_KAOZrW.js → pbr-metallic-roughness-block-JBSi-tQN.js} +2 -2
- package/{pbr-metallic-roughness-block-h_KAOZrW.js.map → pbr-metallic-roughness-block-JBSi-tQN.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js → pbr-metallic-roughness-block-full-Ta9lR2cz.js} +2 -2
- package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js.map → pbr-metallic-roughness-block-full-Ta9lR2cz.js.map} +1 -1
- package/{pbr-mr-helper-core-CIwm-T1G.js → pbr-mr-helper-core-BVWNR08D.js} +2 -2
- package/{pbr-mr-helper-core-CIwm-T1G.js.map → pbr-mr-helper-core-BVWNR08D.js.map} +1 -1
- package/{pbr-refraction-DGmMSa2v.js → pbr-refraction-C9FvFmAp.js} +2 -2
- package/{pbr-refraction-DGmMSa2v.js.map → pbr-refraction-C9FvFmAp.js.map} +1 -1
- package/{pbr-renderable-BJxUtPBb.js → pbr-renderable-DzUF2QIk.js} +118 -58
- package/pbr-renderable-DzUF2QIk.js.map +1 -0
- package/{pbr-shadow-fragment-LO9SlbJj.js → pbr-shadow-fragment-CnqnbGYS.js} +6 -1
- package/pbr-shadow-fragment-CnqnbGYS.js.map +1 -0
- package/{pbr-template-ext-8q7BcTDf.js → pbr-template-ext-CGgB2n2y.js} +3 -2
- package/{pbr-template-ext-8q7BcTDf.js.map → pbr-template-ext-CGgB2n2y.js.map} +1 -1
- package/{pbr-tracking-B3alzn91.js → pbr-tracking-3tU1kqea.js} +2 -2
- package/{pbr-tracking-B3alzn91.js.map → pbr-tracking-3tU1kqea.js.map} +1 -1
- package/pbr-transmission-ext-BcLjRxfB.js +190 -0
- package/pbr-transmission-ext-BcLjRxfB.js.map +1 -0
- package/recast-navigation.wasm-DG_0AFuk.js +8706 -0
- package/recast-navigation.wasm-DG_0AFuk.js.map +1 -0
- package/recast-navigation.wasm-compat-C-Bf2ylB.js +8692 -0
- package/recast-navigation.wasm-compat-C-Bf2ylB.js.map +1 -0
- package/{reflectance-fragment-BCrgPmrt.js → reflectance-fragment-Dbpgw3Jt.js} +2 -2
- package/{reflectance-fragment-BCrgPmrt.js.map → reflectance-fragment-Dbpgw3Jt.js.map} +1 -1
- package/{rgbd-decode-DCvzUYeI.js → rgbd-decode-DoyUquy3.js} +7 -6
- package/rgbd-decode-DoyUquy3.js.map +1 -0
- package/{scene-material-swap-C2ykv55W.js → scene-material-swap-nNUH4nGn.js} +11 -4
- package/scene-material-swap-nNUH4nGn.js.map +1 -0
- package/screenshot-readback-D0Sj9qq3.js +92 -0
- package/screenshot-readback-D0Sj9qq3.js.map +1 -0
- package/{mesh-features-BLENkYVt.js → shader-composer-BUD_pSX4.js} +7 -55
- package/shader-composer-BUD_pSX4.js.map +1 -0
- package/{shader-renderable-D-6796KR.js → shader-renderable-D7-RyVxa.js} +62 -27
- package/shader-renderable-D7-RyVxa.js.map +1 -0
- package/shader-thin-instance-DuBotxDO.js +150 -0
- package/shader-thin-instance-DuBotxDO.js.map +1 -0
- package/shadow-fragment-core-DHN2G6FI.js.map +1 -1
- package/{sheen-fragment-Dze2f7XJ.js → sheen-fragment-1MkEMcbc.js} +2 -2
- package/{sheen-fragment-Dze2f7XJ.js.map → sheen-fragment-1MkEMcbc.js.map} +1 -1
- package/{singlelight-directional-wgsl-CmUDZxwz.js → singlelight-directional-wgsl-BsV8G456.js} +2 -2
- package/{singlelight-directional-wgsl-CmUDZxwz.js.map → singlelight-directional-wgsl-BsV8G456.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-t-83IP_s.js → singlelight-hemispheric-wgsl-Bo0jKlW5.js} +2 -2
- package/{singlelight-hemispheric-wgsl-t-83IP_s.js.map → singlelight-hemispheric-wgsl-Bo0jKlW5.js.map} +1 -1
- package/{singlelight-point-wgsl-CLzULIYV.js → singlelight-point-wgsl-DV39UP5Y.js} +2 -2
- package/{singlelight-point-wgsl-CLzULIYV.js.map → singlelight-point-wgsl-DV39UP5Y.js.map} +1 -1
- package/{singlelight-spot-wgsl-DEEUrfVM.js → singlelight-spot-wgsl-yg3od6vL.js} +2 -2
- package/{singlelight-spot-wgsl-DEEUrfVM.js.map → singlelight-spot-wgsl-yg3od6vL.js.map} +1 -1
- package/{skeleton-fragment-B_XlFbtx.js → skeleton-fragment-DdxYG6kv.js} +2 -2
- package/{skeleton-fragment-B_XlFbtx.js.map → skeleton-fragment-DdxYG6kv.js.map} +1 -1
- package/{skybox-renderable-DDwzu-PT.js → skybox-renderable-CJD4XmX5.js} +8 -9
- package/skybox-renderable-CJD4XmX5.js.map +1 -0
- package/{splat-ply-compressed-BahdBG1r.js → splat-ply-compressed-DHjyiVmI.js} +9 -8
- package/splat-ply-compressed-DHjyiVmI.js.map +1 -0
- package/{standard-renderable-GjxL9xSf.js → standard-pipeline-XTbHL7MY.js} +12 -257
- package/standard-pipeline-XTbHL7MY.js.map +1 -0
- package/standard-renderable-CREWLNHI.js +191 -0
- package/standard-renderable-CREWLNHI.js.map +1 -0
- package/{std-ambient-fragment-BoUsD06w.js → std-ambient-fragment-Bjx3VFrr.js} +2 -2
- package/{std-ambient-fragment-BoUsD06w.js.map → std-ambient-fragment-Bjx3VFrr.js.map} +1 -1
- package/{std-cube-reflection-fragment-ulqc3bsP.js → std-cube-reflection-fragment-y9WWdXUt.js} +2 -2
- package/{std-cube-reflection-fragment-ulqc3bsP.js.map → std-cube-reflection-fragment-y9WWdXUt.js.map} +1 -1
- package/{std-emissive-fragment-DNGj1HdQ.js → std-emissive-fragment-C8Lnmojh.js} +2 -2
- package/{std-emissive-fragment-DNGj1HdQ.js.map → std-emissive-fragment-C8Lnmojh.js.map} +1 -1
- package/{std-lightmap-fragment-Bqj89aIe.js → std-lightmap-fragment-DFxGcoA5.js} +2 -2
- package/{std-lightmap-fragment-Bqj89aIe.js.map → std-lightmap-fragment-DFxGcoA5.js.map} +1 -1
- package/{std-opacity-fragment-KuPh5N2Z.js → std-opacity-fragment-EXzFWiSp.js} +2 -2
- package/{std-opacity-fragment-KuPh5N2Z.js.map → std-opacity-fragment-EXzFWiSp.js.map} +1 -1
- package/{std-reflection-fragment-BA5Ghn_M.js → std-reflection-fragment-BoJORqpG.js} +2 -2
- package/{std-reflection-fragment-BA5Ghn_M.js.map → std-reflection-fragment-BoJORqpG.js.map} +1 -1
- package/std-shadow-fragment-Bq-Wc8UJ.js +13 -0
- package/std-shadow-fragment-Bq-Wc8UJ.js.map +1 -0
- package/{std-specular-fragment-CE-6scqd.js → std-specular-fragment-CM5R5j2g.js} +2 -2
- package/{std-specular-fragment-CE-6scqd.js.map → std-specular-fragment-CM5R5j2g.js.map} +1 -1
- package/{std-tracking-CNKZ-hJN.js → std-tracking-Cif_wXeT.js} +2 -2
- package/{std-tracking-CNKZ-hJN.js.map → std-tracking-Cif_wXeT.js.map} +1 -1
- package/{subsurface-fragment-liM3y2-P.js → subsurface-fragment-BEaAXYXz.js} +2 -2
- package/{subsurface-fragment-liM3y2-P.js.map → subsurface-fragment-BEaAXYXz.js.map} +1 -1
- package/swapchain-overlay-UCLilhbq.js +37 -0
- package/swapchain-overlay-UCLilhbq.js.map +1 -0
- package/thin-instance-cull-binding-DWKUt5ZN.js +310 -0
- package/thin-instance-cull-binding-DWKUt5ZN.js.map +1 -0
- package/{thin-instance-gpu-C9Gv_Z1w.js → thin-instance-gpu-BDdRcNAh.js} +30 -5
- package/thin-instance-gpu-BDdRcNAh.js.map +1 -0
- package/{tracking-primitives-wgdBY85t.js → tracking-primitives-CglRNTlX.js} +2 -2
- package/{tracking-primitives-wgdBY85t.js.map → tracking-primitives-CglRNTlX.js.map} +1 -1
- package/{unlit-fragment-BIlhJpz6.js → unlit-fragment-kxfZWlnp.js} +2 -2
- package/{unlit-fragment-BIlhJpz6.js.map → unlit-fragment-kxfZWlnp.js.map} +1 -1
- package/{wgsl-helpers-DyzNzCeE.js → wgsl-helpers-D8sl1VVA.js} +4 -4
- package/{wgsl-helpers-DyzNzCeE.js.map → wgsl-helpers-D8sl1VVA.js.map} +1 -1
- package/assets/splat-sort-worker-Crg3CaCc.js.map +0 -1
- package/background-dds-skybox-yHTqabU3.js.map +0 -1
- package/background-ground-DIw6D3qf.js.map +0 -1
- package/background-hdr-skybox-c4uuTmkP.js.map +0 -1
- package/background-solid-skybox-DPGBpPbm.js.map +0 -1
- package/billboard-renderable-D8mlVGCd.js.map +0 -1
- package/create-skeleton-C9JdIJnb.js.map +0 -1
- package/cubemap-skybox-material-DvXMVc4k.js.map +0 -1
- package/emissive-fragment-BnNvbBCw.js.map +0 -1
- package/gaussian-splatting-pipeline-sh-DgJl7l56.js.map +0 -1
- package/gltf-animation-D7uyTyO3.js.map +0 -1
- package/gltf-ext-basisu-CPg5kPrx.js.map +0 -1
- package/gltf-ext-quantization-CpZyLDIz.js.map +0 -1
- package/gltf-feature-animation-pointer-BjpwOOqo.js.map +0 -1
- package/gltf-feature-draco-yGSMGTE3.js.map +0 -1
- package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +0 -1
- package/gltf-feature-meshopt-Des96YFI.js.map +0 -1
- package/gltf-feature-morph-CKCw6tkX.js.map +0 -1
- package/gltf-glb-parser-D6UZWFuC.js.map +0 -1
- package/gltf-interleave-DGnUlz28.js.map +0 -1
- package/gltf-pbr-builder-ext-BFOxOCnQ.js.map +0 -1
- package/gs-picking-pipeline-DzfMASL9.js.map +0 -1
- package/index-C8HOR2sB.js +0 -19222
- package/index-C8HOR2sB.js.map +0 -1
- package/mesh-features-BLENkYVt.js.map +0 -1
- package/node-env-BPZXZzBf.js.map +0 -1
- package/node-registry-DwgC4yth.js +0 -190
- package/node-registry-DwgC4yth.js.map +0 -1
- package/node-renderable-DlLIdBmd.js.map +0 -1
- package/node-shadow-DKrcqmNg.js.map +0 -1
- package/pbr-renderable-BJxUtPBb.js.map +0 -1
- package/pbr-shadow-fragment-LO9SlbJj.js.map +0 -1
- package/pbr-transmission-ext-BxW4CEGu.js +0 -581
- package/pbr-transmission-ext-BxW4CEGu.js.map +0 -1
- package/rgbd-decode-DCvzUYeI.js.map +0 -1
- package/scene-material-swap-C2ykv55W.js.map +0 -1
- package/shader-renderable-D-6796KR.js.map +0 -1
- package/skybox-renderable-DDwzu-PT.js.map +0 -1
- package/splat-ply-compressed-BahdBG1r.js.map +0 -1
- package/standard-renderable-GjxL9xSf.js.map +0 -1
- package/std-shadow-fragment-FNQfrJuC.js +0 -8
- package/std-shadow-fragment-FNQfrJuC.js.map +0 -1
- package/swapchain-overlay-DcCSFDp7.js +0 -35
- package/swapchain-overlay-DcCSFDp7.js.map +0 -1
- package/thin-instance-gpu-C9Gv_Z1w.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aG as WGSL } from "./index-CLElg2Bo.js";
|
|
2
2
|
function bjsTypeToNodeType(t) {
|
|
3
3
|
if (t === 1 || t === 2) {
|
|
4
4
|
return "f32";
|
|
@@ -106,4 +106,4 @@ const emitter = {
|
|
|
106
106
|
export {
|
|
107
107
|
emitter
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=input-block-
|
|
109
|
+
//# sourceMappingURL=input-block-DqEedWF2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-block-
|
|
1
|
+
{"version":3,"file":"input-block-DqEedWF2.js","sources":["../src/material/node/blocks/input-block.ts"],"sourcesContent":["/** InputBlock emitter.\n *\n * Three modes (BJS NodeMaterialBlockConnectionPointMode):\n * 0 = Uniform — inline value becomes a field in the node UBO.\n * 1 = Attribute — bound to a vertex attribute (position/normal/uv/...).\n * 2 = Varying — interpolated from a system/pre-existing varying.\n *\n * For attributes we declare the vertex attribute (dedup by name) and, if the\n * value is consumed in fragment stage, a varying to carry it across.\n */\n\nimport type { BlockEmitter, NodeBuildState, NodeExpr, NodeValueType, Stage, NodeBlock } from \"../node-types.js\";\nimport { WGSL } from \"../node-types.js\";\n\ntype BjsType = number; // NodeMaterialBlockConnectionPointTypes\n\nfunction bjsTypeToNodeType(t: BjsType): NodeValueType {\n // bitflags: 0x1=Float, 0x4=Vec2, 0x8=Vec3, 0x10=Vec4, 0x20=Color3, 0x40=Color4\n if (t === 0x1 || t === 0x2) {\n return \"f32\";\n }\n if (t === 0x4) {\n return \"vec2f\";\n }\n if (t === 0x8 || t === 0x20) {\n return \"vec3f\";\n }\n if (t === 0x10 || t === 0x40) {\n return \"vec4f\";\n }\n if (t === 0x80) {\n return \"mat4f\";\n }\n throw new Error(`InputBlock: unsupported BJS connection point type 0x${t.toString(16)}`);\n}\n\nfunction wgslLiteral(value: unknown, type: NodeValueType): string {\n if (type === \"f32\") {\n const f = typeof value === \"number\" ? value : 0;\n return formatFloat(f);\n }\n if (Array.isArray(value)) {\n const parts = value.map((v) => formatFloat(typeof v === \"number\" ? v : 0)).join(\", \");\n return `${WGSL[type]}(${parts})`;\n }\n // Fallback to zero.\n if (type === \"vec2f\") {\n return \"vec2<f32>(0.0, 0.0)\";\n }\n if (type === \"vec3f\") {\n return \"vec3<f32>(0.0, 0.0, 0.0)\";\n }\n if (type === \"vec4f\") {\n return \"vec4<f32>(0.0, 0.0, 0.0, 0.0)\";\n }\n return \"0.0\";\n}\n\nfunction formatFloat(n: number): string {\n if (Number.isInteger(n)) {\n return `${n}.0`;\n }\n return `${n}`;\n}\n\n// Known mesh attributes — maps InputBlock.name → WGSL type.\nconst ATTRIBUTE_TYPES: Record<string, NodeValueType> = {\n position: \"vec3f\",\n normal: \"vec3f\",\n tangent: \"vec4f\",\n uv: \"vec2f\",\n uv2: \"vec2f\",\n color: \"vec4f\",\n matricesIndices: \"vec4f\",\n matricesWeights: \"vec4f\",\n matricesIndicesExtra: \"vec4f\",\n matricesWeightsExtra: \"vec4f\",\n};\n\nfunction emitAttribute(block: NodeBlock, stage: Stage, state: NodeBuildState): NodeExpr {\n const attrName = block.name;\n const type = ATTRIBUTE_TYPES[attrName];\n if (!type) {\n throw new Error(`InputBlock: unknown mesh attribute \"${attrName}\"`);\n }\n const wgslType = WGSL[type];\n // Dedup vertex attribute.\n if (!state.vertexAttributes.find((a) => a._name === attrName)) {\n state.vertexAttributes.push({\n _name: attrName,\n _type: wgslType,\n _gpuFormat: type === \"vec2f\" ? \"float32x2\" : type === \"vec3f\" ? \"float32x3\" : \"float32x4\",\n _arrayStride: (type === \"vec2f\" ? 2 : type === \"vec3f\" ? 3 : 4) * 4,\n });\n }\n if (stage === \"vertex\") {\n return { expr: `in.${attrName}`, type };\n }\n // In fragment stage — bridge through a varying (idempotent).\n const vname = `v_attr_${attrName}`;\n if (!state.varyings.find((v) => v._name === vname)) {\n state.varyings.push({ _name: vname, _type: wgslType });\n state.vertex.body.push(`out.${vname} = in.${attrName};`);\n }\n return { expr: `in.${vname}`, type };\n}\n\n// BJS NodeMaterialSystemValues enum (Babylon.js master).\n// We map the commonly used ones to WGSL expressions sourced from scene/mesh UBOs.\n// For matrices not present in Lite's scene UBO (`projection` alone), we fall\n// back to the closest valid expression (or throw — caller decides).\nfunction emitSystemValue(block: NodeBlock, stage: Stage, state: NodeBuildState): NodeExpr {\n const sv = block.serialized[\"systemValue\"] as number | undefined;\n // Only sensible in the vertex stage for matrix types; for CameraPosition/FogColor either stage is fine.\n switch (sv) {\n case 1: // World\n return { expr: \"meshU.world\", type: \"mat4f\" };\n case 2: // View\n return { expr: \"sceneU.view\", type: \"mat4f\" };\n case 3: // Projection\n return { expr: \"sceneU.projection\", type: \"mat4f\" };\n case 4: // ViewProjection\n return { expr: \"sceneU.viewProjection\", type: \"mat4f\" };\n case 5: // WorldView\n return { expr: \"(sceneU.view * meshU.world)\", type: \"mat4f\" };\n case 6: // WorldViewProjection\n return { expr: \"(sceneU.viewProjection * meshU.world)\", type: \"mat4f\" };\n case 7: // CameraPosition\n return { expr: \"sceneU.vEyePosition.xyz\", type: \"vec3f\" };\n case 8: // FogColor\n return { expr: \"sceneU.vFogColor.xyz\", type: \"vec3f\" };\n default:\n throw new Error(`InputBlock: unsupported systemValue ${sv} on block \"${block.name}\"`);\n }\n void stage;\n void state;\n}\n\nfunction emitUniform(block: NodeBlock, state: NodeBuildState): NodeExpr {\n // Determine the WGSL type. BJS serializes the port type under `type`.\n const portType = (block.serialized[\"type\"] as BjsType | undefined) ?? 0x10;\n const type = bjsTypeToNodeType(portType);\n // UBO field name — use block name (must be unique; parser enforces via namedInputs key).\n const fieldName = sanitize(block.name || `input${block.id}`);\n // Dedup.\n if (!state.nodeUboFields.find((f) => f._name === fieldName)) {\n state.nodeUboFields.push({ _name: fieldName, _type: WGSL[type] as any });\n // If this is a literal value (no override yet), it will be written into the\n // UBO at material-build time; for shader generation we just reference the field.\n // We ignore the inline literal here — the UBO write path handles that.\n }\n void wgslLiteral; // reserved for future default-literal constant-fold optimization\n return { expr: `nodeU.${fieldName}`, type };\n}\n\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, \"_\");\n}\n\nexport const emitter: BlockEmitter = {\n className: \"InputBlock\",\n emit(block, _outputName, stage, state, _ctx) {\n const mode = (block.serialized[\"mode\"] ?? block.serialized[\"_mode\"]) as number | undefined;\n if (mode === 1) {\n return emitAttribute(block, stage, state);\n }\n // System-value uniforms (World, WVP, CameraPosition, …) come from scene/mesh UBOs\n // rather than the material's node UBO, so they never appear in `nodeUboFields`.\n const sv = block.serialized[\"systemValue\"];\n if (typeof sv === \"number\") {\n return emitSystemValue(block, stage, state);\n }\n // Default to Uniform (mode 0 or unspecified).\n return emitUniform(block, state);\n },\n};\n"],"names":[],"mappings":";AAgBA,SAAS,kBAAkB,GAA2B;AAElD,MAAI,MAAM,KAAO,MAAM,GAAK;AACxB,WAAO;AAAA,EACX;AACA,MAAI,MAAM,GAAK;AACX,WAAO;AAAA,EACX;AACA,MAAI,MAAM,KAAO,MAAM,IAAM;AACzB,WAAO;AAAA,EACX;AACA,MAAI,MAAM,MAAQ,MAAM,IAAM;AAC1B,WAAO;AAAA,EACX;AACA,MAAI,MAAM,KAAM;AACZ,WAAO;AAAA,EACX;AACA,QAAM,IAAI,MAAM,uDAAuD,EAAE,SAAS,EAAE,CAAC,EAAE;AAC3F;AAgCA,MAAM,kBAAiD;AAAA,EACnD,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,sBAAsB;AAC1B;AAEA,SAAS,cAAc,OAAkB,OAAc,OAAiC;AACpF,QAAM,WAAW,MAAM;AACvB,QAAM,OAAO,gBAAgB,QAAQ;AACrC,MAAI,CAAC,MAAM;AACP,UAAM,IAAI,MAAM,uCAAuC,QAAQ,GAAG;AAAA,EACtE;AACA,QAAM,WAAW,KAAK,IAAI;AAE1B,MAAI,CAAC,MAAM,iBAAiB,KAAK,CAAC,MAAM,EAAE,UAAU,QAAQ,GAAG;AAC3D,UAAM,iBAAiB,KAAK;AAAA,MACxB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY,SAAS,UAAU,cAAc,SAAS,UAAU,cAAc;AAAA,MAC9E,eAAe,SAAS,UAAU,IAAI,SAAS,UAAU,IAAI,KAAK;AAAA,IAAA,CACrE;AAAA,EACL;AACA,MAAI,UAAU,UAAU;AACpB,WAAO,EAAE,MAAM,MAAM,QAAQ,IAAI,KAAA;AAAA,EACrC;AAEA,QAAM,QAAQ,UAAU,QAAQ;AAChC,MAAI,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,GAAG;AAChD,UAAM,SAAS,KAAK,EAAE,OAAO,OAAO,OAAO,UAAU;AACrD,UAAM,OAAO,KAAK,KAAK,OAAO,KAAK,SAAS,QAAQ,GAAG;AAAA,EAC3D;AACA,SAAO,EAAE,MAAM,MAAM,KAAK,IAAI,KAAA;AAClC;AAMA,SAAS,gBAAgB,OAAkB,OAAc,OAAiC;AACtF,QAAM,KAAK,MAAM,WAAW,aAAa;AAEzC,UAAQ,IAAA;AAAA,IACJ,KAAK;AACD,aAAO,EAAE,MAAM,eAAe,MAAM,QAAA;AAAA,IACxC,KAAK;AACD,aAAO,EAAE,MAAM,eAAe,MAAM,QAAA;AAAA,IACxC,KAAK;AACD,aAAO,EAAE,MAAM,qBAAqB,MAAM,QAAA;AAAA,IAC9C,KAAK;AACD,aAAO,EAAE,MAAM,yBAAyB,MAAM,QAAA;AAAA,IAClD,KAAK;AACD,aAAO,EAAE,MAAM,+BAA+B,MAAM,QAAA;AAAA,IACxD,KAAK;AACD,aAAO,EAAE,MAAM,yCAAyC,MAAM,QAAA;AAAA,IAClE,KAAK;AACD,aAAO,EAAE,MAAM,2BAA2B,MAAM,QAAA;AAAA,IACpD,KAAK;AACD,aAAO,EAAE,MAAM,wBAAwB,MAAM,QAAA;AAAA,IACjD;AACI,YAAM,IAAI,MAAM,uCAAuC,EAAE,cAAc,MAAM,IAAI,GAAG;AAAA,EAAA;AAIhG;AAEA,SAAS,YAAY,OAAkB,OAAiC;AAEpE,QAAM,WAAY,MAAM,WAAW,MAAM,KAA6B;AACtE,QAAM,OAAO,kBAAkB,QAAQ;AAEvC,QAAM,YAAY,SAAS,MAAM,QAAQ,QAAQ,MAAM,EAAE,EAAE;AAE3D,MAAI,CAAC,MAAM,cAAc,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,GAAG;AACzD,UAAM,cAAc,KAAK,EAAE,OAAO,WAAW,OAAO,KAAK,IAAI,GAAU;AAAA,EAI3E;AAEA,SAAO,EAAE,MAAM,SAAS,SAAS,IAAI,KAAA;AACzC;AAEA,SAAS,SAAS,MAAsB;AACpC,SAAO,KAAK,QAAQ,kBAAkB,GAAG;AAC7C;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,MAAM;AACzC,UAAM,OAAQ,MAAM,WAAW,MAAM,KAAK,MAAM,WAAW,OAAO;AAClE,QAAI,SAAS,GAAG;AACZ,aAAO,cAAc,OAAO,OAAO,KAAK;AAAA,IAC5C;AAGA,UAAM,KAAK,MAAM,WAAW,aAAa;AACzC,QAAI,OAAO,OAAO,UAAU;AACxB,aAAO,gBAAgB,KAAmB;AAAA,IAC9C;AAEA,WAAO,YAAY,OAAO,KAAK;AAAA,EACnC;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aX as PBR2_HAS_IRIDESCENCE_MAP, aY as PBR2_HAS_IRIDESCENCE_THICKNESS_MAP, aZ as PBR2_HAS_IRIDESCENCE, aJ as PBR_HAS_METALLIC_REFLECTANCE_MAP, aK as PBR_HAS_REFLECTANCE_MAP, aL as PBR2_HAS_REFLECTANCE_FACTORS } from "./index-CLElg2Bo.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
const PBR2_HAS_IRIDESCENCE_UV_TX = 1 << 20;
|
|
4
4
|
const PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX = 1 << 21;
|
|
@@ -240,4 +240,4 @@ export {
|
|
|
240
240
|
pbrExt,
|
|
241
241
|
writeIridescenceUBO
|
|
242
242
|
};
|
|
243
|
-
//# sourceMappingURL=iridescence-fragment-
|
|
243
|
+
//# sourceMappingURL=iridescence-fragment-BHU59-gQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iridescence-fragment-Gymp7or5.js","sources":["../src/material/pbr/fragments/iridescence-fragment.ts"],"sourcesContent":["/**\n * Iridescence Fragment\n *\n * Native PBR thin-film iridescence (BJS PBRMaterial.iridescence and\n * KHR_materials_iridescence). Modifies the already-computed base-layer colorF0\n * before direct and IBL lighting consume it.\n */\n\nimport type { BindingDecl, ShaderFragment, UboField } from \"../../../shader/fragment-types.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport type { IridescenceProps, PbrMaterialProps } from \"../pbr-material.js\";\nimport {\n PBR_HAS_METALLIC_REFLECTANCE_MAP,\n PBR_HAS_REFLECTANCE_MAP,\n PBR2_HAS_IRIDESCENCE,\n PBR2_HAS_IRIDESCENCE_MAP,\n PBR2_HAS_IRIDESCENCE_THICKNESS_MAP,\n PBR2_HAS_REFLECTANCE_FACTORS,\n} from \"../pbr-flag-bits.js\";\n\nconst STAGE_FRAGMENT = 0x2;\nconst PBR2_HAS_IRIDESCENCE_UV_TX = 1 << 20;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX = 1 << 21;\nconst PBR2_HAS_IRIDESCENCE_UV2 = 1 << 22;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV2 = 1 << 23;\nconst IRI_MSH_HAS_UV2 = 1 << 7;\n\nconst IRIDESCENCE_HELPERS = `const IRI_XYZ_TO_REC709:mat3x3<f32>=mat3x3<f32>(\n3.2404542,-0.9692660,0.0556434,\n-1.5371385,1.8760108,-0.2040259,\n-0.4985314,0.0415560,1.0572252);\nfn iri_square3(x:vec3<f32>)->vec3<f32>{return x*x;}\nfn iri_iorFromAirF0(f0:vec3<f32>)->vec3<f32>{\nlet s=sqrt(clamp(f0,vec3<f32>(0.0),vec3<f32>(0.9999)));\nreturn (vec3<f32>(1.0)+s)/(vec3<f32>(1.0)-s);\n}\nfn iri_r0FromIor3(iorT:vec3<f32>,iorI:f32)->vec3<f32>{return iri_square3((iorT-vec3<f32>(iorI))/(iorT+vec3<f32>(iorI)));}\nfn iri_r0FromIor(iorT:f32,iorI:f32)->f32{let r=(iorT-iorI)/(iorT+iorI);return r*r;}\nfn iri_fresSchlick(c:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-c;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\nfn iri_evalSensitivity(opd:f32,shift:vec3<f32>)->vec3<f32>{\nlet phase=6.283185307179586*opd*1.0e-9;\nlet val=vec3<f32>(5.4856e-13,4.4201e-13,5.2481e-13);\nlet pos=vec3<f32>(1.6810e+06,1.7953e+06,2.2084e+06);\nlet vr=vec3<f32>(4.3278e+09,9.3046e+09,6.6121e+09);\nvar xyz=val*sqrt(6.283185307179586*vr)*cos(pos*phase+shift)*exp(-(phase*phase)*vr);\nxyz.x=xyz.x+9.7470e-14*sqrt(6.283185307179586*4.5282e+09)*cos(2.2399e+06*phase+shift.x)*exp(-4.5282e+09*phase*phase);\nxyz=xyz/1.0685e-7;\nreturn IRI_XYZ_TO_REC709*xyz;\n}\nfn iri_eval(outsideIor:f32,eta2:f32,cosTheta1:f32,thickness:f32,baseF0:vec3<f32>)->vec3<f32>{\nlet iridescenceIor=mix(outsideIor,eta2,smoothstep(0.0,0.03,thickness));\nlet eta=outsideIor/iridescenceIor;\nlet sinTheta2Sq=eta*eta*(1.0-cosTheta1*cosTheta1);\nlet cosTheta2Sq=1.0-sinTheta2Sq;\nif(cosTheta2Sq<0.0){return vec3<f32>(1.0);}\nlet cosTheta2=sqrt(cosTheta2Sq);\nlet r0=iri_r0FromIor(iridescenceIor,outsideIor);\nlet r12=iri_fresSchlick(cosTheta1,vec3<f32>(r0),vec3<f32>(1.0)).x;\nlet t121=1.0-r12;\nvar phi12=0.0;\nif(iridescenceIor<outsideIor){phi12=3.141592653589793;}\nlet phi21=3.141592653589793-phi12;\nlet baseIor=iri_iorFromAirF0(baseF0);\nlet r1=iri_r0FromIor3(baseIor,iridescenceIor);\nlet r23=iri_fresSchlick(cosTheta2,r1,vec3<f32>(1.0));\nvar phi23=vec3<f32>(0.0);\nif(baseIor.x<iridescenceIor){phi23.x=3.141592653589793;}\nif(baseIor.y<iridescenceIor){phi23.y=3.141592653589793;}\nif(baseIor.z<iridescenceIor){phi23.z=3.141592653589793;}\nlet opd=2.0*iridescenceIor*thickness*cosTheta2;\nlet phi=vec3<f32>(phi21)+phi23;\nlet r123=clamp(vec3<f32>(r12)*r23,vec3<f32>(1e-5),vec3<f32>(0.9999));\nlet smallR123=sqrt(r123);\nlet rs=(t121*t121)*r23/(vec3<f32>(1.0)-r123);\nvar outI=vec3<f32>(r12)+rs;\nvar cm=rs-vec3<f32>(t121);\nfor(var m:i32=1;m<=2;m=m+1){\ncm=cm*smallR123;\noutI=outI+cm*(2.0*iri_evalSensitivity(f32(m)*opd,f32(m)*phi));\n}\nreturn max(outI,vec3<f32>(0.0));\n}`;\n\nconst IRI_TEX: ReadonlyArray<readonly [number, \"texture\" | \"thicknessTexture\"]> = [\n [PBR2_HAS_IRIDESCENCE_MAP, \"texture\"],\n [PBR2_HAS_IRIDESCENCE_THICKNESS_MAP, \"thicknessTexture\"],\n];\n\nfunction uvBaseExpr(features2: number, meshFeatures: number, uv2Flag: number): string {\n return (features2 & uv2Flag) !== 0 && (meshFeatures & IRI_MSH_HAS_UV2) !== 0 ? \"input.uv2\" : \"input.uv\";\n}\n\nfunction uvDecl(name: string, baseUv: string, hasTx: boolean): string {\n return hasTx ? `let ${name}=vec2<f32>(dot(material.${name}m.xy,${baseUv}),dot(material.${name}m.zw,${baseUv}))+material.${name}t.xy;` : `let ${name}=${baseUv};`;\n}\n\nfunction uvTransformUboFields(name: string): UboField[] {\n return [\n { _name: `${name}m`, _type: \"vec4<f32>\" },\n { _name: `${name}t`, _type: \"vec4<f32>\" },\n ];\n}\n\nfunction writeUvTransform(data: Float32Array, offsets: ReadonlyMap<string, number>, name: string, tex: Texture2D | undefined): void {\n const mOff = offsets.get(`${name}m`);\n const tOff = offsets.get(`${name}t`);\n if (mOff === undefined || tOff === undefined) {\n return;\n }\n const mi = mOff / 4;\n const ti = tOff / 4;\n const sx = tex?.uScale ?? 1;\n const sy = tex?.vScale ?? 1;\n const ang = tex?.uAng ?? 0;\n const ox = tex?.uOffset ?? 0;\n const oy = tex?.vOffset ?? 0;\n if (ang === 0) {\n data[mi] = sx;\n data[mi + 1] = 0;\n data[mi + 2] = 0;\n data[mi + 3] = sy;\n } else {\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n data[mi] = c * sx;\n data[mi + 1] = -s * sy;\n data[mi + 2] = s * sx;\n data[mi + 3] = c * sy;\n }\n data[ti] = ox;\n data[ti + 1] = oy;\n data[ti + 2] = 0;\n data[ti + 3] = 0;\n}\n\nfunction createIridescenceFragment(features: number, features2: number, meshFeatures: number): ShaderFragment | null {\n if ((features2 & PBR2_HAS_IRIDESCENCE) === 0) {\n return null;\n }\n const hasIntensityMap = (features2 & PBR2_HAS_IRIDESCENCE_MAP) !== 0;\n const hasThicknessMap = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_MAP) !== 0;\n const hasIntensityUvTx = (features2 & PBR2_HAS_IRIDESCENCE_UV_TX) !== 0;\n const hasThicknessUvTx = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX) !== 0;\n const bindings: BindingDecl[] = [];\n const uboFields: UboField[] = [{ _name: \"iridescenceParams\", _type: \"vec4<f32>\" }];\n if (hasIntensityMap) {\n bindings.push(\n { _name: \"iridescenceTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasIntensityUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceUV\"));\n }\n }\n if (hasThicknessMap) {\n bindings.push(\n { _name: \"iridescenceThicknessTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceThicknessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasThicknessUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceThicknessUV\"));\n }\n }\n\n const scopeVars: string[] = [];\n if (hasIntensityMap) {\n scopeVars.push(uvDecl(\"iridescenceUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_UV2), hasIntensityUvTx));\n }\n if (hasThicknessMap) {\n scopeVars.push(uvDecl(\"iridescenceThicknessUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_THICKNESS_UV2), hasThicknessUvTx));\n }\n\n const intensity = hasIntensityMap ? \"material.iridescenceParams.x*textureSample(iridescenceTexture,iridescenceSampler_,iridescenceUV).r\" : \"material.iridescenceParams.x\";\n const thickness = hasThicknessMap\n ? \"mix(material.iridescenceParams.z,material.iridescenceParams.w,textureSample(iridescenceThicknessTexture,iridescenceThicknessSampler_,iridescenceThicknessUV).g)\"\n : \"material.iridescenceParams.w\";\n return {\n _id: \"iridescence\",\n _dependencies:\n (features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) !== 0 || (features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0 ? [\"reflectance\"] : undefined,\n _uboFields: uboFields,\n _bindings: bindings,\n _helperFunctions: IRIDESCENCE_HELPERS,\n _fragmentSlots: {\n ...(scopeVars.length ? { SV: scopeVars.join(\"\\n\") } : undefined),\n MF: `{\nlet iriIntensity=clamp(${intensity},0.0,1.0);\nlet iriThickness=max(${thickness},0.0);\nlet iriF0=iri_eval(1.0,max(material.iridescenceParams.y,1.0001),NdotV,iriThickness,colorF0);\ncolorF0=mix(colorF0,iriF0,iriIntensity);\n}`,\n },\n };\n}\n\nexport function writeIridescenceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const iri = material.iridescence as IridescenceProps | undefined;\n if (!iri?.isEnabled || !offsets.has(\"iridescenceParams\")) {\n return;\n }\n const off = offsets.get(\"iridescenceParams\")! / 4;\n data[off] = iri.intensity ?? 1.0;\n data[off + 1] = iri.indexOfRefraction ?? 1.3;\n data[off + 2] = iri.minimumThickness ?? 100;\n data[off + 3] = iri.maximumThickness ?? 400;\n writeUvTransform(data, offsets, \"iridescenceUV\", iri.texture);\n writeUvTransform(data, offsets, \"iridescenceThicknessUV\", iri.thicknessTexture);\n}\n\nexport const pbrExt: PbrExt = {\n id: \"iridescence\",\n phase: \"base-tex\",\n detect(mat) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri?.isEnabled) {\n return { f: 0, f2: 0 };\n }\n let f2 = PBR2_HAS_IRIDESCENCE;\n if (iri.texture) {\n f2 |= PBR2_HAS_IRIDESCENCE_MAP;\n if ((iri.texture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV_TX;\n }\n if ((iri.texture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV2;\n }\n }\n if (iri.thicknessTexture) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_MAP;\n if ((iri.thicknessTexture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX;\n }\n if ((iri.thicknessTexture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV2;\n }\n }\n return { f: 0, f2 };\n },\n frag: (ctx) => createIridescenceFragment(ctx._features, ctx._features2, ctx._meshFeatures),\n writeUbo: writeIridescenceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n const iri = (ctx._material as PbrMaterialProps).iridescence;\n if (!iri) {\n return b;\n }\n for (const [flag, key] of IRI_TEX) {\n const tex = iri[key];\n if ((ctx._features2 & flag) !== 0 && tex) {\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n }\n }\n return b;\n },\n textures(mat, t) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri) {\n return;\n }\n for (const [, key] of IRI_TEX) {\n const tex = iri[key];\n if (tex) {\n t.push(tex);\n }\n }\n },\n};\n"],"names":[],"mappings":";AAqBA,MAAM,iBAAiB;AACvB,MAAM,6BAA6B,KAAK;AACxC,MAAM,uCAAuC,KAAK;AAClD,MAAM,2BAA2B,KAAK;AACtC,MAAM,qCAAqC,KAAK;AAChD,MAAM,kBAAkB,KAAK;AAE7B,MAAM,sBAAsB;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;AA4D5B,MAAM,UAA4E;AAAA,EAC9E,CAAC,0BAA0B,SAAS;AAAA,EACpC,CAAC,oCAAoC,kBAAkB;AAC3D;AAEA,SAAS,WAAW,WAAmB,cAAsB,SAAyB;AAClF,UAAQ,YAAY,aAAa,MAAM,eAAe,qBAAqB,IAAI,cAAc;AACjG;AAEA,SAAS,OAAO,MAAc,QAAgB,OAAwB;AAClE,SAAO,QAAQ,OAAO,IAAI,2BAA2B,IAAI,QAAQ,MAAM,kBAAkB,IAAI,QAAQ,MAAM,eAAe,IAAI,UAAU,OAAO,IAAI,IAAI,MAAM;AACjK;AAEA,SAAS,qBAAqB,MAA0B;AACpD,SAAO;AAAA,IACH,EAAE,OAAO,GAAG,IAAI,KAAK,OAAO,YAAA;AAAA,IAC5B,EAAE,OAAO,GAAG,IAAI,KAAK,OAAO,YAAA;AAAA,EAAY;AAEhD;AAEA,SAAS,iBAAiB,MAAoB,SAAsC,MAAc,KAAkC;AAChI,QAAM,OAAO,QAAQ,IAAI,GAAG,IAAI,GAAG;AACnC,QAAM,OAAO,QAAQ,IAAI,GAAG,IAAI,GAAG;AACnC,MAAI,SAAS,UAAa,SAAS,QAAW;AAC1C;AAAA,EACJ;AACA,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,QAAM,MAAK,2BAAK,WAAU;AAC1B,QAAM,MAAK,2BAAK,WAAU;AAC1B,QAAM,OAAM,2BAAK,SAAQ;AACzB,QAAM,MAAK,2BAAK,YAAW;AAC3B,QAAM,MAAK,2BAAK,YAAW;AAC3B,MAAI,QAAQ,GAAG;AACX,SAAK,EAAE,IAAI;AACX,SAAK,KAAK,CAAC,IAAI;AACf,SAAK,KAAK,CAAC,IAAI;AACf,SAAK,KAAK,CAAC,IAAI;AAAA,EACnB,OAAO;AACH,UAAM,IAAI,KAAK,IAAI,GAAG;AACtB,UAAM,IAAI,KAAK,IAAI,GAAG;AACtB,SAAK,EAAE,IAAI,IAAI;AACf,SAAK,KAAK,CAAC,IAAI,CAAC,IAAI;AACpB,SAAK,KAAK,CAAC,IAAI,IAAI;AACnB,SAAK,KAAK,CAAC,IAAI,IAAI;AAAA,EACvB;AACA,OAAK,EAAE,IAAI;AACX,OAAK,KAAK,CAAC,IAAI;AACf,OAAK,KAAK,CAAC,IAAI;AACf,OAAK,KAAK,CAAC,IAAI;AACnB;AAEA,SAAS,0BAA0B,UAAkB,WAAmB,cAA6C;AACjH,OAAK,YAAY,0BAA0B,GAAG;AAC1C,WAAO;AAAA,EACX;AACA,QAAM,mBAAmB,YAAY,8BAA8B;AACnE,QAAM,mBAAmB,YAAY,wCAAwC;AAC7E,QAAM,oBAAoB,YAAY,gCAAgC;AACtE,QAAM,oBAAoB,YAAY,0CAA0C;AAChF,QAAM,WAA0B,CAAA;AAChC,QAAM,YAAwB,CAAC,EAAE,OAAO,qBAAqB,OAAO,aAAa;AACjF,MAAI,iBAAiB;AACjB,aAAS;AAAA,MACL,EAAE,OAAO,sBAAsB,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1G,EAAE,OAAO,uBAAuB,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAEtH,QAAI,kBAAkB;AAClB,gBAAU,KAAK,GAAG,qBAAqB,eAAe,CAAC;AAAA,IAC3D;AAAA,EACJ;AACA,MAAI,iBAAiB;AACjB,aAAS;AAAA,MACL,EAAE,OAAO,+BAA+B,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MACnH,EAAE,OAAO,gCAAgC,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAE/H,QAAI,kBAAkB;AAClB,gBAAU,KAAK,GAAG,qBAAqB,wBAAwB,CAAC;AAAA,IACpE;AAAA,EACJ;AAEA,QAAM,YAAsB,CAAA;AAC5B,MAAI,iBAAiB;AACjB,cAAU,KAAK,OAAO,iBAAiB,WAAW,WAAW,cAAc,wBAAwB,GAAG,gBAAgB,CAAC;AAAA,EAC3H;AACA,MAAI,iBAAiB;AACjB,cAAU,KAAK,OAAO,0BAA0B,WAAW,WAAW,cAAc,kCAAkC,GAAG,gBAAgB,CAAC;AAAA,EAC9I;AAEA,QAAM,YAAY,kBAAkB,uGAAuG;AAC3I,QAAM,YAAY,kBACZ,oKACA;AACN,SAAO;AAAA,IACH,KAAK;AAAA,IACL,gBACK,YAAY,mCAAmC,8BAA8B,MAAM,YAAY,kCAAkC,IAAI,CAAC,aAAa,IAAI;AAAA,IAC5J,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,MACZ,GAAI,UAAU,SAAS,EAAE,IAAI,UAAU,KAAK,IAAI,EAAA,IAAM;AAAA,MACtD,IAAI;AAAA,yBACS,SAAS;AAAA,uBACX,SAAS;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAIxB;AAER;AAEO,SAAS,oBAAoB,MAAoB,UAA4B,SAA4C;AAC5H,QAAM,MAAM,SAAS;AACrB,MAAI,EAAC,2BAAK,cAAa,CAAC,QAAQ,IAAI,mBAAmB,GAAG;AACtD;AAAA,EACJ;AACA,QAAM,MAAM,QAAQ,IAAI,mBAAmB,IAAK;AAChD,OAAK,GAAG,IAAI,IAAI,aAAa;AAC7B,OAAK,MAAM,CAAC,IAAI,IAAI,qBAAqB;AACzC,OAAK,MAAM,CAAC,IAAI,IAAI,oBAAoB;AACxC,OAAK,MAAM,CAAC,IAAI,IAAI,oBAAoB;AACxC,mBAAiB,MAAM,SAAS,iBAAiB,IAAI,OAAO;AAC5D,mBAAiB,MAAM,SAAS,0BAA0B,IAAI,gBAAgB;AAClF;AAEO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO,KAAK;AACR,UAAM,MAAO,IAAyB;AACtC,QAAI,EAAC,2BAAK,YAAW;AACjB,aAAO,EAAE,GAAG,GAAG,IAAI,EAAA;AAAA,IACvB;AACA,QAAI,KAAK;AACT,QAAI,IAAI,SAAS;AACb,YAAM;AACN,UAAK,IAAI,QAAiC,QAAQ;AAC9C,cAAM;AAAA,MACV;AACA,UAAK,IAAI,QAAmC,cAAc,GAAG;AACzD,cAAM;AAAA,MACV;AAAA,IACJ;AACA,QAAI,IAAI,kBAAkB;AACtB,YAAM;AACN,UAAK,IAAI,iBAA0C,QAAQ;AACvD,cAAM;AAAA,MACV;AACA,UAAK,IAAI,iBAA4C,cAAc,GAAG;AAClE,cAAM;AAAA,MACV;AAAA,IACJ;AACA,WAAO,EAAE,GAAG,GAAG,GAAA;AAAA,EACnB;AAAA,EACA,MAAM,CAAC,QAAQ,0BAA0B,IAAI,WAAW,IAAI,YAAY,IAAI,aAAa;AAAA,EACzF,UAAU;AAAA,EACV,KAAK,KAAK,SAAS,GAAG;AAClB,UAAM,MAAO,IAAI,UAA+B;AAChD,QAAI,CAAC,KAAK;AACN,aAAO;AAAA,IACX;AACA,eAAW,CAAC,MAAM,GAAG,KAAK,SAAS;AAC/B,YAAM,MAAM,IAAI,GAAG;AACnB,WAAK,IAAI,aAAa,UAAU,KAAK,KAAK;AACtC,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,MAAM;AACjD,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AAAA,MACxD;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,SAAS,KAAK,GAAG;AACb,UAAM,MAAO,IAAyB;AACtC,QAAI,CAAC,KAAK;AACN;AAAA,IACJ;AACA,eAAW,CAAA,EAAG,GAAG,KAAK,SAAS;AAC3B,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,KAAK;AACL,UAAE,KAAK,GAAG;AAAA,MACd;AAAA,IACJ;AAAA,EACJ;AACJ;"}
|
|
1
|
+
{"version":3,"file":"iridescence-fragment-BHU59-gQ.js","sources":["../src/material/pbr/fragments/iridescence-fragment.ts"],"sourcesContent":["/**\n * Iridescence Fragment\n *\n * Native PBR thin-film iridescence (BJS PBRMaterial.iridescence and\n * KHR_materials_iridescence). Modifies the already-computed base-layer colorF0\n * before direct and IBL lighting consume it.\n */\n\nimport type { BindingDecl, ShaderFragment, UboField } from \"../../../shader/fragment-types.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport type { IridescenceProps, PbrMaterialProps } from \"../pbr-material.js\";\nimport {\n PBR_HAS_METALLIC_REFLECTANCE_MAP,\n PBR_HAS_REFLECTANCE_MAP,\n PBR2_HAS_IRIDESCENCE,\n PBR2_HAS_IRIDESCENCE_MAP,\n PBR2_HAS_IRIDESCENCE_THICKNESS_MAP,\n PBR2_HAS_REFLECTANCE_FACTORS,\n} from \"../pbr-flag-bits.js\";\n\nconst STAGE_FRAGMENT = 0x2;\nconst PBR2_HAS_IRIDESCENCE_UV_TX = 1 << 20;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX = 1 << 21;\nconst PBR2_HAS_IRIDESCENCE_UV2 = 1 << 22;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV2 = 1 << 23;\nconst IRI_MSH_HAS_UV2 = 1 << 7;\n\nconst IRIDESCENCE_HELPERS = `const IRI_XYZ_TO_REC709:mat3x3<f32>=mat3x3<f32>(\n3.2404542,-0.9692660,0.0556434,\n-1.5371385,1.8760108,-0.2040259,\n-0.4985314,0.0415560,1.0572252);\nfn iri_square3(x:vec3<f32>)->vec3<f32>{return x*x;}\nfn iri_iorFromAirF0(f0:vec3<f32>)->vec3<f32>{\nlet s=sqrt(clamp(f0,vec3<f32>(0.0),vec3<f32>(0.9999)));\nreturn (vec3<f32>(1.0)+s)/(vec3<f32>(1.0)-s);\n}\nfn iri_r0FromIor3(iorT:vec3<f32>,iorI:f32)->vec3<f32>{return iri_square3((iorT-vec3<f32>(iorI))/(iorT+vec3<f32>(iorI)));}\nfn iri_r0FromIor(iorT:f32,iorI:f32)->f32{let r=(iorT-iorI)/(iorT+iorI);return r*r;}\nfn iri_fresSchlick(c:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-c;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\nfn iri_evalSensitivity(opd:f32,shift:vec3<f32>)->vec3<f32>{\nlet phase=6.283185307179586*opd*1.0e-9;\nlet val=vec3<f32>(5.4856e-13,4.4201e-13,5.2481e-13);\nlet pos=vec3<f32>(1.6810e+06,1.7953e+06,2.2084e+06);\nlet vr=vec3<f32>(4.3278e+09,9.3046e+09,6.6121e+09);\nvar xyz=val*sqrt(6.283185307179586*vr)*cos(pos*phase+shift)*exp(-(phase*phase)*vr);\nxyz.x=xyz.x+9.7470e-14*sqrt(6.283185307179586*4.5282e+09)*cos(2.2399e+06*phase+shift.x)*exp(-4.5282e+09*phase*phase);\nxyz=xyz/1.0685e-7;\nreturn IRI_XYZ_TO_REC709*xyz;\n}\nfn iri_eval(outsideIor:f32,eta2:f32,cosTheta1:f32,thickness:f32,baseF0:vec3<f32>)->vec3<f32>{\nlet iridescenceIor=mix(outsideIor,eta2,smoothstep(0.0,0.03,thickness));\nlet eta=outsideIor/iridescenceIor;\nlet sinTheta2Sq=eta*eta*(1.0-cosTheta1*cosTheta1);\nlet cosTheta2Sq=1.0-sinTheta2Sq;\nif(cosTheta2Sq<0.0){return vec3<f32>(1.0);}\nlet cosTheta2=sqrt(cosTheta2Sq);\nlet r0=iri_r0FromIor(iridescenceIor,outsideIor);\nlet r12=iri_fresSchlick(cosTheta1,vec3<f32>(r0),vec3<f32>(1.0)).x;\nlet t121=1.0-r12;\nvar phi12=0.0;\nif(iridescenceIor<outsideIor){phi12=3.141592653589793;}\nlet phi21=3.141592653589793-phi12;\nlet baseIor=iri_iorFromAirF0(baseF0);\nlet r1=iri_r0FromIor3(baseIor,iridescenceIor);\nlet r23=iri_fresSchlick(cosTheta2,r1,vec3<f32>(1.0));\nvar phi23=vec3<f32>(0.0);\nif(baseIor.x<iridescenceIor){phi23.x=3.141592653589793;}\nif(baseIor.y<iridescenceIor){phi23.y=3.141592653589793;}\nif(baseIor.z<iridescenceIor){phi23.z=3.141592653589793;}\nlet opd=2.0*iridescenceIor*thickness*cosTheta2;\nlet phi=vec3<f32>(phi21)+phi23;\nlet r123=clamp(vec3<f32>(r12)*r23,vec3<f32>(1e-5),vec3<f32>(0.9999));\nlet smallR123=sqrt(r123);\nlet rs=(t121*t121)*r23/(vec3<f32>(1.0)-r123);\nvar outI=vec3<f32>(r12)+rs;\nvar cm=rs-vec3<f32>(t121);\nfor(var m:i32=1;m<=2;m=m+1){\ncm=cm*smallR123;\noutI=outI+cm*(2.0*iri_evalSensitivity(f32(m)*opd,f32(m)*phi));\n}\nreturn max(outI,vec3<f32>(0.0));\n}`;\n\nconst IRI_TEX: ReadonlyArray<readonly [number, \"texture\" | \"thicknessTexture\"]> = [\n [PBR2_HAS_IRIDESCENCE_MAP, \"texture\"],\n [PBR2_HAS_IRIDESCENCE_THICKNESS_MAP, \"thicknessTexture\"],\n];\n\nfunction uvBaseExpr(features2: number, meshFeatures: number, uv2Flag: number): string {\n return (features2 & uv2Flag) !== 0 && (meshFeatures & IRI_MSH_HAS_UV2) !== 0 ? \"input.uv2\" : \"input.uv\";\n}\n\nfunction uvDecl(name: string, baseUv: string, hasTx: boolean): string {\n return hasTx ? `let ${name}=vec2<f32>(dot(material.${name}m.xy,${baseUv}),dot(material.${name}m.zw,${baseUv}))+material.${name}t.xy;` : `let ${name}=${baseUv};`;\n}\n\nfunction uvTransformUboFields(name: string): UboField[] {\n return [\n { _name: `${name}m`, _type: \"vec4<f32>\" },\n { _name: `${name}t`, _type: \"vec4<f32>\" },\n ];\n}\n\nfunction writeUvTransform(data: Float32Array, offsets: ReadonlyMap<string, number>, name: string, tex: Texture2D | undefined): void {\n const mOff = offsets.get(`${name}m`);\n const tOff = offsets.get(`${name}t`);\n if (mOff === undefined || tOff === undefined) {\n return;\n }\n const mi = mOff / 4;\n const ti = tOff / 4;\n const sx = tex?.uScale ?? 1;\n const sy = tex?.vScale ?? 1;\n const ang = tex?.uAng ?? 0;\n const ox = tex?.uOffset ?? 0;\n const oy = tex?.vOffset ?? 0;\n if (ang === 0) {\n data[mi] = sx;\n data[mi + 1] = 0;\n data[mi + 2] = 0;\n data[mi + 3] = sy;\n } else {\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n data[mi] = c * sx;\n data[mi + 1] = -s * sy;\n data[mi + 2] = s * sx;\n data[mi + 3] = c * sy;\n }\n data[ti] = ox;\n data[ti + 1] = oy;\n data[ti + 2] = 0;\n data[ti + 3] = 0;\n}\n\nfunction createIridescenceFragment(features: number, features2: number, meshFeatures: number): ShaderFragment | null {\n if ((features2 & PBR2_HAS_IRIDESCENCE) === 0) {\n return null;\n }\n const hasIntensityMap = (features2 & PBR2_HAS_IRIDESCENCE_MAP) !== 0;\n const hasThicknessMap = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_MAP) !== 0;\n const hasIntensityUvTx = (features2 & PBR2_HAS_IRIDESCENCE_UV_TX) !== 0;\n const hasThicknessUvTx = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX) !== 0;\n const bindings: BindingDecl[] = [];\n const uboFields: UboField[] = [{ _name: \"iridescenceParams\", _type: \"vec4<f32>\" }];\n if (hasIntensityMap) {\n bindings.push(\n { _name: \"iridescenceTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasIntensityUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceUV\"));\n }\n }\n if (hasThicknessMap) {\n bindings.push(\n { _name: \"iridescenceThicknessTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceThicknessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasThicknessUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceThicknessUV\"));\n }\n }\n\n const scopeVars: string[] = [];\n if (hasIntensityMap) {\n scopeVars.push(uvDecl(\"iridescenceUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_UV2), hasIntensityUvTx));\n }\n if (hasThicknessMap) {\n scopeVars.push(uvDecl(\"iridescenceThicknessUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_THICKNESS_UV2), hasThicknessUvTx));\n }\n\n const intensity = hasIntensityMap ? \"material.iridescenceParams.x*textureSample(iridescenceTexture,iridescenceSampler_,iridescenceUV).r\" : \"material.iridescenceParams.x\";\n const thickness = hasThicknessMap\n ? \"mix(material.iridescenceParams.z,material.iridescenceParams.w,textureSample(iridescenceThicknessTexture,iridescenceThicknessSampler_,iridescenceThicknessUV).g)\"\n : \"material.iridescenceParams.w\";\n return {\n _id: \"iridescence\",\n _dependencies:\n (features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) !== 0 || (features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0 ? [\"reflectance\"] : undefined,\n _uboFields: uboFields,\n _bindings: bindings,\n _helperFunctions: IRIDESCENCE_HELPERS,\n _fragmentSlots: {\n ...(scopeVars.length ? { SV: scopeVars.join(\"\\n\") } : undefined),\n MF: `{\nlet iriIntensity=clamp(${intensity},0.0,1.0);\nlet iriThickness=max(${thickness},0.0);\nlet iriF0=iri_eval(1.0,max(material.iridescenceParams.y,1.0001),NdotV,iriThickness,colorF0);\ncolorF0=mix(colorF0,iriF0,iriIntensity);\n}`,\n },\n };\n}\n\nexport function writeIridescenceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const iri = material.iridescence as IridescenceProps | undefined;\n if (!iri?.isEnabled || !offsets.has(\"iridescenceParams\")) {\n return;\n }\n const off = offsets.get(\"iridescenceParams\")! / 4;\n data[off] = iri.intensity ?? 1.0;\n data[off + 1] = iri.indexOfRefraction ?? 1.3;\n data[off + 2] = iri.minimumThickness ?? 100;\n data[off + 3] = iri.maximumThickness ?? 400;\n writeUvTransform(data, offsets, \"iridescenceUV\", iri.texture);\n writeUvTransform(data, offsets, \"iridescenceThicknessUV\", iri.thicknessTexture);\n}\n\nexport const pbrExt: PbrExt = {\n id: \"iridescence\",\n phase: \"base-tex\",\n detect(mat) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri?.isEnabled) {\n return { f: 0, f2: 0 };\n }\n let f2 = PBR2_HAS_IRIDESCENCE;\n if (iri.texture) {\n f2 |= PBR2_HAS_IRIDESCENCE_MAP;\n if ((iri.texture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV_TX;\n }\n if ((iri.texture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV2;\n }\n }\n if (iri.thicknessTexture) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_MAP;\n if ((iri.thicknessTexture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX;\n }\n if ((iri.thicknessTexture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV2;\n }\n }\n return { f: 0, f2 };\n },\n frag: (ctx) => createIridescenceFragment(ctx._features, ctx._features2, ctx._meshFeatures),\n writeUbo: writeIridescenceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n const iri = (ctx._material as PbrMaterialProps).iridescence;\n if (!iri) {\n return b;\n }\n for (const [flag, key] of IRI_TEX) {\n const tex = iri[key];\n if ((ctx._features2 & flag) !== 0 && tex) {\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n }\n }\n return b;\n },\n textures(mat, t) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri) {\n return;\n }\n for (const [, key] of IRI_TEX) {\n const tex = iri[key];\n if (tex) {\n t.push(tex);\n }\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-CLElg2Bo.js";
|
|
2
2
|
const NME_LIGHTING_HELPER_KEY = "nme_lighting";
|
|
3
3
|
const NME_LIGHTING_HELPER_WGSL = `struct NmeLightResult {
|
|
4
4
|
diffuse: vec3<f32>,
|
|
@@ -120,4 +120,4 @@ const emitter = {
|
|
|
120
120
|
export {
|
|
121
121
|
emitter
|
|
122
122
|
};
|
|
123
|
-
//# sourceMappingURL=light-block-
|
|
123
|
+
//# sourceMappingURL=light-block-Bv37V8vl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light-block-
|
|
1
|
+
{"version":3,"file":"light-block-Bv37V8vl.js","sources":["../src/material/node/blocks/_lighting-helper.ts","../src/material/node/blocks/light-block.ts"],"sourcesContent":["/** Shared WGSL helper source for LightBlock.\n *\n * This module exports just the `nme_computeLighting` function definition.\n * The surrounding `LightEntry` / `lightsUniforms` struct decls and the\n * `@group(1) @binding(N) var<uniform> nmeLights` declaration are injected\n * by the pipeline builder (see node-pipeline.ts) once `state.usesLightsUbo`\n * is true. Keeping them out of the helper lets a single `MAX_LIGHTS` value\n * (at compile time) drive both the WGSL array length and the BGL entry size.\n */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport const NME_LIGHTING_HELPER_KEY = \"nme_lighting\";\n\nexport const NME_LIGHTING_HELPER_WGSL = `struct NmeLightResult {\n diffuse: vec3<f32>,\n specular: vec3<f32>,\n shadow: f32,\n};\n\nfn nme_computeLighting(\n worldPos: vec3<f32>,\n worldNormal: vec3<f32>,\n cameraPos: vec3<f32>,\n diffuseColor: vec3<f32>,\n specularColor: vec3<f32>,\n glossiness: f32,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmeLightResult {\n var result: NmeLightResult;\n result.diffuse = vec3<f32>(0.0);\n result.specular = vec3<f32>(0.0);\n var aggShadow: f32 = 0.0;\n var numLights: f32 = 0.0;\n let viewDir = normalize(cameraPos - worldPos);\n let N = normalize(worldNormal);\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 L = nmeLights.lights[lightIndex];\n let t = u32(L.vLightData.w);\n let sh = shadowFactors[lightIndex];\n var lv: vec3<f32>;\n var atten: f32 = 1.0;\n if (t == 3u) {\n // Hemispheric: ground/sky mix via half-lambert.\n let nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\n let diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\n result.diffuse = result.diffuse + diff * diffuseColor * sh;\n let H = normalize(viewDir + normalize(L.vLightData.xyz));\n let sf = pow(max(0.0, dot(N, H)), max(1.0, glossiness));\n result.specular = result.specular + sf * L.vLightSpecular.rgb * specularColor * sh;\n aggShadow = aggShadow + sh;\n numLights = numLights + 1.0;\n continue;\n }\n if (t == 1u) {\n // Directional: vLightData.xyz is the light's forward direction.\n lv = normalize(-L.vLightData.xyz);\n } else {\n // Point / Spot: vLightData.xyz is world-space position; range in vLightDiffuse.a.\n let d = L.vLightData.xyz - worldPos;\n atten = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\n lv = normalize(d);\n if (t == 2u) {\n // Spot cone falloff (vLightDirection.xyz=dir, .w=cosHalfAngle; vLightSpecular.a=exp).\n let c = max(0.0, dot(L.vLightDirection.xyz, -lv));\n if (c >= L.vLightDirection.w) {\n atten = atten * max(0.0, pow(c, L.vLightSpecular.a));\n } else {\n atten = 0.0;\n }\n }\n }\n let NdotL = max(0.0, dot(N, lv));\n result.diffuse = result.diffuse + L.vLightDiffuse.rgb * diffuseColor * NdotL * atten * sh;\n let H = normalize(lv + viewDir);\n let NdotH = max(0.0, dot(N, H));\n let specFactor = pow(NdotH, max(1.0, glossiness));\n result.specular = result.specular + L.vLightSpecular.rgb * specularColor * specFactor * atten * sh;\n aggShadow = aggShadow + sh;\n numLights = numLights + 1.0;\n }\n if (numLights > 0.0) {\n result.shadow = aggShadow / numLights;\n } else {\n result.shadow = 1.0;\n }\n return result;\n}\n`;\n","/** LightBlock — classic Blinn-Phong lighting.\n *\n * Inputs: worldPosition, worldNormal, cameraPosition, glossiness, glossPower\n * (optional), diffuseColor, specularColor.\n * Outputs: diffuseOutput (vec3), specularOutput (vec3), shadow (f32).\n *\n * The actual math lives in `_lighting-helper.ts` and is injected into the\n * fragment helper map. The pipeline builder is responsible for binding the\n * scene's Lights UBO under `nmeLights` / `nmeLightsCount` at group/binding\n * slots reserved for NME.\n */\n\nimport type { BlockEmitter, NodeExpr } from \"../node-types.js\";\nimport { NME_LIGHTING_HELPER_KEY, NME_LIGHTING_HELPER_WGSL } from \"./_lighting-helper.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(\n block: Parameters<BlockEmitter[\"emit\"]>[0],\n inputName: string,\n fallback: string,\n stage: Parameters<BlockEmitter[\"emit\"]>[2],\n state: Parameters<BlockEmitter[\"emit\"]>[3],\n ctx: Parameters<BlockEmitter[\"emit\"]>[4],\n target: \"vec3f\" | \"f32\"\n): 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: \"LightBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n // Inject helper + mark the lights UBO as required.\n state.fragment.helpers.set(NME_LIGHTING_HELPER_KEY, NME_LIGHTING_HELPER_WGSL);\n state.usesLightsUbo = true;\n\n const memoKey = `_light_${block.id}_call`;\n const callExpr = state.fragment.memo.get(memoKey);\n let callVar: string;\n if (!callExpr) {\n const wp = resolveOptional(block, \"worldPosition\", \"vec3<f32>(0.0)\", stage, state, ctx, \"vec3f\");\n const wn = resolveOptional(block, \"worldNormal\", \"vec3<f32>(0.0, 1.0, 0.0)\", stage, state, ctx, \"vec3f\");\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", stage, state, ctx, \"vec3f\");\n const dc = resolveOptional(block, \"diffuseColor\", \"vec3<f32>(1.0)\", stage, state, ctx, \"vec3f\");\n const sc = resolveOptional(block, \"specularColor\", \"vec3<f32>(1.0)\", stage, state, ctx, \"vec3f\");\n const gl = resolveOptional(block, \"glossiness\", \"1.0\", stage, state, ctx, \"f32\");\n // BJS multiplies glossiness * glossPower; default glossPower is 1024 when unconnected.\n const gp = resolveOptional(block, \"glossPower\", \"1024.0\", stage, state, ctx, \"f32\");\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_lt${ctx.temp(state, \"light\")}`;\n state.fragment.body.push(`let ${callVar} = nme_computeLighting(${wp}, ${wn}, ${cp}, ${dc}, ${sc}, (${gl}) * (${gp}), ${sf});`);\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n } else {\n callVar = callExpr.expr;\n }\n\n const out: Record<string, NodeExpr> = {\n diffuseOutput: { expr: `${callVar}.diffuse`, type: \"vec3f\" },\n specularOutput: { expr: `${callVar}.specular`, type: \"vec3f\" },\n shadow: { expr: `${callVar}.shadow`, type: \"f32\" },\n };\n return out[outputName] ?? { expr: `${callVar}.diffuse`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":";AAYO,MAAM,0BAA0B;AAEhC,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAaR,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BASZ,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;ACpBxC,MAAM,qBAAqB,cAAc,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAEpG,SAAS,gBACL,OACA,WACA,UACA,OACA,OACA,KACA,QACM;AACN,QAAM,QAAQ,MAAM,OAAO,IAAI,SAAS;AACxC,MAAI,+BAAO,QAAQ;AACf,WAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,WAAW,OAAO,KAAK,GAAG,MAAM,EAAE;AAAA,EACzE;AACA,SAAO;AACX;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;AAEvC,UAAM,SAAS,QAAQ,IAAI,yBAAyB,wBAAwB;AAC5E,UAAM,gBAAgB;AAEtB,UAAM,UAAU,UAAU,MAAM,EAAE;AAClC,UAAM,WAAW,MAAM,SAAS,KAAK,IAAI,OAAO;AAChD,QAAI;AACJ,QAAI,CAAC,UAAU;AACX,YAAM,KAAK,gBAAgB,OAAO,iBAAiB,kBAAkB,OAAO,OAAO,KAAK,OAAO;AAC/F,YAAM,KAAK,gBAAgB,OAAO,eAAe,4BAA4B,OAAO,OAAO,KAAK,OAAO;AACvG,YAAM,KAAK,gBAAgB,OAAO,kBAAkB,oBAAoB,OAAO,OAAO,KAAK,OAAO;AAClG,YAAM,KAAK,gBAAgB,OAAO,gBAAgB,kBAAkB,OAAO,OAAO,KAAK,OAAO;AAC9F,YAAM,KAAK,gBAAgB,OAAO,iBAAiB,kBAAkB,OAAO,OAAO,KAAK,OAAO;AAC/F,YAAM,KAAK,gBAAgB,OAAO,cAAc,OAAO,OAAO,OAAO,KAAK,KAAK;AAE/E,YAAM,KAAK,gBAAgB,OAAO,cAAc,UAAU,OAAO,OAAO,KAAK,KAAK;AAClF,YAAM,KAAK,MAAM,aAAa,SAAS,IAAI,iCAAiC;AAC5E,gBAAU,MAAM,IAAI,KAAK,OAAO,OAAO,CAAC;AACxC,YAAM,SAAS,KAAK,KAAK,OAAO,OAAO,0BAA0B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI;AAC7H,YAAM,SAAS,KAAK,IAAI,SAAS,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,IACrE,OAAO;AACH,gBAAU,SAAS;AAAA,IACvB;AAEA,UAAM,MAAgC;AAAA,MAClC,eAAe,EAAE,MAAM,GAAG,OAAO,YAAY,MAAM,QAAA;AAAA,MACnD,gBAAgB,EAAE,MAAM,GAAG,OAAO,aAAa,MAAM,QAAA;AAAA,MACrD,QAAQ,EAAE,MAAM,GAAG,OAAO,WAAW,MAAM,MAAA;AAAA,IAAM;AAErD,WAAO,IAAI,UAAU,KAAK,EAAE,MAAM,GAAG,OAAO,YAAY,MAAM,QAAA;AAAA,EAClE;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aG as WGSL } from "./index-CLElg2Bo.js";
|
|
2
2
|
function loopKey(stage, blockId) {
|
|
3
3
|
return `${stage}|${blockId}`;
|
|
4
4
|
}
|
|
@@ -68,4 +68,4 @@ const emitter = {
|
|
|
68
68
|
export {
|
|
69
69
|
emitter
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=loop-block-
|
|
71
|
+
//# sourceMappingURL=loop-block-qTg8vb99.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-block-
|
|
1
|
+
{"version":3,"file":"loop-block-qTg8vb99.js","sources":["../src/material/node/blocks/loop-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, Stage } from \"../node-types.js\";\nimport { WGSL } from \"../node-types.js\";\n\nfunction loopKey(stage: Stage, blockId: number): string {\n return `${stage}|${blockId}`;\n}\n\nfunction storageWritesForLoop(block: NodeBlock, ctx: Parameters<BlockEmitter[\"emit\"]>[4]): NodeBlock[] {\n const writes: NodeBlock[] = [];\n for (const candidate of ctx.graph.blocks.values()) {\n if (candidate.className !== \"StorageWriteBlock\") {\n continue;\n }\n const loopID = candidate.inputs.get(\"loopID\")?.source;\n if (loopID?.blockId === block.id && loopID.outputName === \"loopID\") {\n writes.push(candidate);\n }\n }\n return writes;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"LoopBlock\",\n emit(block, outputName, stage, state, ctx) {\n const active = state.loopVariables.get(loopKey(stage, block.id));\n if (outputName === \"index\") {\n if (!active) {\n throw new Error(`LoopBlock \"${block.name}\": index can only be read while emitting the loop body`);\n }\n return { expr: `f32(${active.indexVar})`, type: \"f32\" };\n }\n if (outputName === \"loopID\") {\n throw new Error(`LoopBlock \"${block.name}\": loopID can only be consumed by StorageReadBlock/StorageWriteBlock`);\n }\n if (outputName !== \"output\") {\n throw new Error(`LoopBlock \"${block.name}\": unsupported output \"${outputName}\"`);\n }\n\n const initial = ctx.resolve(block, \"input\", stage, state);\n const valueVar = ctx.temp(state, \"loop\");\n const indexVar = ctx.temp(state, \"loopIndex\");\n const body = stage === \"vertex\" ? state.vertex.body : state.fragment.body;\n body.push(`var ${valueVar}: ${WGSL[initial.type]} = ${initial.expr};`);\n\n const iterationsInput = block.inputs.get(\"iterations\");\n const iterations = iterationsInput?.source\n ? `i32(${ctx.cast(ctx.resolve(block, \"iterations\", stage, state), \"f32\").expr})`\n : String(Math.max(0, Math.floor((block.serialized[\"iterations\"] as number | undefined) ?? 4)));\n\n body.push(`for (var ${indexVar} = 0; ${indexVar} < ${iterations}; ${indexVar} = ${indexVar} + 1) {`);\n const key = loopKey(stage, block.id);\n const previous = state.loopVariables.get(key);\n const stageState = stage === \"vertex\" ? state.vertex : state.fragment;\n const previousMemo = new Map(stageState.memo);\n state.loopVariables.set(key, { valueVar, valueType: initial.type, indexVar });\n try {\n for (const write of storageWritesForLoop(block, ctx)) {\n const value = ctx.cast(ctx.resolve(write, \"value\", stage, state), initial.type);\n body.push(`${valueVar} = ${value.expr};`);\n }\n } finally {\n stageState.memo.clear();\n for (const [memoKey, memoValue] of previousMemo) {\n stageState.memo.set(memoKey, memoValue);\n }\n if (previous) {\n state.loopVariables.set(key, previous);\n } else {\n state.loopVariables.delete(key);\n }\n }\n body.push(\"}\");\n return { expr: valueVar, type: initial.type };\n },\n};\n"],"names":[],"mappings":";AAGA,SAAS,QAAQ,OAAc,SAAyB;AACpD,SAAO,GAAG,KAAK,IAAI,OAAO;AAC9B;AAEA,SAAS,qBAAqB,OAAkB,KAAuD;;AACnG,QAAM,SAAsB,CAAA;AAC5B,aAAW,aAAa,IAAI,MAAM,OAAO,UAAU;AAC/C,QAAI,UAAU,cAAc,qBAAqB;AAC7C;AAAA,IACJ;AACA,UAAM,UAAS,eAAU,OAAO,IAAI,QAAQ,MAA7B,mBAAgC;AAC/C,SAAI,iCAAQ,aAAY,MAAM,MAAM,OAAO,eAAe,UAAU;AAChE,aAAO,KAAK,SAAS;AAAA,IACzB;AAAA,EACJ;AACA,SAAO;AACX;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;AACvC,UAAM,SAAS,MAAM,cAAc,IAAI,QAAQ,OAAO,MAAM,EAAE,CAAC;AAC/D,QAAI,eAAe,SAAS;AACxB,UAAI,CAAC,QAAQ;AACT,cAAM,IAAI,MAAM,cAAc,MAAM,IAAI,wDAAwD;AAAA,MACpG;AACA,aAAO,EAAE,MAAM,OAAO,OAAO,QAAQ,KAAK,MAAM,MAAA;AAAA,IACpD;AACA,QAAI,eAAe,UAAU;AACzB,YAAM,IAAI,MAAM,cAAc,MAAM,IAAI,sEAAsE;AAAA,IAClH;AACA,QAAI,eAAe,UAAU;AACzB,YAAM,IAAI,MAAM,cAAc,MAAM,IAAI,0BAA0B,UAAU,GAAG;AAAA,IACnF;AAEA,UAAM,UAAU,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACxD,UAAM,WAAW,IAAI,KAAK,OAAO,MAAM;AACvC,UAAM,WAAW,IAAI,KAAK,OAAO,WAAW;AAC5C,UAAM,OAAO,UAAU,WAAW,MAAM,OAAO,OAAO,MAAM,SAAS;AACrE,SAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AAErE,UAAM,kBAAkB,MAAM,OAAO,IAAI,YAAY;AACrD,UAAM,cAAa,mDAAiB,UAC9B,OAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,cAAc,OAAO,KAAK,GAAG,KAAK,EAAE,IAAI,MAC3E,OAAO,KAAK,IAAI,GAAG,KAAK,MAAO,MAAM,WAAW,YAAY,KAA4B,CAAC,CAAC,CAAC;AAEjG,SAAK,KAAK,YAAY,QAAQ,SAAS,QAAQ,MAAM,UAAU,KAAK,QAAQ,MAAM,QAAQ,SAAS;AACnG,UAAM,MAAM,QAAQ,OAAO,MAAM,EAAE;AACnC,UAAM,WAAW,MAAM,cAAc,IAAI,GAAG;AAC5C,UAAM,aAAa,UAAU,WAAW,MAAM,SAAS,MAAM;AAC7D,UAAM,eAAe,IAAI,IAAI,WAAW,IAAI;AAC5C,UAAM,cAAc,IAAI,KAAK,EAAE,UAAU,WAAW,QAAQ,MAAM,UAAU;AAC5E,QAAI;AACA,iBAAW,SAAS,qBAAqB,OAAO,GAAG,GAAG;AAClD,cAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK,GAAG,QAAQ,IAAI;AAC9E,aAAK,KAAK,GAAG,QAAQ,MAAM,MAAM,IAAI,GAAG;AAAA,MAC5C;AAAA,IACJ,UAAA;AACI,iBAAW,KAAK,MAAA;AAChB,iBAAW,CAAC,SAAS,SAAS,KAAK,cAAc;AAC7C,mBAAW,KAAK,IAAI,SAAS,SAAS;AAAA,MAC1C;AACA,UAAI,UAAU;AACV,cAAM,cAAc,IAAI,KAAK,QAAQ;AAAA,MACzC,OAAO;AACH,cAAM,cAAc,OAAO,GAAG;AAAA,MAClC;AAAA,IACJ;AACA,SAAK,KAAK,GAAG;AACb,WAAO,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAA;AAAA,EAC3C;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b6 as MSH_HAS_MORPH_TARGETS } from "./index-CLElg2Bo.js";
|
|
2
2
|
const STAGE_VERTEX = 1;
|
|
3
3
|
const MORPH_PRE_SKINNING = `var morphedPos = position;
|
|
4
4
|
var morphedNorm = normal;
|
|
@@ -56,4 +56,4 @@ export {
|
|
|
56
56
|
createMorphFragment,
|
|
57
57
|
pbrExt
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=morph-fragment-
|
|
59
|
+
//# sourceMappingURL=morph-fragment-BRCUr2wQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morph-fragment-
|
|
1
|
+
{"version":3,"file":"morph-fragment-BRCUr2wQ.js","sources":["../src/material/pbr/fragments/morph-fragment.ts"],"sourcesContent":["/**\n * Morph Target Fragment\n *\n * Vertex-stage morph target animation: texture-based morph deltas\n * applied before skinning. Only bundled when a scene uses morph targets.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\n\n// WebGPU shader stage constants\nconst STAGE_VERTEX = 0x1;\n\nconst MORPH_PRE_SKINNING = `var morphedPos = position;\nvar morphedNorm = normal;\nlet mCol = i32(vertexIndex % morph.texWidth);\nlet mRowInBand = i32(vertexIndex / morph.texWidth);\nfor (var i = 0u; i < morph.count; i = i + 1u) {\n let w = morph.weights[i];\n let posBase = i32(i * 2u) * i32(morph.rowsPerBand);\n let normBase = i32(i * 2u + 1u) * i32(morph.rowsPerBand);\n morphedPos = morphedPos + w * textureLoad(morphTargets, vec2<i32>(mCol, posBase + mRowInBand), 0).xyz;\n morphedNorm = morphedNorm + w * textureLoad(morphTargets, vec2<i32>(mCol, normBase + mRowInBand), 0).xyz;\n}`;\n\n/**\n * Create a morph target fragment.\n * The morph extension modifies position/normal variables before the world\n * transform, using morphedPos/morphedNorm in place of position/normal.\n */\nexport function createMorphFragment(): ShaderFragment {\n return {\n _id: \"morph\",\n\n _vertexBuiltins: [{ _name: \"vertexIndex\", _builtin: \"vertex_index\", _type: \"u32\" }],\n\n _vertexHelperFunctions: `struct morphUniforms {\\nweights: vec4<f32>,\\ncount: u32,\\ntexWidth: u32,\\nrowsPerBand: u32,\\n_p0: u32,\\n}`,\n\n _vertexBindings: [\n { _name: \"morphTargets\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" as const, _sampleType: \"unfilterable-float\" as const }, _visibility: STAGE_VERTEX },\n { _name: \"morph\", _type: { _kind: \"uniform-buffer\" as const }, _visibility: STAGE_VERTEX },\n ],\n\n _vertexSlots: {\n VR: MORPH_PRE_SKINNING,\n },\n };\n}\n\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { MSH_HAS_MORPH_TARGETS } from \"../../mesh-features.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"morph\",\n phase: \"vertex\",\n frag(ctx) {\n if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS)) {\n return null;\n }\n return createMorphFragment();\n },\n bind(ctx, entries, b) {\n const mesh = ctx._mesh;\n if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS) || !mesh?.morphTargets) {\n return b;\n }\n entries.push({ binding: b++, resource: mesh.morphTargets.texture.createView() });\n // Weights UBO is pushed separately by the pipeline (needs engine-side buffer handle).\n // Caller supplies weightsBuffer on mesh.morphTargets.\n if (mesh.morphTargets.weightsBuffer) {\n entries.push({ binding: b++, resource: { buffer: mesh.morphTargets.weightsBuffer } });\n }\n return b;\n },\n};\n"],"names":[],"mappings":";AAUA,MAAM,eAAe;AAErB,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpB,SAAS,sBAAsC;AAClD,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,iBAAiB,CAAC,EAAE,OAAO,eAAe,UAAU,gBAAgB,OAAO,OAAO;AAAA,IAElF,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAExB,iBAAiB;AAAA,MACb,EAAE,OAAO,gBAAgB,OAAO,EAAE,OAAO,WAAW,cAAc,mBAA4B,aAAa,wBAAiC,aAAa,aAAA;AAAA,MACzJ,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,iBAAA,GAA6B,aAAa,aAAA;AAAA,IAAa;AAAA,IAG7F,cAAc;AAAA,MACV,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAKO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,QAAI,EAAE,IAAI,gBAAgB,wBAAwB;AAC9C,aAAO;AAAA,IACX;AACA,WAAO,oBAAA;AAAA,EACX;AAAA,EACA,KAAK,KAAK,SAAS,GAAG;AAClB,UAAM,OAAO,IAAI;AACjB,QAAI,EAAE,IAAI,gBAAgB,0BAA0B,EAAC,6BAAM,eAAc;AACrE,aAAO;AAAA,IACX;AACA,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,aAAa,QAAQ,WAAA,EAAW,CAAG;AAG/E,QAAI,KAAK,aAAa,eAAe;AACjC,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,QAAQ,KAAK,aAAa,cAAA,EAAc,CAAG;AAAA,IACxF;AACA,WAAO;AAAA,EACX;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-CLElg2Bo.js";
|
|
2
2
|
function MULTI_LIGHT_STRUCTS() {
|
|
3
3
|
return `
|
|
4
4
|
struct LightEntry {
|
|
@@ -63,7 +63,7 @@ var directSpecular = vec3<f32>(0.0);
|
|
|
63
63
|
let directRoughness = max(roughness, AA_factor_x);
|
|
64
64
|
let directAlphaG = directRoughness * directRoughness + 0.0005;
|
|
65
65
|
var shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill("1.0").join(", ")});
|
|
66
|
-
let
|
|
66
|
+
let lightCount = min(mesh.lc, ${MAX_LIGHTS}u);
|
|
67
67
|
/*AS*/
|
|
68
68
|
// First-light aliases — kept at directLightBlock scope so the AD slot below
|
|
69
69
|
// (clearcoat / sheen / subsurface) sees the same single-light variable names
|
|
@@ -79,7 +79,7 @@ let lightAtten = pl0.atten * shadowFactors[lightIndex0];
|
|
|
79
79
|
let H = normalize(V + L);
|
|
80
80
|
let NdotH = clamp(dot(N, H), 0.0000001, 1.0);
|
|
81
81
|
let VdotH = saturate(dot(V, H));
|
|
82
|
-
for (var li = 0u; li <
|
|
82
|
+
for (var li = 0u; li < lightCount; li++) {
|
|
83
83
|
var pl: PbrLightResult;
|
|
84
84
|
let lightIndex = mli(li);
|
|
85
85
|
if (li == 0u) { pl = pl0; } else { pl = computePbrLight(lights.lights[lightIndex], N, input.worldPos, material.lightFalloffMode); }
|
|
@@ -109,4 +109,4 @@ export {
|
|
|
109
109
|
MULTI_LIGHT_STRUCTS,
|
|
110
110
|
getMultiLightLoop
|
|
111
111
|
};
|
|
112
|
-
//# sourceMappingURL=multilight-wgsl-
|
|
112
|
+
//# sourceMappingURL=multilight-wgsl-DMeppAdZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multilight-wgsl-
|
|
1
|
+
{"version":3,"file":"multilight-wgsl-DMeppAdZ.js","sources":["../src/material/pbr/fragments/multilight-wgsl.ts"],"sourcesContent":["/** Multi-light WGSL helpers for PBR template.\n * Separated into its own module so non-shadow PBR scenes don't pay the bundle cost. */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function MULTI_LIGHT_STRUCTS(): string {\n return `\nstruct LightEntry {\nvLightData: vec4<f32>,\nvLightDiffuse: vec4<f32>,\nvLightSpecular: vec4<f32>,\nvLightDirection: vec4<f32>,\n};\nstruct lightsUniforms {\ncount: u32, _p0: u32, _p1: u32, _p2: u32,\nlights: array<LightEntry, ${MAX_LIGHTS}>,\n};\n`;\n}\n\nexport const COMPUTE_PBR_LIGHT = `\nstruct PbrLightResult { L: vec3<f32>, NdotL: f32, atten: f32, color: vec3<f32>, specColor: vec3<f32>, isHemi: bool };\nfn computePbrLight(entry: LightEntry, N: vec3<f32>, worldPos: vec3<f32>, lightFalloffMode: f32) -> PbrLightResult {\nvar r: PbrLightResult;\nlet t = u32(entry.vLightData.w);\nr.isHemi = t == 3u;\nr.specColor = entry.vLightDiffuse.rgb;\nif (t == 3u) {\nr.L = normalize(entry.vLightData.xyz);\nr.NdotL = dot(N, r.L) * 0.5 + 0.5;\nr.atten = 1.0;\nr.color = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, r.NdotL);\nreturn r;\n}\nif (t == 1u) {\nr.L = normalize(-entry.vLightData.xyz);\nr.atten = 1.0;\n} else {\nlet toLight = entry.vLightData.xyz - worldPos;\nlet d2 = dot(toLight, toLight);\nlet dist = sqrt(d2);\nr.L = toLight / max(dist, 0.0001);\n let physicalFalloff = lightFalloffMode >= 0.5;\n let rangeAtt = select(max(0.0, 1.0 - dist / entry.vLightDiffuse.a), 1.0 / max(d2, 0.0000001), physicalFalloff);\n if (t == 2u) {\n let cosHalfAngle = entry.vLightDirection.w;\n let c = dot(-entry.vLightDirection.xyz, r.L);\n let standardDirFalloff = select(0.0, max(0.0, pow(max(c, 0.0), entry.vLightSpecular.a)), c >= cosHalfAngle);\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let physicalDirFalloff = exp2(kappa * (c - 1.0));\n r.atten = rangeAtt * select(standardDirFalloff, physicalDirFalloff, physicalFalloff);\n } else {\n r.atten = rangeAtt;\n }\n}\nr.NdotL = max(dot(N, r.L), 0.0);\nr.color = entry.vLightDiffuse.rgb;\nreturn r;\n}\n`;\n\n/** The multi-light direct lighting loop WGSL block for the PBR template.\n * Contains slot markers AD and BL for fragment injection.\n * Generated at call time because MAX_LIGHTS is runtime-configurable via `setMaxLights`. */\nexport function getMultiLightLoop(): string {\n return `var directDiffuse = vec3<f32>(0.0);\nvar directSpecular = vec3<f32>(0.0);\n// BJS direct-light specular: roughness is clamped by the geometric AA factor\n// BEFORE being squared (matches BJS pbrDirectLightingFunctions.fx line 103).\n// The IBL-path alphaG already has AA_factor_y additively baked in; direct\n// specular uses its own squaring after max(roughness, AA_factor_x).\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nlet lightCount = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AS*/\n// First-light aliases — kept at directLightBlock scope so the AD slot below\n// (clearcoat / sheen / subsurface) sees the same single-light variable names\n// it was originally written against. Multi-light direct contributions\n// for those ancillary BRDFs are not yet supported (single-light parity only).\nlet lightIndex0 = mli(0u);\nlet entry0 = lights.lights[lightIndex0];\nlet pl0 = computePbrLight(entry0, N, input.worldPos, material.lightFalloffMode);\nlet L = pl0.L;\nlet NdotL = pl0.NdotL;\nlet lightColor = pl0.specColor;\nlet lightAtten = pl0.atten * shadowFactors[lightIndex0];\nlet H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nfor (var li = 0u; li < lightCount; li++) {\nvar pl: PbrLightResult;\nlet lightIndex = mli(li);\nif (li == 0u) { pl = pl0; } else { pl = computePbrLight(lights.lights[lightIndex], N, input.worldPos, material.lightFalloffMode); }\nlet sf = shadowFactors[lightIndex];\nif (pl.isHemi) {\ndirectDiffuse += pl.color * surfaceAlbedo * material.directIntensity * sf;\n} else {\ndirectDiffuse += surfaceAlbedo * (1.0 / PI) * pl.NdotL * pl.color * pl.atten * material.directIntensity * sf;\n}\n// Specular uses pl.NdotL (hemispheric 0.5+0.5*dot for hemi, max(dot,0) for others)\n// and pl.specColor (un-mixed light diffuse — matches single-light fast path\n// and Std's LIGHTING_FN which uses vLightSpecular for the specular bounce).\nif (pl.NdotL > 0.0 && pl.atten > 0.0) {\nlet specH = normalize(V + pl.L);\nlet specNdotH = clamp(dot(N, specH), 0.0000001, 1.0);\nlet specVdotH = saturate(dot(V, specH));\nlet D = distributionGGX(specNdotH, directAlphaG);\nlet G = geometrySmithGGX(pl.NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(specVdotH, colorF0, colorF90);\ndirectSpecular += coloredFresnel * D * G * pl.NdotL * pl.specColor * pl.atten * material.directIntensity * sf;\n}\n}\n/*AD*/`;\n}\n"],"names":[],"mappings":";AAKO,SAAS,sBAA8B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BASiB,UAAU;AAAA;AAAA;AAGtC;AAEO,MAAM,oBAAoB;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;AA4C1B,SAAS,oBAA4B;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAQsB,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,gCAC5D,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;AAwC1C;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { S as SS } from "./index-CLElg2Bo.js";
|
|
1
2
|
function emitEnv(startBinding) {
|
|
2
3
|
const iblTexBinding = startBinding;
|
|
3
4
|
const iblSampBinding = startBinding + 1;
|
|
@@ -10,10 +11,10 @@ function emitEnv(startBinding) {
|
|
|
10
11
|
`@group(1) @binding(${brdfSampBinding}) var nmeBrdfSampler: sampler;`
|
|
11
12
|
].join("\n");
|
|
12
13
|
const bglEntries = [
|
|
13
|
-
{ binding: iblTexBinding, visibility:
|
|
14
|
-
{ binding: iblSampBinding, visibility:
|
|
15
|
-
{ binding: brdfTexBinding, visibility:
|
|
16
|
-
{ binding: brdfSampBinding, visibility:
|
|
14
|
+
{ binding: iblTexBinding, visibility: SS.FRAGMENT, texture: { sampleType: "float", viewDimension: "cube" } },
|
|
15
|
+
{ binding: iblSampBinding, visibility: SS.FRAGMENT, sampler: { type: "filtering" } },
|
|
16
|
+
{ binding: brdfTexBinding, visibility: SS.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } },
|
|
17
|
+
{ binding: brdfSampBinding, visibility: SS.FRAGMENT, sampler: { type: "filtering" } }
|
|
17
18
|
];
|
|
18
19
|
return {
|
|
19
20
|
bindings: { _iblTexture: iblTexBinding, _iblSampler: iblSampBinding, _brdfLUT: brdfTexBinding, _brdfSampler: brdfSampBinding },
|
|
@@ -36,4 +37,4 @@ export {
|
|
|
36
37
|
emitEnv,
|
|
37
38
|
pushEnvBindGroupEntries
|
|
38
39
|
};
|
|
39
|
-
//# sourceMappingURL=node-env-
|
|
40
|
+
//# sourceMappingURL=node-env-Bc559GmY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-env-Bc559GmY.js","sources":["../src/material/node/node-env.ts"],"sourcesContent":["/** Node Material — env IBL extension (dynamically imported).\n *\n * Loaded ONLY when a graph's emitGraph pass set `state.usesEnv = true` (i.e.\n * a ReflectionBlock fed PBRMetallicRoughnessBlock.reflection). Scenes whose\n * NME graphs contain neither block never bundle this module — keeping the\n * per-NME-scene cost flat for non-env materials (scenes 60-66).\n *\n * Provides the env-aware compile + renderable paths:\n * 1. Group-1 binding allocation + WGSL var decls + BGL entries for the\n * env IBL textures and samplers (specular cube, BRDF LUT, plus their\n * samplers).\n * 2. Bind-group entry construction from `scene._envTextures`.\n *\n * SH coefficients and env scalars are read from the canonical frame-graph\n * scene UBO; NodeMaterial does not allocate or write a private scene UBO.\n */\n\nimport { SS } from \"../../engine/gpu-flags.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\n\nexport interface EnvEmit {\n readonly bindings: {\n /** @internal */\n readonly _iblTexture: number;\n /** @internal */\n readonly _iblSampler: number;\n /** @internal */\n readonly _brdfLUT: number;\n /** @internal */\n readonly _brdfSampler: number;\n };\n readonly wgslDecls: string;\n readonly bglEntries: readonly GPUBindGroupLayoutEntry[];\n readonly bindingCount: number;\n}\n\n/** Allocate the 4 group-1 bindings for env IBL (cube + sampler, BRDF LUT 2D + sampler)\n * starting at `startBinding`, and produce the WGSL `@group(1) @binding(...)` var decls\n * plus the matching BGL entries. */\nexport function emitEnv(startBinding: number): EnvEmit {\n const iblTexBinding = startBinding;\n const iblSampBinding = startBinding + 1;\n const brdfTexBinding = startBinding + 2;\n const brdfSampBinding = startBinding + 3;\n const wgslDecls = [\n `@group(1) @binding(${iblTexBinding}) var nmeIblTexture: texture_cube<f32>;`,\n `@group(1) @binding(${iblSampBinding}) var nmeIblSampler: sampler;`,\n `@group(1) @binding(${brdfTexBinding}) var nmeBrdfLUT: texture_2d<f32>;`,\n `@group(1) @binding(${brdfSampBinding}) var nmeBrdfSampler: sampler;`,\n ].join(\"\\n\");\n const bglEntries: GPUBindGroupLayoutEntry[] = [\n { binding: iblTexBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: iblSampBinding, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } },\n { binding: brdfTexBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: brdfSampBinding, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } },\n ];\n return {\n bindings: { _iblTexture: iblTexBinding, _iblSampler: iblSampBinding, _brdfLUT: brdfTexBinding, _brdfSampler: brdfSampBinding },\n wgslDecls,\n bglEntries,\n bindingCount: 4,\n };\n}\n\n/** Append env IBL texture/sampler entries to a bind-group entries array. */\nexport function pushEnvBindGroupEntries(\n scene: SceneContext,\n /** @internal */\n envBindings: { _iblTexture: number; _iblSampler: number; _brdfLUT: number; _brdfSampler: number },\n entries: GPUBindGroupEntry[]\n): void {\n const env = (scene as unknown as { _envTextures?: import(\"../../loader-env/load-env.js\").EnvironmentTextures })._envTextures;\n if (!env) {\n throw new Error(\"NodeMaterial: PBR/Reflection block requires scene environment but scene._envTextures is unset. Call loadEnvironment() before registerScene().\");\n }\n entries.push({ binding: envBindings._iblTexture, resource: env.specularCubeView });\n entries.push({ binding: envBindings._iblSampler, resource: env.cubeSampler });\n entries.push({ binding: envBindings._brdfLUT, resource: env.brdfLutView });\n entries.push({ binding: envBindings._brdfSampler, resource: env.brdfSampler });\n}\n"],"names":[],"mappings":";AAuCO,SAAS,QAAQ,cAA+B;AACnD,QAAM,gBAAgB;AACtB,QAAM,iBAAiB,eAAe;AACtC,QAAM,iBAAiB,eAAe;AACtC,QAAM,kBAAkB,eAAe;AACvC,QAAM,YAAY;AAAA,IACd,sBAAsB,aAAa;AAAA,IACnC,sBAAsB,cAAc;AAAA,IACpC,sBAAsB,cAAc;AAAA,IACpC,sBAAsB,eAAe;AAAA,EAAA,EACvC,KAAK,IAAI;AACX,QAAM,aAAwC;AAAA,IAC1C,EAAE,SAAS,eAAe,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,OAAA,EAAO;AAAA,IACzG,EAAE,SAAS,gBAAgB,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,cAAY;AAAA,IACjF,EAAE,SAAS,gBAAgB,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,IACxG,EAAE,SAAS,iBAAiB,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,YAAA,EAAY;AAAA,EAAE;AAExF,SAAO;AAAA,IACH,UAAU,EAAE,aAAa,eAAe,aAAa,gBAAgB,UAAU,gBAAgB,cAAc,gBAAA;AAAA,IAC7G;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAAA;AAEtB;AAGO,SAAS,wBACZ,OAEA,aACA,SACI;AACJ,QAAM,MAAO,MAAmG;AAChH,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,+IAA+I;AAAA,EACnK;AACA,UAAQ,KAAK,EAAE,SAAS,YAAY,aAAa,UAAU,IAAI,kBAAkB;AACjF,UAAQ,KAAK,EAAE,SAAS,YAAY,aAAa,UAAU,IAAI,aAAa;AAC5E,UAAQ,KAAK,EAAE,SAAS,YAAY,UAAU,UAAU,IAAI,aAAa;AACzE,UAAQ,KAAK,EAAE,SAAS,YAAY,cAAc,UAAU,IAAI,aAAa;AACjF;"}
|