@babylonjs/lite 1.0.0 → 1.0.1
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 → _mat4-storage-f64-BW9sTaVh.js} +2 -2
- package/{_mat4-storage-f64-CjDoht2w.js.map → _mat4-storage-f64-BW9sTaVh.js.map} +1 -1
- package/{alpha-test-fragment-B7DjSnF7.js → alpha-test-fragment-eUG971h3.js} +2 -2
- package/{alpha-test-fragment-B7DjSnF7.js.map → alpha-test-fragment-eUG971h3.js.map} +1 -1
- package/{background-dds-skybox-BEX309u3.js → background-dds-skybox-BwG0kYQP.js} +3 -3
- package/{background-dds-skybox-BEX309u3.js.map → background-dds-skybox-BwG0kYQP.js.map} +1 -1
- package/{background-ground-BU0HOcM4.js → background-ground-DiFpKJzF.js} +2 -2
- package/{background-ground-BU0HOcM4.js.map → background-ground-DiFpKJzF.js.map} +1 -1
- package/{background-hdr-skybox--RRRic_K.js → background-hdr-skybox-DIgJhvfj.js} +3 -3
- package/{background-hdr-skybox--RRRic_K.js.map → background-hdr-skybox-DIgJhvfj.js.map} +1 -1
- package/{background-solid-skybox-BrH2fXSu.js → background-solid-skybox--fqHdan_.js} +2 -2
- package/{background-solid-skybox-BrH2fXSu.js.map → background-solid-skybox--fqHdan_.js.map} +1 -1
- package/{billboard-renderable-BHWryAeC.js → billboard-renderable-HY2XCd52.js} +2 -2
- package/{billboard-renderable-BHWryAeC.js.map → billboard-renderable-HY2XCd52.js.map} +1 -1
- package/{clamp-block-DqbwnQGW.js → clamp-block-XHdUk2Va.js} +2 -2
- package/{clamp-block-DqbwnQGW.js.map → clamp-block-XHdUk2Va.js.map} +1 -1
- package/{clearcoat-fragment-D6FSCie1.js → clearcoat-fragment-CHYw8MPB.js} +2 -2
- package/{clearcoat-fragment-D6FSCie1.js.map → clearcoat-fragment-CHYw8MPB.js.map} +1 -1
- package/{create-skeleton-D_uplboC.js → create-skeleton-9tdiUjRP.js} +2 -2
- package/{create-skeleton-D_uplboC.js.map → create-skeleton-9tdiUjRP.js.map} +1 -1
- package/{cubemap-skybox-material-DQcMMdf-.js → cubemap-skybox-material-DqQ0dyz8.js} +2 -2
- package/{cubemap-skybox-material-DQcMMdf-.js.map → cubemap-skybox-material-DqQ0dyz8.js.map} +1 -1
- package/{curve-block-21rT0JjG.js → curve-block-S27sXrJQ.js} +2 -2
- package/{curve-block-21rT0JjG.js.map → curve-block-S27sXrJQ.js.map} +1 -1
- package/{emissive-fragment-C5FtBs3y.js → emissive-fragment-CZMQ0_bF.js} +2 -2
- package/{emissive-fragment-C5FtBs3y.js.map → emissive-fragment-CZMQ0_bF.js.map} +1 -1
- package/{esm-shadow-view-Gtd1LWRP.js → esm-shadow-view-CUwxbnMR.js} +2 -2
- package/{esm-shadow-view-Gtd1LWRP.js.map → esm-shadow-view-CUwxbnMR.js.map} +1 -1
- package/{esm-shadow-view-c5YV4Eg9.js → esm-shadow-view-Cl36rOrK.js} +2 -2
- package/{esm-shadow-view-c5YV4Eg9.js.map → esm-shadow-view-Cl36rOrK.js.map} +1 -1
- package/{esm-shadow-view-Cl3rPGof.js → esm-shadow-view-DKQ-FSoV.js} +2 -2
- package/{esm-shadow-view-Cl3rPGof.js.map → esm-shadow-view-DKQ-FSoV.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-7J31V23x.js → gaussian-splatting-pipeline-sh-DDo7QQ8l.js} +2 -2
- package/{gaussian-splatting-pipeline-sh-7J31V23x.js.map → gaussian-splatting-pipeline-sh-DDo7QQ8l.js.map} +1 -1
- package/{geometry-texture-output-dXk4E9uu.js → geometry-texture-output-BmuAquio.js} +2 -2
- package/{geometry-texture-output-dXk4E9uu.js.map → geometry-texture-output-BmuAquio.js.map} +1 -1
- package/{geometry-view-BsFJpBJa.js → geometry-view-xWZmq799.js} +4 -4
- package/{geometry-view-BsFJpBJa.js.map → geometry-view-xWZmq799.js.map} +1 -1
- package/{gltf-animation-K_zZxj_d.js → gltf-animation-Bq7k_5HA.js} +2 -2
- package/{gltf-animation-K_zZxj_d.js.map → gltf-animation-Bq7k_5HA.js.map} +1 -1
- package/{gltf-ext-basisu-CDbPclzZ.js → gltf-ext-basisu-C5teqxzQ.js} +2 -202
- package/gltf-ext-basisu-C5teqxzQ.js.map +1 -0
- package/{gltf-ext-node-visibility-DXCJEYr6.js → gltf-ext-node-visibility-DnGTKkMf.js} +2 -2
- package/{gltf-ext-node-visibility-DXCJEYr6.js.map → gltf-ext-node-visibility-DnGTKkMf.js.map} +1 -1
- package/{gltf-ext-quantization-CvHI_0Vg.js → gltf-ext-quantization-DheC7FhB.js} +2 -2
- package/{gltf-ext-quantization-CvHI_0Vg.js.map → gltf-ext-quantization-DheC7FhB.js.map} +1 -1
- package/{gltf-ext-uv-transform-DgYazJBs.js → gltf-ext-uv-transform-DljdVllE.js} +2 -2
- package/{gltf-ext-uv-transform-DgYazJBs.js.map → gltf-ext-uv-transform-DljdVllE.js.map} +1 -1
- package/{gltf-feature-animation-pointer-D1RJRFBw.js → gltf-feature-animation-pointer-DVhymFLK.js} +3 -3
- package/{gltf-feature-animation-pointer-D1RJRFBw.js.map → gltf-feature-animation-pointer-DVhymFLK.js.map} +1 -1
- package/{gltf-feature-animations-Cmc1uoIu.js → gltf-feature-animations-hxC3y3bJ.js} +2 -2
- package/{gltf-feature-animations-Cmc1uoIu.js.map → gltf-feature-animations-hxC3y3bJ.js.map} +1 -1
- package/{gltf-feature-draco-CKKzT5E3.js → gltf-feature-draco-B7Q_cMUv.js} +2 -2
- package/{gltf-feature-draco-CKKzT5E3.js.map → gltf-feature-draco-B7Q_cMUv.js.map} +1 -1
- package/{gltf-feature-gpu-instancing-n87SO6Vh.js → gltf-feature-gpu-instancing-C7sRzWv7.js} +2 -2
- package/{gltf-feature-gpu-instancing-n87SO6Vh.js.map → gltf-feature-gpu-instancing-C7sRzWv7.js.map} +1 -1
- package/{gltf-feature-lights-punctual-Ckm3ciL8.js → gltf-feature-lights-punctual-DF7kya14.js} +5 -5
- package/{gltf-feature-lights-punctual-Ckm3ciL8.js.map → gltf-feature-lights-punctual-DF7kya14.js.map} +1 -1
- package/{gltf-feature-meshopt-DLC4SF1E.js → gltf-feature-meshopt-DRG9hEqT.js} +2 -2
- package/{gltf-feature-meshopt-DLC4SF1E.js.map → gltf-feature-meshopt-DRG9hEqT.js.map} +1 -1
- package/{gltf-feature-morph-Cjtu7hYa.js → gltf-feature-morph-DZydYgWp.js} +3 -3
- package/{gltf-feature-morph-Cjtu7hYa.js.map → gltf-feature-morph-DZydYgWp.js.map} +1 -1
- package/{gltf-feature-registry-C63Hjp9w.js → gltf-feature-registry-DeYdy3DV.js} +15 -15
- package/{gltf-feature-registry-C63Hjp9w.js.map → gltf-feature-registry-DeYdy3DV.js.map} +1 -1
- package/{gltf-feature-skeleton-DKbOGidp.js → gltf-feature-skeleton-B9och1W0.js} +3 -3
- package/{gltf-feature-skeleton-DKbOGidp.js.map → gltf-feature-skeleton-B9och1W0.js.map} +1 -1
- package/{gltf-feature-variants-Cmzu0O0e.js → gltf-feature-variants-CY_Qft7f.js} +2 -2
- package/{gltf-feature-variants-Cmzu0O0e.js.map → gltf-feature-variants-CY_Qft7f.js.map} +1 -1
- package/{gltf-glb-parser-Cj5MHS-v.js → gltf-glb-parser-CqOeXFOz.js} +2 -2
- package/{gltf-glb-parser-Cj5MHS-v.js.map → gltf-glb-parser-CqOeXFOz.js.map} +1 -1
- package/{gltf-interleave-gHf9_t0i.js → gltf-interleave-DWf27t-h.js} +2 -3
- package/{gltf-interleave-gHf9_t0i.js.map → gltf-interleave-DWf27t-h.js.map} +1 -1
- package/{gltf-pbr-builder-ext-edNcjwPf.js → gltf-pbr-builder-ext-DvFxuOqN.js} +2 -2
- package/{gltf-pbr-builder-ext-edNcjwPf.js.map → gltf-pbr-builder-ext-DvFxuOqN.js.map} +1 -1
- package/{gltf-variants-CPxNdtP4.js → gltf-variants-CUvzYGYX.js} +4 -4
- package/{gltf-variants-CPxNdtP4.js.map → gltf-variants-CUvzYGYX.js.map} +1 -1
- package/gpu-task-timer-Dgkff80h.js +236 -0
- package/gpu-task-timer-Dgkff80h.js.map +1 -0
- package/gpu-timer-CUpqT_hK.js +55 -0
- package/gpu-timer-CUpqT_hK.js.map +1 -0
- package/{gs-picking-pipeline-DYaW_Lg3.js → gs-picking-pipeline-55sM5LzV.js} +2 -2
- package/{gs-picking-pipeline-DYaW_Lg3.js.map → gs-picking-pipeline-55sM5LzV.js.map} +1 -1
- package/{havok-floating-origin-Dr-18Nds.js → havok-floating-origin-5xp32P-C.js} +2 -2
- package/{havok-floating-origin-Dr-18Nds.js.map → havok-floating-origin-5xp32P-C.js.map} +1 -1
- package/{index-CLElg2Bo.js → index-C-tEgwbZ.js} +2712 -865
- package/index-C-tEgwbZ.js.map +1 -0
- package/index.d.ts +486 -6
- package/index.js +473 -444
- package/{input-block-DqEedWF2.js → input-block-DbRYCnet.js} +2 -2
- package/{input-block-DqEedWF2.js.map → input-block-DbRYCnet.js.map} +1 -1
- package/{iridescence-fragment-BHU59-gQ.js → iridescence-fragment-S3Ko1jvC.js} +2 -2
- package/{iridescence-fragment-BHU59-gQ.js.map → iridescence-fragment-S3Ko1jvC.js.map} +1 -1
- package/{light-block-Bv37V8vl.js → light-block-CAqWkucp.js} +2 -2
- package/{light-block-Bv37V8vl.js.map → light-block-CAqWkucp.js.map} +1 -1
- package/{loop-block-qTg8vb99.js → loop-block-ch-biPFY.js} +2 -2
- package/{loop-block-qTg8vb99.js.map → loop-block-ch-biPFY.js.map} +1 -1
- package/{morph-fragment-BRCUr2wQ.js → morph-fragment-D9he3Ksk.js} +2 -2
- package/{morph-fragment-BRCUr2wQ.js.map → morph-fragment-D9he3Ksk.js.map} +1 -1
- package/{multilight-wgsl-DMeppAdZ.js → multilight-wgsl-74aXpcJG.js} +2 -2
- package/{multilight-wgsl-DMeppAdZ.js.map → multilight-wgsl-74aXpcJG.js.map} +1 -1
- package/{node-env-Bc559GmY.js → node-env-B2bjGcMS.js} +2 -2
- package/{node-env-Bc559GmY.js.map → node-env-B2bjGcMS.js.map} +1 -1
- package/{node-geometry-view-COmWsRXK.js → node-geometry-view-CSXlEAhG.js} +3 -3
- package/{node-geometry-view-COmWsRXK.js.map → node-geometry-view-CSXlEAhG.js.map} +1 -1
- package/{node-registry-extra-compat-dWrv7gpS.js → node-registry-extra-compat-BEQH_ksg.js} +2 -2
- package/{node-registry-extra-compat-dWrv7gpS.js.map → node-registry-extra-compat-BEQH_ksg.js.map} +1 -1
- package/{node-registry-extra-math-Bn854sX9.js → node-registry-extra-math-Bm32WBAa.js} +2 -2
- package/{node-registry-extra-math-Bn854sX9.js.map → node-registry-extra-math-Bm32WBAa.js.map} +1 -1
- package/{node-renderable-B5G8WcdH.js → node-renderable-BMHny4tC.js} +2 -2
- package/{node-renderable-B5G8WcdH.js.map → node-renderable-BMHny4tC.js.map} +1 -1
- package/{node-shadow-CVIUlNf0.js → node-shadow-BRiz7CT1.js} +2 -2
- package/{node-shadow-CVIUlNf0.js.map → node-shadow-BRiz7CT1.js.map} +1 -1
- package/{normal-map-fragment-CQSxhjCy.js → normal-map-fragment-sE3TjF4U.js} +2 -2
- package/{normal-map-fragment-CQSxhjCy.js.map → normal-map-fragment-sE3TjF4U.js.map} +1 -1
- package/package.json +3 -3
- package/{parse-camera-pBRT_6i5.js → parse-camera-CmZBS423.js} +2 -2
- package/{parse-camera-pBRT_6i5.js.map → parse-camera-CmZBS423.js.map} +1 -1
- package/{pbr-geometry-view-NiZY_juX.js → pbr-geometry-view-T3vMABM8.js} +3 -3
- package/{pbr-geometry-view-NiZY_juX.js.map → pbr-geometry-view-T3vMABM8.js.map} +1 -1
- package/{pbr-metallic-roughness-block-JBSi-tQN.js → pbr-metallic-roughness-block-DbozMlHU.js} +2 -2
- package/{pbr-metallic-roughness-block-JBSi-tQN.js.map → pbr-metallic-roughness-block-DbozMlHU.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-Ta9lR2cz.js → pbr-metallic-roughness-block-full-CHC8w-Uv.js} +2 -2
- package/{pbr-metallic-roughness-block-full-Ta9lR2cz.js.map → pbr-metallic-roughness-block-full-CHC8w-Uv.js.map} +1 -1
- package/{pbr-mr-helper-core-BVWNR08D.js → pbr-mr-helper-core-DGRgbRXl.js} +2 -2
- package/{pbr-mr-helper-core-BVWNR08D.js.map → pbr-mr-helper-core-DGRgbRXl.js.map} +1 -1
- package/{pbr-refraction-C9FvFmAp.js → pbr-refraction-CquDP9JO.js} +2 -2
- package/{pbr-refraction-C9FvFmAp.js.map → pbr-refraction-CquDP9JO.js.map} +1 -1
- package/{pbr-renderable-DzUF2QIk.js → pbr-renderable-CaHKHU0g.js} +22 -22
- package/{pbr-renderable-DzUF2QIk.js.map → pbr-renderable-CaHKHU0g.js.map} +1 -1
- package/{pbr-shadow-fragment-CnqnbGYS.js → pbr-shadow-fragment-DmnNe6yz.js} +2 -2
- package/{pbr-shadow-fragment-CnqnbGYS.js.map → pbr-shadow-fragment-DmnNe6yz.js.map} +1 -1
- package/{pbr-tracking-3tU1kqea.js → pbr-tracking-Bo7RTANK.js} +2 -2
- package/{pbr-tracking-3tU1kqea.js.map → pbr-tracking-Bo7RTANK.js.map} +1 -1
- package/{pbr-transmission-ext-BcLjRxfB.js → pbr-transmission-ext-CoGcJBGE.js} +2 -2
- package/{pbr-transmission-ext-BcLjRxfB.js.map → pbr-transmission-ext-CoGcJBGE.js.map} +1 -1
- package/{reflectance-fragment-Dbpgw3Jt.js → reflectance-fragment-CExe6qDY.js} +2 -2
- package/{reflectance-fragment-Dbpgw3Jt.js.map → reflectance-fragment-CExe6qDY.js.map} +1 -1
- package/{rgbd-decode-DoyUquy3.js → rgbd-decode-DkiiiIlt.js} +2 -2
- package/{rgbd-decode-DoyUquy3.js.map → rgbd-decode-DkiiiIlt.js.map} +1 -1
- package/{scene-material-swap-nNUH4nGn.js → scene-material-swap-4qM0tpBK.js} +1 -2
- package/scene-material-swap-4qM0tpBK.js.map +1 -0
- package/{screenshot-readback-D0Sj9qq3.js → screenshot-readback-avr_tYGZ.js} +2 -2
- package/{screenshot-readback-D0Sj9qq3.js.map → screenshot-readback-avr_tYGZ.js.map} +1 -1
- package/{shader-composer-BUD_pSX4.js → shader-composer-CZagsJDS.js} +2 -2
- package/{shader-composer-BUD_pSX4.js.map → shader-composer-CZagsJDS.js.map} +1 -1
- package/{shader-renderable-D7-RyVxa.js → shader-renderable-D5sbgzxt.js} +41 -9
- package/shader-renderable-D5sbgzxt.js.map +1 -0
- package/{shader-thin-instance-DuBotxDO.js → shader-thin-instance-CkQ8rrfH.js} +2 -2
- package/{shader-thin-instance-DuBotxDO.js.map → shader-thin-instance-CkQ8rrfH.js.map} +1 -1
- package/{sheen-fragment-1MkEMcbc.js → sheen-fragment-BEigjpTX.js} +2 -2
- package/{sheen-fragment-1MkEMcbc.js.map → sheen-fragment-BEigjpTX.js.map} +1 -1
- package/{singlelight-directional-wgsl-BsV8G456.js → singlelight-directional-wgsl-Ccsk-ys3.js} +2 -2
- package/{singlelight-directional-wgsl-BsV8G456.js.map → singlelight-directional-wgsl-Ccsk-ys3.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-Bo0jKlW5.js → singlelight-hemispheric-wgsl-DL-jpc97.js} +2 -2
- package/{singlelight-hemispheric-wgsl-Bo0jKlW5.js.map → singlelight-hemispheric-wgsl-DL-jpc97.js.map} +1 -1
- package/{singlelight-point-wgsl-DV39UP5Y.js → singlelight-point-wgsl-hYmiP6ys.js} +2 -2
- package/{singlelight-point-wgsl-DV39UP5Y.js.map → singlelight-point-wgsl-hYmiP6ys.js.map} +1 -1
- package/{singlelight-spot-wgsl-yg3od6vL.js → singlelight-spot-wgsl-DSjp1p1C.js} +2 -2
- package/{singlelight-spot-wgsl-yg3od6vL.js.map → singlelight-spot-wgsl-DSjp1p1C.js.map} +1 -1
- package/{skeleton-fragment-DdxYG6kv.js → skeleton-fragment-B__bUbPK.js} +2 -2
- package/{skeleton-fragment-DdxYG6kv.js.map → skeleton-fragment-B__bUbPK.js.map} +1 -1
- package/{skybox-renderable-CJD4XmX5.js → skybox-renderable-BH6uUkal.js} +2 -2
- package/{skybox-renderable-CJD4XmX5.js.map → skybox-renderable-BH6uUkal.js.map} +1 -1
- package/{splat-ply-compressed-DHjyiVmI.js → splat-ply-compressed-BGNK6dnh.js} +2 -2
- package/{splat-ply-compressed-DHjyiVmI.js.map → splat-ply-compressed-BGNK6dnh.js.map} +1 -1
- package/{standard-pipeline-XTbHL7MY.js → standard-pipeline-BvFynkwL.js} +3 -3
- package/{standard-pipeline-XTbHL7MY.js.map → standard-pipeline-BvFynkwL.js.map} +1 -1
- package/{standard-renderable-CREWLNHI.js → standard-renderable-1Q3zemys.js} +3 -3
- package/{standard-renderable-CREWLNHI.js.map → standard-renderable-1Q3zemys.js.map} +1 -1
- package/{std-ambient-fragment-Bjx3VFrr.js → std-ambient-fragment-__F1KTEu.js} +2 -2
- package/{std-ambient-fragment-Bjx3VFrr.js.map → std-ambient-fragment-__F1KTEu.js.map} +1 -1
- package/{std-cube-reflection-fragment-y9WWdXUt.js → std-cube-reflection-fragment-DidM0byH.js} +2 -2
- package/{std-cube-reflection-fragment-y9WWdXUt.js.map → std-cube-reflection-fragment-DidM0byH.js.map} +1 -1
- package/{std-emissive-fragment-C8Lnmojh.js → std-emissive-fragment-Bj62X4Np.js} +2 -2
- package/{std-emissive-fragment-C8Lnmojh.js.map → std-emissive-fragment-Bj62X4Np.js.map} +1 -1
- package/{std-lightmap-fragment-DFxGcoA5.js → std-lightmap-fragment-DXvfWvKc.js} +2 -2
- package/{std-lightmap-fragment-DFxGcoA5.js.map → std-lightmap-fragment-DXvfWvKc.js.map} +1 -1
- package/{std-opacity-fragment-EXzFWiSp.js → std-opacity-fragment-BzMMb1K_.js} +2 -2
- package/{std-opacity-fragment-EXzFWiSp.js.map → std-opacity-fragment-BzMMb1K_.js.map} +1 -1
- package/{std-reflection-fragment-BoJORqpG.js → std-reflection-fragment-DC9Kvu1C.js} +2 -2
- package/{std-reflection-fragment-BoJORqpG.js.map → std-reflection-fragment-DC9Kvu1C.js.map} +1 -1
- package/{std-shadow-fragment-Bq-Wc8UJ.js → std-shadow-fragment-BnMHeF1-.js} +2 -2
- package/{std-shadow-fragment-Bq-Wc8UJ.js.map → std-shadow-fragment-BnMHeF1-.js.map} +1 -1
- package/{std-specular-fragment-CM5R5j2g.js → std-specular-fragment-Bio681OG.js} +2 -2
- package/{std-specular-fragment-CM5R5j2g.js.map → std-specular-fragment-Bio681OG.js.map} +1 -1
- package/{std-tracking-Cif_wXeT.js → std-tracking-BTcrry2o.js} +2 -2
- package/{std-tracking-Cif_wXeT.js.map → std-tracking-BTcrry2o.js.map} +1 -1
- package/{subsurface-fragment-BEaAXYXz.js → subsurface-fragment-DpKib445.js} +2 -2
- package/{subsurface-fragment-BEaAXYXz.js.map → subsurface-fragment-DpKib445.js.map} +1 -1
- package/{thin-instance-cull-binding-DWKUt5ZN.js → thin-instance-cull-binding-DwZi7mlE.js} +3 -3
- package/{thin-instance-cull-binding-DWKUt5ZN.js.map → thin-instance-cull-binding-DwZi7mlE.js.map} +1 -1
- package/{thin-instance-gpu-BDdRcNAh.js → thin-instance-gpu-uY2NOv0J.js} +2 -2
- package/{thin-instance-gpu-BDdRcNAh.js.map → thin-instance-gpu-uY2NOv0J.js.map} +1 -1
- package/{tracking-primitives-CglRNTlX.js → tracking-primitives-Ck5bgCuo.js} +2 -2
- package/{tracking-primitives-CglRNTlX.js.map → tracking-primitives-Ck5bgCuo.js.map} +1 -1
- package/{unlit-fragment-kxfZWlnp.js → unlit-fragment-nc6hu3Mw.js} +2 -2
- package/{unlit-fragment-kxfZWlnp.js.map → unlit-fragment-nc6hu3Mw.js.map} +1 -1
- package/gltf-ext-basisu-CDbPclzZ.js.map +0 -1
- package/index-CLElg2Bo.js.map +0 -1
- package/scene-material-swap-nNUH4nGn.js.map +0 -1
- package/shader-renderable-D7-RyVxa.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splat-ply-compressed-DHjyiVmI.js","sources":["../src/loader-splat/splat-ply-compressed.ts"],"sourcesContent":["/** Compressed-PLY + SH parser (separate from `splat-ply-parser.ts` so the\n * standard PLY path stays small enough to fit scene 120's bundle ceiling).\n *\n * Compressed PLY layout (BJS / PlayCanvas convention):\n * • `element chunk K` — K records of 12 floats:\n * min_x..z, max_x..z, min_scale_*, max_scale_*, min_r..b, max_r..b\n * • `element vertex N` — N rows of `packed_position`/`_rotation`/`_scale`/\n * `_color` (uint32 each); chunkIndex = `vertexIndex >> 8`.\n * • `element sh M` — properties define SH bytes laid out in a\n * *trailing* block (absolute offset `chunkBytes + vertexBytes`).\n *\n * Standard PLY with per-vertex `f_rest_*` properties also routes through\n * this parser so SH evaluation stays paired with the rest of the SH\n * pipeline.\n *\n * Returns the same `ParsedSplat` contract as `convertPlyToSplat` (flat SH\n * byte layout — see `splat-data.ts` for the exact convention). */\n\nimport { F32, U8C, U8, DV } from \"../engine/typed-arrays.js\";\nimport type { ParsedSplat } from \"./splat-data.js\";\n\nconst SH_C0 = 0.28209479177387814;\nconst SQRT2 = Math.SQRT2;\nconst ROW_OUTPUT_LENGTH = 32;\n\nconst TYPE_SIZE: Record<string, number> = { double: 8, int: 4, uint: 4, float: 4, short: 2, ushort: 2, uchar: 1 };\n\nconst enum Section {\n Vertex = 0,\n Chunk = 1,\n SH = 2,\n Unused = 3,\n}\n\ninterface PlyProp {\n name: string;\n type: string;\n offset: number;\n}\n\ninterface PlyHeader {\n vertexCount: number;\n chunkCount: number;\n rowVertexLength: number;\n rowChunkLength: number;\n vertexProps: PlyProp[];\n chunkProps: PlyProp[];\n shProps: PlyProp[];\n shDegree: number;\n shCoefficientCount: number;\n dataStart: number;\n}\n\nfunction shDegreeForIndex(i: number): number {\n if (i >= 71) {\n return 4;\n }\n if (i >= 44) {\n return 3;\n }\n if (i >= 23) {\n return 2;\n }\n if (i >= 8) {\n return 1;\n }\n return 0;\n}\n\nfunction parseHeader(data: ArrayBuffer): PlyHeader | null {\n const headerText = new TextDecoder().decode(new U8(data, 0, Math.min(data.byteLength, 1024 * 10)));\n const headerEnd = \"end_header\\n\";\n const idx = headerText.indexOf(headerEnd);\n if (idx < 0) {\n return null;\n }\n const vmatch = /element vertex (\\d+)\\n/.exec(headerText);\n if (!vmatch) {\n return null;\n }\n const vertexCount = parseInt(vmatch[1]!, 10);\n const cmatch = /element chunk (\\d+)\\n/.exec(headerText);\n const chunkCount = cmatch ? parseInt(cmatch[1]!, 10) : 0;\n let section: Section = Section.Chunk;\n let rowVertex = 0;\n let rowChunk = 0;\n const vertexProps: PlyProp[] = [];\n const chunkProps: PlyProp[] = [];\n const shProps: PlyProp[] = [];\n let shDegree = 0;\n for (const line of headerText.slice(0, idx).split(\"\\n\")) {\n if (line.startsWith(\"element \")) {\n const [, kind] = line.split(\" \");\n section = kind === \"chunk\" ? Section.Chunk : kind === \"vertex\" ? Section.Vertex : kind === \"sh\" ? Section.SH : Section.Unused;\n continue;\n }\n if (!line.startsWith(\"property \")) {\n continue;\n }\n const [, type, name] = line.split(\" \");\n if (!type || !name || TYPE_SIZE[type] === undefined) {\n return null;\n }\n const sz = TYPE_SIZE[type]!;\n if (section === Section.Chunk) {\n chunkProps.push({ name, type, offset: rowChunk });\n rowChunk += sz;\n } else if (section === Section.Vertex) {\n vertexProps.push({ name, type, offset: rowVertex });\n rowVertex += sz;\n if (name.startsWith(\"f_rest_\")) {\n shDegree = Math.max(shDegree, shDegreeForIndex(parseInt(name.slice(7), 10)));\n }\n } else if (section === Section.SH) {\n shProps.push({ name, type, offset: 0 });\n if (name.startsWith(\"f_rest_\")) {\n shDegree = Math.max(shDegree, shDegreeForIndex(parseInt(name.slice(7), 10)));\n }\n }\n }\n const shCoefficientCount = shDegree ? ((shDegree + 1) * (shDegree + 1) - 1) * 3 : 0;\n return {\n vertexCount,\n chunkCount,\n rowVertexLength: rowVertex,\n rowChunkLength: rowChunk,\n vertexProps,\n chunkProps,\n shProps,\n shDegree,\n shCoefficientCount,\n dataStart: idx + headerEnd.length,\n };\n}\n\ninterface CompressedChunk {\n minX: number;\n minY: number;\n minZ: number;\n maxX: number;\n maxY: number;\n maxZ: number;\n minSX: number;\n minSY: number;\n minSZ: number;\n maxSX: number;\n maxSY: number;\n maxSZ: number;\n minR: number;\n minG: number;\n minB: number;\n maxR: number;\n maxG: number;\n maxB: number;\n}\n\nfunction readChunks(header: PlyHeader, dv: DataView, offsetRef: { value: number }): CompressedChunk[] {\n const out: CompressedChunk[] = [];\n for (let i = 0; i < header.chunkCount; i++) {\n const c: CompressedChunk = {\n minX: 0,\n minY: 0,\n minZ: 0,\n maxX: 0,\n maxY: 0,\n maxZ: 0,\n minSX: 0,\n minSY: 0,\n minSZ: 0,\n maxSX: 0,\n maxSY: 0,\n maxSZ: 0,\n minR: 0,\n minG: 0,\n minB: 0,\n maxR: 1,\n maxG: 1,\n maxB: 1,\n };\n for (const p of header.chunkProps) {\n if (p.type !== \"float\") {\n continue;\n }\n const v = dv.getFloat32(offsetRef.value + p.offset, true);\n switch (p.name) {\n case \"min_x\":\n c.minX = v;\n break;\n case \"min_y\":\n c.minY = v;\n break;\n case \"min_z\":\n c.minZ = v;\n break;\n case \"max_x\":\n c.maxX = v;\n break;\n case \"max_y\":\n c.maxY = v;\n break;\n case \"max_z\":\n c.maxZ = v;\n break;\n case \"min_scale_x\":\n c.minSX = v;\n break;\n case \"min_scale_y\":\n c.minSY = v;\n break;\n case \"min_scale_z\":\n c.minSZ = v;\n break;\n case \"max_scale_x\":\n c.maxSX = v;\n break;\n case \"max_scale_y\":\n c.maxSY = v;\n break;\n case \"max_scale_z\":\n c.maxSZ = v;\n break;\n case \"min_r\":\n c.minR = v;\n break;\n case \"min_g\":\n c.minG = v;\n break;\n case \"min_b\":\n c.minB = v;\n break;\n case \"max_r\":\n c.maxR = v;\n break;\n case \"max_g\":\n c.maxG = v;\n break;\n case \"max_b\":\n c.maxB = v;\n break;\n }\n }\n out.push(c);\n offsetRef.value += header.rowChunkLength;\n }\n return out;\n}\n\nconst lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\nconst clamp255 = (v: number): number => (v < 0 ? 0 : v > 255 ? 255 : v);\n\n/** Unpack a uint32 as 11-10-11 bits → three normalized floats in [0,1]. */\nfunction unpack111011(value: number, out: [number, number, number]): void {\n out[0] = ((value >>> 21) & 0x7ff) / 0x7ff;\n out[1] = ((value >>> 11) & 0x3ff) / 0x3ff;\n out[2] = (value & 0x7ff) / 0x7ff;\n}\n\n/** Unpack a uint32 as 4 bytes (R,G,B,A normalized to [0,1]). */\nfunction unpack8888(value: number, out: [number, number, number, number]): void {\n out[0] = ((value >>> 24) & 0xff) / 0xff;\n out[1] = ((value >>> 16) & 0xff) / 0xff;\n out[2] = ((value >>> 8) & 0xff) / 0xff;\n out[3] = (value & 0xff) / 0xff;\n}\n\n/** Unpack a uint32 as (2-bit largest index, 3×10-bit components). Returns\n * quaternion as [x, y, z, w] matching BJS `Quaternion.set(x, y, z, w)`. */\nfunction unpackRot(value: number, out: [number, number, number, number]): void {\n const norm = 1.0 / (SQRT2 * 0.5);\n const a = (((value >>> 20) & 0x3ff) / 0x3ff - 0.5) * norm;\n const b = (((value >>> 10) & 0x3ff) / 0x3ff - 0.5) * norm;\n const c = ((value & 0x3ff) / 0x3ff - 0.5) * norm;\n const m = Math.sqrt(Math.max(0, 1.0 - (a * a + b * b + c * c)));\n switch (value >>> 30) {\n case 0:\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = m;\n break;\n case 1:\n out[0] = m;\n out[1] = b;\n out[2] = c;\n out[3] = a;\n break;\n case 2:\n out[0] = b;\n out[1] = m;\n out[2] = c;\n out[3] = a;\n break;\n default:\n out[0] = b;\n out[1] = c;\n out[2] = m;\n out[3] = a;\n break;\n }\n}\n\n/** Decode a compressed PLY (or a standard PLY with `f_rest_*` SH properties)\n * into a `ParsedSplat`. Dynamic-imported from `load-splat.ts` when\n * `isPlyCompressedOrSH(data)` is true, so the standard-PLY path remains\n * bundle-lean. */\nexport function convertCompressedPlyToParsedSplat(data: ArrayBuffer): ParsedSplat {\n const header = parseHeader(data);\n if (!header) {\n return { data };\n }\n\n const isCompressed = header.chunkCount > 0;\n const dv = new DV(data, header.dataStart);\n const out = new ArrayBuffer(ROW_OUTPUT_LENGTH * header.vertexCount);\n\n const tmpPos: [number, number, number] = [0, 0, 0];\n const tmpScl: [number, number, number] = [0, 0, 0];\n const tmpRgba: [number, number, number, number] = [0, 0, 0, 0];\n const tmpQuat: [number, number, number, number] = [0, 0, 0, 1];\n\n const offsetRef = { value: 0 };\n const chunks = isCompressed ? readChunks(header, dv, offsetRef) : null;\n\n const shFlat = header.shDegree && header.shCoefficientCount ? new U8(header.shCoefficientCount * header.vertexCount) : null;\n const shBlockBase = header.rowChunkLength * header.chunkCount + header.vertexCount * header.rowVertexLength;\n const shDim = header.shCoefficientCount / 3;\n\n for (let i = 0; i < header.vertexCount; i++) {\n const position = new F32(out, i * ROW_OUTPUT_LENGTH, 3);\n const scale = new F32(out, i * ROW_OUTPUT_LENGTH + 12, 3);\n const rgba = new U8C(out, i * ROW_OUTPUT_LENGTH + 24, 4);\n const rot = new U8C(out, i * ROW_OUTPUT_LENGTH + 28, 4);\n const chunk = chunks ? chunks[i >> 8] : null;\n\n let r0 = 255,\n r1 = 0,\n r2 = 0,\n r3 = 0;\n const plySH = shFlat ? new Array<number>(header.shCoefficientCount) : null;\n\n for (const prop of header.vertexProps) {\n let value: number;\n switch (prop.type) {\n case \"float\":\n value = dv.getFloat32(offsetRef.value + prop.offset, true);\n break;\n case \"int\":\n value = dv.getInt32(offsetRef.value + prop.offset, true);\n break;\n case \"uint\":\n value = dv.getUint32(offsetRef.value + prop.offset, true);\n break;\n case \"uchar\":\n value = dv.getUint8(offsetRef.value + prop.offset);\n break;\n case \"short\":\n value = dv.getInt16(offsetRef.value + prop.offset, true);\n break;\n case \"ushort\":\n value = dv.getUint16(offsetRef.value + prop.offset, true);\n break;\n case \"double\":\n value = dv.getFloat64(offsetRef.value + prop.offset, true);\n break;\n default:\n continue;\n }\n switch (prop.name) {\n case \"packed_position\":\n unpack111011(value, tmpPos);\n position[0] = lerp(chunk!.minX, chunk!.maxX, tmpPos[0]);\n position[1] = lerp(chunk!.minY, chunk!.maxY, tmpPos[1]);\n position[2] = lerp(chunk!.minZ, chunk!.maxZ, tmpPos[2]);\n break;\n case \"packed_rotation\":\n unpackRot(value, tmpQuat);\n r0 = tmpQuat[3];\n r1 = tmpQuat[0];\n r2 = tmpQuat[1];\n r3 = tmpQuat[2];\n break;\n case \"packed_scale\":\n unpack111011(value, tmpScl);\n scale[0] = Math.exp(lerp(chunk!.minSX, chunk!.maxSX, tmpScl[0]));\n scale[1] = Math.exp(lerp(chunk!.minSY, chunk!.maxSY, tmpScl[1]));\n scale[2] = Math.exp(lerp(chunk!.minSZ, chunk!.maxSZ, tmpScl[2]));\n break;\n case \"packed_color\":\n unpack8888(value, tmpRgba);\n rgba[0] = lerp(chunk!.minR, chunk!.maxR, tmpRgba[0]) * 255;\n rgba[1] = lerp(chunk!.minG, chunk!.maxG, tmpRgba[1]) * 255;\n rgba[2] = lerp(chunk!.minB, chunk!.maxB, tmpRgba[2]) * 255;\n rgba[3] = tmpRgba[3] * 255;\n break;\n case \"x\":\n position[0] = value;\n break;\n case \"y\":\n position[1] = value;\n break;\n case \"z\":\n position[2] = value;\n break;\n case \"scale_0\":\n scale[0] = Math.exp(value);\n break;\n case \"scale_1\":\n scale[1] = Math.exp(value);\n break;\n case \"scale_2\":\n scale[2] = Math.exp(value);\n break;\n case \"red\":\n case \"diffuse_red\":\n rgba[0] = value;\n break;\n case \"green\":\n case \"diffuse_green\":\n rgba[1] = value;\n break;\n case \"blue\":\n case \"diffuse_blue\":\n rgba[2] = value;\n break;\n case \"f_dc_0\":\n rgba[0] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_1\":\n rgba[1] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_2\":\n rgba[2] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_3\":\n rgba[3] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"opacity\":\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\n break;\n case \"rot_0\":\n r0 = value;\n break;\n case \"rot_1\":\n r1 = value;\n break;\n case \"rot_2\":\n r2 = value;\n break;\n case \"rot_3\":\n r3 = value;\n break;\n default:\n if (plySH && prop.name.startsWith(\"f_rest_\")) {\n const shIdx = parseInt(prop.name.slice(7), 10);\n plySH[shIdx] = clamp255(value * 127.5 + 127.5);\n }\n break;\n }\n }\n\n // Compressed PLY: SH bytes live in a trailing block keyed by splat\n // index. Uchar dequant uses BJS's `(v * 8/255 - 4) * 127.5 + 127.5`\n // (different from the standard f_rest float path).\n if (plySH && header.shProps.length > 0) {\n for (let k = 0; k < header.shCoefficientCount; k++) {\n const b = dv.getUint8(shBlockBase + i * header.shCoefficientCount + k);\n plySH[k] = clamp255((b * (8 / 255) - 4) * 127.5 + 127.5);\n }\n }\n\n // PLY stores SH as [R0..R(d-1), G0..G(d-1), B0..B(d-1)]; transpose to\n // the BJS-coefficient layout `[R0,G0,B0, R1,G1,B1, …]`.\n if (plySH && shFlat) {\n for (let j = 0; j < shDim; j++) {\n shFlat[i * header.shCoefficientCount + j * 3 + 0] = plySH[j]!;\n shFlat[i * header.shCoefficientCount + j * 3 + 1] = plySH[j + shDim]!;\n shFlat[i * header.shCoefficientCount + j * 3 + 2] = plySH[j + shDim * 2]!;\n }\n }\n\n const len = Math.hypot(r0, r1, r2, r3) || 1;\n const inv = 1 / len;\n rot[0] = r0 * inv * 127.5 + 127.5;\n rot[1] = r1 * inv * 127.5 + 127.5;\n rot[2] = r2 * inv * 127.5 + 127.5;\n rot[3] = r3 * inv * 127.5 + 127.5;\n\n offsetRef.value += header.rowVertexLength;\n }\n\n if (shFlat && header.shDegree) {\n return { data: out, sh: shFlat, shDegree: header.shDegree };\n }\n return { data: out };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"splat-ply-compressed-BGNK6dnh.js","sources":["../src/loader-splat/splat-ply-compressed.ts"],"sourcesContent":["/** Compressed-PLY + SH parser (separate from `splat-ply-parser.ts` so the\n * standard PLY path stays small enough to fit scene 120's bundle ceiling).\n *\n * Compressed PLY layout (BJS / PlayCanvas convention):\n * • `element chunk K` — K records of 12 floats:\n * min_x..z, max_x..z, min_scale_*, max_scale_*, min_r..b, max_r..b\n * • `element vertex N` — N rows of `packed_position`/`_rotation`/`_scale`/\n * `_color` (uint32 each); chunkIndex = `vertexIndex >> 8`.\n * • `element sh M` — properties define SH bytes laid out in a\n * *trailing* block (absolute offset `chunkBytes + vertexBytes`).\n *\n * Standard PLY with per-vertex `f_rest_*` properties also routes through\n * this parser so SH evaluation stays paired with the rest of the SH\n * pipeline.\n *\n * Returns the same `ParsedSplat` contract as `convertPlyToSplat` (flat SH\n * byte layout — see `splat-data.ts` for the exact convention). */\n\nimport { F32, U8C, U8, DV } from \"../engine/typed-arrays.js\";\nimport type { ParsedSplat } from \"./splat-data.js\";\n\nconst SH_C0 = 0.28209479177387814;\nconst SQRT2 = Math.SQRT2;\nconst ROW_OUTPUT_LENGTH = 32;\n\nconst TYPE_SIZE: Record<string, number> = { double: 8, int: 4, uint: 4, float: 4, short: 2, ushort: 2, uchar: 1 };\n\nconst enum Section {\n Vertex = 0,\n Chunk = 1,\n SH = 2,\n Unused = 3,\n}\n\ninterface PlyProp {\n name: string;\n type: string;\n offset: number;\n}\n\ninterface PlyHeader {\n vertexCount: number;\n chunkCount: number;\n rowVertexLength: number;\n rowChunkLength: number;\n vertexProps: PlyProp[];\n chunkProps: PlyProp[];\n shProps: PlyProp[];\n shDegree: number;\n shCoefficientCount: number;\n dataStart: number;\n}\n\nfunction shDegreeForIndex(i: number): number {\n if (i >= 71) {\n return 4;\n }\n if (i >= 44) {\n return 3;\n }\n if (i >= 23) {\n return 2;\n }\n if (i >= 8) {\n return 1;\n }\n return 0;\n}\n\nfunction parseHeader(data: ArrayBuffer): PlyHeader | null {\n const headerText = new TextDecoder().decode(new U8(data, 0, Math.min(data.byteLength, 1024 * 10)));\n const headerEnd = \"end_header\\n\";\n const idx = headerText.indexOf(headerEnd);\n if (idx < 0) {\n return null;\n }\n const vmatch = /element vertex (\\d+)\\n/.exec(headerText);\n if (!vmatch) {\n return null;\n }\n const vertexCount = parseInt(vmatch[1]!, 10);\n const cmatch = /element chunk (\\d+)\\n/.exec(headerText);\n const chunkCount = cmatch ? parseInt(cmatch[1]!, 10) : 0;\n let section: Section = Section.Chunk;\n let rowVertex = 0;\n let rowChunk = 0;\n const vertexProps: PlyProp[] = [];\n const chunkProps: PlyProp[] = [];\n const shProps: PlyProp[] = [];\n let shDegree = 0;\n for (const line of headerText.slice(0, idx).split(\"\\n\")) {\n if (line.startsWith(\"element \")) {\n const [, kind] = line.split(\" \");\n section = kind === \"chunk\" ? Section.Chunk : kind === \"vertex\" ? Section.Vertex : kind === \"sh\" ? Section.SH : Section.Unused;\n continue;\n }\n if (!line.startsWith(\"property \")) {\n continue;\n }\n const [, type, name] = line.split(\" \");\n if (!type || !name || TYPE_SIZE[type] === undefined) {\n return null;\n }\n const sz = TYPE_SIZE[type]!;\n if (section === Section.Chunk) {\n chunkProps.push({ name, type, offset: rowChunk });\n rowChunk += sz;\n } else if (section === Section.Vertex) {\n vertexProps.push({ name, type, offset: rowVertex });\n rowVertex += sz;\n if (name.startsWith(\"f_rest_\")) {\n shDegree = Math.max(shDegree, shDegreeForIndex(parseInt(name.slice(7), 10)));\n }\n } else if (section === Section.SH) {\n shProps.push({ name, type, offset: 0 });\n if (name.startsWith(\"f_rest_\")) {\n shDegree = Math.max(shDegree, shDegreeForIndex(parseInt(name.slice(7), 10)));\n }\n }\n }\n const shCoefficientCount = shDegree ? ((shDegree + 1) * (shDegree + 1) - 1) * 3 : 0;\n return {\n vertexCount,\n chunkCount,\n rowVertexLength: rowVertex,\n rowChunkLength: rowChunk,\n vertexProps,\n chunkProps,\n shProps,\n shDegree,\n shCoefficientCount,\n dataStart: idx + headerEnd.length,\n };\n}\n\ninterface CompressedChunk {\n minX: number;\n minY: number;\n minZ: number;\n maxX: number;\n maxY: number;\n maxZ: number;\n minSX: number;\n minSY: number;\n minSZ: number;\n maxSX: number;\n maxSY: number;\n maxSZ: number;\n minR: number;\n minG: number;\n minB: number;\n maxR: number;\n maxG: number;\n maxB: number;\n}\n\nfunction readChunks(header: PlyHeader, dv: DataView, offsetRef: { value: number }): CompressedChunk[] {\n const out: CompressedChunk[] = [];\n for (let i = 0; i < header.chunkCount; i++) {\n const c: CompressedChunk = {\n minX: 0,\n minY: 0,\n minZ: 0,\n maxX: 0,\n maxY: 0,\n maxZ: 0,\n minSX: 0,\n minSY: 0,\n minSZ: 0,\n maxSX: 0,\n maxSY: 0,\n maxSZ: 0,\n minR: 0,\n minG: 0,\n minB: 0,\n maxR: 1,\n maxG: 1,\n maxB: 1,\n };\n for (const p of header.chunkProps) {\n if (p.type !== \"float\") {\n continue;\n }\n const v = dv.getFloat32(offsetRef.value + p.offset, true);\n switch (p.name) {\n case \"min_x\":\n c.minX = v;\n break;\n case \"min_y\":\n c.minY = v;\n break;\n case \"min_z\":\n c.minZ = v;\n break;\n case \"max_x\":\n c.maxX = v;\n break;\n case \"max_y\":\n c.maxY = v;\n break;\n case \"max_z\":\n c.maxZ = v;\n break;\n case \"min_scale_x\":\n c.minSX = v;\n break;\n case \"min_scale_y\":\n c.minSY = v;\n break;\n case \"min_scale_z\":\n c.minSZ = v;\n break;\n case \"max_scale_x\":\n c.maxSX = v;\n break;\n case \"max_scale_y\":\n c.maxSY = v;\n break;\n case \"max_scale_z\":\n c.maxSZ = v;\n break;\n case \"min_r\":\n c.minR = v;\n break;\n case \"min_g\":\n c.minG = v;\n break;\n case \"min_b\":\n c.minB = v;\n break;\n case \"max_r\":\n c.maxR = v;\n break;\n case \"max_g\":\n c.maxG = v;\n break;\n case \"max_b\":\n c.maxB = v;\n break;\n }\n }\n out.push(c);\n offsetRef.value += header.rowChunkLength;\n }\n return out;\n}\n\nconst lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\nconst clamp255 = (v: number): number => (v < 0 ? 0 : v > 255 ? 255 : v);\n\n/** Unpack a uint32 as 11-10-11 bits → three normalized floats in [0,1]. */\nfunction unpack111011(value: number, out: [number, number, number]): void {\n out[0] = ((value >>> 21) & 0x7ff) / 0x7ff;\n out[1] = ((value >>> 11) & 0x3ff) / 0x3ff;\n out[2] = (value & 0x7ff) / 0x7ff;\n}\n\n/** Unpack a uint32 as 4 bytes (R,G,B,A normalized to [0,1]). */\nfunction unpack8888(value: number, out: [number, number, number, number]): void {\n out[0] = ((value >>> 24) & 0xff) / 0xff;\n out[1] = ((value >>> 16) & 0xff) / 0xff;\n out[2] = ((value >>> 8) & 0xff) / 0xff;\n out[3] = (value & 0xff) / 0xff;\n}\n\n/** Unpack a uint32 as (2-bit largest index, 3×10-bit components). Returns\n * quaternion as [x, y, z, w] matching BJS `Quaternion.set(x, y, z, w)`. */\nfunction unpackRot(value: number, out: [number, number, number, number]): void {\n const norm = 1.0 / (SQRT2 * 0.5);\n const a = (((value >>> 20) & 0x3ff) / 0x3ff - 0.5) * norm;\n const b = (((value >>> 10) & 0x3ff) / 0x3ff - 0.5) * norm;\n const c = ((value & 0x3ff) / 0x3ff - 0.5) * norm;\n const m = Math.sqrt(Math.max(0, 1.0 - (a * a + b * b + c * c)));\n switch (value >>> 30) {\n case 0:\n out[0] = a;\n out[1] = b;\n out[2] = c;\n out[3] = m;\n break;\n case 1:\n out[0] = m;\n out[1] = b;\n out[2] = c;\n out[3] = a;\n break;\n case 2:\n out[0] = b;\n out[1] = m;\n out[2] = c;\n out[3] = a;\n break;\n default:\n out[0] = b;\n out[1] = c;\n out[2] = m;\n out[3] = a;\n break;\n }\n}\n\n/** Decode a compressed PLY (or a standard PLY with `f_rest_*` SH properties)\n * into a `ParsedSplat`. Dynamic-imported from `load-splat.ts` when\n * `isPlyCompressedOrSH(data)` is true, so the standard-PLY path remains\n * bundle-lean. */\nexport function convertCompressedPlyToParsedSplat(data: ArrayBuffer): ParsedSplat {\n const header = parseHeader(data);\n if (!header) {\n return { data };\n }\n\n const isCompressed = header.chunkCount > 0;\n const dv = new DV(data, header.dataStart);\n const out = new ArrayBuffer(ROW_OUTPUT_LENGTH * header.vertexCount);\n\n const tmpPos: [number, number, number] = [0, 0, 0];\n const tmpScl: [number, number, number] = [0, 0, 0];\n const tmpRgba: [number, number, number, number] = [0, 0, 0, 0];\n const tmpQuat: [number, number, number, number] = [0, 0, 0, 1];\n\n const offsetRef = { value: 0 };\n const chunks = isCompressed ? readChunks(header, dv, offsetRef) : null;\n\n const shFlat = header.shDegree && header.shCoefficientCount ? new U8(header.shCoefficientCount * header.vertexCount) : null;\n const shBlockBase = header.rowChunkLength * header.chunkCount + header.vertexCount * header.rowVertexLength;\n const shDim = header.shCoefficientCount / 3;\n\n for (let i = 0; i < header.vertexCount; i++) {\n const position = new F32(out, i * ROW_OUTPUT_LENGTH, 3);\n const scale = new F32(out, i * ROW_OUTPUT_LENGTH + 12, 3);\n const rgba = new U8C(out, i * ROW_OUTPUT_LENGTH + 24, 4);\n const rot = new U8C(out, i * ROW_OUTPUT_LENGTH + 28, 4);\n const chunk = chunks ? chunks[i >> 8] : null;\n\n let r0 = 255,\n r1 = 0,\n r2 = 0,\n r3 = 0;\n const plySH = shFlat ? new Array<number>(header.shCoefficientCount) : null;\n\n for (const prop of header.vertexProps) {\n let value: number;\n switch (prop.type) {\n case \"float\":\n value = dv.getFloat32(offsetRef.value + prop.offset, true);\n break;\n case \"int\":\n value = dv.getInt32(offsetRef.value + prop.offset, true);\n break;\n case \"uint\":\n value = dv.getUint32(offsetRef.value + prop.offset, true);\n break;\n case \"uchar\":\n value = dv.getUint8(offsetRef.value + prop.offset);\n break;\n case \"short\":\n value = dv.getInt16(offsetRef.value + prop.offset, true);\n break;\n case \"ushort\":\n value = dv.getUint16(offsetRef.value + prop.offset, true);\n break;\n case \"double\":\n value = dv.getFloat64(offsetRef.value + prop.offset, true);\n break;\n default:\n continue;\n }\n switch (prop.name) {\n case \"packed_position\":\n unpack111011(value, tmpPos);\n position[0] = lerp(chunk!.minX, chunk!.maxX, tmpPos[0]);\n position[1] = lerp(chunk!.minY, chunk!.maxY, tmpPos[1]);\n position[2] = lerp(chunk!.minZ, chunk!.maxZ, tmpPos[2]);\n break;\n case \"packed_rotation\":\n unpackRot(value, tmpQuat);\n r0 = tmpQuat[3];\n r1 = tmpQuat[0];\n r2 = tmpQuat[1];\n r3 = tmpQuat[2];\n break;\n case \"packed_scale\":\n unpack111011(value, tmpScl);\n scale[0] = Math.exp(lerp(chunk!.minSX, chunk!.maxSX, tmpScl[0]));\n scale[1] = Math.exp(lerp(chunk!.minSY, chunk!.maxSY, tmpScl[1]));\n scale[2] = Math.exp(lerp(chunk!.minSZ, chunk!.maxSZ, tmpScl[2]));\n break;\n case \"packed_color\":\n unpack8888(value, tmpRgba);\n rgba[0] = lerp(chunk!.minR, chunk!.maxR, tmpRgba[0]) * 255;\n rgba[1] = lerp(chunk!.minG, chunk!.maxG, tmpRgba[1]) * 255;\n rgba[2] = lerp(chunk!.minB, chunk!.maxB, tmpRgba[2]) * 255;\n rgba[3] = tmpRgba[3] * 255;\n break;\n case \"x\":\n position[0] = value;\n break;\n case \"y\":\n position[1] = value;\n break;\n case \"z\":\n position[2] = value;\n break;\n case \"scale_0\":\n scale[0] = Math.exp(value);\n break;\n case \"scale_1\":\n scale[1] = Math.exp(value);\n break;\n case \"scale_2\":\n scale[2] = Math.exp(value);\n break;\n case \"red\":\n case \"diffuse_red\":\n rgba[0] = value;\n break;\n case \"green\":\n case \"diffuse_green\":\n rgba[1] = value;\n break;\n case \"blue\":\n case \"diffuse_blue\":\n rgba[2] = value;\n break;\n case \"f_dc_0\":\n rgba[0] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_1\":\n rgba[1] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_2\":\n rgba[2] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"f_dc_3\":\n rgba[3] = (0.5 + SH_C0 * value) * 255;\n break;\n case \"opacity\":\n rgba[3] = (1 / (1 + Math.exp(-value))) * 255;\n break;\n case \"rot_0\":\n r0 = value;\n break;\n case \"rot_1\":\n r1 = value;\n break;\n case \"rot_2\":\n r2 = value;\n break;\n case \"rot_3\":\n r3 = value;\n break;\n default:\n if (plySH && prop.name.startsWith(\"f_rest_\")) {\n const shIdx = parseInt(prop.name.slice(7), 10);\n plySH[shIdx] = clamp255(value * 127.5 + 127.5);\n }\n break;\n }\n }\n\n // Compressed PLY: SH bytes live in a trailing block keyed by splat\n // index. Uchar dequant uses BJS's `(v * 8/255 - 4) * 127.5 + 127.5`\n // (different from the standard f_rest float path).\n if (plySH && header.shProps.length > 0) {\n for (let k = 0; k < header.shCoefficientCount; k++) {\n const b = dv.getUint8(shBlockBase + i * header.shCoefficientCount + k);\n plySH[k] = clamp255((b * (8 / 255) - 4) * 127.5 + 127.5);\n }\n }\n\n // PLY stores SH as [R0..R(d-1), G0..G(d-1), B0..B(d-1)]; transpose to\n // the BJS-coefficient layout `[R0,G0,B0, R1,G1,B1, …]`.\n if (plySH && shFlat) {\n for (let j = 0; j < shDim; j++) {\n shFlat[i * header.shCoefficientCount + j * 3 + 0] = plySH[j]!;\n shFlat[i * header.shCoefficientCount + j * 3 + 1] = plySH[j + shDim]!;\n shFlat[i * header.shCoefficientCount + j * 3 + 2] = plySH[j + shDim * 2]!;\n }\n }\n\n const len = Math.hypot(r0, r1, r2, r3) || 1;\n const inv = 1 / len;\n rot[0] = r0 * inv * 127.5 + 127.5;\n rot[1] = r1 * inv * 127.5 + 127.5;\n rot[2] = r2 * inv * 127.5 + 127.5;\n rot[3] = r3 * inv * 127.5 + 127.5;\n\n offsetRef.value += header.rowVertexLength;\n }\n\n if (shFlat && header.shDegree) {\n return { data: out, sh: shFlat, shDegree: header.shDegree };\n }\n return { data: out };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bF as appendMeshLightUboFields, M as MAX_LIGHTS, bG as meshLightIndexWGSL, bH as clearSceneBGLCache, a as F32, aw as createUniformBuffer, bI as _getStdExtsSorted, bJ as _standardFeatureKey, aF as MSH_RECEIVE_SHADOWS, bK as HAS_DIFFUSE_TEXTURE, aB as NEEDS_UV, Q as ESM_SHADOW_OUTPUT, y as targetSignatureKey, A as getSceneBindGroupLayout, bL as REVERSE_DEPTH_COMPARE, bM as DOUBLE_SIDED, aA as NO_COLOR_OUTPUT, an as HAS_OPACITY_TEXTURE, R as MATERIAL_ALPHA_BLEND, bN as DISABLE_LIGHTING, bO as DIFFUSE_USES_UV2, aD as NEEDS_UV2 } from "./index-C-tEgwbZ.js";
|
|
2
2
|
import { a as WGSL_FOG } from "./wgsl-helpers-D8sl1VVA.js";
|
|
3
|
-
import { c as composeShader } from "./shader-composer-
|
|
3
|
+
import { c as composeShader } from "./shader-composer-CZagsJDS.js";
|
|
4
4
|
const STAGE_VERTEX = 1;
|
|
5
5
|
const STAGE_FRAGMENT = 2;
|
|
6
6
|
const LIGHTING_FN = `
|
|
@@ -388,4 +388,4 @@ export {
|
|
|
388
388
|
getOrCreateStandardBindings as g,
|
|
389
389
|
writeStdMaterialData as w
|
|
390
390
|
};
|
|
391
|
-
//# sourceMappingURL=standard-pipeline-
|
|
391
|
+
//# sourceMappingURL=standard-pipeline-BvFynkwL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-pipeline-XTbHL7MY.js","sources":["../src/material/standard/standard-template.ts","../src/material/standard/standard-pipeline.ts"],"sourcesContent":["/**\n * Standard Base Template\n *\n * Provides the base Standard (Blinn-Phong) shader structure with slot markers.\n * Parameterized by feature configuration (textures, UV, shadow, reflection, fog).\n *\n * The Standard material uses 3 separate UBOs in group 1:\n * binding 0: mesh UBO (world matrix)\n * binding 1: material UBO (colors, levels)\n * Plus optional texture/sampler bindings at fixed slots.\n */\n\nimport type { ShaderTemplate, UboField, VertexAttribute, Varying, BindingDecl } from \"../../shader/fragment-types.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { appendMeshLightUboFields, meshLightIndexWGSL } from \"../../render/lights-ubo.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n// ── Lighting function (always present unless disableLighting) ───\n\nconst LIGHTING_FN = `\nfn computeLighting(viewDir: vec3<f32>, N: vec3<f32>, L: LightEntry, g: f32, P: vec3<f32>) -> array<vec3<f32>, 2> {\nvar lv: vec3<f32>;\nvar a: f32 = 1.0;\nlet t = u32(L.vLightData.w);\nif (t == 3u) {\nlet nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\nlet diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\nlet h = normalize(viewDir + normalize(L.vLightData.xyz));\nvar s = pow(max(0.0, dot(N, h)), max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb);\n}\nif (t == 1u) {\nlv = normalize(-L.vLightData.xyz);\n} else {\nlet d = L.vLightData.xyz - P;\na = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\nlv = normalize(d);\nif (t == 2u) {\nlet c = max(0.0, dot(L.vLightDirection.xyz, -lv));\nif (c >= L.vLightDirection.w) { a *= max(0.0, pow(c, L.vLightSpecular.a)); } else { a = 0.0; }\n}\n}\nlet nl = max(0.0, dot(N, lv));\nlet diff = nl * L.vLightDiffuse.rgb * a;\nlet h = normalize(viewDir + lv);\nvar s = max(0.0, dot(N, h));\ns = pow(s, max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb * a);\n}\n`;\n\nexport interface StandardTemplateConfig {\n /** @internal */\n readonly _diffuse?: boolean;\n /** @internal UV coordinate channels used */\n readonly _needsUV: boolean;\n /** @internal */\n readonly _needsUV2: boolean;\n /** @internal */\n readonly _diffuseUsesUV2?: boolean;\n /** @internal Disable lighting (unlit material) */\n readonly _disableLighting?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes no color. */\n readonly _noColorOutput?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes ESM shadow color. */\n readonly _esmShadowOutput?: boolean;\n}\n\n/**\n * Create a Standard material ShaderTemplate from configuration.\n * The template contains slot markers that the composer fills.\n */\nexport function createStandardTemplate(config: StandardTemplateConfig, esmShadowDepthCode = \"\"): ShaderTemplate {\n const { _diffuse, _needsUV, _needsUV2, _diffuseUsesUV2, _disableLighting, _noColorOutput, _esmShadowOutput } = config;\n\n // ── Base vertex attributes ──────────────────────────────────\n const _baseVertexAttributes: VertexAttribute[] = [\n { _name: \"position\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n { _name: \"normal\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n ];\n if (_needsUV) {\n _baseVertexAttributes.push({ _name: \"uv\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n if (_needsUV2) {\n _baseVertexAttributes.push({ _name: \"uv2\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n\n // ── Base varyings ───────────────────────────────────────────\n const _baseVaryings: Varying[] = [\n { _name: \"vp\", _type: \"vec3<f32>\" },\n { _name: \"vn\", _type: \"vec3<f32>\" },\n { _name: \"vf\", _type: \"vec3<f32>\" },\n ];\n if (_needsUV) {\n _baseVaryings.push({ _name: \"vu\", _type: \"vec2<f32>\" });\n }\n if (_needsUV2) {\n _baseVaryings.push({ _name: \"vv\", _type: \"vec2<f32>\" });\n }\n // shadow varyings (vPositionFromLight, vDepthMetric) are provided by std-shadow-fragment\n\n // ── Base UBO fields (mesh = world matrix + affected light indices) ──────────────\n const _baseMeshUboFields: UboField[] = [{ _name: \"world\", _type: \"mat4x4<f32>\" }];\n appendMeshLightUboFields(_baseMeshUboFields);\n\n // ── Base bindings (group 1, starting after mesh UBO at 0) ───\n // Order: material, diffuse*, shadow/UV*, emissive*, bump*, specular*, ambient*, lightmap*, opacity*, reflection*\n // The shadow/UV UBO is placed AFTER diffuse so its auto-assigned binding index\n // matches the conventional slot 5 when diffuse is present (bindings 3,4).\n const _baseBindings: BindingDecl[] = [{ _name: \"mat\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT }];\n\n if (_diffuse) {\n _baseBindings.push(\n { _name: \"dT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"dS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n // UV params UBO — only when UVs are actually emitted.\n if (_needsUV) {\n _baseBindings.push({ _name: \"up\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_VERTEX });\n }\n if (_esmShadowOutput) {\n _baseBindings.push({ _name: \"shadowParams\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT });\n }\n // bump bindings are provided by the normal-map fragment (not baseBindings)\n // emissive, specular, ambient, lightmap, opacity, reflection bindings\n // are provided by their respective fragments (not baseBindings)\n\n // Shadow map bindings (group 2) are provided by std-shadow-fragment\n\n // ── Vertex template ─────────────────────────────────────────\n\n const uvPassthrough = _needsUV ? `out.vu = uv * up.u.xy + up.u.zw;` : \"\";\n\n const uv2Passthrough = _needsUV2 ? `out.vv = uv2;` : \"\";\n\n // Vertex UBO struct definitions (must be before binding declarations)\n const vertexUboStructs = _needsUV ? `struct upUniforms { u: vec4<f32>, }` : \"\";\n\n const _vertexTemplate = `/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${vertexUboStructs}\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>(position, 1.0);\nout.vp = worldPos4.xyz;\nlet normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\nout.vn = normalize(normalWorld * normal);\nout.clipPos = scene.viewProjection * worldPos4;\nout.vf = (scene.view * worldPos4).xyz;\n${uvPassthrough}\n${uv2Passthrough}\n/*VB*/\nreturn out;\n}`;\n\n // ── Fragment template ────────────────────────────────────────\n\n const lightsStructs = `\nstruct LightEntry { vLightData: vec4<f32>, vLightDiffuse: vec4<f32>, vLightSpecular: vec4<f32>, vLightDirection: vec4<f32> };\nstruct lightsUniforms { count: u32, _p0: u32, _p1: u32, _p2: u32, lights: array<LightEntry, ${MAX_LIGHTS}> };\n@group(0) @binding(1) var<uniform> lights: lightsUniforms;\n`;\n\n const materialStruct = `\nstruct matUniforms {\ndc: vec4<f32>,\nsc: vec4<f32>,\nec: vec3<f32>,\nbs: f32,\nac: vec3<f32>,\ntl: f32,\nambTexLvl: f32,\nlmLvl: f32,\nopLvl: f32,\naCut: f32,\nrLvl: f32,\nrCm: f32,\n_0: f32,\n_1: f32,\n};\n`;\n\n const helpers = _disableLighting ? WGSL_FOG : WGSL_FOG + LIGHTING_FN;\n // reflection, shadow, bump helpers are provided by their respective fragments\n\n // Main fragment body — mirrors old composeFragmentShader exactly\n const doubleSidedEntry = `@fragment fn main(input: FragmentInput)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`;\n\n // View direction\n const viewDirCode = !_disableLighting ? `let viewDirectionW = normalize(scene.vEyePosition.xyz - input.vp);` : \"\";\n\n // Normal computation — fragment can override via AC slot\n const normalCode = _disableLighting ? \"\" : `var normalW = normalize(input.vn);`;\n\n // Opacity — default from material alpha, fragment can modify via AT\n const opacityCode = `var alpha = mat.dc.a;`;\n\n // Base color + alpha test. Texture alpha used for discard only (not blended into output alpha),\n // matching BJS ALPHATEST without ALPHAFROMDIFFUSE.\n const baseColorCode = _diffuse\n ? `let _ds = textureSample(dT, dS, ${_diffuseUsesUV2 ? \"input.vv\" : \"input.vu\"});\nif (_ds.a < mat.aCut) { discard; }\nvar baseColor = _ds.rgb * mat.tl;`\n : `var baseColor = vec3<f32>(1.0, 1.0, 1.0);`;\n\n // Diffuse color + emissive + specular — defaults, fragments can override via AT\n const diffuseColorCode = `let diffuseColor = mat.dc.rgb;`;\n const emissiveCode = `var emissiveContrib = mat.ec;`;\n const specularColorCode = !_disableLighting ? `var specularColor = mat.sc.rgb;` : \"\";\n // Lighting block (only when lighting enabled)\n let lightingBlock: string;\n if (!_disableLighting) {\n // Shadow — default to 1.0, fragment overrides via AD slot\n // shadowFactors array is populated by std-shadow-fragment (one per light index)\n lightingBlock = `var glossiness = mat.sc.a;\nvar diffuseBase = vec3<f32>(0.0);\nvar specularBase = vec3<f32>(0.0);\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nvar baseAmbientColor = vec3<f32>(1.0, 1.0, 1.0);\nvar reflectionColor = vec3<f32>(0.0);\nlet lc = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AD*/\nfor (var li = 0u; li < lc; li++) {\nlet lightIndex = mli(li);\nlet r = computeLighting(viewDirectionW, normalW, lights.lights[lightIndex], glossiness, input.vp);\nlet sf = shadowFactors[lightIndex];\ndiffuseBase += r[0] * sf;\nspecularBase += r[1] * sf;\n}\nlet finalDiffuse = clamp(diffuseBase * diffuseColor + emissiveContrib + mat.ac, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor;\nlet finalSpecular = specularBase * specularColor;\nvar color = vec4<f32>(finalDiffuse * baseAmbientColor + finalSpecular + reflectionColor, alpha);`;\n } else {\n lightingBlock = `var color = vec4<f32>(clamp(emissiveContrib * diffuseColor, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor, alpha);`;\n }\n\n const _fragmentTemplate = `/*SU*/\n${lightsStructs}\n${materialStruct}\n${_esmShadowOutput ? \"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }\" : \"\"}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${!_disableLighting ? meshLightIndexWGSL(\"mesh\") : \"\"}\n${helpers}\n/*HF*/\n/*FB*/\n/*FI*/\n${doubleSidedEntry}\n/*SV*/\n${viewDirCode}\n${normalCode}\n/*AC*/\n${opacityCode}\n${baseColorCode}\n${diffuseColorCode}\n${emissiveCode}\n${specularColorCode}\n/*AT*/\n${_noColorOutput ? \"return;\" : _esmShadowOutput ? esmShadowDepthCode : \"\"}\n${lightingBlock}\n/*BC*/\ncolor = vec4<f32>(max(color.rgb, vec3<f32>(0.0)), color.a);\nif (scene.vFogInfos.x > 0.0) {\nlet fog = calcFogFactor(input.vf);\ncolor = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\n}\n/*BA*/\n${_noColorOutput ? \"\" : \"return color;\"}\n}`;\n\n return {\n _vertexTemplate,\n _fragmentTemplate,\n _baseMeshUboFields,\n _baseVertexAttributes,\n _baseVaryings,\n _baseBindings,\n };\n}\n","/** Dynamic StandardMaterial pipeline builder — creates and caches GPU render\n * pipelines based on per-material feature flags.\n *\n * Feature flags (bitmask):\n * HAS_DIFFUSE_TEXTURE — diffuse texture sampling + UV attribute\n * HAS_EMISSIVE_TEXTURE — emissive texture sampling + UV attribute\n * Derived flag (computed automatically):\n * NEEDS_UV = HAS_DIFFUSE_TEXTURE | HAS_EMISSIVE_TEXTURE\n *\n * Pipelines are cached per (features, format, msaaSamples) tuple.\n * Shared scene UBO layout is identical across all variants (176 bytes). */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _standardFeatureKey } from \"./standard-material.js\";\nimport { getSceneBindGroupLayout, clearSceneBGLCache } from \"../../render/scene-helpers.js\";\nimport { createStandardTemplate } from \"./standard-template.js\";\nimport { composeShader } from \"../../shader/shader-composer.js\";\nimport type { ComposedShader, ShaderFragment } from \"../../shader/fragment-types.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { REVERSE_DEPTH_COMPARE, targetSignatureKey } from \"../../engine/render-target.js\";\nimport {\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_DIFFUSE_TEXTURE,\n HAS_OPACITY_TEXTURE,\n MATERIAL_ALPHA_BLEND,\n NEEDS_UV,\n NEEDS_UV2,\n NO_COLOR_OUTPUT,\n ESM_SHADOW_OUTPUT,\n _getStdExtsSorted,\n} from \"./standard-flags.js\";\nimport { MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n// ─── Composer Path (Phase 1) ────────────────────────────────────────\n// Converts feature bitmask → StandardTemplateConfig → ComposedShader.\n// This produces identical WGSL to the old string-builder path but via\n// the generic composer, enabling fragment-based extensions in Phase 2.\n\n/** Compose Standard shader via the generic ShaderComposer.\n * @param fragments - Optional extra fragments (e.g. thin-instance). */\nexport function composeStandardShader(features: number, _meshFeatures = 0, fragments: ShaderFragment[] = [], esmShadowDepthCode = \"\"): ComposedShader {\n const has = (bit: number) => (features & bit) !== 0;\n const template = createStandardTemplate(\n {\n _diffuse: has(HAS_DIFFUSE_TEXTURE),\n _needsUV: has(NEEDS_UV),\n _needsUV2: has(NEEDS_UV2),\n _diffuseUsesUV2: has(DIFFUSE_USES_UV2),\n _disableLighting: has(DISABLE_LIGHTING),\n _noColorOutput: has(NO_COLOR_OUTPUT),\n _esmShadowOutput: has(ESM_SHADOW_OUTPUT),\n },\n esmShadowDepthCode\n );\n return composeShader(template, fragments);\n}\n\n// ─── Shader Bindings (sig-independent) ──────────────────────────────\n\n/** Cached per-(features, fragments) shader bindings: BGLs + composed shader +\n * per-sig pipeline cache. Created once at renderable build time, shared across\n * all sig-specific pipelines. */\nexport interface StandardShaderBindings {\n /** @internal */\n _features: number;\n /** @internal */\n _meshFeatures: number;\n /** @internal */\n _meshBGL: GPUBindGroupLayout;\n /** @internal */\n _shadowBGL: GPUBindGroupLayout | null;\n /** @internal */\n _composed: ComposedShader;\n /** @internal Per-sig pipeline cache. Key = `targetSignatureKey(sig)`. */\n _pipelines: Map<string, GPURenderPipeline>;\n}\n\n// ─── Caches ─────────────────────────────────────────────────────────\n\n/** Per-(features:fk) shader bindings cache (sig-independent). */\nconst _bindingsCache = new Map<string, StandardShaderBindings>();\nlet _composedCache: Map<string, ComposedShader> | null = null;\nlet _cachedDevice: GPUDevice | null = null;\n\nfunction getComposedCache(): Map<string, ComposedShader> {\n if (!_composedCache) {\n _composedCache = new Map();\n }\n return _composedCache;\n}\n\nfunction ensureDevice(engine: EngineContext): void {\n if (_cachedDevice !== engine._device) {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = engine._device;\n }\n}\n\n/** Clear the pipeline cache. Must be called when a GPU device is destroyed. */\nexport function clearStandardPipelineCache(): void {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = null;\n}\n\n/** Get-or-build the sig-independent shader bindings for a given feature/fragment set.\n * Used at renderable build time so per-mesh bind groups can be created BEFORE the\n * first bind() call (when sig is known). */\nexport function getOrCreateStandardBindings(\n engine: EngineContext,\n features: number,\n meshFeatures: number,\n fragments: ShaderFragment[] = [],\n shaderKey = \"\",\n esmShadowDepthCode = \"\"\n): StandardShaderBindings {\n ensureDevice(engine);\n const key = _standardFeatureKey(features, meshFeatures, shaderKey);\n const cached = _bindingsCache.get(key);\n if (cached) {\n return cached;\n }\n\n const cc = getComposedCache();\n let composed = cc.get(key);\n if (!composed) {\n composed = composeStandardShader(features, meshFeatures, fragments, esmShadowDepthCode);\n cc.set(key, composed);\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n let shadowBGL: GPUBindGroupLayout | null = null;\n const hasShadow = (meshFeatures & MSH_RECEIVE_SHADOWS) !== 0;\n if (hasShadow && composed._shadowBGLDescriptor) {\n shadowBGL = device.createBindGroupLayout(composed._shadowBGLDescriptor);\n }\n\n const bindings: StandardShaderBindings = {\n _features: features,\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 a sig-specific pipeline on top of a shader bindings. Called at bind() time. */\nexport function getOrCreateStandardPipeline(engine: EngineContext, sig: RenderTargetSignature, bindings: StandardShaderBindings): 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 composed = bindings._composed;\n const features = bindings._features;\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 = (features & NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n const fragModule = !sig._colorFormat && !noColorOutput ? null : device.createShaderModule({ code: composed._fragmentWGSL });\n\n const needsBlend = !esmShadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || (features & MATERIAL_ALPHA_BLEND) !== 0);\n const colorTarget: GPUColorTargetState | null = noColorOutput\n ? null\n : needsBlend\n ? {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }\n : { format: sig._colorFormat! };\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: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n depthWriteEnabled: noColorOutput || esmShadowOutput || !needsBlend,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: features & DOUBLE_SIDED ? \"none\" : \"back\", frontFace: \"ccw\" },\n });\n\n bindings._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Per-Mesh GPU Setup ─────────────────────────────────────────────\n\n/** Build the per-mesh material bind group (group 1). The mesh UBO\n * and material UBO are created/owned by the caller — this\n * function only assembles the bind group entries that match the composer's\n * binding layout.\n *\n * Mirrors `createPbrMeshBindGroup` in pbr-pipeline.ts. */\nexport function createStandardMeshBindGroup(\n engine: EngineContext,\n bindings: StandardShaderBindings,\n meshUBO: GPUBuffer,\n materialUBO: GPUBuffer,\n material: StandardMaterialProps\n): GPUBindGroup {\n const device = engine._device;\n const features = bindings._features;\n const needsUV = (features & NEEDS_UV) !== 0;\n const hasDiffuseTex = (features & HAS_DIFFUSE_TEXTURE) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n\n // Sequential numbering matches composer output.\n let nextBinding = 0;\n const entries: GPUBindGroupEntry[] = [\n { binding: nextBinding++, resource: { buffer: meshUBO } },\n { binding: nextBinding++, resource: { buffer: materialUBO } },\n ];\n\n if (hasDiffuseTex) {\n const tex = material.diffuseTexture!;\n entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });\n }\n\n // UV params UBO (only when UVs are actually emitted).\n if (needsUV) {\n const uvData = new F32(4);\n const scaleX = material.uvScale[0];\n let scaleY = material.uvScale[1];\n let offsetY = 0;\n // Flip V for y-down source data (e.g. basis/compressed textures).\n // uv * (sx, sy) + (ox, oy) with vFlip becomes uv.xy * (sx, -sy) + (ox, sy+oy).\n if (material.diffuseTexture?.invertY) {\n offsetY = scaleY;\n scaleY = -scaleY;\n }\n uvData[0] = scaleX;\n uvData[1] = scaleY;\n uvData[2] = 0;\n uvData[3] = offsetY;\n entries.push({ binding: nextBinding++, resource: { buffer: createUniformBuffer(engine, uvData) } });\n }\n\n if (esmShadowOutput) {\n entries.push({\n binding: nextBinding++,\n resource: { buffer: (material as StandardMaterialProps & { readonly _esmShadowParamsUBO: GPUBuffer })._esmShadowParamsUBO },\n });\n }\n\n // Fragment-contributed bindings — iterate ext registry in alphabetical id order\n // to match composer's fragment sort order.\n const sortedExts = _getStdExtsSorted();\n for (const ext of sortedExts) {\n if (features & ext._feature && ext._bind) {\n nextBinding = ext._bind(material, entries, nextBinding);\n }\n }\n\n return device.createBindGroup({ layout: bindings._meshBGL, entries });\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────\n\n/** Write standard material properties into a pre-allocated Float32Array (24 floats). */\nexport function writeStdMaterialData(data: Float32Array, mat: StandardMaterialProps, textureLevel: number): void {\n const { diffuseColor: dc, specularColor: sc, emissiveColor: ec, ambientColor: ac } = mat;\n data[0] = dc[0];\n data[1] = dc[1];\n data[2] = dc[2];\n data[3] = mat.alpha;\n data[4] = sc[0];\n data[5] = sc[1];\n data[6] = sc[2];\n data[7] = mat.specularPower;\n data[8] = ec[0];\n data[9] = ec[1];\n data[10] = ec[2];\n data[11] = 1.0 / mat.bumpLevel;\n data[12] = ac[0];\n data[13] = ac[1];\n data[14] = ac[2];\n data[15] = textureLevel;\n data[16] = mat.ambientTexLevel;\n data[17] = mat.lightmapLevel;\n data[18] = mat.opacityLevel;\n data[19] = mat.alphaCutOff;\n data[20] = mat.reflectionLevel;\n data[21] = mat.reflectionCoordMode;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standard-pipeline-BvFynkwL.js","sources":["../src/material/standard/standard-template.ts","../src/material/standard/standard-pipeline.ts"],"sourcesContent":["/**\n * Standard Base Template\n *\n * Provides the base Standard (Blinn-Phong) shader structure with slot markers.\n * Parameterized by feature configuration (textures, UV, shadow, reflection, fog).\n *\n * The Standard material uses 3 separate UBOs in group 1:\n * binding 0: mesh UBO (world matrix)\n * binding 1: material UBO (colors, levels)\n * Plus optional texture/sampler bindings at fixed slots.\n */\n\nimport type { ShaderTemplate, UboField, VertexAttribute, Varying, BindingDecl } from \"../../shader/fragment-types.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { appendMeshLightUboFields, meshLightIndexWGSL } from \"../../render/lights-ubo.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n// ── Lighting function (always present unless disableLighting) ───\n\nconst LIGHTING_FN = `\nfn computeLighting(viewDir: vec3<f32>, N: vec3<f32>, L: LightEntry, g: f32, P: vec3<f32>) -> array<vec3<f32>, 2> {\nvar lv: vec3<f32>;\nvar a: f32 = 1.0;\nlet t = u32(L.vLightData.w);\nif (t == 3u) {\nlet nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\nlet diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\nlet h = normalize(viewDir + normalize(L.vLightData.xyz));\nvar s = pow(max(0.0, dot(N, h)), max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb);\n}\nif (t == 1u) {\nlv = normalize(-L.vLightData.xyz);\n} else {\nlet d = L.vLightData.xyz - P;\na = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\nlv = normalize(d);\nif (t == 2u) {\nlet c = max(0.0, dot(L.vLightDirection.xyz, -lv));\nif (c >= L.vLightDirection.w) { a *= max(0.0, pow(c, L.vLightSpecular.a)); } else { a = 0.0; }\n}\n}\nlet nl = max(0.0, dot(N, lv));\nlet diff = nl * L.vLightDiffuse.rgb * a;\nlet h = normalize(viewDir + lv);\nvar s = max(0.0, dot(N, h));\ns = pow(s, max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb * a);\n}\n`;\n\nexport interface StandardTemplateConfig {\n /** @internal */\n readonly _diffuse?: boolean;\n /** @internal UV coordinate channels used */\n readonly _needsUV: boolean;\n /** @internal */\n readonly _needsUV2: boolean;\n /** @internal */\n readonly _diffuseUsesUV2?: boolean;\n /** @internal Disable lighting (unlit material) */\n readonly _disableLighting?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes no color. */\n readonly _noColorOutput?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes ESM shadow color. */\n readonly _esmShadowOutput?: boolean;\n}\n\n/**\n * Create a Standard material ShaderTemplate from configuration.\n * The template contains slot markers that the composer fills.\n */\nexport function createStandardTemplate(config: StandardTemplateConfig, esmShadowDepthCode = \"\"): ShaderTemplate {\n const { _diffuse, _needsUV, _needsUV2, _diffuseUsesUV2, _disableLighting, _noColorOutput, _esmShadowOutput } = config;\n\n // ── Base vertex attributes ──────────────────────────────────\n const _baseVertexAttributes: VertexAttribute[] = [\n { _name: \"position\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n { _name: \"normal\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n ];\n if (_needsUV) {\n _baseVertexAttributes.push({ _name: \"uv\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n if (_needsUV2) {\n _baseVertexAttributes.push({ _name: \"uv2\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n\n // ── Base varyings ───────────────────────────────────────────\n const _baseVaryings: Varying[] = [\n { _name: \"vp\", _type: \"vec3<f32>\" },\n { _name: \"vn\", _type: \"vec3<f32>\" },\n { _name: \"vf\", _type: \"vec3<f32>\" },\n ];\n if (_needsUV) {\n _baseVaryings.push({ _name: \"vu\", _type: \"vec2<f32>\" });\n }\n if (_needsUV2) {\n _baseVaryings.push({ _name: \"vv\", _type: \"vec2<f32>\" });\n }\n // shadow varyings (vPositionFromLight, vDepthMetric) are provided by std-shadow-fragment\n\n // ── Base UBO fields (mesh = world matrix + affected light indices) ──────────────\n const _baseMeshUboFields: UboField[] = [{ _name: \"world\", _type: \"mat4x4<f32>\" }];\n appendMeshLightUboFields(_baseMeshUboFields);\n\n // ── Base bindings (group 1, starting after mesh UBO at 0) ───\n // Order: material, diffuse*, shadow/UV*, emissive*, bump*, specular*, ambient*, lightmap*, opacity*, reflection*\n // The shadow/UV UBO is placed AFTER diffuse so its auto-assigned binding index\n // matches the conventional slot 5 when diffuse is present (bindings 3,4).\n const _baseBindings: BindingDecl[] = [{ _name: \"mat\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT }];\n\n if (_diffuse) {\n _baseBindings.push(\n { _name: \"dT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"dS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n // UV params UBO — only when UVs are actually emitted.\n if (_needsUV) {\n _baseBindings.push({ _name: \"up\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_VERTEX });\n }\n if (_esmShadowOutput) {\n _baseBindings.push({ _name: \"shadowParams\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT });\n }\n // bump bindings are provided by the normal-map fragment (not baseBindings)\n // emissive, specular, ambient, lightmap, opacity, reflection bindings\n // are provided by their respective fragments (not baseBindings)\n\n // Shadow map bindings (group 2) are provided by std-shadow-fragment\n\n // ── Vertex template ─────────────────────────────────────────\n\n const uvPassthrough = _needsUV ? `out.vu = uv * up.u.xy + up.u.zw;` : \"\";\n\n const uv2Passthrough = _needsUV2 ? `out.vv = uv2;` : \"\";\n\n // Vertex UBO struct definitions (must be before binding declarations)\n const vertexUboStructs = _needsUV ? `struct upUniforms { u: vec4<f32>, }` : \"\";\n\n const _vertexTemplate = `/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${vertexUboStructs}\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>(position, 1.0);\nout.vp = worldPos4.xyz;\nlet normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\nout.vn = normalize(normalWorld * normal);\nout.clipPos = scene.viewProjection * worldPos4;\nout.vf = (scene.view * worldPos4).xyz;\n${uvPassthrough}\n${uv2Passthrough}\n/*VB*/\nreturn out;\n}`;\n\n // ── Fragment template ────────────────────────────────────────\n\n const lightsStructs = `\nstruct LightEntry { vLightData: vec4<f32>, vLightDiffuse: vec4<f32>, vLightSpecular: vec4<f32>, vLightDirection: vec4<f32> };\nstruct lightsUniforms { count: u32, _p0: u32, _p1: u32, _p2: u32, lights: array<LightEntry, ${MAX_LIGHTS}> };\n@group(0) @binding(1) var<uniform> lights: lightsUniforms;\n`;\n\n const materialStruct = `\nstruct matUniforms {\ndc: vec4<f32>,\nsc: vec4<f32>,\nec: vec3<f32>,\nbs: f32,\nac: vec3<f32>,\ntl: f32,\nambTexLvl: f32,\nlmLvl: f32,\nopLvl: f32,\naCut: f32,\nrLvl: f32,\nrCm: f32,\n_0: f32,\n_1: f32,\n};\n`;\n\n const helpers = _disableLighting ? WGSL_FOG : WGSL_FOG + LIGHTING_FN;\n // reflection, shadow, bump helpers are provided by their respective fragments\n\n // Main fragment body — mirrors old composeFragmentShader exactly\n const doubleSidedEntry = `@fragment fn main(input: FragmentInput)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`;\n\n // View direction\n const viewDirCode = !_disableLighting ? `let viewDirectionW = normalize(scene.vEyePosition.xyz - input.vp);` : \"\";\n\n // Normal computation — fragment can override via AC slot\n const normalCode = _disableLighting ? \"\" : `var normalW = normalize(input.vn);`;\n\n // Opacity — default from material alpha, fragment can modify via AT\n const opacityCode = `var alpha = mat.dc.a;`;\n\n // Base color + alpha test. Texture alpha used for discard only (not blended into output alpha),\n // matching BJS ALPHATEST without ALPHAFROMDIFFUSE.\n const baseColorCode = _diffuse\n ? `let _ds = textureSample(dT, dS, ${_diffuseUsesUV2 ? \"input.vv\" : \"input.vu\"});\nif (_ds.a < mat.aCut) { discard; }\nvar baseColor = _ds.rgb * mat.tl;`\n : `var baseColor = vec3<f32>(1.0, 1.0, 1.0);`;\n\n // Diffuse color + emissive + specular — defaults, fragments can override via AT\n const diffuseColorCode = `let diffuseColor = mat.dc.rgb;`;\n const emissiveCode = `var emissiveContrib = mat.ec;`;\n const specularColorCode = !_disableLighting ? `var specularColor = mat.sc.rgb;` : \"\";\n // Lighting block (only when lighting enabled)\n let lightingBlock: string;\n if (!_disableLighting) {\n // Shadow — default to 1.0, fragment overrides via AD slot\n // shadowFactors array is populated by std-shadow-fragment (one per light index)\n lightingBlock = `var glossiness = mat.sc.a;\nvar diffuseBase = vec3<f32>(0.0);\nvar specularBase = vec3<f32>(0.0);\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nvar baseAmbientColor = vec3<f32>(1.0, 1.0, 1.0);\nvar reflectionColor = vec3<f32>(0.0);\nlet lc = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AD*/\nfor (var li = 0u; li < lc; li++) {\nlet lightIndex = mli(li);\nlet r = computeLighting(viewDirectionW, normalW, lights.lights[lightIndex], glossiness, input.vp);\nlet sf = shadowFactors[lightIndex];\ndiffuseBase += r[0] * sf;\nspecularBase += r[1] * sf;\n}\nlet finalDiffuse = clamp(diffuseBase * diffuseColor + emissiveContrib + mat.ac, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor;\nlet finalSpecular = specularBase * specularColor;\nvar color = vec4<f32>(finalDiffuse * baseAmbientColor + finalSpecular + reflectionColor, alpha);`;\n } else {\n lightingBlock = `var color = vec4<f32>(clamp(emissiveContrib * diffuseColor, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor, alpha);`;\n }\n\n const _fragmentTemplate = `/*SU*/\n${lightsStructs}\n${materialStruct}\n${_esmShadowOutput ? \"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }\" : \"\"}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${!_disableLighting ? meshLightIndexWGSL(\"mesh\") : \"\"}\n${helpers}\n/*HF*/\n/*FB*/\n/*FI*/\n${doubleSidedEntry}\n/*SV*/\n${viewDirCode}\n${normalCode}\n/*AC*/\n${opacityCode}\n${baseColorCode}\n${diffuseColorCode}\n${emissiveCode}\n${specularColorCode}\n/*AT*/\n${_noColorOutput ? \"return;\" : _esmShadowOutput ? esmShadowDepthCode : \"\"}\n${lightingBlock}\n/*BC*/\ncolor = vec4<f32>(max(color.rgb, vec3<f32>(0.0)), color.a);\nif (scene.vFogInfos.x > 0.0) {\nlet fog = calcFogFactor(input.vf);\ncolor = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\n}\n/*BA*/\n${_noColorOutput ? \"\" : \"return color;\"}\n}`;\n\n return {\n _vertexTemplate,\n _fragmentTemplate,\n _baseMeshUboFields,\n _baseVertexAttributes,\n _baseVaryings,\n _baseBindings,\n };\n}\n","/** Dynamic StandardMaterial pipeline builder — creates and caches GPU render\n * pipelines based on per-material feature flags.\n *\n * Feature flags (bitmask):\n * HAS_DIFFUSE_TEXTURE — diffuse texture sampling + UV attribute\n * HAS_EMISSIVE_TEXTURE — emissive texture sampling + UV attribute\n * Derived flag (computed automatically):\n * NEEDS_UV = HAS_DIFFUSE_TEXTURE | HAS_EMISSIVE_TEXTURE\n *\n * Pipelines are cached per (features, format, msaaSamples) tuple.\n * Shared scene UBO layout is identical across all variants (176 bytes). */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _standardFeatureKey } from \"./standard-material.js\";\nimport { getSceneBindGroupLayout, clearSceneBGLCache } from \"../../render/scene-helpers.js\";\nimport { createStandardTemplate } from \"./standard-template.js\";\nimport { composeShader } from \"../../shader/shader-composer.js\";\nimport type { ComposedShader, ShaderFragment } from \"../../shader/fragment-types.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { REVERSE_DEPTH_COMPARE, targetSignatureKey } from \"../../engine/render-target.js\";\nimport {\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_DIFFUSE_TEXTURE,\n HAS_OPACITY_TEXTURE,\n MATERIAL_ALPHA_BLEND,\n NEEDS_UV,\n NEEDS_UV2,\n NO_COLOR_OUTPUT,\n ESM_SHADOW_OUTPUT,\n _getStdExtsSorted,\n} from \"./standard-flags.js\";\nimport { MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n// ─── Composer Path (Phase 1) ────────────────────────────────────────\n// Converts feature bitmask → StandardTemplateConfig → ComposedShader.\n// This produces identical WGSL to the old string-builder path but via\n// the generic composer, enabling fragment-based extensions in Phase 2.\n\n/** Compose Standard shader via the generic ShaderComposer.\n * @param fragments - Optional extra fragments (e.g. thin-instance). */\nexport function composeStandardShader(features: number, _meshFeatures = 0, fragments: ShaderFragment[] = [], esmShadowDepthCode = \"\"): ComposedShader {\n const has = (bit: number) => (features & bit) !== 0;\n const template = createStandardTemplate(\n {\n _diffuse: has(HAS_DIFFUSE_TEXTURE),\n _needsUV: has(NEEDS_UV),\n _needsUV2: has(NEEDS_UV2),\n _diffuseUsesUV2: has(DIFFUSE_USES_UV2),\n _disableLighting: has(DISABLE_LIGHTING),\n _noColorOutput: has(NO_COLOR_OUTPUT),\n _esmShadowOutput: has(ESM_SHADOW_OUTPUT),\n },\n esmShadowDepthCode\n );\n return composeShader(template, fragments);\n}\n\n// ─── Shader Bindings (sig-independent) ──────────────────────────────\n\n/** Cached per-(features, fragments) shader bindings: BGLs + composed shader +\n * per-sig pipeline cache. Created once at renderable build time, shared across\n * all sig-specific pipelines. */\nexport interface StandardShaderBindings {\n /** @internal */\n _features: number;\n /** @internal */\n _meshFeatures: number;\n /** @internal */\n _meshBGL: GPUBindGroupLayout;\n /** @internal */\n _shadowBGL: GPUBindGroupLayout | null;\n /** @internal */\n _composed: ComposedShader;\n /** @internal Per-sig pipeline cache. Key = `targetSignatureKey(sig)`. */\n _pipelines: Map<string, GPURenderPipeline>;\n}\n\n// ─── Caches ─────────────────────────────────────────────────────────\n\n/** Per-(features:fk) shader bindings cache (sig-independent). */\nconst _bindingsCache = new Map<string, StandardShaderBindings>();\nlet _composedCache: Map<string, ComposedShader> | null = null;\nlet _cachedDevice: GPUDevice | null = null;\n\nfunction getComposedCache(): Map<string, ComposedShader> {\n if (!_composedCache) {\n _composedCache = new Map();\n }\n return _composedCache;\n}\n\nfunction ensureDevice(engine: EngineContext): void {\n if (_cachedDevice !== engine._device) {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = engine._device;\n }\n}\n\n/** Clear the pipeline cache. Must be called when a GPU device is destroyed. */\nexport function clearStandardPipelineCache(): void {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = null;\n}\n\n/** Get-or-build the sig-independent shader bindings for a given feature/fragment set.\n * Used at renderable build time so per-mesh bind groups can be created BEFORE the\n * first bind() call (when sig is known). */\nexport function getOrCreateStandardBindings(\n engine: EngineContext,\n features: number,\n meshFeatures: number,\n fragments: ShaderFragment[] = [],\n shaderKey = \"\",\n esmShadowDepthCode = \"\"\n): StandardShaderBindings {\n ensureDevice(engine);\n const key = _standardFeatureKey(features, meshFeatures, shaderKey);\n const cached = _bindingsCache.get(key);\n if (cached) {\n return cached;\n }\n\n const cc = getComposedCache();\n let composed = cc.get(key);\n if (!composed) {\n composed = composeStandardShader(features, meshFeatures, fragments, esmShadowDepthCode);\n cc.set(key, composed);\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n let shadowBGL: GPUBindGroupLayout | null = null;\n const hasShadow = (meshFeatures & MSH_RECEIVE_SHADOWS) !== 0;\n if (hasShadow && composed._shadowBGLDescriptor) {\n shadowBGL = device.createBindGroupLayout(composed._shadowBGLDescriptor);\n }\n\n const bindings: StandardShaderBindings = {\n _features: features,\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 a sig-specific pipeline on top of a shader bindings. Called at bind() time. */\nexport function getOrCreateStandardPipeline(engine: EngineContext, sig: RenderTargetSignature, bindings: StandardShaderBindings): 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 composed = bindings._composed;\n const features = bindings._features;\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 = (features & NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n const fragModule = !sig._colorFormat && !noColorOutput ? null : device.createShaderModule({ code: composed._fragmentWGSL });\n\n const needsBlend = !esmShadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || (features & MATERIAL_ALPHA_BLEND) !== 0);\n const colorTarget: GPUColorTargetState | null = noColorOutput\n ? null\n : needsBlend\n ? {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }\n : { format: sig._colorFormat! };\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: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n depthWriteEnabled: noColorOutput || esmShadowOutput || !needsBlend,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: features & DOUBLE_SIDED ? \"none\" : \"back\", frontFace: \"ccw\" },\n });\n\n bindings._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Per-Mesh GPU Setup ─────────────────────────────────────────────\n\n/** Build the per-mesh material bind group (group 1). The mesh UBO\n * and material UBO are created/owned by the caller — this\n * function only assembles the bind group entries that match the composer's\n * binding layout.\n *\n * Mirrors `createPbrMeshBindGroup` in pbr-pipeline.ts. */\nexport function createStandardMeshBindGroup(\n engine: EngineContext,\n bindings: StandardShaderBindings,\n meshUBO: GPUBuffer,\n materialUBO: GPUBuffer,\n material: StandardMaterialProps\n): GPUBindGroup {\n const device = engine._device;\n const features = bindings._features;\n const needsUV = (features & NEEDS_UV) !== 0;\n const hasDiffuseTex = (features & HAS_DIFFUSE_TEXTURE) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n\n // Sequential numbering matches composer output.\n let nextBinding = 0;\n const entries: GPUBindGroupEntry[] = [\n { binding: nextBinding++, resource: { buffer: meshUBO } },\n { binding: nextBinding++, resource: { buffer: materialUBO } },\n ];\n\n if (hasDiffuseTex) {\n const tex = material.diffuseTexture!;\n entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });\n }\n\n // UV params UBO (only when UVs are actually emitted).\n if (needsUV) {\n const uvData = new F32(4);\n const scaleX = material.uvScale[0];\n let scaleY = material.uvScale[1];\n let offsetY = 0;\n // Flip V for y-down source data (e.g. basis/compressed textures).\n // uv * (sx, sy) + (ox, oy) with vFlip becomes uv.xy * (sx, -sy) + (ox, sy+oy).\n if (material.diffuseTexture?.invertY) {\n offsetY = scaleY;\n scaleY = -scaleY;\n }\n uvData[0] = scaleX;\n uvData[1] = scaleY;\n uvData[2] = 0;\n uvData[3] = offsetY;\n entries.push({ binding: nextBinding++, resource: { buffer: createUniformBuffer(engine, uvData) } });\n }\n\n if (esmShadowOutput) {\n entries.push({\n binding: nextBinding++,\n resource: { buffer: (material as StandardMaterialProps & { readonly _esmShadowParamsUBO: GPUBuffer })._esmShadowParamsUBO },\n });\n }\n\n // Fragment-contributed bindings — iterate ext registry in alphabetical id order\n // to match composer's fragment sort order.\n const sortedExts = _getStdExtsSorted();\n for (const ext of sortedExts) {\n if (features & ext._feature && ext._bind) {\n nextBinding = ext._bind(material, entries, nextBinding);\n }\n }\n\n return device.createBindGroup({ layout: bindings._meshBGL, entries });\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────\n\n/** Write standard material properties into a pre-allocated Float32Array (24 floats). */\nexport function writeStdMaterialData(data: Float32Array, mat: StandardMaterialProps, textureLevel: number): void {\n const { diffuseColor: dc, specularColor: sc, emissiveColor: ec, ambientColor: ac } = mat;\n data[0] = dc[0];\n data[1] = dc[1];\n data[2] = dc[2];\n data[3] = mat.alpha;\n data[4] = sc[0];\n data[5] = sc[1];\n data[6] = sc[2];\n data[7] = mat.specularPower;\n data[8] = ec[0];\n data[9] = ec[1];\n data[10] = ec[2];\n data[11] = 1.0 / mat.bumpLevel;\n data[12] = ac[0];\n data[13] = ac[1];\n data[14] = ac[2];\n data[15] = textureLevel;\n data[16] = mat.ambientTexLevel;\n data[17] = mat.lightmapLevel;\n data[18] = mat.opacityLevel;\n data[19] = mat.alphaCutOff;\n data[20] = mat.reflectionLevel;\n data[21] = mat.reflectionCoordMode;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as clearStandardPipelineCache, g as getOrCreateStandardBindings, w as writeStdMaterialData, a as createStandardMeshBindGroup, b as getOrCreateStandardPipeline } from "./standard-pipeline-
|
|
1
|
+
import { as as clearSamplerCache, at as _computeStandardMaterialFeatures, au as _computeMeshFeatures, av as _getStdExts, Q as ESM_SHADOW_OUTPUT, a as F32, p as packMat4IntoF32, b as writeMeshLightSelection, aw as createUniformBuffer, an as HAS_OPACITY_TEXTURE, ax as collectStdBoundTextures, ay as acquireTexture, az as releaseTexture, aA as NO_COLOR_OUTPUT, aB as NEEDS_UV, aC as MSH_HAS_INSTANCE_COLOR, aD as NEEDS_UV2, aE as MSH_HAS_THIN_INSTANCES, aF as MSH_RECEIVE_SHADOWS, aG as _standardShaderVariantKey } from "./index-C-tEgwbZ.js";
|
|
2
|
+
import { c as clearStandardPipelineCache, g as getOrCreateStandardBindings, w as writeStdMaterialData, a as createStandardMeshBindGroup, b as getOrCreateStandardPipeline } from "./standard-pipeline-BvFynkwL.js";
|
|
3
3
|
const _stdMatScratch = new F32(24);
|
|
4
4
|
function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
5
5
|
const engine = scene.surface.engine;
|
|
@@ -188,4 +188,4 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
188
188
|
export {
|
|
189
189
|
buildStandardMeshRenderables
|
|
190
190
|
};
|
|
191
|
-
//# sourceMappingURL=standard-renderable-
|
|
191
|
+
//# sourceMappingURL=standard-renderable-1Q3zemys.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-renderable-CREWLNHI.js","sources":["../src/material/standard/standard-renderable.ts"],"sourcesContent":["/** Standard mesh renderable — builds Renderables from Mesh + StandardMaterial.\n *\n * `buildStandardMeshRenderables` does shared per-scene setup, then delegates\n * per-mesh work to `buildSingleStandardRenderable`. The same single-mesh\n * function is reused by the material-swap path. */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { Renderable, MeshGroupBuildResult } from \"../../render/renderable.js\";\nimport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _computeStandardMaterialFeatures, _standardShaderVariantKey } from \"./standard-material.js\";\nimport { acquireTexture, releaseTexture, clearSamplerCache } from \"../../resource/gpu-pool.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getOrCreateStandardBindings, getOrCreateStandardPipeline, createStandardMeshBindGroup, clearStandardPipelineCache, writeStdMaterialData } from \"./standard-pipeline.js\";\nimport { ESM_SHADOW_OUTPUT, NO_COLOR_OUTPUT, NEEDS_UV, NEEDS_UV2, HAS_OPACITY_TEXTURE, _getStdExts } from \"./standard-flags.js\";\nimport type { ShaderFragment } from \"../../shader/fragment-types.js\";\nimport type { ShadowGenerator } from \"../../shadow/shadow-generator.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { Material, MaterialRenderFeatures } from \"../material.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\n\n/** Scratch buffer for material UBO writes (24 floats = 96 bytes). Reused across\n * every Standard renderable since binding updates are single-threaded per frame. */\nconst _stdMatScratch = new F32(24);\n\n/** Thin instance GPU sync callback type — loaded dynamically only when needed. */\ntype ThinInstanceSync = (\n engine: EngineContext,\n ti: any,\n pass: GPURenderPassEncoder | GPURenderBundleEncoder,\n slot: number,\n hasColor: boolean,\n drawBuffers?: import(\"../../mesh/thin-instance-gpu.js\").ThinInstanceDrawBuffers | null\n) => number;\n\n/** Fragment factories passed from the async group builder. */\nexport interface StdFragmentFactories {\n tiSync?: ThinInstanceSync;\n tiFragment?: (hasColor: boolean) => ShaderFragment;\n shadowFragment?: (shadowLights: import(\"./fragments/std-shadow-fragment.js\").ShadowLightSlot[]) => ShaderFragment;\n /** Present only when the scene has at least one culling-enabled thin-instance mesh. */\n cull?: typeof import(\"../../mesh/thin-instance-cull-binding.js\");\n}\n\n/** Build Renderable(s) + a SceneUniformUpdater for a set of standard meshes.\n * The `rebuildSingle` closure is reused later (via `_rebuildSingle` on the group\n * builder) for material swaps + per-pass material overrides. */\nexport function buildStandardMeshRenderables(scene: SceneContext, meshes: Mesh[], factories: StdFragmentFactories): MeshGroupBuildResult {\n const engine = scene.surface.engine;\n const device = engine._device;\n const { tiSync, tiFragment, shadowFragment, cull } = factories;\n\n // Collect per-light shadow info.\n const shadowLights: { lightIndex: number; shadowType: \"esm\" | \"pcf\" | \"csm\"; 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\n // All receiving meshes in this build share the same shadow generators,\n // so keying the shadow BG by `bindings._shadowBGL` alone is correct.\n const shadowBGCache = new Map<GPUBindGroupLayout, GPUBindGroup>();\n // Closure used both for the initial per-mesh build below AND for later\n // material-swap / per-pass-override rebuilds (set on standardGroupBuilder._rebuildSingle).\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const mat = (materialOverride ?? mesh.material) as StandardMaterialProps;\n const renderFeatures = (mat._renderFeatures ??= { features: _computeStandardMaterialFeatures(mat) }) as MaterialRenderFeatures;\n const isOverride = materialOverride != null;\n const features = renderFeatures.features;\n const shadowOutput = (features & (NO_COLOR_OUTPUT | ESM_SHADOW_OUTPUT)) !== 0;\n const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n // Build per-feature fragment list (deduped via pipeline cache).\n const frags: ShaderFragment[] = [];\n for (const ext of _getStdExts().values()) {\n if (features & ext._feature) {\n const f = ext._frag(features);\n if (f) {\n frags.push(f);\n }\n }\n }\n let shaderKey = \"\";\n if (meshFeatures & MSH_RECEIVE_SHADOWS && shadowFragment) {\n const slots = shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));\n shaderKey = _standardShaderVariantKey(slots);\n frags.push(shadowFragment(slots));\n }\n if (meshFeatures & MSH_HAS_THIN_INSTANCES && tiFragment) {\n const hasColor = !!(meshFeatures & MSH_HAS_INSTANCE_COLOR);\n const tiFrag = tiFragment(hasColor);\n if (hasColor) {\n // Standard applies instance color to final color (BC), not to baseColor (AT) like PBR.\n const { _fragmentSlots: _fragmentSlots, ...rest } = tiFrag;\n frags.push({\n ...rest,\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`,\n },\n });\n } else {\n frags.push(tiFrag);\n }\n }\n const esmShadowDepthCode = (features & ESM_SHADOW_OUTPUT) !== 0 ? (mat as StandardMaterialProps & { readonly _esmShadowDepthCode: string })._esmShadowDepthCode : \"\";\n const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);\n\n const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];\n\n const meshUboData = new F32(bindings._composed._meshUboSpec._totalBytes / 4);\n const _packMeshWorld = engine._makePackMeshWorld?.(s as SceneContext) ?? packMat4IntoF32;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n const textureLevel = (features & NEEDS_UV) !== 0 ? 1.0 : 0;\n const matData = new F32(24);\n writeStdMaterialData(matData, mat, textureLevel);\n const materialUBO = createUniformBuffer(engine, matData);\n const meshBindGroup = createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat);\n\n // Shadow bind group (group 2) — shared across receiving meshes via shadowBGCache.\n let shadowBindGroup: GPUBindGroup | null = null;\n if (meshShadowGens.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 sg of meshShadowGens) {\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 needsUV = (features & NEEDS_UV) !== 0;\n const needsUV2 = (features & NEEDS_UV2) !== 0;\n const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n const isTransparent = !shadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || mat.alpha < 1);\n\n const boundTextures = collectStdBoundTextures(mat);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n s._meshDisposables.set(mesh, [\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n let _lastWorldVersion = mesh.worldMatrixVersion;\n let _lastLightsCount = s.lights.length;\n const sortCenter = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number];\n const _baseUpdate = (): void => {\n const worldVersion = mesh.worldMatrixVersion;\n if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 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 _stdMatScratch.fill(0);\n writeStdMaterialData(_stdMatScratch, mat, textureLevel);\n device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);\n }\n };\n // FO-version wrapper applied only when the engine has floating-origin\n // on. The wrapper lives in the dynamic-imported `floating-origin.ts`\n // module and is the sole owner of `_lastFoVersion` tracking. For\n // non-LWR engines `_wrapRenderableForFO` is undefined and `update`\n // is the bare closure — no FO bytes in the closure body.\n const _invalidate = (): void => {\n _lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, s as SceneContext, _invalidate) ?? _baseUpdate;\n\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder, cullBinding?: import(\"../../mesh/thin-instance-cull-binding.js\").TiCullBinding): number => {\n // For per-pass material overrides, skip the mesh.material === mat guard\n // because the override material is intentionally not the mesh's current one.\n if (!isOverride && mesh.material !== mat) {\n return 0;\n }\n const g = mesh._gpu;\n let slot = 0;\n const vb = g._vbLayout;\n pass.setVertexBuffer(slot++, g.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, g.normalBuffer, vb?._n?._offset);\n if (needsUV) {\n pass.setVertexBuffer(slot++, g.uvBuffer, vb?._u?._offset);\n }\n if (needsUV2 && g.uv2Buffer) {\n pass.setVertexBuffer(slot++, g.uv2Buffer, vb?._u2?._offset);\n }\n\n const ti = hasThinInstances ? mesh.thinInstances : null;\n if (ti && tiSync) {\n slot = tiSync(engine, ti, pass, slot, hasInstanceColor, cullBinding?.cullDrawBufs);\n }\n\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, meshBindGroup);\n if (receiveShadows && shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n if (cullBinding) {\n cullBinding.draw(pass, g.indexCount, ti!.count);\n } else if (ti && ti.count > 0) {\n pass.drawIndexed(g.indexCount, ti.count);\n } else {\n pass.drawIndexed(g.indexCount);\n }\n return 1;\n };\n\n const r: Renderable = {\n order: mesh.renderOrder ?? (isTransparent ? 200 : 100),\n isTransparent,\n mesh,\n bind(eng, sig) {\n const pipeline = getOrCreateStandardPipeline(eng as EngineContext, sig, bindings);\n // Opaque-only GPU culling (opt-in): tryBind gates on opt-in + transparency, returns the per-binding cull lifecycle.\n const cb = cull?.tryBind(r, s, mesh, engine, hasInstanceColor, isTransparent, update);\n return {\n renderable: r,\n pipeline,\n update: cb ? cb.update : update,\n draw: (pass) => draw(pass, cb),\n };\n },\n };\n r._worldCenter = sortCenter;\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 () => clearStandardPipelineCache(),\n () => clearSamplerCache(engine)\n );\n\n return { renderables, rebuildSingle };\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"standard-renderable-1Q3zemys.js","sources":["../src/material/standard/standard-renderable.ts"],"sourcesContent":["/** Standard mesh renderable — builds Renderables from Mesh + StandardMaterial.\n *\n * `buildStandardMeshRenderables` does shared per-scene setup, then delegates\n * per-mesh work to `buildSingleStandardRenderable`. The same single-mesh\n * function is reused by the material-swap path. */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { Renderable, MeshGroupBuildResult } from \"../../render/renderable.js\";\nimport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _computeStandardMaterialFeatures, _standardShaderVariantKey } from \"./standard-material.js\";\nimport { acquireTexture, releaseTexture, clearSamplerCache } from \"../../resource/gpu-pool.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getOrCreateStandardBindings, getOrCreateStandardPipeline, createStandardMeshBindGroup, clearStandardPipelineCache, writeStdMaterialData } from \"./standard-pipeline.js\";\nimport { ESM_SHADOW_OUTPUT, NO_COLOR_OUTPUT, NEEDS_UV, NEEDS_UV2, HAS_OPACITY_TEXTURE, _getStdExts } from \"./standard-flags.js\";\nimport type { ShaderFragment } from \"../../shader/fragment-types.js\";\nimport type { ShadowGenerator } from \"../../shadow/shadow-generator.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { Material, MaterialRenderFeatures } from \"../material.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\n\n/** Scratch buffer for material UBO writes (24 floats = 96 bytes). Reused across\n * every Standard renderable since binding updates are single-threaded per frame. */\nconst _stdMatScratch = new F32(24);\n\n/** Thin instance GPU sync callback type — loaded dynamically only when needed. */\ntype ThinInstanceSync = (\n engine: EngineContext,\n ti: any,\n pass: GPURenderPassEncoder | GPURenderBundleEncoder,\n slot: number,\n hasColor: boolean,\n drawBuffers?: import(\"../../mesh/thin-instance-gpu.js\").ThinInstanceDrawBuffers | null\n) => number;\n\n/** Fragment factories passed from the async group builder. */\nexport interface StdFragmentFactories {\n tiSync?: ThinInstanceSync;\n tiFragment?: (hasColor: boolean) => ShaderFragment;\n shadowFragment?: (shadowLights: import(\"./fragments/std-shadow-fragment.js\").ShadowLightSlot[]) => ShaderFragment;\n /** Present only when the scene has at least one culling-enabled thin-instance mesh. */\n cull?: typeof import(\"../../mesh/thin-instance-cull-binding.js\");\n}\n\n/** Build Renderable(s) + a SceneUniformUpdater for a set of standard meshes.\n * The `rebuildSingle` closure is reused later (via `_rebuildSingle` on the group\n * builder) for material swaps + per-pass material overrides. */\nexport function buildStandardMeshRenderables(scene: SceneContext, meshes: Mesh[], factories: StdFragmentFactories): MeshGroupBuildResult {\n const engine = scene.surface.engine;\n const device = engine._device;\n const { tiSync, tiFragment, shadowFragment, cull } = factories;\n\n // Collect per-light shadow info.\n const shadowLights: { lightIndex: number; shadowType: \"esm\" | \"pcf\" | \"csm\"; 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\n // All receiving meshes in this build share the same shadow generators,\n // so keying the shadow BG by `bindings._shadowBGL` alone is correct.\n const shadowBGCache = new Map<GPUBindGroupLayout, GPUBindGroup>();\n // Closure used both for the initial per-mesh build below AND for later\n // material-swap / per-pass-override rebuilds (set on standardGroupBuilder._rebuildSingle).\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const mat = (materialOverride ?? mesh.material) as StandardMaterialProps;\n const renderFeatures = (mat._renderFeatures ??= { features: _computeStandardMaterialFeatures(mat) }) as MaterialRenderFeatures;\n const isOverride = materialOverride != null;\n const features = renderFeatures.features;\n const shadowOutput = (features & (NO_COLOR_OUTPUT | ESM_SHADOW_OUTPUT)) !== 0;\n const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n // Build per-feature fragment list (deduped via pipeline cache).\n const frags: ShaderFragment[] = [];\n for (const ext of _getStdExts().values()) {\n if (features & ext._feature) {\n const f = ext._frag(features);\n if (f) {\n frags.push(f);\n }\n }\n }\n let shaderKey = \"\";\n if (meshFeatures & MSH_RECEIVE_SHADOWS && shadowFragment) {\n const slots = shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));\n shaderKey = _standardShaderVariantKey(slots);\n frags.push(shadowFragment(slots));\n }\n if (meshFeatures & MSH_HAS_THIN_INSTANCES && tiFragment) {\n const hasColor = !!(meshFeatures & MSH_HAS_INSTANCE_COLOR);\n const tiFrag = tiFragment(hasColor);\n if (hasColor) {\n // Standard applies instance color to final color (BC), not to baseColor (AT) like PBR.\n const { _fragmentSlots: _fragmentSlots, ...rest } = tiFrag;\n frags.push({\n ...rest,\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`,\n },\n });\n } else {\n frags.push(tiFrag);\n }\n }\n const esmShadowDepthCode = (features & ESM_SHADOW_OUTPUT) !== 0 ? (mat as StandardMaterialProps & { readonly _esmShadowDepthCode: string })._esmShadowDepthCode : \"\";\n const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);\n\n const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];\n\n const meshUboData = new F32(bindings._composed._meshUboSpec._totalBytes / 4);\n const _packMeshWorld = engine._makePackMeshWorld?.(s as SceneContext) ?? packMat4IntoF32;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n const textureLevel = (features & NEEDS_UV) !== 0 ? 1.0 : 0;\n const matData = new F32(24);\n writeStdMaterialData(matData, mat, textureLevel);\n const materialUBO = createUniformBuffer(engine, matData);\n const meshBindGroup = createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat);\n\n // Shadow bind group (group 2) — shared across receiving meshes via shadowBGCache.\n let shadowBindGroup: GPUBindGroup | null = null;\n if (meshShadowGens.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 sg of meshShadowGens) {\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 needsUV = (features & NEEDS_UV) !== 0;\n const needsUV2 = (features & NEEDS_UV2) !== 0;\n const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n const isTransparent = !shadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || mat.alpha < 1);\n\n const boundTextures = collectStdBoundTextures(mat);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n s._meshDisposables.set(mesh, [\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n let _lastWorldVersion = mesh.worldMatrixVersion;\n let _lastLightsCount = s.lights.length;\n const sortCenter = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number];\n const _baseUpdate = (): void => {\n const worldVersion = mesh.worldMatrixVersion;\n if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 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 _stdMatScratch.fill(0);\n writeStdMaterialData(_stdMatScratch, mat, textureLevel);\n device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);\n }\n };\n // FO-version wrapper applied only when the engine has floating-origin\n // on. The wrapper lives in the dynamic-imported `floating-origin.ts`\n // module and is the sole owner of `_lastFoVersion` tracking. For\n // non-LWR engines `_wrapRenderableForFO` is undefined and `update`\n // is the bare closure — no FO bytes in the closure body.\n const _invalidate = (): void => {\n _lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, s as SceneContext, _invalidate) ?? _baseUpdate;\n\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder, cullBinding?: import(\"../../mesh/thin-instance-cull-binding.js\").TiCullBinding): number => {\n // For per-pass material overrides, skip the mesh.material === mat guard\n // because the override material is intentionally not the mesh's current one.\n if (!isOverride && mesh.material !== mat) {\n return 0;\n }\n const g = mesh._gpu;\n let slot = 0;\n const vb = g._vbLayout;\n pass.setVertexBuffer(slot++, g.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, g.normalBuffer, vb?._n?._offset);\n if (needsUV) {\n pass.setVertexBuffer(slot++, g.uvBuffer, vb?._u?._offset);\n }\n if (needsUV2 && g.uv2Buffer) {\n pass.setVertexBuffer(slot++, g.uv2Buffer, vb?._u2?._offset);\n }\n\n const ti = hasThinInstances ? mesh.thinInstances : null;\n if (ti && tiSync) {\n slot = tiSync(engine, ti, pass, slot, hasInstanceColor, cullBinding?.cullDrawBufs);\n }\n\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, meshBindGroup);\n if (receiveShadows && shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n if (cullBinding) {\n cullBinding.draw(pass, g.indexCount, ti!.count);\n } else if (ti && ti.count > 0) {\n pass.drawIndexed(g.indexCount, ti.count);\n } else {\n pass.drawIndexed(g.indexCount);\n }\n return 1;\n };\n\n const r: Renderable = {\n order: mesh.renderOrder ?? (isTransparent ? 200 : 100),\n isTransparent,\n mesh,\n bind(eng, sig) {\n const pipeline = getOrCreateStandardPipeline(eng as EngineContext, sig, bindings);\n // Opaque-only GPU culling (opt-in): tryBind gates on opt-in + transparency, returns the per-binding cull lifecycle.\n const cb = cull?.tryBind(r, s, mesh, engine, hasInstanceColor, isTransparent, update);\n return {\n renderable: r,\n pipeline,\n update: cb ? cb.update : update,\n draw: (pass) => draw(pass, cb),\n };\n },\n };\n r._worldCenter = sortCenter;\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 () => clearStandardPipelineCache(),\n () => clearSamplerCache(engine)\n );\n\n return { renderables, rebuildSingle };\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aj as HAS_AMBIENT_TEXTURE, ak as AMBIENT_USES_UV2 } from "./index-C-tEgwbZ.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdAmbientFragment(usesUV2) {
|
|
4
4
|
const uv = usesUV2 ? "input.vv" : "input.vu";
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdAmbientFragment,
|
|
35
35
|
stdAmbientExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-ambient-fragment-
|
|
37
|
+
//# sourceMappingURL=std-ambient-fragment-__F1KTEu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-ambient-fragment-
|
|
1
|
+
{"version":3,"file":"std-ambient-fragment-__F1KTEu.js","sources":["../src/material/standard/fragments/std-ambient-fragment.ts"],"sourcesContent":["/** Standard Ambient Texture Fragment — multiplies final diffuse by ambient occlusion texture. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_AMBIENT_TEXTURE, AMBIENT_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdAmbientFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-ambient\",\n _bindings: [\n { _name: \"aT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"aS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AD: `baseAmbientColor = textureSample(aT, aS, ${uv}).rgb * mat.ambTexLvl;`,\n },\n };\n}\n\nexport const stdAmbientExt: StdExt = {\n _id: \"std-ambient\",\n _phase: \"mesh\",\n _feature: HAS_AMBIENT_TEXTURE,\n _frag: (features) => createStdAmbientFragment((features & AMBIENT_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.ambientTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.ambientTexture) {\n out.push(mat.ambientTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,yBAAyB,SAAkC;AACvE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI,4CAA4C,EAAE;AAAA,IAAA;AAAA,EACtD;AAER;AAEO,MAAM,gBAAwB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,0BAA0B,WAAW,sBAAsB,CAAC;AAAA,EACjF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,gBAAgB;AACpB,UAAI,KAAK,IAAI,cAAc;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
|
package/{std-cube-reflection-fragment-y9WWdXUt.js → std-cube-reflection-fragment-DidM0byH.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aq as HAS_CUBE_REFLECTION } from "./index-C-tEgwbZ.js";
|
|
2
2
|
function createStdCubeReflectionFragment() {
|
|
3
3
|
return {
|
|
4
4
|
_id: "std-cube-reflection",
|
|
@@ -28,4 +28,4 @@ export {
|
|
|
28
28
|
createStdCubeReflectionFragment,
|
|
29
29
|
stdCubeReflectionExt
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=std-cube-reflection-fragment-
|
|
31
|
+
//# sourceMappingURL=std-cube-reflection-fragment-DidM0byH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-cube-reflection-fragment-
|
|
1
|
+
{"version":3,"file":"std-cube-reflection-fragment-DidM0byH.js","sources":["../src/material/standard/fragments/std-cube-reflection-fragment.ts"],"sourcesContent":["/** Cube reflection fragment — dynamically imported for scenes with cube reflection textures. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_CUBE_REFLECTION } from \"../standard-flags.js\";\n\nexport function createStdCubeReflectionFragment(): ShaderFragment {\n return {\n _id: \"std-cube-reflection\",\n _bindings: [\n { _name: \"cRT\", _type: { _kind: \"texture\", _textureType: \"texture_cube<f32>\" }, _visibility: 0x2 },\n { _name: \"cRS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: 0x2 },\n ],\n _fragmentSlots: {\n AD: `{let v=normalize(input.vp-scene.vEyePosition.xyz);reflectionColor=textureSample(cRT,cRS,reflect(v,normalW)).rgb*mat.rLvl;}`,\n },\n };\n}\n\nexport const stdCubeReflectionExt: StdExt = {\n _id: \"std-cube-reflection\",\n _phase: \"mesh\",\n _feature: HAS_CUBE_REFLECTION,\n _frag: createStdCubeReflectionFragment,\n _bind(mat, entries, b) {\n const cube = mat.reflectionCubeTexture!;\n entries.push({ binding: b++, resource: cube.view });\n entries.push({ binding: b++, resource: cube.sampler });\n return b;\n },\n // Cube textures are tracked separately; no Texture2D[] contribution.\n};\n"],"names":[],"mappings":";AAKO,SAAS,kCAAkD;AAC9D,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW,cAAc,oBAAA,GAAuB,aAAa,EAAA;AAAA,MAC7F,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,EAAA;AAAA,IAAI;AAAA,IAE3F,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,uBAA+B;AAAA,EACxC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,OAAO,IAAI;AACjB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,MAAM;AAClD,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,SAAS;AACrD,WAAO;AAAA,EACX;AAAA;AAEJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { af as HAS_EMISSIVE_TEXTURE, ag as HAS_DEPTH_EMISSIVE_TEXTURE } from "./index-C-tEgwbZ.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdEmissiveFragment(depthTexture) {
|
|
4
4
|
return {
|
|
@@ -37,4 +37,4 @@ export {
|
|
|
37
37
|
createStdEmissiveFragment,
|
|
38
38
|
stdEmissiveExt
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=std-emissive-fragment-
|
|
40
|
+
//# sourceMappingURL=std-emissive-fragment-Bj62X4Np.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-emissive-fragment-
|
|
1
|
+
{"version":3,"file":"std-emissive-fragment-Bj62X4Np.js","sources":["../src/material/standard/fragments/std-emissive-fragment.ts"],"sourcesContent":["/** Standard Emissive Texture Fragment — multiplies emissive contribution by texture sample. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_DEPTH_EMISSIVE_TEXTURE, HAS_EMISSIVE_TEXTURE } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdEmissiveFragment(depthTexture: boolean): ShaderFragment {\n return {\n _id: \"std-emissive\",\n _bindings: [\n {\n _name: \"eT\",\n _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\", _sampleType: depthTexture ? \"unfilterable-float\" : undefined },\n _visibility: STAGE_FRAGMENT,\n },\n { _name: \"eS\", _type: { _kind: \"sampler\", _samplerType: depthTexture ? \"sampler_non_filtering\" : \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: `emissiveContrib = mat.ec + textureSample(eT, eS, input.vu).rgb * mat.tl;`,\n },\n };\n}\n\nexport const stdEmissiveExt: StdExt = {\n _id: \"std-emissive\",\n _phase: \"mesh\",\n _feature: HAS_EMISSIVE_TEXTURE,\n _frag: (features) => createStdEmissiveFragment((features & HAS_DEPTH_EMISSIVE_TEXTURE) !== 0),\n _bind(mat: StandardMaterialProps, entries: GPUBindGroupEntry[], b: number): number {\n const tex = mat.emissiveTexture!;\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.emissiveTexture) {\n out.push(mat.emissiveTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,cAAuC;AAC7E,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP;AAAA,QACI,OAAO;AAAA,QACP,OAAO,EAAE,OAAO,WAAW,cAAc,mBAAmB,aAAa,eAAe,uBAAuB,OAAA;AAAA,QAC/G,aAAa;AAAA,MAAA;AAAA,MAEjB,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,eAAe,0BAA0B,UAAA,GAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAE9I,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,gCAAgC,CAAC;AAAA,EAC5F,MAAM,KAA4B,SAA8B,GAAmB;AAC/E,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,MAAM;AACjD,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { al as HAS_LIGHTMAP_TEXTURE, am as LIGHTMAP_USES_UV2 } from "./index-C-tEgwbZ.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdLightmapFragment(usesUV2) {
|
|
4
4
|
const uv = usesUV2 ? "input.vv" : "input.vu";
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdLightmapFragment,
|
|
35
35
|
stdLightmapExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-lightmap-fragment-
|
|
37
|
+
//# sourceMappingURL=std-lightmap-fragment-DXvfWvKc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-lightmap-fragment-
|
|
1
|
+
{"version":3,"file":"std-lightmap-fragment-DXvfWvKc.js","sources":["../src/material/standard/fragments/std-lightmap-fragment.ts"],"sourcesContent":["/** Standard Lightmap Fragment — additively blends lightmap into final color. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_LIGHTMAP_TEXTURE, LIGHTMAP_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdLightmapFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-lightmap\",\n _bindings: [\n { _name: \"lT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"lS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb + textureSample(lT, lS, ${uv}).rgb * mat.lmLvl, color.a);`,\n },\n };\n}\n\nexport const stdLightmapExt: StdExt = {\n _id: \"std-lightmap\",\n _phase: \"mesh\",\n _feature: HAS_LIGHTMAP_TEXTURE,\n _frag: (features) => createStdLightmapFragment((features & LIGHTMAP_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.lightmapTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.lightmapTexture) {\n out.push(mat.lightmapTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,SAAkC;AACxE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI,uDAAuD,EAAE;AAAA,IAAA;AAAA,EACjE;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,uBAAuB,CAAC;AAAA,EACnF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { an as HAS_OPACITY_TEXTURE, ao as OPACITY_FROM_RGB } from "./index-C-tEgwbZ.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdOpacityFragment(fromRGB) {
|
|
4
4
|
const opacityCalc = fromRGB ? `{ let opSample = textureSample(oT, oS, input.vu); alpha *= dot(opSample.rgb, vec3<f32>(0.3, 0.59, 0.11)) * mat.opLvl; }` : `alpha *= textureSample(oT, oS, input.vu).a * mat.opLvl;`;
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdOpacityFragment,
|
|
35
35
|
stdOpacityExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-opacity-fragment-
|
|
37
|
+
//# sourceMappingURL=std-opacity-fragment-BzMMb1K_.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-opacity-fragment-
|
|
1
|
+
{"version":3,"file":"std-opacity-fragment-BzMMb1K_.js","sources":["../src/material/standard/fragments/std-opacity-fragment.ts"],"sourcesContent":["/** Standard Opacity Texture Fragment — modulates alpha by opacity texture. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_OPACITY_TEXTURE, OPACITY_FROM_RGB } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdOpacityFragment(fromRGB: boolean): ShaderFragment {\n const opacityCalc = fromRGB\n ? `{ let opSample = textureSample(oT, oS, input.vu); alpha *= dot(opSample.rgb, vec3<f32>(0.3, 0.59, 0.11)) * mat.opLvl; }`\n : `alpha *= textureSample(oT, oS, input.vu).a * mat.opLvl;`;\n return {\n _id: \"std-opacity\",\n _bindings: [\n { _name: \"oT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"oS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: opacityCalc,\n },\n };\n}\n\nexport const stdOpacityExt: StdExt = {\n _id: \"std-opacity\",\n _phase: \"mesh\",\n _feature: HAS_OPACITY_TEXTURE,\n _frag: (features) => createStdOpacityFragment((features & OPACITY_FROM_RGB) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.opacityTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.opacityTexture) {\n out.push(mat.opacityTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,yBAAyB,SAAkC;AACvE,QAAM,cAAc,UACd,4HACA;AACN,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,gBAAwB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,0BAA0B,WAAW,sBAAsB,CAAC;AAAA,EACjF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,gBAAgB;AACpB,UAAI,KAAK,IAAI,cAAc;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ap as HAS_REFLECTION_TEXTURE } from "./index-C-tEgwbZ.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
const REFLECTION_HELPERS = `
|
|
4
4
|
fn computeSphericalCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {
|
|
@@ -54,4 +54,4 @@ export {
|
|
|
54
54
|
createStdReflectionFragment,
|
|
55
55
|
stdReflectionExt
|
|
56
56
|
};
|
|
57
|
-
//# sourceMappingURL=std-reflection-fragment-
|
|
57
|
+
//# sourceMappingURL=std-reflection-fragment-DC9Kvu1C.js.map
|