@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
package/{gaussian-splatting-pipeline-sh-DgJl7l56.js → gaussian-splatting-pipeline-sh-7J31V23x.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { e as U8, T as TU, A as disposeGaussianSplattingMesh, B as BU, a as F32, C as applyGsFragments, x as targetSignatureKey, S as SS, E as CW, z as getSceneBindGroupLayout, H as getRenderTargetSize, I as getViewMatrix, J as getProjectionMatrix, K as getCameraPosition } from "./index-CLElg2Bo.js";
|
|
2
2
|
const SH_TEXTURE_COUNT = [0, 1, 2, 3, 5];
|
|
3
3
|
let _cache = null;
|
|
4
4
|
function buildShShaderSource(shDegree) {
|
|
@@ -274,15 +274,15 @@ function getOrCreateShPipeline(engine, sig, shDegree, fragments) {
|
|
|
274
274
|
}
|
|
275
275
|
const shTextureCount = SH_TEXTURE_COUNT[shDegree];
|
|
276
276
|
const layoutEntries = [
|
|
277
|
-
{ binding: 0, visibility:
|
|
278
|
-
{ binding: 1, visibility:
|
|
279
|
-
{ binding: 2, visibility:
|
|
280
|
-
{ binding: 3, visibility:
|
|
281
|
-
{ binding: 4, visibility:
|
|
282
|
-
{ binding: 5, visibility:
|
|
277
|
+
{ binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: "uniform" } },
|
|
278
|
+
{ binding: 1, visibility: SS.VERTEX, sampler: { type: "non-filtering" } },
|
|
279
|
+
{ binding: 2, visibility: SS.VERTEX, texture: { sampleType: "unfilterable-float" } },
|
|
280
|
+
{ binding: 3, visibility: SS.VERTEX, texture: { sampleType: "unfilterable-float" } },
|
|
281
|
+
{ binding: 4, visibility: SS.VERTEX, texture: { sampleType: "unfilterable-float" } },
|
|
282
|
+
{ binding: 5, visibility: SS.VERTEX, texture: { sampleType: "unfilterable-float" } }
|
|
283
283
|
];
|
|
284
284
|
for (let i = 0; i < shTextureCount; i++) {
|
|
285
|
-
layoutEntries.push({ binding: 6 + i, visibility:
|
|
285
|
+
layoutEntries.push({ binding: 6 + i, visibility: SS.VERTEX, texture: { sampleType: "uint" } });
|
|
286
286
|
}
|
|
287
287
|
const meshBindGroupLayout = device.createBindGroupLayout({ entries: layoutEntries });
|
|
288
288
|
const pipeline = device.createRenderPipeline({
|
|
@@ -305,7 +305,7 @@ function getOrCreateShPipeline(engine, sig, shDegree, fragments) {
|
|
|
305
305
|
color: { srcFactor: "src-alpha", dstFactor: "one-minus-src-alpha", operation: "add" },
|
|
306
306
|
alpha: { srcFactor: "one", dstFactor: "one-minus-src-alpha", operation: "add" }
|
|
307
307
|
},
|
|
308
|
-
writeMask:
|
|
308
|
+
writeMask: CW.ALL
|
|
309
309
|
}
|
|
310
310
|
]
|
|
311
311
|
},
|
|
@@ -322,14 +322,14 @@ function getOrCreateShPipeline(engine, sig, shDegree, fragments) {
|
|
|
322
322
|
return entry;
|
|
323
323
|
}
|
|
324
324
|
function buildGaussianSplattingRenderableSH(scene, mesh, fragments) {
|
|
325
|
-
const engine = scene.engine;
|
|
325
|
+
const engine = scene.surface.engine;
|
|
326
326
|
const device = engine._device;
|
|
327
327
|
const UBO_BYTES = 16 * 4 * 3 + 8 * 4 + 4 * 4;
|
|
328
328
|
const ubo = device.createBuffer({
|
|
329
329
|
size: UBO_BYTES,
|
|
330
|
-
usage:
|
|
330
|
+
usage: BU.UNIFORM | BU.COPY_DST
|
|
331
331
|
});
|
|
332
|
-
const cpu = new
|
|
332
|
+
const cpu = new F32(UBO_BYTES / 4);
|
|
333
333
|
cpu[48 + 4] = mesh.textureWidth;
|
|
334
334
|
cpu[48 + 5] = mesh.textureHeight;
|
|
335
335
|
cpu[48 + 6] = 1;
|
|
@@ -417,9 +417,9 @@ function buildGaussianSplattingRenderableSH(scene, mesh, fragments) {
|
|
|
417
417
|
mesh._canPostToWorker = false;
|
|
418
418
|
mesh._worker.postMessage(
|
|
419
419
|
{
|
|
420
|
-
m: new
|
|
421
|
-
f: new
|
|
422
|
-
c: new
|
|
420
|
+
m: new F32(world),
|
|
421
|
+
f: new F32([cf0, cf1, cf2]),
|
|
422
|
+
c: new F32([camPos.x, camPos.y, camPos.z]),
|
|
423
423
|
d: mesh._depthMix
|
|
424
424
|
},
|
|
425
425
|
[mesh._depthMix.buffer]
|
|
@@ -449,7 +449,7 @@ function buildGaussianSplattingRenderableSH(scene, mesh, fragments) {
|
|
|
449
449
|
return r;
|
|
450
450
|
}
|
|
451
451
|
function attachGaussianSplattingMeshSH(scene, mesh, shFlat, fragments) {
|
|
452
|
-
const engine = scene.engine;
|
|
452
|
+
const engine = scene.surface.engine;
|
|
453
453
|
const device = engine._device;
|
|
454
454
|
const shDegree = mesh.shDegree;
|
|
455
455
|
const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;
|
|
@@ -461,7 +461,7 @@ function attachGaussianSplattingMeshSH(scene, mesh, shFlat, fragments) {
|
|
|
461
461
|
const views = [];
|
|
462
462
|
const vertexCount = mesh.vertexCount;
|
|
463
463
|
for (let t = 0; t < textureCount; t++) {
|
|
464
|
-
const dst = new
|
|
464
|
+
const dst = new U8(width * height * 16);
|
|
465
465
|
const tBase = t * 16;
|
|
466
466
|
const bytesThisTex = Math.min(16, shCoefficientCount - tBase);
|
|
467
467
|
for (let i = 0; i < vertexCount; i++) {
|
|
@@ -474,7 +474,7 @@ function attachGaussianSplattingMeshSH(scene, mesh, shFlat, fragments) {
|
|
|
474
474
|
const tex = device.createTexture({
|
|
475
475
|
size: [width, height],
|
|
476
476
|
format: "rgba32uint",
|
|
477
|
-
usage:
|
|
477
|
+
usage: TU.TEXTURE_BINDING | TU.COPY_DST
|
|
478
478
|
});
|
|
479
479
|
device.queue.writeTexture({ texture: tex }, dst.buffer, { bytesPerRow: width * 16 }, { width, height });
|
|
480
480
|
textures.push(tex);
|
|
@@ -497,4 +497,4 @@ export {
|
|
|
497
497
|
attachGaussianSplattingMeshSH,
|
|
498
498
|
buildGaussianSplattingRenderableSH
|
|
499
499
|
};
|
|
500
|
-
//# sourceMappingURL=gaussian-splatting-pipeline-sh-
|
|
500
|
+
//# sourceMappingURL=gaussian-splatting-pipeline-sh-7J31V23x.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gaussian-splatting-pipeline-sh-7J31V23x.js","sources":["../src/mesh/GaussianSplatting/gaussian-splatting-pipeline-sh.ts"],"sourcesContent":["/** Gaussian-Splatting SH render pipeline + Renderable.\n *\n * Variant of `gaussian-splatting-pipeline.ts` that adds view-dependent SH\n * shading. Loaded *only* by `loadSplat` (and the SOG / SPZ loaders) via a\n * dynamic `import(...)` when the parsed splat asset includes SH coefficients\n * (`mesh.shDegree > 0`), so plain `.ply` / `.splat` scenes (e.g. scene 120)\n * never pull this module's WGSL or runtime cost into their bundle.\n *\n * WGSL source is generated per-shDegree by `buildShShaderSource`: SH textures,\n * byte-to-vec3 unpacking, and the polynomial evaluation in\n * `computeColorFromSHDegree` all expand to the right size — mirrors the\n * `#if SH_DEGREE > N` blocks in BJS `gaussianSplatting.fx`. Pipeline cache is\n * keyed by `(targetSignatureKey, shDegree)`.\n *\n * The UBO grows by 16 bytes vs the base pipeline to carry `eyePosition`\n * (world-space camera position; see `computeSH(dir)` below).\n *\n * ── Why the Y-flip on the SH direction? ─────────────────────────────────\n * BJS sets `mesh.scaling.y *= -1` to fix coordinate-system handedness; Lite\n * pre-flips Y in `splat-data.ts` at parse time so the runtime mesh transform\n * is identity. World-space splat positions agree across both engines, but\n * the BJS world rotation absorbs an extra `diag(1,-1,1)` factor — i.e.\n * worldRot_bjs = worldRot_user · diag(1,-1,1)\n * which means\n * inverse(worldRot_bjs) · v = diag(1,-1,1) · inverse(worldRot_user) · v\n * so Lite reproduces the BJS SH direction by computing\n * `inverseMat3(worldRot) · (worldPos − eye)` and then negating `.y`. */\n\nimport { F32, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU, SS, CW } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene-core.js\";\nimport type { Renderable, DrawBinding } from \"../../render/renderable.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getViewMatrix, getProjectionMatrix, getCameraPosition } from \"../../camera/camera.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { getRenderTargetSize } from \"../../engine/engine.js\";\nimport { disposeGaussianSplattingMesh, type GaussianSplattingMesh, type GsShaderFragment } from \"./gaussian-splatting-mesh.js\";\nimport { applyGsFragments } from \"./gaussian-splatting-pipeline.js\";\n\ninterface PipelineEntry {\n pipeline: GPURenderPipeline;\n meshBindGroupLayout: GPUBindGroupLayout;\n shTextureCount: number;\n}\n\n// shDegree → number of rgba32uint SH textures: 1→1, 2→2, 3→3, 4→5.\nconst SH_TEXTURE_COUNT = [0, 1, 2, 3, 5];\n\nlet _cache: { device: GPUDevice; modules: Map<string, GPUShaderModule>; entries: Map<string, PipelineEntry> } | null = null;\n\n/** Build the WGSL source for a given SH degree (1..4). Mirrors the BJS\n * preprocessor-driven shader structure: declares only the SH textures used\n * by the degree, emits exactly the byte-stream unpacking for that degree,\n * and inlines only the SH polynomial terms up to that degree. */\nfunction buildShShaderSource(shDegree: number): string {\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\n const shCoefficientCount = shVectorCount * 3;\n const textureCount = Math.ceil(shCoefficientCount / 16);\n\n // ── SH texture bindings (6, 7, …) ───────────────────────────────\n let textureBindings = \"\";\n for (let i = 0; i < textureCount; i++) {\n textureBindings += `@group(1) @binding(${6 + i}) var shTexture${i}: texture_2d<u32>;\\n`;\n }\n\n // ── textureLoad calls inside readSplat ──────────────────────────\n let textureLoads = \"\";\n for (let i = 0; i < textureCount; i++) {\n textureLoads += ` let sh${i}_u32 = textureLoad(shTexture${i}, splatUVi32, 0);\\n`;\n }\n\n // ── Unpack the byte stream into sh[1..shVectorCount] vec3 values.\n //\n // Each rgba32uint texel carries 16 bytes (4 u32s × 4 bytes). The bytes\n // are stored in BJS-coefficient order: byte j of splat i is the j-th\n // component of the [R0,G0,B0, R1,G1,B1, …, R(N-1),G(N-1),B(N-1)] sequence.\n // sh[k+1] (k = 0..shVectorCount-1) reads bytes [3k, 3k+1, 3k+2]. `decompose`\n // returns `(byte * 2/255) - 1`, matching BJS exactly.\n let shUnpack = ` var sh: array<vec3<f32>, ${shVectorCount + 1}>;\\n sh[0] = vec3<f32>(0.0);\\n`;\n const byteRef = (j: number): string => {\n // texture index, u32 index within texel (0..3), byte index within u32 (0..3 == x/y/z/w).\n const tex = (j / 16) | 0;\n const u32Idx = ((j % 16) / 4) | 0;\n const byteIdx = j % 4;\n const u32Field = [\"x\", \"y\", \"z\", \"w\"][u32Idx]!;\n const byteField = [\"x\", \"y\", \"z\", \"w\"][byteIdx]!;\n return `decompose(sh${tex}_u32.${u32Field}).${byteField}`;\n };\n for (let k = 0; k < shVectorCount; k++) {\n const j = k * 3;\n shUnpack += ` sh[${k + 1}] = vec3<f32>(${byteRef(j)}, ${byteRef(j + 1)}, ${byteRef(j + 2)});\\n`;\n }\n\n // ── Polynomial evaluation, conditional on shDegree ──────────────\n let shPoly = \" result = sh[0];\\n\";\n if (shDegree >= 1) {\n shPoly += ` result += -SH_C1 * y * sh[1] + SH_C1 * z * sh[2] - SH_C1 * x * sh[3];\\n`;\n }\n if (shDegree >= 2) {\n shPoly += ` result +=\\n SH_C2[0] * xy * sh[4] +\\n SH_C2[1] * yz * sh[5] +\\n SH_C2[2] * (2.0 * zz - xx - yy) * sh[6] +\\n SH_C2[3] * xz * sh[7] +\\n SH_C2[4] * (xx - yy) * sh[8];\\n`;\n }\n if (shDegree >= 3) {\n shPoly += ` result +=\\n SH_C3[0] * y * (3.0 * xx - yy) * sh[9] +\\n SH_C3[1] * xy * z * sh[10] +\\n SH_C3[2] * y * (4.0 * zz - xx - yy) * sh[11] +\\n SH_C3[3] * z * (2.0 * zz - 3.0 * xx - 3.0 * yy) * sh[12] +\\n SH_C3[4] * x * (4.0 * zz - xx - yy) * sh[13] +\\n SH_C3[5] * z * (xx - yy) * sh[14] +\\n SH_C3[6] * x * (xx - 3.0 * yy) * sh[15];\\n`;\n }\n if (shDegree >= 4) {\n shPoly += ` result +=\\n SH_C4[0] * x * y * (xx - yy) * sh[16] +\\n SH_C4[1] * y * z * (3.0 * xx - yy) * sh[17] +\\n SH_C4[2] * x * y * (7.0 * zz - 1.0) * sh[18] +\\n SH_C4[3] * y * z * (7.0 * zz - 3.0) * sh[19] +\\n SH_C4[4] * (zz * (35.0 * zz - 30.0) + 3.0) * sh[20] +\\n SH_C4[5] * x * z * (7.0 * zz - 3.0) * sh[21] +\\n SH_C4[6] * (xx - yy) * (7.0 * zz - 1.0) * sh[22] +\\n SH_C4[7] * x * z * (xx - 3.0 * yy) * sh[23] +\\n SH_C4[8] * (xx * (xx - 3.0 * yy) - yy * (3.0 * xx - yy)) * sh[24];\\n`;\n }\n\n // SH_C2..SH_C4 constants — only declare what's referenced (silences\n // WGSL \"unused array\" warnings on lower degrees).\n let constantsBlock = `const SH_C1: f32 = 0.48860251;\\n`;\n if (shDegree >= 2) {\n constantsBlock += `const SH_C2: array<f32, 5> = array<f32, 5>(1.092548430, -1.09254843, 0.315391565, -1.09254843, 0.546274215);\\n`;\n }\n if (shDegree >= 3) {\n constantsBlock += `const SH_C3: array<f32, 7> = array<f32, 7>(-0.59004358, 2.890611442, -0.45704579, 0.373176332, -0.45704579, 1.445305721, -0.59004358);\\n`;\n }\n if (shDegree >= 4) {\n constantsBlock += `const SH_C4: array<f32, 9> = array<f32, 9>(2.5033429418, -1.7701307698, 0.9461746958, -0.6690465436, 0.1057855469, -0.6690465436, 0.4730873479, -1.7701307698, 0.6258357354);\\n`;\n }\n\n return `// Gaussian Splatting — vertex + fragment WGSL (SH degree ${shDegree}).\n// Generated by buildShShaderSource. Mirrors BJS gaussianSplatting.vertex.fx +\n// gaussianSplatting.fx (SH_DEGREE = ${shDegree}, no compound parts).\nstruct U {\n world: mat4x4<f32>,\n view: mat4x4<f32>,\n projection: mat4x4<f32>,\n viewport: vec2<f32>,\n focal: vec2<f32>,\n dataSize: vec2<f32>,\n alpha: f32,\n _pad0: f32,\n eyePosition: vec3<f32>,\n _pad1: f32,\n};\n@group(1) @binding(0) var<uniform> u: U;\n@group(1) @binding(1) var samp: sampler;\n@group(1) @binding(2) var centersTex: texture_2d<f32>;\n@group(1) @binding(3) var covATex: texture_2d<f32>;\n@group(1) @binding(4) var covBTex: texture_2d<f32>;\n@group(1) @binding(5) var colorsTex: texture_2d<f32>;\n${textureBindings}\n\nstruct VOut {\n @builtin(position) pos: vec4<f32>,\n @location(0) vColor: vec4<f32>,\n @location(1) vPos: vec2<f32>,\n};\n\n${constantsBlock}\n\nfn dataUv(idx: f32) -> vec2<f32> {\n let y = floor(idx / u.dataSize.x);\n let x = idx - y * u.dataSize.x;\n return vec2<f32>((x + 0.5) / u.dataSize.x, (y + 0.5) / u.dataSize.y);\n}\n\nfn dataUvI(idx: f32) -> vec2<i32> {\n let y = floor(idx / u.dataSize.x);\n let x = idx - y * u.dataSize.x;\n return vec2<i32>(i32(x), i32(y));\n}\n\n// Unpack a u32 of 4 packed bytes into (b0 b1 b2 b3) * 2/255 - 1.\nfn decompose(value: u32) -> vec4<f32> {\n let v = vec4<f32>(\n f32((value >> 0u) & 255u),\n f32((value >> 8u) & 255u),\n f32((value >> 16u) & 255u),\n f32((value >> 24u) & 255u));\n return v * vec4<f32>(2.0 / 255.0) - vec4<f32>(1.0);\n}\n\nfn inverseMat3(m: mat3x3<f32>) -> mat3x3<f32> {\n let a00 = m[0][0]; let a01 = m[0][1]; let a02 = m[0][2];\n let a10 = m[1][0]; let a11 = m[1][1]; let a12 = m[1][2];\n let a20 = m[2][0]; let a21 = m[2][1]; let a22 = m[2][2];\n let b01 = a22 * a11 - a12 * a21;\n let b11 = -a22 * a10 + a12 * a20;\n let b21 = a21 * a10 - a11 * a20;\n let det = a00 * b01 + a01 * b11 + a02 * b21;\n return mat3x3<f32>(\n vec3<f32>(b01 / det, (-a22 * a01 + a02 * a21) / det, (a12 * a01 - a02 * a11) / det),\n vec3<f32>(b11 / det, (a22 * a00 - a02 * a20) / det, (-a12 * a00 + a02 * a10) / det),\n vec3<f32>(b21 / det, (-a21 * a00 + a01 * a20) / det, (a11 * a00 - a01 * a10) / det));\n}\n\nfn computeSH(dir: vec3<f32>, splatUVi32: vec2<i32>) -> vec3<f32> {\n${textureLoads}${shUnpack} let x = dir.x;\n let y = dir.y;\n let z = dir.z;\n let xx = x * x; let yy = y * y; let zz = z * z;\n let xy = x * y; let yz = y * z; let xz = x * z;\n var result: vec3<f32>;\n${shPoly} return result;\n}\n\n@vertex\nfn vs(@location(0) corner: vec2<f32>, @location(1) splatIndex: f32) -> VOut {\n var out: VOut;\n let uv = dataUv(splatIndex);\n let splatUVi32 = dataUvI(splatIndex);\n let center = textureSampleLevel(centersTex, samp, uv, 0.0).xyz;\n let color = textureSampleLevel(colorsTex, samp, uv, 0.0);\n let covA = textureSampleLevel(covATex, samp, uv, 0.0).xyz;\n let covB = textureSampleLevel(covBTex, samp, uv, 0.0).xyz;\n\n let worldPos = u.world * vec4<f32>(center, 1.0);\n let modelView = u.view * u.world;\n let camspace = u.view * worldPos;\n let pos2d = u.projection * camspace;\n\n let bounds = 1.2 * pos2d.w;\n if (pos2d.z < 0.0\n || pos2d.x < -bounds || pos2d.x > bounds\n || pos2d.y < -bounds || pos2d.y > bounds) {\n out.pos = vec4<f32>(0.0, 0.0, 2.0, 1.0);\n out.vColor = vec4<f32>(0.0);\n out.vPos = vec2<f32>(0.0);\n return out;\n }\n\n // ── View-dependent SH evaluation ───────────────────────────────────\n let worldRot = mat3x3<f32>(u.world[0].xyz, u.world[1].xyz, u.world[2].xyz);\n let normWorldRot = inverseMat3(worldRot);\n var dir = normalize(normWorldRot * (worldPos.xyz - u.eyePosition));\n // Lite-side Y-flip: compensates for our data-path Y pre-flip vs BJS's\n // mesh.scaling.y *= -1 (see file header for derivation).\n dir.y = -dir.y;\n let shColor = computeSH(dir, splatUVi32);\n\n let Vrk = mat3x3<f32>(\n vec3<f32>(covA.x, covA.y, covA.z),\n vec3<f32>(covA.y, covB.x, covB.y),\n vec3<f32>(covA.z, covB.y, covB.z));\n\n let invZ = 1.0 / camspace.z;\n let invZ2 = invZ * invZ;\n let J = mat3x3<f32>(\n vec3<f32>(u.focal.x * invZ, 0.0, -u.focal.x * camspace.x * invZ2),\n vec3<f32>(0.0, u.focal.y * invZ, -u.focal.y * camspace.y * invZ2),\n vec3<f32>(0.0, 0.0, 0.0));\n\n let mv3 = mat3x3<f32>(modelView[0].xyz, modelView[1].xyz, modelView[2].xyz);\n let T = transpose(mv3) * J;\n var cov2d = transpose(T) * Vrk * T;\n\n let kernelSize: f32 = 0.3;\n cov2d[0][0] += kernelSize;\n cov2d[1][1] += kernelSize;\n\n let mid = (cov2d[0][0] + cov2d[1][1]) * 0.5;\n let dxy = (cov2d[0][0] - cov2d[1][1]) * 0.5;\n let radius = length(vec2<f32>(dxy, cov2d[0][1]));\n let epsilon: f32 = 0.0001;\n let lambda1 = mid + radius + epsilon;\n let lambda2 = mid - radius + epsilon;\n if (lambda2 < 0.0) {\n out.pos = vec4<f32>(0.0, 0.0, 2.0, 1.0);\n out.vColor = vec4<f32>(0.0);\n out.vPos = vec2<f32>(0.0);\n return out;\n }\n\n let diag = normalize(vec2<f32>(cov2d[0][1], lambda1 - cov2d[0][0]));\n let majorAxis = min(sqrt(2.0 * lambda1), 1024.0) * diag;\n let minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2<f32>(diag.y, -diag.x);\n\n let vCenter = pos2d.xy;\n out.pos = vec4<f32>(\n vCenter + (corner.x * majorAxis + corner.y * minorAxis) * pos2d.w / u.viewport,\n pos2d.z, pos2d.w);\n out.vColor = vec4<f32>(color.rgb + shColor, color.a * u.alpha);\n out.vPos = corner;\n return out;\n}\n\n/*GS_FRAGMENT_DEFINITIONS*/\n@fragment\nfn fs(in: VOut) -> @location(0) vec4<f32> {\n /*GS_FRAGMENT_MAIN_BEGIN*/\n let A = -dot(in.vPos, in.vPos);\n if (A < -4.0) { discard; }\n let B = exp(A) * in.vColor.a;\n var finalColor = vec4<f32>(in.vColor.rgb, B);\n /*GS_FRAGMENT_BEFORE_FRAGCOLOR*/\n /*GS_FRAGMENT_MAIN_END*/\n return finalColor;\n}\n`;\n}\n\nfunction getOrCreateShPipeline(engine: EngineContext, sig: RenderTargetSignature, shDegree: number, fragments?: readonly GsShaderFragment[]): PipelineEntry {\n const device = engine._device;\n if (!_cache || _cache.device !== device) {\n _cache = { device, modules: new Map(), entries: new Map() };\n }\n const fragKey = fragments && fragments.length > 0 ? \"|\" + fragments.map((f) => f.id).join(\",\") : \"\";\n let module = _cache.modules.get(shDegree + fragKey);\n if (!module) {\n module = device.createShaderModule({\n code: fragments && fragments.length > 0 ? applyGsFragments(buildShShaderSource(shDegree), fragments) : buildShShaderSource(shDegree),\n });\n _cache.modules.set(shDegree + fragKey, module);\n }\n const key = `${targetSignatureKey(sig)}|sh${shDegree}${fragKey}`;\n let entry = _cache.entries.get(key);\n if (entry) {\n return entry;\n }\n const shTextureCount = SH_TEXTURE_COUNT[shDegree]!;\n const layoutEntries: GPUBindGroupLayoutEntry[] = [\n { binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: SS.VERTEX, sampler: { type: \"non-filtering\" } },\n { binding: 2, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 3, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 4, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 5, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n ];\n for (let i = 0; i < shTextureCount; i++) {\n layoutEntries.push({ binding: 6 + i, visibility: SS.VERTEX, texture: { sampleType: \"uint\" } });\n }\n const meshBindGroupLayout = device.createBindGroupLayout({ entries: layoutEntries });\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), meshBindGroupLayout] }),\n vertex: {\n module,\n entryPoint: \"vs\",\n buffers: [\n { arrayStride: 8, stepMode: \"vertex\", attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }] },\n { arrayStride: 4, stepMode: \"instance\", attributes: [{ shaderLocation: 1, offset: 0, format: \"float32\" }] },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [\n {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n },\n writeMask: CW.ALL,\n },\n ],\n },\n primitive: { topology: \"triangle-list\", cullMode: \"none\" },\n depthStencil: {\n format: sig._depthStencilFormat ?? \"depth24plus-stencil8\",\n depthCompare: sig._depthCompare ?? \"greater-equal\",\n depthWriteEnabled: false,\n },\n multisample: { count: sig._sampleCount },\n });\n entry = { pipeline, meshBindGroupLayout, shTextureCount };\n _cache.entries.set(key, entry);\n return entry;\n}\n\n/** Build the Renderable for a GaussianSplattingMesh with SH coefficients.\n * Mirrors `buildGaussianSplattingRenderable` but adds eyePosition to the UBO\n * and binds the SH textures. */\nexport function buildGaussianSplattingRenderableSH(scene: SceneContext, mesh: GaussianSplattingMesh, fragments?: readonly GsShaderFragment[]): Renderable {\n const engine = scene.surface.engine;\n const device = engine._device;\n\n // 3 mat4 + 8 floats (viewport,focal,dataSize,alpha,pad) + 4 floats (eyePosition + pad) = 240 bytes.\n const UBO_BYTES = 16 * 4 * 3 + 8 * 4 + 4 * 4;\n const ubo = device.createBuffer({\n size: UBO_BYTES,\n usage: BU.UNIFORM | BU.COPY_DST,\n });\n const cpu = new F32(UBO_BYTES / 4);\n\n cpu[48 + 4] = mesh.textureWidth;\n cpu[48 + 5] = mesh.textureHeight;\n cpu[48 + 6] = 1; // alpha\n cpu[48 + 7] = 0; // pad\n\n const bindGroups = new Map<GPURenderPipeline, GPUBindGroup>();\n\n const getBindGroup = (entry: PipelineEntry): GPUBindGroup => {\n let bg = bindGroups.get(entry.pipeline);\n if (bg) {\n return bg;\n }\n const shViews = mesh._gs._shViews ?? [];\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: ubo } },\n { binding: 1, resource: mesh._gs._sampler },\n { binding: 2, resource: mesh._gs._centersView },\n { binding: 3, resource: mesh._gs._covAView },\n { binding: 4, resource: mesh._gs._covBView },\n { binding: 5, resource: mesh._gs._colorsView },\n ];\n for (let i = 0; i < entry.shTextureCount; i++) {\n entries.push({ binding: 6 + i, resource: shViews[i]! });\n }\n bg = device.createBindGroup({ layout: entry.meshBindGroupLayout, entries });\n bindGroups.set(entry.pipeline, bg);\n return bg;\n };\n\n const SORT_EPS = 1e-4;\n\n const update = (): void => {\n const cam = scene.camera;\n if (!cam) {\n return;\n }\n const size = getRenderTargetSize(engine);\n const aspect = size.width / size.height;\n const view = getViewMatrix(cam) as unknown as Float32Array;\n const proj = getProjectionMatrix(cam, aspect) as unknown as Float32Array;\n const world = mesh.worldMatrix as unknown as Float32Array;\n const camPos = getCameraPosition(cam);\n\n cpu.set(world, 0);\n cpu.set(view, 16);\n cpu.set(proj, 32);\n cpu[48] = size.width;\n cpu[48 + 1] = size.height;\n cpu[48 + 2] = size.width * 0.5 * proj[0]!;\n cpu[48 + 3] = size.height * 0.5 * proj[5]!;\n cpu[56] = camPos.x;\n cpu[57] = camPos.y;\n cpu[58] = camPos.z;\n cpu[59] = 0;\n device.queue.writeBuffer(ubo, 0, cpu.buffer, 0, UBO_BYTES);\n\n if (!mesh._canPostToWorker) {\n return;\n }\n\n const cf0 = view[2]!,\n cf1 = view[6]!,\n cf2 = view[10]!;\n\n let dirty = false;\n const lastW = mesh._sortWorldMatrix;\n for (let i = 0; i < 16; i++) {\n if (Math.abs(lastW[i]! - world[i]!) > SORT_EPS) {\n dirty = true;\n break;\n }\n }\n if (!dirty) {\n const lastCf = mesh._sortCameraForward;\n if (Math.abs(lastCf[0]! - cf0) > SORT_EPS || Math.abs(lastCf[1]! - cf1) > SORT_EPS || Math.abs(lastCf[2]! - cf2) > SORT_EPS) {\n dirty = true;\n }\n }\n if (!dirty) {\n const lastCp = mesh._sortCameraPosition;\n if (Math.abs(lastCp[0]! - camPos.x) > SORT_EPS || Math.abs(lastCp[1]! - camPos.y) > SORT_EPS || Math.abs(lastCp[2]! - camPos.z) > SORT_EPS) {\n dirty = true;\n }\n }\n if (!dirty) {\n return;\n }\n\n mesh._sortWorldMatrix.set(world);\n mesh._sortCameraForward[0] = cf0;\n mesh._sortCameraForward[1] = cf1;\n mesh._sortCameraForward[2] = cf2;\n mesh._sortCameraPosition[0] = camPos.x;\n mesh._sortCameraPosition[1] = camPos.y;\n mesh._sortCameraPosition[2] = camPos.z;\n mesh._canPostToWorker = false;\n mesh._worker.postMessage(\n {\n m: new F32(world),\n f: new F32([cf0, cf1, cf2]),\n c: new F32([camPos.x, camPos.y, camPos.z]),\n d: mesh._depthMix,\n },\n [mesh._depthMix.buffer]\n );\n };\n\n const r: Renderable = {\n order: 200,\n isTransparent: true,\n bind(eng: EngineContext, sig: RenderTargetSignature): DrawBinding {\n const entry = getOrCreateShPipeline(eng as EngineContext, sig, mesh.shDegree, fragments);\n const bindGroup = getBindGroup(entry);\n return {\n renderable: r,\n pipeline: entry.pipeline,\n update,\n draw(pass) {\n pass.setBindGroup(1, bindGroup);\n pass.setVertexBuffer(0, mesh._gs._quadBuffer);\n pass.setVertexBuffer(1, mesh._gs._splatIndexBuffer);\n pass.setIndexBuffer(mesh._gs._indexBuffer, \"uint16\");\n pass.drawIndexed(6, mesh.vertexCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n/** SH-aware variant of `attachGaussianSplattingMesh`. Dynamic-imported by\n * `attachParsedSplat` (in `load-splat.ts`) when the parsed asset carries SH\n * coefficients. Reads `mesh.shDegree` (set at mesh construction), creates\n * the `rgba32uint` SH textures (1..5 depending on degree), patches\n * `mesh._gs` in place, and installs the SH renderable. */\nexport function attachGaussianSplattingMeshSH(scene: SceneContext, mesh: GaussianSplattingMesh, shFlat: Uint8Array, fragments?: readonly GsShaderFragment[]): void {\n const engine = scene.surface.engine;\n const device = engine._device;\n const shDegree = mesh.shDegree;\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\n const shCoefficientCount = shVectorCount * 3;\n const textureCount = Math.ceil(shCoefficientCount / 16);\n const width = mesh.textureWidth;\n const height = mesh.textureHeight;\n\n // Pack the flat SH byte stream into N textures of 16 bytes per splat each.\n // splat i's bytes [i*shCC .. i*shCC + shCC] are split across textures\n // [t=0..textureCount-1], each carrying up to 16 bytes at offset i*16.\n const textures: GPUTexture[] = [];\n const views: GPUTextureView[] = [];\n const vertexCount = mesh.vertexCount;\n for (let t = 0; t < textureCount; t++) {\n const dst = new U8(width * height * 16);\n const tBase = t * 16;\n const bytesThisTex = Math.min(16, shCoefficientCount - tBase);\n for (let i = 0; i < vertexCount; i++) {\n const srcOff = i * shCoefficientCount + tBase;\n const dstOff = i * 16;\n for (let b = 0; b < bytesThisTex; b++) {\n dst[dstOff + b] = shFlat[srcOff + b]!;\n }\n }\n const tex = device.createTexture({\n size: [width, height],\n format: \"rgba32uint\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n device.queue.writeTexture({ texture: tex }, dst.buffer, { bytesPerRow: width * 16 }, { width, height });\n textures.push(tex);\n views.push(tex.createView());\n }\n mesh._gs._shTextures = textures;\n mesh._gs._shViews = views;\n\n const ctx = scene as unknown as { _renderables: Renderable[]; _disposables: (() => void)[]; _gsMeshes: GaussianSplattingMesh[] };\n ctx._renderables.push(buildGaussianSplattingRenderableSH(scene, mesh, fragments));\n ctx._gsMeshes.push(mesh);\n ctx._disposables.push(() => {\n const i = ctx._gsMeshes.indexOf(mesh);\n if (i >= 0) {\n ctx._gsMeshes.splice(i, 1);\n }\n disposeGaussianSplattingMesh(mesh);\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { G as GeometryTextureType } from "./index-CLElg2Bo.js";
|
|
2
|
+
const INPUTS = [
|
|
3
|
+
["worldPosition", GeometryTextureType.WORLD_POSITION, "vec3f"],
|
|
4
|
+
["localPosition", GeometryTextureType.LOCAL_POSITION, "vec3f"],
|
|
5
|
+
["worldNormal", GeometryTextureType.WORLD_NORMAL, "vec3f"],
|
|
6
|
+
["viewNormal", GeometryTextureType.VIEW_NORMAL, "vec3f"],
|
|
7
|
+
["reflectivity", GeometryTextureType.REFLECTIVITY, "vec4f"],
|
|
8
|
+
["albedo", GeometryTextureType.ALBEDO, "vec3f"],
|
|
9
|
+
["irradiance", GeometryTextureType.IRRADIANCE, "vec3f"],
|
|
10
|
+
["viewDepth", GeometryTextureType.VIEW_DEPTH, "f32"],
|
|
11
|
+
["normalizedViewDepth", GeometryTextureType.NORMALIZED_VIEW_DEPTH, "f32"],
|
|
12
|
+
["screenspaceDepth", GeometryTextureType.SCREENSPACE_DEPTH, "f32"],
|
|
13
|
+
["linearVelocity", GeometryTextureType.LINEAR_VELOCITY, "vec3f"]
|
|
14
|
+
];
|
|
15
|
+
function geometryInputs(state) {
|
|
16
|
+
if (!state._geometryInputs) {
|
|
17
|
+
state._geometryInputs = /* @__PURE__ */ new Map();
|
|
18
|
+
}
|
|
19
|
+
return state._geometryInputs;
|
|
20
|
+
}
|
|
21
|
+
const emitter = {
|
|
22
|
+
className: "GeometryTextureOutputBlock",
|
|
23
|
+
stage: "fragment",
|
|
24
|
+
emit(block, _outputName, stage, state, ctx) {
|
|
25
|
+
const out = geometryInputs(state);
|
|
26
|
+
for (const [name, type, cast] of INPUTS) {
|
|
27
|
+
const conn = block.inputs.get(name);
|
|
28
|
+
if (conn && conn.source) {
|
|
29
|
+
const value = ctx.cast(ctx.resolve(block, name, stage, state), cast);
|
|
30
|
+
const t = ctx.temp(state, "geom");
|
|
31
|
+
state.fragment.body.push(`let ${t} = ${value.expr};`);
|
|
32
|
+
out.set(type, { expr: t, type: value.type });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { expr: "vec4<f32>(0.0, 0.0, 0.0, 1.0)", type: "vec4f" };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
export {
|
|
39
|
+
emitter
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=geometry-texture-output-dXk4E9uu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry-texture-output-dXk4E9uu.js","sources":["../src/material/node/blocks/geometry-texture-output.ts"],"sourcesContent":["/** GeometryTextureOutputBlock emitter — the geometry-pass fragment terminal.\n *\n * Lite analogue of Babylon.js' `PrePassOutputBlock`. Declares one optional\n * input per {@link GeometryTextureType} (11 total). For every CONNECTED input\n * it resolves + casts the upstream value and stashes the WGSL expression onto\n * `state._geometryInputs`, keyed by the geometry texture type. It never writes\n * `_NME_FRAG_OUTPUT_` — the node pipeline's geometry path (see\n * node-geometry-view.ts / node-pipeline.ts `_mrtOutput`) turns the stashed\n * expressions into the multi-attachment `FragmentOutput` writes, filling any\n * unconnected attachment with the engine default.\n *\n * This block is only ever emitted when the graph is re-walked from this\n * terminal during a geometry-renderer pass; the normal colour pass walks the\n * `FragmentOutputBlock` instead and never touches this code.\n */\n\nimport { GeometryTextureType } from \"../../../frame-graph/geometry-types.js\";\nimport type { BlockEmitter, NodeBuildState, NodeExpr, NodeValueType } from \"../node-types.js\";\n\n/** input name → (geometry texture type, cast target) */\nconst INPUTS: ReadonlyArray<readonly [string, GeometryTextureType, NodeValueType]> = [\n [\"worldPosition\", GeometryTextureType.WORLD_POSITION, \"vec3f\"],\n [\"localPosition\", GeometryTextureType.LOCAL_POSITION, \"vec3f\"],\n [\"worldNormal\", GeometryTextureType.WORLD_NORMAL, \"vec3f\"],\n [\"viewNormal\", GeometryTextureType.VIEW_NORMAL, \"vec3f\"],\n [\"reflectivity\", GeometryTextureType.REFLECTIVITY, \"vec4f\"],\n [\"albedo\", GeometryTextureType.ALBEDO, \"vec3f\"],\n [\"irradiance\", GeometryTextureType.IRRADIANCE, \"vec3f\"],\n [\"viewDepth\", GeometryTextureType.VIEW_DEPTH, \"f32\"],\n [\"normalizedViewDepth\", GeometryTextureType.NORMALIZED_VIEW_DEPTH, \"f32\"],\n [\"screenspaceDepth\", GeometryTextureType.SCREENSPACE_DEPTH, \"f32\"],\n [\"linearVelocity\", GeometryTextureType.LINEAR_VELOCITY, \"vec3f\"],\n];\n\nfunction geometryInputs(state: NodeBuildState): Map<GeometryTextureType, NodeExpr> {\n if (!state._geometryInputs) {\n state._geometryInputs = new Map<GeometryTextureType, NodeExpr>();\n }\n return state._geometryInputs;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"GeometryTextureOutputBlock\",\n stage: \"fragment\",\n emit(block, _outputName, stage, state, ctx) {\n const out = geometryInputs(state);\n for (const [name, type, cast] of INPUTS) {\n const conn = block.inputs.get(name);\n if (conn && conn.source) {\n const value = ctx.cast(ctx.resolve(block, name, stage, state), cast);\n // Stash via an SSA temp so the geometry write site references a\n // single stable identifier rather than re-evaluating the chain.\n const t = ctx.temp(state, \"geom\");\n state.fragment.body.push(`let ${t} = ${value.expr};`);\n out.set(type, { expr: t, type: value.type });\n }\n }\n // Terminal block — the returned value is never consumed.\n return { expr: \"vec4<f32>(0.0, 0.0, 0.0, 1.0)\", type: \"vec4f\" };\n },\n};\n"],"names":[],"mappings":";AAoBA,MAAM,SAA+E;AAAA,EACjF,CAAC,iBAAiB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7D,CAAC,iBAAiB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7D,CAAC,eAAe,oBAAoB,cAAc,OAAO;AAAA,EACzD,CAAC,cAAc,oBAAoB,aAAa,OAAO;AAAA,EACvD,CAAC,gBAAgB,oBAAoB,cAAc,OAAO;AAAA,EAC1D,CAAC,UAAU,oBAAoB,QAAQ,OAAO;AAAA,EAC9C,CAAC,cAAc,oBAAoB,YAAY,OAAO;AAAA,EACtD,CAAC,aAAa,oBAAoB,YAAY,KAAK;AAAA,EACnD,CAAC,uBAAuB,oBAAoB,uBAAuB,KAAK;AAAA,EACxE,CAAC,oBAAoB,oBAAoB,mBAAmB,KAAK;AAAA,EACjE,CAAC,kBAAkB,oBAAoB,iBAAiB,OAAO;AACnE;AAEA,SAAS,eAAe,OAA2D;AAC/E,MAAI,CAAC,MAAM,iBAAiB;AACxB,UAAM,sCAAsB,IAAA;AAAA,EAChC;AACA,SAAO,MAAM;AACjB;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,MAAM,eAAe,KAAK;AAChC,eAAW,CAAC,MAAM,MAAM,IAAI,KAAK,QAAQ;AACrC,YAAM,OAAO,MAAM,OAAO,IAAI,IAAI;AAClC,UAAI,QAAQ,KAAK,QAAQ;AACrB,cAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,MAAM,OAAO,KAAK,GAAG,IAAI;AAGnE,cAAM,IAAI,IAAI,KAAK,OAAO,MAAM;AAChC,cAAM,SAAS,KAAK,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,GAAG;AACpD,YAAI,IAAI,MAAM,EAAE,MAAM,GAAG,MAAM,MAAM,MAAM;AAAA,MAC/C;AAAA,IACJ;AAEA,WAAO,EAAE,MAAM,iCAAiC,MAAM,QAAA;AAAA,EAC1D;AACJ;"}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { G as GeometryTextureType, Q as MATERIAL_ALPHA_BLEND, ah as SPECULAR_USES_UV2, ag as HAS_SPECULAR_TEXTURE, at as _computeMeshFeatures, a as F32, b as writeMeshLightSelection, av as createUniformBuffer, aw as collectStdBoundTextures, ax as acquireTexture, ay as releaseTexture, bF as _getStdExtsSorted, aD as MSH_HAS_THIN_INSTANCES, z as getSceneBindGroupLayout, am as HAS_OPACITY_TEXTURE, aA as NEEDS_UV, bH as HAS_DIFFUSE_TEXTURE, aB as MSH_HAS_INSTANCE_COLOR, x as targetSignatureKey, bJ as DOUBLE_SIDED, aC as NEEDS_UV2, O as createMaterialView, c0 as GEOMETRY_OUTPUT } from "./index-CLElg2Bo.js";
|
|
2
|
+
import { createThinInstanceFragment } from "./thin-instance-fragment-hsv-RyDs.js";
|
|
3
|
+
import { syncThinInstanceBuffers } from "./thin-instance-gpu-BDdRcNAh.js";
|
|
4
|
+
import { d as composeStandardShader, w as writeStdMaterialData } from "./standard-pipeline-XTbHL7MY.js";
|
|
5
|
+
const STAGE_FRAGMENT = 2;
|
|
6
|
+
const STAGE_VERTEX = 1;
|
|
7
|
+
function needsGpUbo(attachments) {
|
|
8
|
+
for (const t of attachments) {
|
|
9
|
+
if (t === GeometryTextureType.NORMALIZED_VIEW_DEPTH || t === GeometryTextureType.LINEAR_VELOCITY) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
function needsVelocity(attachments) {
|
|
16
|
+
return attachments.includes(GeometryTextureType.LINEAR_VELOCITY);
|
|
17
|
+
}
|
|
18
|
+
function needsLocalPos(attachments) {
|
|
19
|
+
return attachments.includes(GeometryTextureType.LOCAL_POSITION);
|
|
20
|
+
}
|
|
21
|
+
function attachmentExpr(type, wg, hasSpecular, specularUv) {
|
|
22
|
+
switch (type) {
|
|
23
|
+
case GeometryTextureType.IRRADIANCE:
|
|
24
|
+
return `vec4<f32>(0.0, 0.0, 0.0, ${wg})`;
|
|
25
|
+
case GeometryTextureType.WORLD_POSITION:
|
|
26
|
+
return `vec4<f32>(input.vp, ${wg})`;
|
|
27
|
+
case GeometryTextureType.LOCAL_POSITION:
|
|
28
|
+
return `vec4<f32>(input.vLocalPos, ${wg})`;
|
|
29
|
+
case GeometryTextureType.REFLECTIVITY:
|
|
30
|
+
return hasSpecular ? `(vec4<f32>(pow(textureSample(sT, sS, ${specularUv}).rgb, vec3<f32>(2.2)), textureSample(sT, sS, ${specularUv}).a) * ${wg})` : `vec4<f32>(pow(mat.sc.rgb, vec3<f32>(2.2)), 1.0) * ${wg}`;
|
|
31
|
+
case GeometryTextureType.VIEW_DEPTH:
|
|
32
|
+
return `vec4<f32>((scene.view * vec4<f32>(input.vp, 1.0)).z, 0.0, 0.0, ${wg})`;
|
|
33
|
+
case GeometryTextureType.NORMALIZED_VIEW_DEPTH:
|
|
34
|
+
return `vec4<f32>(((scene.view * vec4<f32>(input.vp, 1.0)).z - gp.cameraNearFar.x) / (gp.cameraNearFar.y - gp.cameraNearFar.x), 0.0, 0.0, ${wg})`;
|
|
35
|
+
case GeometryTextureType.SCREENSPACE_DEPTH:
|
|
36
|
+
return `vec4<f32>(input.clipPos.z, 0.0, 0.0, ${wg})`;
|
|
37
|
+
case GeometryTextureType.VIEW_NORMAL:
|
|
38
|
+
return `vec4<f32>(normalize((scene.view * vec4<f32>(normalW, 0.0)).xyz), ${wg})`;
|
|
39
|
+
case GeometryTextureType.WORLD_NORMAL:
|
|
40
|
+
return `vec4<f32>(normalW * 0.5 + vec3<f32>(0.5), ${wg})`;
|
|
41
|
+
case GeometryTextureType.ALBEDO:
|
|
42
|
+
return `vec4<f32>(baseColor, ${wg})`;
|
|
43
|
+
case GeometryTextureType.LINEAR_VELOCITY: {
|
|
44
|
+
const cur = `(input.vCurrentClip.xy / input.vCurrentClip.w)`;
|
|
45
|
+
const prev = `(input.vPreviousClip.xy / input.vPreviousClip.w)`;
|
|
46
|
+
return `vec4<f32>(0.5 * (${prev} - ${cur}), 0.0, ${wg})`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function createGeometryParamsFragment(needsParamsUbo, needsVelocityVaryings, needsLocalPosVarying) {
|
|
51
|
+
const bindings = needsParamsUbo ? [{ _name: "gp", _type: { _kind: "uniform-buffer" }, _visibility: STAGE_FRAGMENT | STAGE_VERTEX }] : [];
|
|
52
|
+
const helpers = needsParamsUbo ? `struct gpUniforms { previousViewProjection: mat4x4<f32>, cameraNearFar: vec4<f32>, };` : "";
|
|
53
|
+
const varyings = [];
|
|
54
|
+
if (needsVelocityVaryings) {
|
|
55
|
+
varyings.push({ _name: "vCurrentClip", _type: "vec4<f32>" }, { _name: "vPreviousClip", _type: "vec4<f32>" });
|
|
56
|
+
}
|
|
57
|
+
if (needsLocalPosVarying) {
|
|
58
|
+
varyings.push({ _name: "vLocalPos", _type: "vec3<f32>" });
|
|
59
|
+
}
|
|
60
|
+
const vbParts = [];
|
|
61
|
+
if (needsVelocityVaryings) {
|
|
62
|
+
vbParts.push(`out.vCurrentClip = scene.viewProjection * vec4<f32>(out.vp, 1.0);`);
|
|
63
|
+
vbParts.push(`out.vPreviousClip = gp.previousViewProjection * vec4<f32>(out.vp, 1.0);`);
|
|
64
|
+
}
|
|
65
|
+
if (needsLocalPosVarying) {
|
|
66
|
+
vbParts.push(`out.vLocalPos = position;`);
|
|
67
|
+
}
|
|
68
|
+
const slots = vbParts.length > 0 ? { VB: vbParts.join("\n") } : {};
|
|
69
|
+
return {
|
|
70
|
+
_id: "~geometry-params",
|
|
71
|
+
_bindings: bindings,
|
|
72
|
+
_helperFunctions: helpers,
|
|
73
|
+
// gp UBO is also visible to the vertex stage when present, so the
|
|
74
|
+
// struct declaration must be available there too.
|
|
75
|
+
_vertexHelperFunctions: helpers,
|
|
76
|
+
_varyings: varyings,
|
|
77
|
+
_vertexSlots: slots
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function composeStandardGeometryShader(features, meshFeatures, extFragments, attachments, esmShadowDepthCode = "", emitColor = false) {
|
|
81
|
+
const wantsGp = needsGpUbo(attachments);
|
|
82
|
+
const wantsVelocity = needsVelocity(attachments);
|
|
83
|
+
const wantsLocalPos = needsLocalPos(attachments);
|
|
84
|
+
const fragments = wantsGp || wantsVelocity || wantsLocalPos ? [...extFragments, createGeometryParamsFragment(wantsGp, wantsVelocity, wantsLocalPos)] : extFragments;
|
|
85
|
+
const stdFeatures = features & ~MATERIAL_ALPHA_BLEND;
|
|
86
|
+
const base = composeStandardShader(stdFeatures, meshFeatures, fragments, esmShadowDepthCode);
|
|
87
|
+
const hasSpecular = (features & HAS_SPECULAR_TEXTURE) !== 0;
|
|
88
|
+
const specularUv = (features & SPECULAR_USES_UV2) !== 0 ? "input.vv" : "input.vu";
|
|
89
|
+
const fragmentSignatureFrom = "-> @location(0) vec4<f32>";
|
|
90
|
+
const fragmentSignatureTo = "-> FragmentOutput";
|
|
91
|
+
if (!base._fragmentWGSL.includes(fragmentSignatureFrom)) {
|
|
92
|
+
throw new Error("composeStandardGeometryShader: standard fragment signature mismatch — bypass active?");
|
|
93
|
+
}
|
|
94
|
+
let frag = base._fragmentWGSL.replace(fragmentSignatureFrom, fragmentSignatureTo);
|
|
95
|
+
const colorSlot = attachments.length;
|
|
96
|
+
const extraColorLine = emitColor ? `
|
|
97
|
+
@location(${colorSlot}) color: vec4<f32>,` : "";
|
|
98
|
+
const outputStruct = `struct FragmentOutput {
|
|
99
|
+
${attachments.map((_, i) => `@location(${i}) f${i}: vec4<f32>,`).join("\n")}${extraColorLine}
|
|
100
|
+
};
|
|
101
|
+
`;
|
|
102
|
+
frag = frag.replace("@fragment fn main", `${outputStruct}@fragment fn main`);
|
|
103
|
+
const wg = `select(0.0, 1.0, alpha > 0.4)`;
|
|
104
|
+
const writes = attachments.map((type, i) => `out.f${i} = ${attachmentExpr(type, wg, hasSpecular, specularUv)};`).join("\n");
|
|
105
|
+
const extraColorWrite = emitColor ? `
|
|
106
|
+
out.color = color;` : "";
|
|
107
|
+
const replacement = `var out: FragmentOutput;
|
|
108
|
+
${writes}${extraColorWrite}
|
|
109
|
+
return out;`;
|
|
110
|
+
if (!frag.includes("return color;")) {
|
|
111
|
+
throw new Error("composeStandardGeometryShader: 'return color;' not found in composed fragment — template changed?");
|
|
112
|
+
}
|
|
113
|
+
frag = frag.replace("return color;", replacement);
|
|
114
|
+
return { ...base, _fragmentWGSL: frag };
|
|
115
|
+
}
|
|
116
|
+
const standardGeometryGroupBuilder = (async () => {
|
|
117
|
+
throw new Error("standard-geometry view does not support scene group building");
|
|
118
|
+
});
|
|
119
|
+
standardGeometryGroupBuilder._rebuildSingle = (scene, mesh, materialOverride) => {
|
|
120
|
+
const view = materialOverride ?? mesh.material;
|
|
121
|
+
return buildStandardGeometryRenderable(scene, mesh, view);
|
|
122
|
+
};
|
|
123
|
+
standardGeometryGroupBuilder._materialFamily = "standard";
|
|
124
|
+
function _variantKey(meshFeatures) {
|
|
125
|
+
let k = 0;
|
|
126
|
+
if (meshFeatures & MSH_HAS_THIN_INSTANCES) {
|
|
127
|
+
k |= 1;
|
|
128
|
+
}
|
|
129
|
+
if (meshFeatures & MSH_HAS_INSTANCE_COLOR) {
|
|
130
|
+
k |= 2;
|
|
131
|
+
}
|
|
132
|
+
return k;
|
|
133
|
+
}
|
|
134
|
+
function buildStandardGeometryRenderable(scene, mesh, view) {
|
|
135
|
+
const engine = scene.surface.engine;
|
|
136
|
+
const device = engine._device;
|
|
137
|
+
const source = view.source;
|
|
138
|
+
const meshFeatures = _computeMeshFeatures(mesh, false);
|
|
139
|
+
const variantKey = _variantKey(meshFeatures);
|
|
140
|
+
const res = _ensureViewResources(view, engine, meshFeatures, variantKey);
|
|
141
|
+
const features = res._features;
|
|
142
|
+
const meshUboData = new F32(res._composed._meshUboSpec._totalBytes / 4);
|
|
143
|
+
meshUboData.set(mesh.worldMatrix, 0);
|
|
144
|
+
writeMeshLightSelection(mesh, scene.lights, meshUboData);
|
|
145
|
+
const meshUBO = createUniformBuffer(engine, meshUboData);
|
|
146
|
+
const bg = _createGeometryMeshBindGroup(engine, view, res, mesh, meshUBO);
|
|
147
|
+
const boundTextures = collectStdBoundTextures(source);
|
|
148
|
+
for (const t of boundTextures) {
|
|
149
|
+
acquireTexture(t);
|
|
150
|
+
}
|
|
151
|
+
const prevDisposables = scene._meshDisposables.get(mesh) ?? [];
|
|
152
|
+
scene._meshDisposables.set(mesh, [
|
|
153
|
+
...prevDisposables,
|
|
154
|
+
() => {
|
|
155
|
+
for (const t of boundTextures) {
|
|
156
|
+
releaseTexture(t);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
]);
|
|
160
|
+
let _lastWorldVersion = mesh.worldMatrixVersion;
|
|
161
|
+
let _lastLightsCount = scene.lights.length;
|
|
162
|
+
const needsUV = (features & NEEDS_UV) !== 0;
|
|
163
|
+
const needsUV2 = (features & NEEDS_UV2) !== 0;
|
|
164
|
+
const isAlphaBlend = res._alphaBlend;
|
|
165
|
+
const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;
|
|
166
|
+
const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;
|
|
167
|
+
const sortCenter = [mesh.worldMatrix[12], mesh.worldMatrix[13], mesh.worldMatrix[14]];
|
|
168
|
+
const update = () => {
|
|
169
|
+
if (mesh.worldMatrixVersion !== _lastWorldVersion || scene.lights.length !== _lastLightsCount) {
|
|
170
|
+
sortCenter[0] = mesh.worldMatrix[12];
|
|
171
|
+
sortCenter[1] = mesh.worldMatrix[13];
|
|
172
|
+
sortCenter[2] = mesh.worldMatrix[14];
|
|
173
|
+
meshUboData.set(mesh.worldMatrix, 0);
|
|
174
|
+
writeMeshLightSelection(mesh, scene.lights, meshUboData);
|
|
175
|
+
device.queue.writeBuffer(meshUBO, 0, meshUboData);
|
|
176
|
+
_lastWorldVersion = mesh.worldMatrixVersion;
|
|
177
|
+
_lastLightsCount = scene.lights.length;
|
|
178
|
+
}
|
|
179
|
+
if (source._uboVersion !== res._lastUboVersion) {
|
|
180
|
+
res._lastUboVersion = source._uboVersion;
|
|
181
|
+
const textureLevel = (features & HAS_DIFFUSE_TEXTURE) !== 0 ? 1 : 0;
|
|
182
|
+
res._matData.fill(0);
|
|
183
|
+
writeStdMaterialData(res._matData, source, textureLevel);
|
|
184
|
+
device.queue.writeBuffer(res._matUBO, 0, res._matData.buffer, 0, 96);
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
const draw = (pass) => {
|
|
188
|
+
if (mesh.visible === false) {
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
pass.setBindGroup(1, bg);
|
|
192
|
+
const g = mesh._gpu;
|
|
193
|
+
let slot = 0;
|
|
194
|
+
pass.setVertexBuffer(slot++, g.positionBuffer);
|
|
195
|
+
pass.setVertexBuffer(slot++, g.normalBuffer);
|
|
196
|
+
if (needsUV && g.uvBuffer) {
|
|
197
|
+
pass.setVertexBuffer(slot++, g.uvBuffer);
|
|
198
|
+
}
|
|
199
|
+
if (needsUV2 && g.uv2Buffer) {
|
|
200
|
+
pass.setVertexBuffer(slot++, g.uv2Buffer);
|
|
201
|
+
}
|
|
202
|
+
const ti = hasThinInstances ? mesh.thinInstances : null;
|
|
203
|
+
if (ti) {
|
|
204
|
+
slot = syncThinInstanceBuffers(engine, ti, pass, slot, hasInstanceColor);
|
|
205
|
+
}
|
|
206
|
+
pass.setIndexBuffer(g.indexBuffer, g.indexFormat);
|
|
207
|
+
if (ti && ti.count > 0) {
|
|
208
|
+
pass.drawIndexed(g.indexCount, ti.count);
|
|
209
|
+
} else {
|
|
210
|
+
pass.drawIndexed(g.indexCount);
|
|
211
|
+
}
|
|
212
|
+
return 1;
|
|
213
|
+
};
|
|
214
|
+
const r = {
|
|
215
|
+
order: mesh.renderOrder ?? (isAlphaBlend ? 200 : 100),
|
|
216
|
+
isTransparent: isAlphaBlend,
|
|
217
|
+
mesh,
|
|
218
|
+
bind(eng, sig) {
|
|
219
|
+
return {
|
|
220
|
+
renderable: r,
|
|
221
|
+
pipeline: _getOrCreateGeometryPipeline(eng, sig, view, res),
|
|
222
|
+
update,
|
|
223
|
+
draw
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
r._worldCenter = sortCenter;
|
|
228
|
+
return r;
|
|
229
|
+
}
|
|
230
|
+
function _ensureViewResources(view, engine, meshFeatures, variantKey) {
|
|
231
|
+
var _a, _b;
|
|
232
|
+
let cache = view._geometry;
|
|
233
|
+
if (!cache) {
|
|
234
|
+
cache = /* @__PURE__ */ new Map();
|
|
235
|
+
Object.defineProperty(view, "_geometry", { value: cache, enumerable: false, configurable: true });
|
|
236
|
+
}
|
|
237
|
+
const cached = cache.get(variantKey);
|
|
238
|
+
if (cached) {
|
|
239
|
+
return cached;
|
|
240
|
+
}
|
|
241
|
+
const source = view.source;
|
|
242
|
+
const features = view._renderFeatures.features;
|
|
243
|
+
const sortedExts = _getStdExtsSorted();
|
|
244
|
+
const frags = [];
|
|
245
|
+
const usedExts = [];
|
|
246
|
+
for (const ext of sortedExts) {
|
|
247
|
+
if (features & ext._feature) {
|
|
248
|
+
const f = ext._frag(features);
|
|
249
|
+
if (f) {
|
|
250
|
+
frags.push(f);
|
|
251
|
+
usedExts.push({ _ext: ext });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (meshFeatures & MSH_HAS_THIN_INSTANCES) {
|
|
256
|
+
const hasColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;
|
|
257
|
+
const tiFrag = createThinInstanceFragment(hasColor);
|
|
258
|
+
if (hasColor) {
|
|
259
|
+
const { _fragmentSlots: _drop, ...rest } = tiFrag;
|
|
260
|
+
frags.push({
|
|
261
|
+
...rest,
|
|
262
|
+
_fragmentSlots: {
|
|
263
|
+
BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
} else {
|
|
267
|
+
frags.push(tiFrag);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const composed = composeStandardGeometryShader(features, meshFeatures, frags, view._geometryAttachments, "", view._emitColor);
|
|
271
|
+
const device = engine._device;
|
|
272
|
+
const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);
|
|
273
|
+
const sceneBGL = getSceneBindGroupLayout(engine);
|
|
274
|
+
const pipelineLayout = device.createPipelineLayout({
|
|
275
|
+
bindGroupLayouts: [sceneBGL, meshBGL]
|
|
276
|
+
});
|
|
277
|
+
const vertModule = device.createShaderModule({ code: composed._vertexWGSL });
|
|
278
|
+
const fragModule = device.createShaderModule({ code: composed._fragmentWGSL });
|
|
279
|
+
const alphaBlend = source.alpha < 1 || (features & HAS_OPACITY_TEXTURE) !== 0;
|
|
280
|
+
const matData = new F32(24);
|
|
281
|
+
const textureLevel = (features & HAS_DIFFUSE_TEXTURE) !== 0 ? 1 : 0;
|
|
282
|
+
writeStdMaterialData(matData, source, textureLevel);
|
|
283
|
+
const matUBO = createUniformBuffer(engine, matData);
|
|
284
|
+
let upUBO = null;
|
|
285
|
+
if ((features & NEEDS_UV) !== 0) {
|
|
286
|
+
const uvData = new F32(4);
|
|
287
|
+
let scaleX = 1;
|
|
288
|
+
let scaleY = 1;
|
|
289
|
+
let offsetY = 0;
|
|
290
|
+
if ((features & HAS_DIFFUSE_TEXTURE) !== 0 && source.diffuseTexture) {
|
|
291
|
+
scaleX = source.uvScale[0];
|
|
292
|
+
scaleY = source.uvScale[1];
|
|
293
|
+
if (source.diffuseTexture.invertY) {
|
|
294
|
+
offsetY = scaleY;
|
|
295
|
+
scaleY = -scaleY;
|
|
296
|
+
}
|
|
297
|
+
} else if ((features & HAS_OPACITY_TEXTURE) !== 0 && ((_a = source.opacityTexture) == null ? void 0 : _a.invertY)) {
|
|
298
|
+
offsetY = 1;
|
|
299
|
+
scaleY = -1;
|
|
300
|
+
} else if ((_b = source.bumpTexture) == null ? void 0 : _b.invertY) {
|
|
301
|
+
offsetY = 1;
|
|
302
|
+
scaleY = -1;
|
|
303
|
+
}
|
|
304
|
+
uvData[0] = scaleX;
|
|
305
|
+
uvData[1] = scaleY;
|
|
306
|
+
uvData[2] = 0;
|
|
307
|
+
uvData[3] = offsetY;
|
|
308
|
+
upUBO = createUniformBuffer(engine, uvData);
|
|
309
|
+
}
|
|
310
|
+
const res = {
|
|
311
|
+
_composed: composed,
|
|
312
|
+
_features: features,
|
|
313
|
+
_meshBGL: meshBGL,
|
|
314
|
+
_pipelineLayout: pipelineLayout,
|
|
315
|
+
_vertModule: vertModule,
|
|
316
|
+
_fragModule: fragModule,
|
|
317
|
+
_pipelines: /* @__PURE__ */ new Map(),
|
|
318
|
+
_extFragments: usedExts,
|
|
319
|
+
_alphaBlend: alphaBlend,
|
|
320
|
+
_matUBO: matUBO,
|
|
321
|
+
_matData: matData,
|
|
322
|
+
_lastUboVersion: source._uboVersion,
|
|
323
|
+
_upUBO: upUBO
|
|
324
|
+
};
|
|
325
|
+
cache.set(variantKey, res);
|
|
326
|
+
return res;
|
|
327
|
+
}
|
|
328
|
+
function _createGeometryMeshBindGroup(engine, view, res, _mesh, meshUBO) {
|
|
329
|
+
const source = view.source;
|
|
330
|
+
const features = res._features;
|
|
331
|
+
let nextBinding = 0;
|
|
332
|
+
const entries = [
|
|
333
|
+
{ binding: nextBinding++, resource: { buffer: meshUBO } },
|
|
334
|
+
{ binding: nextBinding++, resource: { buffer: res._matUBO } }
|
|
335
|
+
];
|
|
336
|
+
if ((features & HAS_DIFFUSE_TEXTURE) !== 0 && source.diffuseTexture) {
|
|
337
|
+
const tex = source.diffuseTexture;
|
|
338
|
+
entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });
|
|
339
|
+
}
|
|
340
|
+
if ((features & NEEDS_UV) !== 0 && res._upUBO) {
|
|
341
|
+
entries.push({ binding: nextBinding++, resource: { buffer: res._upUBO } });
|
|
342
|
+
}
|
|
343
|
+
for (const used of res._extFragments) {
|
|
344
|
+
if (used._ext._bind) {
|
|
345
|
+
nextBinding = used._ext._bind(source, entries, nextBinding);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (view._gpUBO) {
|
|
349
|
+
entries.push({ binding: nextBinding++, resource: { buffer: view._gpUBO } });
|
|
350
|
+
}
|
|
351
|
+
return engine._device.createBindGroup({ layout: res._meshBGL, entries });
|
|
352
|
+
}
|
|
353
|
+
function _getOrCreateGeometryPipeline(engine, sig, view, res) {
|
|
354
|
+
const key = targetSignatureKey(sig);
|
|
355
|
+
const cached = res._pipelines.get(key);
|
|
356
|
+
if (cached) {
|
|
357
|
+
return cached;
|
|
358
|
+
}
|
|
359
|
+
const device = engine._device;
|
|
360
|
+
const formats = sig._colorFormats ?? (sig._colorFormat ? [sig._colorFormat] : []);
|
|
361
|
+
if (formats.length === 0) {
|
|
362
|
+
throw new Error("standard-geometry: render target has no color attachments");
|
|
363
|
+
}
|
|
364
|
+
const alphaBlend = res._alphaBlend;
|
|
365
|
+
const blendState = alphaBlend ? {
|
|
366
|
+
color: { srcFactor: "src-alpha", dstFactor: "one-minus-src-alpha", operation: "add" },
|
|
367
|
+
alpha: { srcFactor: "src-alpha", dstFactor: "one-minus-src-alpha", operation: "add" }
|
|
368
|
+
} : void 0;
|
|
369
|
+
const colorTargets = formats.map((fmt) => blendState ? { format: fmt, blend: blendState } : { format: fmt });
|
|
370
|
+
const cullMode = (res._features & DOUBLE_SIDED) !== 0 ? "none" : view._reverseCulling ? "front" : "back";
|
|
371
|
+
const pipeline = device.createRenderPipeline({
|
|
372
|
+
layout: res._pipelineLayout,
|
|
373
|
+
vertex: { module: res._vertModule, entryPoint: "main", buffers: res._composed._vertexBufferLayouts },
|
|
374
|
+
fragment: { module: res._fragModule, entryPoint: "main", targets: colorTargets },
|
|
375
|
+
depthStencil: sig._depthStencilFormat ? {
|
|
376
|
+
format: sig._depthStencilFormat,
|
|
377
|
+
depthCompare: sig._depthCompare ?? "greater-equal",
|
|
378
|
+
// BJS disables depth-write for transparent/opacity meshes in the
|
|
379
|
+
// geometry pass so background depth survives partially-transparent pixels.
|
|
380
|
+
depthWriteEnabled: !alphaBlend
|
|
381
|
+
} : void 0,
|
|
382
|
+
multisample: { count: sig._sampleCount },
|
|
383
|
+
// Geometry MRT renders to offscreen targets, so it needs the same
|
|
384
|
+
// Render upright — front face is always "ccw".
|
|
385
|
+
primitive: { topology: "triangle-list", cullMode, frontFace: "ccw" }
|
|
386
|
+
});
|
|
387
|
+
res._pipelines.set(key, pipeline);
|
|
388
|
+
return pipeline;
|
|
389
|
+
}
|
|
390
|
+
function createStandardGeometryMaterialView(source, config) {
|
|
391
|
+
var _a;
|
|
392
|
+
const baseFeatures = ((_a = source._renderFeatures) == null ? void 0 : _a.features) ?? 0;
|
|
393
|
+
const view = createMaterialView(source, { features: baseFeatures & ~MATERIAL_ALPHA_BLEND | GEOMETRY_OUTPUT });
|
|
394
|
+
Object.defineProperty(view, "_geometryAttachments", { value: config.attachments, enumerable: false });
|
|
395
|
+
Object.defineProperty(view, "_emitColor", { value: config.emitColor, enumerable: false });
|
|
396
|
+
Object.defineProperty(view, "_gpUBO", { value: config.gpUBO ?? null, enumerable: false });
|
|
397
|
+
Object.defineProperty(view, "_reverseCulling", { value: config.reverseCulling ?? false, enumerable: false });
|
|
398
|
+
Object.defineProperty(view, "_buildGroup", { value: standardGeometryGroupBuilder, enumerable: false });
|
|
399
|
+
return view;
|
|
400
|
+
}
|
|
401
|
+
export {
|
|
402
|
+
createStandardGeometryMaterialView
|
|
403
|
+
};
|
|
404
|
+
//# sourceMappingURL=geometry-view-BsFJpBJa.js.map
|