@babylonjs/lite 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +51 -0
- package/THIRD_PARTY_NOTICES.txt +318 -0
- package/{_mat4-storage-f64-CjDoht2w.js → _mat4-storage-f64-WeexU-hd.js} +2 -2
- package/{_mat4-storage-f64-CjDoht2w.js.map → _mat4-storage-f64-WeexU-hd.js.map} +1 -1
- package/{alpha-test-fragment-B7DjSnF7.js → alpha-test-fragment-x2mnjLgC.js} +2 -2
- package/{alpha-test-fragment-B7DjSnF7.js.map → alpha-test-fragment-x2mnjLgC.js.map} +1 -1
- package/{background-dds-skybox-BEX309u3.js → background-dds-skybox-BpcDr-9c.js} +3 -3
- package/{background-dds-skybox-BEX309u3.js.map → background-dds-skybox-BpcDr-9c.js.map} +1 -1
- package/{background-ground-BU0HOcM4.js → background-ground-Bm6gjWqx.js} +2 -2
- package/{background-ground-BU0HOcM4.js.map → background-ground-Bm6gjWqx.js.map} +1 -1
- package/{background-hdr-skybox--RRRic_K.js → background-hdr-skybox-CSFo8RX6.js} +3 -3
- package/{background-hdr-skybox--RRRic_K.js.map → background-hdr-skybox-CSFo8RX6.js.map} +1 -1
- package/{background-solid-skybox-BrH2fXSu.js → background-solid-skybox-DOOBeDIz.js} +2 -2
- package/{background-solid-skybox-BrH2fXSu.js.map → background-solid-skybox-DOOBeDIz.js.map} +1 -1
- package/{billboard-renderable-BHWryAeC.js → billboard-renderable-IJfCpeDS.js} +2 -2
- package/{billboard-renderable-BHWryAeC.js.map → billboard-renderable-IJfCpeDS.js.map} +1 -1
- package/{clamp-block-DqbwnQGW.js → clamp-block-BD_t8I89.js} +2 -2
- package/{clamp-block-DqbwnQGW.js.map → clamp-block-BD_t8I89.js.map} +1 -1
- package/{clearcoat-fragment-D6FSCie1.js → clearcoat-fragment-Dj7vGX2u.js} +2 -2
- package/{clearcoat-fragment-D6FSCie1.js.map → clearcoat-fragment-Dj7vGX2u.js.map} +1 -1
- package/{create-skeleton-D_uplboC.js → create-skeleton-s0hjrC3A.js} +2 -2
- package/{create-skeleton-D_uplboC.js.map → create-skeleton-s0hjrC3A.js.map} +1 -1
- package/{cubemap-skybox-material-DQcMMdf-.js → cubemap-skybox-material-8lzbgi7K.js} +2 -2
- package/{cubemap-skybox-material-DQcMMdf-.js.map → cubemap-skybox-material-8lzbgi7K.js.map} +1 -1
- package/{curve-block-21rT0JjG.js → curve-block-Ditr4R7V.js} +2 -2
- package/{curve-block-21rT0JjG.js.map → curve-block-Ditr4R7V.js.map} +1 -1
- package/{emissive-fragment-C5FtBs3y.js → emissive-fragment-BOAezkfk.js} +2 -2
- package/{emissive-fragment-C5FtBs3y.js.map → emissive-fragment-BOAezkfk.js.map} +1 -1
- package/{esm-shadow-view-c5YV4Eg9.js → esm-shadow-view-DRpyRAfa.js} +2 -2
- package/{esm-shadow-view-c5YV4Eg9.js.map → esm-shadow-view-DRpyRAfa.js.map} +1 -1
- package/{esm-shadow-view-Gtd1LWRP.js → esm-shadow-view-DmIORQGZ.js} +2 -2
- package/{esm-shadow-view-Gtd1LWRP.js.map → esm-shadow-view-DmIORQGZ.js.map} +1 -1
- package/{esm-shadow-view-Cl3rPGof.js → esm-shadow-view-JCPaOOi7.js} +2 -2
- package/{esm-shadow-view-Cl3rPGof.js.map → esm-shadow-view-JCPaOOi7.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-7J31V23x.js → gaussian-splatting-pipeline-sh-B30Mu56i.js} +2 -2
- package/{gaussian-splatting-pipeline-sh-7J31V23x.js.map → gaussian-splatting-pipeline-sh-B30Mu56i.js.map} +1 -1
- package/{geometry-texture-output-dXk4E9uu.js → geometry-texture-output-DURiaJ_n.js} +2 -2
- package/{geometry-texture-output-dXk4E9uu.js.map → geometry-texture-output-DURiaJ_n.js.map} +1 -1
- package/{geometry-view-BsFJpBJa.js → geometry-view-DRrscyWU.js} +4 -4
- package/{geometry-view-BsFJpBJa.js.map → geometry-view-DRrscyWU.js.map} +1 -1
- package/{gltf-animation-K_zZxj_d.js → gltf-animation-BjnXkop6.js} +2 -2
- package/{gltf-animation-K_zZxj_d.js.map → gltf-animation-BjnXkop6.js.map} +1 -1
- package/{gltf-ext-basisu-CDbPclzZ.js → gltf-ext-basisu-DtzVV1Xx.js} +2 -202
- package/gltf-ext-basisu-DtzVV1Xx.js.map +1 -0
- package/{gltf-ext-node-visibility-DXCJEYr6.js → gltf-ext-node-visibility-BhX0DmiP.js} +2 -2
- package/{gltf-ext-node-visibility-DXCJEYr6.js.map → gltf-ext-node-visibility-BhX0DmiP.js.map} +1 -1
- package/{gltf-ext-quantization-CvHI_0Vg.js → gltf-ext-quantization-DaymajCR.js} +2 -2
- package/{gltf-ext-quantization-CvHI_0Vg.js.map → gltf-ext-quantization-DaymajCR.js.map} +1 -1
- package/{gltf-ext-uv-transform-DgYazJBs.js → gltf-ext-uv-transform-DFmNJ8kA.js} +2 -2
- package/{gltf-ext-uv-transform-DgYazJBs.js.map → gltf-ext-uv-transform-DFmNJ8kA.js.map} +1 -1
- package/{gltf-feature-animation-pointer-D1RJRFBw.js → gltf-feature-animation-pointer-C40tqOhL.js} +3 -3
- package/{gltf-feature-animation-pointer-D1RJRFBw.js.map → gltf-feature-animation-pointer-C40tqOhL.js.map} +1 -1
- package/{gltf-feature-animations-Cmc1uoIu.js → gltf-feature-animations-v0S_yb4T.js} +2 -2
- package/{gltf-feature-animations-Cmc1uoIu.js.map → gltf-feature-animations-v0S_yb4T.js.map} +1 -1
- package/{gltf-feature-draco-CKKzT5E3.js → gltf-feature-draco-CljWrsna.js} +2 -2
- package/{gltf-feature-draco-CKKzT5E3.js.map → gltf-feature-draco-CljWrsna.js.map} +1 -1
- package/{gltf-feature-gpu-instancing-n87SO6Vh.js → gltf-feature-gpu-instancing-BoeSm6Tn.js} +2 -2
- package/{gltf-feature-gpu-instancing-n87SO6Vh.js.map → gltf-feature-gpu-instancing-BoeSm6Tn.js.map} +1 -1
- package/{gltf-feature-lights-punctual-Ckm3ciL8.js → gltf-feature-lights-punctual-BCTwgyi_.js} +5 -5
- package/{gltf-feature-lights-punctual-Ckm3ciL8.js.map → gltf-feature-lights-punctual-BCTwgyi_.js.map} +1 -1
- package/{gltf-feature-meshopt-DLC4SF1E.js → gltf-feature-meshopt-DItMkOMt.js} +2 -2
- package/{gltf-feature-meshopt-DLC4SF1E.js.map → gltf-feature-meshopt-DItMkOMt.js.map} +1 -1
- package/{gltf-feature-morph-Cjtu7hYa.js → gltf-feature-morph-Cv0mEYIq.js} +3 -3
- package/{gltf-feature-morph-Cjtu7hYa.js.map → gltf-feature-morph-Cv0mEYIq.js.map} +1 -1
- package/{gltf-feature-registry-C63Hjp9w.js → gltf-feature-registry-wNbt6UC-.js} +15 -15
- package/{gltf-feature-registry-C63Hjp9w.js.map → gltf-feature-registry-wNbt6UC-.js.map} +1 -1
- package/{gltf-feature-skeleton-DKbOGidp.js → gltf-feature-skeleton-Deh2UBAn.js} +3 -3
- package/{gltf-feature-skeleton-DKbOGidp.js.map → gltf-feature-skeleton-Deh2UBAn.js.map} +1 -1
- package/{gltf-feature-variants-Cmzu0O0e.js → gltf-feature-variants-DGSdFNJq.js} +2 -2
- package/{gltf-feature-variants-Cmzu0O0e.js.map → gltf-feature-variants-DGSdFNJq.js.map} +1 -1
- package/{gltf-glb-parser-Cj5MHS-v.js → gltf-glb-parser-DSQWsT4r.js} +2 -2
- package/{gltf-glb-parser-Cj5MHS-v.js.map → gltf-glb-parser-DSQWsT4r.js.map} +1 -1
- package/{gltf-interleave-gHf9_t0i.js → gltf-interleave-OBqmlu-h.js} +11 -5
- package/gltf-interleave-OBqmlu-h.js.map +1 -0
- package/{gltf-normals-b2h74380.js → gltf-normals-D_P0KA4b.js} +10 -2
- package/gltf-normals-D_P0KA4b.js.map +1 -0
- package/{gltf-pbr-builder-ext-edNcjwPf.js → gltf-pbr-builder-ext-3imk8Tev.js} +2 -2
- package/{gltf-pbr-builder-ext-edNcjwPf.js.map → gltf-pbr-builder-ext-3imk8Tev.js.map} +1 -1
- package/{gltf-variants-CPxNdtP4.js → gltf-variants-Dyr54wwg.js} +4 -4
- package/{gltf-variants-CPxNdtP4.js.map → gltf-variants-Dyr54wwg.js.map} +1 -1
- package/gpu-task-timer-DVBNZfq5.js +236 -0
- package/gpu-task-timer-DVBNZfq5.js.map +1 -0
- package/gpu-timer-CUpqT_hK.js +55 -0
- package/gpu-timer-CUpqT_hK.js.map +1 -0
- package/{gs-picking-pipeline-DYaW_Lg3.js → gs-picking-pipeline-CERN-Trj.js} +2 -2
- package/{gs-picking-pipeline-DYaW_Lg3.js.map → gs-picking-pipeline-CERN-Trj.js.map} +1 -1
- package/{havok-floating-origin-Dr-18Nds.js → havok-floating-origin-VVdJRUYc.js} +2 -2
- package/{havok-floating-origin-Dr-18Nds.js.map → havok-floating-origin-VVdJRUYc.js.map} +1 -1
- package/{index-CYZDclhF.js → index-7Bk-uLSM.js} +2 -2
- package/{index-CYZDclhF.js.map → index-7Bk-uLSM.js.map} +1 -1
- package/{index-CLElg2Bo.js → index-BgY3QEzL.js} +4774 -1276
- package/index-BgY3QEzL.js.map +1 -0
- package/{index-SMJ67XwT.js → index-Dr5LK2tg.js} +2 -2
- package/{index-SMJ67XwT.js.map → index-Dr5LK2tg.js.map} +1 -1
- package/index.d.ts +1047 -13
- package/index.js +508 -444
- package/{input-block-DqEedWF2.js → input-block-DjdlndCL.js} +2 -2
- package/{input-block-DqEedWF2.js.map → input-block-DjdlndCL.js.map} +1 -1
- package/{iridescence-fragment-BHU59-gQ.js → iridescence-fragment-kfsCs8lN.js} +2 -2
- package/{iridescence-fragment-BHU59-gQ.js.map → iridescence-fragment-kfsCs8lN.js.map} +1 -1
- package/{light-block-Bv37V8vl.js → light-block-qjCrz3de.js} +2 -2
- package/{light-block-Bv37V8vl.js.map → light-block-qjCrz3de.js.map} +1 -1
- package/{loop-block-qTg8vb99.js → loop-block-C8vkQ2bz.js} +2 -2
- package/{loop-block-qTg8vb99.js.map → loop-block-C8vkQ2bz.js.map} +1 -1
- package/{manifold-AS8POaOr.js → manifold-DeXMNgxT.js} +3 -3
- package/{manifold-AS8POaOr.js.map → manifold-DeXMNgxT.js.map} +1 -1
- package/{morph-fragment-BRCUr2wQ.js → morph-fragment-NpZYyIIU.js} +2 -2
- package/{morph-fragment-BRCUr2wQ.js.map → morph-fragment-NpZYyIIU.js.map} +1 -1
- package/{multilight-wgsl-DMeppAdZ.js → multilight-wgsl-I5SncF0q.js} +2 -2
- package/{multilight-wgsl-DMeppAdZ.js.map → multilight-wgsl-I5SncF0q.js.map} +1 -1
- package/{node-env-Bc559GmY.js → node-env-D7Aee08u.js} +2 -2
- package/{node-env-Bc559GmY.js.map → node-env-D7Aee08u.js.map} +1 -1
- package/{node-geometry-view-COmWsRXK.js → node-geometry-view-DfKXWNfV.js} +3 -3
- package/{node-geometry-view-COmWsRXK.js.map → node-geometry-view-DfKXWNfV.js.map} +1 -1
- package/{node-registry-extra-compat-dWrv7gpS.js → node-registry-extra-compat-CDLeBR1P.js} +2 -2
- package/{node-registry-extra-compat-dWrv7gpS.js.map → node-registry-extra-compat-CDLeBR1P.js.map} +1 -1
- package/{node-registry-extra-math-Bn854sX9.js → node-registry-extra-math-BA8_l4lB.js} +2 -2
- package/{node-registry-extra-math-Bn854sX9.js.map → node-registry-extra-math-BA8_l4lB.js.map} +1 -1
- package/{node-renderable-B5G8WcdH.js → node-renderable-EwLLnaL1.js} +2 -2
- package/{node-renderable-B5G8WcdH.js.map → node-renderable-EwLLnaL1.js.map} +1 -1
- package/{node-shadow-CVIUlNf0.js → node-shadow-CeTmT6g4.js} +2 -2
- package/{node-shadow-CVIUlNf0.js.map → node-shadow-CeTmT6g4.js.map} +1 -1
- package/{normal-map-fragment-CQSxhjCy.js → normal-map-fragment-BHImLyM-.js} +2 -2
- package/{normal-map-fragment-CQSxhjCy.js.map → normal-map-fragment-BHImLyM-.js.map} +1 -1
- package/package.json +10 -3
- package/{parse-camera-pBRT_6i5.js → parse-camera-5IGdctAS.js} +2 -2
- package/{parse-camera-pBRT_6i5.js.map → parse-camera-5IGdctAS.js.map} +1 -1
- package/{pbr-geometry-view-NiZY_juX.js → pbr-geometry-view-Dthf9Aut.js} +3 -3
- package/{pbr-geometry-view-NiZY_juX.js.map → pbr-geometry-view-Dthf9Aut.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-Ta9lR2cz.js → pbr-metallic-roughness-block-full-DD6zI_Lx.js} +2 -2
- package/{pbr-metallic-roughness-block-full-Ta9lR2cz.js.map → pbr-metallic-roughness-block-full-DD6zI_Lx.js.map} +1 -1
- package/{pbr-metallic-roughness-block-JBSi-tQN.js → pbr-metallic-roughness-block-g7wjzwN_.js} +2 -2
- package/{pbr-metallic-roughness-block-JBSi-tQN.js.map → pbr-metallic-roughness-block-g7wjzwN_.js.map} +1 -1
- package/{pbr-mr-helper-core-BVWNR08D.js → pbr-mr-helper-core-CWROQ7OA.js} +2 -2
- package/{pbr-mr-helper-core-BVWNR08D.js.map → pbr-mr-helper-core-CWROQ7OA.js.map} +1 -1
- package/{pbr-refraction-C9FvFmAp.js → pbr-refraction-Dxsm_gii.js} +2 -2
- package/{pbr-refraction-C9FvFmAp.js.map → pbr-refraction-Dxsm_gii.js.map} +1 -1
- package/{pbr-renderable-DzUF2QIk.js → pbr-renderable-CuKWalEM.js} +22 -22
- package/{pbr-renderable-DzUF2QIk.js.map → pbr-renderable-CuKWalEM.js.map} +1 -1
- package/{pbr-shadow-fragment-CnqnbGYS.js → pbr-shadow-fragment-waeIBQUq.js} +2 -2
- package/{pbr-shadow-fragment-CnqnbGYS.js.map → pbr-shadow-fragment-waeIBQUq.js.map} +1 -1
- package/{pbr-tracking-3tU1kqea.js → pbr-tracking-CdeqbBrh.js} +2 -2
- package/{pbr-tracking-3tU1kqea.js.map → pbr-tracking-CdeqbBrh.js.map} +1 -1
- package/{pbr-transmission-ext-BcLjRxfB.js → pbr-transmission-ext-BNiXngZc.js} +2 -2
- package/{pbr-transmission-ext-BcLjRxfB.js.map → pbr-transmission-ext-BNiXngZc.js.map} +1 -1
- package/{recast-navigation.wasm-DG_0AFuk.js → recast-navigation.wasm-VC4lGlEe.js} +3 -3
- package/{recast-navigation.wasm-DG_0AFuk.js.map → recast-navigation.wasm-VC4lGlEe.js.map} +1 -1
- package/{recast-navigation.wasm-compat-C-Bf2ylB.js → recast-navigation.wasm-compat-CTwYOzRz.js} +3 -3
- package/{recast-navigation.wasm-compat-C-Bf2ylB.js.map → recast-navigation.wasm-compat-CTwYOzRz.js.map} +1 -1
- package/{reflectance-fragment-Dbpgw3Jt.js → reflectance-fragment-BQFZ_pgy.js} +2 -2
- package/{reflectance-fragment-Dbpgw3Jt.js.map → reflectance-fragment-BQFZ_pgy.js.map} +1 -1
- package/{rgbd-decode-DoyUquy3.js → rgbd-decode-duTlXMWd.js} +2 -2
- package/{rgbd-decode-DoyUquy3.js.map → rgbd-decode-duTlXMWd.js.map} +1 -1
- package/{scene-material-swap-nNUH4nGn.js → scene-material-swap-4qM0tpBK.js} +1 -2
- package/scene-material-swap-4qM0tpBK.js.map +1 -0
- package/{screenshot-readback-D0Sj9qq3.js → screenshot-readback-DnxR4rhp.js} +2 -2
- package/{screenshot-readback-D0Sj9qq3.js.map → screenshot-readback-DnxR4rhp.js.map} +1 -1
- package/{shader-composer-BUD_pSX4.js → shader-composer-CBy2i8nU.js} +2 -2
- package/{shader-composer-BUD_pSX4.js.map → shader-composer-CBy2i8nU.js.map} +1 -1
- package/{shader-renderable-D7-RyVxa.js → shader-renderable-DVMVD6zP.js} +41 -9
- package/shader-renderable-DVMVD6zP.js.map +1 -0
- package/{shader-thin-instance-DuBotxDO.js → shader-thin-instance-CsDo3ULk.js} +2 -2
- package/{shader-thin-instance-DuBotxDO.js.map → shader-thin-instance-CsDo3ULk.js.map} +1 -1
- package/{sheen-fragment-1MkEMcbc.js → sheen-fragment-B_Jd7wrr.js} +2 -2
- package/{sheen-fragment-1MkEMcbc.js.map → sheen-fragment-B_Jd7wrr.js.map} +1 -1
- package/{singlelight-directional-wgsl-BsV8G456.js → singlelight-directional-wgsl-Bw84txva.js} +2 -2
- package/{singlelight-directional-wgsl-BsV8G456.js.map → singlelight-directional-wgsl-Bw84txva.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-Bo0jKlW5.js → singlelight-hemispheric-wgsl-DjxhgI8r.js} +2 -2
- package/{singlelight-hemispheric-wgsl-Bo0jKlW5.js.map → singlelight-hemispheric-wgsl-DjxhgI8r.js.map} +1 -1
- package/{singlelight-point-wgsl-DV39UP5Y.js → singlelight-point-wgsl-iA1aRkXA.js} +2 -2
- package/{singlelight-point-wgsl-DV39UP5Y.js.map → singlelight-point-wgsl-iA1aRkXA.js.map} +1 -1
- package/{singlelight-spot-wgsl-yg3od6vL.js → singlelight-spot-wgsl-MDdTdstF.js} +2 -2
- package/{singlelight-spot-wgsl-yg3od6vL.js.map → singlelight-spot-wgsl-MDdTdstF.js.map} +1 -1
- package/{skeleton-fragment-DdxYG6kv.js → skeleton-fragment-COdHWFcK.js} +2 -2
- package/{skeleton-fragment-DdxYG6kv.js.map → skeleton-fragment-COdHWFcK.js.map} +1 -1
- package/{skybox-renderable-CJD4XmX5.js → skybox-renderable-DJYkfw32.js} +2 -2
- package/{skybox-renderable-CJD4XmX5.js.map → skybox-renderable-DJYkfw32.js.map} +1 -1
- package/{splat-ply-compressed-DHjyiVmI.js → splat-ply-compressed-SxMlsKNK.js} +2 -2
- package/{splat-ply-compressed-DHjyiVmI.js.map → splat-ply-compressed-SxMlsKNK.js.map} +1 -1
- package/{standard-pipeline-XTbHL7MY.js → standard-pipeline-DXFOUqU_.js} +3 -3
- package/{standard-pipeline-XTbHL7MY.js.map → standard-pipeline-DXFOUqU_.js.map} +1 -1
- package/{standard-renderable-CREWLNHI.js → standard-renderable-BAc-i-ig.js} +3 -3
- package/{standard-renderable-CREWLNHI.js.map → standard-renderable-BAc-i-ig.js.map} +1 -1
- package/{std-ambient-fragment-Bjx3VFrr.js → std-ambient-fragment-P8dHZ4An.js} +2 -2
- package/{std-ambient-fragment-Bjx3VFrr.js.map → std-ambient-fragment-P8dHZ4An.js.map} +1 -1
- package/{std-cube-reflection-fragment-y9WWdXUt.js → std-cube-reflection-fragment-CF03MuQt.js} +2 -2
- package/{std-cube-reflection-fragment-y9WWdXUt.js.map → std-cube-reflection-fragment-CF03MuQt.js.map} +1 -1
- package/{std-emissive-fragment-C8Lnmojh.js → std-emissive-fragment-P8yJGclx.js} +2 -2
- package/{std-emissive-fragment-C8Lnmojh.js.map → std-emissive-fragment-P8yJGclx.js.map} +1 -1
- package/{std-lightmap-fragment-DFxGcoA5.js → std-lightmap-fragment-CymEG79z.js} +9 -6
- package/std-lightmap-fragment-CymEG79z.js.map +1 -0
- package/{std-opacity-fragment-EXzFWiSp.js → std-opacity-fragment-DLa1zV06.js} +2 -2
- package/{std-opacity-fragment-EXzFWiSp.js.map → std-opacity-fragment-DLa1zV06.js.map} +1 -1
- package/{std-reflection-fragment-BoJORqpG.js → std-reflection-fragment-BLySsYos.js} +2 -2
- package/{std-reflection-fragment-BoJORqpG.js.map → std-reflection-fragment-BLySsYos.js.map} +1 -1
- package/{std-shadow-fragment-Bq-Wc8UJ.js → std-shadow-fragment-C_q27Mdi.js} +2 -2
- package/{std-shadow-fragment-Bq-Wc8UJ.js.map → std-shadow-fragment-C_q27Mdi.js.map} +1 -1
- package/{std-specular-fragment-CM5R5j2g.js → std-specular-fragment-CaBXyAWY.js} +2 -2
- package/{std-specular-fragment-CM5R5j2g.js.map → std-specular-fragment-CaBXyAWY.js.map} +1 -1
- package/{std-tracking-Cif_wXeT.js → std-tracking-Bw61Dv98.js} +2 -2
- package/{std-tracking-Cif_wXeT.js.map → std-tracking-Bw61Dv98.js.map} +1 -1
- package/{subsurface-fragment-BEaAXYXz.js → subsurface-fragment-BNQoG9gr.js} +2 -2
- package/{subsurface-fragment-BEaAXYXz.js.map → subsurface-fragment-BNQoG9gr.js.map} +1 -1
- package/{thin-instance-cull-binding-DWKUt5ZN.js → thin-instance-cull-binding-BNC5JiGw.js} +3 -3
- package/{thin-instance-cull-binding-DWKUt5ZN.js.map → thin-instance-cull-binding-BNC5JiGw.js.map} +1 -1
- package/{thin-instance-gpu-BDdRcNAh.js → thin-instance-gpu-C1DGstap.js} +2 -2
- package/{thin-instance-gpu-BDdRcNAh.js.map → thin-instance-gpu-C1DGstap.js.map} +1 -1
- package/{tracking-primitives-CglRNTlX.js → tracking-primitives-CMBWLxGr.js} +2 -2
- package/{tracking-primitives-CglRNTlX.js.map → tracking-primitives-CMBWLxGr.js.map} +1 -1
- package/{unlit-fragment-kxfZWlnp.js → unlit-fragment-BsHrS9XX.js} +2 -2
- package/{unlit-fragment-kxfZWlnp.js.map → unlit-fragment-BsHrS9XX.js.map} +1 -1
- package/gltf-ext-basisu-CDbPclzZ.js.map +0 -1
- package/gltf-interleave-gHf9_t0i.js.map +0 -1
- package/gltf-normals-b2h74380.js.map +0 -1
- package/index-CLElg2Bo.js.map +0 -1
- package/scene-material-swap-nNUH4nGn.js.map +0 -1
- package/shader-renderable-D7-RyVxa.js.map +0 -1
- package/std-lightmap-fragment-DFxGcoA5.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as TU, U as U32,
|
|
1
|
+
import { T as TU, U as U32, k as createMappedBuffer, B as BU } from "./index-BgY3QEzL.js";
|
|
2
2
|
function createSkeleton(engine, joints, weights, boneCount, boneData, joints1, weights1) {
|
|
3
3
|
const device = engine._device;
|
|
4
4
|
const texWidth = boneCount * 4;
|
|
@@ -41,4 +41,4 @@ function createSkeleton(engine, joints, weights, boneCount, boneData, joints1, w
|
|
|
41
41
|
export {
|
|
42
42
|
createSkeleton
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=create-skeleton-
|
|
44
|
+
//# sourceMappingURL=create-skeleton-s0hjrC3A.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-skeleton-
|
|
1
|
+
{"version":3,"file":"create-skeleton-s0hjrC3A.js","sources":["../src/skeleton/create-skeleton.ts"],"sourcesContent":["/** Skeleton GPU resource factory.\n *\n * Dynamically imported by load-gltf.ts when a mesh has skeletal data.\n * Scenes without skeletons never import this module.\n * Skinning WGSL is now provided by the skeleton ShaderFragment\n * (shader/fragments/skeleton-fragment.ts) and composed at pipeline\n * creation time — no global registration needed. */\n\nimport { U32 } from \"../engine/typed-arrays.js\";\nimport { TU, BU } from \"../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\nimport type { SkeletonData } from \"../animation/types.js\";\nimport { createMappedBuffer } from \"../resource/gpu-buffers.js\";\n\n/** Create skeleton GPU data from parsed glTF skin.\n * @param engine - Engine context (provides GPUDevice)\n * @param joints - Joint indices (4 per vertex, u8 or u16)\n * @param weights - Blend weights (4 per vertex, f32)\n * @param boneCount - Number of bones (joints) in the skeleton\n * @param boneData - Initial bone matrices (Float32Array, 16 floats per bone)\n * @param joints1 - Extra joint indices for 8-bone skinning (JOINTS_1)\n * @param weights1 - Extra blend weights for 8-bone skinning (WEIGHTS_1)\n */\nexport function createSkeleton(\n engine: EngineContext,\n joints: Uint16Array | Uint8Array,\n weights: Float32Array,\n boneCount: number,\n boneData: Float32Array,\n joints1?: Uint16Array | Uint8Array | null,\n weights1?: Float32Array | null\n): SkeletonData {\n const device = engine._device;\n // Bone texture: rgba32float, 4 texels per bone (one mat4 column each)\n const texWidth = boneCount * 4;\n const boneTexture = device.createTexture({\n size: [texWidth, 1],\n format: \"rgba32float\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n device.queue.writeTexture({ texture: boneTexture }, boneData.buffer, { bytesPerRow: texWidth * 16 }, { width: texWidth, height: 1 });\n\n // Expand joints to Uint32Array — pipeline reads uint32x4 vertex format\n const joints32 = new U32(joints.length);\n for (let i = 0; i < joints.length; i++) {\n joints32[i] = joints[i]!;\n }\n\n const jointsBuffer = createMappedBuffer(engine, joints32, BU.VERTEX);\n const weightsBuffer = createMappedBuffer(engine, weights, BU.VERTEX);\n\n let joints1Buffer: GPUBuffer | null = null;\n let weights1Buffer: GPUBuffer | null = null;\n if (joints1 && weights1) {\n const joints132 = new U32(joints1.length);\n for (let i = 0; i < joints1.length; i++) {\n joints132[i] = joints1[i]!;\n }\n joints1Buffer = createMappedBuffer(engine, joints132, BU.VERTEX);\n weights1Buffer = createMappedBuffer(engine, weights1, BU.VERTEX);\n }\n\n return {\n boneTexture,\n boneCount,\n jointsBuffer,\n weightsBuffer,\n joints,\n weights,\n boneMatrices: boneData,\n joints1Buffer,\n weights1Buffer,\n joints1: joints1 ?? null,\n weights1: weights1 ?? null,\n };\n}\n"],"names":[],"mappings":";AAuBO,SAAS,eACZ,QACA,QACA,SACA,WACA,UACA,SACA,UACY;AACZ,QAAM,SAAS,OAAO;AAEtB,QAAM,WAAW,YAAY;AAC7B,QAAM,cAAc,OAAO,cAAc;AAAA,IACrC,MAAM,CAAC,UAAU,CAAC;AAAA,IAClB,QAAQ;AAAA,IACR,OAAO,GAAG,kBAAkB,GAAG;AAAA,EAAA,CAClC;AACD,SAAO,MAAM,aAAa,EAAE,SAAS,YAAA,GAAe,SAAS,QAAQ,EAAE,aAAa,WAAW,MAAM,EAAE,OAAO,UAAU,QAAQ,GAAG;AAGnI,QAAM,WAAW,IAAI,IAAI,OAAO,MAAM;AACtC,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACpC,aAAS,CAAC,IAAI,OAAO,CAAC;AAAA,EAC1B;AAEA,QAAM,eAAe,mBAAmB,QAAQ,UAAU,GAAG,MAAM;AACnE,QAAM,gBAAgB,mBAAmB,QAAQ,SAAS,GAAG,MAAM;AAEnE,MAAI,gBAAkC;AACtC,MAAI,iBAAmC;AACvC,MAAI,WAAW,UAAU;AACrB,UAAM,YAAY,IAAI,IAAI,QAAQ,MAAM;AACxC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,gBAAU,CAAC,IAAI,QAAQ,CAAC;AAAA,IAC5B;AACA,oBAAgB,mBAAmB,QAAQ,WAAW,GAAG,MAAM;AAC/D,qBAAiB,mBAAmB,QAAQ,UAAU,GAAG,MAAM;AAAA,EACnE;AAEA,SAAO;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS,WAAW;AAAA,IACpB,UAAU,YAAY;AAAA,EAAA;AAE9B;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { y as targetSignatureKey, z as createDefaultPipelineDescriptor, A as getSceneBindGroupLayout, S as SS } from "./index-BgY3QEzL.js";
|
|
2
2
|
const SKYBOX_POS_BUFFER = [{ arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: "float32x3" }] }];
|
|
3
3
|
const _cmPipelines = /* @__PURE__ */ new Map();
|
|
4
4
|
const _cmLayouts = /* @__PURE__ */ new Map();
|
|
@@ -75,4 +75,4 @@ function createCubemapSkyboxMaterial(label, vertCode, fragCode) {
|
|
|
75
75
|
export {
|
|
76
76
|
createCubemapSkyboxMaterial as c
|
|
77
77
|
};
|
|
78
|
-
//# sourceMappingURL=cubemap-skybox-material-
|
|
78
|
+
//# sourceMappingURL=cubemap-skybox-material-8lzbgi7K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cubemap-skybox-material-
|
|
1
|
+
{"version":3,"file":"cubemap-skybox-material-8lzbgi7K.js","sources":["../src/material/pbr/cubemap-skybox-material.ts"],"sourcesContent":["/** Shared cubemap skybox material factory — used by DDS and HDR skyboxes.\n * BGL: binding 0 = uniform buffer, binding 1 = cube texture, binding 2 = sampler. */\n\nimport { SS } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { createDefaultPipelineDescriptor, getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\n\nconst SKYBOX_POS_BUFFER: GPUVertexBufferLayout[] = [{ arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" as GPUVertexFormat }] }];\n\nexport interface CubemapSkyboxMaterial {\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n createBindGroup(engine: EngineContext, meshUBO: GPUBuffer, cubeView: GPUTextureView, cubeSampler: GPUSampler): GPUBindGroup;\n}\n\n/** Module-global pipeline + layout caches shared across all cubemap-skybox instances.\n * Keyed by `${label}|${sigKey}` so HDR and DDS variants don't collide. */\nconst _cmPipelines = new Map<string, GPURenderPipeline>();\nconst _cmLayouts = new Map<string, GPUBindGroupLayout>();\nlet _cmCachedDevice: GPUDevice | null = null;\n\nexport function createCubemapSkyboxMaterial(label: string, vertCode: string, fragCode: string): CubemapSkyboxMaterial {\n function getLayout(engine: EngineContext): GPUBindGroupLayout {\n const device = engine._device;\n if (_cmCachedDevice !== device) {\n _cmPipelines.clear();\n _cmLayouts.clear();\n _cmCachedDevice = device;\n }\n const cached = _cmLayouts.get(label);\n if (cached) {\n return cached;\n }\n const layout = device.createBindGroupLayout({\n label: `${label}-material`,\n entries: [\n { binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: 2, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } },\n ],\n });\n _cmLayouts.set(label, layout);\n return layout;\n }\n\n return {\n getPipeline(_engine, sig) {\n const device = _engine._device;\n if (_cmCachedDevice !== device) {\n _cmPipelines.clear();\n _cmLayouts.clear();\n _cmCachedDevice = device;\n }\n const key = `${label}|${targetSignatureKey(sig)}`;\n const cached = _cmPipelines.get(key);\n if (cached) {\n return cached;\n }\n const _vertModule = device.createShaderModule({ code: vertCode, label: `${label}-vert` });\n const _fragModule = device.createShaderModule({ code: fragCode, label: `${label}-frag` });\n\n const pipeline = device.createRenderPipeline(\n createDefaultPipelineDescriptor({\n _label: `${label}-pipeline`,\n _engine,\n _bgls: [getSceneBindGroupLayout(_engine), getLayout(_engine)],\n _vertModule,\n _fragModule,\n _vertexBuffers: SKYBOX_POS_BUFFER,\n _format: sig._colorFormat!,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare,\n _msaaSamples: sig._sampleCount,\n _depthWriteEnabled: false,\n })\n );\n _cmPipelines.set(key, pipeline);\n return pipeline;\n },\n\n createBindGroup(engine, meshUBO, cubeView, cubeSampler) {\n const device = engine._device;\n return device.createBindGroup({\n layout: getLayout(engine),\n entries: [\n { binding: 0, resource: { buffer: meshUBO } },\n { binding: 1, resource: cubeView },\n { binding: 2, resource: cubeSampler },\n ],\n });\n },\n };\n}\n"],"names":[],"mappings":";AASA,MAAM,oBAA6C,CAAC,EAAE,aAAa,IAAI,YAAY,CAAC,EAAE,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,YAAA,CAAgC,GAAG;AAS/J,MAAM,mCAAmB,IAAA;AACzB,MAAM,iCAAiB,IAAA;AACvB,IAAI,kBAAoC;AAEjC,SAAS,4BAA4B,OAAe,UAAkB,UAAyC;AAClH,WAAS,UAAU,QAA2C;AAC1D,UAAM,SAAS,OAAO;AACtB,QAAI,oBAAoB,QAAQ;AAC5B,mBAAa,MAAA;AACb,iBAAW,MAAA;AACX,wBAAkB;AAAA,IACtB;AACA,UAAM,SAAS,WAAW,IAAI,KAAK;AACnC,QAAI,QAAQ;AACR,aAAO;AAAA,IACX;AACA,UAAM,SAAS,OAAO,sBAAsB;AAAA,MACxC,OAAO,GAAG,KAAK;AAAA,MACf,SAAS;AAAA,QACL,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,QAAQ,EAAE,MAAM,UAAA,EAAU;AAAA,QAC7E,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,OAAA,EAAO;AAAA,QAC7F,EAAE,SAAS,GAAG,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,YAAA,EAAY;AAAA,MAAE;AAAA,IAC1E,CACH;AACD,eAAW,IAAI,OAAO,MAAM;AAC5B,WAAO;AAAA,EACX;AAEA,SAAO;AAAA,IACH,YAAY,SAAS,KAAK;AACtB,YAAM,SAAS,QAAQ;AACvB,UAAI,oBAAoB,QAAQ;AAC5B,qBAAa,MAAA;AACb,mBAAW,MAAA;AACX,0BAAkB;AAAA,MACtB;AACA,YAAM,MAAM,GAAG,KAAK,IAAI,mBAAmB,GAAG,CAAC;AAC/C,YAAM,SAAS,aAAa,IAAI,GAAG;AACnC,UAAI,QAAQ;AACR,eAAO;AAAA,MACX;AACA,YAAM,cAAc,OAAO,mBAAmB,EAAE,MAAM,UAAU,OAAO,GAAG,KAAK,QAAA,CAAS;AACxF,YAAM,cAAc,OAAO,mBAAmB,EAAE,MAAM,UAAU,OAAO,GAAG,KAAK,QAAA,CAAS;AAExF,YAAM,WAAW,OAAO;AAAA,QACpB,gCAAgC;AAAA,UAC5B,QAAQ,GAAG,KAAK;AAAA,UAChB;AAAA,UACA,OAAO,CAAC,wBAAwB,OAAO,GAAG,UAAU,OAAO,CAAC;AAAA,UAC5D;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB,SAAS,IAAI;AAAA,UACb,qBAAqB,IAAI;AAAA,UACzB,eAAe,IAAI;AAAA,UACnB,cAAc,IAAI;AAAA,UAClB,oBAAoB;AAAA,QAAA,CACvB;AAAA,MAAA;AAEL,mBAAa,IAAI,KAAK,QAAQ;AAC9B,aAAO;AAAA,IACX;AAAA,IAEA,gBAAgB,QAAQ,SAAS,UAAU,aAAa;AACpD,YAAM,SAAS,OAAO;AACtB,aAAO,OAAO,gBAAgB;AAAA,QAC1B,QAAQ,UAAU,MAAM;AAAA,QACxB,SAAS;AAAA,UACL,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,UAAQ;AAAA,UAC1C,EAAE,SAAS,GAAG,UAAU,SAAA;AAAA,UACxB,EAAE,SAAS,GAAG,UAAU,YAAA;AAAA,QAAY;AAAA,MACxC,CACH;AAAA,IACL;AAAA,EAAA;AAER;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aJ as WGSL } from "./index-BgY3QEzL.js";
|
|
2
2
|
function curveScalar(type, v) {
|
|
3
3
|
switch (type) {
|
|
4
4
|
case 0:
|
|
@@ -86,4 +86,4 @@ const emitter = {
|
|
|
86
86
|
export {
|
|
87
87
|
emitter
|
|
88
88
|
};
|
|
89
|
-
//# sourceMappingURL=curve-block-
|
|
89
|
+
//# sourceMappingURL=curve-block-Ditr4R7V.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curve-block-
|
|
1
|
+
{"version":3,"file":"curve-block-Ditr4R7V.js","sources":["../src/material/node/blocks/curve-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeValueType } from \"../node-types.js\";\nimport { WGSL } from \"../node-types.js\";\n\nfunction curveScalar(type: number, v: string): string {\n switch (type) {\n case 0:\n return `(1.0 - cos((${v} * 3.1415) / 2.0))`;\n case 1:\n return `sin((${v} * 3.1415) / 2.0)`;\n case 2:\n return `(-((cos(${v} * 3.1415) - 1.0)) / 2.0)`;\n case 3:\n return `(${v} * ${v})`;\n case 4:\n return `((1.0 - ${v}) * (1.0 - ${v}))`;\n case 5:\n return `select(1.0 - pow(-2.0 * ${v} + 2.0, 2.0) / 2.0, 2.0 * ${v} * ${v}, ${v} < 0.5)`;\n case 6:\n return `(${v} * ${v} * ${v})`;\n case 7:\n return `(1.0 - pow(1.0 - ${v}, 3.0))`;\n case 8:\n return `select(1.0 - pow(-2.0 * ${v} + 2.0, 3.0) / 2.0, 4.0 * ${v} * ${v} * ${v}, ${v} < 0.5)`;\n case 9:\n return `(${v} * ${v} * ${v} * ${v})`;\n case 10:\n return `(1.0 - pow(1.0 - ${v}, 4.0))`;\n case 11:\n return `select(1.0 - pow(-2.0 * ${v} + 2.0, 4.0) / 2.0, 8.0 * ${v} * ${v} * ${v} * ${v}, ${v} < 0.5)`;\n case 12:\n return `(${v} * ${v} * ${v} * ${v} * ${v})`;\n case 13:\n return `(1.0 - pow(1.0 - ${v}, 5.0))`;\n case 14:\n return `select(1.0 - pow(-2.0 * ${v} + 2.0, 5.0) / 2.0, 16.0 * ${v} * ${v} * ${v} * ${v} * ${v}, ${v} < 0.5)`;\n case 15:\n return `select(pow(2.0, 10.0 * ${v} - 10.0), 0.0, ${v} == 0.0)`;\n case 16:\n return `select(1.0 - pow(2.0, -10.0 * ${v}), 1.0, ${v} == 1.0)`;\n case 17:\n return `select(select(select((2.0 - pow(2.0, -20.0 * ${v} + 10.0)) / 2.0, pow(2.0, 20.0 * ${v} - 10.0) / 2.0, ${v} < 0.5), 1.0, ${v} == 1.0), 0.0, ${v} == 0.0)`;\n case 18:\n return `(1.0 - sqrt(1.0 - pow(${v}, 2.0)))`;\n case 19:\n return `sqrt(1.0 - pow(${v} - 1.0, 2.0))`;\n case 20:\n return `select((sqrt(1.0 - pow(-2.0 * ${v} + 2.0, 2.0)) + 1.0) / 2.0, (1.0 - sqrt(1.0 - pow(2.0 * ${v}, 2.0))) / 2.0, ${v} < 0.5)`;\n case 21:\n return `(2.70158 * ${v} * ${v} * ${v} - 1.70158 * ${v} * ${v})`;\n case 22:\n return `(2.70158 * pow(${v} - 1.0, 3.0) + 1.70158 * pow(${v} - 1.0, 2.0))`;\n case 23:\n return `select((pow(2.0 * ${v} - 2.0, 2.0) * (3.5949095 * (${v} * 2.0 - 2.0) + 3.5949095) + 2.0) / 2.0, (pow(2.0 * ${v}, 2.0) * (3.5949095 * 2.0 * ${v} - 2.5949095)) / 2.0, ${v} < 0.5)`;\n case 24:\n return `select(select(-pow(2.0, 10.0 * ${v} - 10.0) * sin((${v} * 10.0 - 10.75) * ((2.0 * 3.1415) / 3.0)), 1.0, ${v} == 1.0), 0.0, ${v} == 0.0)`;\n case 25:\n return `select(select(pow(2.0, -10.0 * ${v}) * sin((${v} * 10.0 - 0.75) * ((2.0 * 3.1415) / 3.0)) + 1.0, 1.0, ${v} == 1.0), 0.0, ${v} == 0.0)`;\n case 26:\n return `select(select(select((pow(2.0, -20.0 * ${v} + 10.0) * sin((20.0 * ${v} - 11.125) * ((2.0 * 3.1415) / 4.5))) / 2.0 + 1.0, -(pow(2.0, 20.0 * ${v} - 10.0) * sin((20.0 * ${v} - 11.125) * ((2.0 * 3.1415) / 4.5))) / 2.0, ${v} < 0.5), 1.0, ${v} == 1.0), 0.0, ${v} == 0.0)`;\n default:\n throw new Error(`NodeMaterial: unknown CurveBlock curveType ${type}`);\n }\n}\n\nfunction curveExpr(type: number, input: string, inputType: NodeValueType): string {\n if (inputType === \"f32\") {\n return curveScalar(type, input);\n }\n if (inputType === \"vec2f\") {\n return `${WGSL[inputType]}(${curveScalar(type, `(${input}).x`)}, ${curveScalar(type, `(${input}).y`)})`;\n }\n if (inputType === \"vec3f\") {\n return `${WGSL[inputType]}(${curveScalar(type, `(${input}).x`)}, ${curveScalar(type, `(${input}).y`)}, ${curveScalar(type, `(${input}).z`)})`;\n }\n if (inputType === \"vec4f\") {\n return `${WGSL[inputType]}(${curveScalar(type, `(${input}).x`)}, ${curveScalar(type, `(${input}).y`)}, ${curveScalar(type, `(${input}).z`)}, ${curveScalar(type, `(${input}).w`)})`;\n }\n throw new Error(`NodeMaterial: CurveBlock does not support ${inputType}`);\n}\n\nexport const emitter: BlockEmitter = {\n className: \"CurveBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const input = ctx.resolve(block, \"input\", stage, state);\n const rawCurveType = block.serialized.curveType;\n const curveType = typeof rawCurveType === \"number\" ? rawCurveType : 2;\n return { expr: curveExpr(curveType, input.expr, input.type), type: input.type };\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b4 as PBR_HAS_EMISSIVE_COLOR, b5 as PBR_HAS_EMISSIVE } from "./index-BgY3QEzL.js";
|
|
2
2
|
function createEmissiveColorFragment(hasEmissiveTexture) {
|
|
3
3
|
return {
|
|
4
4
|
_id: "emissive-color",
|
|
@@ -36,4 +36,4 @@ export {
|
|
|
36
36
|
pbrExt,
|
|
37
37
|
writeEmissiveUBO
|
|
38
38
|
};
|
|
39
|
-
//# sourceMappingURL=emissive-fragment-
|
|
39
|
+
//# sourceMappingURL=emissive-fragment-BOAezkfk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emissive-fragment-
|
|
1
|
+
{"version":3,"file":"emissive-fragment-BOAezkfk.js","sources":["../src/material/pbr/fragments/emissive-fragment.ts"],"sourcesContent":["/**\n * Emissive Color Fragment\n *\n * Adds an emissiveColor vec3 uniform to MeshUniforms and uses it\n * in the fragment shader's emissive computation.\n *\n * Zero bytes in bundles for scenes that don't use emissive color.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_EMISSIVE_COLOR, PBR_HAS_EMISSIVE } from \"../pbr-flag-bits.js\";\n\n/**\n * Create an emissive-color fragment.\n * @param hasEmissiveTexture - Whether the material also has an emissive texture.\n */\nexport function createEmissiveColorFragment(hasEmissiveTexture: boolean): ShaderFragment {\n return {\n _id: \"emissive-color\",\n\n _uboFields: [\n { _name: \"emissiveColor\", _type: \"vec3<f32>\" },\n { _name: \"_emissiveColorPad\", _type: \"f32\" },\n ],\n\n _fragmentSlots: {\n AT: hasEmissiveTexture ? `emissive=material.emissiveColor*textureSample(emissiveTexture,emissiveSampler,input.uv).rgb;` : `emissive=material.emissiveColor;`,\n },\n };\n}\n\n/** Write the emissive-color material-UBO slice. */\nexport function writeEmissiveUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n if (!material.emissiveColor || !offsets.has(\"emissiveColor\")) {\n return;\n }\n const off = offsets.get(\"emissiveColor\")! / 4;\n data[off] = material.emissiveColor[0]!;\n data[off + 1] = material.emissiveColor[1]!;\n data[off + 2] = material.emissiveColor[2]!;\n}\n\nexport const pbrExt: PbrExt = {\n id: \"emissive-color\",\n phase: \"fragment\",\n frag(ctx) {\n if (!(ctx._features & PBR_HAS_EMISSIVE_COLOR)) {\n return null;\n }\n return createEmissiveColorFragment((ctx._features & PBR_HAS_EMISSIVE) !== 0);\n },\n writeUbo: writeEmissiveUBO as PbrExt[\"writeUbo\"],\n};\n"],"names":[],"mappings":";AAkBO,SAAS,4BAA4B,oBAA6C;AACrF,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,YAAY;AAAA,MACR,EAAE,OAAO,iBAAiB,OAAO,YAAA;AAAA,MACjC,EAAE,OAAO,qBAAqB,OAAO,MAAA;AAAA,IAAM;AAAA,IAG/C,gBAAgB;AAAA,MACZ,IAAI,qBAAqB,iGAAiG;AAAA,IAAA;AAAA,EAC9H;AAER;AAGO,SAAS,iBAAiB,MAAoB,UAA4B,SAA4C;AACzH,MAAI,CAAC,SAAS,iBAAiB,CAAC,QAAQ,IAAI,eAAe,GAAG;AAC1D;AAAA,EACJ;AACA,QAAM,MAAM,QAAQ,IAAI,eAAe,IAAK;AAC5C,OAAK,GAAG,IAAI,SAAS,cAAc,CAAC;AACpC,OAAK,MAAM,CAAC,IAAI,SAAS,cAAc,CAAC;AACxC,OAAK,MAAM,CAAC,IAAI,SAAS,cAAc,CAAC;AAC5C;AAEO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,QAAI,EAAE,IAAI,YAAY,yBAAyB;AAC3C,aAAO;AAAA,IACX;AACA,WAAO,6BAA6B,IAAI,YAAY,sBAAsB,CAAC;AAAA,EAC/E;AAAA,EACA,UAAU;AACd;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { P as createMaterialView, V as PBR2_ESM_SHADOW_OUTPUT, W as PBR_HAS_ALPHA_BLEND } from "./index-BgY3QEzL.js";
|
|
2
2
|
const PBR_ESM_SHADOW_DEPTH_CODE = `let depthMetricSM = (input.clipPos.z + shadowParams.depthValues.x) / shadowParams.depthValues.y + shadowParams.biasAndScale.x;
|
|
3
3
|
let depthSM = clamp(exp(-min(87.0, shadowParams.biasAndScale.z * depthMetricSM)), 0.0, 1.0);
|
|
4
4
|
return vec4<f32>(depthSM, 1.0, 1.0, 1.0);`;
|
|
@@ -15,4 +15,4 @@ function createPbrEsmShadowMaterialView(source, shadowParamsUBO) {
|
|
|
15
15
|
export {
|
|
16
16
|
createPbrEsmShadowMaterialView
|
|
17
17
|
};
|
|
18
|
-
//# sourceMappingURL=esm-shadow-view-
|
|
18
|
+
//# sourceMappingURL=esm-shadow-view-DRpyRAfa.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esm-shadow-view-
|
|
1
|
+
{"version":3,"file":"esm-shadow-view-DRpyRAfa.js","sources":["../src/material/pbr/esm-shadow-view.ts"],"sourcesContent":["/** PBR material view helper that writes ESM shadow color. */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport { PBR_HAS_ALPHA_BLEND, PBR2_ESM_SHADOW_OUTPUT } from \"./pbr-flags.js\";\nimport type { PbrMaterialProps } from \"./pbr-material.js\";\n\nexport interface PbrEsmShadowMaterialView extends MaterialView {\n /** @internal */\n readonly _esmShadowParamsUBO: GPUBuffer;\n /** @internal */\n readonly _esmShadowDepthCode: string;\n}\n\nconst PBR_ESM_SHADOW_DEPTH_CODE = `let depthMetricSM = (input.clipPos.z + shadowParams.depthValues.x) / shadowParams.depthValues.y + shadowParams.biasAndScale.x;\nlet depthSM = clamp(exp(-min(87.0, shadowParams.biasAndScale.z * depthMetricSM)), 0.0, 1.0);\nreturn vec4<f32>(depthSM, 1.0, 1.0, 1.0);`;\n\nexport function createPbrEsmShadowMaterialView(source: PbrMaterialProps, shadowParamsUBO: GPUBuffer): PbrEsmShadowMaterialView {\n const features = source._renderFeatures ?? { features: 0, features2: 0 };\n const view = createMaterialView(source, {\n features: features.features & ~PBR_HAS_ALPHA_BLEND,\n features2: (features.features2 ?? 0) | PBR2_ESM_SHADOW_OUTPUT,\n }) as PbrEsmShadowMaterialView;\n Object.defineProperty(view, \"_esmShadowParamsUBO\", { value: shadowParamsUBO, enumerable: false });\n Object.defineProperty(view, \"_esmShadowDepthCode\", { value: PBR_ESM_SHADOW_DEPTH_CODE, enumerable: false });\n return view;\n}\n"],"names":[],"mappings":";AAcA,MAAM,4BAA4B;AAAA;AAAA;AAI3B,SAAS,+BAA+B,QAA0B,iBAAsD;AAC3H,QAAM,WAAW,OAAO,mBAAmB,EAAE,UAAU,GAAG,WAAW,EAAA;AACrE,QAAM,OAAO,mBAAmB,QAAQ;AAAA,IACpC,UAAU,SAAS,WAAW,CAAC;AAAA,IAC/B,YAAY,SAAS,aAAa,KAAK;AAAA,EAAA,CAC1C;AACD,SAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,iBAAiB,YAAY,OAAO;AAChG,SAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,2BAA2B,YAAY,OAAO;AAC1G,SAAO;AACX;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { P as createMaterialView, Q as ESM_SHADOW_OUTPUT, R as MATERIAL_ALPHA_BLEND } from "./index-BgY3QEzL.js";
|
|
2
2
|
const STANDARD_ESM_SHADOW_DEPTH_CODE = `let depthMetricSM = (input.clipPos.z + shadowParams.depthValues.x) / shadowParams.depthValues.y + shadowParams.biasAndScale.x;
|
|
3
3
|
let depthSM = clamp(exp(-min(87.0, shadowParams.biasAndScale.z * depthMetricSM)), 0.0, 1.0);
|
|
4
4
|
return vec4<f32>(depthSM, 1.0, 1.0, 1.0);`;
|
|
@@ -12,4 +12,4 @@ function createStandardEsmShadowMaterialView(source, shadowParamsUBO) {
|
|
|
12
12
|
export {
|
|
13
13
|
createStandardEsmShadowMaterialView
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=esm-shadow-view-
|
|
15
|
+
//# sourceMappingURL=esm-shadow-view-DmIORQGZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esm-shadow-view-
|
|
1
|
+
{"version":3,"file":"esm-shadow-view-DmIORQGZ.js","sources":["../src/material/standard/esm-shadow-view.ts"],"sourcesContent":["/** Standard material view helper that writes ESM shadow color. */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport { ESM_SHADOW_OUTPUT, MATERIAL_ALPHA_BLEND } from \"./standard-flags.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\n\nexport interface StandardEsmShadowMaterialView extends MaterialView {\n /** @internal */\n readonly _esmShadowParamsUBO: GPUBuffer;\n /** @internal */\n readonly _esmShadowDepthCode: string;\n}\n\nconst STANDARD_ESM_SHADOW_DEPTH_CODE = `let depthMetricSM = (input.clipPos.z + shadowParams.depthValues.x) / shadowParams.depthValues.y + shadowParams.biasAndScale.x;\nlet depthSM = clamp(exp(-min(87.0, shadowParams.biasAndScale.z * depthMetricSM)), 0.0, 1.0);\nreturn vec4<f32>(depthSM, 1.0, 1.0, 1.0);`;\n\nexport function createStandardEsmShadowMaterialView(source: StandardMaterialProps, shadowParamsUBO: GPUBuffer): StandardEsmShadowMaterialView {\n const features = source._renderFeatures ?? { features: 0 };\n const view = createMaterialView(source, { features: (features.features & ~MATERIAL_ALPHA_BLEND) | ESM_SHADOW_OUTPUT }) as StandardEsmShadowMaterialView;\n Object.defineProperty(view, \"_esmShadowParamsUBO\", { value: shadowParamsUBO, enumerable: false });\n Object.defineProperty(view, \"_esmShadowDepthCode\", { value: STANDARD_ESM_SHADOW_DEPTH_CODE, enumerable: false });\n return view;\n}\n"],"names":[],"mappings":";AAcA,MAAM,iCAAiC;AAAA;AAAA;AAIhC,SAAS,oCAAoC,QAA+B,iBAA2D;AAC1I,QAAM,WAAW,OAAO,mBAAmB,EAAE,UAAU,EAAA;AACvD,QAAM,OAAO,mBAAmB,QAAQ,EAAE,UAAW,SAAS,WAAW,CAAC,uBAAwB,mBAAmB;AACrH,SAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,iBAAiB,YAAY,OAAO;AAChG,SAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,gCAAgC,YAAY,OAAO;AAC/G,SAAO;AACX;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { P as createMaterialView, N as NODE_ESM_SHADOW_OUTPUT } from "./index-BgY3QEzL.js";
|
|
2
2
|
const NODE_ESM_SHADOW_DEPTH_CODE = `let depthMetricSM = (in.position.z + nmeShadowParams.depthValues.x) / nmeShadowParams.depthValues.y + nmeShadowParams.biasAndScale.x;
|
|
3
3
|
let depthSM = clamp(exp(-min(87.0, nmeShadowParams.biasAndScale.z * depthMetricSM)), 0.0, 1.0);
|
|
4
4
|
return vec4<f32>(depthSM, 1.0, 1.0, 1.0);`;
|
|
@@ -12,4 +12,4 @@ function createNodeEsmShadowMaterialView(source, shadowParamsUBO) {
|
|
|
12
12
|
export {
|
|
13
13
|
createNodeEsmShadowMaterialView
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=esm-shadow-view-
|
|
15
|
+
//# sourceMappingURL=esm-shadow-view-JCPaOOi7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esm-shadow-view-
|
|
1
|
+
{"version":3,"file":"esm-shadow-view-JCPaOOi7.js","sources":["../src/material/node/esm-shadow-view.ts"],"sourcesContent":["/** NodeMaterial view helper that writes ESM shadow color. */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport { NODE_ESM_SHADOW_OUTPUT } from \"./node-flags.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\n\nexport interface NodeEsmShadowMaterialView extends MaterialView {\n /** @internal */\n readonly _esmShadowParamsUBO: GPUBuffer;\n /** @internal */\n readonly _esmShadowDepthCode: string;\n}\n\nconst NODE_ESM_SHADOW_DEPTH_CODE = `let depthMetricSM = (in.position.z + nmeShadowParams.depthValues.x) / nmeShadowParams.depthValues.y + nmeShadowParams.biasAndScale.x;\nlet depthSM = clamp(exp(-min(87.0, nmeShadowParams.biasAndScale.z * depthMetricSM)), 0.0, 1.0);\nreturn vec4<f32>(depthSM, 1.0, 1.0, 1.0);`;\n\nexport function createNodeEsmShadowMaterialView(source: NodeMaterial, shadowParamsUBO: GPUBuffer): NodeEsmShadowMaterialView {\n const features = source._renderFeatures ?? { features: 0 };\n const view = createMaterialView(source, { features: features.features | NODE_ESM_SHADOW_OUTPUT }) as NodeEsmShadowMaterialView;\n Object.defineProperty(view, \"_esmShadowParamsUBO\", { value: shadowParamsUBO, enumerable: false });\n Object.defineProperty(view, \"_esmShadowDepthCode\", { value: NODE_ESM_SHADOW_DEPTH_CODE, enumerable: false });\n return view;\n}\n"],"names":[],"mappings":";AAcA,MAAM,6BAA6B;AAAA;AAAA;AAI5B,SAAS,gCAAgC,QAAsB,iBAAuD;AACzH,QAAM,WAAW,OAAO,mBAAmB,EAAE,UAAU,EAAA;AACvD,QAAM,OAAO,mBAAmB,QAAQ,EAAE,UAAU,SAAS,WAAW,wBAAwB;AAChG,SAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,iBAAiB,YAAY,OAAO;AAChG,SAAO,eAAe,MAAM,uBAAuB,EAAE,OAAO,4BAA4B,YAAY,OAAO;AAC3G,SAAO;AACX;"}
|
package/{gaussian-splatting-pipeline-sh-7J31V23x.js → gaussian-splatting-pipeline-sh-B30Mu56i.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { e as U8, T as TU,
|
|
1
|
+
import { e as U8, T as TU, C as disposeGaussianSplattingMesh, B as BU, a as F32, E as applyGsFragments, y as targetSignatureKey, S as SS, H as CW, A as getSceneBindGroupLayout, I as getRenderTargetSize, J as getViewMatrix, K as getProjectionMatrix, L as getCameraPosition } from "./index-BgY3QEzL.js";
|
|
2
2
|
const SH_TEXTURE_COUNT = [0, 1, 2, 3, 5];
|
|
3
3
|
let _cache = null;
|
|
4
4
|
function buildShShaderSource(shDegree) {
|
|
@@ -497,4 +497,4 @@ export {
|
|
|
497
497
|
attachGaussianSplattingMeshSH,
|
|
498
498
|
buildGaussianSplattingRenderableSH
|
|
499
499
|
};
|
|
500
|
-
//# sourceMappingURL=gaussian-splatting-pipeline-sh-
|
|
500
|
+
//# sourceMappingURL=gaussian-splatting-pipeline-sh-B30Mu56i.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaussian-splatting-pipeline-sh-7J31V23x.js","sources":["../src/mesh/GaussianSplatting/gaussian-splatting-pipeline-sh.ts"],"sourcesContent":["/** Gaussian-Splatting SH render pipeline + Renderable.\n *\n * Variant of `gaussian-splatting-pipeline.ts` that adds view-dependent SH\n * shading. Loaded *only* by `loadSplat` (and the SOG / SPZ loaders) via a\n * dynamic `import(...)` when the parsed splat asset includes SH coefficients\n * (`mesh.shDegree > 0`), so plain `.ply` / `.splat` scenes (e.g. scene 120)\n * never pull this module's WGSL or runtime cost into their bundle.\n *\n * WGSL source is generated per-shDegree by `buildShShaderSource`: SH textures,\n * byte-to-vec3 unpacking, and the polynomial evaluation in\n * `computeColorFromSHDegree` all expand to the right size — mirrors the\n * `#if SH_DEGREE > N` blocks in BJS `gaussianSplatting.fx`. Pipeline cache is\n * keyed by `(targetSignatureKey, shDegree)`.\n *\n * The UBO grows by 16 bytes vs the base pipeline to carry `eyePosition`\n * (world-space camera position; see `computeSH(dir)` below).\n *\n * ── Why the Y-flip on the SH direction? ─────────────────────────────────\n * BJS sets `mesh.scaling.y *= -1` to fix coordinate-system handedness; Lite\n * pre-flips Y in `splat-data.ts` at parse time so the runtime mesh transform\n * is identity. World-space splat positions agree across both engines, but\n * the BJS world rotation absorbs an extra `diag(1,-1,1)` factor — i.e.\n * worldRot_bjs = worldRot_user · diag(1,-1,1)\n * which means\n * inverse(worldRot_bjs) · v = diag(1,-1,1) · inverse(worldRot_user) · v\n * so Lite reproduces the BJS SH direction by computing\n * `inverseMat3(worldRot) · (worldPos − eye)` and then negating `.y`. */\n\nimport { F32, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU, SS, CW } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene-core.js\";\nimport type { Renderable, DrawBinding } from \"../../render/renderable.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getViewMatrix, getProjectionMatrix, getCameraPosition } from \"../../camera/camera.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { getRenderTargetSize } from \"../../engine/engine.js\";\nimport { disposeGaussianSplattingMesh, type GaussianSplattingMesh, type GsShaderFragment } from \"./gaussian-splatting-mesh.js\";\nimport { applyGsFragments } from \"./gaussian-splatting-pipeline.js\";\n\ninterface PipelineEntry {\n pipeline: GPURenderPipeline;\n meshBindGroupLayout: GPUBindGroupLayout;\n shTextureCount: number;\n}\n\n// shDegree → number of rgba32uint SH textures: 1→1, 2→2, 3→3, 4→5.\nconst SH_TEXTURE_COUNT = [0, 1, 2, 3, 5];\n\nlet _cache: { device: GPUDevice; modules: Map<string, GPUShaderModule>; entries: Map<string, PipelineEntry> } | null = null;\n\n/** Build the WGSL source for a given SH degree (1..4). Mirrors the BJS\n * preprocessor-driven shader structure: declares only the SH textures used\n * by the degree, emits exactly the byte-stream unpacking for that degree,\n * and inlines only the SH polynomial terms up to that degree. */\nfunction buildShShaderSource(shDegree: number): string {\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\n const shCoefficientCount = shVectorCount * 3;\n const textureCount = Math.ceil(shCoefficientCount / 16);\n\n // ── SH texture bindings (6, 7, …) ───────────────────────────────\n let textureBindings = \"\";\n for (let i = 0; i < textureCount; i++) {\n textureBindings += `@group(1) @binding(${6 + i}) var shTexture${i}: texture_2d<u32>;\\n`;\n }\n\n // ── textureLoad calls inside readSplat ──────────────────────────\n let textureLoads = \"\";\n for (let i = 0; i < textureCount; i++) {\n textureLoads += ` let sh${i}_u32 = textureLoad(shTexture${i}, splatUVi32, 0);\\n`;\n }\n\n // ── Unpack the byte stream into sh[1..shVectorCount] vec3 values.\n //\n // Each rgba32uint texel carries 16 bytes (4 u32s × 4 bytes). The bytes\n // are stored in BJS-coefficient order: byte j of splat i is the j-th\n // component of the [R0,G0,B0, R1,G1,B1, …, R(N-1),G(N-1),B(N-1)] sequence.\n // sh[k+1] (k = 0..shVectorCount-1) reads bytes [3k, 3k+1, 3k+2]. `decompose`\n // returns `(byte * 2/255) - 1`, matching BJS exactly.\n let shUnpack = ` var sh: array<vec3<f32>, ${shVectorCount + 1}>;\\n sh[0] = vec3<f32>(0.0);\\n`;\n const byteRef = (j: number): string => {\n // texture index, u32 index within texel (0..3), byte index within u32 (0..3 == x/y/z/w).\n const tex = (j / 16) | 0;\n const u32Idx = ((j % 16) / 4) | 0;\n const byteIdx = j % 4;\n const u32Field = [\"x\", \"y\", \"z\", \"w\"][u32Idx]!;\n const byteField = [\"x\", \"y\", \"z\", \"w\"][byteIdx]!;\n return `decompose(sh${tex}_u32.${u32Field}).${byteField}`;\n };\n for (let k = 0; k < shVectorCount; k++) {\n const j = k * 3;\n shUnpack += ` sh[${k + 1}] = vec3<f32>(${byteRef(j)}, ${byteRef(j + 1)}, ${byteRef(j + 2)});\\n`;\n }\n\n // ── Polynomial evaluation, conditional on shDegree ──────────────\n let shPoly = \" result = sh[0];\\n\";\n if (shDegree >= 1) {\n shPoly += ` result += -SH_C1 * y * sh[1] + SH_C1 * z * sh[2] - SH_C1 * x * sh[3];\\n`;\n }\n if (shDegree >= 2) {\n shPoly += ` result +=\\n SH_C2[0] * xy * sh[4] +\\n SH_C2[1] * yz * sh[5] +\\n SH_C2[2] * (2.0 * zz - xx - yy) * sh[6] +\\n SH_C2[3] * xz * sh[7] +\\n SH_C2[4] * (xx - yy) * sh[8];\\n`;\n }\n if (shDegree >= 3) {\n shPoly += ` result +=\\n SH_C3[0] * y * (3.0 * xx - yy) * sh[9] +\\n SH_C3[1] * xy * z * sh[10] +\\n SH_C3[2] * y * (4.0 * zz - xx - yy) * sh[11] +\\n SH_C3[3] * z * (2.0 * zz - 3.0 * xx - 3.0 * yy) * sh[12] +\\n SH_C3[4] * x * (4.0 * zz - xx - yy) * sh[13] +\\n SH_C3[5] * z * (xx - yy) * sh[14] +\\n SH_C3[6] * x * (xx - 3.0 * yy) * sh[15];\\n`;\n }\n if (shDegree >= 4) {\n shPoly += ` result +=\\n SH_C4[0] * x * y * (xx - yy) * sh[16] +\\n SH_C4[1] * y * z * (3.0 * xx - yy) * sh[17] +\\n SH_C4[2] * x * y * (7.0 * zz - 1.0) * sh[18] +\\n SH_C4[3] * y * z * (7.0 * zz - 3.0) * sh[19] +\\n SH_C4[4] * (zz * (35.0 * zz - 30.0) + 3.0) * sh[20] +\\n SH_C4[5] * x * z * (7.0 * zz - 3.0) * sh[21] +\\n SH_C4[6] * (xx - yy) * (7.0 * zz - 1.0) * sh[22] +\\n SH_C4[7] * x * z * (xx - 3.0 * yy) * sh[23] +\\n SH_C4[8] * (xx * (xx - 3.0 * yy) - yy * (3.0 * xx - yy)) * sh[24];\\n`;\n }\n\n // SH_C2..SH_C4 constants — only declare what's referenced (silences\n // WGSL \"unused array\" warnings on lower degrees).\n let constantsBlock = `const SH_C1: f32 = 0.48860251;\\n`;\n if (shDegree >= 2) {\n constantsBlock += `const SH_C2: array<f32, 5> = array<f32, 5>(1.092548430, -1.09254843, 0.315391565, -1.09254843, 0.546274215);\\n`;\n }\n if (shDegree >= 3) {\n constantsBlock += `const SH_C3: array<f32, 7> = array<f32, 7>(-0.59004358, 2.890611442, -0.45704579, 0.373176332, -0.45704579, 1.445305721, -0.59004358);\\n`;\n }\n if (shDegree >= 4) {\n constantsBlock += `const SH_C4: array<f32, 9> = array<f32, 9>(2.5033429418, -1.7701307698, 0.9461746958, -0.6690465436, 0.1057855469, -0.6690465436, 0.4730873479, -1.7701307698, 0.6258357354);\\n`;\n }\n\n return `// Gaussian Splatting — vertex + fragment WGSL (SH degree ${shDegree}).\n// Generated by buildShShaderSource. Mirrors BJS gaussianSplatting.vertex.fx +\n// gaussianSplatting.fx (SH_DEGREE = ${shDegree}, no compound parts).\nstruct U {\n world: mat4x4<f32>,\n view: mat4x4<f32>,\n projection: mat4x4<f32>,\n viewport: vec2<f32>,\n focal: vec2<f32>,\n dataSize: vec2<f32>,\n alpha: f32,\n _pad0: f32,\n eyePosition: vec3<f32>,\n _pad1: f32,\n};\n@group(1) @binding(0) var<uniform> u: U;\n@group(1) @binding(1) var samp: sampler;\n@group(1) @binding(2) var centersTex: texture_2d<f32>;\n@group(1) @binding(3) var covATex: texture_2d<f32>;\n@group(1) @binding(4) var covBTex: texture_2d<f32>;\n@group(1) @binding(5) var colorsTex: texture_2d<f32>;\n${textureBindings}\n\nstruct VOut {\n @builtin(position) pos: vec4<f32>,\n @location(0) vColor: vec4<f32>,\n @location(1) vPos: vec2<f32>,\n};\n\n${constantsBlock}\n\nfn dataUv(idx: f32) -> vec2<f32> {\n let y = floor(idx / u.dataSize.x);\n let x = idx - y * u.dataSize.x;\n return vec2<f32>((x + 0.5) / u.dataSize.x, (y + 0.5) / u.dataSize.y);\n}\n\nfn dataUvI(idx: f32) -> vec2<i32> {\n let y = floor(idx / u.dataSize.x);\n let x = idx - y * u.dataSize.x;\n return vec2<i32>(i32(x), i32(y));\n}\n\n// Unpack a u32 of 4 packed bytes into (b0 b1 b2 b3) * 2/255 - 1.\nfn decompose(value: u32) -> vec4<f32> {\n let v = vec4<f32>(\n f32((value >> 0u) & 255u),\n f32((value >> 8u) & 255u),\n f32((value >> 16u) & 255u),\n f32((value >> 24u) & 255u));\n return v * vec4<f32>(2.0 / 255.0) - vec4<f32>(1.0);\n}\n\nfn inverseMat3(m: mat3x3<f32>) -> mat3x3<f32> {\n let a00 = m[0][0]; let a01 = m[0][1]; let a02 = m[0][2];\n let a10 = m[1][0]; let a11 = m[1][1]; let a12 = m[1][2];\n let a20 = m[2][0]; let a21 = m[2][1]; let a22 = m[2][2];\n let b01 = a22 * a11 - a12 * a21;\n let b11 = -a22 * a10 + a12 * a20;\n let b21 = a21 * a10 - a11 * a20;\n let det = a00 * b01 + a01 * b11 + a02 * b21;\n return mat3x3<f32>(\n vec3<f32>(b01 / det, (-a22 * a01 + a02 * a21) / det, (a12 * a01 - a02 * a11) / det),\n vec3<f32>(b11 / det, (a22 * a00 - a02 * a20) / det, (-a12 * a00 + a02 * a10) / det),\n vec3<f32>(b21 / det, (-a21 * a00 + a01 * a20) / det, (a11 * a00 - a01 * a10) / det));\n}\n\nfn computeSH(dir: vec3<f32>, splatUVi32: vec2<i32>) -> vec3<f32> {\n${textureLoads}${shUnpack} let x = dir.x;\n let y = dir.y;\n let z = dir.z;\n let xx = x * x; let yy = y * y; let zz = z * z;\n let xy = x * y; let yz = y * z; let xz = x * z;\n var result: vec3<f32>;\n${shPoly} return result;\n}\n\n@vertex\nfn vs(@location(0) corner: vec2<f32>, @location(1) splatIndex: f32) -> VOut {\n var out: VOut;\n let uv = dataUv(splatIndex);\n let splatUVi32 = dataUvI(splatIndex);\n let center = textureSampleLevel(centersTex, samp, uv, 0.0).xyz;\n let color = textureSampleLevel(colorsTex, samp, uv, 0.0);\n let covA = textureSampleLevel(covATex, samp, uv, 0.0).xyz;\n let covB = textureSampleLevel(covBTex, samp, uv, 0.0).xyz;\n\n let worldPos = u.world * vec4<f32>(center, 1.0);\n let modelView = u.view * u.world;\n let camspace = u.view * worldPos;\n let pos2d = u.projection * camspace;\n\n let bounds = 1.2 * pos2d.w;\n if (pos2d.z < 0.0\n || pos2d.x < -bounds || pos2d.x > bounds\n || pos2d.y < -bounds || pos2d.y > bounds) {\n out.pos = vec4<f32>(0.0, 0.0, 2.0, 1.0);\n out.vColor = vec4<f32>(0.0);\n out.vPos = vec2<f32>(0.0);\n return out;\n }\n\n // ── View-dependent SH evaluation ───────────────────────────────────\n let worldRot = mat3x3<f32>(u.world[0].xyz, u.world[1].xyz, u.world[2].xyz);\n let normWorldRot = inverseMat3(worldRot);\n var dir = normalize(normWorldRot * (worldPos.xyz - u.eyePosition));\n // Lite-side Y-flip: compensates for our data-path Y pre-flip vs BJS's\n // mesh.scaling.y *= -1 (see file header for derivation).\n dir.y = -dir.y;\n let shColor = computeSH(dir, splatUVi32);\n\n let Vrk = mat3x3<f32>(\n vec3<f32>(covA.x, covA.y, covA.z),\n vec3<f32>(covA.y, covB.x, covB.y),\n vec3<f32>(covA.z, covB.y, covB.z));\n\n let invZ = 1.0 / camspace.z;\n let invZ2 = invZ * invZ;\n let J = mat3x3<f32>(\n vec3<f32>(u.focal.x * invZ, 0.0, -u.focal.x * camspace.x * invZ2),\n vec3<f32>(0.0, u.focal.y * invZ, -u.focal.y * camspace.y * invZ2),\n vec3<f32>(0.0, 0.0, 0.0));\n\n let mv3 = mat3x3<f32>(modelView[0].xyz, modelView[1].xyz, modelView[2].xyz);\n let T = transpose(mv3) * J;\n var cov2d = transpose(T) * Vrk * T;\n\n let kernelSize: f32 = 0.3;\n cov2d[0][0] += kernelSize;\n cov2d[1][1] += kernelSize;\n\n let mid = (cov2d[0][0] + cov2d[1][1]) * 0.5;\n let dxy = (cov2d[0][0] - cov2d[1][1]) * 0.5;\n let radius = length(vec2<f32>(dxy, cov2d[0][1]));\n let epsilon: f32 = 0.0001;\n let lambda1 = mid + radius + epsilon;\n let lambda2 = mid - radius + epsilon;\n if (lambda2 < 0.0) {\n out.pos = vec4<f32>(0.0, 0.0, 2.0, 1.0);\n out.vColor = vec4<f32>(0.0);\n out.vPos = vec2<f32>(0.0);\n return out;\n }\n\n let diag = normalize(vec2<f32>(cov2d[0][1], lambda1 - cov2d[0][0]));\n let majorAxis = min(sqrt(2.0 * lambda1), 1024.0) * diag;\n let minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2<f32>(diag.y, -diag.x);\n\n let vCenter = pos2d.xy;\n out.pos = vec4<f32>(\n vCenter + (corner.x * majorAxis + corner.y * minorAxis) * pos2d.w / u.viewport,\n pos2d.z, pos2d.w);\n out.vColor = vec4<f32>(color.rgb + shColor, color.a * u.alpha);\n out.vPos = corner;\n return out;\n}\n\n/*GS_FRAGMENT_DEFINITIONS*/\n@fragment\nfn fs(in: VOut) -> @location(0) vec4<f32> {\n /*GS_FRAGMENT_MAIN_BEGIN*/\n let A = -dot(in.vPos, in.vPos);\n if (A < -4.0) { discard; }\n let B = exp(A) * in.vColor.a;\n var finalColor = vec4<f32>(in.vColor.rgb, B);\n /*GS_FRAGMENT_BEFORE_FRAGCOLOR*/\n /*GS_FRAGMENT_MAIN_END*/\n return finalColor;\n}\n`;\n}\n\nfunction getOrCreateShPipeline(engine: EngineContext, sig: RenderTargetSignature, shDegree: number, fragments?: readonly GsShaderFragment[]): PipelineEntry {\n const device = engine._device;\n if (!_cache || _cache.device !== device) {\n _cache = { device, modules: new Map(), entries: new Map() };\n }\n const fragKey = fragments && fragments.length > 0 ? \"|\" + fragments.map((f) => f.id).join(\",\") : \"\";\n let module = _cache.modules.get(shDegree + fragKey);\n if (!module) {\n module = device.createShaderModule({\n code: fragments && fragments.length > 0 ? applyGsFragments(buildShShaderSource(shDegree), fragments) : buildShShaderSource(shDegree),\n });\n _cache.modules.set(shDegree + fragKey, module);\n }\n const key = `${targetSignatureKey(sig)}|sh${shDegree}${fragKey}`;\n let entry = _cache.entries.get(key);\n if (entry) {\n return entry;\n }\n const shTextureCount = SH_TEXTURE_COUNT[shDegree]!;\n const layoutEntries: GPUBindGroupLayoutEntry[] = [\n { binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: SS.VERTEX, sampler: { type: \"non-filtering\" } },\n { binding: 2, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 3, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 4, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 5, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n ];\n for (let i = 0; i < shTextureCount; i++) {\n layoutEntries.push({ binding: 6 + i, visibility: SS.VERTEX, texture: { sampleType: \"uint\" } });\n }\n const meshBindGroupLayout = device.createBindGroupLayout({ entries: layoutEntries });\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), meshBindGroupLayout] }),\n vertex: {\n module,\n entryPoint: \"vs\",\n buffers: [\n { arrayStride: 8, stepMode: \"vertex\", attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }] },\n { arrayStride: 4, stepMode: \"instance\", attributes: [{ shaderLocation: 1, offset: 0, format: \"float32\" }] },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [\n {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n },\n writeMask: CW.ALL,\n },\n ],\n },\n primitive: { topology: \"triangle-list\", cullMode: \"none\" },\n depthStencil: {\n format: sig._depthStencilFormat ?? \"depth24plus-stencil8\",\n depthCompare: sig._depthCompare ?? \"greater-equal\",\n depthWriteEnabled: false,\n },\n multisample: { count: sig._sampleCount },\n });\n entry = { pipeline, meshBindGroupLayout, shTextureCount };\n _cache.entries.set(key, entry);\n return entry;\n}\n\n/** Build the Renderable for a GaussianSplattingMesh with SH coefficients.\n * Mirrors `buildGaussianSplattingRenderable` but adds eyePosition to the UBO\n * and binds the SH textures. */\nexport function buildGaussianSplattingRenderableSH(scene: SceneContext, mesh: GaussianSplattingMesh, fragments?: readonly GsShaderFragment[]): Renderable {\n const engine = scene.surface.engine;\n const device = engine._device;\n\n // 3 mat4 + 8 floats (viewport,focal,dataSize,alpha,pad) + 4 floats (eyePosition + pad) = 240 bytes.\n const UBO_BYTES = 16 * 4 * 3 + 8 * 4 + 4 * 4;\n const ubo = device.createBuffer({\n size: UBO_BYTES,\n usage: BU.UNIFORM | BU.COPY_DST,\n });\n const cpu = new F32(UBO_BYTES / 4);\n\n cpu[48 + 4] = mesh.textureWidth;\n cpu[48 + 5] = mesh.textureHeight;\n cpu[48 + 6] = 1; // alpha\n cpu[48 + 7] = 0; // pad\n\n const bindGroups = new Map<GPURenderPipeline, GPUBindGroup>();\n\n const getBindGroup = (entry: PipelineEntry): GPUBindGroup => {\n let bg = bindGroups.get(entry.pipeline);\n if (bg) {\n return bg;\n }\n const shViews = mesh._gs._shViews ?? [];\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: ubo } },\n { binding: 1, resource: mesh._gs._sampler },\n { binding: 2, resource: mesh._gs._centersView },\n { binding: 3, resource: mesh._gs._covAView },\n { binding: 4, resource: mesh._gs._covBView },\n { binding: 5, resource: mesh._gs._colorsView },\n ];\n for (let i = 0; i < entry.shTextureCount; i++) {\n entries.push({ binding: 6 + i, resource: shViews[i]! });\n }\n bg = device.createBindGroup({ layout: entry.meshBindGroupLayout, entries });\n bindGroups.set(entry.pipeline, bg);\n return bg;\n };\n\n const SORT_EPS = 1e-4;\n\n const update = (): void => {\n const cam = scene.camera;\n if (!cam) {\n return;\n }\n const size = getRenderTargetSize(engine);\n const aspect = size.width / size.height;\n const view = getViewMatrix(cam) as unknown as Float32Array;\n const proj = getProjectionMatrix(cam, aspect) as unknown as Float32Array;\n const world = mesh.worldMatrix as unknown as Float32Array;\n const camPos = getCameraPosition(cam);\n\n cpu.set(world, 0);\n cpu.set(view, 16);\n cpu.set(proj, 32);\n cpu[48] = size.width;\n cpu[48 + 1] = size.height;\n cpu[48 + 2] = size.width * 0.5 * proj[0]!;\n cpu[48 + 3] = size.height * 0.5 * proj[5]!;\n cpu[56] = camPos.x;\n cpu[57] = camPos.y;\n cpu[58] = camPos.z;\n cpu[59] = 0;\n device.queue.writeBuffer(ubo, 0, cpu.buffer, 0, UBO_BYTES);\n\n if (!mesh._canPostToWorker) {\n return;\n }\n\n const cf0 = view[2]!,\n cf1 = view[6]!,\n cf2 = view[10]!;\n\n let dirty = false;\n const lastW = mesh._sortWorldMatrix;\n for (let i = 0; i < 16; i++) {\n if (Math.abs(lastW[i]! - world[i]!) > SORT_EPS) {\n dirty = true;\n break;\n }\n }\n if (!dirty) {\n const lastCf = mesh._sortCameraForward;\n if (Math.abs(lastCf[0]! - cf0) > SORT_EPS || Math.abs(lastCf[1]! - cf1) > SORT_EPS || Math.abs(lastCf[2]! - cf2) > SORT_EPS) {\n dirty = true;\n }\n }\n if (!dirty) {\n const lastCp = mesh._sortCameraPosition;\n if (Math.abs(lastCp[0]! - camPos.x) > SORT_EPS || Math.abs(lastCp[1]! - camPos.y) > SORT_EPS || Math.abs(lastCp[2]! - camPos.z) > SORT_EPS) {\n dirty = true;\n }\n }\n if (!dirty) {\n return;\n }\n\n mesh._sortWorldMatrix.set(world);\n mesh._sortCameraForward[0] = cf0;\n mesh._sortCameraForward[1] = cf1;\n mesh._sortCameraForward[2] = cf2;\n mesh._sortCameraPosition[0] = camPos.x;\n mesh._sortCameraPosition[1] = camPos.y;\n mesh._sortCameraPosition[2] = camPos.z;\n mesh._canPostToWorker = false;\n mesh._worker.postMessage(\n {\n m: new F32(world),\n f: new F32([cf0, cf1, cf2]),\n c: new F32([camPos.x, camPos.y, camPos.z]),\n d: mesh._depthMix,\n },\n [mesh._depthMix.buffer]\n );\n };\n\n const r: Renderable = {\n order: 200,\n isTransparent: true,\n bind(eng: EngineContext, sig: RenderTargetSignature): DrawBinding {\n const entry = getOrCreateShPipeline(eng as EngineContext, sig, mesh.shDegree, fragments);\n const bindGroup = getBindGroup(entry);\n return {\n renderable: r,\n pipeline: entry.pipeline,\n update,\n draw(pass) {\n pass.setBindGroup(1, bindGroup);\n pass.setVertexBuffer(0, mesh._gs._quadBuffer);\n pass.setVertexBuffer(1, mesh._gs._splatIndexBuffer);\n pass.setIndexBuffer(mesh._gs._indexBuffer, \"uint16\");\n pass.drawIndexed(6, mesh.vertexCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n/** SH-aware variant of `attachGaussianSplattingMesh`. Dynamic-imported by\n * `attachParsedSplat` (in `load-splat.ts`) when the parsed asset carries SH\n * coefficients. Reads `mesh.shDegree` (set at mesh construction), creates\n * the `rgba32uint` SH textures (1..5 depending on degree), patches\n * `mesh._gs` in place, and installs the SH renderable. */\nexport function attachGaussianSplattingMeshSH(scene: SceneContext, mesh: GaussianSplattingMesh, shFlat: Uint8Array, fragments?: readonly GsShaderFragment[]): void {\n const engine = scene.surface.engine;\n const device = engine._device;\n const shDegree = mesh.shDegree;\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\n const shCoefficientCount = shVectorCount * 3;\n const textureCount = Math.ceil(shCoefficientCount / 16);\n const width = mesh.textureWidth;\n const height = mesh.textureHeight;\n\n // Pack the flat SH byte stream into N textures of 16 bytes per splat each.\n // splat i's bytes [i*shCC .. i*shCC + shCC] are split across textures\n // [t=0..textureCount-1], each carrying up to 16 bytes at offset i*16.\n const textures: GPUTexture[] = [];\n const views: GPUTextureView[] = [];\n const vertexCount = mesh.vertexCount;\n for (let t = 0; t < textureCount; t++) {\n const dst = new U8(width * height * 16);\n const tBase = t * 16;\n const bytesThisTex = Math.min(16, shCoefficientCount - tBase);\n for (let i = 0; i < vertexCount; i++) {\n const srcOff = i * shCoefficientCount + tBase;\n const dstOff = i * 16;\n for (let b = 0; b < bytesThisTex; b++) {\n dst[dstOff + b] = shFlat[srcOff + b]!;\n }\n }\n const tex = device.createTexture({\n size: [width, height],\n format: \"rgba32uint\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n device.queue.writeTexture({ texture: tex }, dst.buffer, { bytesPerRow: width * 16 }, { width, height });\n textures.push(tex);\n views.push(tex.createView());\n }\n mesh._gs._shTextures = textures;\n mesh._gs._shViews = views;\n\n const ctx = scene as unknown as { _renderables: Renderable[]; _disposables: (() => void)[]; _gsMeshes: GaussianSplattingMesh[] };\n ctx._renderables.push(buildGaussianSplattingRenderableSH(scene, mesh, fragments));\n ctx._gsMeshes.push(mesh);\n ctx._disposables.push(() => {\n const i = ctx._gsMeshes.indexOf(mesh);\n if (i >= 0) {\n ctx._gsMeshes.splice(i, 1);\n }\n disposeGaussianSplattingMesh(mesh);\n });\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gaussian-splatting-pipeline-sh-B30Mu56i.js","sources":["../src/mesh/GaussianSplatting/gaussian-splatting-pipeline-sh.ts"],"sourcesContent":["/** Gaussian-Splatting SH render pipeline + Renderable.\n *\n * Variant of `gaussian-splatting-pipeline.ts` that adds view-dependent SH\n * shading. Loaded *only* by `loadSplat` (and the SOG / SPZ loaders) via a\n * dynamic `import(...)` when the parsed splat asset includes SH coefficients\n * (`mesh.shDegree > 0`), so plain `.ply` / `.splat` scenes (e.g. scene 120)\n * never pull this module's WGSL or runtime cost into their bundle.\n *\n * WGSL source is generated per-shDegree by `buildShShaderSource`: SH textures,\n * byte-to-vec3 unpacking, and the polynomial evaluation in\n * `computeColorFromSHDegree` all expand to the right size — mirrors the\n * `#if SH_DEGREE > N` blocks in BJS `gaussianSplatting.fx`. Pipeline cache is\n * keyed by `(targetSignatureKey, shDegree)`.\n *\n * The UBO grows by 16 bytes vs the base pipeline to carry `eyePosition`\n * (world-space camera position; see `computeSH(dir)` below).\n *\n * ── Why the Y-flip on the SH direction? ─────────────────────────────────\n * BJS sets `mesh.scaling.y *= -1` to fix coordinate-system handedness; Lite\n * pre-flips Y in `splat-data.ts` at parse time so the runtime mesh transform\n * is identity. World-space splat positions agree across both engines, but\n * the BJS world rotation absorbs an extra `diag(1,-1,1)` factor — i.e.\n * worldRot_bjs = worldRot_user · diag(1,-1,1)\n * which means\n * inverse(worldRot_bjs) · v = diag(1,-1,1) · inverse(worldRot_user) · v\n * so Lite reproduces the BJS SH direction by computing\n * `inverseMat3(worldRot) · (worldPos − eye)` and then negating `.y`. */\n\nimport { F32, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU, SS, CW } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene-core.js\";\nimport type { Renderable, DrawBinding } from \"../../render/renderable.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getViewMatrix, getProjectionMatrix, getCameraPosition } from \"../../camera/camera.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { getRenderTargetSize } from \"../../engine/engine.js\";\nimport { disposeGaussianSplattingMesh, type GaussianSplattingMesh, type GsShaderFragment } from \"./gaussian-splatting-mesh.js\";\nimport { applyGsFragments } from \"./gaussian-splatting-pipeline.js\";\n\ninterface PipelineEntry {\n pipeline: GPURenderPipeline;\n meshBindGroupLayout: GPUBindGroupLayout;\n shTextureCount: number;\n}\n\n// shDegree → number of rgba32uint SH textures: 1→1, 2→2, 3→3, 4→5.\nconst SH_TEXTURE_COUNT = [0, 1, 2, 3, 5];\n\nlet _cache: { device: GPUDevice; modules: Map<string, GPUShaderModule>; entries: Map<string, PipelineEntry> } | null = null;\n\n/** Build the WGSL source for a given SH degree (1..4). Mirrors the BJS\n * preprocessor-driven shader structure: declares only the SH textures used\n * by the degree, emits exactly the byte-stream unpacking for that degree,\n * and inlines only the SH polynomial terms up to that degree. */\nfunction buildShShaderSource(shDegree: number): string {\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\n const shCoefficientCount = shVectorCount * 3;\n const textureCount = Math.ceil(shCoefficientCount / 16);\n\n // ── SH texture bindings (6, 7, …) ───────────────────────────────\n let textureBindings = \"\";\n for (let i = 0; i < textureCount; i++) {\n textureBindings += `@group(1) @binding(${6 + i}) var shTexture${i}: texture_2d<u32>;\\n`;\n }\n\n // ── textureLoad calls inside readSplat ──────────────────────────\n let textureLoads = \"\";\n for (let i = 0; i < textureCount; i++) {\n textureLoads += ` let sh${i}_u32 = textureLoad(shTexture${i}, splatUVi32, 0);\\n`;\n }\n\n // ── Unpack the byte stream into sh[1..shVectorCount] vec3 values.\n //\n // Each rgba32uint texel carries 16 bytes (4 u32s × 4 bytes). The bytes\n // are stored in BJS-coefficient order: byte j of splat i is the j-th\n // component of the [R0,G0,B0, R1,G1,B1, …, R(N-1),G(N-1),B(N-1)] sequence.\n // sh[k+1] (k = 0..shVectorCount-1) reads bytes [3k, 3k+1, 3k+2]. `decompose`\n // returns `(byte * 2/255) - 1`, matching BJS exactly.\n let shUnpack = ` var sh: array<vec3<f32>, ${shVectorCount + 1}>;\\n sh[0] = vec3<f32>(0.0);\\n`;\n const byteRef = (j: number): string => {\n // texture index, u32 index within texel (0..3), byte index within u32 (0..3 == x/y/z/w).\n const tex = (j / 16) | 0;\n const u32Idx = ((j % 16) / 4) | 0;\n const byteIdx = j % 4;\n const u32Field = [\"x\", \"y\", \"z\", \"w\"][u32Idx]!;\n const byteField = [\"x\", \"y\", \"z\", \"w\"][byteIdx]!;\n return `decompose(sh${tex}_u32.${u32Field}).${byteField}`;\n };\n for (let k = 0; k < shVectorCount; k++) {\n const j = k * 3;\n shUnpack += ` sh[${k + 1}] = vec3<f32>(${byteRef(j)}, ${byteRef(j + 1)}, ${byteRef(j + 2)});\\n`;\n }\n\n // ── Polynomial evaluation, conditional on shDegree ──────────────\n let shPoly = \" result = sh[0];\\n\";\n if (shDegree >= 1) {\n shPoly += ` result += -SH_C1 * y * sh[1] + SH_C1 * z * sh[2] - SH_C1 * x * sh[3];\\n`;\n }\n if (shDegree >= 2) {\n shPoly += ` result +=\\n SH_C2[0] * xy * sh[4] +\\n SH_C2[1] * yz * sh[5] +\\n SH_C2[2] * (2.0 * zz - xx - yy) * sh[6] +\\n SH_C2[3] * xz * sh[7] +\\n SH_C2[4] * (xx - yy) * sh[8];\\n`;\n }\n if (shDegree >= 3) {\n shPoly += ` result +=\\n SH_C3[0] * y * (3.0 * xx - yy) * sh[9] +\\n SH_C3[1] * xy * z * sh[10] +\\n SH_C3[2] * y * (4.0 * zz - xx - yy) * sh[11] +\\n SH_C3[3] * z * (2.0 * zz - 3.0 * xx - 3.0 * yy) * sh[12] +\\n SH_C3[4] * x * (4.0 * zz - xx - yy) * sh[13] +\\n SH_C3[5] * z * (xx - yy) * sh[14] +\\n SH_C3[6] * x * (xx - 3.0 * yy) * sh[15];\\n`;\n }\n if (shDegree >= 4) {\n shPoly += ` result +=\\n SH_C4[0] * x * y * (xx - yy) * sh[16] +\\n SH_C4[1] * y * z * (3.0 * xx - yy) * sh[17] +\\n SH_C4[2] * x * y * (7.0 * zz - 1.0) * sh[18] +\\n SH_C4[3] * y * z * (7.0 * zz - 3.0) * sh[19] +\\n SH_C4[4] * (zz * (35.0 * zz - 30.0) + 3.0) * sh[20] +\\n SH_C4[5] * x * z * (7.0 * zz - 3.0) * sh[21] +\\n SH_C4[6] * (xx - yy) * (7.0 * zz - 1.0) * sh[22] +\\n SH_C4[7] * x * z * (xx - 3.0 * yy) * sh[23] +\\n SH_C4[8] * (xx * (xx - 3.0 * yy) - yy * (3.0 * xx - yy)) * sh[24];\\n`;\n }\n\n // SH_C2..SH_C4 constants — only declare what's referenced (silences\n // WGSL \"unused array\" warnings on lower degrees).\n let constantsBlock = `const SH_C1: f32 = 0.48860251;\\n`;\n if (shDegree >= 2) {\n constantsBlock += `const SH_C2: array<f32, 5> = array<f32, 5>(1.092548430, -1.09254843, 0.315391565, -1.09254843, 0.546274215);\\n`;\n }\n if (shDegree >= 3) {\n constantsBlock += `const SH_C3: array<f32, 7> = array<f32, 7>(-0.59004358, 2.890611442, -0.45704579, 0.373176332, -0.45704579, 1.445305721, -0.59004358);\\n`;\n }\n if (shDegree >= 4) {\n constantsBlock += `const SH_C4: array<f32, 9> = array<f32, 9>(2.5033429418, -1.7701307698, 0.9461746958, -0.6690465436, 0.1057855469, -0.6690465436, 0.4730873479, -1.7701307698, 0.6258357354);\\n`;\n }\n\n return `// Gaussian Splatting — vertex + fragment WGSL (SH degree ${shDegree}).\n// Generated by buildShShaderSource. Mirrors BJS gaussianSplatting.vertex.fx +\n// gaussianSplatting.fx (SH_DEGREE = ${shDegree}, no compound parts).\nstruct U {\n world: mat4x4<f32>,\n view: mat4x4<f32>,\n projection: mat4x4<f32>,\n viewport: vec2<f32>,\n focal: vec2<f32>,\n dataSize: vec2<f32>,\n alpha: f32,\n _pad0: f32,\n eyePosition: vec3<f32>,\n _pad1: f32,\n};\n@group(1) @binding(0) var<uniform> u: U;\n@group(1) @binding(1) var samp: sampler;\n@group(1) @binding(2) var centersTex: texture_2d<f32>;\n@group(1) @binding(3) var covATex: texture_2d<f32>;\n@group(1) @binding(4) var covBTex: texture_2d<f32>;\n@group(1) @binding(5) var colorsTex: texture_2d<f32>;\n${textureBindings}\n\nstruct VOut {\n @builtin(position) pos: vec4<f32>,\n @location(0) vColor: vec4<f32>,\n @location(1) vPos: vec2<f32>,\n};\n\n${constantsBlock}\n\nfn dataUv(idx: f32) -> vec2<f32> {\n let y = floor(idx / u.dataSize.x);\n let x = idx - y * u.dataSize.x;\n return vec2<f32>((x + 0.5) / u.dataSize.x, (y + 0.5) / u.dataSize.y);\n}\n\nfn dataUvI(idx: f32) -> vec2<i32> {\n let y = floor(idx / u.dataSize.x);\n let x = idx - y * u.dataSize.x;\n return vec2<i32>(i32(x), i32(y));\n}\n\n// Unpack a u32 of 4 packed bytes into (b0 b1 b2 b3) * 2/255 - 1.\nfn decompose(value: u32) -> vec4<f32> {\n let v = vec4<f32>(\n f32((value >> 0u) & 255u),\n f32((value >> 8u) & 255u),\n f32((value >> 16u) & 255u),\n f32((value >> 24u) & 255u));\n return v * vec4<f32>(2.0 / 255.0) - vec4<f32>(1.0);\n}\n\nfn inverseMat3(m: mat3x3<f32>) -> mat3x3<f32> {\n let a00 = m[0][0]; let a01 = m[0][1]; let a02 = m[0][2];\n let a10 = m[1][0]; let a11 = m[1][1]; let a12 = m[1][2];\n let a20 = m[2][0]; let a21 = m[2][1]; let a22 = m[2][2];\n let b01 = a22 * a11 - a12 * a21;\n let b11 = -a22 * a10 + a12 * a20;\n let b21 = a21 * a10 - a11 * a20;\n let det = a00 * b01 + a01 * b11 + a02 * b21;\n return mat3x3<f32>(\n vec3<f32>(b01 / det, (-a22 * a01 + a02 * a21) / det, (a12 * a01 - a02 * a11) / det),\n vec3<f32>(b11 / det, (a22 * a00 - a02 * a20) / det, (-a12 * a00 + a02 * a10) / det),\n vec3<f32>(b21 / det, (-a21 * a00 + a01 * a20) / det, (a11 * a00 - a01 * a10) / det));\n}\n\nfn computeSH(dir: vec3<f32>, splatUVi32: vec2<i32>) -> vec3<f32> {\n${textureLoads}${shUnpack} let x = dir.x;\n let y = dir.y;\n let z = dir.z;\n let xx = x * x; let yy = y * y; let zz = z * z;\n let xy = x * y; let yz = y * z; let xz = x * z;\n var result: vec3<f32>;\n${shPoly} return result;\n}\n\n@vertex\nfn vs(@location(0) corner: vec2<f32>, @location(1) splatIndex: f32) -> VOut {\n var out: VOut;\n let uv = dataUv(splatIndex);\n let splatUVi32 = dataUvI(splatIndex);\n let center = textureSampleLevel(centersTex, samp, uv, 0.0).xyz;\n let color = textureSampleLevel(colorsTex, samp, uv, 0.0);\n let covA = textureSampleLevel(covATex, samp, uv, 0.0).xyz;\n let covB = textureSampleLevel(covBTex, samp, uv, 0.0).xyz;\n\n let worldPos = u.world * vec4<f32>(center, 1.0);\n let modelView = u.view * u.world;\n let camspace = u.view * worldPos;\n let pos2d = u.projection * camspace;\n\n let bounds = 1.2 * pos2d.w;\n if (pos2d.z < 0.0\n || pos2d.x < -bounds || pos2d.x > bounds\n || pos2d.y < -bounds || pos2d.y > bounds) {\n out.pos = vec4<f32>(0.0, 0.0, 2.0, 1.0);\n out.vColor = vec4<f32>(0.0);\n out.vPos = vec2<f32>(0.0);\n return out;\n }\n\n // ── View-dependent SH evaluation ───────────────────────────────────\n let worldRot = mat3x3<f32>(u.world[0].xyz, u.world[1].xyz, u.world[2].xyz);\n let normWorldRot = inverseMat3(worldRot);\n var dir = normalize(normWorldRot * (worldPos.xyz - u.eyePosition));\n // Lite-side Y-flip: compensates for our data-path Y pre-flip vs BJS's\n // mesh.scaling.y *= -1 (see file header for derivation).\n dir.y = -dir.y;\n let shColor = computeSH(dir, splatUVi32);\n\n let Vrk = mat3x3<f32>(\n vec3<f32>(covA.x, covA.y, covA.z),\n vec3<f32>(covA.y, covB.x, covB.y),\n vec3<f32>(covA.z, covB.y, covB.z));\n\n let invZ = 1.0 / camspace.z;\n let invZ2 = invZ * invZ;\n let J = mat3x3<f32>(\n vec3<f32>(u.focal.x * invZ, 0.0, -u.focal.x * camspace.x * invZ2),\n vec3<f32>(0.0, u.focal.y * invZ, -u.focal.y * camspace.y * invZ2),\n vec3<f32>(0.0, 0.0, 0.0));\n\n let mv3 = mat3x3<f32>(modelView[0].xyz, modelView[1].xyz, modelView[2].xyz);\n let T = transpose(mv3) * J;\n var cov2d = transpose(T) * Vrk * T;\n\n let kernelSize: f32 = 0.3;\n cov2d[0][0] += kernelSize;\n cov2d[1][1] += kernelSize;\n\n let mid = (cov2d[0][0] + cov2d[1][1]) * 0.5;\n let dxy = (cov2d[0][0] - cov2d[1][1]) * 0.5;\n let radius = length(vec2<f32>(dxy, cov2d[0][1]));\n let epsilon: f32 = 0.0001;\n let lambda1 = mid + radius + epsilon;\n let lambda2 = mid - radius + epsilon;\n if (lambda2 < 0.0) {\n out.pos = vec4<f32>(0.0, 0.0, 2.0, 1.0);\n out.vColor = vec4<f32>(0.0);\n out.vPos = vec2<f32>(0.0);\n return out;\n }\n\n let diag = normalize(vec2<f32>(cov2d[0][1], lambda1 - cov2d[0][0]));\n let majorAxis = min(sqrt(2.0 * lambda1), 1024.0) * diag;\n let minorAxis = min(sqrt(2.0 * lambda2), 1024.0) * vec2<f32>(diag.y, -diag.x);\n\n let vCenter = pos2d.xy;\n out.pos = vec4<f32>(\n vCenter + (corner.x * majorAxis + corner.y * minorAxis) * pos2d.w / u.viewport,\n pos2d.z, pos2d.w);\n out.vColor = vec4<f32>(color.rgb + shColor, color.a * u.alpha);\n out.vPos = corner;\n return out;\n}\n\n/*GS_FRAGMENT_DEFINITIONS*/\n@fragment\nfn fs(in: VOut) -> @location(0) vec4<f32> {\n /*GS_FRAGMENT_MAIN_BEGIN*/\n let A = -dot(in.vPos, in.vPos);\n if (A < -4.0) { discard; }\n let B = exp(A) * in.vColor.a;\n var finalColor = vec4<f32>(in.vColor.rgb, B);\n /*GS_FRAGMENT_BEFORE_FRAGCOLOR*/\n /*GS_FRAGMENT_MAIN_END*/\n return finalColor;\n}\n`;\n}\n\nfunction getOrCreateShPipeline(engine: EngineContext, sig: RenderTargetSignature, shDegree: number, fragments?: readonly GsShaderFragment[]): PipelineEntry {\n const device = engine._device;\n if (!_cache || _cache.device !== device) {\n _cache = { device, modules: new Map(), entries: new Map() };\n }\n const fragKey = fragments && fragments.length > 0 ? \"|\" + fragments.map((f) => f.id).join(\",\") : \"\";\n let module = _cache.modules.get(shDegree + fragKey);\n if (!module) {\n module = device.createShaderModule({\n code: fragments && fragments.length > 0 ? applyGsFragments(buildShShaderSource(shDegree), fragments) : buildShShaderSource(shDegree),\n });\n _cache.modules.set(shDegree + fragKey, module);\n }\n const key = `${targetSignatureKey(sig)}|sh${shDegree}${fragKey}`;\n let entry = _cache.entries.get(key);\n if (entry) {\n return entry;\n }\n const shTextureCount = SH_TEXTURE_COUNT[shDegree]!;\n const layoutEntries: GPUBindGroupLayoutEntry[] = [\n { binding: 0, visibility: SS.VERTEX | SS.FRAGMENT, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: SS.VERTEX, sampler: { type: \"non-filtering\" } },\n { binding: 2, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 3, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 4, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n { binding: 5, visibility: SS.VERTEX, texture: { sampleType: \"unfilterable-float\" } },\n ];\n for (let i = 0; i < shTextureCount; i++) {\n layoutEntries.push({ binding: 6 + i, visibility: SS.VERTEX, texture: { sampleType: \"uint\" } });\n }\n const meshBindGroupLayout = device.createBindGroupLayout({ entries: layoutEntries });\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), meshBindGroupLayout] }),\n vertex: {\n module,\n entryPoint: \"vs\",\n buffers: [\n { arrayStride: 8, stepMode: \"vertex\", attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }] },\n { arrayStride: 4, stepMode: \"instance\", attributes: [{ shaderLocation: 1, offset: 0, format: \"float32\" }] },\n ],\n },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [\n {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n },\n writeMask: CW.ALL,\n },\n ],\n },\n primitive: { topology: \"triangle-list\", cullMode: \"none\" },\n depthStencil: {\n format: sig._depthStencilFormat ?? \"depth24plus-stencil8\",\n depthCompare: sig._depthCompare ?? \"greater-equal\",\n depthWriteEnabled: false,\n },\n multisample: { count: sig._sampleCount },\n });\n entry = { pipeline, meshBindGroupLayout, shTextureCount };\n _cache.entries.set(key, entry);\n return entry;\n}\n\n/** Build the Renderable for a GaussianSplattingMesh with SH coefficients.\n * Mirrors `buildGaussianSplattingRenderable` but adds eyePosition to the UBO\n * and binds the SH textures. */\nexport function buildGaussianSplattingRenderableSH(scene: SceneContext, mesh: GaussianSplattingMesh, fragments?: readonly GsShaderFragment[]): Renderable {\n const engine = scene.surface.engine;\n const device = engine._device;\n\n // 3 mat4 + 8 floats (viewport,focal,dataSize,alpha,pad) + 4 floats (eyePosition + pad) = 240 bytes.\n const UBO_BYTES = 16 * 4 * 3 + 8 * 4 + 4 * 4;\n const ubo = device.createBuffer({\n size: UBO_BYTES,\n usage: BU.UNIFORM | BU.COPY_DST,\n });\n const cpu = new F32(UBO_BYTES / 4);\n\n cpu[48 + 4] = mesh.textureWidth;\n cpu[48 + 5] = mesh.textureHeight;\n cpu[48 + 6] = 1; // alpha\n cpu[48 + 7] = 0; // pad\n\n const bindGroups = new Map<GPURenderPipeline, GPUBindGroup>();\n\n const getBindGroup = (entry: PipelineEntry): GPUBindGroup => {\n let bg = bindGroups.get(entry.pipeline);\n if (bg) {\n return bg;\n }\n const shViews = mesh._gs._shViews ?? [];\n const entries: GPUBindGroupEntry[] = [\n { binding: 0, resource: { buffer: ubo } },\n { binding: 1, resource: mesh._gs._sampler },\n { binding: 2, resource: mesh._gs._centersView },\n { binding: 3, resource: mesh._gs._covAView },\n { binding: 4, resource: mesh._gs._covBView },\n { binding: 5, resource: mesh._gs._colorsView },\n ];\n for (let i = 0; i < entry.shTextureCount; i++) {\n entries.push({ binding: 6 + i, resource: shViews[i]! });\n }\n bg = device.createBindGroup({ layout: entry.meshBindGroupLayout, entries });\n bindGroups.set(entry.pipeline, bg);\n return bg;\n };\n\n const SORT_EPS = 1e-4;\n\n const update = (): void => {\n const cam = scene.camera;\n if (!cam) {\n return;\n }\n const size = getRenderTargetSize(engine);\n const aspect = size.width / size.height;\n const view = getViewMatrix(cam) as unknown as Float32Array;\n const proj = getProjectionMatrix(cam, aspect) as unknown as Float32Array;\n const world = mesh.worldMatrix as unknown as Float32Array;\n const camPos = getCameraPosition(cam);\n\n cpu.set(world, 0);\n cpu.set(view, 16);\n cpu.set(proj, 32);\n cpu[48] = size.width;\n cpu[48 + 1] = size.height;\n cpu[48 + 2] = size.width * 0.5 * proj[0]!;\n cpu[48 + 3] = size.height * 0.5 * proj[5]!;\n cpu[56] = camPos.x;\n cpu[57] = camPos.y;\n cpu[58] = camPos.z;\n cpu[59] = 0;\n device.queue.writeBuffer(ubo, 0, cpu.buffer, 0, UBO_BYTES);\n\n if (!mesh._canPostToWorker) {\n return;\n }\n\n const cf0 = view[2]!,\n cf1 = view[6]!,\n cf2 = view[10]!;\n\n let dirty = false;\n const lastW = mesh._sortWorldMatrix;\n for (let i = 0; i < 16; i++) {\n if (Math.abs(lastW[i]! - world[i]!) > SORT_EPS) {\n dirty = true;\n break;\n }\n }\n if (!dirty) {\n const lastCf = mesh._sortCameraForward;\n if (Math.abs(lastCf[0]! - cf0) > SORT_EPS || Math.abs(lastCf[1]! - cf1) > SORT_EPS || Math.abs(lastCf[2]! - cf2) > SORT_EPS) {\n dirty = true;\n }\n }\n if (!dirty) {\n const lastCp = mesh._sortCameraPosition;\n if (Math.abs(lastCp[0]! - camPos.x) > SORT_EPS || Math.abs(lastCp[1]! - camPos.y) > SORT_EPS || Math.abs(lastCp[2]! - camPos.z) > SORT_EPS) {\n dirty = true;\n }\n }\n if (!dirty) {\n return;\n }\n\n mesh._sortWorldMatrix.set(world);\n mesh._sortCameraForward[0] = cf0;\n mesh._sortCameraForward[1] = cf1;\n mesh._sortCameraForward[2] = cf2;\n mesh._sortCameraPosition[0] = camPos.x;\n mesh._sortCameraPosition[1] = camPos.y;\n mesh._sortCameraPosition[2] = camPos.z;\n mesh._canPostToWorker = false;\n mesh._worker.postMessage(\n {\n m: new F32(world),\n f: new F32([cf0, cf1, cf2]),\n c: new F32([camPos.x, camPos.y, camPos.z]),\n d: mesh._depthMix,\n },\n [mesh._depthMix.buffer]\n );\n };\n\n const r: Renderable = {\n order: 200,\n isTransparent: true,\n bind(eng: EngineContext, sig: RenderTargetSignature): DrawBinding {\n const entry = getOrCreateShPipeline(eng as EngineContext, sig, mesh.shDegree, fragments);\n const bindGroup = getBindGroup(entry);\n return {\n renderable: r,\n pipeline: entry.pipeline,\n update,\n draw(pass) {\n pass.setBindGroup(1, bindGroup);\n pass.setVertexBuffer(0, mesh._gs._quadBuffer);\n pass.setVertexBuffer(1, mesh._gs._splatIndexBuffer);\n pass.setIndexBuffer(mesh._gs._indexBuffer, \"uint16\");\n pass.drawIndexed(6, mesh.vertexCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n/** SH-aware variant of `attachGaussianSplattingMesh`. Dynamic-imported by\n * `attachParsedSplat` (in `load-splat.ts`) when the parsed asset carries SH\n * coefficients. Reads `mesh.shDegree` (set at mesh construction), creates\n * the `rgba32uint` SH textures (1..5 depending on degree), patches\n * `mesh._gs` in place, and installs the SH renderable. */\nexport function attachGaussianSplattingMeshSH(scene: SceneContext, mesh: GaussianSplattingMesh, shFlat: Uint8Array, fragments?: readonly GsShaderFragment[]): void {\n const engine = scene.surface.engine;\n const device = engine._device;\n const shDegree = mesh.shDegree;\n const shVectorCount = (shDegree + 1) * (shDegree + 1) - 1;\n const shCoefficientCount = shVectorCount * 3;\n const textureCount = Math.ceil(shCoefficientCount / 16);\n const width = mesh.textureWidth;\n const height = mesh.textureHeight;\n\n // Pack the flat SH byte stream into N textures of 16 bytes per splat each.\n // splat i's bytes [i*shCC .. i*shCC + shCC] are split across textures\n // [t=0..textureCount-1], each carrying up to 16 bytes at offset i*16.\n const textures: GPUTexture[] = [];\n const views: GPUTextureView[] = [];\n const vertexCount = mesh.vertexCount;\n for (let t = 0; t < textureCount; t++) {\n const dst = new U8(width * height * 16);\n const tBase = t * 16;\n const bytesThisTex = Math.min(16, shCoefficientCount - tBase);\n for (let i = 0; i < vertexCount; i++) {\n const srcOff = i * shCoefficientCount + tBase;\n const dstOff = i * 16;\n for (let b = 0; b < bytesThisTex; b++) {\n dst[dstOff + b] = shFlat[srcOff + b]!;\n }\n }\n const tex = device.createTexture({\n size: [width, height],\n format: \"rgba32uint\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n device.queue.writeTexture({ texture: tex }, dst.buffer, { bytesPerRow: width * 16 }, { width, height });\n textures.push(tex);\n views.push(tex.createView());\n }\n mesh._gs._shTextures = textures;\n mesh._gs._shViews = views;\n\n const ctx = scene as unknown as { _renderables: Renderable[]; _disposables: (() => void)[]; _gsMeshes: GaussianSplattingMesh[] };\n ctx._renderables.push(buildGaussianSplattingRenderableSH(scene, mesh, fragments));\n ctx._gsMeshes.push(mesh);\n ctx._disposables.push(() => {\n const i = ctx._gsMeshes.indexOf(mesh);\n if (i >= 0) {\n ctx._gsMeshes.splice(i, 1);\n }\n disposeGaussianSplattingMesh(mesh);\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { G as GeometryTextureType } from "./index-
|
|
1
|
+
import { G as GeometryTextureType } from "./index-BgY3QEzL.js";
|
|
2
2
|
const INPUTS = [
|
|
3
3
|
["worldPosition", GeometryTextureType.WORLD_POSITION, "vec3f"],
|
|
4
4
|
["localPosition", GeometryTextureType.LOCAL_POSITION, "vec3f"],
|
|
@@ -38,4 +38,4 @@ const emitter = {
|
|
|
38
38
|
export {
|
|
39
39
|
emitter
|
|
40
40
|
};
|
|
41
|
-
//# sourceMappingURL=geometry-texture-output-
|
|
41
|
+
//# sourceMappingURL=geometry-texture-output-DURiaJ_n.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry-texture-output-
|
|
1
|
+
{"version":3,"file":"geometry-texture-output-DURiaJ_n.js","sources":["../src/material/node/blocks/geometry-texture-output.ts"],"sourcesContent":["/** GeometryTextureOutputBlock emitter — the geometry-pass fragment terminal.\n *\n * Lite analogue of Babylon.js' `PrePassOutputBlock`. Declares one optional\n * input per {@link GeometryTextureType} (11 total). For every CONNECTED input\n * it resolves + casts the upstream value and stashes the WGSL expression onto\n * `state._geometryInputs`, keyed by the geometry texture type. It never writes\n * `_NME_FRAG_OUTPUT_` — the node pipeline's geometry path (see\n * node-geometry-view.ts / node-pipeline.ts `_mrtOutput`) turns the stashed\n * expressions into the multi-attachment `FragmentOutput` writes, filling any\n * unconnected attachment with the engine default.\n *\n * This block is only ever emitted when the graph is re-walked from this\n * terminal during a geometry-renderer pass; the normal colour pass walks the\n * `FragmentOutputBlock` instead and never touches this code.\n */\n\nimport { GeometryTextureType } from \"../../../frame-graph/geometry-types.js\";\nimport type { BlockEmitter, NodeBuildState, NodeExpr, NodeValueType } from \"../node-types.js\";\n\n/** input name → (geometry texture type, cast target) */\nconst INPUTS: ReadonlyArray<readonly [string, GeometryTextureType, NodeValueType]> = [\n [\"worldPosition\", GeometryTextureType.WORLD_POSITION, \"vec3f\"],\n [\"localPosition\", GeometryTextureType.LOCAL_POSITION, \"vec3f\"],\n [\"worldNormal\", GeometryTextureType.WORLD_NORMAL, \"vec3f\"],\n [\"viewNormal\", GeometryTextureType.VIEW_NORMAL, \"vec3f\"],\n [\"reflectivity\", GeometryTextureType.REFLECTIVITY, \"vec4f\"],\n [\"albedo\", GeometryTextureType.ALBEDO, \"vec3f\"],\n [\"irradiance\", GeometryTextureType.IRRADIANCE, \"vec3f\"],\n [\"viewDepth\", GeometryTextureType.VIEW_DEPTH, \"f32\"],\n [\"normalizedViewDepth\", GeometryTextureType.NORMALIZED_VIEW_DEPTH, \"f32\"],\n [\"screenspaceDepth\", GeometryTextureType.SCREENSPACE_DEPTH, \"f32\"],\n [\"linearVelocity\", GeometryTextureType.LINEAR_VELOCITY, \"vec3f\"],\n];\n\nfunction geometryInputs(state: NodeBuildState): Map<GeometryTextureType, NodeExpr> {\n if (!state._geometryInputs) {\n state._geometryInputs = new Map<GeometryTextureType, NodeExpr>();\n }\n return state._geometryInputs;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"GeometryTextureOutputBlock\",\n stage: \"fragment\",\n emit(block, _outputName, stage, state, ctx) {\n const out = geometryInputs(state);\n for (const [name, type, cast] of INPUTS) {\n const conn = block.inputs.get(name);\n if (conn && conn.source) {\n const value = ctx.cast(ctx.resolve(block, name, stage, state), cast);\n // Stash via an SSA temp so the geometry write site references a\n // single stable identifier rather than re-evaluating the chain.\n const t = ctx.temp(state, \"geom\");\n state.fragment.body.push(`let ${t} = ${value.expr};`);\n out.set(type, { expr: t, type: value.type });\n }\n }\n // Terminal block — the returned value is never consumed.\n return { expr: \"vec4<f32>(0.0, 0.0, 0.0, 1.0)\", type: \"vec4f\" };\n },\n};\n"],"names":[],"mappings":";AAoBA,MAAM,SAA+E;AAAA,EACjF,CAAC,iBAAiB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7D,CAAC,iBAAiB,oBAAoB,gBAAgB,OAAO;AAAA,EAC7D,CAAC,eAAe,oBAAoB,cAAc,OAAO;AAAA,EACzD,CAAC,cAAc,oBAAoB,aAAa,OAAO;AAAA,EACvD,CAAC,gBAAgB,oBAAoB,cAAc,OAAO;AAAA,EAC1D,CAAC,UAAU,oBAAoB,QAAQ,OAAO;AAAA,EAC9C,CAAC,cAAc,oBAAoB,YAAY,OAAO;AAAA,EACtD,CAAC,aAAa,oBAAoB,YAAY,KAAK;AAAA,EACnD,CAAC,uBAAuB,oBAAoB,uBAAuB,KAAK;AAAA,EACxE,CAAC,oBAAoB,oBAAoB,mBAAmB,KAAK;AAAA,EACjE,CAAC,kBAAkB,oBAAoB,iBAAiB,OAAO;AACnE;AAEA,SAAS,eAAe,OAA2D;AAC/E,MAAI,CAAC,MAAM,iBAAiB;AACxB,UAAM,sCAAsB,IAAA;AAAA,EAChC;AACA,SAAO,MAAM;AACjB;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,MAAM,eAAe,KAAK;AAChC,eAAW,CAAC,MAAM,MAAM,IAAI,KAAK,QAAQ;AACrC,YAAM,OAAO,MAAM,OAAO,IAAI,IAAI;AAClC,UAAI,QAAQ,KAAK,QAAQ;AACrB,cAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,MAAM,OAAO,KAAK,GAAG,IAAI;AAGnE,cAAM,IAAI,IAAI,KAAK,OAAO,MAAM;AAChC,cAAM,SAAS,KAAK,KAAK,OAAO,CAAC,MAAM,MAAM,IAAI,GAAG;AACpD,YAAI,IAAI,MAAM,EAAE,MAAM,GAAG,MAAM,MAAM,MAAM;AAAA,MAC/C;AAAA,IACJ;AAEA,WAAO,EAAE,MAAM,iCAAiC,MAAM,QAAA;AAAA,EAC1D;AACJ;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { G as GeometryTextureType,
|
|
1
|
+
import { G as GeometryTextureType, R as MATERIAL_ALPHA_BLEND, ai as SPECULAR_USES_UV2, ah as HAS_SPECULAR_TEXTURE, aw as _computeMeshFeatures, a as F32, b as writeMeshLightSelection, ay as createUniformBuffer, az as collectStdBoundTextures, aA as acquireTexture, aB as releaseTexture, bK as _getStdExtsSorted, aG as MSH_HAS_THIN_INSTANCES, A as getSceneBindGroupLayout, ap as HAS_OPACITY_TEXTURE, aD as NEEDS_UV, bM as HAS_DIFFUSE_TEXTURE, aE as MSH_HAS_INSTANCE_COLOR, y as targetSignatureKey, bO as DOUBLE_SIDED, aF as NEEDS_UV2, P as createMaterialView, c4 as GEOMETRY_OUTPUT } from "./index-BgY3QEzL.js";
|
|
2
2
|
import { createThinInstanceFragment } from "./thin-instance-fragment-hsv-RyDs.js";
|
|
3
|
-
import { syncThinInstanceBuffers } from "./thin-instance-gpu-
|
|
4
|
-
import { d as composeStandardShader, w as writeStdMaterialData } from "./standard-pipeline-
|
|
3
|
+
import { syncThinInstanceBuffers } from "./thin-instance-gpu-C1DGstap.js";
|
|
4
|
+
import { d as composeStandardShader, w as writeStdMaterialData } from "./standard-pipeline-DXFOUqU_.js";
|
|
5
5
|
const STAGE_FRAGMENT = 2;
|
|
6
6
|
const STAGE_VERTEX = 1;
|
|
7
7
|
function needsGpUbo(attachments) {
|
|
@@ -401,4 +401,4 @@ function createStandardGeometryMaterialView(source, config) {
|
|
|
401
401
|
export {
|
|
402
402
|
createStandardGeometryMaterialView
|
|
403
403
|
};
|
|
404
|
-
//# sourceMappingURL=geometry-view-
|
|
404
|
+
//# sourceMappingURL=geometry-view-DRrscyWU.js.map
|