@babylonjs/lite 0.2.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{_mat4-storage-f64-Bvh5TymE.js → _mat4-storage-f64-CjDoht2w.js} +3 -2
- package/_mat4-storage-f64-CjDoht2w.js.map +1 -0
- package/{alpha-test-fragment-BCChpzaV.js → alpha-test-fragment-B7DjSnF7.js} +2 -2
- package/{alpha-test-fragment-BCChpzaV.js.map → alpha-test-fragment-B7DjSnF7.js.map} +1 -1
- package/assets/splat-sort-worker-DT3eybMZ.js.map +1 -0
- package/{background-dds-skybox-ZjrSIxrT.js → background-dds-skybox-BEX309u3.js} +13 -13
- package/background-dds-skybox-BEX309u3.js.map +1 -0
- package/{background-ground-B2Mie-MI.js → background-ground-BU0HOcM4.js} +19 -19
- package/background-ground-BU0HOcM4.js.map +1 -0
- package/{background-hdr-skybox-DDRJYuT2.js → background-hdr-skybox--RRRic_K.js} +10 -10
- package/background-hdr-skybox--RRRic_K.js.map +1 -0
- package/{background-solid-skybox-fjXlnWaD.js → background-solid-skybox-BrH2fXSu.js} +11 -12
- package/background-solid-skybox-BrH2fXSu.js.map +1 -0
- package/{billboard-renderable-DKmlOgbM.js → billboard-renderable-BHWryAeC.js} +46 -10
- package/billboard-renderable-BHWryAeC.js.map +1 -0
- package/{clamp-block-CxRBPlUq.js → clamp-block-DqbwnQGW.js} +2 -2
- package/{clamp-block-CxRBPlUq.js.map → clamp-block-DqbwnQGW.js.map} +1 -1
- package/{clearcoat-fragment-KbZAa0TA.js → clearcoat-fragment-D6FSCie1.js} +2 -2
- package/{clearcoat-fragment-KbZAa0TA.js.map → clearcoat-fragment-D6FSCie1.js.map} +1 -1
- package/{create-skeleton-BBI5urcj.js → create-skeleton-D_uplboC.js} +9 -9
- package/create-skeleton-D_uplboC.js.map +1 -0
- package/{cubemap-skybox-material-DvW81drX.js → cubemap-skybox-material-DQcMMdf-.js} +6 -7
- package/cubemap-skybox-material-DQcMMdf-.js.map +1 -0
- package/{curve-block-Dh_xdUj-.js → curve-block-21rT0JjG.js} +2 -2
- package/{curve-block-Dh_xdUj-.js.map → curve-block-21rT0JjG.js.map} +1 -1
- package/{emissive-fragment-DD8cvHyx.js → emissive-fragment-C5FtBs3y.js} +3 -3
- package/emissive-fragment-C5FtBs3y.js.map +1 -0
- package/{esm-shadow-view-DYAc62Kl.js → esm-shadow-view-Cl3rPGof.js} +2 -2
- package/{esm-shadow-view-DYAc62Kl.js.map → esm-shadow-view-Cl3rPGof.js.map} +1 -1
- package/{esm-shadow-view-DHVS9r7H.js → esm-shadow-view-Gtd1LWRP.js} +2 -2
- package/{esm-shadow-view-DHVS9r7H.js.map → esm-shadow-view-Gtd1LWRP.js.map} +1 -1
- package/{esm-shadow-view-15S4JK6p.js → esm-shadow-view-c5YV4Eg9.js} +2 -2
- package/{esm-shadow-view-15S4JK6p.js.map → esm-shadow-view-c5YV4Eg9.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-BvkUhA9V.js → gaussian-splatting-pipeline-sh-7J31V23x.js} +19 -19
- package/gaussian-splatting-pipeline-sh-7J31V23x.js.map +1 -0
- package/geometry-texture-output-dXk4E9uu.js +41 -0
- package/geometry-texture-output-dXk4E9uu.js.map +1 -0
- package/geometry-view-BsFJpBJa.js +404 -0
- package/geometry-view-BsFJpBJa.js.map +1 -0
- package/{gltf-animation-KnPzeOIY.js → gltf-animation-K_zZxj_d.js} +6 -6
- package/gltf-animation-K_zZxj_d.js.map +1 -0
- package/{gltf-ext-basisu-kmth3UWX.js → gltf-ext-basisu-CDbPclzZ.js} +48 -16
- package/gltf-ext-basisu-CDbPclzZ.js.map +1 -0
- package/{gltf-ext-node-visibility-BjRRd6si.js → gltf-ext-node-visibility-DXCJEYr6.js} +2 -2
- package/{gltf-ext-node-visibility-BjRRd6si.js.map → gltf-ext-node-visibility-DXCJEYr6.js.map} +1 -1
- package/{gltf-ext-quantization-CpZyLDIz.js → gltf-ext-quantization-CvHI_0Vg.js} +4 -3
- package/gltf-ext-quantization-CvHI_0Vg.js.map +1 -0
- package/{gltf-ext-uv-transform-MHmR-YyM.js → gltf-ext-uv-transform-DgYazJBs.js} +2 -2
- package/{gltf-ext-uv-transform-MHmR-YyM.js.map → gltf-ext-uv-transform-DgYazJBs.js.map} +1 -1
- package/{gltf-feature-animation-pointer-rFqLfbO_.js → gltf-feature-animation-pointer-D1RJRFBw.js} +9 -9
- package/gltf-feature-animation-pointer-D1RJRFBw.js.map +1 -0
- package/{gltf-feature-animations-DikONdzi.js → gltf-feature-animations-Cmc1uoIu.js} +2 -2
- package/{gltf-feature-animations-DikONdzi.js.map → gltf-feature-animations-Cmc1uoIu.js.map} +1 -1
- package/{gltf-feature-draco-yGSMGTE3.js → gltf-feature-draco-CKKzT5E3.js} +6 -5
- package/gltf-feature-draco-CKKzT5E3.js.map +1 -0
- package/{gltf-feature-gpu-instancing-Cj1XjmM6.js → gltf-feature-gpu-instancing-n87SO6Vh.js} +4 -4
- package/gltf-feature-gpu-instancing-n87SO6Vh.js.map +1 -0
- package/{gltf-feature-lights-punctual-C-0SlGmD.js → gltf-feature-lights-punctual-Ckm3ciL8.js} +5 -5
- package/{gltf-feature-lights-punctual-C-0SlGmD.js.map → gltf-feature-lights-punctual-Ckm3ciL8.js.map} +1 -1
- package/{gltf-feature-meshopt-Des96YFI.js → gltf-feature-meshopt-DLC4SF1E.js} +7 -6
- package/gltf-feature-meshopt-DLC4SF1E.js.map +1 -0
- package/{gltf-feature-morph-BAcY14XU.js → gltf-feature-morph-Cjtu7hYa.js} +4 -4
- package/gltf-feature-morph-Cjtu7hYa.js.map +1 -0
- package/{gltf-feature-registry-97sY_x5O.js → gltf-feature-registry-C63Hjp9w.js} +15 -15
- package/{gltf-feature-registry-97sY_x5O.js.map → gltf-feature-registry-C63Hjp9w.js.map} +1 -1
- package/{gltf-feature-skeleton-lVjkDfIU.js → gltf-feature-skeleton-DKbOGidp.js} +3 -3
- package/{gltf-feature-skeleton-lVjkDfIU.js.map → gltf-feature-skeleton-DKbOGidp.js.map} +1 -1
- package/{gltf-feature-variants-BphF4JmV.js → gltf-feature-variants-Cmzu0O0e.js} +2 -2
- package/{gltf-feature-variants-BphF4JmV.js.map → gltf-feature-variants-Cmzu0O0e.js.map} +1 -1
- package/{gltf-glb-parser-D6UZWFuC.js → gltf-glb-parser-Cj5MHS-v.js} +5 -4
- package/gltf-glb-parser-Cj5MHS-v.js.map +1 -0
- package/{gltf-interleave-C9eBqH_F.js → gltf-interleave-gHf9_t0i.js} +14 -14
- package/gltf-interleave-gHf9_t0i.js.map +1 -0
- package/{gltf-pbr-builder-ext-DPC0zg_u.js → gltf-pbr-builder-ext-edNcjwPf.js} +5 -5
- package/gltf-pbr-builder-ext-edNcjwPf.js.map +1 -0
- package/{gltf-variants-CnBEZr0o.js → gltf-variants-CPxNdtP4.js} +4 -4
- package/{gltf-variants-CnBEZr0o.js.map → gltf-variants-CPxNdtP4.js.map} +1 -1
- package/{gs-picking-pipeline-Bx8LTav6.js → gs-picking-pipeline-DYaW_Lg3.js} +14 -14
- package/gs-picking-pipeline-DYaW_Lg3.js.map +1 -0
- package/havok-floating-origin-Dr-18Nds.js +198 -0
- package/havok-floating-origin-Dr-18Nds.js.map +1 -0
- package/index-CLElg2Bo.js +39209 -0
- package/index-CLElg2Bo.js.map +1 -0
- package/index-CYZDclhF.js +918 -0
- package/index-CYZDclhF.js.map +1 -0
- package/index-SMJ67XwT.js +3330 -0
- package/index-SMJ67XwT.js.map +1 -0
- package/index.d.ts +2007 -105
- package/index.js +446 -322
- package/{input-block-Coi_aZwl.js → input-block-DqEedWF2.js} +2 -2
- package/{input-block-Coi_aZwl.js.map → input-block-DqEedWF2.js.map} +1 -1
- package/{iridescence-fragment-DwZcCTdD.js → iridescence-fragment-BHU59-gQ.js} +2 -2
- package/{iridescence-fragment-DwZcCTdD.js.map → iridescence-fragment-BHU59-gQ.js.map} +1 -1
- package/{light-block-Np_h5gPI.js → light-block-Bv37V8vl.js} +2 -2
- package/{light-block-Np_h5gPI.js.map → light-block-Bv37V8vl.js.map} +1 -1
- package/{loop-block-BFkLFYGm.js → loop-block-qTg8vb99.js} +2 -2
- package/{loop-block-BFkLFYGm.js.map → loop-block-qTg8vb99.js.map} +1 -1
- package/{morph-fragment-DqH-w61u.js → morph-fragment-BRCUr2wQ.js} +2 -2
- package/{morph-fragment-DqH-w61u.js.map → morph-fragment-BRCUr2wQ.js.map} +1 -1
- package/{multilight-wgsl-B9Mf9d-q.js → multilight-wgsl-DMeppAdZ.js} +2 -2
- package/{multilight-wgsl-B9Mf9d-q.js.map → multilight-wgsl-DMeppAdZ.js.map} +1 -1
- package/{node-env-BPZXZzBf.js → node-env-Bc559GmY.js} +6 -5
- package/node-env-Bc559GmY.js.map +1 -0
- package/node-geometry-view-COmWsRXK.js +291 -0
- package/node-geometry-view-COmWsRXK.js.map +1 -0
- package/{node-registry-extra-compat-Ch7ApZHF.js → node-registry-extra-compat-dWrv7gpS.js} +2 -2
- package/{node-registry-extra-compat-Ch7ApZHF.js.map → node-registry-extra-compat-dWrv7gpS.js.map} +1 -1
- package/{node-registry-extra-math-6ezzTkPj.js → node-registry-extra-math-Bn854sX9.js} +2 -2
- package/{node-registry-extra-math-6ezzTkPj.js.map → node-registry-extra-math-Bn854sX9.js.map} +1 -1
- package/{node-renderable-CS0CmsSp.js → node-renderable-B5G8WcdH.js} +15 -13
- package/node-renderable-B5G8WcdH.js.map +1 -0
- package/{node-shadow-CpnrdvtJ.js → node-shadow-CVIUlNf0.js} +7 -7
- package/node-shadow-CVIUlNf0.js.map +1 -0
- package/{normal-map-fragment-DradEMl-.js → normal-map-fragment-CQSxhjCy.js} +2 -2
- package/{normal-map-fragment-DradEMl-.js.map → normal-map-fragment-CQSxhjCy.js.map} +1 -1
- package/package.json +3 -10
- package/{parse-camera-CgV4bWc0.js → parse-camera-pBRT_6i5.js} +2 -2
- package/{parse-camera-CgV4bWc0.js.map → parse-camera-pBRT_6i5.js.map} +1 -1
- package/pbr-geometry-view-NiZY_juX.js +491 -0
- package/pbr-geometry-view-NiZY_juX.js.map +1 -0
- package/{pbr-metallic-roughness-block-BFwZj2Nw.js → pbr-metallic-roughness-block-JBSi-tQN.js} +2 -2
- package/{pbr-metallic-roughness-block-BFwZj2Nw.js.map → pbr-metallic-roughness-block-JBSi-tQN.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-5t0HT3xl.js → pbr-metallic-roughness-block-full-Ta9lR2cz.js} +2 -2
- package/{pbr-metallic-roughness-block-full-5t0HT3xl.js.map → pbr-metallic-roughness-block-full-Ta9lR2cz.js.map} +1 -1
- package/{pbr-mr-helper-core-R5tOZ8Ap.js → pbr-mr-helper-core-BVWNR08D.js} +2 -2
- package/{pbr-mr-helper-core-R5tOZ8Ap.js.map → pbr-mr-helper-core-BVWNR08D.js.map} +1 -1
- package/{pbr-refraction-Dd11HnaI.js → pbr-refraction-C9FvFmAp.js} +2 -2
- package/{pbr-refraction-Dd11HnaI.js.map → pbr-refraction-C9FvFmAp.js.map} +1 -1
- package/{pbr-renderable-BHAdF5Vw.js → pbr-renderable-DzUF2QIk.js} +60 -42
- package/pbr-renderable-DzUF2QIk.js.map +1 -0
- package/{pbr-shadow-fragment-BxUrFJYZ.js → pbr-shadow-fragment-CnqnbGYS.js} +2 -2
- package/{pbr-shadow-fragment-BxUrFJYZ.js.map → pbr-shadow-fragment-CnqnbGYS.js.map} +1 -1
- package/{pbr-tracking-D6i3yPb7.js → pbr-tracking-3tU1kqea.js} +2 -2
- package/{pbr-tracking-D6i3yPb7.js.map → pbr-tracking-3tU1kqea.js.map} +1 -1
- package/{pbr-transmission-ext-Dll8EYwE.js → pbr-transmission-ext-BcLjRxfB.js} +2 -2
- package/{pbr-transmission-ext-Dll8EYwE.js.map → pbr-transmission-ext-BcLjRxfB.js.map} +1 -1
- package/recast-navigation.wasm-DG_0AFuk.js +8706 -0
- package/recast-navigation.wasm-DG_0AFuk.js.map +1 -0
- package/recast-navigation.wasm-compat-C-Bf2ylB.js +8692 -0
- package/recast-navigation.wasm-compat-C-Bf2ylB.js.map +1 -0
- package/{reflectance-fragment-ejMJ4O1o.js → reflectance-fragment-Dbpgw3Jt.js} +2 -2
- package/{reflectance-fragment-ejMJ4O1o.js.map → reflectance-fragment-Dbpgw3Jt.js.map} +1 -1
- package/{rgbd-decode-DCvzUYeI.js → rgbd-decode-DoyUquy3.js} +7 -6
- package/rgbd-decode-DoyUquy3.js.map +1 -0
- package/{scene-material-swap-C2ykv55W.js → scene-material-swap-nNUH4nGn.js} +11 -4
- package/scene-material-swap-nNUH4nGn.js.map +1 -0
- package/screenshot-readback-D0Sj9qq3.js +92 -0
- package/screenshot-readback-D0Sj9qq3.js.map +1 -0
- package/{mesh-features-BAJpbMog.js → shader-composer-BUD_pSX4.js} +3 -54
- package/shader-composer-BUD_pSX4.js.map +1 -0
- package/{shader-renderable-BMf_vvO0.js → shader-renderable-D7-RyVxa.js} +25 -19
- package/shader-renderable-D7-RyVxa.js.map +1 -0
- package/{shader-thin-instance-5_WUfi3m.js → shader-thin-instance-DuBotxDO.js} +4 -4
- package/shader-thin-instance-DuBotxDO.js.map +1 -0
- package/{sheen-fragment-CS6z29Fs.js → sheen-fragment-1MkEMcbc.js} +2 -2
- package/{sheen-fragment-CS6z29Fs.js.map → sheen-fragment-1MkEMcbc.js.map} +1 -1
- package/{singlelight-directional-wgsl-4MIgZMeC.js → singlelight-directional-wgsl-BsV8G456.js} +2 -2
- package/{singlelight-directional-wgsl-4MIgZMeC.js.map → singlelight-directional-wgsl-BsV8G456.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-CK-GUYWe.js → singlelight-hemispheric-wgsl-Bo0jKlW5.js} +2 -2
- package/{singlelight-hemispheric-wgsl-CK-GUYWe.js.map → singlelight-hemispheric-wgsl-Bo0jKlW5.js.map} +1 -1
- package/{singlelight-point-wgsl-CYtzqCbP.js → singlelight-point-wgsl-DV39UP5Y.js} +2 -2
- package/{singlelight-point-wgsl-CYtzqCbP.js.map → singlelight-point-wgsl-DV39UP5Y.js.map} +1 -1
- package/{singlelight-spot-wgsl-DVbaVufF.js → singlelight-spot-wgsl-yg3od6vL.js} +2 -2
- package/{singlelight-spot-wgsl-DVbaVufF.js.map → singlelight-spot-wgsl-yg3od6vL.js.map} +1 -1
- package/{skeleton-fragment-BOVmc8YS.js → skeleton-fragment-DdxYG6kv.js} +2 -2
- package/{skeleton-fragment-BOVmc8YS.js.map → skeleton-fragment-DdxYG6kv.js.map} +1 -1
- package/{skybox-renderable-DDcCPSly.js → skybox-renderable-CJD4XmX5.js} +7 -8
- package/skybox-renderable-CJD4XmX5.js.map +1 -0
- package/{splat-ply-compressed-BahdBG1r.js → splat-ply-compressed-DHjyiVmI.js} +9 -8
- package/splat-ply-compressed-DHjyiVmI.js.map +1 -0
- package/{standard-renderable-D1bhoF0K.js → standard-pipeline-XTbHL7MY.js} +11 -202
- package/standard-pipeline-XTbHL7MY.js.map +1 -0
- package/standard-renderable-CREWLNHI.js +191 -0
- package/standard-renderable-CREWLNHI.js.map +1 -0
- package/{std-ambient-fragment-C6WNm8dQ.js → std-ambient-fragment-Bjx3VFrr.js} +2 -2
- package/{std-ambient-fragment-C6WNm8dQ.js.map → std-ambient-fragment-Bjx3VFrr.js.map} +1 -1
- package/{std-cube-reflection-fragment-Bqutpy2q.js → std-cube-reflection-fragment-y9WWdXUt.js} +2 -2
- package/{std-cube-reflection-fragment-Bqutpy2q.js.map → std-cube-reflection-fragment-y9WWdXUt.js.map} +1 -1
- package/{std-emissive-fragment-B-A83rqX.js → std-emissive-fragment-C8Lnmojh.js} +2 -2
- package/{std-emissive-fragment-B-A83rqX.js.map → std-emissive-fragment-C8Lnmojh.js.map} +1 -1
- package/{std-lightmap-fragment-Df7KJezh.js → std-lightmap-fragment-DFxGcoA5.js} +2 -2
- package/{std-lightmap-fragment-Df7KJezh.js.map → std-lightmap-fragment-DFxGcoA5.js.map} +1 -1
- package/{std-opacity-fragment-D9et2jip.js → std-opacity-fragment-EXzFWiSp.js} +2 -2
- package/{std-opacity-fragment-D9et2jip.js.map → std-opacity-fragment-EXzFWiSp.js.map} +1 -1
- package/{std-reflection-fragment-DBJeT-yg.js → std-reflection-fragment-BoJORqpG.js} +2 -2
- package/{std-reflection-fragment-DBJeT-yg.js.map → std-reflection-fragment-BoJORqpG.js.map} +1 -1
- package/{std-shadow-fragment-C6fD8rW-.js → std-shadow-fragment-Bq-Wc8UJ.js} +2 -2
- package/{std-shadow-fragment-C6fD8rW-.js.map → std-shadow-fragment-Bq-Wc8UJ.js.map} +1 -1
- package/{std-specular-fragment-C2ZOss-t.js → std-specular-fragment-CM5R5j2g.js} +2 -2
- package/{std-specular-fragment-C2ZOss-t.js.map → std-specular-fragment-CM5R5j2g.js.map} +1 -1
- package/{std-tracking-C4L4nQGc.js → std-tracking-Cif_wXeT.js} +2 -2
- package/{std-tracking-C4L4nQGc.js.map → std-tracking-Cif_wXeT.js.map} +1 -1
- package/{subsurface-fragment-C1H4ytqK.js → subsurface-fragment-BEaAXYXz.js} +2 -2
- package/{subsurface-fragment-C1H4ytqK.js.map → subsurface-fragment-BEaAXYXz.js.map} +1 -1
- package/swapchain-overlay-UCLilhbq.js +37 -0
- package/swapchain-overlay-UCLilhbq.js.map +1 -0
- package/{thin-instance-cull-binding-CCxrPNO6.js → thin-instance-cull-binding-DWKUt5ZN.js} +12 -12
- package/thin-instance-cull-binding-DWKUt5ZN.js.map +1 -0
- package/{thin-instance-gpu-E8DBd8XL.js → thin-instance-gpu-BDdRcNAh.js} +15 -7
- package/thin-instance-gpu-BDdRcNAh.js.map +1 -0
- package/{tracking-primitives-w4BVV9p9.js → tracking-primitives-CglRNTlX.js} +2 -2
- package/{tracking-primitives-w4BVV9p9.js.map → tracking-primitives-CglRNTlX.js.map} +1 -1
- package/{unlit-fragment-DU9_mhzZ.js → unlit-fragment-kxfZWlnp.js} +2 -2
- package/{unlit-fragment-DU9_mhzZ.js.map → unlit-fragment-kxfZWlnp.js.map} +1 -1
- package/_mat4-storage-f64-Bvh5TymE.js.map +0 -1
- package/assets/splat-sort-worker-Crg3CaCc.js.map +0 -1
- package/background-dds-skybox-ZjrSIxrT.js.map +0 -1
- package/background-ground-B2Mie-MI.js.map +0 -1
- package/background-hdr-skybox-DDRJYuT2.js.map +0 -1
- package/background-solid-skybox-fjXlnWaD.js.map +0 -1
- package/billboard-renderable-DKmlOgbM.js.map +0 -1
- package/create-skeleton-BBI5urcj.js.map +0 -1
- package/cubemap-skybox-material-DvW81drX.js.map +0 -1
- package/emissive-fragment-DD8cvHyx.js.map +0 -1
- package/gaussian-splatting-pipeline-sh-BvkUhA9V.js.map +0 -1
- package/gltf-animation-KnPzeOIY.js.map +0 -1
- package/gltf-ext-basisu-kmth3UWX.js.map +0 -1
- package/gltf-ext-quantization-CpZyLDIz.js.map +0 -1
- package/gltf-feature-animation-pointer-rFqLfbO_.js.map +0 -1
- package/gltf-feature-draco-yGSMGTE3.js.map +0 -1
- package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +0 -1
- package/gltf-feature-meshopt-Des96YFI.js.map +0 -1
- package/gltf-feature-morph-BAcY14XU.js.map +0 -1
- package/gltf-glb-parser-D6UZWFuC.js.map +0 -1
- package/gltf-interleave-C9eBqH_F.js.map +0 -1
- package/gltf-pbr-builder-ext-DPC0zg_u.js.map +0 -1
- package/gs-picking-pipeline-Bx8LTav6.js.map +0 -1
- package/index-B7Qhw0xL.js +0 -21232
- package/index-B7Qhw0xL.js.map +0 -1
- package/mesh-features-BAJpbMog.js.map +0 -1
- package/no-color-view-DsyLSL-W.js +0 -8
- package/no-color-view-DsyLSL-W.js.map +0 -1
- package/node-env-BPZXZzBf.js.map +0 -1
- package/node-registry-Bd-AlrgC.js +0 -190
- package/node-registry-Bd-AlrgC.js.map +0 -1
- package/node-renderable-CS0CmsSp.js.map +0 -1
- package/node-shadow-CpnrdvtJ.js.map +0 -1
- package/pbr-renderable-BHAdF5Vw.js.map +0 -1
- package/rgbd-decode-DCvzUYeI.js.map +0 -1
- package/scene-material-swap-C2ykv55W.js.map +0 -1
- package/shader-renderable-BMf_vvO0.js.map +0 -1
- package/shader-thin-instance-5_WUfi3m.js.map +0 -1
- package/skybox-renderable-DDcCPSly.js.map +0 -1
- package/splat-ply-compressed-BahdBG1r.js.map +0 -1
- package/standard-renderable-D1bhoF0K.js.map +0 -1
- package/swapchain-overlay-DcCSFDp7.js +0 -35
- package/swapchain-overlay-DcCSFDp7.js.map +0 -1
- package/thin-instance-cull-binding-CCxrPNO6.js.map +0 -1
- package/thin-instance-gpu-E8DBd8XL.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aJ as PBR_HAS_METALLIC_REFLECTANCE_MAP, aK as PBR_HAS_REFLECTANCE_MAP, aL as PBR2_HAS_REFLECTANCE_FACTORS, aM as PBR2_HAS_UV2, aN as PBR_HAS_USE_ALPHA_ONLY_MR } from "./index-CLElg2Bo.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function writeReflectanceUBO(data, material, offsets) {
|
|
4
4
|
if (!offsets.has("occlusionStrength")) {
|
|
@@ -140,4 +140,4 @@ export {
|
|
|
140
140
|
pbrExt,
|
|
141
141
|
writeReflectanceUBO
|
|
142
142
|
};
|
|
143
|
-
//# sourceMappingURL=reflectance-fragment-
|
|
143
|
+
//# sourceMappingURL=reflectance-fragment-Dbpgw3Jt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflectance-fragment-ejMJ4O1o.js","sources":["../src/material/pbr/fragments/reflectance-fragment.ts"],"sourcesContent":["/**\n * Metallic Reflectance Fragment\n *\n * Advanced F0 computation with metallicReflectanceTexture and/or reflectanceTexture.\n * Only bundled when a scene uses these textures.\n *\n * Provides: UBO fields (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor),\n * conditional texture bindings, F0 computation, and occlusion handling.\n */\n\nimport type { ShaderFragment, BindingDecl } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_METALLIC_REFLECTANCE_MAP, PBR_HAS_REFLECTANCE_MAP, PBR_HAS_USE_ALPHA_ONLY_MR, PBR2_HAS_REFLECTANCE_FACTORS, PBR2_HAS_UV2 } from \"../pbr-flag-bits.js\";\n\n// WebGPU shader stage constants\nconst STAGE_FRAGMENT = 0x2;\n\n/** Write the reflectance-extension material-UBO slice\n * (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor).\n * Gated by the presence of the `occlusionStrength` field in the UBO spec,\n * which is added only when a metallic-reflectance or reflectance texture\n * is in use. */\nexport function writeReflectanceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n if (!offsets.has(\"occlusionStrength\")) {\n return;\n }\n const off = offsets.get(\"occlusionStrength\")! / 4;\n data[off] = material.occlusionStrength ?? 1.0;\n data[off + 1] = material.metallicF0Factor ?? 1.0;\n data[off + 2] = material.specularWeight ?? material.metallicF0Factor ?? 1.0;\n const mrc = material.metallicReflectanceColor;\n data[off + 4] = mrc ? mrc[0]! : 1.0;\n data[off + 5] = mrc ? mrc[1]! : 1.0;\n data[off + 6] = mrc ? mrc[2]! : 1.0;\n}\n\n/**\n * Create a metallic reflectance fragment.\n * @param hasMetallicReflectanceMap - Whether the material has a metallicReflectanceTexture.\n * @param hasReflectanceMap - Whether the material has a reflectanceTexture.\n * @param useAlphaOnlyMR - Whether to use only the alpha channel from the metallic reflectance map.\n */\nexport function createReflectanceFragment(\n hasMetallicReflectanceMap: boolean,\n hasReflectanceMap: boolean,\n useAlphaOnlyMR: boolean,\n hasOcclusionUv2: boolean = false\n): ShaderFragment {\n const bindings: BindingDecl[] = [];\n if (hasMetallicReflectanceMap) {\n bindings.push(\n { _name: \"metallicReflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"metallicReflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasReflectanceMap) {\n bindings.push(\n { _name: \"reflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"reflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n // Build F0 computation code\n let f0Code = `var mrFactors = vec4<f32>(material.metallicReflectanceColor, material.metallicF0Factor);\nvar specularWeight = material.specularWeight;`;\n if (hasReflectanceMap) {\n f0Code += `\n{ let rSample = textureSample(reflectanceMap, reflectanceMapSampler, input.uv);\n let rLinear = pow(rSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * rLinear, mrFactors.a); }`;\n }\n if (hasMetallicReflectanceMap) {\n if (!useAlphaOnlyMR) {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n let mrLinear = pow(mrSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * mrLinear, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n } else {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n mrFactors = vec4<f32>(mrFactors.rgb, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n }\n }\n f0Code += `\nlet dielectricF0 = material.reflectance * mrFactors.a;\nlet surfaceReflectivityColor = mrFactors.rgb;\nlet dielectricColorF0 = vec3<f32>(dielectricF0) * surfaceReflectivityColor;\nlet metallicColorF0 = baseColor;\nvar colorF0 = mix(dielectricColorF0, metallicColorF0, metallic);\nlet colorF90 = vec3<f32>(mix(specularWeight, 1.0, metallic));\nlet surfaceAlbedo = baseColor * (vec3<f32>(1.0) - vec3<f32>(dielectricF0) * surfaceReflectivityColor) * (1.0 - metallic);`;\n\n return {\n _id: \"reflectance\",\n\n _uboFields: [\n { _name: \"occlusionStrength\", _type: \"f32\" },\n { _name: \"metallicF0Factor\", _type: \"f32\" },\n { _name: \"specularWeight\", _type: \"f32\" },\n { _name: \"_mrPad1\", _type: \"f32\" },\n { _name: \"metallicReflectanceColor\", _type: \"vec3<f32>\" },\n { _name: \"_mrPad2\", _type: \"f32\" },\n ],\n\n _bindings: bindings,\n\n _fragmentSlots: {\n MF: f0Code,\n AT: hasOcclusionUv2\n ? `let occlusion = mix(1.0, textureSample(occlusionTexture, occlusionSampler_, input.uv2).r, material.occlusionStrength);`\n : `let occlusion = mix(1.0, orm.r, material.occlusionStrength);`,\n },\n };\n}\n\n/** Create the reflectance PBR extension (group 1, fragment phase). */\nexport const pbrExt: PbrExt = {\n id: \"reflectance\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as PbrMaterialProps;\n let f = 0;\n let f2 = 0;\n if (m.metallicReflectanceTexture) {\n f |= PBR_HAS_METALLIC_REFLECTANCE_MAP;\n }\n if (m.reflectanceTexture) {\n f |= PBR_HAS_REFLECTANCE_MAP;\n }\n if (f === 0) {\n const hasNonDefaultF0 = m.metallicF0Factor != null && Math.abs(m.metallicF0Factor - 1) > 1e-6;\n const mrc = m.metallicReflectanceColor;\n const hasNonDefaultColor = mrc != null && (mrc[0] !== 1 || mrc[1] !== 1 || mrc[2] !== 1);\n if (hasNonDefaultF0 || hasNonDefaultColor) {\n f2 |= PBR2_HAS_REFLECTANCE_FACTORS;\n }\n }\n if ((f !== 0 || f2 & PBR2_HAS_REFLECTANCE_FACTORS) && m.useOnlyMetallicFromMetallicReflectanceTexture) {\n f |= PBR_HAS_USE_ALPHA_ONLY_MR;\n }\n return { f, f2 };\n },\n frag(ctx) {\n const hasMR = (ctx._features & PBR_HAS_METALLIC_REFLECTANCE_MAP) !== 0;\n const hasR = (ctx._features & PBR_HAS_REFLECTANCE_MAP) !== 0;\n const hasFactors = (ctx._features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;\n if (!hasMR && !hasR && !hasFactors) {\n return null;\n }\n return createReflectanceFragment(hasMR, hasR, (ctx._features & PBR_HAS_USE_ALPHA_ONLY_MR) !== 0, (ctx._features2 & PBR2_HAS_UV2) !== 0);\n },\n writeUbo: writeReflectanceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n if ((ctx._features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) === 0) {\n return b;\n }\n const m = ctx._material as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.view });\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.sampler });\n }\n if (m.reflectanceTexture) {\n entries.push({ binding: b++, resource: m.reflectanceTexture.view });\n entries.push({ binding: b++, resource: m.reflectanceTexture.sampler });\n }\n return b;\n },\n textures(mat, t) {\n const m = mat as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n t.push(m.metallicReflectanceTexture);\n }\n if (m.reflectanceTexture) {\n t.push(m.reflectanceTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAgBA,MAAM,iBAAiB;AAOhB,SAAS,oBAAoB,MAAoB,UAA4B,SAA4C;AAC5H,MAAI,CAAC,QAAQ,IAAI,mBAAmB,GAAG;AACnC;AAAA,EACJ;AACA,QAAM,MAAM,QAAQ,IAAI,mBAAmB,IAAK;AAChD,OAAK,GAAG,IAAI,SAAS,qBAAqB;AAC1C,OAAK,MAAM,CAAC,IAAI,SAAS,oBAAoB;AAC7C,OAAK,MAAM,CAAC,IAAI,SAAS,kBAAkB,SAAS,oBAAoB;AACxE,QAAM,MAAM,SAAS;AACrB,OAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAK;AAChC,OAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAK;AAChC,OAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,IAAK;AACpC;AAQO,SAAS,0BACZ,2BACA,mBACA,gBACA,kBAA2B,OACb;AACd,QAAM,WAA0B,CAAA;AAChC,MAAI,2BAA2B;AAC3B,aAAS;AAAA,MACL,EAAE,OAAO,0BAA0B,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC9G,EAAE,OAAO,iCAAiC,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,EAEpI;AACA,MAAI,mBAAmB;AACnB,aAAS;AAAA,MACL,EAAE,OAAO,kBAAkB,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MACtG,EAAE,OAAO,yBAAyB,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,EAE5H;AAGA,MAAI,SAAS;AAAA;AAEb,MAAI,mBAAmB;AACnB,cAAU;AAAA;AAAA;AAAA;AAAA,EAId;AACA,MAAI,2BAA2B;AAC3B,QAAI,CAAC,gBAAgB;AACjB,gBAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKd,OAAO;AACH,gBAAU;AAAA;AAAA;AAAA;AAAA,IAId;AAAA,EACJ;AACA,YAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASV,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,YAAY;AAAA,MACR,EAAE,OAAO,qBAAqB,OAAO,MAAA;AAAA,MACrC,EAAE,OAAO,oBAAoB,OAAO,MAAA;AAAA,MACpC,EAAE,OAAO,kBAAkB,OAAO,MAAA;AAAA,MAClC,EAAE,OAAO,WAAW,OAAO,MAAA;AAAA,MAC3B,EAAE,OAAO,4BAA4B,OAAO,YAAA;AAAA,MAC5C,EAAE,OAAO,WAAW,OAAO,MAAA;AAAA,IAAM;AAAA,IAGrC,WAAW;AAAA,IAEX,gBAAgB;AAAA,MACZ,IAAI;AAAA,MACJ,IAAI,kBACE,2HACA;AAAA,IAAA;AAAA,EACV;AAER;AAGO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,OAAO,KAAK;AACR,UAAM,IAAI;AACV,QAAI,IAAI;AACR,QAAI,KAAK;AACT,QAAI,EAAE,4BAA4B;AAC9B,WAAK;AAAA,IACT;AACA,QAAI,EAAE,oBAAoB;AACtB,WAAK;AAAA,IACT;AACA,QAAI,MAAM,GAAG;AACT,YAAM,kBAAkB,EAAE,oBAAoB,QAAQ,KAAK,IAAI,EAAE,mBAAmB,CAAC,IAAI;AACzF,YAAM,MAAM,EAAE;AACd,YAAM,qBAAqB,OAAO,SAAS,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;AACtF,UAAI,mBAAmB,oBAAoB;AACvC,cAAM;AAAA,MACV;AAAA,IACJ;AACA,SAAK,MAAM,KAAK,KAAK,iCAAiC,EAAE,+CAA+C;AACnG,WAAK;AAAA,IACT;AACA,WAAO,EAAE,GAAG,GAAA;AAAA,EAChB;AAAA,EACA,KAAK,KAAK;AACN,UAAM,SAAS,IAAI,YAAY,sCAAsC;AACrE,UAAM,QAAQ,IAAI,YAAY,6BAA6B;AAC3D,UAAM,cAAc,IAAI,aAAa,kCAAkC;AACvE,QAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY;AAChC,aAAO;AAAA,IACX;AACA,WAAO,0BAA0B,OAAO,OAAO,IAAI,YAAY,+BAA+B,IAAI,IAAI,aAAa,kBAAkB,CAAC;AAAA,EAC1I;AAAA,EACA,UAAU;AAAA,EACV,KAAK,KAAK,SAAS,GAAG;AAClB,SAAK,IAAI,aAAa,mCAAmC,8BAA8B,GAAG;AACtF,aAAO;AAAA,IACX;AACA,UAAM,IAAI,IAAI;AACd,QAAI,EAAE,4BAA4B;AAC9B,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,2BAA2B,MAAM;AAC1E,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,2BAA2B,SAAS;AAAA,IACjF;AACA,QAAI,EAAE,oBAAoB;AACtB,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,mBAAmB,MAAM;AAClE,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,mBAAmB,SAAS;AAAA,IACzE;AACA,WAAO;AAAA,EACX;AAAA,EACA,SAAS,KAAK,GAAG;AACb,UAAM,IAAI;AACV,QAAI,EAAE,4BAA4B;AAC9B,QAAE,KAAK,EAAE,0BAA0B;AAAA,IACvC;AACA,QAAI,EAAE,oBAAoB;AACtB,QAAE,KAAK,EAAE,kBAAkB;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
|
|
1
|
+
{"version":3,"file":"reflectance-fragment-Dbpgw3Jt.js","sources":["../src/material/pbr/fragments/reflectance-fragment.ts"],"sourcesContent":["/**\n * Metallic Reflectance Fragment\n *\n * Advanced F0 computation with metallicReflectanceTexture and/or reflectanceTexture.\n * Only bundled when a scene uses these textures.\n *\n * Provides: UBO fields (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor),\n * conditional texture bindings, F0 computation, and occlusion handling.\n */\n\nimport type { ShaderFragment, BindingDecl } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_METALLIC_REFLECTANCE_MAP, PBR_HAS_REFLECTANCE_MAP, PBR_HAS_USE_ALPHA_ONLY_MR, PBR2_HAS_REFLECTANCE_FACTORS, PBR2_HAS_UV2 } from \"../pbr-flag-bits.js\";\n\n// WebGPU shader stage constants\nconst STAGE_FRAGMENT = 0x2;\n\n/** Write the reflectance-extension material-UBO slice\n * (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor).\n * Gated by the presence of the `occlusionStrength` field in the UBO spec,\n * which is added only when a metallic-reflectance or reflectance texture\n * is in use. */\nexport function writeReflectanceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n if (!offsets.has(\"occlusionStrength\")) {\n return;\n }\n const off = offsets.get(\"occlusionStrength\")! / 4;\n data[off] = material.occlusionStrength ?? 1.0;\n data[off + 1] = material.metallicF0Factor ?? 1.0;\n data[off + 2] = material.specularWeight ?? material.metallicF0Factor ?? 1.0;\n const mrc = material.metallicReflectanceColor;\n data[off + 4] = mrc ? mrc[0]! : 1.0;\n data[off + 5] = mrc ? mrc[1]! : 1.0;\n data[off + 6] = mrc ? mrc[2]! : 1.0;\n}\n\n/**\n * Create a metallic reflectance fragment.\n * @param hasMetallicReflectanceMap - Whether the material has a metallicReflectanceTexture.\n * @param hasReflectanceMap - Whether the material has a reflectanceTexture.\n * @param useAlphaOnlyMR - Whether to use only the alpha channel from the metallic reflectance map.\n */\nexport function createReflectanceFragment(\n hasMetallicReflectanceMap: boolean,\n hasReflectanceMap: boolean,\n useAlphaOnlyMR: boolean,\n hasOcclusionUv2: boolean = false\n): ShaderFragment {\n const bindings: BindingDecl[] = [];\n if (hasMetallicReflectanceMap) {\n bindings.push(\n { _name: \"metallicReflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"metallicReflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasReflectanceMap) {\n bindings.push(\n { _name: \"reflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"reflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n // Build F0 computation code\n let f0Code = `var mrFactors = vec4<f32>(material.metallicReflectanceColor, material.metallicF0Factor);\nvar specularWeight = material.specularWeight;`;\n if (hasReflectanceMap) {\n f0Code += `\n{ let rSample = textureSample(reflectanceMap, reflectanceMapSampler, input.uv);\n let rLinear = pow(rSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * rLinear, mrFactors.a); }`;\n }\n if (hasMetallicReflectanceMap) {\n if (!useAlphaOnlyMR) {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n let mrLinear = pow(mrSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * mrLinear, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n } else {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n mrFactors = vec4<f32>(mrFactors.rgb, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n }\n }\n f0Code += `\nlet dielectricF0 = material.reflectance * mrFactors.a;\nlet surfaceReflectivityColor = mrFactors.rgb;\nlet dielectricColorF0 = vec3<f32>(dielectricF0) * surfaceReflectivityColor;\nlet metallicColorF0 = baseColor;\nvar colorF0 = mix(dielectricColorF0, metallicColorF0, metallic);\nlet colorF90 = vec3<f32>(mix(specularWeight, 1.0, metallic));\nlet surfaceAlbedo = baseColor * (vec3<f32>(1.0) - vec3<f32>(dielectricF0) * surfaceReflectivityColor) * (1.0 - metallic);`;\n\n return {\n _id: \"reflectance\",\n\n _uboFields: [\n { _name: \"occlusionStrength\", _type: \"f32\" },\n { _name: \"metallicF0Factor\", _type: \"f32\" },\n { _name: \"specularWeight\", _type: \"f32\" },\n { _name: \"_mrPad1\", _type: \"f32\" },\n { _name: \"metallicReflectanceColor\", _type: \"vec3<f32>\" },\n { _name: \"_mrPad2\", _type: \"f32\" },\n ],\n\n _bindings: bindings,\n\n _fragmentSlots: {\n MF: f0Code,\n AT: hasOcclusionUv2\n ? `let occlusion = mix(1.0, textureSample(occlusionTexture, occlusionSampler_, input.uv2).r, material.occlusionStrength);`\n : `let occlusion = mix(1.0, orm.r, material.occlusionStrength);`,\n },\n };\n}\n\n/** Create the reflectance PBR extension (group 1, fragment phase). */\nexport const pbrExt: PbrExt = {\n id: \"reflectance\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as PbrMaterialProps;\n let f = 0;\n let f2 = 0;\n if (m.metallicReflectanceTexture) {\n f |= PBR_HAS_METALLIC_REFLECTANCE_MAP;\n }\n if (m.reflectanceTexture) {\n f |= PBR_HAS_REFLECTANCE_MAP;\n }\n if (f === 0) {\n const hasNonDefaultF0 = m.metallicF0Factor != null && Math.abs(m.metallicF0Factor - 1) > 1e-6;\n const mrc = m.metallicReflectanceColor;\n const hasNonDefaultColor = mrc != null && (mrc[0] !== 1 || mrc[1] !== 1 || mrc[2] !== 1);\n if (hasNonDefaultF0 || hasNonDefaultColor) {\n f2 |= PBR2_HAS_REFLECTANCE_FACTORS;\n }\n }\n if ((f !== 0 || f2 & PBR2_HAS_REFLECTANCE_FACTORS) && m.useOnlyMetallicFromMetallicReflectanceTexture) {\n f |= PBR_HAS_USE_ALPHA_ONLY_MR;\n }\n return { f, f2 };\n },\n frag(ctx) {\n const hasMR = (ctx._features & PBR_HAS_METALLIC_REFLECTANCE_MAP) !== 0;\n const hasR = (ctx._features & PBR_HAS_REFLECTANCE_MAP) !== 0;\n const hasFactors = (ctx._features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;\n if (!hasMR && !hasR && !hasFactors) {\n return null;\n }\n return createReflectanceFragment(hasMR, hasR, (ctx._features & PBR_HAS_USE_ALPHA_ONLY_MR) !== 0, (ctx._features2 & PBR2_HAS_UV2) !== 0);\n },\n writeUbo: writeReflectanceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n if ((ctx._features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) === 0) {\n return b;\n }\n const m = ctx._material as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.view });\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.sampler });\n }\n if (m.reflectanceTexture) {\n entries.push({ binding: b++, resource: m.reflectanceTexture.view });\n entries.push({ binding: b++, resource: m.reflectanceTexture.sampler });\n }\n return b;\n },\n textures(mat, t) {\n const m = mat as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n t.push(m.metallicReflectanceTexture);\n }\n if (m.reflectanceTexture) {\n t.push(m.reflectanceTexture);\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { T as TU } from "./index-CLElg2Bo.js";
|
|
1
2
|
const WGSL = `override f:bool=false;@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var o:texture_storage_2d<rgba16float,write>;@compute @workgroup_size(8,8)fn main(@builtin(global_invocation_id)g:vec3u){let d=textureDimensions(t);if(any(g.xy>=d)){return;}let c=textureLoad(t,vec2u(g.x,select(g.y,d.y-1u-g.y,f)),0);textureStore(o,g.xy,vec4f(pow(c.rgb,vec3f(2.2))/max(c.a,1.0/255.0),1));}`;
|
|
2
3
|
let _device = null;
|
|
3
4
|
let _module = null;
|
|
@@ -49,13 +50,13 @@ function decodeBrdfPng(engine, image) {
|
|
|
49
50
|
const inputTex = device.createTexture({
|
|
50
51
|
size: { width: w, height: h },
|
|
51
52
|
format: "rgba8unorm",
|
|
52
|
-
usage:
|
|
53
|
+
usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT
|
|
53
54
|
});
|
|
54
55
|
device.queue.copyExternalImageToTexture({ source: image, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: w, height: h });
|
|
55
56
|
const texture = device.createTexture({
|
|
56
57
|
size: { width: w, height: h },
|
|
57
58
|
format: "rgba16float",
|
|
58
|
-
usage:
|
|
59
|
+
usage: TU.TEXTURE_BINDING | TU.STORAGE_BINDING
|
|
59
60
|
});
|
|
60
61
|
const bg = makeBindGroup(device, pipeline, inputTex.createView(), texture.createView());
|
|
61
62
|
const enc = device.createCommandEncoder();
|
|
@@ -71,7 +72,7 @@ function uploadCubemapRGBD(engine, images, width, mipCount) {
|
|
|
71
72
|
size: { width, height: width, depthOrArrayLayers: 6 },
|
|
72
73
|
format: "rgba16float",
|
|
73
74
|
mipLevelCount: mipCount,
|
|
74
|
-
usage:
|
|
75
|
+
usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.COPY_SRC | TU.RENDER_ATTACHMENT,
|
|
75
76
|
dimension: "2d"
|
|
76
77
|
});
|
|
77
78
|
for (let mip = 0; mip < mipCount; mip++) {
|
|
@@ -79,12 +80,12 @@ function uploadCubemapRGBD(engine, images, width, mipCount) {
|
|
|
79
80
|
const inputTex = device.createTexture({
|
|
80
81
|
size: { width: mipSize, height: mipSize },
|
|
81
82
|
format: "rgba8unorm",
|
|
82
|
-
usage:
|
|
83
|
+
usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT
|
|
83
84
|
});
|
|
84
85
|
const outputTex = device.createTexture({
|
|
85
86
|
size: { width: mipSize, height: mipSize },
|
|
86
87
|
format: "rgba16float",
|
|
87
|
-
usage:
|
|
88
|
+
usage: TU.STORAGE_BINDING | TU.COPY_SRC
|
|
88
89
|
});
|
|
89
90
|
const bindGroup = makeBindGroup(device, pipeline, inputTex.createView(), outputTex.createView());
|
|
90
91
|
for (let face = 0; face < 6; face++) {
|
|
@@ -107,4 +108,4 @@ export {
|
|
|
107
108
|
decodeBrdfPng,
|
|
108
109
|
uploadCubemapRGBD
|
|
109
110
|
};
|
|
110
|
-
//# sourceMappingURL=rgbd-decode-
|
|
111
|
+
//# sourceMappingURL=rgbd-decode-DoyUquy3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rgbd-decode-DoyUquy3.js","sources":["../src/loader-env/rgbd-decode.ts"],"sourcesContent":["/** RGBD decoder — decodes Babylon BRDF PNG and .env cubemap faces into rgba16float. */\n\nimport { TU } from \"../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\n\nconst WGSL = `override f:bool=false;@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var o:texture_storage_2d<rgba16float,write>;@compute @workgroup_size(8,8)fn main(@builtin(global_invocation_id)g:vec3u){let d=textureDimensions(t);if(any(g.xy>=d)){return;}let c=textureLoad(t,vec2u(g.x,select(g.y,d.y-1u-g.y,f)),0);textureStore(o,g.xy,vec4f(pow(c.rgb,vec3f(2.2))/max(c.a,1.0/255.0),1));}`;\n\nlet _device: GPUDevice | null = null;\nlet _module: GPUShaderModule | null = null;\nlet _noFlip: GPUComputePipeline | null = null;\nlet _flip: GPUComputePipeline | null = null;\n\nfunction getPipeline(device: GPUDevice, flipY: boolean): GPUComputePipeline {\n if (device !== _device) {\n _device = device;\n _module = device.createShaderModule({ code: WGSL });\n _noFlip = null;\n _flip = null;\n }\n const slot = flipY ? _flip : _noFlip;\n if (slot) {\n return slot;\n }\n const p = device.createComputePipeline({\n layout: \"auto\",\n compute: { module: _module!, entryPoint: \"main\", constants: { f: flipY ? 1 : 0 } },\n });\n if (flipY) {\n _flip = p;\n } else {\n _noFlip = p;\n }\n return p;\n}\n\nfunction makeBindGroup(device: GPUDevice, pipeline: GPUComputePipeline, inView: GPUTextureView, outView: GPUTextureView): GPUBindGroup {\n return device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: inView },\n { binding: 1, resource: outView },\n ],\n });\n}\n\nfunction encodeDispatch(encoder: GPUCommandEncoder, pipeline: GPUComputePipeline, bg: GPUBindGroup, w: number, h: number): void {\n const pass = encoder.beginComputePass();\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bg);\n pass.dispatchWorkgroups(Math.ceil(w / 8), Math.ceil(h / 8));\n pass.end();\n}\n\n/** Decode a single RGBD PNG (e.g. BRDF LUT) `->` rgba16float 2D texture. No Y-flip. */\nexport function decodeBrdfPng(engine: EngineContext, image: ImageBitmap): GPUTexture {\n const device = engine._device;\n const pipeline = getPipeline(device, false);\n const w = image.width;\n const h = image.height;\n const inputTex = device.createTexture({\n size: { width: w, height: h },\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n device.queue.copyExternalImageToTexture({ source: image, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: w, height: h });\n const texture = device.createTexture({\n size: { width: w, height: h },\n format: \"rgba16float\",\n usage: TU.TEXTURE_BINDING | TU.STORAGE_BINDING,\n });\n const bg = makeBindGroup(device, pipeline, inputTex.createView(), texture.createView());\n const enc = device.createCommandEncoder();\n encodeDispatch(enc, pipeline, bg, w, h);\n device.queue.submit([enc.finish()]);\n inputTex.destroy();\n return texture;\n}\n\n/** Decode and upload a RGBD cubemap (6 faces × N mips) → rgba16float cube texture.\n * Y-flipped on read (BJS uploads cubemap faces with invertY=true). */\nexport function uploadCubemapRGBD(engine: EngineContext, images: ImageBitmap[], width: number, mipCount: number): GPUTexture {\n const device = engine._device;\n const pipeline = getPipeline(device, true);\n\n const texture = device.createTexture({\n size: { width, height: width, depthOrArrayLayers: 6 },\n format: \"rgba16float\",\n mipLevelCount: mipCount,\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.COPY_SRC | TU.RENDER_ATTACHMENT,\n dimension: \"2d\",\n });\n\n for (let mip = 0; mip < mipCount; mip++) {\n const mipSize = Math.max(1, width >> mip);\n\n const inputTex = device.createTexture({\n size: { width: mipSize, height: mipSize },\n format: \"rgba8unorm\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST | TU.RENDER_ATTACHMENT,\n });\n\n const outputTex = device.createTexture({\n size: { width: mipSize, height: mipSize },\n format: \"rgba16float\",\n usage: TU.STORAGE_BINDING | TU.COPY_SRC,\n });\n\n const bindGroup = makeBindGroup(device, pipeline, inputTex.createView(), outputTex.createView());\n\n for (let face = 0; face < 6; face++) {\n const idx = mip * 6 + face;\n if (idx >= images.length) {\n break;\n }\n\n device.queue.copyExternalImageToTexture({ source: images[idx]!, flipY: false }, { texture: inputTex, premultipliedAlpha: false }, { width: mipSize, height: mipSize });\n\n const encoder = device.createCommandEncoder();\n encodeDispatch(encoder, pipeline, bindGroup, mipSize, mipSize);\n encoder.copyTextureToTexture({ texture: outputTex }, { texture, origin: { x: 0, y: 0, z: face }, mipLevel: mip }, { width: mipSize, height: mipSize });\n\n // One submit per face ensures sequential hazards on the reused input/output.\n device.queue.submit([encoder.finish()]);\n }\n\n inputTex.destroy();\n outputTex.destroy();\n }\n\n return texture;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
function processMaterialSwaps(scene) {
|
|
2
2
|
const q = scene._materialSwapQueue;
|
|
3
|
+
const device = scene.surface.engine._device;
|
|
3
4
|
for (const mesh of q) {
|
|
4
5
|
mesh._materialDirty = false;
|
|
5
6
|
const old = scene._meshDisposables.get(mesh);
|
|
6
7
|
if (old) {
|
|
7
|
-
for (const fn of old) {
|
|
8
|
-
fn();
|
|
9
|
-
}
|
|
10
8
|
scene._meshDisposables.delete(mesh);
|
|
9
|
+
void device.queue.onSubmittedWorkDone().then(() => {
|
|
10
|
+
try {
|
|
11
|
+
for (const fn of old) {
|
|
12
|
+
fn();
|
|
13
|
+
}
|
|
14
|
+
} catch {
|
|
15
|
+
}
|
|
16
|
+
}).catch(() => {
|
|
17
|
+
});
|
|
11
18
|
}
|
|
12
19
|
const mat = mesh.material;
|
|
13
20
|
const builder = mat == null ? void 0 : mat._buildGroup;
|
|
@@ -31,4 +38,4 @@ function processMaterialSwaps(scene) {
|
|
|
31
38
|
export {
|
|
32
39
|
processMaterialSwaps
|
|
33
40
|
};
|
|
34
|
-
//# sourceMappingURL=scene-material-swap-
|
|
41
|
+
//# sourceMappingURL=scene-material-swap-nNUH4nGn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-material-swap-nNUH4nGn.js","sources":["../src/scene/scene-material-swap.ts"],"sourcesContent":["import type { SceneContext } from \"./scene-core.js\";\nimport type { Mesh } from \"../mesh/mesh.js\";\n\n/** @internal Drain _materialSwapQueue: dispose old resources and rebuild renderables. */\nexport function processMaterialSwaps(scene: SceneContext): void {\n const q = scene._materialSwapQueue;\n const device = scene.surface.engine._device;\n for (const mesh of q) {\n (mesh as Mesh)._materialDirty = false;\n const old = scene._meshDisposables.get(mesh);\n if (old) {\n scene._meshDisposables.delete(mesh);\n // These disposables free the OLD renderable's GPU resources (per-mesh/material UBOs, the\n // GPU-cull state buffers, texture releases). They must NOT run synchronously: the old buffers\n // may still be referenced by a frame already submitted to the GPU this tick, and destroying\n // them now hits the validation error \"Buffer used in submit while destroyed\" (seen when a\n // plugin / shadow-receiver variant change swaps a planted mesh's material — e.g. planting a\n // fern or agave). The new renderable is rebuilt below and replaces the old one, so nothing\n // records the old resources again; defer the teardown until the GPU has drained the\n // currently-submitted work (onSubmittedWorkDone). Mirrors resizeMeshGeometry.\n void device.queue\n .onSubmittedWorkDone()\n .then(() => {\n try {\n for (const fn of old) {\n fn();\n }\n } catch {\n // Device may have been lost/disposed before the deferred teardown ran.\n }\n })\n .catch(() => {});\n }\n\n const mat = mesh.material;\n const builder = mat?._buildGroup;\n if (!builder) {\n continue;\n }\n const rebuild = builder._rebuildSingle;\n if (!rebuild) {\n continue;\n }\n const renderable = rebuild(scene, mesh);\n // Insert by `order` so the renderable list stays sorted (frame-graph\n // tasks bucket opaque/direct/transparent at bind time).\n let i = scene._renderables.length;\n while (i > 0 && scene._renderables[i - 1]!.order > renderable.order) {\n i--;\n }\n scene._renderables.splice(i, 0, renderable);\n }\n q.length = 0;\n scene._renderableVersion++;\n}\n"],"names":[],"mappings":"AAIO,SAAS,qBAAqB,OAA2B;AAC5D,QAAM,IAAI,MAAM;AAChB,QAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,aAAW,QAAQ,GAAG;AACjB,SAAc,iBAAiB;AAChC,UAAM,MAAM,MAAM,iBAAiB,IAAI,IAAI;AAC3C,QAAI,KAAK;AACL,YAAM,iBAAiB,OAAO,IAAI;AASlC,WAAK,OAAO,MACP,oBAAA,EACA,KAAK,MAAM;AACR,YAAI;AACA,qBAAW,MAAM,KAAK;AAClB,eAAA;AAAA,UACJ;AAAA,QACJ,QAAQ;AAAA,QAER;AAAA,MACJ,CAAC,EACA,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvB;AAEA,UAAM,MAAM,KAAK;AACjB,UAAM,UAAU,2BAAK;AACrB,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AACA,UAAM,UAAU,QAAQ;AACxB,QAAI,CAAC,SAAS;AACV;AAAA,IACJ;AACA,UAAM,aAAa,QAAQ,OAAO,IAAI;AAGtC,QAAI,IAAI,MAAM,aAAa;AAC3B,WAAO,IAAI,KAAK,MAAM,aAAa,IAAI,CAAC,EAAG,QAAQ,WAAW,OAAO;AACjE;AAAA,IACJ;AACA,UAAM,aAAa,OAAO,GAAG,GAAG,UAAU;AAAA,EAC9C;AACA,IAAE,SAAS;AACX,QAAM;AACV;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { B as BU, T as TU } from "./index-CLElg2Bo.js";
|
|
2
|
+
function alignBytesPerRow(width) {
|
|
3
|
+
return Math.ceil(width * 4 / 256) * 256;
|
|
4
|
+
}
|
|
5
|
+
function preFrame(surface) {
|
|
6
|
+
const queue = surface._captureQueue;
|
|
7
|
+
if (!queue || queue.length === 0 || surface._swapchainCopySrc) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
surface._swapchainCopySrc = true;
|
|
11
|
+
surface._context.configure({ device: surface.engine._device, format: surface.format, alphaMode: surface._alphaMode, usage: TU.RENDER_ATTACHMENT | TU.COPY_SRC });
|
|
12
|
+
}
|
|
13
|
+
function service(surface, encoder) {
|
|
14
|
+
const queue = surface._captureQueue;
|
|
15
|
+
if (!queue || queue.length === 0) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!surface._swapchainCopySrc) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
surface._captureQueue = void 0;
|
|
22
|
+
const tex = surface.scRT._colorTexture;
|
|
23
|
+
if (!tex) {
|
|
24
|
+
const err = new Error("captureScreenshot: no swapchain texture available");
|
|
25
|
+
for (const r of queue) {
|
|
26
|
+
r.reject(err);
|
|
27
|
+
}
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const width = surface.scRT._width;
|
|
31
|
+
const height = surface.scRT._height;
|
|
32
|
+
const bytesPerRow = alignBytesPerRow(width);
|
|
33
|
+
const buffer = surface.engine._device.createBuffer({
|
|
34
|
+
label: "screenshot-readback",
|
|
35
|
+
size: bytesPerRow * height,
|
|
36
|
+
usage: BU.COPY_DST | BU.MAP_READ
|
|
37
|
+
});
|
|
38
|
+
encoder.copyTextureToBuffer({ texture: tex }, { buffer, bytesPerRow, rowsPerImage: height }, { width, height, depthOrArrayLayers: 1 });
|
|
39
|
+
void finish({ buffer, width, height, bytesPerRow, bgra: surface.format.startsWith("bgra"), reqs: queue });
|
|
40
|
+
}
|
|
41
|
+
async function finish(pend) {
|
|
42
|
+
const { buffer, width, height, bytesPerRow, bgra, reqs } = pend;
|
|
43
|
+
try {
|
|
44
|
+
await Promise.resolve();
|
|
45
|
+
await buffer.mapAsync(GPUMapMode.READ);
|
|
46
|
+
const src = new Uint8Array(buffer.getMappedRange());
|
|
47
|
+
const out = new Uint8ClampedArray(width * height * 4);
|
|
48
|
+
for (let y = 0; y < height; y++) {
|
|
49
|
+
const srcRow = y * bytesPerRow;
|
|
50
|
+
const dstRow = y * width * 4;
|
|
51
|
+
for (let x = 0; x < width; x++) {
|
|
52
|
+
const s = srcRow + x * 4;
|
|
53
|
+
const d = dstRow + x * 4;
|
|
54
|
+
if (bgra) {
|
|
55
|
+
out[d] = src[s + 2];
|
|
56
|
+
out[d + 1] = src[s + 1];
|
|
57
|
+
out[d + 2] = src[s];
|
|
58
|
+
} else {
|
|
59
|
+
out[d] = src[s];
|
|
60
|
+
out[d + 1] = src[s + 1];
|
|
61
|
+
out[d + 2] = src[s + 2];
|
|
62
|
+
}
|
|
63
|
+
out[d + 3] = 255;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
buffer.unmap();
|
|
67
|
+
buffer.destroy();
|
|
68
|
+
const shot = { width, height, data: out };
|
|
69
|
+
for (const r of reqs) {
|
|
70
|
+
r.resolve(shot);
|
|
71
|
+
}
|
|
72
|
+
} catch (e) {
|
|
73
|
+
try {
|
|
74
|
+
buffer.destroy();
|
|
75
|
+
} catch {
|
|
76
|
+
}
|
|
77
|
+
for (const r of reqs) {
|
|
78
|
+
r.reject(e);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function createCaptureService() {
|
|
83
|
+
return service;
|
|
84
|
+
}
|
|
85
|
+
function createCapturePreFrame() {
|
|
86
|
+
return preFrame;
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
createCapturePreFrame,
|
|
90
|
+
createCaptureService
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=screenshot-readback-D0Sj9qq3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-readback-D0Sj9qq3.js","sources":["../src/engine/screenshot-readback.ts"],"sourcesContent":["import type { SurfaceContext } from \"./surface.js\";\nimport type { Screenshot } from \"./screenshot.js\";\nimport { BU, TU } from \"./gpu-flags.js\";\n\n/** @internal Per-frame readback hook driven by `renderFrame` once `captureScreenshot` has\n * lazily loaded this module and installed it on `surface._captureService`. Records the\n * surface's swapchain copy for any queued capture requests into the frame's encoder. */\nexport type CaptureService = (surface: SurfaceContext, encoder: GPUCommandEncoder) => void;\n\n/** @internal Pre-acquire hook driven by `renderFrame` (installed alongside `_captureService`).\n * Called before a surface's frame swapchain texture is acquired; reconfigures that surface's\n * swapchain with COPY_SRC the first time a capture is queued. */\nexport type CapturePreFrame = (surface: SurfaceContext) => void;\n\n/** A single readback in flight: the buffer the frame's copy lands in, plus the dimensions /\n * padding needed to unpack it, and the requests waiting on this frame. */\ninterface PendingReadback {\n buffer: GPUBuffer;\n width: number;\n height: number;\n bytesPerRow: number;\n bgra: boolean;\n reqs: ReadonlyArray<{ resolve: (s: Screenshot) => void; reject: (e: unknown) => void }>;\n}\n\n/** copyTextureToBuffer requires the per-row stride to be a multiple of 256 bytes. */\nfunction alignBytesPerRow(width: number): number {\n return Math.ceil((width * 4) / 256) * 256;\n}\n\n/** Pre-acquire hook. Called by `renderFrame` for each surface BEFORE `_refreshScRT` acquires\n * that surface's frame swapchain texture. On the first queued capture it reconfigures the\n * surface's swapchain with COPY_SRC so the just-acquired texture is copyable. Reconfiguring\n * here (not after the scene has recorded) is mandatory: `configure()` expires the current\n * canvas texture, so doing it mid-frame would invalidate the recorded texture and fail the\n * submit. */\nfunction preFrame(surface: SurfaceContext): void {\n const queue = surface._captureQueue;\n if (!queue || queue.length === 0 || surface._swapchainCopySrc) {\n return;\n }\n surface._swapchainCopySrc = true;\n surface._context.configure({ device: surface.engine._device, format: surface.format, alphaMode: surface._alphaMode, usage: TU.RENDER_ATTACHMENT | TU.COPY_SRC });\n}\n\n/** The readback hook. Called once per surface per frame after the contexts have recorded (so the\n * surface's swapchain texture holds this frame) and before the encoder is finished.\n *\n * By the time this runs the swapchain is already COPY_SRC-capable: `preFrame` reconfigured it\n * before the frame's texture was acquired, so the copy can be recorded straight into this\n * frame's encoder. */\nfunction service(surface: SurfaceContext, encoder: GPUCommandEncoder): void {\n const queue = surface._captureQueue;\n if (!queue || queue.length === 0) {\n return;\n }\n // The swapchain only becomes copyable once `preFrame` has reconfigured it and `renderFrame`\n // has acquired a COPY_SRC texture; until then there is nothing copyable, so wait for the next\n // frame (the request stays queued).\n if (!surface._swapchainCopySrc) {\n return;\n }\n\n surface._captureQueue = undefined;\n\n const tex = surface.scRT._colorTexture;\n if (!tex) {\n const err = new Error(\"captureScreenshot: no swapchain texture available\");\n for (const r of queue) {\n r.reject(err);\n }\n return;\n }\n\n const width = surface.scRT._width;\n const height = surface.scRT._height;\n const bytesPerRow = alignBytesPerRow(width);\n const buffer = surface.engine._device.createBuffer({\n label: \"screenshot-readback\",\n size: bytesPerRow * height,\n usage: BU.COPY_DST | BU.MAP_READ,\n });\n encoder.copyTextureToBuffer({ texture: tex }, { buffer, bytesPerRow, rowsPerImage: height }, { width, height, depthOrArrayLayers: 1 });\n void finish({ buffer, width, height, bytesPerRow, bgra: surface.format.startsWith(\"bgra\"), reqs: queue });\n}\n\n/** Maps the staging buffer after submit, unpacks it into tightly-packed opaque RGBA8, and\n * resolves the waiting requests. Fire-and-forget: the map is async and resolves later. */\nasync function finish(pend: PendingReadback): Promise<void> {\n const { buffer, width, height, bytesPerRow, bgra, reqs } = pend;\n try {\n // Yield one microtask so `renderFrame` submits this frame's encoder (which holds the copy)\n // BEFORE we map the buffer: mapAsync moves the buffer to a pending-map state synchronously,\n // and a buffer pending map cannot be used by a command buffer in a submit — calling it before\n // the submit would invalidate the whole frame and read back an empty (all-black) buffer.\n await Promise.resolve();\n await buffer.mapAsync(GPUMapMode.READ);\n const src = new Uint8Array(buffer.getMappedRange());\n const out = new Uint8ClampedArray(width * height * 4);\n for (let y = 0; y < height; y++) {\n const srcRow = y * bytesPerRow;\n const dstRow = y * width * 4;\n for (let x = 0; x < width; x++) {\n const s = srcRow + x * 4;\n const d = dstRow + x * 4;\n if (bgra) {\n out[d] = src[s + 2]!;\n out[d + 1] = src[s + 1]!;\n out[d + 2] = src[s]!;\n } else {\n out[d] = src[s]!;\n out[d + 1] = src[s + 1]!;\n out[d + 2] = src[s + 2]!;\n }\n out[d + 3] = 255;\n }\n }\n buffer.unmap();\n buffer.destroy();\n const shot: Screenshot = { width, height, data: out };\n for (const r of reqs) {\n r.resolve(shot);\n }\n } catch (e) {\n try {\n buffer.destroy();\n } catch {\n /* already destroyed */\n }\n for (const r of reqs) {\n r.reject(e);\n }\n }\n}\n\n/** @internal Factory invoked by `captureScreenshot` after this module is dynamically imported.\n * Returns the per-frame readback hook installed on `surface._captureService`. */\nexport function createCaptureService(): CaptureService {\n return service;\n}\n\n/** @internal Factory invoked by `captureScreenshot` after this module is dynamically imported.\n * Returns the pre-acquire hook installed on `engine._capturePreFrame`. */\nexport function createCapturePreFrame(): CapturePreFrame {\n return preFrame;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { o as computeUboLayout, q as SCENE_UBO_WGSL } from "./index-CLElg2Bo.js";
|
|
2
2
|
const STAGE_VERTEX = 1;
|
|
3
3
|
const STAGE_FRAGMENT = 2;
|
|
4
4
|
function topoSort(fragments) {
|
|
@@ -287,58 +287,7 @@ ${varyBody}
|
|
|
287
287
|
_fragmentKey
|
|
288
288
|
};
|
|
289
289
|
}
|
|
290
|
-
const MSH_HAS_TANGENTS = 1 << 0;
|
|
291
|
-
const MSH_HAS_SKELETON = 1 << 1;
|
|
292
|
-
const MSH_HAS_SKELETON_8 = 1 << 2;
|
|
293
|
-
const MSH_HAS_MORPH_TARGETS = 1 << 3;
|
|
294
|
-
const MSH_HAS_THIN_INSTANCES = 1 << 4;
|
|
295
|
-
const MSH_HAS_INSTANCE_COLOR = 1 << 5;
|
|
296
|
-
const MSH_HAS_VERTEX_COLOR = 1 << 6;
|
|
297
|
-
const MSH_HAS_UV2 = 1 << 7;
|
|
298
|
-
const MSH_RECEIVE_SHADOWS = 1 << 8;
|
|
299
|
-
function _computeMeshFeatures(mesh, receiveShadows = false) {
|
|
300
|
-
const gpu = mesh._gpu;
|
|
301
|
-
let features = 0;
|
|
302
|
-
if (gpu.tangentBuffer) {
|
|
303
|
-
features |= MSH_HAS_TANGENTS;
|
|
304
|
-
}
|
|
305
|
-
if (mesh.skeleton) {
|
|
306
|
-
features |= MSH_HAS_SKELETON;
|
|
307
|
-
if (mesh.skeleton.joints1Buffer) {
|
|
308
|
-
features |= MSH_HAS_SKELETON_8;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
if (mesh.morphTargets) {
|
|
312
|
-
features |= MSH_HAS_MORPH_TARGETS;
|
|
313
|
-
}
|
|
314
|
-
if (mesh.thinInstances) {
|
|
315
|
-
features |= MSH_HAS_THIN_INSTANCES;
|
|
316
|
-
if (mesh.thinInstances.colors) {
|
|
317
|
-
features |= MSH_HAS_INSTANCE_COLOR;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
if (gpu.colorBuffer) {
|
|
321
|
-
features |= MSH_HAS_VERTEX_COLOR;
|
|
322
|
-
}
|
|
323
|
-
if (gpu.uv2Buffer) {
|
|
324
|
-
features |= MSH_HAS_UV2;
|
|
325
|
-
}
|
|
326
|
-
if (receiveShadows) {
|
|
327
|
-
features |= MSH_RECEIVE_SHADOWS;
|
|
328
|
-
}
|
|
329
|
-
return features;
|
|
330
|
-
}
|
|
331
290
|
export {
|
|
332
|
-
|
|
333
|
-
_computeMeshFeatures as _,
|
|
334
|
-
MSH_HAS_SKELETON_8 as a,
|
|
335
|
-
MSH_HAS_MORPH_TARGETS as b,
|
|
336
|
-
MSH_HAS_UV2 as c,
|
|
337
|
-
MSH_HAS_TANGENTS as d,
|
|
338
|
-
composeShader as e,
|
|
339
|
-
MSH_RECEIVE_SHADOWS as f,
|
|
340
|
-
MSH_HAS_THIN_INSTANCES as g,
|
|
341
|
-
MSH_HAS_VERTEX_COLOR as h,
|
|
342
|
-
MSH_HAS_INSTANCE_COLOR as i
|
|
291
|
+
composeShader as c
|
|
343
292
|
};
|
|
344
|
-
//# sourceMappingURL=
|
|
293
|
+
//# sourceMappingURL=shader-composer-BUD_pSX4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader-composer-BUD_pSX4.js","sources":["../src/shader/shader-composer.ts"],"sourcesContent":["/**\n * Shader Composer — assembles ShaderFragment[] + ShaderTemplate into\n * final WGSL source + GPU layout descriptors. Pure function, no global state.\n * All shader text comes from template + fragment modules.\n */\nimport type { BindingDecl, ComposedShader, FragmentSlot, ShaderFragment, ShaderTemplate, VertexAttribute, VertexSlot, Varying } from \"./fragment-types.js\";\nimport { computeUboLayout } from \"./ubo-layout.js\";\nimport { SCENE_UBO_WGSL } from \"./scene-uniforms.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nfunction topoSort(fragments: readonly ShaderFragment[]): ShaderFragment[] {\n const byId = new Map<string, ShaderFragment>();\n for (const f of fragments) {\n if (byId.has(f._id)) {\n throw Error();\n }\n byId.set(f._id, f);\n }\n const inDeg = new Map<string, number>();\n const deps = new Map<string, string[]>();\n for (const f of fragments) {\n if (!inDeg.has(f._id)) {\n inDeg.set(f._id, 0);\n }\n for (const d of f._dependencies ?? []) {\n if (!byId.has(d)) {\n throw Error();\n }\n inDeg.set(f._id, (inDeg.get(f._id) ?? 0) + 1);\n let arr = deps.get(d);\n if (!arr) {\n arr = [];\n deps.set(d, arr);\n }\n arr.push(f._id);\n }\n }\n const q: string[] = [];\n for (const [id, d] of inDeg) {\n if (d === 0) {\n q.push(id);\n }\n }\n q.sort();\n const out: ShaderFragment[] = [];\n let qi = 0;\n while (qi < q.length) {\n const id = q[qi++]!;\n out.push(byId.get(id)!);\n for (const d of deps.get(id) ?? []) {\n const nd = (inDeg.get(d) ?? 1) - 1;\n inDeg.set(d, nd);\n if (nd === 0) {\n let i = qi;\n while (i < q.length && q[i]! < d) {\n i++;\n }\n q.splice(i, 0, d);\n }\n }\n }\n if (out.length !== fragments.length) {\n throw Error();\n }\n return out;\n}\n\nfunction dedup<T extends { _name: string }>(base: readonly T[], extra: readonly T[]): T[] {\n const seen = new Set<string>();\n const all: T[] = [];\n for (const v of base) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n for (const v of extra) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n return all;\n}\n\nfunction bglEntry(binding: number, decl: BindingDecl): GPUBindGroupLayoutEntry {\n const e: GPUBindGroupLayoutEntry = { binding, visibility: decl._visibility };\n switch (decl._type._kind) {\n case \"uniform-buffer\":\n e.buffer = { type: \"uniform\" };\n break;\n case \"texture\": {\n const def = decl._type._textureType === \"texture_depth_2d\" ? \"depth\" : decl._type._textureType === \"texture_2d<u32>\" ? \"uint\" : \"float\";\n e.texture = {\n sampleType: (decl._type._sampleType ?? def) as GPUTextureSampleType,\n viewDimension: decl._type._textureType.includes(\"array\") ? \"2d-array\" : decl._type._textureType.includes(\"cube\") ? \"cube\" : \"2d\",\n };\n break;\n }\n case \"sampler\":\n e.sampler = {\n type: decl._type._samplerType === \"sampler_comparison\" ? \"comparison\" : decl._type._samplerType === \"sampler_non_filtering\" ? \"non-filtering\" : \"filtering\",\n };\n break;\n case \"storage-texture\":\n e.storageTexture = { access: decl._type._access as GPUStorageTextureAccess, format: decl._type._format as GPUTextureFormat };\n break;\n }\n return e;\n}\n\nfunction declWGSL(g: number, b: number, d: BindingDecl): string {\n switch (d._type._kind) {\n case \"uniform-buffer\":\n return `@group(${g})@binding(${b}) var<uniform> ${d._name}:${d._name}Uniforms;`;\n case \"texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._textureType};`;\n case \"sampler\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._samplerType === \"sampler_non_filtering\" ? \"sampler\" : d._type._samplerType};`;\n case \"storage-texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:texture_storage_2d<${d._type._format},${d._type._access}>;`;\n }\n}\n\nconst SLOT_RE = /\\/\\*([A-Z_0-9]+)\\*\\//g;\nfunction injectSlots(tpl: string, sorted: readonly ShaderFragment[], key: \"_fragmentSlots\" | \"_vertexSlots\"): string {\n return tpl.replace(SLOT_RE, (_, slot: string) => {\n const parts: string[] = [];\n for (const f of sorted) {\n const s = f[key] as Partial<Record<FragmentSlot | VertexSlot, string>> | undefined;\n if (s?.[slot as FragmentSlot | VertexSlot]) {\n parts.push(s[slot as FragmentSlot | VertexSlot]!);\n }\n }\n return parts.join(\"\\n\");\n });\n}\n\nexport function composeShader(template: ShaderTemplate, fragments: readonly ShaderFragment[]): ComposedShader {\n const sorted = topoSort(fragments);\n\n // Collect fragment data\n const fragAttrs: VertexAttribute[] = [];\n const fragVaryings: Varying[] = [];\n const helpers: string[] = [];\n const vHelpers: string[] = [];\n const vBuiltins: string[] = [];\n for (const f of sorted) {\n if (f._vertexAttributes) {\n fragAttrs.push(...f._vertexAttributes);\n }\n if (f._varyings) {\n fragVaryings.push(...f._varyings);\n }\n if (f._helperFunctions) {\n helpers.push(f._helperFunctions);\n }\n if (f._vertexHelperFunctions) {\n vHelpers.push(f._vertexHelperFunctions);\n }\n for (const b of f._vertexBuiltins ?? []) {\n vBuiltins.push(`@builtin(${b._builtin}) ${b._name}:${b._type},`);\n }\n }\n\n // Vertex attributes + layouts\n const allAttrs = dedup(template._baseVertexAttributes, fragAttrs);\n const inputLines: string[] = [];\n const _vertexBufferLayouts: GPUVertexBufferLayout[] = [];\n const groups = new Map<string, { loc: number; off: number; fmt: GPUVertexFormat }[]>();\n const firstOfGroup = new Map<string, VertexAttribute>();\n for (let i = 0; i < allAttrs.length; i++) {\n const a = allAttrs[i]!;\n inputLines.push(`@location(${i}) ${a._name}:${a._type},`);\n if (a._bufferGroup) {\n if (!groups.has(a._bufferGroup)) {\n groups.set(a._bufferGroup, []);\n firstOfGroup.set(a._bufferGroup, a);\n }\n groups.get(a._bufferGroup)!.push({ loc: i, off: a._offset ?? 0, fmt: a._gpuFormat });\n } else {\n _vertexBufferLayouts.push({\n arrayStride: a._arrayStride,\n stepMode: a._stepMode ?? \"vertex\",\n attributes: [{ shaderLocation: i, offset: a._offset ?? 0, format: a._gpuFormat }],\n });\n }\n }\n for (const [grp, attrs] of groups) {\n const f = firstOfGroup.get(grp)!;\n _vertexBufferLayouts.push({\n arrayStride: f._arrayStride,\n stepMode: f._stepMode ?? \"vertex\",\n attributes: attrs.map((a) => ({ shaderLocation: a.loc, offset: a.off, format: a.fmt })),\n });\n }\n let nextLoc = allAttrs.length;\n for (const f of sorted) {\n if (f._pipelineVertexBuffers) {\n const r = f._pipelineVertexBuffers(nextLoc);\n _vertexBufferLayouts.push(...r._buffers);\n nextLoc = r._nextLoc;\n }\n }\n\n // Varyings\n const allVary = dedup(template._baseVaryings, fragVaryings);\n const varyBody = `@builtin(position) clipPos:vec4f,\\n` + allVary.map((v, i) => `@location(${i}) ${v._name}:${v._type},`).join(\"\\n\");\n\n // UBO layouts\n const hasMaterialUbo = !!(template._baseMaterialUboFields && template._baseMaterialUboFields.length > 0);\n const meshFields = [...template._baseMeshUboFields];\n const materialFields = hasMaterialUbo ? [...template._baseMaterialUboFields] : [];\n for (const f of sorted) {\n if (f._uboFields?.length) {\n (hasMaterialUbo ? materialFields : meshFields).push(...f._uboFields);\n }\n }\n const _meshUboSpec = computeUboLayout(meshFields);\n const _materialUboSpec = hasMaterialUbo ? computeUboLayout(materialFields) : undefined;\n\n // Bindings\n const meshBGL: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: STAGE_VERTEX | STAGE_FRAGMENT, buffer: { type: \"uniform\" } }];\n if (hasMaterialUbo) {\n meshBGL.push({ binding: 1, visibility: STAGE_FRAGMENT, buffer: { type: \"uniform\" } });\n }\n const shadowBGL: GPUBindGroupLayoutEntry[] = [];\n const vDecls: string[] = [];\n const fDecls: string[] = [];\n let mb = hasMaterialUbo ? 2 : 1,\n sb = 0;\n\n function addBinding(d: BindingDecl, _isVertex: boolean) {\n const isShadow = d._group === \"shadow\";\n const b = isShadow ? sb++ : mb++;\n const g = isShadow ? 2 : 1;\n (isShadow ? shadowBGL : meshBGL).push(bglEntry(b, d));\n const w = declWGSL(g, b, d);\n if (d._visibility & STAGE_VERTEX) {\n vDecls.push(w);\n }\n if (d._visibility & STAGE_FRAGMENT) {\n fDecls.push(w);\n }\n }\n\n for (const d of template._baseVertexBindings ?? []) {\n addBinding(d, true);\n }\n for (const f of sorted) {\n for (const d of f._vertexBindings ?? []) {\n addBinding(d, true);\n }\n }\n for (const d of template._baseBindings ?? []) {\n addBinding(d, false);\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => (b._group ?? \"mesh\") === \"mesh\")) {\n addBinding(d, false);\n }\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => b._group === \"shadow\")) {\n addBinding(d, false);\n }\n }\n\n const _fragmentKey = sorted.map((f) => f._id).join(\"|\");\n const vParams = (vBuiltins.length ? vBuiltins.join(\"\\n\") + \"\\n\" : \"\") + inputLines.join(\"\\n\");\n const meshStruct = `struct MeshUniforms{\\n${_meshUboSpec._structBody}\\n}`;\n const materialStruct = _materialUboSpec ? `\\nstruct MaterialUniforms{\\n${_materialUboSpec._structBody}\\n}\\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;` : \"\";\n\n let _vertexWGSL = template._vertexTemplate;\n _vertexWGSL = _vertexWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _vertexWGSL = _vertexWGSL.replace(\"/*MU*/\", meshStruct);\n _vertexWGSL = _vertexWGSL.replace(\"/*VI*/\", `struct VertexInput{\\n${inputLines.join(\"\\n\")}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VO*/\", `struct VertexOutput{\\n${varyBody}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VD*/\", vDecls.join(\"\\n\"));\n _vertexWGSL = _vertexWGSL.replace(\"/*VP*/\", vParams);\n _vertexWGSL = _vertexWGSL.replace(\"/*VH*/\", vHelpers.join(\"\\n\"));\n // These dynamic keys are reserved from Terser property mangling in bundle-scenes-core.ts.\n _vertexWGSL = injectSlots(_vertexWGSL, sorted, \"_vertexSlots\");\n\n let _fragmentWGSL = template._fragmentTemplate;\n _fragmentWGSL = _fragmentWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*MU*/\", meshStruct + materialStruct);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FI*/\", `struct FragmentInput{\\n${varyBody}\\n}`);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*HF*/\", helpers.join(\"\\n\"));\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FB*/\", fDecls.join(\"\\n\"));\n _fragmentWGSL = injectSlots(_fragmentWGSL, sorted, \"_fragmentSlots\");\n\n const _meshBGLDescriptor = { entries: meshBGL };\n const _shadowBGLDescriptor = shadowBGL.length ? { entries: shadowBGL } : null;\n\n return {\n _vertexWGSL,\n _fragmentWGSL,\n _meshBGLDescriptor,\n _shadowBGLDescriptor,\n _vertexBufferLayouts,\n _meshUboSpec,\n _materialUboSpec,\n _fragmentKey,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
const SHADER_STAGE_ALL =
|
|
1
|
+
import { x as targetSignatureKey, z as getSceneBindGroupLayout, bO as _isShaderSystemUniform, o as computeUboLayout, q as SCENE_UBO_WGSL, S as SS, _ as createEmptyUniformBuffer, a as F32, ax as acquireTexture, ay as releaseTexture, e as U8, bP as getEffectiveAspectRatio, I as getViewMatrix, J as getProjectionMatrix, bN as getViewProjectionMatrix, bd as mat4MultiplyInto, U as U32, bQ as I32, B as BU } from "./index-CLElg2Bo.js";
|
|
2
|
+
const SHADER_STAGE_ALL = SS.VERTEX | SS.FRAGMENT;
|
|
3
3
|
function getOrCreateShaderPipelineBindings(engine, material) {
|
|
4
4
|
const state = material;
|
|
5
5
|
if (state._shaderBindings && state._shaderDevice === engine._device) {
|
|
@@ -60,12 +60,18 @@ ${material.fragmentSource}` }) : null;
|
|
|
60
60
|
...sig._depthStencilFormat ? {
|
|
61
61
|
depthStencil: {
|
|
62
62
|
format: sig._depthStencilFormat,
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
// The target's declared depth convention wins over the material default: a depth-only
|
|
64
|
+
// caster authored for the forward-Z shadow map ("less-equal") must still depth-test
|
|
65
|
+
// correctly when drawn into a reverse-Z camera depth prepass that declares
|
|
66
|
+
// "greater-equal" — otherwise every fragment fails against the 0-cleared buffer.
|
|
67
|
+
depthCompare: sig._depthCompare ?? material.depthCompare,
|
|
68
|
+
depthWriteEnabled: material.needAlphaBlending ? false : material.depthWrite,
|
|
69
|
+
...material.depthBias ? { depthBias: material.depthBias } : {},
|
|
70
|
+
...material.depthBiasSlopeScale ? { depthBiasSlopeScale: material.depthBiasSlopeScale } : {}
|
|
65
71
|
}
|
|
66
72
|
} : {},
|
|
67
73
|
multisample: { count: sig._sampleCount },
|
|
68
|
-
primitive: { topology: "triangle-list", cullMode: material.backFaceCulling ? "back" : "none", frontFace:
|
|
74
|
+
primitive: { topology: "triangle-list", cullMode: material.backFaceCulling ? "back" : "none", frontFace: "ccw" }
|
|
69
75
|
});
|
|
70
76
|
bindings.pipelines.set(key, pipeline);
|
|
71
77
|
return pipeline;
|
|
@@ -196,11 +202,11 @@ async function buildShaderGroup(scene, meshes) {
|
|
|
196
202
|
if (!meshes.some((m) => !!m.thinInstances)) {
|
|
197
203
|
return buildShaderMaterialRenderables(scene, meshes);
|
|
198
204
|
}
|
|
199
|
-
const mod = await import("./shader-thin-instance-
|
|
205
|
+
const mod = await import("./shader-thin-instance-DuBotxDO.js");
|
|
200
206
|
const cull = meshes.some((m) => {
|
|
201
207
|
var _a;
|
|
202
208
|
return !!((_a = m.thinInstances) == null ? void 0 : _a._gpuCullingEnabled);
|
|
203
|
-
}) ? await import("./thin-instance-cull-binding-
|
|
209
|
+
}) ? await import("./thin-instance-cull-binding-DWKUt5ZN.js") : void 0;
|
|
204
210
|
return mod.buildShaderRenderablesWithInstancing(
|
|
205
211
|
scene,
|
|
206
212
|
meshes,
|
|
@@ -218,7 +224,7 @@ function buildSingleShaderRenderable(scene, mesh, material, isOverride) {
|
|
|
218
224
|
return buildMaterialRenderables(scene, material, [mesh], isOverride)[0];
|
|
219
225
|
}
|
|
220
226
|
function buildMaterialRenderables(scene, material, meshes, isOverride = false) {
|
|
221
|
-
const engine = scene.engine;
|
|
227
|
+
const engine = scene.surface.engine;
|
|
222
228
|
const bindings = getOrCreateShaderPipelineBindings(engine, material);
|
|
223
229
|
ensureCustomUbo(engine, material, bindings.customSpec);
|
|
224
230
|
const packets = meshes.map((mesh) => createPacket(scene, material, bindings.systemSpec, mesh));
|
|
@@ -229,9 +235,9 @@ function buildMaterialRenderables(scene, material, meshes, isOverride = false) {
|
|
|
229
235
|
return [createOpaqueRenderable(scene, material, packets, isOverride)];
|
|
230
236
|
}
|
|
231
237
|
function createPacket(scene, material, systemSpec, mesh) {
|
|
232
|
-
const engine = scene.engine;
|
|
238
|
+
const engine = scene.surface.engine;
|
|
233
239
|
const systemUBO = createEmptyUniformBuffer(engine, systemSpec._totalBytes, "shader-system-ubo");
|
|
234
|
-
const systemData = new
|
|
240
|
+
const systemData = new F32(systemSpec._totalBytes / 4);
|
|
235
241
|
writeSystemUniforms(systemData, systemSpec, material, mesh, scene.camera, engine.canvas.width || 1, engine.canvas.height || 1);
|
|
236
242
|
engine._device.queue.writeBuffer(systemUBO, 0, systemData);
|
|
237
243
|
const packet = {
|
|
@@ -255,7 +261,7 @@ function createOpaqueRenderable(scene, material, packets, isOverride) {
|
|
|
255
261
|
}
|
|
256
262
|
}
|
|
257
263
|
const update = (context) => {
|
|
258
|
-
updateCustomUbo(scene.engine, material);
|
|
264
|
+
updateCustomUbo(scene.surface.engine, material);
|
|
259
265
|
for (const packet of packets) {
|
|
260
266
|
if (packet._disposed) {
|
|
261
267
|
continue;
|
|
@@ -301,7 +307,7 @@ function createTransparentRenderable(scene, material, packet, isOverride) {
|
|
|
301
307
|
if (!isOverride && packet.mesh.material !== material) {
|
|
302
308
|
return;
|
|
303
309
|
}
|
|
304
|
-
updateCustomUbo(scene.engine, material);
|
|
310
|
+
updateCustomUbo(scene.surface.engine, material);
|
|
305
311
|
updatePacket(scene, material, packet, context);
|
|
306
312
|
const m = packet.mesh.worldMatrix;
|
|
307
313
|
sortCenter[0] = m[12];
|
|
@@ -332,7 +338,7 @@ function createTransparentRenderable(scene, material, packet, isOverride) {
|
|
|
332
338
|
return r;
|
|
333
339
|
}
|
|
334
340
|
function updatePacket(scene, material, packet, context) {
|
|
335
|
-
const engine = scene.engine;
|
|
341
|
+
const engine = scene.surface.engine;
|
|
336
342
|
const state = material;
|
|
337
343
|
writeSystemUniforms(packet.systemData, state._shaderBindings.systemSpec, material, packet.mesh, context._camera ?? scene.camera, context.targetWidth, context.targetHeight);
|
|
338
344
|
engine._device.queue.writeBuffer(packet.systemUBO, 0, packet.systemData);
|
|
@@ -382,7 +388,7 @@ function updateCustomUbo(engine, material) {
|
|
|
382
388
|
if (!customSpec || !customUbo || !customData || state._shaderCustomVersion === material._uniformVersion) {
|
|
383
389
|
return;
|
|
384
390
|
}
|
|
385
|
-
const bytes = new
|
|
391
|
+
const bytes = new U8(customData);
|
|
386
392
|
bytes.fill(0);
|
|
387
393
|
for (const [name, slot] of material._uniformValues) {
|
|
388
394
|
if (_isShaderSystemUniform(name)) {
|
|
@@ -398,14 +404,14 @@ function updateCustomUbo(engine, material) {
|
|
|
398
404
|
}
|
|
399
405
|
function writeTypedValue(data, offset, type, value) {
|
|
400
406
|
if (type === "u32") {
|
|
401
|
-
new
|
|
407
|
+
new U32(data, offset, 1)[0] = value[0];
|
|
402
408
|
return;
|
|
403
409
|
}
|
|
404
410
|
if (type === "i32") {
|
|
405
|
-
new
|
|
411
|
+
new I32(data, offset, 1)[0] = value[0];
|
|
406
412
|
return;
|
|
407
413
|
}
|
|
408
|
-
new
|
|
414
|
+
new F32(data, offset, value.length).set(value);
|
|
409
415
|
}
|
|
410
416
|
function createShaderBindGroup(engine, material, systemUBO) {
|
|
411
417
|
const bindings = getOrCreateShaderPipelineBindings(engine, material);
|
|
@@ -533,7 +539,7 @@ function getZeroAttrBuffer(engine, gpu, name) {
|
|
|
533
539
|
}
|
|
534
540
|
const vertexCount = gpu.positionBuffer.size / 12;
|
|
535
541
|
const stride = name === "uv" || name === "uv2" ? 8 : name === "normal" ? 12 : 16;
|
|
536
|
-
const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage:
|
|
542
|
+
const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage: BU.VERTEX | BU.COPY_DST });
|
|
537
543
|
cache.set(name, buffer);
|
|
538
544
|
return buffer;
|
|
539
545
|
}
|
|
@@ -557,4 +563,4 @@ export {
|
|
|
557
563
|
buildShaderGroup,
|
|
558
564
|
buildShaderMaterialRenderables
|
|
559
565
|
};
|
|
560
|
-
//# sourceMappingURL=shader-renderable-
|
|
566
|
+
//# sourceMappingURL=shader-renderable-D7-RyVxa.js.map
|