@babylonjs/lite 0.1.1 → 0.2.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 +10 -0
- package/_mat4-storage-f64-Bvh5TymE.js.map +1 -0
- package/{alpha-test-fragment-CUiHCw7W.js → alpha-test-fragment-BCChpzaV.js} +2 -2
- package/{alpha-test-fragment-CUiHCw7W.js.map → alpha-test-fragment-BCChpzaV.js.map} +1 -1
- package/{background-dds-skybox-yHTqabU3.js → background-dds-skybox-ZjrSIxrT.js} +4 -4
- package/background-dds-skybox-ZjrSIxrT.js.map +1 -0
- package/{background-ground-DIw6D3qf.js → background-ground-B2Mie-MI.js} +3 -3
- package/background-ground-B2Mie-MI.js.map +1 -0
- package/{background-hdr-skybox-c4uuTmkP.js → background-hdr-skybox-DDRJYuT2.js} +3 -3
- package/background-hdr-skybox-DDRJYuT2.js.map +1 -0
- package/{background-solid-skybox-DPGBpPbm.js → background-solid-skybox-fjXlnWaD.js} +3 -3
- package/{background-solid-skybox-DPGBpPbm.js.map → background-solid-skybox-fjXlnWaD.js.map} +1 -1
- package/{billboard-renderable-D8mlVGCd.js → billboard-renderable-DKmlOgbM.js} +2 -2
- package/{billboard-renderable-D8mlVGCd.js.map → billboard-renderable-DKmlOgbM.js.map} +1 -1
- package/{clamp-block-BdII67hT.js → clamp-block-CxRBPlUq.js} +2 -2
- package/{clamp-block-BdII67hT.js.map → clamp-block-CxRBPlUq.js.map} +1 -1
- package/{clearcoat-fragment-LCiG98Rf.js → clearcoat-fragment-KbZAa0TA.js} +2 -2
- package/{clearcoat-fragment-LCiG98Rf.js.map → clearcoat-fragment-KbZAa0TA.js.map} +1 -1
- package/{create-skeleton-C9JdIJnb.js → create-skeleton-BBI5urcj.js} +2 -2
- package/{create-skeleton-C9JdIJnb.js.map → create-skeleton-BBI5urcj.js.map} +1 -1
- package/{cubemap-skybox-material-DvXMVc4k.js → cubemap-skybox-material-DvW81drX.js} +2 -2
- package/{cubemap-skybox-material-DvXMVc4k.js.map → cubemap-skybox-material-DvW81drX.js.map} +1 -1
- package/{curve-block-BlJpXVYv.js → curve-block-Dh_xdUj-.js} +2 -2
- package/{curve-block-BlJpXVYv.js.map → curve-block-Dh_xdUj-.js.map} +1 -1
- package/{emissive-fragment-BnNvbBCw.js → emissive-fragment-DD8cvHyx.js} +2 -2
- package/{emissive-fragment-BnNvbBCw.js.map → emissive-fragment-DD8cvHyx.js.map} +1 -1
- package/{esm-shadow-view-DGKdF1NI.js → esm-shadow-view-15S4JK6p.js} +2 -2
- package/{esm-shadow-view-DGKdF1NI.js.map → esm-shadow-view-15S4JK6p.js.map} +1 -1
- package/{esm-shadow-view-Dk9NFtLq.js → esm-shadow-view-DHVS9r7H.js} +2 -2
- package/{esm-shadow-view-Dk9NFtLq.js.map → esm-shadow-view-DHVS9r7H.js.map} +1 -1
- package/{esm-shadow-view-DN9HIaM4.js → esm-shadow-view-DYAc62Kl.js} +2 -2
- package/{esm-shadow-view-DN9HIaM4.js.map → esm-shadow-view-DYAc62Kl.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-DgJl7l56.js → gaussian-splatting-pipeline-sh-BvkUhA9V.js} +2 -2
- package/{gaussian-splatting-pipeline-sh-DgJl7l56.js.map → gaussian-splatting-pipeline-sh-BvkUhA9V.js.map} +1 -1
- package/{gltf-animation-D7uyTyO3.js → gltf-animation-KnPzeOIY.js} +3 -3
- package/{gltf-animation-D7uyTyO3.js.map → gltf-animation-KnPzeOIY.js.map} +1 -1
- package/gltf-color-normalize-Qxl-9C48.js +29 -0
- package/gltf-color-normalize-Qxl-9C48.js.map +1 -0
- package/{gltf-ext-basisu-CPg5kPrx.js → gltf-ext-basisu-kmth3UWX.js} +7 -4
- package/gltf-ext-basisu-kmth3UWX.js.map +1 -0
- package/{gltf-ext-node-visibility-MafA9ot2.js → gltf-ext-node-visibility-BjRRd6si.js} +2 -2
- package/{gltf-ext-node-visibility-MafA9ot2.js.map → gltf-ext-node-visibility-BjRRd6si.js.map} +1 -1
- package/{gltf-ext-uv-transform-CE_-T1Tr.js → gltf-ext-uv-transform-MHmR-YyM.js} +2 -2
- package/{gltf-ext-uv-transform-CE_-T1Tr.js.map → gltf-ext-uv-transform-MHmR-YyM.js.map} +1 -1
- package/{gltf-feature-animation-pointer-BjpwOOqo.js → gltf-feature-animation-pointer-rFqLfbO_.js} +3 -3
- package/{gltf-feature-animation-pointer-BjpwOOqo.js.map → gltf-feature-animation-pointer-rFqLfbO_.js.map} +1 -1
- package/{gltf-feature-animations-CCizegp8.js → gltf-feature-animations-DikONdzi.js} +2 -2
- package/{gltf-feature-animations-CCizegp8.js.map → gltf-feature-animations-DikONdzi.js.map} +1 -1
- package/{gltf-feature-gpu-instancing-2e_CFQnl.js → gltf-feature-gpu-instancing-Cj1XjmM6.js} +5 -4
- package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +1 -0
- package/{gltf-feature-lights-punctual-DDDg4j0U.js → gltf-feature-lights-punctual-C-0SlGmD.js} +5 -5
- package/{gltf-feature-lights-punctual-DDDg4j0U.js.map → gltf-feature-lights-punctual-C-0SlGmD.js.map} +1 -1
- package/{gltf-feature-morph-CKCw6tkX.js → gltf-feature-morph-BAcY14XU.js} +3 -3
- package/{gltf-feature-morph-CKCw6tkX.js.map → gltf-feature-morph-BAcY14XU.js.map} +1 -1
- package/gltf-feature-registry-97sY_x5O.js +59 -0
- package/gltf-feature-registry-97sY_x5O.js.map +1 -0
- package/{gltf-feature-skeleton-D8hWLqi2.js → gltf-feature-skeleton-lVjkDfIU.js} +3 -3
- package/{gltf-feature-skeleton-D8hWLqi2.js.map → gltf-feature-skeleton-lVjkDfIU.js.map} +1 -1
- package/{gltf-feature-variants-Ds6v9byg.js → gltf-feature-variants-BphF4JmV.js} +2 -2
- package/{gltf-feature-variants-Ds6v9byg.js.map → gltf-feature-variants-BphF4JmV.js.map} +1 -1
- package/{gltf-interleave-DGnUlz28.js → gltf-interleave-C9eBqH_F.js} +2 -2
- package/{gltf-interleave-DGnUlz28.js.map → gltf-interleave-C9eBqH_F.js.map} +1 -1
- package/gltf-normals-b2h74380.js +37 -0
- package/gltf-normals-b2h74380.js.map +1 -0
- package/{gltf-pbr-builder-ext-BFOxOCnQ.js → gltf-pbr-builder-ext-DPC0zg_u.js} +2 -2
- package/{gltf-pbr-builder-ext-BFOxOCnQ.js.map → gltf-pbr-builder-ext-DPC0zg_u.js.map} +1 -1
- package/{gltf-variants-DFbr8EES.js → gltf-variants-CnBEZr0o.js} +4 -4
- package/{gltf-variants-DFbr8EES.js.map → gltf-variants-CnBEZr0o.js.map} +1 -1
- package/{gs-picking-pipeline-DzfMASL9.js → gs-picking-pipeline-Bx8LTav6.js} +2 -2
- package/{gs-picking-pipeline-DzfMASL9.js.map → gs-picking-pipeline-Bx8LTav6.js.map} +1 -1
- package/{index-C8HOR2sB.js → index-B7Qhw0xL.js} +3047 -1037
- package/index-B7Qhw0xL.js.map +1 -0
- package/index.d.ts +504 -17
- package/index.js +322 -304
- package/{input-block-DgAJBzN_.js → input-block-Coi_aZwl.js} +2 -2
- package/{input-block-DgAJBzN_.js.map → input-block-Coi_aZwl.js.map} +1 -1
- package/{iridescence-fragment-Gymp7or5.js → iridescence-fragment-DwZcCTdD.js} +2 -2
- package/{iridescence-fragment-Gymp7or5.js.map → iridescence-fragment-DwZcCTdD.js.map} +1 -1
- package/{light-block-B11ew7FA.js → light-block-Np_h5gPI.js} +2 -2
- package/{light-block-B11ew7FA.js.map → light-block-Np_h5gPI.js.map} +1 -1
- package/{loop-block-Bb23EOMb.js → loop-block-BFkLFYGm.js} +2 -2
- package/{loop-block-Bb23EOMb.js.map → loop-block-BFkLFYGm.js.map} +1 -1
- package/{mesh-features-BLENkYVt.js → mesh-features-BAJpbMog.js} +6 -3
- package/mesh-features-BAJpbMog.js.map +1 -0
- package/{morph-fragment-DOVo70gP.js → morph-fragment-DqH-w61u.js} +2 -2
- package/{morph-fragment-DOVo70gP.js.map → morph-fragment-DqH-w61u.js.map} +1 -1
- package/{multilight-wgsl-BGyiIOp3.js → multilight-wgsl-B9Mf9d-q.js} +4 -4
- package/{multilight-wgsl-BGyiIOp3.js.map → multilight-wgsl-B9Mf9d-q.js.map} +1 -1
- package/no-color-view-DsyLSL-W.js +8 -0
- package/no-color-view-DsyLSL-W.js.map +1 -0
- package/{node-registry-DwgC4yth.js → node-registry-Bd-AlrgC.js} +8 -8
- package/{node-registry-DwgC4yth.js.map → node-registry-Bd-AlrgC.js.map} +1 -1
- package/{node-registry-extra-compat-Dhrw8fDQ.js → node-registry-extra-compat-Ch7ApZHF.js} +2 -2
- package/{node-registry-extra-compat-Dhrw8fDQ.js.map → node-registry-extra-compat-Ch7ApZHF.js.map} +1 -1
- package/{node-registry-extra-math-CsAHvIZo.js → node-registry-extra-math-6ezzTkPj.js} +2 -2
- package/{node-registry-extra-math-CsAHvIZo.js.map → node-registry-extra-math-6ezzTkPj.js.map} +1 -1
- package/{node-renderable-DlLIdBmd.js → node-renderable-CS0CmsSp.js} +28 -11
- package/node-renderable-CS0CmsSp.js.map +1 -0
- package/{node-shadow-DKrcqmNg.js → node-shadow-CpnrdvtJ.js} +2 -2
- package/{node-shadow-DKrcqmNg.js.map → node-shadow-CpnrdvtJ.js.map} +1 -1
- package/{normal-map-fragment-DpsIXrJf.js → normal-map-fragment-DradEMl-.js} +3 -3
- package/{normal-map-fragment-DpsIXrJf.js.map → normal-map-fragment-DradEMl-.js.map} +1 -1
- package/pack-mat4-with-offset-BqB8Jqo7.js +37 -0
- package/pack-mat4-with-offset-BqB8Jqo7.js.map +1 -0
- package/package.json +3 -3
- package/{parse-camera-DM3oJJeT.js → parse-camera-CgV4bWc0.js} +2 -2
- package/{parse-camera-DM3oJJeT.js.map → parse-camera-CgV4bWc0.js.map} +1 -1
- package/pbr-fog-wgsl-BqdCid6r.js +8 -0
- package/pbr-fog-wgsl-BqdCid6r.js.map +1 -0
- package/{pbr-metallic-roughness-block-h_KAOZrW.js → pbr-metallic-roughness-block-BFwZj2Nw.js} +2 -2
- package/{pbr-metallic-roughness-block-h_KAOZrW.js.map → pbr-metallic-roughness-block-BFwZj2Nw.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js → pbr-metallic-roughness-block-full-5t0HT3xl.js} +2 -2
- package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js.map → pbr-metallic-roughness-block-full-5t0HT3xl.js.map} +1 -1
- package/{pbr-mr-helper-core-CIwm-T1G.js → pbr-mr-helper-core-R5tOZ8Ap.js} +2 -2
- package/{pbr-mr-helper-core-CIwm-T1G.js.map → pbr-mr-helper-core-R5tOZ8Ap.js.map} +1 -1
- package/{pbr-refraction-DGmMSa2v.js → pbr-refraction-Dd11HnaI.js} +2 -2
- package/{pbr-refraction-DGmMSa2v.js.map → pbr-refraction-Dd11HnaI.js.map} +1 -1
- package/{pbr-renderable-BJxUtPBb.js → pbr-renderable-BHAdF5Vw.js} +80 -38
- package/pbr-renderable-BHAdF5Vw.js.map +1 -0
- package/{pbr-shadow-fragment-LO9SlbJj.js → pbr-shadow-fragment-BxUrFJYZ.js} +6 -1
- package/pbr-shadow-fragment-BxUrFJYZ.js.map +1 -0
- package/{pbr-template-ext-8q7BcTDf.js → pbr-template-ext-CGgB2n2y.js} +3 -2
- package/{pbr-template-ext-8q7BcTDf.js.map → pbr-template-ext-CGgB2n2y.js.map} +1 -1
- package/{pbr-tracking-B3alzn91.js → pbr-tracking-D6i3yPb7.js} +2 -2
- package/{pbr-tracking-B3alzn91.js.map → pbr-tracking-D6i3yPb7.js.map} +1 -1
- package/pbr-transmission-ext-Dll8EYwE.js +190 -0
- package/pbr-transmission-ext-Dll8EYwE.js.map +1 -0
- package/{reflectance-fragment-BCrgPmrt.js → reflectance-fragment-ejMJ4O1o.js} +2 -2
- package/{reflectance-fragment-BCrgPmrt.js.map → reflectance-fragment-ejMJ4O1o.js.map} +1 -1
- package/{shader-renderable-D-6796KR.js → shader-renderable-BMf_vvO0.js} +41 -12
- package/shader-renderable-BMf_vvO0.js.map +1 -0
- package/shader-thin-instance-5_WUfi3m.js +150 -0
- package/shader-thin-instance-5_WUfi3m.js.map +1 -0
- package/shadow-fragment-core-DHN2G6FI.js.map +1 -1
- package/{sheen-fragment-Dze2f7XJ.js → sheen-fragment-CS6z29Fs.js} +2 -2
- package/{sheen-fragment-Dze2f7XJ.js.map → sheen-fragment-CS6z29Fs.js.map} +1 -1
- package/{singlelight-directional-wgsl-CmUDZxwz.js → singlelight-directional-wgsl-4MIgZMeC.js} +2 -2
- package/{singlelight-directional-wgsl-CmUDZxwz.js.map → singlelight-directional-wgsl-4MIgZMeC.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-t-83IP_s.js → singlelight-hemispheric-wgsl-CK-GUYWe.js} +2 -2
- package/{singlelight-hemispheric-wgsl-t-83IP_s.js.map → singlelight-hemispheric-wgsl-CK-GUYWe.js.map} +1 -1
- package/{singlelight-point-wgsl-CLzULIYV.js → singlelight-point-wgsl-CYtzqCbP.js} +2 -2
- package/{singlelight-point-wgsl-CLzULIYV.js.map → singlelight-point-wgsl-CYtzqCbP.js.map} +1 -1
- package/{singlelight-spot-wgsl-DEEUrfVM.js → singlelight-spot-wgsl-DVbaVufF.js} +2 -2
- package/{singlelight-spot-wgsl-DEEUrfVM.js.map → singlelight-spot-wgsl-DVbaVufF.js.map} +1 -1
- package/{skeleton-fragment-B_XlFbtx.js → skeleton-fragment-BOVmc8YS.js} +2 -2
- package/{skeleton-fragment-B_XlFbtx.js.map → skeleton-fragment-BOVmc8YS.js.map} +1 -1
- package/{skybox-renderable-DDwzu-PT.js → skybox-renderable-DDcCPSly.js} +3 -3
- package/{skybox-renderable-DDwzu-PT.js.map → skybox-renderable-DDcCPSly.js.map} +1 -1
- package/{standard-renderable-GjxL9xSf.js → standard-renderable-D1bhoF0K.js} +27 -81
- package/standard-renderable-D1bhoF0K.js.map +1 -0
- package/{std-ambient-fragment-BoUsD06w.js → std-ambient-fragment-C6WNm8dQ.js} +2 -2
- package/{std-ambient-fragment-BoUsD06w.js.map → std-ambient-fragment-C6WNm8dQ.js.map} +1 -1
- package/{std-cube-reflection-fragment-ulqc3bsP.js → std-cube-reflection-fragment-Bqutpy2q.js} +2 -2
- package/{std-cube-reflection-fragment-ulqc3bsP.js.map → std-cube-reflection-fragment-Bqutpy2q.js.map} +1 -1
- package/{std-emissive-fragment-DNGj1HdQ.js → std-emissive-fragment-B-A83rqX.js} +2 -2
- package/{std-emissive-fragment-DNGj1HdQ.js.map → std-emissive-fragment-B-A83rqX.js.map} +1 -1
- package/{std-lightmap-fragment-Bqj89aIe.js → std-lightmap-fragment-Df7KJezh.js} +2 -2
- package/{std-lightmap-fragment-Bqj89aIe.js.map → std-lightmap-fragment-Df7KJezh.js.map} +1 -1
- package/{std-opacity-fragment-KuPh5N2Z.js → std-opacity-fragment-D9et2jip.js} +2 -2
- package/{std-opacity-fragment-KuPh5N2Z.js.map → std-opacity-fragment-D9et2jip.js.map} +1 -1
- package/{std-reflection-fragment-BA5Ghn_M.js → std-reflection-fragment-DBJeT-yg.js} +2 -2
- package/{std-reflection-fragment-BA5Ghn_M.js.map → std-reflection-fragment-DBJeT-yg.js.map} +1 -1
- package/std-shadow-fragment-C6fD8rW-.js +13 -0
- package/std-shadow-fragment-C6fD8rW-.js.map +1 -0
- package/{std-specular-fragment-CE-6scqd.js → std-specular-fragment-C2ZOss-t.js} +2 -2
- package/{std-specular-fragment-CE-6scqd.js.map → std-specular-fragment-C2ZOss-t.js.map} +1 -1
- package/{std-tracking-CNKZ-hJN.js → std-tracking-C4L4nQGc.js} +2 -2
- package/{std-tracking-CNKZ-hJN.js.map → std-tracking-C4L4nQGc.js.map} +1 -1
- package/{subsurface-fragment-liM3y2-P.js → subsurface-fragment-C1H4ytqK.js} +2 -2
- package/{subsurface-fragment-liM3y2-P.js.map → subsurface-fragment-C1H4ytqK.js.map} +1 -1
- package/thin-instance-cull-binding-CCxrPNO6.js +310 -0
- package/thin-instance-cull-binding-CCxrPNO6.js.map +1 -0
- package/{thin-instance-gpu-C9Gv_Z1w.js → thin-instance-gpu-E8DBd8XL.js} +20 -3
- package/thin-instance-gpu-E8DBd8XL.js.map +1 -0
- package/{tracking-primitives-wgdBY85t.js → tracking-primitives-w4BVV9p9.js} +2 -2
- package/{tracking-primitives-wgdBY85t.js.map → tracking-primitives-w4BVV9p9.js.map} +1 -1
- package/{unlit-fragment-BIlhJpz6.js → unlit-fragment-DU9_mhzZ.js} +2 -2
- package/{unlit-fragment-BIlhJpz6.js.map → unlit-fragment-DU9_mhzZ.js.map} +1 -1
- package/{wgsl-helpers-DyzNzCeE.js → wgsl-helpers-D8sl1VVA.js} +4 -4
- package/{wgsl-helpers-DyzNzCeE.js.map → wgsl-helpers-D8sl1VVA.js.map} +1 -1
- package/background-dds-skybox-yHTqabU3.js.map +0 -1
- package/background-ground-DIw6D3qf.js.map +0 -1
- package/background-hdr-skybox-c4uuTmkP.js.map +0 -1
- package/gltf-ext-basisu-CPg5kPrx.js.map +0 -1
- package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +0 -1
- package/index-C8HOR2sB.js.map +0 -1
- package/mesh-features-BLENkYVt.js.map +0 -1
- package/node-renderable-DlLIdBmd.js.map +0 -1
- package/pbr-renderable-BJxUtPBb.js.map +0 -1
- package/pbr-shadow-fragment-LO9SlbJj.js.map +0 -1
- package/pbr-transmission-ext-BxW4CEGu.js +0 -581
- package/pbr-transmission-ext-BxW4CEGu.js.map +0 -1
- package/shader-renderable-D-6796KR.js.map +0 -1
- package/standard-renderable-GjxL9xSf.js.map +0 -1
- package/std-shadow-fragment-FNQfrJuC.js +0 -8
- package/std-shadow-fragment-FNQfrJuC.js.map +0 -1
- package/thin-instance-gpu-C9Gv_Z1w.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-transmission-ext-BxW4CEGu.js","sources":["../src/resource/trilinear-anisotropic-sampler.ts","../src/frame-graph/transmission.ts","../src/material/pbr/fragments/refraction-rtt-fragment.ts","../src/material/pbr/pbr-transmission-ext.ts"],"sourcesContent":["import type { EngineContext } from \"../engine/engine.js\";\nimport { getOrCreateSampler } from \"./gpu-pool.js\";\n\nconst _trilinearAnisotropicDesc: GPUSamplerDescriptor = {\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n addressModeU: \"repeat\",\n addressModeV: \"repeat\",\n addressModeW: \"repeat\",\n maxAnisotropy: 4,\n};\n\nexport function getTrilinearAnisotropicSampler(engine: EngineContext): GPUSampler {\n return getOrCreateSampler(engine, _trilinearAnisotropicDesc);\n}\n","import type { EngineContext } from \"../engine/engine.js\";\nimport { _vis } from \"../engine/engine.js\";\nimport { getBilinearSampler } from \"../resource/samplers.js\";\nimport { getTrilinearAnisotropicSampler } from \"../resource/trilinear-anisotropic-sampler.js\";\nimport type { Texture2D } from \"../texture/texture-2d.js\";\nimport { recordMipmaps } from \"../texture/generate-mipmaps.js\";\nimport { biasedMipLevelCount } from \"../texture/mip-count.js\";\nimport type { DrawBinding } from \"../render/renderable.js\";\nimport type { RenderTask } from \"./render-task.js\";\nimport type { SceneContext } from \"../scene/scene-core.js\";\nimport { createImageProcessingTask } from \"./image-processing-task.js\";\n\nexport interface RenderTaskTransmissionState {\n readonly texture: Texture2D;\n /** @internal */\n readonly _baseView: GPUTextureView;\n /** @internal */\n _sourceWidth: number;\n /** @internal */\n _sourceHeight: number;\n /** @internal */\n _sourceTexture: GPUTexture | null;\n /** @internal */\n _blit: TransmissionBlitState | null;\n /** @internal */\n readonly _copyCount: number;\n /** @internal */\n readonly _generateMipmaps: boolean;\n /** @internal */\n _copies: number;\n}\n\ninterface TransmissionBlitState {\n readonly _pipeline: GPURenderPipeline;\n readonly _bindGroup: GPUBindGroup;\n}\n\nconst BLIT_SHADER = `@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var s:sampler;struct V{@builtin(position)p:vec4f,@location(0)u:vec2f};@vertex fn vs(@builtin(vertex_index)i:u32)->V{var p=array<vec2f,3>(vec2f(-1,-1),vec2f(3,-1),vec2f(-1,3));var u=array<vec2f,3>(vec2f(0,1),vec2f(2,1),vec2f(0,-1));return V(vec4f(p[i],0,1),u[i]);}@fragment fn fs(v:V)->@location(0)vec4f{return textureSample(t,s,v.u);}`;\nconst BLIT_MSAA_SHADER = `@group(0)@binding(0)var t:texture_multisampled_2d<f32>;struct V{@builtin(position)p:vec4f,@location(0)u:vec2f};@vertex fn vs(@builtin(vertex_index)i:u32)->V{var p=array<vec2f,3>(vec2f(-1,-1),vec2f(3,-1),vec2f(-1,3));var u=array<vec2f,3>(vec2f(0,1),vec2f(2,1),vec2f(0,-1));return V(vec4f(p[i],0,1),u[i]);}fn l(p:vec2i)->vec4f{let n=textureNumSamples(t);var c=vec4f(0);for(var i=0u;i<n;i++){c+=textureLoad(t,p,i);}return c/f32(n);}@fragment fn fs(v:V)->@location(0)vec4f{let d=vec2i(textureDimensions(t));let q=clamp(v.u*vec2f(d)-.5,vec2f(0),vec2f(d-vec2i(1)));let p=vec2i(floor(q));let f=fract(q);let p1=min(p+vec2i(1),d-vec2i(1));return mix(mix(l(p),l(vec2i(p1.x,p.y)),f.x),mix(l(vec2i(p.x,p1.y)),l(p1),f.x),f.y);}`;\nconst REFRACTION_LOD_BIAS = 4;\nlet blitPipelines: Map<string, GPURenderPipeline> | null = null;\nlet blitShader: GPUShaderModule | null = null;\nlet blitMsaaShader: GPUShaderModule | null = null;\nlet blitBgl: GPUBindGroupLayout | null = null;\nlet blitMsaaBgl: GPUBindGroupLayout | null = null;\nlet blitDevice: GPUDevice | null = null;\n\nexport function enableSceneTransmission(scene: SceneContext, engine: EngineContext): void {\n markPbrMaterialsLinear(scene);\n let lastRenderTask: RenderTask | null = null;\n for (const task of scene._frameGraph._tasks) {\n if (\"_renderables\" in task) {\n const renderTask = task as RenderTask;\n enableRenderTaskTransmission(renderTask, engine);\n lastRenderTask = renderTask;\n }\n }\n if (lastRenderTask && !scene._frameGraph._tasks.some((task) => task.name === \"transmission-image-processing\")) {\n scene._frameGraph._tasks.push(createImageProcessingTask({ name: \"transmission-image-processing\", source: lastRenderTask._config.rt }, engine, scene));\n }\n}\n\nexport function enableRenderTaskTransmission(task: RenderTask, engine: EngineContext): void {\n if (task._executeWithTransmission) {\n return;\n }\n retargetRenderTaskToLinearOffscreen(task, engine);\n let state: RenderTaskTransmissionState | null = null;\n const record = task.record.bind(task);\n const execute = task.execute?.bind(task);\n const dispose = task.dispose?.bind(task);\n task.record = () => {\n disposeRenderTaskTransmission(state);\n state = createRenderTaskTransmission(task, engine);\n (task._targetSignature as { _transmissionTexture?: Texture2D })._transmissionTexture = state.texture;\n record();\n configureTransmissionSource(state, task, engine);\n };\n if (execute) {\n task.execute = () => executeRenderTaskLinear(task.scene, execute);\n }\n task.dispose = () => {\n disposeRenderTaskTransmission(state);\n state = null;\n dispose?.();\n };\n task._executeWithTransmission = (sampleCount) => executePassWithTransmission(task, engine, state!, sampleCount);\n}\n\nfunction retargetRenderTaskToLinearOffscreen(task: RenderTask, engine: EngineContext): void {\n const desc = task._config.rt._descriptor;\n if (desc.resolveToSwapchain) {\n desc.resolveToSwapchain = false;\n desc.colorFormat = \"rgba16float\";\n desc.flipY = false;\n task._opaqueBundles.length = 0;\n task._lastVersion = -1;\n } else if (!desc.colorFormat) {\n desc.colorFormat = \"rgba16float\";\n }\n desc.sampleCount = engine.msaaSamples;\n const sig = task._targetSignature as {\n _colorFormat?: GPUTextureFormat;\n _depthStencilFormat?: GPUTextureFormat;\n _depthCompare?: GPUCompareFunction;\n _sampleCount: number;\n _flipY?: boolean;\n };\n sig._colorFormat = desc.colorFormat;\n sig._depthStencilFormat = desc.depthStencilFormat;\n sig._depthCompare = desc._depthCompare;\n sig._sampleCount = desc.sampleCount;\n sig._flipY = desc.flipY ?? true;\n}\n\nfunction executeRenderTaskLinear(scene: SceneContext, execute: () => number): number {\n const imageProcessing = scene.imageProcessing as { exposure: number; contrast: number; toneMappingEnabled: boolean | number };\n const toneMappingEnabled = imageProcessing.toneMappingEnabled;\n const clearColor = scene.clearColor;\n const linearClearColor = inverseImageProcessedColor(clearColor, imageProcessing.exposure, imageProcessing.contrast, toneMappingEnabled === true);\n imageProcessing.toneMappingEnabled = -1;\n scene.clearColor = linearClearColor;\n try {\n return execute();\n } finally {\n scene.clearColor = clearColor;\n imageProcessing.toneMappingEnabled = toneMappingEnabled;\n }\n}\n\nfunction inverseImageProcessedColor(color: GPUColorDict, exposure: number, contrast: number, toneMapping: boolean): GPUColorDict {\n return {\n r: inverseImageProcessedChannel(color.r, exposure, contrast, toneMapping),\n g: inverseImageProcessedChannel(color.g, exposure, contrast, toneMapping),\n b: inverseImageProcessedChannel(color.b, exposure, contrast, toneMapping),\n a: color.a,\n };\n}\n\nfunction inverseImageProcessedChannel(value: number, exposure: number, contrast: number, toneMapping: boolean): number {\n let c = clamp01(value);\n if (contrast < 1) {\n c = contrast > 0 ? clamp01((c - 0.5 * (1 - contrast)) / contrast) : 0.5;\n } else if (contrast > 1) {\n const mixAmount = contrast - 1;\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 16; i++) {\n const mid = (lo + hi) * 0.5;\n const high = mid * mid * (3 - 2 * mid);\n const out = mid + (high - mid) * mixAmount;\n if (out < c) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n c = (lo + hi) * 0.5;\n }\n c = c ** 2.2;\n if (toneMapping) {\n c = -Math.log2(Math.max(1 - c, 1e-6)) / 1.5905790328979492;\n }\n return exposure > 0 ? c / exposure : c;\n}\n\nfunction clamp01(v: number): number {\n return Math.min(Math.max(v, 0), 1);\n}\n\nfunction markPbrMaterialsLinear(scene: SceneContext): void {\n for (const mesh of scene.meshes) {\n const mat = mesh.material as { _linearImageProcessing?: boolean; _renderFeatures?: unknown } | undefined;\n if (mat) {\n mat._linearImageProcessing = true;\n mat._renderFeatures = undefined;\n }\n }\n}\n\nfunction createRenderTaskTransmission(task: RenderTask, engine: EngineContext): RenderTaskTransmissionState {\n const rt = task._config.rt;\n const width = 1024;\n const height = 1024;\n const format: GPUTextureFormat = \"rgba16float\";\n const generateMipmaps = shouldGenerateMipmaps(task._config.transmission);\n const texture = engine._device.createTexture({\n label: task.name,\n size: { width, height },\n format,\n mipLevelCount: generateMipmaps ? biasedMipLevelCount(width, height, REFRACTION_LOD_BIAS) : 1,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n const tex: Texture2D = {\n texture,\n view: texture.createView(),\n sampler: getTrilinearAnisotropicSampler(engine),\n width,\n height,\n invertY: false,\n };\n return {\n texture: tex,\n _baseView: texture.createView({ baseMipLevel: 0, mipLevelCount: 1 }),\n _sourceWidth: rt._width,\n _sourceHeight: rt._height,\n _sourceTexture: null,\n _blit: null,\n _copyCount: normalizeCopyCount(task._config.transmission),\n _generateMipmaps: generateMipmaps,\n _copies: 0,\n };\n}\n\nfunction configureTransmissionSource(state: RenderTaskTransmissionState, task: RenderTask, engine: EngineContext): void {\n const rt = task._config.rt;\n state._sourceWidth = rt._width;\n state._sourceHeight = rt._height;\n state._sourceTexture = rt._colorTexture;\n const sampleCount = task._targetSignature._sampleCount;\n if (!state._sourceTexture) {\n return;\n }\n state._blit = shouldBlitTransmission(state, sampleCount) ? createTransmissionBlit(state, engine, state._sourceTexture, sampleCount > 1) : null;\n}\n\nfunction disposeRenderTaskTransmission(state: RenderTaskTransmissionState | null | undefined): void {\n state?.texture.texture.destroy();\n}\n\nexport function executePassWithTransmission(task: RenderTask, engine: EngineContext, state: RenderTaskTransmissionState, sampleCount: number): number {\n state._copies = 0;\n const transparent = task._transparentBindings;\n let pass = beginTaskPass(task, null, sampleCount, false);\n let draws = drawBaseTask(task, pass);\n let lastPipeline: GPURenderPipeline | null = null;\n for (let i = 0; i < transparent.length; i++) {\n const binding = transparent[i]!;\n const transmissive = binding.renderable._transmissive === true;\n if (transmissive && canUpdateTransmission(state)) {\n pass.end();\n updateTransmissionTexture(state, engine);\n pass = beginTaskPass(task, null, sampleCount, true);\n setPassState(task, pass);\n lastPipeline = null;\n }\n const mesh = binding.renderable.mesh;\n if (mesh && mesh.visible === false) {\n continue;\n }\n if (binding.pipeline !== lastPipeline) {\n pass.setPipeline(binding.pipeline);\n lastPipeline = binding.pipeline;\n }\n draws += binding.draw(pass, engine);\n }\n pass.end();\n return draws;\n}\n\nfunction updateTransmissionTexture(state: RenderTaskTransmissionState, engine: EngineContext): void {\n if (!state._sourceTexture) {\n throw new Error(\"No transmission source\");\n }\n if (state._blit) {\n blitToTransmission(state, engine);\n } else {\n engine._currentEncoder.copyTextureToTexture(\n { texture: state._sourceTexture },\n { texture: state.texture.texture },\n { width: state.texture.width, height: state.texture.height }\n );\n }\n if (state._generateMipmaps) {\n recordMipmaps(engine, state.texture.texture, engine._currentEncoder);\n }\n state._copies++;\n}\n\nfunction getBlitPipeline(engine: EngineContext, format: GPUTextureFormat, multisampled: boolean): GPURenderPipeline {\n const device = engine._device;\n if (device !== blitDevice) {\n blitPipelines?.clear();\n blitPipelines = null;\n blitShader = null;\n blitMsaaShader = null;\n blitBgl = null;\n blitMsaaBgl = null;\n blitDevice = device;\n }\n if (multisampled) {\n blitMsaaShader ??= device.createShaderModule({ code: BLIT_MSAA_SHADER });\n blitMsaaBgl ??= device.createBindGroupLayout({\n entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"unfilterable-float\", multisampled: true } }],\n });\n } else {\n blitShader ??= device.createShaderModule({ code: BLIT_SHADER });\n blitBgl ??= device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\" } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n ],\n });\n }\n blitPipelines ??= new Map();\n const key = `${format}:${multisampled ? \"msaa\" : \"\"}`;\n let pipeline = blitPipelines.get(key);\n if (!pipeline) {\n const bgl = multisampled ? blitMsaaBgl! : blitBgl!;\n pipeline = device.createRenderPipeline({\n label: \"transmission-copy\",\n layout: device.createPipelineLayout({ bindGroupLayouts: [bgl] }),\n vertex: { module: multisampled ? blitMsaaShader! : blitShader!, entryPoint: \"vs\" },\n fragment: { module: multisampled ? blitMsaaShader! : blitShader!, entryPoint: \"fs\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n blitPipelines.set(key, pipeline);\n }\n return pipeline;\n}\n\nfunction shouldBlitTransmission(state: RenderTaskTransmissionState, sampleCount: number): boolean {\n return sampleCount > 1 || state._sourceWidth !== state.texture.width || state._sourceHeight !== state.texture.height;\n}\n\nfunction createTransmissionBlit(state: RenderTaskTransmissionState, engine: EngineContext, source: GPUTexture, multisampled: boolean): TransmissionBlitState {\n const device = engine._device;\n const pipeline = getBlitPipeline(engine, state.texture.texture.format, multisampled);\n const bindGroup = device.createBindGroup({\n layout: multisampled ? blitMsaaBgl! : blitBgl!,\n entries: multisampled\n ? [{ binding: 0, resource: source.createView() }]\n : [\n { binding: 0, resource: source.createView() },\n { binding: 1, resource: getBilinearSampler(engine) },\n ],\n });\n return { _pipeline: pipeline, _bindGroup: bindGroup };\n}\n\nfunction blitToTransmission(state: RenderTaskTransmissionState, engine: EngineContext): void {\n const blit = state._blit!;\n const pass = engine._currentEncoder.beginRenderPass({\n colorAttachments: [{ view: state._baseView, loadOp: \"clear\", storeOp: \"store\", clearValue: { r: 0, g: 0, b: 0, a: 0 } }],\n });\n pass.setPipeline(blit._pipeline);\n pass.setBindGroup(0, blit._bindGroup);\n pass.draw(3);\n pass.end();\n}\n\nfunction canUpdateTransmission(state: RenderTaskTransmissionState): boolean {\n return state._copyCount === 0 || state._copies < state._copyCount;\n}\n\nfunction beginTaskPass(task: RenderTask, resolveTarget: GPUTextureView | null, sampleCount: number, load: boolean): GPURenderPassEncoder {\n const att = task._colorAttachment;\n const depthLoadOp = load || !task._config.clr ? \"load\" : \"clear\";\n if (load) {\n att.loadOp = \"load\";\n }\n const depthAttachment = task._renderPassDescriptor.depthStencilAttachment;\n if (depthAttachment) {\n depthAttachment.depthLoadOp = depthLoadOp;\n if (depthAttachment.stencilLoadOp) {\n depthAttachment.stencilLoadOp = depthLoadOp;\n }\n }\n if (sampleCount > 1) {\n att.resolveTarget = resolveTarget ?? undefined;\n } else {\n att.resolveTarget = undefined;\n }\n return task.engine._currentEncoder.beginRenderPass(task._renderPassDescriptor);\n}\n\nfunction setPassState(task: RenderTask, pass: GPURenderPassEncoder): void {\n const cfg = task._config;\n const rt = cfg.rt;\n const scene = task.scene;\n const camera = cfg.cam ?? scene.camera;\n const v = camera?.viewport;\n if (v) {\n const rw = rt._width;\n const rh = rt._height;\n const x = Math.floor(v.x * rw);\n const y = Math.floor((1 - v.y - v.height) * rh);\n const w = Math.ceil((v.x + v.width) * rw) - x;\n const h = Math.ceil((1 - v.y) * rh) - y;\n pass.setViewport(x, y, w, h, 0, 1);\n pass.setScissorRect(x, y, w, h);\n }\n pass.setBindGroup(0, task._sceneBG);\n}\n\nfunction drawBaseTask(task: RenderTask, pass: GPURenderPassEncoder): number {\n const eng = task.engine;\n const rt = task._config.rt;\n const scene = task.scene;\n const opaqueBindings = task._opaqueBindings;\n const opaqueBundles = task._opaqueBundles;\n\n setPassState(task, pass);\n\n if (task._lastVersion !== scene._renderableVersion || task._lastVis !== _vis || opaqueBundles.length === 0) {\n const desc = rt._descriptor;\n const be = eng._device.createRenderBundleEncoder({\n colorFormats: desc.colorFormat ? [desc.colorFormat] : [],\n depthStencilFormat: desc.depthStencilFormat,\n sampleCount: desc.sampleCount ?? 1,\n });\n be.setBindGroup(0, task._sceneBG);\n drawList(be, opaqueBindings, eng);\n opaqueBundles[0] = be.finish();\n task._lastVersion = scene._renderableVersion;\n task._lastVis = _vis;\n }\n let draws = opaqueBindings.length;\n pass.executeBundles(opaqueBundles);\n pass.setBindGroup(0, task._sceneBG);\n draws += drawList(pass, task._directBindings, eng);\n return draws;\n}\n\nfunction drawList(enc: GPURenderPassEncoder | GPURenderBundleEncoder, list: readonly DrawBinding[], engine: EngineContext): number {\n let lp: GPURenderPipeline | null = null;\n let draws = 0;\n for (const b of list) {\n const mesh = b.renderable.mesh;\n if (mesh && mesh.visible === false) {\n continue;\n }\n if (b.pipeline !== lp) {\n enc.setPipeline(b.pipeline);\n lp = b.pipeline;\n }\n draws += b.draw(enc, engine);\n }\n return draws;\n}\n\nfunction normalizeCopyCount(cfg: RenderTask[\"_config\"][\"transmission\"]): number {\n const count = cfg?.copyCount ?? 1;\n return count === Infinity ? 0 : Math.max(0, count | 0);\n}\n\nfunction shouldGenerateMipmaps(cfg: RenderTask[\"_config\"][\"transmission\"]): boolean {\n return cfg?.generateMipmaps !== false;\n}\n","import type { ShaderFragment, UboField } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps, SubSurfaceProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { getTrilinearAnisotropicSampler } from \"../../../resource/trilinear-anisotropic-sampler.js\";\nimport {\n PBR_HAS_THICKNESS_MAP,\n PBR2_HAS_DISPERSION,\n PBR2_HAS_REFRACTION,\n PBR2_HAS_REFRACTION_MAP,\n PBR2_HAS_THICKNESS_GLTF_CHANNEL,\n PBR2_HAS_VOLUME,\n PBR2_LINEAR_IMAGE_PROCESSING,\n} from \"../pbr-flag-bits.js\";\n\ntype TransmissionMat = PbrMaterialProps & { _linearImageProcessing?: boolean };\nconst LINEAR_IMAGE_PROCESSING_SLOTS = { NI: `if(scene.vImageInfos.w>=0.0){`, BC: `}` };\n\nfunction makeRefractionMod(\n hasVolume: boolean,\n hasMap: boolean,\n hasThicknessMap: boolean,\n useGltfThicknessChannel: boolean,\n hasDispersion: boolean,\n dispersionSampleWgsl: string | undefined\n): string {\n const thicknessScaleLine = hasVolume || hasThicknessMap ? `let ts=max(length(mesh.world[0].xyz),max(length(mesh.world[1].xyz),length(mesh.world[2].xyz)));` : ``;\n const thicknessLine = hasThicknessMap\n ? `let ths=textureSample(thicknessTexture_,thicknessSampler_,input.uv).${useGltfThicknessChannel ? \"g\" : \"r\"};\nlet th=(material.thicknessParams.x+ths*material.thicknessParams.y)*ts;`\n : hasVolume\n ? `let th=material.refractionParams.z*ts;`\n : `let th=material.refractionParams.z;`;\n const textureLine = hasMap ? `let ri=material.refractionParams.x*textureSample(refractionMapTexture,refractionMapSampler,input.uv).r;` : `let ri=material.refractionParams.x;`;\n const absorptionLine = hasVolume ? `let ab=exp(material.volumeParams.rgb*th);` : ``;\n const refractionLine = hasVolume\n ? `let fr=er*surfaceAlbedo*(ri*ab)*(vec3<f32>(1.0)-colorSpecularEnvReflectance.rgb);`\n : `let fr=er*surfaceAlbedo*ri*(vec3<f32>(1.0)-colorSpecularEnvReflectance.rgb);`;\n\n // Refracted environment sample. Dispersion splits the refracted ray into\n // per-RGB index-of-refraction offsets (chromatic aberration); that 3-ray WGSL\n // is injected from a dynamically-imported module (see refraction-dispersion-wgsl.ts)\n // so non-dispersion transmission scenes keep the lean single-ray path below.\n const sampleLines =\n hasDispersion && dispersionSampleWgsl\n ? dispersionSampleWgsl\n : `let rd=refract(-V,N,material.refractionParams.y);\nlet cp=scene.viewProjection*vec4<f32>(input.worldPos+rd*th,1.0);\nlet ruv=(cp.xy/cp.w)*vec2<f32>(0.5,-0.5)+vec2<f32>(0.5,0.5);\nlet er=textureSampleLevel(refractionTexture,refractionSampler_,ruv,lv).rgb*material.environmentIntensity;`;\n\n return `{\n${thicknessScaleLine}\n${textureLine}\n${thicknessLine}\nlet ro=1.0-ri;\nlet ra=mix(alphaG,0.0,clamp(material.refractionParams.w*3.0-2.0,0.0,1.0));\nlet lv=clamp(log2(f32(textureDimensions(refractionTexture).x)*ra)-4.0,0.0,f32(textureNumLevels(refractionTexture)-1));\n${sampleLines}\n${absorptionLine}\n${refractionLine}\ncolor=finalIrradiance*ro*ro+finalRadianceScaled+finalSpecularScaled+directDiffuse*ro*ro+fr+emissive;\n}`;\n}\n\nfunction createRefractionRttFragment(\n hasVolume: boolean,\n hasMap: boolean,\n hasThicknessMap: boolean,\n useGltfThicknessChannel: boolean,\n linearImageProcessing: boolean,\n hasDispersion: boolean,\n dispersionSampleWgsl: string | undefined\n): ShaderFragment {\n const uboFields: UboField[] = [{ _name: \"refractionParams\", _type: \"vec4<f32>\" as const }];\n if (hasVolume) {\n uboFields.push({ _name: \"volumeParams\", _type: \"vec4<f32>\" as const });\n }\n if (hasThicknessMap) {\n uboFields.push({ _name: \"thicknessParams\", _type: \"vec4<f32>\" as const });\n }\n const bindings = [\n { _name: \"refractionTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" } as const, _visibility: 2 },\n { _name: \"refractionSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" } as const, _visibility: 2 },\n ];\n if (hasMap) {\n bindings.push(\n { _name: \"refractionMapTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" } as const, _visibility: 2 },\n { _name: \"refractionMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" } as const, _visibility: 2 }\n );\n }\n if (hasThicknessMap) {\n bindings.push(\n { _name: \"thicknessTexture_\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" } as const, _visibility: 2 },\n { _name: \"thicknessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" } as const, _visibility: 2 }\n );\n }\n return {\n _id: \"refraction\",\n _dependencies: [\"ibl\"],\n _uboFields: uboFields,\n _bindings: bindings,\n _fragmentSlots: linearImageProcessing\n ? { AI: makeRefractionMod(hasVolume, hasMap, hasThicknessMap, useGltfThicknessChannel, hasDispersion, dispersionSampleWgsl), ...LINEAR_IMAGE_PROCESSING_SLOTS }\n : { AI: makeRefractionMod(hasVolume, hasMap, hasThicknessMap, useGltfThicknessChannel, hasDispersion, dispersionSampleWgsl) },\n };\n}\n\nfunction writeRefractionUBO(data: Float32Array, mat: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const ss = mat.subsurface as SubSurfaceProps | undefined;\n const refr = ss?.refraction;\n if (!refr) {\n return;\n }\n const off = offsets.get(\"refractionParams\");\n if (off === undefined) {\n return;\n }\n const o = off / 4;\n data[o] = refr.intensity ?? 0;\n const ior = refr.indexOfRefraction ?? 1.5;\n const thick = ss!.thickness;\n data[o + 1] = 1.0 / (refr.useThicknessAsDepth && thick?.max ? ior : 1.0);\n data[o + 2] = refr.useThicknessAsDepth ? (thick?.max ?? 0.0) : 1.0;\n data[o + 3] = 1.0 / ior;\n\n const vOff = offsets.get(\"volumeParams\");\n if (vOff !== undefined) {\n const vo = vOff / 4;\n const tint = ss!.tint?.color ?? [1, 1, 1];\n const dist = Math.max(ss!.tint?.atDistance ?? 1, 0.0001);\n data[vo] = Math.log(Math.max(tint[0]!, 1e-6)) / dist;\n data[vo + 1] = Math.log(Math.max(tint[1]!, 1e-6)) / dist;\n data[vo + 2] = Math.log(Math.max(tint[2]!, 1e-6)) / dist;\n // w carries the chromatic dispersion strength (0 when no KHR_materials_dispersion).\n data[vo + 3] = refr.dispersion ?? 0;\n }\n\n const tOff = offsets.get(\"thicknessParams\");\n if (tOff !== undefined) {\n const to = tOff / 4;\n const min = thick?.min ?? 0;\n const max = thick?.max ?? 1;\n data[to] = min;\n data[to + 1] = max - min;\n }\n}\n\n/** Build the PBR refraction/transmission extension. When the scene contains a\n * dispersive material, `dispersionSampleWgsl` carries the per-RGB 3-ray sample\n * WGSL (dynamically imported, scene-isolated); otherwise it is undefined and the\n * lean single-ray refraction path is emitted. */\nexport function makeRefractionRttExt(dispersionSampleWgsl?: string): PbrExt {\n return {\n id: \"refraction\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as TransmissionMat;\n const ss = m.subsurface as SubSurfaceProps | undefined;\n const refr = ss?.refraction;\n const linearImageProcessing = m._linearImageProcessing ? PBR2_LINEAR_IMAGE_PROCESSING : 0;\n const intensity = m.transmissive ? (refr?.intensity ?? 0) : 0;\n if (intensity <= 0) {\n return { f: 0, f2: linearImageProcessing };\n }\n let f = 0;\n let f2 = linearImageProcessing | PBR2_HAS_REFRACTION;\n if (refr?.texture) {\n f2 |= PBR2_HAS_REFRACTION_MAP;\n }\n if (ss?.thickness?.texture) {\n f |= PBR_HAS_THICKNESS_MAP;\n }\n if (ss?.thickness?.useGlTFChannel) {\n f2 |= PBR2_HAS_THICKNESS_GLTF_CHANNEL;\n }\n if (ss?.tint?.atDistance !== undefined) {\n f2 |= PBR2_HAS_VOLUME;\n // Dispersion requires the volume path (per-channel etas + volumeParams.w storage).\n if (refr?.dispersion) {\n f2 |= PBR2_HAS_DISPERSION;\n }\n }\n return { f, f2 };\n },\n frag(ctx) {\n const linearImageProcessing = (ctx._features2 & PBR2_LINEAR_IMAGE_PROCESSING) !== 0;\n if (!(ctx._features2 & PBR2_HAS_REFRACTION)) {\n return linearImageProcessing ? { _id: \"linear\", _fragmentSlots: LINEAR_IMAGE_PROCESSING_SLOTS } : null;\n }\n return createRefractionRttFragment(\n (ctx._features2 & PBR2_HAS_VOLUME) !== 0,\n (ctx._features2 & PBR2_HAS_REFRACTION_MAP) !== 0,\n (ctx._features & PBR_HAS_THICKNESS_MAP) !== 0,\n (ctx._features2 & PBR2_HAS_THICKNESS_GLTF_CHANNEL) !== 0,\n linearImageProcessing,\n (ctx._features2 & PBR2_HAS_DISPERSION) !== 0,\n dispersionSampleWgsl\n );\n },\n writeUbo(data, mat, offsets) {\n writeRefractionUBO(data, mat as PbrMaterialProps, offsets);\n },\n bind(ctx, entries, b) {\n if (!(ctx._features2 & PBR2_HAS_REFRACTION)) {\n return b;\n }\n const texture = ctx._refractionTexture;\n if (!texture) {\n throw new Error(\"PBR transmission requires a frame-graph refraction texture.\");\n }\n entries.push({ binding: b++, resource: texture.view });\n entries.push({ binding: b++, resource: texture.sampler });\n if ((ctx._features2 & PBR2_HAS_REFRACTION_MAP) !== 0) {\n const map = ((ctx._material as PbrMaterialProps).subsurface?.refraction as SubSurfaceProps[\"refraction\"] | undefined)?.texture!;\n entries.push({ binding: b++, resource: map.view });\n entries.push({ binding: b++, resource: getTrilinearAnisotropicSampler(ctx._engine) });\n }\n if ((ctx._features & PBR_HAS_THICKNESS_MAP) !== 0) {\n const thickness = (ctx._material as PbrMaterialProps).subsurface?.thickness?.texture!;\n entries.push({ binding: b++, resource: thickness.view });\n entries.push({ binding: b++, resource: thickness.sampler });\n }\n return b;\n },\n textures(mat, out) {\n const tex = (mat as PbrMaterialProps).subsurface?.refraction?.texture;\n if (tex) {\n out.push(tex);\n }\n const thickness = (mat as PbrMaterialProps).subsurface?.thickness?.texture;\n if (thickness) {\n out.push(thickness);\n }\n },\n };\n}\n","import type { SceneContext } from \"../../scene/scene.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { PbrExt } from \"./pbr-flags.js\";\nimport { enableSceneTransmission } from \"../../frame-graph/transmission.js\";\nimport { makeRefractionRttExt } from \"./fragments/refraction-rtt-fragment.js\";\n\nexport function registerPbrTransmission(scene: SceneContext, engine: EngineContext, register: (ext: PbrExt) => void, dispersionSampleWgsl?: string): void {\n enableSceneTransmission(scene, engine);\n register(makeRefractionRttExt(dispersionSampleWgsl));\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shader-renderable-D-6796KR.js","sources":["../src/material/shader/shader-pipeline.ts","../src/material/shader/shader-renderable.ts"],"sourcesContent":["import type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { computeUboLayout } from \"../../shader/ubo-layout.js\";\nimport type { UboField, UboSpec } from \"../../shader/fragment-types.js\";\nimport type { ShaderAttributeName, ShaderMaterial, ShaderSamplerDecl, ShaderUniformDecl } from \"./shader-material.js\";\nimport { _isShaderSystemUniform } from \"./shader-material.js\";\n\nexport interface ShaderPipelineBindings {\n readonly group1BGL: GPUBindGroupLayout;\n readonly systemSpec: UboSpec;\n readonly customSpec: UboSpec | null;\n readonly vertexBuffers: readonly GPUVertexBufferLayout[];\n readonly pipelines: Map<string, GPURenderPipeline>;\n}\n\ninterface ShaderMaterialPipelineState extends ShaderMaterial {\n _shaderDevice?: GPUDevice;\n _shaderBindings?: ShaderPipelineBindings;\n _shaderCustomUbo?: GPUBuffer | null;\n _shaderCustomSpec?: UboSpec | null;\n _shaderCustomData?: ArrayBuffer | null;\n _shaderCustomVersion?: number;\n}\n\nconst SHADER_STAGE_ALL = GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT;\n\nexport function getOrCreateShaderPipelineBindings(engine: EngineContext, material: ShaderMaterial): ShaderPipelineBindings {\n const state = material as ShaderMaterialPipelineState;\n if (state._shaderBindings && state._shaderDevice === engine._device) {\n return state._shaderBindings;\n }\n\n state._shaderDevice = engine._device;\n const systemFields = material.uniformDecls.filter((u) => _isShaderSystemUniform(u.name)).map(toUboField);\n const customFields = material.uniformDecls.filter((u) => !_isShaderSystemUniform(u.name)).map(toUboField);\n const systemSpec = computeUboLayout(systemFields.length > 0 ? systemFields : [{ _name: \"_pad\", _type: \"vec4<f32>\" }]);\n const customSpec = customFields.length > 0 ? computeUboLayout(customFields) : null;\n const group1BGL = engine._device.createBindGroupLayout({\n label: \"shader-material-group1\",\n entries: buildBindGroupLayoutEntries(material.samplerDecls, customSpec !== null),\n });\n const bindings: ShaderPipelineBindings = {\n group1BGL,\n systemSpec,\n customSpec,\n vertexBuffers: material.attributes.map(attributeLayout),\n pipelines: new Map(),\n };\n state._shaderBindings = bindings;\n state._shaderCustomSpec = customSpec;\n state._shaderCustomUbo = null;\n state._shaderCustomData = null;\n state._shaderCustomVersion = -1;\n return bindings;\n}\n\nexport function getOrCreateShaderPipeline(engine: EngineContext, sig: RenderTargetSignature, material: ShaderMaterial, bindings: ShaderPipelineBindings): GPURenderPipeline {\n const key = targetSignatureKey(sig);\n const cached = bindings.pipelines.get(key);\n if (cached) {\n return cached;\n }\n const device = engine._device;\n const prelude = buildShaderPrelude(material, bindings.systemSpec, bindings.customSpec);\n const vertModule = device.createShaderModule({ label: `${material.name ?? \"shader\"}-vertex`, code: `${prelude}\\n${material.vertexSource}` });\n const fragModule = sig._colorFormat ? device.createShaderModule({ label: `${material.name ?? \"shader\"}-fragment`, code: `${prelude}\\n${material.fragmentSource}` }) : null;\n const colorTarget: GPUColorTargetState | null = sig._colorFormat\n ? {\n format: sig._colorFormat,\n ...(material.needAlphaBlending\n ? {\n blend:\n material.blendMode === \"additive\"\n ? ({\n color: { srcFactor: \"src-alpha\", dstFactor: \"one\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n } satisfies GPUBlendState)\n : ({\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n } satisfies GPUBlendState),\n }\n : {}),\n }\n : null;\n\n const pipeline = device.createRenderPipeline({\n label: `${material.name ?? \"shader\"}-pipeline`,\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), bindings.group1BGL] }),\n vertex: { module: vertModule, entryPoint: \"mainVertex\", buffers: bindings.vertexBuffers },\n ...(fragModule && colorTarget ? { fragment: { module: fragModule, entryPoint: \"mainFragment\", targets: [colorTarget] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: material.depthCompare,\n depthWriteEnabled: material.needAlphaBlending ? false : material.depthWrite,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: material.backFaceCulling ? \"back\" : \"none\", frontFace: sig._flipY ? \"cw\" : \"ccw\" },\n });\n bindings.pipelines.set(key, pipeline);\n return pipeline;\n}\n\nfunction toUboField(decl: ShaderUniformDecl): UboField {\n return { _name: decl.name, _type: decl.type };\n}\n\nfunction buildBindGroupLayoutEntries(samplers: readonly ShaderSamplerDecl[], hasCustomUbo: boolean): GPUBindGroupLayoutEntry[] {\n const entries: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: SHADER_STAGE_ALL, buffer: { type: \"uniform\" } }];\n let nextBinding = 1;\n if (hasCustomUbo) {\n entries.push({ binding: nextBinding++, visibility: SHADER_STAGE_ALL, buffer: { type: \"uniform\" } });\n }\n for (const sampler of samplers) {\n const sampleType = sampler.sampleType ?? \"float\";\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n texture: {\n sampleType,\n viewDimension: \"2d\",\n },\n });\n entries.push({\n binding: nextBinding++,\n visibility: SHADER_STAGE_ALL,\n sampler: { type: sampleType === \"float\" ? \"filtering\" : \"non-filtering\" },\n });\n }\n return entries;\n}\n\nfunction attributeLayout(name: ShaderAttributeName, shaderLocation: number): GPUVertexBufferLayout {\n switch (name) {\n case \"position\":\n case \"normal\":\n return { arrayStride: 12, attributes: [{ shaderLocation, offset: 0, format: \"float32x3\" }] };\n case \"uv\":\n case \"uv2\":\n return { arrayStride: 8, attributes: [{ shaderLocation, offset: 0, format: \"float32x2\" }] };\n case \"tangent\":\n case \"color\":\n return { arrayStride: 16, attributes: [{ shaderLocation, offset: 0, format: \"float32x4\" }] };\n }\n}\n\nfunction buildShaderPrelude(material: ShaderMaterial, systemSpec: UboSpec, customSpec: UboSpec | null): string {\n let wgsl = `${SCENE_UBO_WGSL}\nstruct ShaderSystemUniforms {\n${systemSpec._structBody}\n}\n@group(1) @binding(0) var<uniform> shaderSystem: ShaderSystemUniforms;\n`;\n if (customSpec) {\n wgsl += `struct ShaderUniforms {\n${customSpec._structBody}\n}\n@group(1) @binding(1) var<uniform> shaderUniforms: ShaderUniforms;\n`;\n }\n let nextBinding = customSpec ? 2 : 1;\n for (const sampler of material.samplerDecls) {\n const texType = sampler.sampleType === \"depth\" ? \"texture_depth_2d\" : \"texture_2d<f32>\";\n wgsl += `@group(1) @binding(${nextBinding++}) var ${sampler.name}: ${texType};\n@group(1) @binding(${nextBinding++}) var ${sampler.name}Sampler: sampler;\n`;\n }\n for (const define of material.defines) {\n wgsl += `const ${define.name}: ${typeof define.value === \"boolean\" ? \"bool\" : \"f32\"} = ${formatDefineValue(define.value)};\n`;\n }\n wgsl += `struct VertexInput {\n`;\n for (let i = 0; i < material.attributes.length; i++) {\n const attr = material.attributes[i]!;\n wgsl += `@location(${i}) ${attr}: ${attributeWgslType(attr)},\n`;\n }\n wgsl += `};\n`;\n return wgsl;\n}\n\nfunction formatDefineValue(value: boolean | number): string {\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Number.isInteger(value)) {\n return `${value}.0`;\n }\n return String(value);\n}\n\nfunction attributeWgslType(name: ShaderAttributeName): string {\n switch (name) {\n case \"position\":\n case \"normal\":\n return \"vec3<f32>\";\n case \"uv\":\n case \"uv2\":\n return \"vec2<f32>\";\n case \"tangent\":\n case \"color\":\n return \"vec4<f32>\";\n }\n}\n","import type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh, MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable, DrawUpdateContext } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { Texture2D } from \"../../texture/texture-2d.js\";\nimport { createEmptyUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { acquireTexture, releaseTexture } from \"../../resource/gpu-pool.js\";\nimport { getEffectiveAspectRatio, getProjectionMatrix, getViewMatrix, getViewProjectionMatrix } from \"../../camera/camera.js\";\nimport type { Camera } from \"../../camera/camera.js\";\nimport { mat4MultiplyInto } from \"../../math/mat4-multiply-into.js\";\nimport type { UboSpec } from \"../../shader/fragment-types.js\";\nimport type { ShaderAttributeName, ShaderMaterial, ShaderUniformType } from \"./shader-material.js\";\nimport type { ShaderPipelineBindings } from \"./shader-pipeline.js\";\nimport { _isShaderSystemUniform } from \"./shader-material.js\";\nimport { getOrCreateShaderPipeline, getOrCreateShaderPipelineBindings } from \"./shader-pipeline.js\";\n\ninterface ShaderPacket {\n readonly mesh: Mesh;\n readonly systemUBO: GPUBuffer;\n readonly systemData: Float32Array;\n _bindGroup: GPUBindGroup;\n _lastResourceVersion: number;\n _boundTextures: Texture2D[];\n /** Set when the owning mesh is removed and this packet's GPU resources are\n * destroyed. A combined (multi-mesh) renderable keeps every packet in its\n * closure, so update()/draw() must skip disposed packets to avoid writing to\n * or submitting an already-destroyed systemUBO / vertex buffer. */\n _disposed?: boolean;\n /** Back-reference to the combined renderable's packet array, so disposal can\n * splice this packet out and stop retaining/iterating dead chunk state every\n * frame (set only for merged opaque renderables). */\n _owner?: ShaderPacket[];\n}\n\ninterface ShaderMaterialRenderState extends ShaderMaterial {\n _shaderBindings?: ShaderPipelineBindings;\n _shaderCustomUbo?: GPUBuffer | null;\n _shaderCustomSpec?: UboSpec | null;\n _shaderCustomData?: ArrayBuffer | null;\n _shaderCustomVersion?: number;\n}\n\ntype ShaderRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\nexport function buildShaderMaterialRenderables(scene: SceneContext, meshes: Mesh[]): MeshGroupBuildResult {\n const renderables: Renderable[] = [];\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable =>\n buildSingleShaderRenderable(s, mesh, (materialOverride ?? mesh.material) as ShaderMaterial, materialOverride != null);\n\n const byMaterial = new Map<ShaderMaterial, Mesh[]>();\n for (const mesh of meshes) {\n const material = mesh.material as ShaderMaterial;\n let list = byMaterial.get(material);\n if (!list) {\n list = [];\n byMaterial.set(material, list);\n }\n list.push(mesh);\n }\n\n for (const [material, matMeshes] of byMaterial) {\n const built = buildMaterialRenderables(scene, material, matMeshes);\n renderables.push(...built);\n }\n\n return { renderables, rebuildSingle };\n}\n\nfunction buildSingleShaderRenderable(scene: SceneContext, mesh: Mesh, material: ShaderMaterial, isOverride: boolean): Renderable {\n return buildMaterialRenderables(scene, material, [mesh], isOverride)[0]!;\n}\n\nfunction buildMaterialRenderables(scene: SceneContext, material: ShaderMaterial, meshes: readonly Mesh[], isOverride = false): Renderable[] {\n const engine = scene.engine;\n const bindings = getOrCreateShaderPipelineBindings(engine, material);\n ensureCustomUbo(engine, material, bindings.customSpec);\n const packets = meshes.map((mesh) => createPacket(scene, material, bindings.systemSpec, mesh));\n const isTransparent = material.needAlphaBlending;\n if (isTransparent) {\n return packets.map((packet) => createTransparentRenderable(scene, material, packet, isOverride));\n }\n return [createOpaqueRenderable(scene, material, packets, isOverride)];\n}\n\nfunction createPacket(scene: SceneContext, material: ShaderMaterial, systemSpec: UboSpec, mesh: Mesh): ShaderPacket {\n const engine = scene.engine;\n const systemUBO = createEmptyUniformBuffer(engine, systemSpec._totalBytes, \"shader-system-ubo\");\n const systemData = new Float32Array(systemSpec._totalBytes / 4);\n writeSystemUniforms(systemData, systemSpec, material, mesh, scene.camera, engine.canvas.width || 1, engine.canvas.height || 1);\n engine._device.queue.writeBuffer(systemUBO, 0, systemData);\n const packet: ShaderPacket = {\n mesh,\n systemUBO,\n systemData,\n _bindGroup: createShaderBindGroup(engine, material, systemUBO),\n _lastResourceVersion: material._resourceVersion,\n _boundTextures: collectShaderTextures(material),\n };\n for (const tex of packet._boundTextures) {\n acquireTexture(tex);\n }\n registerMeshTextureDisposer(scene, mesh, packet);\n return packet;\n}\n\nfunction createOpaqueRenderable(scene: SceneContext, material: ShaderMaterial, packets: readonly ShaderPacket[], isOverride: boolean): Renderable {\n // Only merged renderables (>1 mesh) can outlive an individual packet's mesh,\n // so give those packets a back-reference enabling disposal-time compaction.\n if (packets.length > 1) {\n for (const packet of packets) {\n packet._owner = packets as ShaderPacket[];\n }\n }\n const update = (context: DrawUpdateContext): void => {\n updateCustomUbo(scene.engine, material);\n for (const packet of packets) {\n if (packet._disposed) {\n continue;\n }\n if (!isOverride && packet.mesh.material !== material) {\n continue;\n }\n updatePacket(scene, material, packet, context);\n }\n };\n const draw = (pass: ShaderRenderPass, engine: EngineContext): number => {\n let draws = 0;\n for (const packet of packets) {\n if (packet._disposed) {\n continue;\n }\n if (!isOverride && packet.mesh.material !== material) {\n continue;\n }\n drawPacket(pass, engine, material, packet);\n draws++;\n }\n return draws;\n };\n const r: Renderable = {\n order: packets.length === 1 ? (packets[0]!.mesh.renderOrder ?? 100) : Math.min(...packets.map((p) => p.mesh.renderOrder ?? 100)),\n isTransparent: false,\n mesh: packets.length === 1 ? packets[0]!.mesh : undefined,\n bind(eng, sig) {\n const bindings = getOrCreateShaderPipelineBindings(eng, material);\n return { renderable: r, pipeline: getOrCreateShaderPipeline(eng, sig, material, bindings), update, draw: (pass) => draw(pass, eng) };\n },\n };\n return r;\n}\n\nfunction createTransparentRenderable(scene: SceneContext, material: ShaderMaterial, packet: ShaderPacket, isOverride: boolean): Renderable {\n const wm = packet.mesh.worldMatrix as unknown as ArrayLike<number>;\n const sortCenter: [number, number, number] = [wm[12]!, wm[13]!, wm[14]!];\n const update = (context: DrawUpdateContext): void => {\n if (packet._disposed) {\n return;\n }\n if (!isOverride && packet.mesh.material !== material) {\n return;\n }\n updateCustomUbo(scene.engine, material);\n updatePacket(scene, material, packet, context);\n const m = packet.mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const draw = (pass: ShaderRenderPass, engine: EngineContext): number => {\n if (packet._disposed) {\n return 0;\n }\n if (!isOverride && packet.mesh.material !== material) {\n return 0;\n }\n drawPacket(pass, engine, material, packet);\n return 1;\n };\n const r: Renderable = {\n order: packet.mesh.renderOrder ?? 200,\n isTransparent: true,\n mesh: packet.mesh,\n _worldCenter: sortCenter,\n bind(eng, sig) {\n const bindings = getOrCreateShaderPipelineBindings(eng, material);\n return { renderable: r, pipeline: getOrCreateShaderPipeline(eng, sig, material, bindings), update, draw: (pass) => draw(pass, eng) };\n },\n };\n return r;\n}\n\nfunction updatePacket(scene: SceneContext, material: ShaderMaterial, packet: ShaderPacket, context: DrawUpdateContext): void {\n const engine = scene.engine;\n const state = material as ShaderMaterialRenderState;\n writeSystemUniforms(packet.systemData, state._shaderBindings!.systemSpec, material, packet.mesh, context._camera ?? scene.camera, context.targetWidth, context.targetHeight);\n engine._device.queue.writeBuffer(packet.systemUBO, 0, packet.systemData as Float32Array<ArrayBuffer>);\n if (packet._lastResourceVersion !== material._resourceVersion) {\n for (const tex of packet._boundTextures) {\n releaseTexture(tex);\n }\n packet._bindGroup = createShaderBindGroup(engine, material, packet.systemUBO);\n packet._boundTextures = collectShaderTextures(material);\n for (const tex of packet._boundTextures) {\n acquireTexture(tex);\n }\n packet._lastResourceVersion = material._resourceVersion;\n }\n}\n\nfunction drawPacket(pass: ShaderRenderPass, engine: EngineContext, material: ShaderMaterial, packet: ShaderPacket): void {\n const gpu = packet.mesh._gpu;\n for (let i = 0; i < material.attributes.length; i++) {\n pass.setVertexBuffer(i, getAttrBuffer(engine, gpu, material.attributes[i]!));\n }\n pass.setIndexBuffer(gpu.indexBuffer, gpu.indexFormat);\n pass.setBindGroup(1, packet._bindGroup);\n pass.drawIndexed(gpu.indexCount);\n}\n\nfunction ensureCustomUbo(engine: EngineContext, material: ShaderMaterial, customSpec: UboSpec | null): void {\n const state = material as ShaderMaterialRenderState;\n if (!customSpec) {\n state._shaderCustomUbo = null;\n state._shaderCustomData = null;\n state._shaderCustomVersion = material._uniformVersion;\n return;\n }\n if (state._shaderCustomUbo && state._shaderCustomData) {\n updateCustomUbo(engine, material);\n return;\n }\n state._shaderCustomUbo = createEmptyUniformBuffer(engine, customSpec._totalBytes, \"shader-custom-ubo\");\n state._shaderCustomData = new ArrayBuffer(customSpec._totalBytes);\n state._shaderCustomVersion = -1;\n updateCustomUbo(engine, material);\n}\n\nfunction updateCustomUbo(engine: EngineContext, material: ShaderMaterial): void {\n const state = material as ShaderMaterialRenderState;\n const customSpec = state._shaderCustomSpec;\n const customUbo = state._shaderCustomUbo;\n const customData = state._shaderCustomData;\n if (!customSpec || !customUbo || !customData || state._shaderCustomVersion === material._uniformVersion) {\n return;\n }\n const bytes = new Uint8Array(customData);\n bytes.fill(0);\n for (const [name, slot] of material._uniformValues) {\n if (_isShaderSystemUniform(name)) {\n continue;\n }\n const offset = customSpec._offsets.get(name);\n if (offset !== undefined) {\n writeTypedValue(customData, offset, slot.decl.type, slot.value);\n }\n }\n engine._device.queue.writeBuffer(customUbo, 0, bytes);\n state._shaderCustomVersion = material._uniformVersion;\n}\n\nfunction writeTypedValue(data: ArrayBuffer, offset: number, type: ShaderUniformType, value: Float32Array): void {\n if (type === \"u32\") {\n new Uint32Array(data, offset, 1)[0] = value[0]!;\n return;\n }\n if (type === \"i32\") {\n new Int32Array(data, offset, 1)[0] = value[0]!;\n return;\n }\n new Float32Array(data, offset, value.length).set(value);\n}\n\nfunction createShaderBindGroup(engine: EngineContext, material: ShaderMaterial, systemUBO: GPUBuffer): GPUBindGroup {\n const bindings = getOrCreateShaderPipelineBindings(engine, material);\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: systemUBO } }];\n let nextBinding = 1;\n if (bindings.customSpec) {\n ensureCustomUbo(engine, material, bindings.customSpec);\n entries.push({ binding: nextBinding++, resource: { buffer: (material as ShaderMaterialRenderState)._shaderCustomUbo! } });\n }\n for (const sampler of material.samplerDecls) {\n const slot = material._textureSlots.get(sampler.name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(`ShaderMaterial: sampler \"${sampler.name}\" has no Texture2D. Call setShaderTexture() before rendering.`);\n }\n entries.push({ binding: nextBinding++, resource: tex.view }, { binding: nextBinding++, resource: tex.sampler });\n }\n return engine._device.createBindGroup({ label: \"shader-material-bg\", layout: bindings.group1BGL, entries });\n}\n\nfunction collectShaderTextures(material: ShaderMaterial): Texture2D[] {\n const textures: Texture2D[] = [];\n for (const slot of material._textureSlots.values()) {\n if (slot.current) {\n textures.push(slot.current);\n }\n }\n return textures;\n}\n\nfunction registerMeshTextureDisposer(scene: SceneContext, mesh: Mesh, packet: ShaderPacket): void {\n const list = scene._meshDisposables.get(mesh) ?? [];\n list.push(() => {\n packet._disposed = true;\n if (packet._owner) {\n const oi = packet._owner.indexOf(packet);\n if (oi >= 0) {\n packet._owner.splice(oi, 1);\n }\n packet._owner = undefined;\n }\n packet.systemUBO.destroy();\n for (const tex of packet._boundTextures) {\n releaseTexture(tex);\n }\n packet._boundTextures = [];\n });\n scene._meshDisposables.set(mesh, list);\n}\n\nfunction writeSystemUniforms(data: Float32Array, spec: UboSpec, material: ShaderMaterial, mesh: Mesh, camera: Camera | null, targetWidth: number, targetHeight: number): void {\n data.fill(0);\n const world = mesh.worldMatrix as unknown as Float32Array;\n const aspect = camera ? getEffectiveAspectRatio(camera, targetWidth, targetHeight) : 1;\n const view = camera ? (getViewMatrix(camera) as unknown as Float32Array) : null;\n const projection = camera ? (getProjectionMatrix(camera, aspect) as unknown as Float32Array) : null;\n const viewProjection = camera ? (getViewProjectionMatrix(camera, aspect) as unknown as Float32Array) : null;\n for (const uniform of material.uniformDecls) {\n if (!_isShaderSystemUniform(uniform.name)) {\n continue;\n }\n const offset = spec._offsets.get(uniform.name);\n if (offset === undefined) {\n continue;\n }\n const f = offset / 4;\n switch (uniform.name) {\n case \"world\":\n data.set(world, f);\n break;\n case \"view\":\n if (view) {\n data.set(view, f);\n }\n break;\n case \"projection\":\n if (projection) {\n data.set(projection, f);\n }\n break;\n case \"viewProjection\":\n if (viewProjection) {\n data.set(viewProjection, f);\n }\n break;\n case \"worldView\":\n if (view) {\n mat4MultiplyInto(data, f, view, 0, world, 0);\n }\n break;\n case \"worldViewProjection\":\n if (viewProjection) {\n mat4MultiplyInto(data, f, viewProjection, 0, world, 0);\n }\n break;\n case \"cameraPosition\":\n if (camera) {\n const wm = camera.worldMatrix as unknown as ArrayLike<number>;\n data[f] = wm[12]!;\n data[f + 1] = wm[13]!;\n data[f + 2] = wm[14]!;\n }\n break;\n case \"screenSize\":\n data[f] = targetWidth;\n data[f + 1] = targetHeight;\n break;\n case \"alphaCutoff\":\n data[f] = material._uniformValues.get(\"alphaCutoff\")?.value[0] ?? 0.4;\n break;\n }\n }\n}\n\nlet zeroAttrCache: WeakMap<object, Map<string, GPUBuffer>> | null = null;\n\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n if (!zeroAttrCache) {\n zeroAttrCache = new WeakMap();\n }\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : 16;\n const buffer = engine._device.createBuffer({ label: `shader-zero-${name}`, size: vertexCount * stride, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST });\n cache.set(name, buffer);\n return buffer;\n}\n\nfunction getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: ShaderAttributeName): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer ?? getZeroAttrBuffer(engine, gpu, \"normal\");\n case \"uv\":\n return gpu.uvBuffer ?? getZeroAttrBuffer(engine, gpu, \"uv\");\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"standard-renderable-GjxL9xSf.js","sources":["../src/material/standard/collect-std-bound-textures.ts","../src/material/standard/standard-material.ts","../src/material/standard/standard-template.ts","../src/material/standard/standard-pipeline.ts","../src/material/standard/standard-renderable.ts"],"sourcesContent":["import type { Texture2D } from \"../../texture/texture-2d.js\";\nimport { _getStdExts } from \"./standard-flags.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\n\n/** Collect all non-null textures referenced by a Standard material (for acquire/release). */\nexport function collectStdBoundTextures(mat: StandardMaterialProps): Texture2D[] {\n const t: Texture2D[] = [];\n if (mat.diffuseTexture) {\n t.push(mat.diffuseTexture);\n }\n for (const ext of _getStdExts().values()) {\n ext._textures?.(mat, t);\n }\n return t;\n}\n","/** StandardMaterial — Blinn-Phong material types and scene uniform helpers.\n *\n * Pipeline creation is handled by standard-pipeline.ts (dynamic permutation system).\n * This module owns the shared types and the scene UBO update function.\n *\n * Scene UBO uses the canonical SCENE_UBO layout (shared with PBR).\n */\n\nimport type { Texture2D } from \"../../texture/texture-2d.js\";\nimport type { Material } from \"../material.js\";\nimport {\n AMBIENT_USES_UV2,\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_AMBIENT_TEXTURE,\n HAS_BUMP_TEXTURE,\n HAS_CUBE_REFLECTION,\n HAS_DEPTH_EMISSIVE_TEXTURE,\n HAS_DIFFUSE_TEXTURE,\n HAS_EMISSIVE_TEXTURE,\n HAS_LIGHTMAP_TEXTURE,\n HAS_OPACITY_TEXTURE,\n HAS_REFLECTION_TEXTURE,\n HAS_SPECULAR_TEXTURE,\n LIGHTMAP_USES_UV2,\n MATERIAL_ALPHA_BLEND,\n OPACITY_FROM_RGB,\n SPECULAR_USES_UV2,\n} from \"./standard-flags.js\";\n\n// ─── Shared Types ────────────────────────────────────────────────────\n\n/** StandardMaterial properties — plain data. */\nexport interface StandardMaterialProps extends Material {\n diffuseColor: [number, number, number];\n alpha: number;\n specularColor: [number, number, number];\n specularPower: number;\n emissiveColor: [number, number, number];\n ambientColor: [number, number, number];\n /** Optional diffuse texture. Null = solid color only. */\n diffuseTexture: Texture2D | null;\n /** Diffuse texture UV channel. 0=UV1, 1=UV2. Default 0. */\n diffuseCoordIndex: 0 | 1;\n /** Optional emissive texture. Null = solid emissive color only. */\n emissiveTexture: Texture2D | null;\n /** Optional bump/normal-map texture. Uses cotangent-frame (no tangent attribute needed). */\n bumpTexture: Texture2D | null;\n /** Bump perturbation strength. Default 1.0 (maps to 1/level in BJS). */\n bumpLevel: number;\n /** Optional specular texture. Replaces specularColor; alpha modulates glossiness. */\n specularTexture: Texture2D | null;\n /** Specular texture UV channel. 0=UV1, 1=UV2. Default 0. */\n specularCoordIndex: 0 | 1;\n /** Optional ambient/occlusion texture. Multiplies final diffuse contribution. */\n ambientTexture: Texture2D | null;\n /** Ambient texture intensity. Default 1.0. */\n ambientTexLevel: number;\n /** Ambient texture UV channel. 0=UV1, 1=UV2. Default 0. */\n ambientCoordIndex: 0 | 1;\n /** Optional lightmap texture. Added to final color (additive mode). */\n lightmapTexture: Texture2D | null;\n /** Lightmap intensity. Default 1.0. */\n lightmapLevel: number;\n /** Lightmap UV channel. 0=UV1, 1=UV2. Default 1 (BJS convention). */\n lightmapCoordIndex: 0 | 1;\n /** Optional opacity texture. Multiplies alpha (.a channel). */\n opacityTexture: Texture2D | null;\n /** Opacity texture intensity. Default 1.0. */\n opacityLevel: number;\n /** When true, derive opacity from RGB luminance instead of .a channel. Default false. */\n opacityFromRGB: boolean;\n /** Alpha test cutoff. Fragments with `alpha < alphaCutOff` are discarded. Default 0 (no alpha test). */\n alphaCutOff: number;\n /** Optional reflection texture (2D spherical map). Null = no reflection. */\n reflectionTexture: Texture2D | null;\n /** Optional cube reflection texture. Null = no cube reflection. */\n reflectionCubeTexture: { texture: GPUTexture; view: GPUTextureView; sampler: GPUSampler } | null;\n /** Reflection intensity. Default 1.0. */\n reflectionLevel: number;\n /** Reflection coordinate mode. 1=spherical, 2=planar. Default 1. */\n reflectionCoordMode: 1 | 2;\n /** UV tiling scale. Default [1, 1]. */\n uvScale: [number, number];\n /** Back-face culling. Default true (BJS convention). False = double-sided. */\n backFaceCulling: boolean;\n /** When true, skip all lighting and output emissive * diffuse * baseColor. Default false. */\n disableLighting: boolean;\n}\n\n/** @internal Compute Standard material-only feature bits. Mesh/pass bits are added by the renderable. */\nexport function _computeStandardMaterialFeatures(m: StandardMaterialProps): number {\n let f = 0;\n if (m.diffuseTexture) {\n f |= HAS_DIFFUSE_TEXTURE;\n if (m.diffuseCoordIndex === 1) {\n f |= DIFFUSE_USES_UV2;\n }\n }\n if (m.emissiveTexture) {\n f |= HAS_EMISSIVE_TEXTURE;\n if (m.emissiveTexture._sampleType === \"depth\") {\n f |= HAS_DEPTH_EMISSIVE_TEXTURE;\n }\n }\n if (m.bumpTexture) {\n f |= HAS_BUMP_TEXTURE;\n }\n if (m.specularTexture) {\n f |= HAS_SPECULAR_TEXTURE;\n if (m.specularCoordIndex === 1) {\n f |= SPECULAR_USES_UV2;\n }\n }\n if (m.ambientTexture) {\n f |= HAS_AMBIENT_TEXTURE;\n if (m.ambientCoordIndex === 1) {\n f |= AMBIENT_USES_UV2;\n }\n }\n if (m.lightmapTexture) {\n f |= HAS_LIGHTMAP_TEXTURE;\n if (m.lightmapCoordIndex === 1) {\n f |= LIGHTMAP_USES_UV2;\n }\n }\n if (m.opacityTexture) {\n f |= HAS_OPACITY_TEXTURE;\n if (m.opacityFromRGB) {\n f |= OPACITY_FROM_RGB;\n }\n }\n if (!m.backFaceCulling) {\n f |= DOUBLE_SIDED;\n }\n if (m.reflectionTexture) {\n f |= HAS_REFLECTION_TEXTURE;\n }\n if (m.reflectionCubeTexture) {\n f |= HAS_CUBE_REFLECTION;\n }\n if (m.disableLighting) {\n f |= DISABLE_LIGHTING;\n }\n if (m.alpha < 1) {\n f |= MATERIAL_ALPHA_BLEND;\n }\n return f;\n}\n\n/** @internal Key for Standard shader features, including mesh/pass features. */\nexport function _standardFeatureKey(features: number, meshFeatures: number, variant = \"\"): string {\n return variant ? `${features}:${meshFeatures}:${variant}` : `${features}:${meshFeatures}`;\n}\n\n/** @internal Key for Standard scene-driven shader variants not encoded in feature bits. */\nexport function _standardShaderVariantKey(shadowLights: readonly { readonly lightIndex: number; readonly shadowType: \"esm\" | \"pcf\" }[]): string {\n return shadowLights.length === 0 ? \"\" : shadowLights.map((sl) => `${sl.lightIndex}${sl.shadowType === \"pcf\" ? \"p\" : \"e\"}`).join(\",\");\n}\n\n/** Fog configuration — plain data. */\nexport interface FogConfig {\n mode: 0 | 1 | 2 | 3; // 0=off, 1=exp, 2=exp2, 3=linear\n density: number;\n start: number;\n end: number;\n color: [number, number, number];\n}\n\nexport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nexport { createStandardMaterial } from \"./create-standard-material.js\";\nexport { standardGroupBuilder } from \"./standard-group-builder.js\";\n","/**\n * Standard Base Template\n *\n * Provides the base Standard (Blinn-Phong) shader structure with slot markers.\n * Parameterized by feature configuration (textures, UV, shadow, reflection, fog).\n *\n * The Standard material uses 3 separate UBOs in group 1:\n * binding 0: mesh UBO (world matrix)\n * binding 1: material UBO (colors, levels)\n * Plus optional texture/sampler bindings at fixed slots.\n */\n\nimport type { ShaderTemplate, UboField, VertexAttribute, Varying, BindingDecl } from \"../../shader/fragment-types.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { appendMeshLightUboFields, meshLightIndexWGSL } from \"../../render/lights-ubo.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n// ── Lighting function (always present unless disableLighting) ───\n\nconst LIGHTING_FN = `\nfn computeLighting(viewDir: vec3<f32>, N: vec3<f32>, L: LightEntry, g: f32, P: vec3<f32>) -> array<vec3<f32>, 2> {\nvar lv: vec3<f32>;\nvar a: f32 = 1.0;\nlet t = u32(L.vLightData.w);\nif (t == 3u) {\nlet nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\nlet diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\nlet h = normalize(viewDir + normalize(L.vLightData.xyz));\nvar s = pow(max(0.0, dot(N, h)), max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb);\n}\nif (t == 1u) {\nlv = normalize(-L.vLightData.xyz);\n} else {\nlet d = L.vLightData.xyz - P;\na = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\nlv = normalize(d);\nif (t == 2u) {\nlet c = max(0.0, dot(L.vLightDirection.xyz, -lv));\nif (c >= L.vLightDirection.w) { a *= max(0.0, pow(c, L.vLightSpecular.a)); } else { a = 0.0; }\n}\n}\nlet nl = max(0.0, dot(N, lv));\nlet diff = nl * L.vLightDiffuse.rgb * a;\nlet h = normalize(viewDir + lv);\nvar s = max(0.0, dot(N, h));\ns = pow(s, max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb * a);\n}\n`;\n\nexport interface StandardTemplateConfig {\n /** @internal */\n readonly _diffuse?: boolean;\n /** @internal UV coordinate channels used */\n readonly _needsUV: boolean;\n /** @internal */\n readonly _needsUV2: boolean;\n /** @internal */\n readonly _diffuseUsesUV2?: boolean;\n /** @internal Disable lighting (unlit material) */\n readonly _disableLighting?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes no color. */\n readonly _noColorOutput?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes ESM shadow color. */\n readonly _esmShadowOutput?: boolean;\n}\n\n/**\n * Create a Standard material ShaderTemplate from configuration.\n * The template contains slot markers that the composer fills.\n */\nexport function createStandardTemplate(config: StandardTemplateConfig, esmShadowDepthCode = \"\"): ShaderTemplate {\n const { _diffuse, _needsUV, _needsUV2, _diffuseUsesUV2, _disableLighting, _noColorOutput, _esmShadowOutput } = config;\n\n // ── Base vertex attributes ──────────────────────────────────\n const _baseVertexAttributes: VertexAttribute[] = [\n { _name: \"position\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n { _name: \"normal\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n ];\n if (_needsUV) {\n _baseVertexAttributes.push({ _name: \"uv\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n if (_needsUV2) {\n _baseVertexAttributes.push({ _name: \"uv2\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n\n // ── Base varyings ───────────────────────────────────────────\n const _baseVaryings: Varying[] = [\n { _name: \"vp\", _type: \"vec3<f32>\" },\n { _name: \"vn\", _type: \"vec3<f32>\" },\n { _name: \"vf\", _type: \"vec3<f32>\" },\n ];\n if (_needsUV) {\n _baseVaryings.push({ _name: \"vu\", _type: \"vec2<f32>\" });\n }\n if (_needsUV2) {\n _baseVaryings.push({ _name: \"vv\", _type: \"vec2<f32>\" });\n }\n // shadow varyings (vPositionFromLight, vDepthMetric) are provided by std-shadow-fragment\n\n // ── Base UBO fields (mesh = world matrix + affected light indices) ──────────────\n const _baseMeshUboFields: UboField[] = [{ _name: \"world\", _type: \"mat4x4<f32>\" }];\n appendMeshLightUboFields(_baseMeshUboFields);\n\n // ── Base bindings (group 1, starting after mesh UBO at 0) ───\n // Order: material, diffuse*, shadow/UV*, emissive*, bump*, specular*, ambient*, lightmap*, opacity*, reflection*\n // The shadow/UV UBO is placed AFTER diffuse so its auto-assigned binding index\n // matches the conventional slot 5 when diffuse is present (bindings 3,4).\n const _baseBindings: BindingDecl[] = [{ _name: \"mat\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT }];\n\n if (_diffuse) {\n _baseBindings.push(\n { _name: \"dT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"dS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n // UV params UBO — only when UVs are actually emitted.\n if (_needsUV) {\n _baseBindings.push({ _name: \"up\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_VERTEX });\n }\n if (_esmShadowOutput) {\n _baseBindings.push({ _name: \"shadowParams\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT });\n }\n // bump bindings are provided by the normal-map fragment (not baseBindings)\n // emissive, specular, ambient, lightmap, opacity, reflection bindings\n // are provided by their respective fragments (not baseBindings)\n\n // Shadow map bindings (group 2) are provided by std-shadow-fragment\n\n // ── Vertex template ─────────────────────────────────────────\n\n const uvPassthrough = _needsUV ? `out.vu = uv * up.u.xy + up.u.zw;` : \"\";\n\n const uv2Passthrough = _needsUV2 ? `out.vv = uv2;` : \"\";\n\n // Vertex UBO struct definitions (must be before binding declarations)\n const vertexUboStructs = _needsUV ? `struct upUniforms { u: vec4<f32>, }` : \"\";\n\n const _vertexTemplate = `/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${vertexUboStructs}\n/*VH*/\n/*VD*/\n/*VO*/\n@vertex fn main(\n/*VP*/\n) -> VertexOutput {\nvar out: VertexOutput;\n/*VR*/\nvar finalWorld = mesh.world;\n/*VW*/\nlet worldPos4 = finalWorld * vec4<f32>(position, 1.0);\nout.vp = worldPos4.xyz;\nlet normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\nout.vn = normalize(normalWorld * normal);\nout.clipPos = scene.viewProjection * worldPos4;\nout.vf = (scene.view * worldPos4).xyz;\n${uvPassthrough}\n${uv2Passthrough}\n/*VB*/\nreturn out;\n}`;\n\n // ── Fragment template ────────────────────────────────────────\n\n const lightsStructs = `\nstruct LightEntry { vLightData: vec4<f32>, vLightDiffuse: vec4<f32>, vLightSpecular: vec4<f32>, vLightDirection: vec4<f32> };\nstruct lightsUniforms { count: u32, _p0: u32, _p1: u32, _p2: u32, lights: array<LightEntry, ${MAX_LIGHTS}> };\n@group(0) @binding(1) var<uniform> lights: lightsUniforms;\n`;\n\n const materialStruct = `\nstruct matUniforms {\ndc: vec4<f32>,\nsc: vec4<f32>,\nec: vec3<f32>,\nbs: f32,\nac: vec3<f32>,\ntl: f32,\nambTexLvl: f32,\nlmLvl: f32,\nopLvl: f32,\naCut: f32,\nrLvl: f32,\nrCm: f32,\n_0: f32,\n_1: f32,\n};\n`;\n\n const helpers = _disableLighting ? WGSL_FOG : WGSL_FOG + LIGHTING_FN;\n // reflection, shadow, bump helpers are provided by their respective fragments\n\n // Main fragment body — mirrors old composeFragmentShader exactly\n const doubleSidedEntry = `@fragment fn main(input: FragmentInput)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`;\n\n // View direction\n const viewDirCode = !_disableLighting ? `let viewDirectionW = normalize(scene.vEyePosition.xyz - input.vp);` : \"\";\n\n // Normal computation — fragment can override via AC slot\n const normalCode = _disableLighting ? \"\" : `var normalW = normalize(input.vn);`;\n\n // Opacity — default from material alpha, fragment can modify via AT\n const opacityCode = `var alpha = mat.dc.a;`;\n\n // Base color + alpha test. Texture alpha used for discard only (not blended into output alpha),\n // matching BJS ALPHATEST without ALPHAFROMDIFFUSE.\n const baseColorCode = _diffuse\n ? `let _ds = textureSample(dT, dS, ${_diffuseUsesUV2 ? \"input.vv\" : \"input.vu\"});\nif (_ds.a < mat.aCut) { discard; }\nvar baseColor = _ds.rgb * mat.tl;`\n : `var baseColor = vec3<f32>(1.0, 1.0, 1.0);`;\n\n // Diffuse color + emissive + specular — defaults, fragments can override via AT\n const diffuseColorCode = `let diffuseColor = mat.dc.rgb;`;\n const emissiveCode = `var emissiveContrib = mat.ec;`;\n const specularColorCode = !_disableLighting ? `var specularColor = mat.sc.rgb;` : \"\";\n // Lighting block (only when lighting enabled)\n let lightingBlock: string;\n if (!_disableLighting) {\n // Shadow — default to 1.0, fragment overrides via AD slot\n // shadowFactors array is populated by std-shadow-fragment (one per light index)\n lightingBlock = `var glossiness = mat.sc.a;\nvar diffuseBase = vec3<f32>(0.0);\nvar specularBase = vec3<f32>(0.0);\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nvar baseAmbientColor = vec3<f32>(1.0, 1.0, 1.0);\nvar reflectionColor = vec3<f32>(0.0);\nlet lc = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AD*/\nfor (var li = 0u; li < lc; li++) {\nlet lightIndex = mli(li);\nlet r = computeLighting(viewDirectionW, normalW, lights.lights[lightIndex], glossiness, input.vp);\nlet sf = shadowFactors[lightIndex];\ndiffuseBase += r[0] * sf;\nspecularBase += r[1] * sf;\n}\nlet finalDiffuse = clamp(diffuseBase * diffuseColor + emissiveContrib + mat.ac, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor;\nlet finalSpecular = specularBase * specularColor;\nvar color = vec4<f32>(finalDiffuse * baseAmbientColor + finalSpecular + reflectionColor, alpha);`;\n } else {\n lightingBlock = `var color = vec4<f32>(clamp(emissiveContrib * diffuseColor, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor, alpha);`;\n }\n\n const _fragmentTemplate = `/*SU*/\n${lightsStructs}\n${materialStruct}\n${_esmShadowOutput ? \"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }\" : \"\"}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${!_disableLighting ? meshLightIndexWGSL(\"mesh\") : \"\"}\n${helpers}\n/*HF*/\n/*FB*/\n/*FI*/\n${doubleSidedEntry}\n/*SV*/\n${viewDirCode}\n${normalCode}\n/*AC*/\n${opacityCode}\n${baseColorCode}\n${diffuseColorCode}\n${emissiveCode}\n${specularColorCode}\n/*AT*/\n${_noColorOutput ? \"return;\" : _esmShadowOutput ? esmShadowDepthCode : \"\"}\n${lightingBlock}\n/*BC*/\ncolor = vec4<f32>(max(color.rgb, vec3<f32>(0.0)), color.a);\nif (scene.vFogInfos.x > 0.0) {\nlet fog = calcFogFactor(input.vf);\ncolor = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\n}\n/*BA*/\n${_noColorOutput ? \"\" : \"return color;\"}\n}`;\n\n return {\n _vertexTemplate,\n _fragmentTemplate,\n _baseMeshUboFields,\n _baseVertexAttributes,\n _baseVaryings,\n _baseBindings,\n };\n}\n","/** Dynamic StandardMaterial pipeline builder — creates and caches GPU render\n * pipelines based on per-material feature flags.\n *\n * Feature flags (bitmask):\n * HAS_DIFFUSE_TEXTURE — diffuse texture sampling + UV attribute\n * HAS_EMISSIVE_TEXTURE — emissive texture sampling + UV attribute\n * Derived flag (computed automatically):\n * NEEDS_UV = HAS_DIFFUSE_TEXTURE | HAS_EMISSIVE_TEXTURE\n *\n * Pipelines are cached per (features, format, msaaSamples) tuple.\n * Shared scene UBO layout is identical across all variants (176 bytes). */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _standardFeatureKey } from \"./standard-material.js\";\nimport { getSceneBindGroupLayout, clearSceneBGLCache } from \"../../render/scene-helpers.js\";\nimport { createStandardTemplate } from \"./standard-template.js\";\nimport { composeShader } from \"../../shader/shader-composer.js\";\nimport type { ComposedShader, ShaderFragment } from \"../../shader/fragment-types.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { REVERSE_DEPTH_COMPARE, targetSignatureKey } from \"../../engine/render-target.js\";\nimport {\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_DIFFUSE_TEXTURE,\n HAS_OPACITY_TEXTURE,\n MATERIAL_ALPHA_BLEND,\n NEEDS_UV,\n NEEDS_UV2,\n NO_COLOR_OUTPUT,\n ESM_SHADOW_OUTPUT,\n _getStdExtsSorted,\n} from \"./standard-flags.js\";\nimport { MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n// ─── Composer Path (Phase 1) ────────────────────────────────────────\n// Converts feature bitmask → StandardTemplateConfig → ComposedShader.\n// This produces identical WGSL to the old string-builder path but via\n// the generic composer, enabling fragment-based extensions in Phase 2.\n\n/** Compose Standard shader via the generic ShaderComposer.\n * @param fragments - Optional extra fragments (e.g. thin-instance). */\nfunction composeStandardShader(features: number, _meshFeatures = 0, fragments: ShaderFragment[] = [], esmShadowDepthCode = \"\"): ComposedShader {\n const has = (bit: number) => (features & bit) !== 0;\n const template = createStandardTemplate(\n {\n _diffuse: has(HAS_DIFFUSE_TEXTURE),\n _needsUV: has(NEEDS_UV),\n _needsUV2: has(NEEDS_UV2),\n _diffuseUsesUV2: has(DIFFUSE_USES_UV2),\n _disableLighting: has(DISABLE_LIGHTING),\n _noColorOutput: has(NO_COLOR_OUTPUT),\n _esmShadowOutput: has(ESM_SHADOW_OUTPUT),\n },\n esmShadowDepthCode\n );\n return composeShader(template, fragments);\n}\n\n// ─── Shader Bindings (sig-independent) ──────────────────────────────\n\n/** Cached per-(features, fragments) shader bindings: BGLs + composed shader +\n * per-sig pipeline cache. Created once at renderable build time, shared across\n * all sig-specific pipelines. */\nexport interface StandardShaderBindings {\n /** @internal */\n _features: number;\n /** @internal */\n _meshFeatures: number;\n /** @internal */\n _meshBGL: GPUBindGroupLayout;\n /** @internal */\n _shadowBGL: GPUBindGroupLayout | null;\n /** @internal */\n _composed: ComposedShader;\n /** @internal Per-sig pipeline cache. Key = `targetSignatureKey(sig)`. */\n _pipelines: Map<string, GPURenderPipeline>;\n}\n\n// ─── Caches ─────────────────────────────────────────────────────────\n\n/** Per-(features:fk) shader bindings cache (sig-independent). */\nconst _bindingsCache = new Map<string, StandardShaderBindings>();\nlet _composedCache: Map<string, ComposedShader> | null = null;\nlet _cachedDevice: GPUDevice | null = null;\n\nfunction getComposedCache(): Map<string, ComposedShader> {\n if (!_composedCache) {\n _composedCache = new Map();\n }\n return _composedCache;\n}\n\nfunction ensureDevice(engine: EngineContext): void {\n if (_cachedDevice !== engine._device) {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = engine._device;\n }\n}\n\n/** Clear the pipeline cache. Must be called when a GPU device is destroyed. */\nexport function clearStandardPipelineCache(): void {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = null;\n}\n\n/** Get-or-build the sig-independent shader bindings for a given feature/fragment set.\n * Used at renderable build time so per-mesh bind groups can be created BEFORE the\n * first bind() call (when sig is known). */\nexport function getOrCreateStandardBindings(\n engine: EngineContext,\n features: number,\n meshFeatures: number,\n fragments: ShaderFragment[] = [],\n shaderKey = \"\",\n esmShadowDepthCode = \"\"\n): StandardShaderBindings {\n ensureDevice(engine);\n const key = _standardFeatureKey(features, meshFeatures, shaderKey);\n const cached = _bindingsCache.get(key);\n if (cached) {\n return cached;\n }\n\n const cc = getComposedCache();\n let composed = cc.get(key);\n if (!composed) {\n composed = composeStandardShader(features, meshFeatures, fragments, esmShadowDepthCode);\n cc.set(key, composed);\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n let shadowBGL: GPUBindGroupLayout | null = null;\n const hasShadow = (meshFeatures & MSH_RECEIVE_SHADOWS) !== 0;\n if (hasShadow && composed._shadowBGLDescriptor) {\n shadowBGL = device.createBindGroupLayout(composed._shadowBGLDescriptor);\n }\n\n const bindings: StandardShaderBindings = {\n _features: features,\n _meshFeatures: meshFeatures,\n _meshBGL: meshBGL,\n _shadowBGL: shadowBGL,\n _composed: composed,\n _pipelines: new Map(),\n };\n _bindingsCache.set(key, bindings);\n return bindings;\n}\n\n/** Get-or-build a sig-specific pipeline on top of a shader bindings. Called at bind() time. */\nexport function getOrCreateStandardPipeline(engine: EngineContext, sig: RenderTargetSignature, bindings: StandardShaderBindings): GPURenderPipeline {\n ensureDevice(engine);\n const key = targetSignatureKey(sig);\n const cached = bindings._pipelines.get(key);\n if (cached) {\n return cached;\n }\n\n const device = engine._device;\n const composed = bindings._composed;\n const features = bindings._features;\n const sceneBGL = getSceneBindGroupLayout(engine);\n const bgls: GPUBindGroupLayout[] = bindings._shadowBGL ? [sceneBGL, bindings._meshBGL, bindings._shadowBGL] : [sceneBGL, bindings._meshBGL];\n\n const vertModule = device.createShaderModule({ code: composed._vertexWGSL });\n const noColorOutput = (features & NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n const fragModule = !sig._colorFormat && !noColorOutput ? null : device.createShaderModule({ code: composed._fragmentWGSL });\n\n const needsBlend = !esmShadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || (features & MATERIAL_ALPHA_BLEND) !== 0);\n const colorTarget: GPUColorTargetState | null = noColorOutput\n ? null\n : needsBlend\n ? {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }\n : { format: sig._colorFormat! };\n\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: bgls }),\n vertex: { module: vertModule, entryPoint: \"main\", buffers: composed._vertexBufferLayouts },\n ...(fragModule ? { fragment: { module: fragModule, entryPoint: \"main\", targets: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n depthWriteEnabled: noColorOutput || esmShadowOutput || !needsBlend,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: features & DOUBLE_SIDED ? \"none\" : \"back\", frontFace: sig._flipY ? \"cw\" : \"ccw\" },\n });\n\n bindings._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Per-Mesh GPU Setup ─────────────────────────────────────────────\n\n/** Build the per-mesh material bind group (group 1). The mesh UBO\n * and material UBO are created/owned by the caller — this\n * function only assembles the bind group entries that match the composer's\n * binding layout.\n *\n * Mirrors `createPbrMeshBindGroup` in pbr-pipeline.ts. */\nexport function createStandardMeshBindGroup(\n engine: EngineContext,\n bindings: StandardShaderBindings,\n meshUBO: GPUBuffer,\n materialUBO: GPUBuffer,\n material: StandardMaterialProps\n): GPUBindGroup {\n const device = engine._device;\n const features = bindings._features;\n const needsUV = (features & NEEDS_UV) !== 0;\n const hasDiffuseTex = (features & HAS_DIFFUSE_TEXTURE) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n\n // Sequential numbering matches composer output.\n let nextBinding = 0;\n const entries: GPUBindGroupEntry[] = [\n { binding: nextBinding++, resource: { buffer: meshUBO } },\n { binding: nextBinding++, resource: { buffer: materialUBO } },\n ];\n\n if (hasDiffuseTex) {\n const tex = material.diffuseTexture!;\n entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });\n }\n\n // UV params UBO (only when UVs are actually emitted).\n if (needsUV) {\n const uvData = new Float32Array(4);\n const scaleX = material.uvScale[0];\n let scaleY = material.uvScale[1];\n let offsetY = 0;\n // Flip V for y-down source data (e.g. basis/compressed textures).\n // uv * (sx, sy) + (ox, oy) with vFlip becomes uv.xy * (sx, -sy) + (ox, sy+oy).\n if (material.diffuseTexture?.invertY) {\n offsetY = scaleY;\n scaleY = -scaleY;\n }\n uvData[0] = scaleX;\n uvData[1] = scaleY;\n uvData[2] = 0;\n uvData[3] = offsetY;\n entries.push({ binding: nextBinding++, resource: { buffer: createUniformBuffer(engine, uvData) } });\n }\n\n if (esmShadowOutput) {\n entries.push({\n binding: nextBinding++,\n resource: { buffer: (material as StandardMaterialProps & { readonly _esmShadowParamsUBO: GPUBuffer })._esmShadowParamsUBO },\n });\n }\n\n // Fragment-contributed bindings — iterate ext registry in alphabetical id order\n // to match composer's fragment sort order.\n const sortedExts = _getStdExtsSorted();\n for (const ext of sortedExts) {\n if (features & ext._feature && ext._bind) {\n nextBinding = ext._bind(material, entries, nextBinding);\n }\n }\n\n return device.createBindGroup({ layout: bindings._meshBGL, entries });\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────\n\n/** Write standard material properties into a pre-allocated Float32Array (24 floats). */\nexport function writeStdMaterialData(data: Float32Array, mat: StandardMaterialProps, textureLevel: number): void {\n const { diffuseColor: dc, specularColor: sc, emissiveColor: ec, ambientColor: ac } = mat;\n data[0] = dc[0];\n data[1] = dc[1];\n data[2] = dc[2];\n data[3] = mat.alpha;\n data[4] = sc[0];\n data[5] = sc[1];\n data[6] = sc[2];\n data[7] = mat.specularPower;\n data[8] = ec[0];\n data[9] = ec[1];\n data[10] = ec[2];\n data[11] = 1.0 / mat.bumpLevel;\n data[12] = ac[0];\n data[13] = ac[1];\n data[14] = ac[2];\n data[15] = textureLevel;\n data[16] = mat.ambientTexLevel;\n data[17] = mat.lightmapLevel;\n data[18] = mat.opacityLevel;\n data[19] = mat.alphaCutOff;\n data[20] = mat.reflectionLevel;\n data[21] = mat.reflectionCoordMode;\n}\n","/** Standard mesh renderable — builds Renderables from Mesh + StandardMaterial.\n *\n * `buildStandardMeshRenderables` does shared per-scene setup, then delegates\n * per-mesh work to `buildSingleStandardRenderable`. The same single-mesh\n * function is reused by the material-swap path. */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { Renderable, MeshGroupBuildResult } from \"../../render/renderable.js\";\nimport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _computeStandardMaterialFeatures, _standardShaderVariantKey } from \"./standard-material.js\";\nimport { acquireTexture, releaseTexture, clearSamplerCache } from \"../../resource/gpu-pool.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getOrCreateStandardBindings, getOrCreateStandardPipeline, createStandardMeshBindGroup, clearStandardPipelineCache, writeStdMaterialData } from \"./standard-pipeline.js\";\nimport { ESM_SHADOW_OUTPUT, NO_COLOR_OUTPUT, NEEDS_UV, NEEDS_UV2, HAS_OPACITY_TEXTURE, _getStdExts } from \"./standard-flags.js\";\nimport type { ShaderFragment } from \"../../shader/fragment-types.js\";\nimport type { ShadowGenerator } from \"../../shadow/shadow-generator.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { Material, MaterialRenderFeatures } from \"../material.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n/** Scratch buffer for material UBO writes (24 floats = 96 bytes). Reused across\n * every Standard renderable since binding updates are single-threaded per frame. */\nconst _stdMatScratch = new Float32Array(24);\n\n/** Thin instance GPU sync callback type — loaded dynamically only when needed. */\ntype ThinInstanceSync = (engine: EngineContext, ti: any, pass: GPURenderPassEncoder | GPURenderBundleEncoder, slot: number, hasColor: boolean) => number;\n\n/** Fragment factories passed from the async group builder. */\nexport interface StdFragmentFactories {\n tiSync?: ThinInstanceSync;\n tiFragment?: (hasColor: boolean) => ShaderFragment;\n shadowFragment?: (shadowLights: import(\"./fragments/std-shadow-fragment.js\").ShadowLightSlot[]) => ShaderFragment;\n}\n\n/** Build Renderable(s) + a SceneUniformUpdater for a set of standard meshes.\n * The `rebuildSingle` closure is reused later (via `_rebuildSingle` on the group\n * builder) for material swaps + per-pass material overrides. */\nexport function buildStandardMeshRenderables(scene: SceneContext, meshes: Mesh[], factories: StdFragmentFactories): MeshGroupBuildResult {\n const engine = scene.engine;\n const device = engine._device;\n const { tiSync, tiFragment, shadowFragment } = factories;\n\n // Collect per-light shadow info.\n const shadowLights: { lightIndex: number; shadowType: \"esm\" | \"pcf\"; gen: ShadowGenerator }[] = [];\n for (let i = 0; i < scene.lights.length; i++) {\n const sg = scene.lights[i]!.shadowGenerator;\n if (sg) {\n shadowLights.push({ lightIndex: i, shadowType: sg._shadowType, gen: sg });\n }\n }\n const hasSomeShadows = shadowLights.length > 0;\n\n // All receiving meshes in this build share the same shadow generators,\n // so keying the shadow BG by `bindings._shadowBGL` alone is correct.\n const shadowBGCache = new Map<GPUBindGroupLayout, GPUBindGroup>();\n // Closure used both for the initial per-mesh build below AND for later\n // material-swap / per-pass-override rebuilds (set on standardGroupBuilder._rebuildSingle).\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const mat = (materialOverride ?? mesh.material) as StandardMaterialProps;\n const renderFeatures = (mat._renderFeatures ??= { features: _computeStandardMaterialFeatures(mat) }) as MaterialRenderFeatures;\n const isOverride = materialOverride != null;\n const features = renderFeatures.features;\n const shadowOutput = (features & (NO_COLOR_OUTPUT | ESM_SHADOW_OUTPUT)) !== 0;\n const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n // Build per-feature fragment list (deduped via pipeline cache).\n const frags: ShaderFragment[] = [];\n for (const ext of _getStdExts().values()) {\n if (features & ext._feature) {\n const f = ext._frag(features);\n if (f) {\n frags.push(f);\n }\n }\n }\n let shaderKey = \"\";\n if (meshFeatures & MSH_RECEIVE_SHADOWS && shadowFragment) {\n const slots = shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));\n shaderKey = _standardShaderVariantKey(slots);\n frags.push(shadowFragment(slots));\n }\n if (meshFeatures & MSH_HAS_THIN_INSTANCES && tiFragment) {\n const hasColor = !!(meshFeatures & MSH_HAS_INSTANCE_COLOR);\n const tiFrag = tiFragment(hasColor);\n if (hasColor) {\n // Standard applies instance color to final color (BC), not to baseColor (AT) like PBR.\n const { _fragmentSlots: _fragmentSlots, ...rest } = tiFrag;\n frags.push({\n ...rest,\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`,\n },\n });\n } else {\n frags.push(tiFrag);\n }\n }\n const esmShadowDepthCode = (features & ESM_SHADOW_OUTPUT) !== 0 ? (mat as StandardMaterialProps & { readonly _esmShadowDepthCode: string })._esmShadowDepthCode : \"\";\n const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);\n\n const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];\n\n const meshUboData = new Float32Array(bindings._composed._meshUboSpec._totalBytes / 4);\n meshUboData.set(mesh.worldMatrix, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n const textureLevel = (features & NEEDS_UV) !== 0 ? 1.0 : 0;\n const matData = new Float32Array(24);\n writeStdMaterialData(matData, mat, textureLevel);\n const materialUBO = createUniformBuffer(engine, matData);\n const meshBindGroup = createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat);\n\n // Shadow bind group (group 2) — shared across receiving meshes via shadowBGCache.\n let shadowBindGroup: GPUBindGroup | null = null;\n if (meshShadowGens.length > 0 && bindings._shadowBGL) {\n let cached = shadowBGCache.get(bindings._shadowBGL);\n if (!cached) {\n const entries: GPUBindGroupEntry[] = [];\n let b = 0;\n for (const sg of meshShadowGens) {\n entries.push({ binding: b++, resource: sg._depthTexture.createView() });\n entries.push({ binding: b++, resource: sg._depthSampler });\n entries.push({ binding: b++, resource: { buffer: sg._shadowUBO } });\n }\n cached = device.createBindGroup({ layout: bindings._shadowBGL, entries });\n shadowBGCache.set(bindings._shadowBGL, cached);\n }\n shadowBindGroup = cached;\n }\n\n const needsUV = (features & NEEDS_UV) !== 0;\n const needsUV2 = (features & NEEDS_UV2) !== 0;\n const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n const isTransparent = !shadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || mat.alpha < 1);\n\n const boundTextures = collectStdBoundTextures(mat);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n s._meshDisposables.set(mesh, [\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n let _lastWorldVersion = mesh.worldMatrixVersion;\n let _lastLightsCount = s.lights.length;\n const sortCenter = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number];\n const update = (): void => {\n const worldVersion = mesh.worldMatrixVersion;\n if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n meshUboData.set(mesh.worldMatrix, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n device.queue.writeBuffer(meshUBO, 0, meshUboData as Float32Array<ArrayBuffer>);\n _lastWorldVersion = worldVersion;\n _lastLightsCount = s.lights.length;\n }\n const uboVersion = mat._uboVersion;\n if (uboVersion !== _lastUboVersion) {\n _lastUboVersion = uboVersion;\n _stdMatScratch.fill(0);\n writeStdMaterialData(_stdMatScratch, mat, textureLevel);\n device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);\n }\n };\n\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder): number => {\n // For per-pass material overrides, skip the mesh.material === mat guard\n // because the override material is intentionally not the mesh's current one.\n if (!isOverride && mesh.material !== mat) {\n return 0;\n }\n const g = mesh._gpu;\n let slot = 0;\n const vb = g._vbLayout;\n pass.setVertexBuffer(slot++, g.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, g.normalBuffer, vb?._n?._offset);\n if (needsUV) {\n pass.setVertexBuffer(slot++, g.uvBuffer, vb?._u?._offset);\n }\n if (needsUV2 && g.uv2Buffer) {\n pass.setVertexBuffer(slot++, g.uv2Buffer, vb?._u2?._offset);\n }\n\n const ti = hasThinInstances ? mesh.thinInstances : null;\n if (ti && tiSync) {\n slot = tiSync(engine, ti, pass, slot, hasInstanceColor);\n }\n\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, meshBindGroup);\n if (receiveShadows && shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n if (ti && ti.count > 0) {\n pass.drawIndexed(g.indexCount, ti.count);\n } else {\n pass.drawIndexed(g.indexCount);\n }\n return 1;\n };\n\n const r: Renderable = {\n order: mesh.renderOrder ?? (isTransparent ? 200 : 100),\n isTransparent,\n mesh,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: getOrCreateStandardPipeline(eng as EngineContext, sig, bindings),\n update,\n draw,\n };\n },\n };\n r._worldCenter = sortCenter;\n let _lastUboVersion = mat._uboVersion;\n return r;\n };\n\n const renderables = meshes.map((m) => rebuildSingle(scene, m));\n\n scene._disposables.push(\n () => clearStandardPipelineCache(),\n () => clearSamplerCache(engine)\n );\n\n return { renderables, rebuildSingle };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { c as createShadowFragment } from "./shadow-fragment-core-DHN2G6FI.js";
|
|
2
|
-
function createStdShadowFragment(shadowLights) {
|
|
3
|
-
return createShadowFragment("std-shadow", shadowLights);
|
|
4
|
-
}
|
|
5
|
-
export {
|
|
6
|
-
createStdShadowFragment
|
|
7
|
-
};
|
|
8
|
-
//# sourceMappingURL=std-shadow-fragment-FNQfrJuC.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"std-shadow-fragment-FNQfrJuC.js","sources":["../src/material/standard/fragments/std-shadow-fragment.ts"],"sourcesContent":["/**\n * Standard Shadow Fragment — Per-Light Shadow Support\n *\n * Thin wrapper around the shared shadow-fragment-core for Standard materials.\n * Only bundled when a scene uses shadow-receiving Standard meshes.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport { createShadowFragment } from \"../../../shader/fragments/shadow-fragment-core.js\";\n\nexport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\nimport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\n\n/**\n * Create a per-light shadow fragment for Standard materials.\n * Each shadow-casting light gets its own varying, bindings, and sampling code.\n * The shadow factor for each light is stored in shadowFactors[lightIndex].\n */\nexport function createStdShadowFragment(shadowLights: ShadowLightSlot[]): ShaderFragment {\n return createShadowFragment(\"std-shadow\", shadowLights);\n}\n"],"names":[],"mappings":";AAkBO,SAAS,wBAAwB,cAAiD;AACrF,SAAO,qBAAqB,cAAc,YAAY;AAC1D;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"thin-instance-gpu-C9Gv_Z1w.js","sources":["../src/mesh/thin-instance-gpu.ts"],"sourcesContent":["/** Thin instance GPU buffer sync — dynamically loaded only by scenes with thin instances.\n * Keeps the standard renderable chunk unchanged for scenes without thin instances. */\n\nimport type { ThinInstanceData } from \"./thin-instance.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\n\n/** @internal Optional replacement buffers used by GPU culling after it compacts visible instances. */\nexport interface ThinInstanceDrawBuffers {\n readonly matrixBuffer: GPUBuffer;\n readonly colorBuffer: GPUBuffer | null;\n}\n\n/** @internal Sync CPU thin-instance data to GPU buffers, optionally with STORAGE usage for compute culling. */\nexport function syncThinInstanceGpuData(engine: EngineContext, ti: ThinInstanceData, hasColor: boolean): void {\n const device = engine._device;\n const needsStorage = ti._gpuCullingEnabled;\n if (ti._version !== ti._gpuVersion || ti._gpuBufferStorage !== needsStorage) {\n const byteSize = ti.count * 64;\n let bufferRecreated = false;\n if (!ti._gpuBuffer || ti._gpuBuffer.size < byteSize || ti._gpuBufferStorage !== needsStorage) {\n ti._gpuBuffer?.destroy();\n ti._gpuBuffer = device.createBuffer({\n size: Math.max(ti._capacity * 64, 4),\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | (needsStorage ? GPUBufferUsage.STORAGE : 0),\n });\n ti._gpuBufferStorage = needsStorage;\n bufferRecreated = true;\n }\n // Upload only the dirty range (or full range if buffer was just created)\n const dirtyMin = bufferRecreated ? 0 : ti._dirtyMin;\n const dirtyMax = bufferRecreated ? ti.count : Math.min(ti._dirtyMax, ti.count);\n if (dirtyMax > dirtyMin) {\n const minByte = dirtyMin * 64;\n const maxByte = dirtyMax * 64;\n device.queue.writeBuffer(ti._gpuBuffer, minByte, ti.matrices.buffer, ti.matrices.byteOffset + minByte, maxByte - minByte);\n }\n ti._dirtyMin = ti.count;\n ti._dirtyMax = 0;\n ti._gpuVersion = ti._version;\n }\n\n if (hasColor && ti.colors) {\n if (ti._colorVersion !== ti._colorGpuVersion || ti._colorGpuBufferStorage !== needsStorage) {\n const colorByteSize = ti.count * 16;\n if (!ti._colorGpuBuffer || ti._colorGpuBuffer.size < colorByteSize || ti._colorGpuBufferStorage !== needsStorage) {\n ti._colorGpuBuffer?.destroy();\n ti._colorGpuBuffer = device.createBuffer({\n size: Math.max(ti._capacity * 16, 4),\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST | (needsStorage ? GPUBufferUsage.STORAGE : 0),\n });\n ti._colorGpuBufferStorage = needsStorage;\n }\n device.queue.writeBuffer(ti._colorGpuBuffer, 0, ti.colors.buffer, ti.colors.byteOffset, colorByteSize);\n ti._colorGpuVersion = ti._colorVersion;\n }\n }\n}\n\n/** Sync thin instance matrix + optional color GPU buffers and bind to vertex slots. */\nexport function syncThinInstanceBuffers(\n engine: EngineContext,\n ti: ThinInstanceData,\n pass: GPURenderPassEncoder | GPURenderBundleEncoder,\n slot: number,\n hasColor: boolean,\n drawBuffers?: ThinInstanceDrawBuffers | null\n): number {\n syncThinInstanceGpuData(engine, ti, hasColor);\n const matrixBuffer = drawBuffers?.matrixBuffer ?? ti._gpuBuffer;\n if (matrixBuffer) {\n pass.setVertexBuffer(slot++, matrixBuffer);\n }\n\n if (hasColor) {\n const colorBuffer = drawBuffers?.colorBuffer ?? ti._colorGpuBuffer;\n if (colorBuffer) {\n pass.setVertexBuffer(slot++, colorBuffer);\n }\n }\n\n return slot;\n}\n"],"names":[],"mappings":"AAaO,SAAS,wBAAwB,QAAuB,IAAsB,UAAyB;AAAvG;AACH,QAAM,SAAS,OAAO;AACtB,QAAM,eAAe,GAAG;AACxB,MAAI,GAAG,aAAa,GAAG,eAAe,GAAG,sBAAsB,cAAc;AACzE,UAAM,WAAW,GAAG,QAAQ;AAC5B,QAAI,kBAAkB;AACtB,QAAI,CAAC,GAAG,cAAc,GAAG,WAAW,OAAO,YAAY,GAAG,sBAAsB,cAAc;AAC1F,eAAG,eAAH,mBAAe;AACf,SAAG,aAAa,OAAO,aAAa;AAAA,QAChC,MAAM,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC;AAAA,QACnC,OAAO,eAAe,SAAS,eAAe,YAAY,eAAe,eAAe,UAAU;AAAA,MAAA,CACrG;AACD,SAAG,oBAAoB;AACvB,wBAAkB;AAAA,IACtB;AAEA,UAAM,WAAW,kBAAkB,IAAI,GAAG;AAC1C,UAAM,WAAW,kBAAkB,GAAG,QAAQ,KAAK,IAAI,GAAG,WAAW,GAAG,KAAK;AAC7E,QAAI,WAAW,UAAU;AACrB,YAAM,UAAU,WAAW;AAC3B,YAAM,UAAU,WAAW;AAC3B,aAAO,MAAM,YAAY,GAAG,YAAY,SAAS,GAAG,SAAS,QAAQ,GAAG,SAAS,aAAa,SAAS,UAAU,OAAO;AAAA,IAC5H;AACA,OAAG,YAAY,GAAG;AAClB,OAAG,YAAY;AACf,OAAG,cAAc,GAAG;AAAA,EACxB;AAEA,MAAI,YAAY,GAAG,QAAQ;AACvB,QAAI,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,2BAA2B,cAAc;AACxF,YAAM,gBAAgB,GAAG,QAAQ;AACjC,UAAI,CAAC,GAAG,mBAAmB,GAAG,gBAAgB,OAAO,iBAAiB,GAAG,2BAA2B,cAAc;AAC9G,iBAAG,oBAAH,mBAAoB;AACpB,WAAG,kBAAkB,OAAO,aAAa;AAAA,UACrC,MAAM,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC;AAAA,UACnC,OAAO,eAAe,SAAS,eAAe,YAAY,eAAe,eAAe,UAAU;AAAA,QAAA,CACrG;AACD,WAAG,yBAAyB;AAAA,MAChC;AACA,aAAO,MAAM,YAAY,GAAG,iBAAiB,GAAG,GAAG,OAAO,QAAQ,GAAG,OAAO,YAAY,aAAa;AACrG,SAAG,mBAAmB,GAAG;AAAA,IAC7B;AAAA,EACJ;AACJ;AAGO,SAAS,wBACZ,QACA,IACA,MACA,MACA,UACA,aACM;AACN,0BAAwB,QAAQ,IAAI,QAAQ;AAC5C,QAAM,gBAAe,2CAAa,iBAAgB,GAAG;AACrD,MAAI,cAAc;AACd,SAAK,gBAAgB,QAAQ,YAAY;AAAA,EAC7C;AAEA,MAAI,UAAU;AACV,UAAM,eAAc,2CAAa,gBAAe,GAAG;AACnD,QAAI,aAAa;AACb,WAAK,gBAAgB,QAAQ,WAAW;AAAA,IAC5C;AAAA,EACJ;AAEA,SAAO;AACX;"}
|