@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-features-BLENkYVt.js","sources":["../src/shader/shader-composer.ts","../src/material/mesh-features.ts"],"sourcesContent":["/**\n * Shader Composer — assembles ShaderFragment[] + ShaderTemplate into\n * final WGSL source + GPU layout descriptors. Pure function, no global state.\n * All shader text comes from template + fragment modules.\n */\nimport type { BindingDecl, ComposedShader, FragmentSlot, ShaderFragment, ShaderTemplate, VertexAttribute, VertexSlot, Varying } from \"./fragment-types.js\";\nimport { computeUboLayout } from \"./ubo-layout.js\";\nimport { SCENE_UBO_WGSL } from \"./scene-uniforms.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nfunction topoSort(fragments: readonly ShaderFragment[]): ShaderFragment[] {\n const byId = new Map<string, ShaderFragment>();\n for (const f of fragments) {\n if (byId.has(f._id)) {\n throw Error();\n }\n byId.set(f._id, f);\n }\n const inDeg = new Map<string, number>();\n const deps = new Map<string, string[]>();\n for (const f of fragments) {\n if (!inDeg.has(f._id)) {\n inDeg.set(f._id, 0);\n }\n for (const d of f._dependencies ?? []) {\n if (!byId.has(d)) {\n throw Error();\n }\n inDeg.set(f._id, (inDeg.get(f._id) ?? 0) + 1);\n let arr = deps.get(d);\n if (!arr) {\n arr = [];\n deps.set(d, arr);\n }\n arr.push(f._id);\n }\n }\n const q: string[] = [];\n for (const [id, d] of inDeg) {\n if (d === 0) {\n q.push(id);\n }\n }\n q.sort();\n const out: ShaderFragment[] = [];\n let qi = 0;\n while (qi < q.length) {\n const id = q[qi++]!;\n out.push(byId.get(id)!);\n for (const d of deps.get(id) ?? []) {\n const nd = (inDeg.get(d) ?? 1) - 1;\n inDeg.set(d, nd);\n if (nd === 0) {\n let i = qi;\n while (i < q.length && q[i]! < d) {\n i++;\n }\n q.splice(i, 0, d);\n }\n }\n }\n if (out.length !== fragments.length) {\n throw Error();\n }\n return out;\n}\n\nfunction dedup<T extends { _name: string }>(base: readonly T[], extra: readonly T[]): T[] {\n const seen = new Set<string>();\n const all: T[] = [];\n for (const v of base) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n for (const v of extra) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n return all;\n}\n\nfunction bglEntry(binding: number, decl: BindingDecl): GPUBindGroupLayoutEntry {\n const e: GPUBindGroupLayoutEntry = { binding, visibility: decl._visibility };\n switch (decl._type._kind) {\n case \"uniform-buffer\":\n e.buffer = { type: \"uniform\" };\n break;\n case \"texture\": {\n const def = decl._type._textureType === \"texture_depth_2d\" ? \"depth\" : decl._type._textureType === \"texture_2d<u32>\" ? \"uint\" : \"float\";\n e.texture = { sampleType: (decl._type._sampleType ?? def) as GPUTextureSampleType, viewDimension: decl._type._textureType.includes(\"cube\") ? \"cube\" : \"2d\" };\n break;\n }\n case \"sampler\":\n e.sampler = {\n type: decl._type._samplerType === \"sampler_comparison\" ? \"comparison\" : decl._type._samplerType === \"sampler_non_filtering\" ? \"non-filtering\" : \"filtering\",\n };\n break;\n case \"storage-texture\":\n e.storageTexture = { access: decl._type._access as GPUStorageTextureAccess, format: decl._type._format as GPUTextureFormat };\n break;\n }\n return e;\n}\n\nfunction declWGSL(g: number, b: number, d: BindingDecl): string {\n switch (d._type._kind) {\n case \"uniform-buffer\":\n return `@group(${g})@binding(${b}) var<uniform> ${d._name}:${d._name}Uniforms;`;\n case \"texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._textureType};`;\n case \"sampler\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._samplerType === \"sampler_non_filtering\" ? \"sampler\" : d._type._samplerType};`;\n case \"storage-texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:texture_storage_2d<${d._type._format},${d._type._access}>;`;\n }\n}\n\nconst SLOT_RE = /\\/\\*([A-Z_0-9]+)\\*\\//g;\nfunction injectSlots(tpl: string, sorted: readonly ShaderFragment[], key: \"_fragmentSlots\" | \"_vertexSlots\"): string {\n return tpl.replace(SLOT_RE, (_, slot: string) => {\n const parts: string[] = [];\n for (const f of sorted) {\n const s = f[key] as Partial<Record<FragmentSlot | VertexSlot, string>> | undefined;\n if (s?.[slot as FragmentSlot | VertexSlot]) {\n parts.push(s[slot as FragmentSlot | VertexSlot]!);\n }\n }\n return parts.join(\"\\n\");\n });\n}\n\nexport function composeShader(template: ShaderTemplate, fragments: readonly ShaderFragment[]): ComposedShader {\n const sorted = topoSort(fragments);\n\n // Collect fragment data\n const fragAttrs: VertexAttribute[] = [];\n const fragVaryings: Varying[] = [];\n const helpers: string[] = [];\n const vHelpers: string[] = [];\n const vBuiltins: string[] = [];\n for (const f of sorted) {\n if (f._vertexAttributes) {\n fragAttrs.push(...f._vertexAttributes);\n }\n if (f._varyings) {\n fragVaryings.push(...f._varyings);\n }\n if (f._helperFunctions) {\n helpers.push(f._helperFunctions);\n }\n if (f._vertexHelperFunctions) {\n vHelpers.push(f._vertexHelperFunctions);\n }\n for (const b of f._vertexBuiltins ?? []) {\n vBuiltins.push(`@builtin(${b._builtin}) ${b._name}:${b._type},`);\n }\n }\n\n // Vertex attributes + layouts\n const allAttrs = dedup(template._baseVertexAttributes, fragAttrs);\n const inputLines: string[] = [];\n const _vertexBufferLayouts: GPUVertexBufferLayout[] = [];\n const groups = new Map<string, { loc: number; off: number; fmt: GPUVertexFormat }[]>();\n const firstOfGroup = new Map<string, VertexAttribute>();\n for (let i = 0; i < allAttrs.length; i++) {\n const a = allAttrs[i]!;\n inputLines.push(`@location(${i}) ${a._name}:${a._type},`);\n if (a._bufferGroup) {\n if (!groups.has(a._bufferGroup)) {\n groups.set(a._bufferGroup, []);\n firstOfGroup.set(a._bufferGroup, a);\n }\n groups.get(a._bufferGroup)!.push({ loc: i, off: a._offset ?? 0, fmt: a._gpuFormat });\n } else {\n _vertexBufferLayouts.push({\n arrayStride: a._arrayStride,\n stepMode: a._stepMode ?? \"vertex\",\n attributes: [{ shaderLocation: i, offset: a._offset ?? 0, format: a._gpuFormat }],\n });\n }\n }\n for (const [grp, attrs] of groups) {\n const f = firstOfGroup.get(grp)!;\n _vertexBufferLayouts.push({\n arrayStride: f._arrayStride,\n stepMode: f._stepMode ?? \"vertex\",\n attributes: attrs.map((a) => ({ shaderLocation: a.loc, offset: a.off, format: a.fmt })),\n });\n }\n let nextLoc = allAttrs.length;\n for (const f of sorted) {\n if (f._pipelineVertexBuffers) {\n const r = f._pipelineVertexBuffers(nextLoc);\n _vertexBufferLayouts.push(...r._buffers);\n nextLoc = r._nextLoc;\n }\n }\n\n // Varyings\n const allVary = dedup(template._baseVaryings, fragVaryings);\n const varyBody = `@builtin(position) clipPos:vec4f,\\n` + allVary.map((v, i) => `@location(${i}) ${v._name}:${v._type},`).join(\"\\n\");\n\n // UBO layouts\n const hasMaterialUbo = !!(template._baseMaterialUboFields && template._baseMaterialUboFields.length > 0);\n const meshFields = [...template._baseMeshUboFields];\n const materialFields = hasMaterialUbo ? [...template._baseMaterialUboFields] : [];\n for (const f of sorted) {\n if (f._uboFields?.length) {\n (hasMaterialUbo ? materialFields : meshFields).push(...f._uboFields);\n }\n }\n const _meshUboSpec = computeUboLayout(meshFields);\n const _materialUboSpec = hasMaterialUbo ? computeUboLayout(materialFields) : undefined;\n\n // Bindings\n const meshBGL: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: STAGE_VERTEX | STAGE_FRAGMENT, buffer: { type: \"uniform\" } }];\n if (hasMaterialUbo) {\n meshBGL.push({ binding: 1, visibility: STAGE_FRAGMENT, buffer: { type: \"uniform\" } });\n }\n const shadowBGL: GPUBindGroupLayoutEntry[] = [];\n const vDecls: string[] = [];\n const fDecls: string[] = [];\n let mb = hasMaterialUbo ? 2 : 1,\n sb = 0;\n\n function addBinding(d: BindingDecl, _isVertex: boolean) {\n const isShadow = d._group === \"shadow\";\n const b = isShadow ? sb++ : mb++;\n const g = isShadow ? 2 : 1;\n (isShadow ? shadowBGL : meshBGL).push(bglEntry(b, d));\n const w = declWGSL(g, b, d);\n if (d._visibility & STAGE_VERTEX) {\n vDecls.push(w);\n }\n if (d._visibility & STAGE_FRAGMENT) {\n fDecls.push(w);\n }\n }\n\n for (const d of template._baseVertexBindings ?? []) {\n addBinding(d, true);\n }\n for (const f of sorted) {\n for (const d of f._vertexBindings ?? []) {\n addBinding(d, true);\n }\n }\n for (const d of template._baseBindings ?? []) {\n addBinding(d, false);\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => (b._group ?? \"mesh\") === \"mesh\")) {\n addBinding(d, false);\n }\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => b._group === \"shadow\")) {\n addBinding(d, false);\n }\n }\n\n const _fragmentKey = sorted.map((f) => f._id).join(\"|\");\n const vParams = (vBuiltins.length ? vBuiltins.join(\"\\n\") + \"\\n\" : \"\") + inputLines.join(\"\\n\");\n const meshStruct = `struct MeshUniforms{\\n${_meshUboSpec._structBody}\\n}`;\n const materialStruct = _materialUboSpec ? `\\nstruct MaterialUniforms{\\n${_materialUboSpec._structBody}\\n}\\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;` : \"\";\n\n let _vertexWGSL = template._vertexTemplate;\n _vertexWGSL = _vertexWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _vertexWGSL = _vertexWGSL.replace(\"/*MU*/\", meshStruct);\n _vertexWGSL = _vertexWGSL.replace(\"/*VI*/\", `struct VertexInput{\\n${inputLines.join(\"\\n\")}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VO*/\", `struct VertexOutput{\\n${varyBody}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VD*/\", vDecls.join(\"\\n\"));\n _vertexWGSL = _vertexWGSL.replace(\"/*VP*/\", vParams);\n _vertexWGSL = _vertexWGSL.replace(\"/*VH*/\", vHelpers.join(\"\\n\"));\n // These dynamic keys are reserved from Terser property mangling in bundle-scenes-core.ts.\n _vertexWGSL = injectSlots(_vertexWGSL, sorted, \"_vertexSlots\");\n\n let _fragmentWGSL = template._fragmentTemplate;\n _fragmentWGSL = _fragmentWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*MU*/\", meshStruct + materialStruct);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FI*/\", `struct FragmentInput{\\n${varyBody}\\n}`);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*HF*/\", helpers.join(\"\\n\"));\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FB*/\", fDecls.join(\"\\n\"));\n _fragmentWGSL = injectSlots(_fragmentWGSL, sorted, \"_fragmentSlots\");\n\n const _meshBGLDescriptor = { entries: meshBGL };\n const _shadowBGLDescriptor = shadowBGL.length ? { entries: shadowBGL } : null;\n\n return {\n _vertexWGSL,\n _fragmentWGSL,\n _meshBGLDescriptor,\n _shadowBGLDescriptor,\n _vertexBufferLayouts,\n _meshUboSpec,\n _materialUboSpec,\n _fragmentKey,\n };\n}\n","import type { Mesh } from \"../mesh/mesh.js\";\n\nexport const MSH_HAS_TANGENTS = 1 << 0;\nexport const MSH_HAS_SKELETON = 1 << 1;\nexport const MSH_HAS_SKELETON_8 = 1 << 2;\nexport const MSH_HAS_MORPH_TARGETS = 1 << 3;\nexport const MSH_HAS_THIN_INSTANCES = 1 << 4;\nexport const MSH_HAS_INSTANCE_COLOR = 1 << 5;\nexport const MSH_HAS_VERTEX_COLOR = 1 << 6;\nexport const MSH_HAS_UV2 = 1 << 7;\nexport const MSH_RECEIVE_SHADOWS = 1 << 8;\n\n/** @internal Compute mesh/pass feature bits shared by material renderers. */\nexport function _computeMeshFeatures(mesh: Mesh, receiveShadows = false): number {\n const gpu = mesh._gpu;\n let features = 0;\n if (gpu.tangentBuffer) {\n features |= MSH_HAS_TANGENTS;\n }\n if (mesh.skeleton) {\n features |= MSH_HAS_SKELETON;\n if (mesh.skeleton.joints1Buffer) {\n features |= MSH_HAS_SKELETON_8;\n }\n }\n if (mesh.morphTargets) {\n features |= MSH_HAS_MORPH_TARGETS;\n }\n if (mesh.thinInstances) {\n features |= MSH_HAS_THIN_INSTANCES;\n if (mesh.thinInstances.colors) {\n features |= MSH_HAS_INSTANCE_COLOR;\n }\n }\n if (gpu.colorBuffer) {\n features |= MSH_HAS_VERTEX_COLOR;\n }\n if (gpu.uv2Buffer) {\n features |= MSH_HAS_UV2;\n }\n if (receiveShadows) {\n features |= MSH_RECEIVE_SHADOWS;\n }\n return features;\n}\n"],"names":[],"mappings":"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"}
|
package/node-env-BPZXZzBf.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-env-BPZXZzBf.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 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: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: iblSampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"filtering\" } },\n { binding: brdfTexBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: brdfSampBinding, visibility: GPUShaderStage.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":"AAsCO,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,eAAe,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,OAAA,EAAO;AAAA,IACrH,EAAE,SAAS,gBAAgB,YAAY,eAAe,UAAU,SAAS,EAAE,MAAM,cAAY;AAAA,IAC7F,EAAE,SAAS,gBAAgB,YAAY,eAAe,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,IACpH,EAAE,SAAS,iBAAiB,YAAY,eAAe,UAAU,SAAS,EAAE,MAAM,YAAA,EAAY;AAAA,EAAE;AAEpG,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;"}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
async function loadBlockEmitter(key) {
|
|
2
|
-
const baseLoader = baseBlockLoader(key);
|
|
3
|
-
if (baseLoader) {
|
|
4
|
-
return (await baseLoader()).emitter;
|
|
5
|
-
}
|
|
6
|
-
const extra = await loadExtraBlockEmitter(key);
|
|
7
|
-
if (extra) {
|
|
8
|
-
return extra;
|
|
9
|
-
}
|
|
10
|
-
throw new Error(`NodeMaterial: no emitter registered for block "${key}"`);
|
|
11
|
-
}
|
|
12
|
-
function hasBlockEmitter(key) {
|
|
13
|
-
return !!baseBlockLoader(key) || !!extraRegistryLoader(key);
|
|
14
|
-
}
|
|
15
|
-
function baseBlockLoader(key) {
|
|
16
|
-
switch (key) {
|
|
17
|
-
case "InputBlock":
|
|
18
|
-
return () => import("./input-block-DgAJBzN_.js");
|
|
19
|
-
case "VectorMergerBlock":
|
|
20
|
-
return () => import("./vector-merger-CrW-ONB0.js");
|
|
21
|
-
case "FragmentOutputBlock":
|
|
22
|
-
return () => import("./fragment-output-BOphkIeh.js");
|
|
23
|
-
case "AddBlock":
|
|
24
|
-
return () => import("./add-block-CikX5gWy.js");
|
|
25
|
-
case "SubtractBlock":
|
|
26
|
-
return () => import("./subtract-block-NPfKvzQP.js");
|
|
27
|
-
case "MultiplyBlock":
|
|
28
|
-
return () => import("./multiply-block-DaXLJ7Ud.js");
|
|
29
|
-
case "MinBlock":
|
|
30
|
-
return () => import("./min-block-CHtBngNl.js");
|
|
31
|
-
case "MaxBlock":
|
|
32
|
-
return () => import("./max-block-CjFgljZ7.js");
|
|
33
|
-
case "PowBlock":
|
|
34
|
-
return () => import("./pow-block-DI5ICzhc.js");
|
|
35
|
-
case "StepBlock":
|
|
36
|
-
return () => import("./step-block-BkywzTYm.js");
|
|
37
|
-
case "DotBlock":
|
|
38
|
-
return () => import("./dot-block-VlfAC6cD.js");
|
|
39
|
-
case "ScaleBlock":
|
|
40
|
-
return () => import("./scale-block-C5Z8159G.js");
|
|
41
|
-
case "OneMinusBlock":
|
|
42
|
-
return () => import("./oneminus-block-BP9x4Dc3.js");
|
|
43
|
-
case "NegateBlock":
|
|
44
|
-
return () => import("./negate-block-9CSLc5pM.js");
|
|
45
|
-
case "NormalizeBlock":
|
|
46
|
-
return () => import("./normalize-block-F2bLNj9K.js");
|
|
47
|
-
case "LerpBlock":
|
|
48
|
-
return () => import("./lerp-block-DjI2SfmI.js");
|
|
49
|
-
case "ClampBlock":
|
|
50
|
-
return () => import("./clamp-block-BdII67hT.js");
|
|
51
|
-
case "SmoothStepBlock":
|
|
52
|
-
return () => import("./smoothstep-block-Di4t37x-.js");
|
|
53
|
-
case "RemapBlock":
|
|
54
|
-
return () => import("./remap-block-DxK1W1vp.js");
|
|
55
|
-
case "TrigonometryBlock":
|
|
56
|
-
return () => import("./trigonometry-block-BYQcTHiD.js");
|
|
57
|
-
case "VectorSplitterBlock":
|
|
58
|
-
return () => import("./vector-splitter-BoJuHrAU.js");
|
|
59
|
-
case "ColorSplitterBlock":
|
|
60
|
-
return () => import("./color-splitter-CGn1G4ow.js");
|
|
61
|
-
case "TransformBlock":
|
|
62
|
-
return () => import("./transform-block-DbRph9JI.js");
|
|
63
|
-
case "VertexOutputBlock":
|
|
64
|
-
return () => import("./vertex-output-Cvft64y0.js");
|
|
65
|
-
case "TextureBlock":
|
|
66
|
-
return () => import("./texture-block-rr21KIL_.js");
|
|
67
|
-
case "ImageSourceBlock":
|
|
68
|
-
return () => import("./image-source-BuMJgd9-.js");
|
|
69
|
-
case "FrontFacingBlock":
|
|
70
|
-
return () => import("./front-facing-0d6aiyrv.js");
|
|
71
|
-
case "ViewDirectionBlock":
|
|
72
|
-
return () => import("./view-direction-CWVucfnT.js");
|
|
73
|
-
case "LightBlock":
|
|
74
|
-
return () => import("./light-block-B11ew7FA.js");
|
|
75
|
-
case "LightInformationBlock":
|
|
76
|
-
return () => import("./light-information-VJbW0jbs.js");
|
|
77
|
-
case "FogBlock":
|
|
78
|
-
return () => import("./fog-block-DJ9hEolm.js");
|
|
79
|
-
case "PerturbNormalBlock":
|
|
80
|
-
return () => import("./perturb-normal-0Q8EM9ig.js");
|
|
81
|
-
case "BonesBlock":
|
|
82
|
-
return () => import("./bones-block-D6IhqUVV.js");
|
|
83
|
-
case "InstancesBlock":
|
|
84
|
-
return () => import("./instances-block-BaSSiz8m.js");
|
|
85
|
-
case "MorphTargetsBlock":
|
|
86
|
-
return () => import("./morph-targets-55z342ZB.js");
|
|
87
|
-
case "ShadowMapBlock":
|
|
88
|
-
return () => import("./shadow-map-CQNQC-Fw.js");
|
|
89
|
-
case "DiscardBlock":
|
|
90
|
-
return () => import("./discard-block-B2jKjaEL.js");
|
|
91
|
-
case "ReflectionTextureBlock":
|
|
92
|
-
return () => import("./reflection-texture-block-C3QtzoV8.js");
|
|
93
|
-
case "PBRMetallicRoughnessBlock":
|
|
94
|
-
return () => import("./pbr-metallic-roughness-block-h_KAOZrW.js");
|
|
95
|
-
case "PBRMetallicRoughnessBlock__full":
|
|
96
|
-
return () => import("./pbr-metallic-roughness-block-full-6vMm1Jk6.js");
|
|
97
|
-
case "ReflectionBlock":
|
|
98
|
-
return () => import("./reflection-block-DqcwyYqr.js");
|
|
99
|
-
case "ClearCoatBlock":
|
|
100
|
-
return () => import("./clearcoat-block-BGML4npi.js");
|
|
101
|
-
case "SheenBlock":
|
|
102
|
-
return () => import("./sheen-block-BugfJqK3.js");
|
|
103
|
-
case "AnisotropyBlock":
|
|
104
|
-
return () => import("./anisotropy-block-D5fXH_OY.js");
|
|
105
|
-
case "SubSurfaceBlock":
|
|
106
|
-
return () => import("./subsurface-block-CBhxT9ui.js");
|
|
107
|
-
case "RefractionBlock":
|
|
108
|
-
return () => import("./refraction-block-U8y6XiXs.js");
|
|
109
|
-
default:
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
async function loadExtraBlockEmitter(key) {
|
|
114
|
-
const loader = extraRegistryLoader(key);
|
|
115
|
-
if (!loader) {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
return (await loader()).loadExtraEmitter(key);
|
|
119
|
-
}
|
|
120
|
-
function extraRegistryLoader(key) {
|
|
121
|
-
switch (key) {
|
|
122
|
-
case "DivideBlock":
|
|
123
|
-
case "ModBlock":
|
|
124
|
-
case "ReciprocalBlock":
|
|
125
|
-
case "LengthBlock":
|
|
126
|
-
case "DistanceBlock":
|
|
127
|
-
case "CrossBlock":
|
|
128
|
-
case "ReflectBlock":
|
|
129
|
-
case "RefractBlock":
|
|
130
|
-
case "ArcTan2Block":
|
|
131
|
-
case "FresnelBlock":
|
|
132
|
-
case "OppositeBlock":
|
|
133
|
-
case "NLerpBlock":
|
|
134
|
-
case "ConditionalBlock":
|
|
135
|
-
case "CurveBlock":
|
|
136
|
-
case "WaveBlock":
|
|
137
|
-
case "RandomNumberBlock":
|
|
138
|
-
return () => import("./node-registry-extra-math-CsAHvIZo.js");
|
|
139
|
-
case "ColorMergerBlock":
|
|
140
|
-
case "ColorConverterBlock":
|
|
141
|
-
case "DesaturateBlock":
|
|
142
|
-
case "GradientBlock":
|
|
143
|
-
case "PosterizeBlock":
|
|
144
|
-
case "ReplaceColorBlock":
|
|
145
|
-
case "PannerBlock":
|
|
146
|
-
case "Rotate2dBlock":
|
|
147
|
-
case "TriPlanarBlock":
|
|
148
|
-
case "BiPlanarBlock":
|
|
149
|
-
case "CloudBlock":
|
|
150
|
-
case "SimplexPerlin3DBlock":
|
|
151
|
-
case "VoronoiNoiseBlock":
|
|
152
|
-
case "WorleyNoise3DBlock":
|
|
153
|
-
return () => import("./node-registry-extra-procedural-5pLQ3Bhz.js");
|
|
154
|
-
case "DerivativeBlock":
|
|
155
|
-
case "HeightToNormalBlock":
|
|
156
|
-
case "TBNBlock":
|
|
157
|
-
case "NormalBlendBlock":
|
|
158
|
-
case "AmbientOcclusionBlock":
|
|
159
|
-
case "FragCoordBlock":
|
|
160
|
-
case "ScreenSizeBlock":
|
|
161
|
-
case "ScreenSpaceBlock":
|
|
162
|
-
case "TwirlBlock":
|
|
163
|
-
case "FragDepthBlock":
|
|
164
|
-
case "MatrixBuilder":
|
|
165
|
-
case "MatrixSplitterBlock":
|
|
166
|
-
case "MatrixTransposeBlock":
|
|
167
|
-
case "MatrixDeterminantBlock":
|
|
168
|
-
return () => import("./node-registry-extra-advanced-2DJVt67-.js");
|
|
169
|
-
case "ElbowBlock":
|
|
170
|
-
case "NodeMaterialTeleportInBlock":
|
|
171
|
-
case "NodeMaterialTeleportOutBlock":
|
|
172
|
-
case "NodeMaterialDebugBlock":
|
|
173
|
-
case "MeshAttributeExistsBlock":
|
|
174
|
-
case "ClipPlanesBlock":
|
|
175
|
-
case "ReflectionTextureBaseBlock":
|
|
176
|
-
case "ImageProcessingBlock":
|
|
177
|
-
case "IridescenceBlock":
|
|
178
|
-
case "LoopBlock":
|
|
179
|
-
case "StorageReadBlock":
|
|
180
|
-
case "StorageWriteBlock":
|
|
181
|
-
return () => import("./node-registry-extra-compat-Dhrw8fDQ.js");
|
|
182
|
-
default:
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
export {
|
|
187
|
-
hasBlockEmitter,
|
|
188
|
-
loadBlockEmitter
|
|
189
|
-
};
|
|
190
|
-
//# sourceMappingURL=node-registry-DwgC4yth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-registry-DwgC4yth.js","sources":["../src/material/node/node-registry.ts"],"sourcesContent":["/** Node-block registry — side-effect-free lazy dispatch.\n *\n * Each block lives in its own module under `./blocks/`. The base registry keeps\n * the pre-existing NME surface inline; newer block families are routed through\n * small extension registries so older scenes don't fetch every new loader.\n */\n\nimport type { BlockEmitter } from \"./node-types.js\";\n\nexport type BlockLoader = () => Promise<{ emitter: BlockEmitter }>;\n\n/** Resolve a block emitter by key. Throws if the block is not registered. */\nexport async function loadBlockEmitter(key: string): Promise<BlockEmitter> {\n const baseLoader = baseBlockLoader(key);\n if (baseLoader) {\n return (await baseLoader()).emitter;\n }\n const extra = await loadExtraBlockEmitter(key);\n if (extra) {\n return extra;\n }\n throw new Error(`NodeMaterial: no emitter registered for block \"${key}\"`);\n}\n\n/** Returns true if a key is registered (used by tests). */\nexport function hasBlockEmitter(key: string): boolean {\n return !!baseBlockLoader(key) || !!extraRegistryLoader(key);\n}\n\nfunction baseBlockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"InputBlock\":\n return () => import(\"./blocks/input-block.js\");\n case \"VectorMergerBlock\":\n return () => import(\"./blocks/vector-merger.js\");\n case \"FragmentOutputBlock\":\n return () => import(\"./blocks/fragment-output.js\");\n case \"AddBlock\":\n return () => import(\"./blocks/add-block.js\");\n case \"SubtractBlock\":\n return () => import(\"./blocks/subtract-block.js\");\n case \"MultiplyBlock\":\n return () => import(\"./blocks/multiply-block.js\");\n case \"MinBlock\":\n return () => import(\"./blocks/min-block.js\");\n case \"MaxBlock\":\n return () => import(\"./blocks/max-block.js\");\n case \"PowBlock\":\n return () => import(\"./blocks/pow-block.js\");\n case \"StepBlock\":\n return () => import(\"./blocks/step-block.js\");\n case \"DotBlock\":\n return () => import(\"./blocks/dot-block.js\");\n case \"ScaleBlock\":\n return () => import(\"./blocks/scale-block.js\");\n case \"OneMinusBlock\":\n return () => import(\"./blocks/oneminus-block.js\");\n case \"NegateBlock\":\n return () => import(\"./blocks/negate-block.js\");\n case \"NormalizeBlock\":\n return () => import(\"./blocks/normalize-block.js\");\n case \"LerpBlock\":\n return () => import(\"./blocks/lerp-block.js\");\n case \"ClampBlock\":\n return () => import(\"./blocks/clamp-block.js\");\n case \"SmoothStepBlock\":\n return () => import(\"./blocks/smoothstep-block.js\");\n case \"RemapBlock\":\n return () => import(\"./blocks/remap-block.js\");\n case \"TrigonometryBlock\":\n return () => import(\"./blocks/trigonometry-block.js\");\n case \"VectorSplitterBlock\":\n return () => import(\"./blocks/vector-splitter.js\");\n case \"ColorSplitterBlock\":\n return () => import(\"./blocks/color-splitter.js\");\n case \"TransformBlock\":\n return () => import(\"./blocks/transform-block.js\");\n case \"VertexOutputBlock\":\n return () => import(\"./blocks/vertex-output.js\");\n case \"TextureBlock\":\n return () => import(\"./blocks/texture-block.js\");\n case \"ImageSourceBlock\":\n return () => import(\"./blocks/image-source.js\");\n case \"FrontFacingBlock\":\n return () => import(\"./blocks/front-facing.js\");\n case \"ViewDirectionBlock\":\n return () => import(\"./blocks/view-direction.js\");\n case \"LightBlock\":\n return () => import(\"./blocks/light-block.js\");\n case \"LightInformationBlock\":\n return () => import(\"./blocks/light-information.js\");\n case \"FogBlock\":\n return () => import(\"./blocks/fog-block.js\");\n case \"PerturbNormalBlock\":\n return () => import(\"./blocks/perturb-normal.js\");\n case \"BonesBlock\":\n return () => import(\"./blocks/bones-block.js\");\n case \"InstancesBlock\":\n return () => import(\"./blocks/instances-block.js\");\n case \"MorphTargetsBlock\":\n return () => import(\"./blocks/morph-targets.js\");\n case \"ShadowMapBlock\":\n return () => import(\"./blocks/shadow-map.js\");\n case \"DiscardBlock\":\n return () => import(\"./blocks/discard-block.js\");\n case \"ReflectionTextureBlock\":\n return () => import(\"./blocks/reflection-texture-block.js\");\n case \"PBRMetallicRoughnessBlock\":\n return () => import(\"./blocks/pbr-metallic-roughness-block.js\");\n case \"PBRMetallicRoughnessBlock__full\":\n return () => import(\"./blocks/pbr-metallic-roughness-block-full.js\");\n case \"ReflectionBlock\":\n return () => import(\"./blocks/reflection-block.js\");\n case \"ClearCoatBlock\":\n return () => import(\"./blocks/clearcoat-block.js\");\n case \"SheenBlock\":\n return () => import(\"./blocks/sheen-block.js\");\n case \"AnisotropyBlock\":\n return () => import(\"./blocks/anisotropy-block.js\");\n case \"SubSurfaceBlock\":\n return () => import(\"./blocks/subsurface-block.js\");\n case \"RefractionBlock\":\n return () => import(\"./blocks/refraction-block.js\");\n default:\n return null;\n }\n}\n\nasync function loadExtraBlockEmitter(key: string): Promise<BlockEmitter | null> {\n const loader = extraRegistryLoader(key);\n if (!loader) {\n return null;\n }\n return (await loader()).loadExtraEmitter(key);\n}\n\nfunction extraRegistryLoader(key: string): (() => Promise<{ loadExtraEmitter(key: string): Promise<BlockEmitter> }>) | null {\n switch (key) {\n case \"DivideBlock\":\n case \"ModBlock\":\n case \"ReciprocalBlock\":\n case \"LengthBlock\":\n case \"DistanceBlock\":\n case \"CrossBlock\":\n case \"ReflectBlock\":\n case \"RefractBlock\":\n case \"ArcTan2Block\":\n case \"FresnelBlock\":\n case \"OppositeBlock\":\n case \"NLerpBlock\":\n case \"ConditionalBlock\":\n case \"CurveBlock\":\n case \"WaveBlock\":\n case \"RandomNumberBlock\":\n return () => import(\"./node-registry-extra-math.js\");\n case \"ColorMergerBlock\":\n case \"ColorConverterBlock\":\n case \"DesaturateBlock\":\n case \"GradientBlock\":\n case \"PosterizeBlock\":\n case \"ReplaceColorBlock\":\n case \"PannerBlock\":\n case \"Rotate2dBlock\":\n case \"TriPlanarBlock\":\n case \"BiPlanarBlock\":\n case \"CloudBlock\":\n case \"SimplexPerlin3DBlock\":\n case \"VoronoiNoiseBlock\":\n case \"WorleyNoise3DBlock\":\n return () => import(\"./node-registry-extra-procedural.js\");\n case \"DerivativeBlock\":\n case \"HeightToNormalBlock\":\n case \"TBNBlock\":\n case \"NormalBlendBlock\":\n case \"AmbientOcclusionBlock\":\n case \"FragCoordBlock\":\n case \"ScreenSizeBlock\":\n case \"ScreenSpaceBlock\":\n case \"TwirlBlock\":\n case \"FragDepthBlock\":\n case \"MatrixBuilder\":\n case \"MatrixSplitterBlock\":\n case \"MatrixTransposeBlock\":\n case \"MatrixDeterminantBlock\":\n return () => import(\"./node-registry-extra-advanced.js\");\n case \"ElbowBlock\":\n case \"NodeMaterialTeleportInBlock\":\n case \"NodeMaterialTeleportOutBlock\":\n case \"NodeMaterialDebugBlock\":\n case \"MeshAttributeExistsBlock\":\n case \"ClipPlanesBlock\":\n case \"ReflectionTextureBaseBlock\":\n case \"ImageProcessingBlock\":\n case \"IridescenceBlock\":\n case \"LoopBlock\":\n case \"StorageReadBlock\":\n case \"StorageWriteBlock\":\n return () => import(\"./node-registry-extra-compat.js\");\n default:\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-renderable-DlLIdBmd.js","sources":["../src/material/node/node-renderable.ts"],"sourcesContent":["/** Node Material — MeshGroupBuilder + Renderable implementation.\n *\n * Parallel to `standard-renderable.ts`. Each NodeMaterial owns one compile\n * result (pipeline + BGLs); this builder creates per-mesh GPU resources\n * (mesh UBO, node UBO, bind groups) and returns a Renderable\n * that emits draws in the main pass.\n */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { writeNodeUBO } from \"./node-material.js\";\nimport { compileNodePipeline } from \"./node-pipeline.js\";\nimport { NODE_ESM_SHADOW_OUTPUT, NODE_NO_COLOR_OUTPUT } from \"./node-flags.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\n\n// Per-engine cached no-op morph target: a 1×1 rgba32float texture + a UBO with\n// count=0 + sensible texWidth/rowsPerBand. Meshes without their own morph\n// targets reuse this so materials that contain a MorphTargetsBlock still work\n// (the WGSL loops over `count` and passes through when zero).\nconst emptyMorphByEngine = new WeakMap<EngineContext, { texture: GPUTexture; weightsBuffer: GPUBuffer }>();\nfunction getEmptyMorph(engine: EngineContext): { texture: GPUTexture; weightsBuffer: GPUBuffer } {\n const cached = emptyMorphByEngine.get(engine);\n if (cached) {\n return cached;\n }\n const texture = engine._device.createTexture({\n label: \"node-morph-empty\",\n size: [1, 1],\n format: \"rgba32float\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n engine._device.queue.writeTexture({ texture }, new Float32Array([0, 0, 0, 0]).buffer, { bytesPerRow: 16 }, { width: 1, height: 1 });\n const ubo = new ArrayBuffer(32);\n const u32 = new Uint32Array(ubo, 16, 4);\n u32[0] = 0; // count\n u32[1] = 1; // texWidth\n u32[2] = 1; // rowsPerBand\n const weightsBuffer = engine._device.createBuffer({ label: \"node-morph-empty-ubo\", size: 32, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n engine._device.queue.writeBuffer(weightsBuffer, 0, new Uint8Array(ubo));\n const entry = { texture, weightsBuffer };\n emptyMorphByEngine.set(engine, entry);\n return entry;\n}\n\ninterface NodePacket {\n readonly _mesh: Mesh;\n readonly _meshUBO: GPUBuffer;\n readonly _meshBG: GPUBindGroup;\n readonly _meshScratch: Float32Array;\n _lastWorldVersion: number;\n _lastReceivesShadow: number;\n _lastLightsCount: number;\n}\n\ntype NodeRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\n/** Build NME renderables for a set of meshes that share a NodeMaterial. */\nexport function buildNodeMeshRenderables(scene: SceneContext, meshes: Mesh[], materialOverride?: Material): MeshGroupBuildResult {\n const engine = scene.engine;\n const device = engine._device;\n\n // All meshes in this group use the same NodeMaterial (scene-core batches by ctor).\n // We deliberately do NOT re-group by material instance: each renderable loops\n // packets of the same pipeline. For phase 1 every mesh with an NME material\n // shares that one material instance.\n const byMaterial = new Map<NodeMaterial, Mesh[]>();\n for (const m of meshes) {\n const mat = (materialOverride ?? m.material) as NodeMaterial;\n let list = byMaterial.get(mat);\n if (!list) {\n list = [];\n byMaterial.set(mat, list);\n }\n list.push(m);\n }\n\n const renderables: Renderable[] = [];\n\n for (const [material, matMeshes] of byMaterial) {\n const featureFlags = material._renderFeatures?.features ?? 0;\n const noColorOutput = (featureFlags & NODE_NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (featureFlags & NODE_ESM_SHADOW_OUTPUT) !== 0;\n const shadowOutput = noColorOutput || esmShadowOutput;\n const compile = shadowOutput\n ? compileNodePipeline(material._state, material._vertexBody, material._fragmentBody, {\n _engine: engine,\n _format: esmShadowOutput ? \"rgba16float\" : engine.format,\n _depthStencilFormat: \"depth32float\",\n _depthCompare: \"less-equal\",\n _msaaSamples: 1,\n _backFaceCulling: material._graph.backFaceCulling,\n _noColorOutput: noColorOutput,\n _esmShadowOutput: esmShadowOutput,\n _esmShadowDepthCode: esmShadowOutput ? material._esmShadowDepthCode : undefined,\n _alphaMode: esmShadowOutput ? 0 : undefined,\n })\n : material._compile;\n const meshBGL = compile._meshBGL;\n\n // Node UBO is per-material (same across all meshes using it).\n let nodeUBO: GPUBuffer | null = null;\n if (compile._nodeUboBinding !== null && compile._nodeUboSize > 0) {\n nodeUBO = device.createBuffer({ label: \"node-ubo\", size: compile._nodeUboSize, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n writeNodeUBO(engine, nodeUBO, material);\n material._nodeUBO = nodeUBO;\n }\n\n const packets: NodePacket[] = [];\n for (const _mesh of matMeshes) {\n // Mesh UBO layout: world (64B) + receivesShadow (vec4, 16B) + lightCount/indices.\n const meshUboBytes = 96 + 16 * Math.ceil(MAX_LIGHTS / 4);\n const _meshUBO = device.createBuffer({ label: \"node-mesh-ubo\", size: (meshUboBytes + 15) & ~15, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n const _meshScratch = new Float32Array(((meshUboBytes + 15) & ~15) / 4);\n _meshScratch.set(_mesh.worldMatrix as unknown as Float32Array, 0);\n const recv = _mesh.receiveShadows ? 1 : 0;\n _meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(_mesh, _meshScratch);\n }\n writeMeshLightSelection(_mesh, scene.lights, _meshScratch.subarray(4));\n device.queue.writeBuffer(_meshUBO, 0, _meshScratch);\n\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: _meshUBO } }];\n if (nodeUBO) {\n entries.push({ binding: compile._nodeUboBinding!, resource: { buffer: nodeUBO } });\n }\n for (const tb of compile._textureBindings) {\n const slot = material._textureSlots.get(tb._name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(\n `NodeMaterial: texture binding \"${tb._name}\" not set. Provide it via options.textures or material.inputs[\"${tb._name}\"].texture before the first render.`\n );\n }\n entries.push({ binding: tb._texBinding, resource: tex.view });\n entries.push({ binding: tb._sampBinding, resource: tex.sampler });\n }\n if (compile._morphBindings !== null) {\n const mt = (_mesh as { morphTargets?: { texture: GPUTexture; weightsBuffer: GPUBuffer } | null }).morphTargets ?? getEmptyMorph(engine);\n entries.push({ binding: compile._morphBindings._textureBinding, resource: mt.texture.createView() });\n entries.push({ binding: compile._morphBindings._uboBinding, resource: { buffer: mt.weightsBuffer } });\n }\n if (compile._envBindings) {\n material._envHelpers!.pushEnvBindGroupEntries(scene, compile._envBindings, entries);\n }\n for (let si = 0; si < compile._shadowBindings.length; si++) {\n const sb = compile._shadowBindings[si]!;\n const sg = material._shadowGenerators[si];\n if (!sg) {\n throw new Error(`NodeMaterial: material requires shadow generator #${si} but none was supplied to parseNodeMaterialFromSnippet({ shadowGenerators }).`);\n }\n entries.push({ binding: sb._texBinding, resource: sg._depthTexture.createView() });\n entries.push({ binding: sb._sampBinding, resource: sg._depthSampler });\n entries.push({ binding: sb._uboBinding, resource: { buffer: sg._shadowUBO } });\n }\n if (compile._esmShadowParamsBinding !== null) {\n entries.push({\n binding: compile._esmShadowParamsBinding,\n resource: { buffer: material._esmShadowParamsUBO! },\n });\n }\n const _meshBG = device.createBindGroup({ label: \"node-mesh-bg\", layout: meshBGL, entries });\n\n packets.push({\n _mesh,\n _meshUBO,\n _meshBG,\n _meshScratch,\n _lastWorldVersion: _mesh.worldMatrixVersion,\n _lastReceivesShadow: recv,\n _lastLightsCount: scene.lights.length,\n });\n }\n\n // Vertex attribute order (matches compile.state — captured on material).\n const attrNames = material._vertexAttrNames;\n\n const updatePacketUBO = (pkt: NodePacket): void => {\n const recv = pkt._mesh.receiveShadows ? 1 : 0;\n const worldVersion = pkt._mesh.worldMatrixVersion;\n const worldChanged = worldVersion !== pkt._lastWorldVersion;\n const recvChanged = recv !== pkt._lastReceivesShadow;\n const lightsChanged = scene.lights.length !== pkt._lastLightsCount;\n if (worldChanged || recvChanged || lightsChanged) {\n pkt._meshScratch.set(pkt._mesh.worldMatrix as unknown as Float32Array, 0);\n pkt._meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(pkt._mesh, pkt._meshScratch);\n }\n writeMeshLightSelection(pkt._mesh, scene.lights, pkt._meshScratch.subarray(4));\n device.queue.writeBuffer(pkt._meshUBO, 0, pkt._meshScratch as Float32Array<ArrayBuffer>);\n pkt._lastWorldVersion = worldVersion;\n pkt._lastReceivesShadow = recv;\n pkt._lastLightsCount = scene.lights.length;\n }\n };\n\n const updateNodeUBO = (): void => {\n if (nodeUBO && material._uboDirty) {\n material._uboDirty = false;\n writeNodeUBO(engine, nodeUBO, material);\n }\n };\n\n const drawPacket = (pass: NodeRenderPass, pkt: NodePacket): void => {\n const g = pkt._mesh._gpu;\n for (let i = 0; i < attrNames.length; i++) {\n const buf = getAttrBuffer(engine, g, attrNames[i]!);\n pass.setVertexBuffer(i, buf);\n }\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, pkt._meshBG);\n pass.drawIndexed(g.indexCount);\n };\n\n const isTransparent = !noColorOutput && !esmShadowOutput && material._needsAlphaBlending;\n\n if (isTransparent) {\n // Transparent materials: one renderable per mesh so each gets an\n // independent _worldCenter for back-to-front distance sorting.\n for (const pkt of packets) {\n const wm = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n const cx = pkt._mesh.position?.x ?? wm[12]!;\n const cy = pkt._mesh.position?.y ?? wm[13]!;\n const cz = pkt._mesh.position?.z ?? wm[14]!;\n const sortCenter: [number, number, number] = [cx, cy, cz];\n const update = (): void => {\n updatePacketUBO(pkt);\n updateNodeUBO();\n // Update world center for sorting.\n const m = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const draw = (pass: NodeRenderPass): number => {\n drawPacket(pass, pkt);\n return 1;\n };\n const rTrans: Renderable = {\n order: 200,\n isTransparent: true,\n mesh: pkt._mesh,\n _worldCenter: sortCenter,\n bind() {\n return { renderable: rTrans, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rTrans);\n }\n } else {\n // Opaque: batch all meshes into one renderable for state efficiency.\n const update = (): void => {\n for (const pkt of packets) {\n updatePacketUBO(pkt);\n }\n updateNodeUBO();\n };\n const draw = (pass: NodeRenderPass): number => {\n let draws = 0;\n for (const pkt of packets) {\n drawPacket(pass, pkt);\n draws++;\n }\n return draws;\n };\n const rOpaque: Renderable = {\n order: 100,\n isTransparent: false,\n bind() {\n return { renderable: rOpaque, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rOpaque);\n }\n }\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, override?: Material): Renderable => {\n return buildNodeMeshRenderables(s, [mesh], override).renderables[0]!;\n };\n\n return { renderables, rebuildSingle };\n}\n\n// Per-gpu-object cached zero buffers for attributes that a NodeMaterial's\n// vertex layout declares but the mesh itself doesn't provide (e.g. vertex\n// color on meshes that don't use VERTEXCOLOR). We allocate one zero buffer\n// lazily per gpu object, sized to its position vertex count × stride.\nconst zeroAttrCache = new WeakMap<object, Map<string, GPUBuffer>>();\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n // position buffer size in bytes / 12 (vec3) = vertex count.\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : name === \"tangent\" || name === \"color\" ? 16 : 16;\n const buf = engine._device.createBuffer({ label: `node-zero-${name}`, size: vertexCount * stride, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST });\n // Initialize with zeros (buffer starts zeroed when not mappedAtCreation).\n cache.set(name, buf);\n return buf;\n}\n\nfunction getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer;\n case \"uv\":\n return gpu.uvBuffer;\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n default:\n throw new Error(`NodeMaterial: unsupported attribute \"${name}\"`);\n }\n}\n\nfunction writeAttributeFlags(mesh: Mesh, scratch: Float32Array): void {\n const gpu = mesh._gpu;\n scratch[17] = gpu.hasUv === false ? 0 : 1;\n scratch[18] = gpu.hasTangent ? 1 : 0;\n scratch[19] = gpu.hasColor ? 1 : 0;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"node-shadow-DKrcqmNg.js","sources":["../src/material/node/node-shadow.ts"],"sourcesContent":["/** Node Material — shadow emission (dynamically imported).\n *\n * This module is imported ONLY when `parseNodeMaterialFromSnippet` receives\n * `shadowGenerators`. Scenes without shadows never bundle it, keeping the\n * shadow WGSL (PCF/ESM helper fns + binding wiring) off the critical path.\n *\n * Emits three things per shadow light (texture + sampler + shadowInfo UBO)\n * plus the vertex-stage varying computations and the fragment-stage\n * `nme_computeShadowFactors(input)` dispatcher consumed by the LightBlock.\n */\n\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport type { Varying } from \"../../shader/fragment-types.js\";\n\nconst SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;\nconst SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\n/** @internal */\nexport interface ShadowBinding {\n /** @internal */\n readonly _lightIndex: number;\n /** @internal */\n readonly _texBinding: number;\n /** @internal */\n readonly _sampBinding: number;\n /** @internal */\n readonly _uboBinding: number;\n /** @internal */\n readonly _shadowType: \"esm\" | \"pcf\";\n}\n\nexport interface ShadowEmit {\n /** @internal One per shadow-casting light (3 binding slots each). */\n readonly _bindings: readonly ShadowBinding[];\n /** @internal Module-scope WGSL: struct + binding decls + compute fns. */\n readonly _wgslDecls: string;\n /** @internal `nme_computeShadowFactors(input) -> array<f32, MAX_LIGHTS>` called from light blocks. */\n readonly _fragmentHelper: string;\n /** @internal Injected into vs_main body: populates vPosFromLight_i + vDepthMetric_i varyings. */\n readonly _vertexInject: string;\n /** @internal GPU BGL entries for group 1 (append to meshBglEntries). */\n readonly _bglEntries: readonly GPUBindGroupLayoutEntry[];\n /** @internal Total bindings consumed (= shadowLights.length * 3). */\n readonly _bindingCount: number;\n}\n\n/** Emit shadow WGSL + bindings for a NodeMaterial.\n * Mutates `varyings` (pushes vPosFromLight_i + vDepthMetric_i per light) so\n * buildVertexOut picks them up.\n */\nexport function emitShadow(shadowLights: readonly { lightIndex: number; shadowType: \"esm\" | \"pcf\" }[], startBinding: number, varyings: Varying[]): ShadowEmit {\n const _bindings: ShadowBinding[] = [];\n const wgslDecls: string[] = [];\n const _bglEntries: GPUBindGroupLayoutEntry[] = [];\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n if (!varyings.some((v) => v._name === `vPosFromLight${suf}`)) {\n varyings.push({ _name: `vPosFromLight${suf}`, _type: \"vec4<f32>\" });\n }\n if (!varyings.some((v) => v._name === `vDepthMetric${suf}`)) {\n varyings.push({ _name: `vDepthMetric${suf}`, _type: \"f32\" });\n }\n }\n const vertLines: string[] = [`let _shadowWp4 = meshU.world * vec4<f32>(in.position, 1.0);`];\n const dispatchLines: string[] = [`var _sf = ${SHADOW_FACTORS_ONE};`];\n let nextBinding = startBinding;\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n const _lightIndex = sl.lightIndex;\n const _texBinding = nextBinding++;\n const _sampBinding = nextBinding++;\n const _uboBinding = nextBinding++;\n const _shadowType = sl.shadowType;\n _bindings.push({ _lightIndex, _texBinding, _sampBinding, _uboBinding, _shadowType });\n wgslDecls.push(\n `struct shadowInfo${suf}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`,\n `@group(1) @binding(${_uboBinding}) var<uniform> shadowInfo${suf}: shadowInfo${suf}Uniforms;`\n );\n if (sl.shadowType === \"pcf\") {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_depth_2d;`,\n `@group(1) @binding(${_sampBinding}) var shadowComp${suf}: sampler_comparison;`,\n `fn computeShadowPCF${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\n let depthRef = clamp(clipSpace.z, 0.0, 1.0);\n var tc = uv * mapSz + 0.5;\n let st = fract(tc);\n let base = (floor(tc) - 0.5) * invMapSz;\n let uvw0 = 4.0 - 3.0 * st;\n let uvw1 = vec2<f32>(7.0);\n let uvw2 = 1.0 + 3.0 * st;\n let u = vec3<f32>((3.0 - 2.0 * st.x) / uvw0.x - 2.0, (3.0 + st.x) / uvw1.x, st.x / uvw2.x + 2.0) * invMapSz;\n let v = vec3<f32>((3.0 - 2.0 * st.y) / uvw0.y - 2.0, (3.0 + st.y) / uvw1.y, st.y / uvw2.y + 2.0) * invMapSz;\n var sh = 0.0;\n sh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[0]), depthRef);\n sh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[0]), depthRef);\n sh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[0]), depthRef);\n sh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[1]), depthRef);\n sh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[1]), depthRef);\n sh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[1]), depthRef);\n sh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[2]), depthRef);\n sh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[2]), depthRef);\n sh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[2]), depthRef);\n sh /= 144.0;\n return mix(darkness, 1.0, sh);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowPCF${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.y, shadowInfo${suf}.shadowsInfo.z);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"depth\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"comparison\" } }\n );\n } else {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_2d<f32>;`,\n `@group(1) @binding(${_sampBinding}) var shadowSamp${suf}: sampler;`,\n `fn computeFallOff${suf}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {\n let mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));\n return mix(value, 1.0, mask);\n}\nfn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\n let shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);\n let shadowMapSample = textureSampleLevel(shadowTex${suf}, shadowSamp${suf}, uv, 0.0).x;\n let esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);\n return computeFallOff${suf}(esm, clipSpace.xy, frustumEdgeFalloff);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowESM${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.z, shadowInfo${suf}.shadowsInfo.w);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"filtering\" } }\n );\n }\n vertLines.push(\n `out.vPosFromLight${suf} = shadowInfo${suf}.lightMatrix * _shadowWp4;`,\n `out.vDepthMetric${suf} = (out.vPosFromLight${suf}.z + shadowInfo${suf}.depthValues.x) / shadowInfo${suf}.depthValues.y;`\n );\n _bglEntries.push({\n binding: _uboBinding,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\", minBindingSize: 96 },\n });\n }\n dispatchLines.push(`for (var _i = 0u; _i < ${MAX_LIGHTS}u; _i++) { _sf[_i] = mix(1.0, _sf[_i], meshU.receivesShadow.x); }`);\n dispatchLines.push(`return _sf;`);\n return {\n _bindings,\n _wgslDecls: wgslDecls.join(\"\\n\"),\n _fragmentHelper: `fn nme_computeShadowFactors(input: VertexOut) -> ${SHADOW_FACTORS_TYPE} {\\n ${dispatchLines.join(\"\\n \")}\\n}`,\n _vertexInject: vertLines.join(\"\\n \"),\n _bglEntries,\n _bindingCount: shadowLights.length * 3,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-renderable-BJxUtPBb.js","sources":["../src/material/pbr/pbr-pipeline.ts","../src/material/pbr/pbr-template.ts","../src/material/pbr/pbr-compose.ts","../src/material/pbr/pbr-renderable.ts"],"sourcesContent":["/** Dynamic PBR pipeline builder — creates and caches GPU render pipelines\n * based on per-mesh PBR feature flags + ComposedShader from the fragment system.\n *\n * Two-tier cache:\n * - Shader bindings (BGLs + composed shader + per-sig pipeline cache) keyed by\n * `(features, features2)`. Sig-independent.\n * - Pipelines live inside each `_PbrShaderBindings`, keyed by `targetSignatureKey(sig)`.\n */\n\nimport type { PbrMaterialProps } from \"./pbr-material.js\";\nimport type { EnvironmentTextures } from \"../../loader-env/load-env.js\";\nimport type { ComposedShader } from \"../../shader/fragment-types.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { Texture2D } from \"../../texture/texture-2d.js\";\nimport type { _PbrBindCtx, PbrExt } from \"./pbr-flags.js\";\nimport { _getPbrExtsSorted, PBR2_ESM_SHADOW_OUTPUT, PBR2_NO_COLOR_OUTPUT, PBR2_HAS_UV2 } from \"./pbr-flags.js\";\nimport { PBR_HAS_NORMAL_MAP, PBR_HAS_EMISSIVE, PBR_HAS_SPEC_GLOSS, PBR_HAS_DOUBLE_SIDED, PBR_HAS_ALPHA_BLEND } from \"./pbr-flags.js\";\nimport { MSH_HAS_TANGENTS, MSH_HAS_UV2 } from \"../mesh-features.js\";\nimport { REVERSE_DEPTH_COMPARE, targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\n\n// ─── Shader Bindings (sig-independent) ──────────────────────────────\n\ninterface _PbrShaderBindings {\n _features: number;\n _features2: number;\n _meshFeatures: number;\n _meshBGL: GPUBindGroupLayout;\n _shadowBGL: GPUBindGroupLayout | null;\n _composed: ComposedShader;\n /** Per-sig pipeline cache. Key = `targetSignatureKey(sig)`. */\n _pipelines: Map<string, GPURenderPipeline>;\n}\n\n// ─── Caches ─────────────────────────────────────────────────────────\n\nconst _bindingsCache = new Map<string, _PbrShaderBindings>();\nlet _cachedDevice: GPUDevice | null = null;\n\nfunction ensureDevice(engine: EngineContext): void {\n if (_cachedDevice !== engine._device) {\n _bindingsCache.clear();\n _cachedDevice = engine._device;\n }\n}\n\n/** Clear the pipeline cache. Must be called when a GPU device is destroyed. */\nexport function clearPbrPipelineCache(): void {\n _bindingsCache.clear();\n _cachedDevice = null;\n}\n\n/** Get-or-build the sig-independent PBR shader bindings. Used at renderable build time\n * so per-mesh bind groups can be created BEFORE any sig is known. */\nexport function getOrCreatePbrBindings(\n engine: EngineContext,\n features: number,\n features2: number,\n meshFeatures: number,\n sceneFeatures: number,\n composed: ComposedShader,\n shaderKey = \"\"\n): _PbrShaderBindings {\n ensureDevice(engine);\n const key = `${features}:${features2}:${meshFeatures}:${sceneFeatures}:${shaderKey}`;\n const cached = _bindingsCache.get(key);\n if (cached) {\n return cached;\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n let shadowBGL: GPUBindGroupLayout | null = null;\n if (composed._shadowBGLDescriptor) {\n shadowBGL = device.createBindGroupLayout(composed._shadowBGLDescriptor);\n }\n const bindings: _PbrShaderBindings = {\n _features: features,\n _features2: features2,\n _meshFeatures: meshFeatures,\n _meshBGL: meshBGL,\n _shadowBGL: shadowBGL,\n _composed: composed,\n _pipelines: new Map(),\n };\n _bindingsCache.set(key, bindings);\n return bindings;\n}\n\n/** Get-or-build the sig-specific pipeline on top of a PBR shader bindings. Called at bind() time. */\nexport function getOrCreatePbrPipeline(engine: EngineContext, sig: RenderTargetSignature, bindings: _PbrShaderBindings): GPURenderPipeline {\n ensureDevice(engine);\n const key = targetSignatureKey(sig);\n const cached = bindings._pipelines.get(key);\n if (cached) {\n return cached;\n }\n\n const device = engine._device;\n const { _features: features, _features2: features2, _composed: composed } = bindings;\n const esmShadowOutput = (features2 & PBR2_ESM_SHADOW_OUTPUT) !== 0;\n const hasAlpha = !esmShadowOutput && (features & PBR_HAS_ALPHA_BLEND) !== 0;\n const hasDoubleSided = (features & PBR_HAS_DOUBLE_SIDED) !== 0;\n\n const sceneBGL = getSceneBindGroupLayout(engine);\n const bgls: GPUBindGroupLayout[] = bindings._shadowBGL ? [sceneBGL, bindings._meshBGL, bindings._shadowBGL] : [sceneBGL, bindings._meshBGL];\n\n const vertModule = device.createShaderModule({ code: composed._vertexWGSL });\n const noColorOutput = (features2 & PBR2_NO_COLOR_OUTPUT) !== 0;\n const fragModule = !sig._colorFormat && !noColorOutput ? null : device.createShaderModule({ code: composed._fragmentWGSL });\n\n const fragTarget: GPUColorTargetState | null = noColorOutput ? null : { format: sig._colorFormat!, writeMask: GPUColorWrite.ALL };\n if (hasAlpha && fragTarget) {\n fragTarget.blend = {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n };\n }\n\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: bgls }),\n vertex: { module: vertModule, entryPoint: \"main\", buffers: composed._vertexBufferLayouts },\n ...(fragModule ? { fragment: { module: fragModule, entryPoint: \"main\", targets: fragTarget ? [fragTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n depthWriteEnabled: noColorOutput || esmShadowOutput || !hasAlpha,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: hasDoubleSided ? (\"none\" as GPUCullMode) : \"back\", frontFace: sig._flipY ? \"cw\" : \"ccw\" },\n });\n bindings._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Per-Mesh Bind Group ────────────────────────────────────────────\n\nexport function createPbrMeshBindGroup(\n engine: EngineContext,\n bindings: _PbrShaderBindings,\n composed: ComposedShader,\n meshUBO: GPUBuffer,\n materialUBO: GPUBuffer,\n material: PbrMaterialProps,\n env: EnvironmentTextures | null,\n meshCtx: { skeleton?: { boneTexture: GPUTexture } | null; morphTargets?: { texture: GPUTexture; weightsBuffer?: GPUBuffer } | null } | null,\n refractionTexture?: Texture2D | null\n): GPUBindGroup {\n const device = engine._device;\n const features = bindings._features;\n const features2 = bindings._features2;\n const meshFeatures = bindings._meshFeatures;\n const hasNormal = (features & PBR_HAS_NORMAL_MAP) !== 0 && (meshFeatures & MSH_HAS_TANGENTS) !== 0;\n const hasCotangentNormal = (features & PBR_HAS_NORMAL_MAP) !== 0 && (meshFeatures & MSH_HAS_TANGENTS) === 0;\n const hasAnyNormal = hasNormal || hasCotangentNormal;\n const hasEmissive = (features & PBR_HAS_EMISSIVE) !== 0;\n const hasSpecGloss = (features & PBR_HAS_SPEC_GLOSS) !== 0;\n const esmShadowOutput = (features2 & PBR2_ESM_SHADOW_OUTPUT) !== 0;\n\n const entries: GPUBindGroupEntry[] = [];\n let b = 0;\n const addTex = (t: { view: GPUTextureView; sampler: GPUSampler }) => {\n entries.push({ binding: b++, resource: t.view });\n entries.push({ binding: b++, resource: t.sampler });\n };\n\n const ctx: _PbrBindCtx = {\n _engine: engine,\n _features: features,\n _features2: features2,\n _meshFeatures: meshFeatures,\n _material: material,\n _mesh: meshCtx ?? undefined,\n _env: env,\n _refractionTexture: refractionTexture,\n };\n\n const sortedExts = _getPbrExtsSorted();\n\n const fragIds = composed._fragmentKey ? composed._fragmentKey.split(\"|\").filter((s) => s.length > 0) : [];\n\n entries.push({ binding: b++, resource: { buffer: meshUBO } });\n entries.push({ binding: b++, resource: { buffer: materialUBO } });\n for (const ext of sortedExts) {\n if (ext.phase === \"vertex\" && ext.bind) {\n b = ext.bind(ctx, entries, b);\n }\n }\n addTex(material.baseColorTexture!);\n if (hasAnyNormal) {\n addTex(material.normalTexture!);\n }\n addTex(material.ormTexture!);\n if ((features2 & PBR2_HAS_UV2) !== 0 && (meshFeatures & MSH_HAS_UV2) !== 0 && material.occlusionTexture) {\n addTex(material.occlusionTexture);\n }\n if (hasEmissive) {\n addTex(material.emissiveTexture!);\n }\n if (hasSpecGloss) {\n addTex(material.specGlossTexture!);\n }\n if (esmShadowOutput) {\n entries.push({\n binding: b++,\n resource: { buffer: (material as PbrMaterialProps & { readonly _esmShadowParamsUBO: GPUBuffer })._esmShadowParamsUBO },\n });\n }\n const seenExts: PbrExt[] = [];\n for (const fid of fragIds) {\n const ext = sortedExts.find((e) => e.id === fid || fid.startsWith(e.id + \"-\"));\n if (!ext || ext.phase === \"vertex\" || !ext.bind || seenExts.includes(ext)) {\n continue;\n }\n seenExts.push(ext);\n b = ext.bind(ctx, entries, b);\n }\n\n return device.createBindGroup({ layout: bindings._meshBGL, entries });\n}\n","/**\n * PBR Base Template\n *\n * Provides the base PBR shader structure with slot markers where\n * fragments inject their code. This is the PBR equivalent of\n * what composePbrVertex/composePbrFragment produce today.\n *\n * The template is parameterized by light type and feature flags\n * because these fundamentally change the shader structure.\n */\n\nimport type { ShaderTemplate, UboField, VertexAttribute, Varying, BindingDecl } from \"../../shader/fragment-types.js\";\nimport type { PbrTemplateExt } from \"./pbr-template-ext.js\";\nimport type { MeshVbLayout } from \"../../mesh/mesh.js\";\nimport { appendMeshLightUboFields, meshLightIndexWGSL } from \"../../render/lights-ubo.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\n// ── BRDF functions (always present in PBR) ──────────────────────\n\nconst BRDF_FUNCTIONS = `\nconst PI:f32=3.14159265358979323846;\nfn distributionGGX(NdotH:f32,alphaG:f32)->f32{\nlet a2=alphaG*alphaG;\nlet d=NdotH*NdotH*(a2-1.0)+1.0;\nreturn a2/(PI*d*d);\n}\nfn geometrySmithGGX(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/(gl+gv);\n}\nfn fresnelSchlick(cosTheta:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-cosTheta;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\n`;\n\nexport interface PbrTemplateConfig {\n /** When true, generates a non-looping single-light direct block + lights UBO binding. */\n /** @internal */\n readonly _hasSingleLight?: boolean;\n /** When true, generates a multi-light loop + lights UBO binding.\n * Used for multiple lights or shadow receivers. */\n /** @internal */\n readonly _hasMultiLight?: boolean;\n /** Pre-built WGSL for the single-light UBO structs. */\n /** @internal */\n readonly _singleLightWGSL?: string;\n /** Pre-built WGSL for the single-light direct lighting block. */\n /** @internal */\n readonly _singleLightBlock?: string;\n /** Pre-built WGSL for multi-light (structs + computePbrLight). Passed from\n * dynamically imported fragments/multilight-wgsl.ts to keep it out of non-shadow bundles. */\n /** @internal */\n readonly _multiLightWGSL?: string;\n /** Pre-built WGSL for the multi-light direct lighting loop body. */\n /** @internal */\n readonly _multiLightLoop?: string;\n /** Normal map mode (default: \"none\") */\n /** @internal */\n readonly _normalMode?: \"tangent\" | \"cotangent\" | \"none\";\n /** Has emissive texture */\n /** @internal */\n readonly _hasEmissiveTexture?: boolean;\n /** Has specular-glossiness workflow */\n /** @internal */\n readonly _hasSpecGloss?: boolean;\n /** Has double-sided rendering */\n /** @internal */\n readonly _hasDoubleSided?: boolean;\n /** Has tonemap */\n /** @internal */\n readonly _hasTonemap?: boolean;\n /** ACES WGSL: tonemap helper functions (dynamically imported). Empty string = standard exponential tonemap. */\n /** @internal */\n readonly _acesHelpers?: string;\n /** ACES WGSL: tonemap call block replacing the default exponential one. */\n /** @internal */\n readonly _acesTonemapCall?: string;\n /** Has alpha blending */\n /** @internal */\n readonly _hasAlphaBlend?: boolean;\n /** Has specular AA */\n /** @internal */\n readonly _hasSpecularAA?: boolean;\n /** Has gamma albedo (sRGB base color decode) */\n /** @internal */\n readonly _hasGammaAlbedo?: boolean;\n /** Has a non-default base-color factor multiplied over the base-color texture. */\n /** @internal */\n readonly _hasBaseColorFactor?: boolean;\n /** Has morph targets (changes position/normal variable names in vertex shader) */\n /** @internal */\n readonly _hasMorph?: boolean;\n /** Has occlusion in ORM texture (simple path, no reflectance ext) */\n /** @internal */\n readonly _hasOcclusion?: boolean;\n /** Has emissive color UBO field (fragment handles emissive computation) */\n /** @internal */\n readonly _hasEmissiveColor?: boolean;\n /** When true, the reflectance fragment handles F0 + occlusion computation */\n /** @internal */\n readonly _hasReflectanceExt?: boolean;\n /** When true, include IBL SH coefficients in scene UBO */\n /** @internal */\n readonly _hasIbl?: boolean;\n /** Has anisotropy layer */\n /** @internal */\n readonly _hasAnisotropy?: boolean;\n /** Anisotropy WGSL: BRDF helper functions (dynamically imported). */\n /** @internal */\n readonly _anisoBrdfFunctions?: string;\n /** Anisotropy WGSL: T/B computation block (dynamically imported). */\n /** @internal */\n readonly _anisoTBBlock?: string;\n /** Optional extension config for advanced features (UV transforms, UV2, vertex colors).\n * When undefined, base template defaults to master-like behavior (no feature strings). */\n /** @internal */\n readonly _ext?: PbrTemplateExt;\n /** Generate a fragment stage that runs discard/alpha-test logic and writes no color. */\n /** @internal */\n readonly _noColorOutput?: boolean;\n /** Generate a fragment stage that runs discard/alpha-test logic and writes ESM shadow color. */\n /** @internal */\n readonly _esmShadowOutput?: boolean;\n /** ESM shadow depth output code. Supplied by the ESM material view so normal PBR bundles don't retain it. */\n /** @internal */\n readonly _esmShadowDepthCode?: string;\n /** @internal Per-attribute vertex-buffer interleave layout. Undefined (or per-attribute\n * undefined) → canonical tight strides (12/12/16/8). Only set for meshes\n * sourcing attributes from a strided bufferView. */\n readonly _vbStrides?: MeshVbLayout;\n}\n\n/**\n * Create a PBR ShaderTemplate from the given configuration.\n * The template contains slot markers that the composer fills with fragment code.\n */\nexport function createPbrTemplate(config: PbrTemplateConfig): ShaderTemplate {\n const {\n _hasSingleLight = false,\n _hasMultiLight = false,\n _singleLightWGSL = \"\",\n _singleLightBlock = \"\",\n _multiLightWGSL = \"\",\n _multiLightLoop = \"\",\n _normalMode = \"none\",\n _hasEmissiveTexture = false,\n _hasSpecGloss = false,\n _hasDoubleSided = false,\n _hasTonemap = false,\n _acesHelpers = \"\",\n _acesTonemapCall = \"\",\n _hasAlphaBlend = false,\n _hasSpecularAA = false,\n _hasGammaAlbedo = false,\n _hasBaseColorFactor = false,\n _hasMorph = false,\n _hasOcclusion = false,\n _hasEmissiveColor = false,\n _hasReflectanceExt = false,\n _hasIbl = false,\n _hasAnisotropy = false,\n _anisoBrdfFunctions = \"\",\n _anisoTBBlock = \"\",\n _ext,\n _noColorOutput = false,\n _esmShadowOutput = false,\n _esmShadowDepthCode = \"\",\n _vbStrides,\n } = config;\n const hasNormal = _normalMode === \"tangent\";\n const hasCotangentNormal = _normalMode === \"cotangent\";\n const hasAnyNormal = hasNormal || hasCotangentNormal;\n\n // ── Base vertex attributes ──────────────────────────────────\n // arrayStride defaults to the canonical tight element size; interleaved meshes\n // override it (e.g. 24 for POSITION+NORMAL sharing one stride-24 bufferView).\n const _baseVertexAttributes: VertexAttribute[] = [\n { _name: \"position\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: _vbStrides?._p?._stride ?? 12 },\n { _name: \"normal\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: _vbStrides?._n?._stride ?? 12 },\n ];\n if (hasNormal) {\n _baseVertexAttributes.push({ _name: \"tangent\", _type: \"vec4<f32>\", _gpuFormat: \"float32x4\", _arrayStride: _vbStrides?._t?._stride ?? 16 });\n }\n _baseVertexAttributes.push({ _name: \"uv\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: _vbStrides?._u?._stride ?? 8 });\n if (_ext) {\n _baseVertexAttributes.push(..._ext.extraVertexAttributes);\n }\n\n // ── Base varyings ───────────────────────────────────────────\n const _baseVaryings: Varying[] = [\n { _name: \"worldPos\", _type: \"vec3<f32>\" },\n { _name: \"worldNormal\", _type: \"vec3<f32>\" },\n ];\n if (hasNormal) {\n _baseVaryings.push({ _name: \"worldTangent\", _type: \"vec3<f32>\" }, { _name: \"worldBitangent\", _type: \"vec3<f32>\" });\n }\n _baseVaryings.push({ _name: \"uv\", _type: \"vec2<f32>\" });\n if (_ext) {\n _baseVaryings.push(..._ext.extraVaryings);\n }\n\n // ── Base mesh UBO fields (world matrix + affected light indices — UV transforms are\n // per-texture now, emitted on the material UBO when hasUvTransform). ─\n const _baseMeshUboFields: UboField[] = [{ _name: \"world\", _type: \"mat4x4<f32>\" }];\n appendMeshLightUboFields(_baseMeshUboFields);\n\n // ── Base material UBO fields ────────────────────────────────────\n const _baseMaterialUboFields: UboField[] = [\n { _name: \"environmentIntensity\", _type: \"f32\" },\n { _name: \"directIntensity\", _type: \"f32\" },\n { _name: \"reflectance\", _type: \"f32\" },\n { _name: \"materialAlpha\", _type: \"f32\" },\n ...(_hasBaseColorFactor ? [{ _name: \"baseColorFactor\", _type: \"vec4<f32>\" as const }] : []),\n // glTF metallicFactor / roughnessFactor (default 1.0) — applied over MR texture channels.\n { _name: \"metallicFactor\", _type: \"f32\" },\n { _name: \"roughnessFactor\", _type: \"f32\" },\n { _name: \"normalScale\", _type: \"f32\" },\n { _name: \"lightFalloffMode\", _type: \"f32\" },\n // Anisotropy UBO field stays on the base template because anisotropy is\n // template-only (no ShaderFragment) — the anisotropyExt just writes its\n // slice through the unified ext.writeUbo hook.\n ...(_hasAnisotropy ? [{ _name: \"anisotropyParams\", _type: \"vec4<f32>\" as const }] : []),\n // ── Extension fields (per-texture UV transforms, etc.) ─\n ...(_ext ? _ext.extraMaterialUboFields : []),\n ];\n\n // ── Helper: texture + sampler binding pair ────────────────────\n const tex2d = (name: string, sampler: string): BindingDecl[] => [\n { _name: name, _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: sampler, _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ];\n\n // ── Base bindings (always-present textures) ─────────────────\n const _baseBindings: BindingDecl[] = tex2d(\"baseColorTexture\", \"baseColorSampler\");\n if (hasAnyNormal) {\n _baseBindings.push(...tex2d(\"normalTexture\", \"normalSampler_\"));\n }\n _baseBindings.push(...tex2d(\"ormTexture\", \"ormSampler\"));\n if (_ext) {\n _baseBindings.push(..._ext.extraBindings);\n }\n if (_hasEmissiveTexture) {\n _baseBindings.push(...tex2d(\"emissiveTexture\", \"emissiveSampler\"));\n }\n if (_hasSpecGloss) {\n _baseBindings.push(...tex2d(\"specGlossTexture\", \"specGlossSampler\"));\n }\n if (_esmShadowOutput) {\n _baseBindings.push({ _name: \"shadowParams\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT });\n }\n // ── Vertex template ─────────────────────────────────────────\n // When morph targets are active, the morph fragment's VR\n // defines morphedPos/morphedNorm. The base template uses those instead\n // of the raw vertex attributes.\n const posVar = _hasMorph ? \"morphedPos\" : \"position\";\n const normVar = _hasMorph ? \"morphedNorm\" : \"normal\";\n\n // The vertex template uses morphedPos/morphedNorm when morph fragment is present,\n // falling back to position/normal. The morph fragment's VR defines these vars.\n const tangentBlock = hasNormal\n ? `let N_local=normalize(${normVar});\nlet T_local=normalize(tangent.xyz);\nlet B_local=cross(N_local,T_local)*tangent.w;\nout.worldTangent=(finalWorld*vec4<f32>(T_local,0.0)).xyz;\nout.worldBitangent=(finalWorld*vec4<f32>(B_local,0.0)).xyz;`\n : \"\";\n\n const _vertexTemplate = `/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n/*VH*/\n/*VD*/\n/*VO*/\n@vertex fn main(\n/*VP*/\n) -> VertexOutput {\nvar out: VertexOutput;\n/*VR*/\nvar finalWorld = mesh.world;\n/*VW*/\nlet worldPos4 = finalWorld * vec4<f32>(${posVar}, 1.0);\nout.worldPos = worldPos4.xyz;\nout.clipPos = scene.viewProjection * worldPos4;\nout.worldNormal = (finalWorld * vec4<f32>(normalize(${normVar}), 0.0)).xyz;\n${tangentBlock}\nout.uv = uv;\n ${_ext ? _ext.vertexBodyExtra : \"\"}/*VB*/\nreturn out;\n}`;\n\n // ── Fragment template ────────────────────────────────────────\n\n // Normal handling block\n const normalUV = _ext?.uvForNormal ?? \"input.uv\";\n const normalScaleMod = _ext?.normalScaleMod ?? \"\";\n const normalRef = _ext?.normalScaleMod ? \"scaledNormal\" : \"normalMapRaw\";\n const normalRefCt = _ext?.normalScaleMod ? \"scaledNormalCT\" : \"normalMapSample\";\n let normalBlock: string;\n if (hasNormal) {\n normalBlock = `let normalMapRaw=textureSample(normalTexture,normalSampler_,${normalUV}).rgb*2.0-1.0;\n${normalScaleMod}let normalMapNorm=normalize(${normalRef});\nlet N_geom=normalize(input.worldNormal);\nlet TBN=mat3x3<f32>(input.worldTangent,input.worldBitangent,input.worldNormal);\nvar N=normalize(TBN*normalMapNorm);`;\n } else if (hasCotangentNormal) {\n normalBlock = `let normalMapSample=textureSample(normalTexture,normalSampler_,${normalUV}).rgb*2.0-1.0;\n${normalScaleMod.replace(/normalMapRaw/g, \"normalMapSample\").replace(/scaledNormal/g, \"scaledNormalCT\")}let N_geom=normalize(input.worldNormal);\nlet dp1=dpdx(input.worldPos);\nlet dp2=dpdy(input.worldPos);\nlet duv1=dpdx(${normalUV});\nlet duv2=dpdy(${normalUV});\nlet dp2perp=cross(dp2,N_geom);\nlet dp1perp=cross(N_geom,dp1);\nlet tangent_ct=dp2perp*duv1.x+dp1perp*duv2.x;\nlet bitangent_ct=-(dp2perp*duv1.y+dp1perp*duv2.y);\nlet det=max(dot(tangent_ct,tangent_ct),dot(bitangent_ct,bitangent_ct));\nlet invmax=select(inverseSqrt(det),0.0,det==0.0);\nlet cotangentFrame=mat3x3<f32>(tangent_ct*invmax,bitangent_ct*invmax,N_geom);\nvar N=normalize(cotangentFrame*normalize(${normalRefCt}));`;\n } else {\n normalBlock = `let N_geom=normalize(input.worldNormal);\nvar N=N_geom;`;\n }\n\n // Anisotropy: tangent/bitangent frame (passed in from dynamic import, empty if not used)\n const anisotropyTBBlock = _hasAnisotropy ? _anisoTBBlock : \"\";\n\n // Base color decoding\n const vertexColorMod = _ext?.baseColorMod ?? \"\";\n const baseColorFactorRgb = _hasBaseColorFactor ? \"*material.baseColorFactor.rgb\" : \"\";\n const baseColorFactorAlpha = _hasBaseColorFactor ? \"*material.baseColorFactor.a\" : \"\";\n const baseColorDecode = _hasGammaAlbedo\n ? `var baseColor=pow(baseColorSample.rgb,vec3<f32>(2.2))${baseColorFactorRgb};\nvar alpha=baseColorSample.a${baseColorFactorAlpha};${vertexColorMod}`\n : `var baseColor=baseColorSample.rgb${baseColorFactorRgb};\nvar alpha=baseColorSample.a${baseColorFactorAlpha};${vertexColorMod}`;\n\n // Roughness / metallic\n const specGlossUV = _ext?.uvForSpecGloss ?? \"input.uv\";\n const roughnessMetallic = _hasSpecGloss\n ? `let specGloss=textureSample(specGlossTexture,specGlossSampler,${specGlossUV});\nlet roughness=clamp(1.0-specGloss.a,0.0,1.0);\nlet metallic=0.0;`\n : `let roughness=clamp(orm.g*material.roughnessFactor,0.0,1.0);\nlet metallic=orm.b*material.metallicFactor;`;\n\n // Emissive default (overridden by emissive-color fragment's AT slot)\n const emissiveUV = _ext?.uvForEmissive ?? \"input.uv\";\n const emissiveDefault = _hasEmissiveColor\n ? ``\n : _hasEmissiveTexture\n ? `let emissive=textureSample(emissiveTexture,emissiveSampler,${emissiveUV}).rgb;`\n : `let emissive=vec3<f32>(0.0);`;\n\n // Occlusion default (overridden by reflectance fragment's AT slot or ext occlusion override)\n const occlusionDefault = _hasReflectanceExt ? `` : _ext?.occlusionOverride ? _ext.occlusionOverride : _hasOcclusion ? `let occlusion=orm.r;` : `let occlusion=1.0;`;\n // F0 computation (overridden by reflectance fragment's MF slot)\n const f0Default = _hasReflectanceExt\n ? ``\n : _hasSpecGloss\n ? `var colorF0=specGloss.rgb;\nlet colorF90=vec3<f32>(1.0);\nlet maxSpecular=max(colorF0.r,max(colorF0.g,colorF0.b));\nlet surfaceAlbedo=baseColor*(1.0-maxSpecular);`\n : `let dielectricF0=material.reflectance;\nvar colorF0=mix(vec3<f32>(dielectricF0),baseColor,metallic);\nlet colorF90=vec3<f32>(1.0);\nlet surfaceAlbedo=baseColor*(1.0-dielectricF0)*(1.0-metallic);`;\n\n // Specular AA + geometric-curvature roughness factors (BJS getAARoughnessFactors).\n // AA_factor_x is the direct-light roughness floor (matches BJS `computeSheenLighting`\n // which clamps info.roughness upward). AA_factor_y is the IBL/alphaG additive bump.\n // Emitted unconditionally as var so sheen/other fragments can reference them\n // without needing a define; zero on the no-curvature path makes them a no-op.\n const specularAABlock =\n _hasSpecularAA || hasAnyNormal\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+=AA_factor_y;}`\n : `var AA_factor_x=0.0;\nvar AA_factor_y=0.0;`;\n\n // Direct lighting block — use the compact non-looping shader for one non-shadow light,\n // and the generic multi-light loop for multiple lights or shadow receivers.\n const directLightBlock: string = _hasMultiLight\n ? _multiLightLoop\n : _hasSingleLight\n ? _singleLightBlock\n : `var directDiffuse=vec3<f32>(0.0);\nvar directSpecular=vec3<f32>(0.0);\n/*BL*/`;\n\n // Tonemap: BJS TONEMAPPING_STANDARD (exponential) by default; caller-supplied\n // ACES WGSL (from pbr-aces-wgsl.ts) is used when provided.\n const useAces = _hasTonemap && _acesTonemapCall !== \"\";\n const acesBlock = useAces ? _acesHelpers : \"\";\n const tonemapBlock = _hasTonemap\n ? useAces\n ? _acesTonemapCall\n : `color*=scene.vImageInfos.x;\ncolor=1.0-exp2(-1.590579*color);`\n : `color*=scene.vImageInfos.x;`;\n\n // Alpha output\n const alphaBlock = _noColorOutput\n ? \"\"\n : _hasAlphaBlend\n ? `var finalAlpha=alpha*material.materialAlpha;\nvar luminanceOverAlpha=0.0;\n/*BA*/\nluminanceOverAlpha+=dot(${_hasIbl ? \"finalSpecularScaled\" : \"directSpecular\"},vec3<f32>(0.2126,0.7152,0.0722));\nfinalAlpha=saturate(finalAlpha+luminanceOverAlpha*luminanceOverAlpha);\nreturn vec4<f32>(color,finalAlpha);`\n : `return vec4<f32>(color,alpha*material.materialAlpha);`;\n\n const doubleSidedEntry = _hasDoubleSided\n ? `@fragment fn main(input: FragmentInput, @builtin(front_facing) frontFacing: bool)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`\n : `@fragment fn main(input: FragmentInput)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`;\n const doubleSidedFlip = _hasDoubleSided ? `if (!frontFacing) { N = -N; }` : \"\";\n\n const lightDecls = _hasMultiLight ? _multiLightWGSL : _hasSingleLight ? _singleLightWGSL : \"\";\n const lightBindingDecl = _hasSingleLight || _hasMultiLight ? `@group(0) @binding(1) var<uniform> lights: lightsUniforms;` : \"\";\n const meshLightIndexHelper = _hasSingleLight || _hasMultiLight ? meshLightIndexWGSL(\"mesh\") : \"\";\n\n const anisoBrdfBlock = _hasAnisotropy ? _anisoBrdfFunctions : \"\";\n\n const fragmentHelpers = _ext?.fragmentHelpers ?? \"\";\n const fragmentPrelude = _ext?.fragmentPrelude ?? \"\";\n const baseColorUV = _ext?.uvForBaseColor ?? \"input.uv\";\n const ormUV = _ext?.uvForOrm ?? \"input.uv\";\n\n const _fragmentTemplate = `/*SU*/\n${_esmShadowOutput ? \"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }\" : \"\"}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n/*HF*/\n/*FB*/\n/*FI*/\n${BRDF_FUNCTIONS}\n${acesBlock}\n${anisoBrdfBlock}\n${lightDecls}\n${lightBindingDecl}\n${meshLightIndexHelper}\n${fragmentHelpers}\n${doubleSidedEntry}\n${fragmentPrelude}/*SV*/\nlet baseColorSample=textureSample(baseColorTexture,baseColorSampler,${baseColorUV});\n${baseColorDecode}\nlet orm=textureSample(ormTexture,ormSampler,${ormUV}).rgb;\n${occlusionDefault}\n${roughnessMetallic}\n${emissiveDefault}\n/*AT*/\n${_noColorOutput ? \"return;\" : _esmShadowOutput ? _esmShadowDepthCode : \"\"}\n${normalBlock}\n${doubleSidedFlip}\n${anisotropyTBBlock}\n/*AC*/\nlet V=normalize(scene.vEyePosition.xyz-input.worldPos);\nlet NdotVUnclamped=dot(N,V);\nlet NdotV=abs(NdotVUnclamped)+0.0000001;\n${f0Default}\n/*MF*/\nvar alphaG=roughness*roughness+0.0005;\n${specularAABlock}\n${directLightBlock}\nvar color=directDiffuse+directSpecular+emissive;\n/*AI*/\n/*NI*/\n${tonemapBlock}\ncolor=pow(color,vec3<f32>(1.0/2.2));\ncolor=clamp(color,vec3<f32>(0.0),vec3<f32>(1.0));\nlet highContrast=color*color*(3.0-2.0*color);\nif(scene.vImageInfos.y<1.0){color=mix(vec3<f32>(0.5),color,scene.vImageInfos.y);}\nelse{color=mix(color,highContrast,scene.vImageInfos.y-1.0);}\ncolor=max(color,vec3<f32>(0.0));\n/*BC*/\n${alphaBlock}\n}`;\n\n return {\n _vertexTemplate,\n _fragmentTemplate,\n _baseMeshUboFields,\n _baseMaterialUboFields,\n _baseVertexAttributes,\n _baseVaryings,\n _baseBindings,\n };\n}\n","/** PBR shader composer factory — extracts the per-feature-set shader composition\n * from pbr-renderable.ts. All dynamic dependencies (ACES, anisotropy, shadow,\n * multi-light, template-ext, thin-instance) are passed in via a deps object,\n * already resolved by the caller. Nothing is snapshotted at module load. */\n\nimport type { ShaderFragment, ComposedShader } from \"../../shader/fragment-types.js\";\nimport type { PbrShadowLightSlot } from \"./fragments/pbr-shadow-fragment.js\";\nimport { composeShader } from \"../../shader/shader-composer.js\";\nimport { createPbrTemplate } from \"./pbr-template.js\";\nimport type { MeshVbLayout } from \"../../mesh/mesh.js\";\nimport {\n PBR_HAS_NORMAL_MAP,\n PBR_HAS_ALPHA_BLEND,\n PBR2_HAS_UV_TRANSFORM,\n PBR2_HAS_REFLECTANCE_FACTORS,\n PBR2_HAS_UV2,\n PBR2_HAS_BASE_COLOR_FACTOR,\n PBR_HAS_METALLIC_REFLECTANCE_MAP,\n PBR_HAS_REFLECTANCE_MAP,\n PBR_HAS_SPECULAR_AA,\n PBR_HAS_EMISSIVE_COLOR,\n PBR_HAS_GAMMA_ALBEDO,\n PBR_HAS_ANISOTROPY,\n PBR_HAS_DOUBLE_SIDED,\n PBR_HAS_EMISSIVE,\n PBR_HAS_ENV,\n PBR_HAS_TONEMAP,\n PBR_HAS_SPEC_GLOSS,\n PBR_HAS_OCCLUSION,\n PBR_HAS_SKYBOX,\n PBR2_ESM_SHADOW_OUTPUT,\n PBR2_NO_COLOR_OUTPUT,\n} from \"./pbr-flag-bits.js\";\nimport { _getPbrExts, type _PbrFragCtx } from \"./pbr-flags.js\";\nimport {\n MSH_HAS_TANGENTS,\n MSH_HAS_MORPH_TARGETS,\n MSH_RECEIVE_SHADOWS,\n MSH_HAS_THIN_INSTANCES,\n MSH_HAS_INSTANCE_COLOR,\n MSH_HAS_VERTEX_COLOR,\n MSH_HAS_UV2,\n} from \"../mesh-features.js\";\n\ninterface PbrComposerDeps {\n readonly _singleLightWGSL: string;\n readonly _getSingleLightBlock: ((type: string) => string) | null;\n readonly _multiLightWGSL: string;\n readonly _multiLightLoop: string;\n readonly _acesHelpers: string;\n readonly _acesTonemapCall: string;\n readonly _createPbrTemplateExt: typeof import(\"./pbr-template-ext.js\").createPbrTemplateExt | null;\n readonly _anisoExt: typeof import(\"./fragments/anisotropy-fragment.js\") | null;\n readonly _iblSkyboxCalc: string;\n readonly _createPbrShadowFragment: ((slots: PbrShadowLightSlot[]) => ShaderFragment) | null;\n readonly _shadowLights: readonly { readonly lightIndex: number; readonly shadowType: import(\"./fragments/pbr-shadow-fragment.js\").PbrShadowLightSlot[\"shadowType\"] }[];\n readonly _createThinInstanceFragment: ((hasColor: boolean) => ShaderFragment) | null;\n}\n\nexport type PbrLightMode = 0 | 1 | 2;\ntype PbrComposeFn = (\n _features: number,\n _features2?: number,\n _meshFeatures?: number,\n _sceneFeatures?: number,\n _lightMode?: PbrLightMode,\n _singleLightType?: string,\n _esmShadowDepthCode?: string,\n _vbStrides?: MeshVbLayout,\n _vbKey?: string\n) => ComposedShader;\n\n/** Create a memoized shader composer for a given scene's resolved PBR deps. */\nexport function createPbrComposer(deps: PbrComposerDeps): PbrComposeFn {\n const cache = new Map<string, ComposedShader>();\n const {\n _singleLightWGSL,\n _getSingleLightBlock,\n _multiLightWGSL,\n _multiLightLoop,\n _acesHelpers,\n _acesTonemapCall,\n _createPbrTemplateExt,\n _anisoExt,\n _iblSkyboxCalc,\n _createPbrShadowFragment,\n _shadowLights,\n _createThinInstanceFragment,\n } = deps;\n\n return function composePbr(\n features: number,\n features2: number = 0,\n meshFeatures = 0,\n sceneFeatures = 0,\n lightMode: PbrLightMode = 0,\n singleLightType = \"\",\n _esmShadowDepthCode = \"\",\n vbStrides?: MeshVbLayout,\n vbKey = \"\"\n ): ComposedShader {\n const ckey = `${features}:${features2}:${meshFeatures}:${sceneFeatures}:${lightMode}:${singleLightType}${vbKey}`;\n const cached = cache.get(ckey);\n if (cached) {\n return cached;\n }\n\n const has = (bit: number) => (features & bit) !== 0;\n const hasMesh = (bit: number) => (meshFeatures & bit) !== 0;\n const hasScene = (bit: number) => (sceneFeatures & bit) !== 0;\n const hasNormal = has(PBR_HAS_NORMAL_MAP) && hasMesh(MSH_HAS_TANGENTS);\n const hasCotangent = has(PBR_HAS_NORMAL_MAP) && !hasMesh(MSH_HAS_TANGENTS);\n const _hasAnyNormal = hasNormal || hasCotangent;\n const _hasReflectanceExt = has(PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP) || (features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;\n const _hasIbl = hasScene(PBR_HAS_ENV);\n const _hasMorph = hasMesh(MSH_HAS_MORPH_TARGETS);\n const hasShadow = hasMesh(MSH_RECEIVE_SHADOWS);\n const _hasAnisotropy = has(PBR_HAS_ANISOTROPY);\n const _hasEmissiveColor = has(PBR_HAS_EMISSIVE_COLOR);\n const _hasEmissiveTexture = has(PBR_HAS_EMISSIVE);\n const hasTI = hasMesh(MSH_HAS_THIN_INSTANCES);\n\n const _hasUvTransform = (features2 & PBR2_HAS_UV_TRANSFORM) !== 0;\n const _hasVertexColor = hasMesh(MSH_HAS_VERTEX_COLOR);\n const _hasUv2 = (features2 & PBR2_HAS_UV2) !== 0 && hasMesh(MSH_HAS_UV2);\n const needsExt = _hasUvTransform || _hasVertexColor || _hasUv2;\n const _hasSpecularAA = has(PBR_HAS_SPECULAR_AA);\n const _ext =\n needsExt && _createPbrTemplateExt\n ? _createPbrTemplateExt({\n _hasUvTransform,\n _hasVertexColor,\n _hasUv2,\n _hasOcclusionUv2: _hasUv2,\n _hasAnyNormal,\n _hasEmissiveTexture,\n _hasSpecGloss: has(PBR_HAS_SPEC_GLOSS),\n })\n : undefined;\n\n const template = createPbrTemplate({\n _hasSingleLight: lightMode === 1,\n _hasMultiLight: lightMode === 2,\n _singleLightWGSL,\n _singleLightBlock: lightMode === 1 && _getSingleLightBlock ? _getSingleLightBlock(singleLightType) : \"\",\n _multiLightWGSL,\n _multiLightLoop,\n _normalMode: hasNormal ? \"tangent\" : hasCotangent ? \"cotangent\" : \"none\",\n _hasEmissiveTexture,\n _hasSpecGloss: has(PBR_HAS_SPEC_GLOSS),\n _hasDoubleSided: has(PBR_HAS_DOUBLE_SIDED),\n _hasTonemap: hasScene(PBR_HAS_TONEMAP),\n _acesHelpers: _acesHelpers,\n _acesTonemapCall: _acesTonemapCall,\n _hasAlphaBlend: has(PBR_HAS_ALPHA_BLEND),\n _hasSpecularAA,\n _hasGammaAlbedo: has(PBR_HAS_GAMMA_ALBEDO),\n _hasBaseColorFactor: (features2 & PBR2_HAS_BASE_COLOR_FACTOR) !== 0,\n _hasMorph,\n _hasOcclusion: has(PBR_HAS_OCCLUSION) && !_hasReflectanceExt,\n _hasEmissiveColor,\n _hasReflectanceExt,\n _hasIbl,\n _hasAnisotropy,\n _anisoBrdfFunctions: _hasAnisotropy && _anisoExt ? _anisoExt.ANISO_BRDF_FUNCTIONS : \"\",\n _anisoTBBlock: _hasAnisotropy && _anisoExt ? _anisoExt.makeAnisotropyTBBlock(hasNormal) : \"\",\n _ext,\n _noColorOutput: (features2 & PBR2_NO_COLOR_OUTPUT) !== 0,\n _esmShadowOutput: (features2 & PBR2_ESM_SHADOW_OUTPUT) !== 0,\n _esmShadowDepthCode,\n _vbStrides: vbStrides,\n });\n\n const frags: ShaderFragment[] = [];\n const fragCtx: _PbrFragCtx = {\n _features: features,\n _features2: features2,\n _meshFeatures: meshFeatures,\n _hasIbl: _hasIbl,\n _hasAnyNormal,\n _hasSpecularAA,\n _anisoBentNormalCode: _hasAnisotropy && _anisoExt ? _anisoExt.ANISO_BENT_NORMAL : \"\",\n _iblSkyboxCalc: has(PBR_HAS_SKYBOX) ? _iblSkyboxCalc : \"\",\n };\n // Registration order defines iteration order; callers register in composer-matching order.\n for (const regExt of _getPbrExts().values()) {\n if (regExt.frag) {\n const fr = regExt.frag(fragCtx);\n if (fr) {\n frags.push(fr);\n }\n }\n }\n if (hasShadow && _createPbrShadowFragment) {\n const slots = _shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));\n frags.push(_createPbrShadowFragment(slots));\n }\n if (hasTI && _createThinInstanceFragment) {\n frags.push(_createThinInstanceFragment(hasMesh(MSH_HAS_INSTANCE_COLOR)));\n }\n\n const composed = composeShader(template, frags);\n cache.set(ckey, composed);\n return composed;\n };\n}\n","/** PBR mesh renderable — builds Renderables from glTF PBR meshes + environment.\n *\n * `buildPbrRenderables` does shared per-scene setup (extension/fragment imports,\n * shader composer, scene bind group, multi-light UBO), then delegates per-mesh\n * work to `buildSinglePbrRenderable`. Both initial build and material-swap\n * rebuilds go through the same single-mesh function. */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { PbrMaterialProps } from \"./pbr-material.js\";\nimport { collectPbrBoundTextures } from \"./pbr-material.js\";\nimport type { EnvironmentTextures } from \"../../loader-env/load-env.js\";\n\nimport type { Renderable, MeshGroupBuildResult } from \"../../render/renderable.js\";\nimport type { ShaderFragment } from \"../../shader/fragment-types.js\";\nimport { acquireTexture, releaseTexture, clearSamplerCache } from \"../../resource/gpu-pool.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getOrCreatePbrBindings, getOrCreatePbrPipeline, createPbrMeshBindGroup, clearPbrPipelineCache } from \"./pbr-pipeline.js\";\nimport {\n _registerPbrExt,\n _getPbrExts,\n PBR_HAS_NORMAL_MAP,\n PBR_HAS_ALPHA_BLEND,\n PBR2_NO_COLOR_OUTPUT,\n PBR2_HAS_REFRACTION,\n PBR2_HAS_UV2,\n PBR_HAS_ENV,\n PBR_HAS_TONEMAP,\n PBR2_ESM_SHADOW_OUTPUT,\n} from \"./pbr-flags.js\";\nimport type { PbrExt } from \"./pbr-flags.js\";\nimport { createPbrComposer } from \"./pbr-compose.js\";\nimport { _computePbrMaterialFeatures } from \"./pbr-material.js\";\nimport type { ShadowGenerator } from \"../../shadow/shadow-generator.js\";\nimport type { ThinInstanceData } from \"../../mesh/thin-instance.js\";\nimport type { PbrShadowLightSlot } from \"./fragments/pbr-shadow-fragment.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { PbrLightMode } from \"./pbr-compose.js\";\nimport type { Material, MaterialRenderFeatures } from \"../material.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_HAS_UV2, MSH_HAS_VERTEX_COLOR } from \"../mesh-features.js\";\n\ntype SingleLightType = \"hemispheric\" | \"directional\" | \"spot\" | \"point\";\ninterface SingleLightWgslModule {\n SINGLE_LIGHT_STRUCTS: string;\n getSingleLightBlock(): string;\n}\n\n/** Build PBR Renderable(s) + a SceneUniformUpdater from PBR meshes. */\nexport async function buildPbrRenderables(scene: SceneContext, meshes: Mesh[], envTextures: EnvironmentTextures | undefined): Promise<MeshGroupBuildResult> {\n const engine = scene.engine;\n const device = engine._device;\n // Per-size scratch buffers for material UBO re-writes (zero allocation per frame).\n const materialScratch = new Map<number, Float32Array>();\n const hasEnv = !!envTextures;\n const shadowLights: { lightIndex: number; shadowType: \"esm\" | \"pcf\"; gen: ShadowGenerator }[] = [];\n for (let i = 0; i < scene.lights.length; i++) {\n const sg = scene.lights[i]!.shadowGenerator;\n if (sg) {\n shadowLights.push({ lightIndex: i, shadowType: sg._shadowType, gen: sg });\n }\n }\n const hasSomeShadows = shadowLights.length > 0;\n let hasAnyAffectedLight = false;\n let needsSingleLightPath = false;\n let needsMultiLightPath = false;\n const singleLightTypes: SingleLightType[] = [];\n for (const mesh of meshes) {\n const lr = writeMeshLightSelection(mesh, scene.lights);\n const affectedCount = lr > 0 ? 1 : -lr;\n hasAnyAffectedLight ||= affectedCount > 0;\n if (affectedCount === 1 && !(mesh.receiveShadows && hasSomeShadows)) {\n needsSingleLightPath = true;\n const type = getPackedSingleLightType(scene.lights, lr - 1);\n if (!singleLightTypes.includes(type)) {\n singleLightTypes.push(type);\n }\n } else if (affectedCount > 0) {\n needsMultiLightPath = true;\n }\n }\n\n // ── Single O(N) scan over meshes for all scene-wide feature flags ──\n // Flags are plain locals (not an object return) so terser can mangle their names.\n // Replaces ~11 sequential meshes.some() loops (was O(11N)).\n let hasSkybox = false;\n let hasMetallicReflectance = false;\n let hasClearcoat = false;\n let hasSheen = false;\n let hasIridescence = false;\n let hasAnyAnisotropy = false;\n let hasAnySubsurface = false;\n let hasAlphaTest = false;\n let hasTransmissionRefraction = false;\n let needsEmissiveColor = false;\n let hasSomeSkeletons = false;\n let hasSomeMorphs = false;\n let hasSomeThinInstances = false;\n let hasAnyUnlit = false;\n let hasAnyUvTransform = false;\n let hasAnyUv2 = false;\n let hasAnyVertexColor = false;\n for (let i = 0; i < meshes.length; i++) {\n const m = meshes[i]!;\n const mat = m.material as PbrMaterialProps & { _hasReflExt?: boolean; _hasUvTx?: boolean };\n const refractionIntensity = mat.subsurface?.refraction?.intensity ?? 0;\n hasSkybox ||= !!mat.skyboxMode;\n hasMetallicReflectance ||= !!(mat.metallicReflectanceTexture || mat.reflectanceTexture || mat._hasReflExt);\n hasClearcoat ||= !!mat.clearCoat?.isEnabled;\n hasSheen ||= !!mat.sheen?.isEnabled;\n hasIridescence ||= !!mat.iridescence?.isEnabled;\n hasAnyAnisotropy ||= !!mat.anisotropy?.isEnabled;\n hasAnySubsurface ||= !!mat.subsurface?.translucency;\n hasAlphaTest ||= mat.alphaCutOff! > 0;\n hasTransmissionRefraction ||= refractionIntensity > 0 && !!mat.transmissive;\n needsEmissiveColor ||= !!mat.emissiveColor;\n hasSomeSkeletons ||= !!m.skeleton;\n hasSomeMorphs ||= !!m.morphTargets;\n hasSomeThinInstances ||= !!m.thinInstances;\n hasAnyUnlit ||= !!mat.unlit;\n hasAnyUvTransform ||= !!mat._hasUvTx;\n // UV2 only counts when occlusion samples texcoord 1.\n hasAnyUv2 ||= !!m._gpu.uv2Buffer && mat.occlusionTexCoord === 1;\n hasAnyVertexColor ||= !!m._gpu.colorBuffer;\n }\n\n // ── Dynamically import fragment creators based on scene capabilities ──\n\n // IBL fragment.\n let _iblSkyboxCalc = \"\";\n if (hasEnv) {\n const mod = await import(\"./fragments/ibl-fragment.js\");\n _registerPbrExt(mod.pbrExt);\n if (hasSkybox) {\n // Skybox-mode WGSL is only loaded when at least one mesh in the scene needs it.\n const sky = await import(\"./fragments/ibl-skybox-wgsl.js\");\n _iblSkyboxCalc = sky.IBL_SKYBOX_CALCULATION;\n }\n }\n\n // Light/shadow helpers stay dynamic so single-light and non-shadow bundles stay lean.\n let _createPbrShadowFragment: ((slots: PbrShadowLightSlot[]) => ShaderFragment) | null = null;\n let _singleLightWGSL = \"\";\n let _getSingleLightBlock: ((type: string) => string) | null = null;\n const singleLightBlocks: Partial<Record<SingleLightType, () => string>> = {};\n let _multiLightWGSL = \"\";\n let _multiLightLoop = \"\";\n if (needsSingleLightPath) {\n for (const type of singleLightTypes) {\n const single = await importSingleLightWgsl(type);\n _singleLightWGSL = single.SINGLE_LIGHT_STRUCTS;\n singleLightBlocks[type] = single.getSingleLightBlock;\n }\n _getSingleLightBlock = (type) => singleLightBlocks[toSingleLightType(type)]?.() ?? \"\";\n }\n if (needsMultiLightPath) {\n const wgslMod = await import(\"./fragments/multilight-wgsl.js\");\n _multiLightWGSL = wgslMod.MULTI_LIGHT_STRUCTS() + wgslMod.COMPUTE_PBR_LIGHT;\n _multiLightLoop = wgslMod.getMultiLightLoop();\n }\n if (hasAnyAffectedLight && hasSomeShadows) {\n const shadowMod = await import(\"./fragments/pbr-shadow-fragment.js\");\n _createPbrShadowFragment = shadowMod.createPbrShadowFragment;\n }\n\n // ── Per-mesh fragment creators (imported if any mesh needs them) ──\n // Each optional PBR fragment module exports a uniform `pbrExt`, so registration\n // collapses to a single data-driven loop over [flag, loader] pairs. The `import()`\n // specifiers stay literal (required for Vite code-splitting) and the shared\n // `_registerPbrExt((await load()).pbrExt)` glue is emitted once instead of per\n // feature, keeping this management layer small as features are added.\n // Registration order is the iteration order consumed by `_getPbrExts().values()`\n // on the hot paths (composePbr, writeMaterialData, collectPbrBoundTextures).\n type PbrExtLoad = () => Promise<{ pbrExt: PbrExt }>;\n const _drainPbrExts = async (loaders: Array<readonly [boolean, PbrExtLoad]>) => {\n for (const [flag, load] of loaders) {\n if (flag) {\n _registerPbrExt((await load()).pbrExt);\n }\n }\n };\n\n await _drainPbrExts([\n [hasAlphaTest, () => import(\"./fragments/alpha-test-fragment.js\")],\n [hasMetallicReflectance, () => import(\"./fragments/reflectance-fragment.js\")],\n [hasClearcoat, () => import(\"./fragments/clearcoat-fragment.js\")],\n [hasSheen, () => import(\"./fragments/sheen-fragment.js\")],\n [hasIridescence, () => import(\"./fragments/iridescence-fragment.js\")],\n [hasAnySubsurface, () => import(\"./fragments/subsurface-fragment.js\")],\n ]);\n if (hasTransmissionRefraction) {\n const mod = await import(\"./pbr-refraction.js\");\n await mod.registerPbrRefraction(scene as SceneContext, engine, _registerPbrExt);\n }\n await _drainPbrExts([\n [needsEmissiveColor, () => import(\"./fragments/emissive-fragment.js\")],\n [hasAnyUnlit, () => import(\"./fragments/unlit-fragment.js\")],\n [hasSomeSkeletons, () => import(\"./fragments/skeleton-fragment.js\")],\n [hasSomeMorphs, () => import(\"./fragments/morph-fragment.js\")],\n [hasAnyUvTransform, () => import(\"./fragments/uv-transform-fragment.js\")],\n ]);\n\n // Anisotropy needs its module reference retained (for ANISO_BRDF_FUNCTIONS /\n // makeAnisotropyTBBlock / ANISO_DIRECT_DG / ANISO_BENT_NORMAL strings consumed\n // by the template below), so it keeps the full module binding.\n let _anisoExt: typeof import(\"./fragments/anisotropy-fragment.js\") | null = null;\n if (hasAnyAnisotropy) {\n _anisoExt = await import(\"./fragments/anisotropy-fragment.js\");\n _registerPbrExt(_anisoExt.pbrExt);\n }\n\n // Lazy-load pbr-template-ext when any advanced features are present.\n // Scene1 has none of these, so it won't pay the ~1.5KB cost.\n let _createPbrTemplateExt: typeof import(\"./pbr-template-ext.js\").createPbrTemplateExt | null = null;\n if (hasAnyUvTransform || hasAnyVertexColor || hasAnyUv2) {\n const extMod = await import(\"./pbr-template-ext.js\");\n _createPbrTemplateExt = extMod.createPbrTemplateExt;\n }\n\n let _createThinInstanceFragment: ((hasColor: boolean) => ShaderFragment) | null = null;\n let _syncThinInstanceBuffers:\n | ((engine: EngineContext, ti: ThinInstanceData, pass: GPURenderPassEncoder | GPURenderBundleEncoder, slot: number, hasColor: boolean) => number)\n | null = null;\n if (hasSomeThinInstances) {\n const mod = await import(\"../../shader/fragments/thin-instance-fragment.js\");\n _createThinInstanceFragment = mod.createThinInstanceFragment;\n const gpuMod = await import(\"../../mesh/thin-instance-gpu.js\");\n _syncThinInstanceBuffers = gpuMod.syncThinInstanceBuffers;\n }\n\n // ACES tonemap WGSL is dynamically imported only when requested (keeps standard-tonemap bundles lean).\n // Must be loaded before the composer is created so deps are fully resolved.\n let _acesHelpers = \"\";\n let _acesTonemapCall = \"\";\n const hasTonemap = scene.imageProcessing.toneMappingEnabled;\n if (hasTonemap && scene.imageProcessing.toneMappingType === \"aces\") {\n const acesMod = await import(\"./pbr-aces-wgsl.js\");\n _acesHelpers = acesMod.ACES_HELPERS_WGSL;\n _acesTonemapCall = acesMod.ACES_TONEMAP_CALL_WGSL;\n }\n\n const composePbr = createPbrComposer({\n _singleLightWGSL,\n _getSingleLightBlock,\n _multiLightWGSL,\n _multiLightLoop,\n _acesHelpers,\n _acesTonemapCall,\n _createPbrTemplateExt,\n _anisoExt,\n _iblSkyboxCalc,\n _createPbrShadowFragment,\n _shadowLights: shadowLights,\n _createThinInstanceFragment,\n });\n\n const sceneFeatures = (hasEnv ? PBR_HAS_ENV : 0) | (hasTonemap ? PBR_HAS_TONEMAP : 0);\n // Shadow bind group cache — within one scene build, all receiving meshes share the\n // same shadowLights array, so a BG keyed by shadowBGL alone is correct.\n const shadowBGCache = new Map<GPUBindGroupLayout, GPUBindGroup>();\n const syncThinInstanceBuffers = _syncThinInstanceBuffers;\n\n // Closure used both for the initial per-mesh build below AND for later\n // material-swap / per-pass-override rebuilds (set on pbrGroupBuilder._rebuildSingle).\n // Captures the per-scene context — no separate WeakMap needed.\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const materialInput = (materialOverride ?? mesh.material) as PbrMaterialProps;\n const mat = materialInput;\n const renderFeatures = (mat._renderFeatures ??= _computePbrMaterialFeatures(mat)) as MaterialRenderFeatures;\n const isOverride = materialOverride != null;\n const mi = mesh;\n\n const lr = writeMeshLightSelection(mesh, s.lights);\n const lightCount = lr > 0 ? 1 : -lr;\n const features = renderFeatures.features;\n const features2 = renderFeatures.features2 ?? 0;\n const shadowOutput = (features2 & (PBR2_NO_COLOR_OUTPUT | PBR2_ESM_SHADOW_OUTPUT)) !== 0;\n const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;\n const lightMode: PbrLightMode = lightCount === 0 ? 0 : lightCount === 1 && !receiveShadows ? 1 : 2;\n const singleLightType = lightMode === 1 ? getPackedSingleLightType(s.lights, lr - 1) : \"\";\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n const esmShadowDepthCode = (features2 & PBR2_ESM_SHADOW_OUTPUT) !== 0 ? (mat as PbrMaterialProps & { readonly _esmShadowDepthCode: string })._esmShadowDepthCode : \"\";\n\n // Genuine GPU interleaving. Tight meshes have `_vbLayout` undefined → vbKey \"\"\n // → composed shader, bindings, and pipeline cache keys are byte-identical to\n // today. Interleaved meshes carry a precomputed vbKey from the loader module.\n const vbLayout = mi._gpu._vbLayout;\n const vbKey = mi._gpu._vbKey ?? \"\";\n\n const composed = composePbr(features, features2, meshFeatures, sceneFeatures, lightMode, singleLightType, esmShadowDepthCode, vbLayout, vbKey);\n const bindings = getOrCreatePbrBindings(engine, features, features2, meshFeatures, sceneFeatures, composed, `${lightMode}:${singleLightType}${vbKey}`);\n\n // Mesh UBO (world matrix at offset 0; spec.totalBytes covers any extra fields).\n const meshUboData = new Float32Array(composed._meshUboSpec._totalBytes / 4);\n meshUboData.set(mesh.worldMatrix, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n\n // Material UBO.\n const materialSpec = composed._materialUboSpec!;\n const matInitData = new Float32Array(materialSpec._totalBytes / 4);\n writeMaterialData(matInitData, mat, materialSpec);\n const materialUBO = createUniformBuffer(engine, matInitData);\n\n const needsTaskRefraction = !!mat.transmissive && (features2 & PBR2_HAS_REFRACTION) !== 0;\n const materialBindGroupStatic = needsTaskRefraction ? null : createPbrMeshBindGroup(engine, bindings, composed, meshUBO, materialUBO, mat, envTextures ?? null, mesh);\n\n // Shadow bind group (group 2) — shared across receiving meshes via shadowBGCache.\n let shadowBindGroup: GPUBindGroup | null = null;\n const meshShadowLights = receiveShadows ? shadowLights : [];\n if (meshShadowLights.length > 0 && bindings._shadowBGL) {\n let cached = shadowBGCache.get(bindings._shadowBGL);\n if (!cached) {\n const entries: GPUBindGroupEntry[] = [];\n let b = 0;\n for (const sl of meshShadowLights) {\n const sg = sl.gen;\n entries.push({ binding: b++, resource: sg._depthTexture.createView() });\n entries.push({ binding: b++, resource: sg._depthSampler });\n entries.push({ binding: b++, resource: { buffer: sg._shadowUBO } });\n }\n cached = device.createBindGroup({ layout: bindings._shadowBGL, entries });\n shadowBGCache.set(bindings._shadowBGL, cached);\n }\n shadowBindGroup = cached;\n }\n\n const boundTextures = collectPbrBoundTextures(mat);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n s._meshDisposables.set(mesh, [\n () => {\n meshUBO.destroy();\n materialUBO.destroy();\n },\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n const isTransparent = (features2 & (PBR2_NO_COLOR_OUTPUT | PBR2_ESM_SHADOW_OUTPUT)) === 0 && (features & PBR_HAS_ALPHA_BLEND) !== 0;\n const order = mesh.renderOrder ?? (isTransparent || needsTaskRefraction ? 150 : 100);\n\n const hasNormalMap = (features & PBR_HAS_NORMAL_MAP) !== 0;\n const hasUV2 = (features2 & PBR2_HAS_UV2) !== 0 && (meshFeatures & MSH_HAS_UV2) !== 0;\n const hasVertexColor = (meshFeatures & MSH_HAS_VERTEX_COLOR) !== 0;\n const hasTI = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasTIColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n\n let _lastWorldVersion = -1;\n let _lastLightsCount = s.lights.length;\n const sortCenter = isTransparent || needsTaskRefraction ? ([mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number]) : null;\n const update = (): void => {\n const worldVersion = mesh.worldMatrixVersion;\n if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {\n if (sortCenter) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n }\n meshUboData.set(mesh.worldMatrix, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n device.queue.writeBuffer(meshUBO, 0, meshUboData as Float32Array<ArrayBuffer>);\n _lastWorldVersion = worldVersion;\n _lastLightsCount = s.lights.length;\n }\n const uboVersion = mat._uboVersion;\n if (uboVersion !== _lastUboVersion) {\n _lastUboVersion = uboVersion;\n let data = materialScratch.get(materialSpec._totalBytes);\n if (!data) {\n data = new Float32Array(materialSpec._totalBytes / 4);\n materialScratch.set(materialSpec._totalBytes, data);\n } else {\n data.fill(0);\n }\n writeMaterialData(data, mat, materialSpec);\n device.queue.writeBuffer(materialUBO, 0, data.buffer, 0, data.byteLength);\n }\n };\n\n const drawWith = (pass: GPURenderPassEncoder | GPURenderBundleEncoder, materialBindGroup: GPUBindGroup): number => {\n if (!isOverride && mesh.material !== materialInput) {\n return 0;\n }\n const gpu = mi._gpu;\n pass.setBindGroup(1, materialBindGroup);\n if (shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n let slot = 0;\n const vb = gpu._vbLayout;\n pass.setVertexBuffer(slot++, gpu.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, gpu.normalBuffer, vb?._n?._offset);\n if (hasNormalMap && gpu.tangentBuffer) {\n pass.setVertexBuffer(slot++, gpu.tangentBuffer, vb?._t?._offset);\n }\n pass.setVertexBuffer(slot++, gpu.uvBuffer, vb?._u?._offset);\n if (hasUV2 && gpu.uv2Buffer) {\n pass.setVertexBuffer(slot++, gpu.uv2Buffer, vb?._u2?._offset);\n }\n if (hasVertexColor && gpu.colorBuffer) {\n pass.setVertexBuffer(slot++, gpu.colorBuffer, vb?._c?._offset);\n }\n if (mesh.skeleton) {\n pass.setVertexBuffer(slot++, mesh.skeleton.jointsBuffer);\n pass.setVertexBuffer(slot++, mesh.skeleton.weightsBuffer);\n if (mesh.skeleton.joints1Buffer && mesh.skeleton.weights1Buffer) {\n pass.setVertexBuffer(slot++, mesh.skeleton.joints1Buffer);\n pass.setVertexBuffer(slot++, mesh.skeleton.weights1Buffer);\n }\n }\n\n const ti = hasTI ? mesh.thinInstances : null;\n if (ti && syncThinInstanceBuffers) {\n slot = syncThinInstanceBuffers(engine, ti, pass, slot, hasTIColor);\n }\n\n pass.setIndexBuffer(gpu.indexBuffer, gpu.indexFormat);\n if (ti && ti.count > 0) {\n pass.drawIndexed(gpu.indexCount, ti.count);\n } else {\n pass.drawIndexed(gpu.indexCount);\n }\n return 1;\n };\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder): number => drawWith(pass, materialBindGroupStatic!);\n\n const r: Renderable = {\n order,\n isTransparent,\n _transmissive: needsTaskRefraction,\n mesh,\n bind(eng, sig) {\n const pipeline = getOrCreatePbrPipeline(eng as EngineContext, sig, bindings);\n const materialBindGroup = needsTaskRefraction\n ? createPbrMeshBindGroup(engine, bindings, composed, meshUBO, materialUBO, mat, envTextures ?? null, mesh, sig._transmissionTexture)\n : materialBindGroupStatic!;\n return {\n renderable: r,\n pipeline,\n update,\n draw: needsTaskRefraction ? (pass) => drawWith(pass, materialBindGroup) : draw,\n };\n },\n };\n if (sortCenter) {\n r._worldCenter = sortCenter;\n }\n let _lastUboVersion = mat._uboVersion;\n return r;\n };\n\n const renderables = meshes.map((m) => rebuildSingle(scene, m));\n\n scene._disposables.push(\n () => clearPbrPipelineCache(),\n () => clearSamplerCache(engine)\n );\n\n return { renderables, rebuildSingle };\n}\n\nfunction toSingleLightType(type: string): SingleLightType {\n return type === \"hemispheric\" || type === \"directional\" || type === \"spot\" ? type : \"point\";\n}\n\nfunction getPackedSingleLightType(lights: SceneContext[\"lights\"], packedIndex: number): SingleLightType {\n let packed = 0;\n for (const light of lights) {\n if (!light._writeLightUbo) {\n continue;\n }\n if (packed === packedIndex) {\n return toSingleLightType(light.lightType);\n }\n packed++;\n }\n return \"point\";\n}\n\nasync function importSingleLightWgsl(type: SingleLightType): Promise<SingleLightWgslModule> {\n if (type === \"hemispheric\") {\n return import(\"./fragments/singlelight-hemispheric-wgsl.js\");\n }\n if (type === \"directional\") {\n return import(\"./fragments/singlelight-directional-wgsl.js\");\n }\n if (type === \"spot\") {\n return import(\"./fragments/singlelight-spot-wgsl.js\");\n }\n return import(\"./fragments/singlelight-point-wgsl.js\");\n}\n\n/** Write material properties into a pre-allocated Float32Array.\n * Core fields only; per-extension slices are contributed by registered\n * writers. */\nfunction writeMaterialData(data: Float32Array, material: PbrMaterialProps, spec: import(\"../../shader/fragment-types.js\").UboSpec): void {\n data[0] = material.environmentIntensity ?? 1.0;\n data[1] = material.directIntensity ?? 1.0;\n data[2] = material.reflectance ?? 0.04;\n data[3] = material.alpha ?? 1.0;\n const baseColorFactorOffset = spec._offsets.get(\"baseColorFactor\");\n if (baseColorFactorOffset !== undefined) {\n const off = baseColorFactorOffset / 4;\n const factor = material.baseColorFactor;\n data[off] = factor ? factor[0]! : 1.0;\n data[off + 1] = factor ? factor[1]! : 1.0;\n data[off + 2] = factor ? factor[2]! : 1.0;\n data[off + 3] = factor ? factor[3]! : 1.0;\n }\n if (spec._offsets.has(\"metallicFactor\")) {\n const off = spec._offsets.get(\"metallicFactor\")! / 4;\n data[off] = material.metallicFactor ?? 1.0;\n data[off + 1] = material.roughnessFactor ?? 1.0;\n data[off + 2] = material.normalTextureScale ?? 1.0;\n data[off + 3] = material.usePhysicalLightFalloff === false ? 0 : 1;\n }\n for (const ext of _getPbrExts().values()) {\n if (ext.writeUbo) {\n ext.writeUbo(data, material, spec._offsets);\n }\n }\n}\n"],"names":["_a","_b","_c","_d","_e","_f"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-shadow-fragment-LO9SlbJj.js","sources":["../src/material/pbr/fragments/pbr-shadow-fragment.ts"],"sourcesContent":["/**\n * PBR Shadow Fragment — Per-Light Shadow Support\n *\n * Thin wrapper around the shared shadow-fragment-core for PBR materials.\n * Only bundled when a scene uses shadow-receiving PBR meshes.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport { createShadowFragment } from \"../../../shader/fragments/shadow-fragment-core.js\";\nimport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\n\n/** Type alias preserving the existing PBR-specific name. */\nexport type PbrShadowLightSlot = ShadowLightSlot;\n\n/**\n * Create a per-light PBR shadow fragment.\n * Each shadow-casting light gets its own varying, bindings, and sampling code.\n * The shadow factor for each light is stored in shadowFactors[lightIndex].\n */\nexport function createPbrShadowFragment(shadowLights: PbrShadowLightSlot[] = [{ lightIndex: 0, shadowType: \"esm\" }]): ShaderFragment {\n const fragment = createShadowFragment(\"pbr-shadow\", shadowLights);\n const shadowCode = fragment._fragmentSlots?.AD;\n return {\n ...fragment,\n _fragmentSlots: shadowCode ? { AS: shadowCode } : undefined,\n };\n}\n"],"names":[],"mappings":";AAmBO,SAAS,wBAAwB,eAAqC,CAAC,EAAE,YAAY,GAAG,YAAY,MAAA,CAAO,GAAmB;;AACjI,QAAM,WAAW,qBAAqB,cAAc,YAAY;AAChE,QAAM,cAAa,cAAS,mBAAT,mBAAyB;AAC5C,SAAO;AAAA,IACH,GAAG;AAAA,IACH,gBAAgB,aAAa,EAAE,IAAI,eAAe;AAAA,EAAA;AAE1D;"}
|