@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-block-
|
|
1
|
+
{"version":3,"file":"input-block-Coi_aZwl.js","sources":["../src/material/node/blocks/input-block.ts"],"sourcesContent":["/** InputBlock emitter.\n *\n * Three modes (BJS NodeMaterialBlockConnectionPointMode):\n * 0 = Uniform — inline value becomes a field in the node UBO.\n * 1 = Attribute — bound to a vertex attribute (position/normal/uv/...).\n * 2 = Varying — interpolated from a system/pre-existing varying.\n *\n * For attributes we declare the vertex attribute (dedup by name) and, if the\n * value is consumed in fragment stage, a varying to carry it across.\n */\n\nimport type { BlockEmitter, NodeBuildState, NodeExpr, NodeValueType, Stage, NodeBlock } from \"../node-types.js\";\nimport { WGSL } from \"../node-types.js\";\n\ntype BjsType = number; // NodeMaterialBlockConnectionPointTypes\n\nfunction bjsTypeToNodeType(t: BjsType): NodeValueType {\n // bitflags: 0x1=Float, 0x4=Vec2, 0x8=Vec3, 0x10=Vec4, 0x20=Color3, 0x40=Color4\n if (t === 0x1 || t === 0x2) {\n return \"f32\";\n }\n if (t === 0x4) {\n return \"vec2f\";\n }\n if (t === 0x8 || t === 0x20) {\n return \"vec3f\";\n }\n if (t === 0x10 || t === 0x40) {\n return \"vec4f\";\n }\n if (t === 0x80) {\n return \"mat4f\";\n }\n throw new Error(`InputBlock: unsupported BJS connection point type 0x${t.toString(16)}`);\n}\n\nfunction wgslLiteral(value: unknown, type: NodeValueType): string {\n if (type === \"f32\") {\n const f = typeof value === \"number\" ? value : 0;\n return formatFloat(f);\n }\n if (Array.isArray(value)) {\n const parts = value.map((v) => formatFloat(typeof v === \"number\" ? v : 0)).join(\", \");\n return `${WGSL[type]}(${parts})`;\n }\n // Fallback to zero.\n if (type === \"vec2f\") {\n return \"vec2<f32>(0.0, 0.0)\";\n }\n if (type === \"vec3f\") {\n return \"vec3<f32>(0.0, 0.0, 0.0)\";\n }\n if (type === \"vec4f\") {\n return \"vec4<f32>(0.0, 0.0, 0.0, 0.0)\";\n }\n return \"0.0\";\n}\n\nfunction formatFloat(n: number): string {\n if (Number.isInteger(n)) {\n return `${n}.0`;\n }\n return `${n}`;\n}\n\n// Known mesh attributes — maps InputBlock.name → WGSL type.\nconst ATTRIBUTE_TYPES: Record<string, NodeValueType> = {\n position: \"vec3f\",\n normal: \"vec3f\",\n tangent: \"vec4f\",\n uv: \"vec2f\",\n uv2: \"vec2f\",\n color: \"vec4f\",\n matricesIndices: \"vec4f\",\n matricesWeights: \"vec4f\",\n matricesIndicesExtra: \"vec4f\",\n matricesWeightsExtra: \"vec4f\",\n};\n\nfunction emitAttribute(block: NodeBlock, stage: Stage, state: NodeBuildState): NodeExpr {\n const attrName = block.name;\n const type = ATTRIBUTE_TYPES[attrName];\n if (!type) {\n throw new Error(`InputBlock: unknown mesh attribute \"${attrName}\"`);\n }\n const wgslType = WGSL[type];\n // Dedup vertex attribute.\n if (!state.vertexAttributes.find((a) => a._name === attrName)) {\n state.vertexAttributes.push({\n _name: attrName,\n _type: wgslType,\n _gpuFormat: type === \"vec2f\" ? \"float32x2\" : type === \"vec3f\" ? \"float32x3\" : \"float32x4\",\n _arrayStride: (type === \"vec2f\" ? 2 : type === \"vec3f\" ? 3 : 4) * 4,\n });\n }\n if (stage === \"vertex\") {\n return { expr: `in.${attrName}`, type };\n }\n // In fragment stage — bridge through a varying (idempotent).\n const vname = `v_attr_${attrName}`;\n if (!state.varyings.find((v) => v._name === vname)) {\n state.varyings.push({ _name: vname, _type: wgslType });\n state.vertex.body.push(`out.${vname} = in.${attrName};`);\n }\n return { expr: `in.${vname}`, type };\n}\n\n// BJS NodeMaterialSystemValues enum (Babylon.js master).\n// We map the commonly used ones to WGSL expressions sourced from scene/mesh UBOs.\n// For matrices not present in Lite's scene UBO (`projection` alone), we fall\n// back to the closest valid expression (or throw — caller decides).\nfunction emitSystemValue(block: NodeBlock, stage: Stage, state: NodeBuildState): NodeExpr {\n const sv = block.serialized[\"systemValue\"] as number | undefined;\n // Only sensible in the vertex stage for matrix types; for CameraPosition/FogColor either stage is fine.\n switch (sv) {\n case 1: // World\n return { expr: \"meshU.world\", type: \"mat4f\" };\n case 2: // View\n return { expr: \"sceneU.view\", type: \"mat4f\" };\n case 3: // Projection\n return { expr: \"sceneU.projection\", type: \"mat4f\" };\n case 4: // ViewProjection\n return { expr: \"sceneU.viewProjection\", type: \"mat4f\" };\n case 5: // WorldView\n return { expr: \"(sceneU.view * meshU.world)\", type: \"mat4f\" };\n case 6: // WorldViewProjection\n return { expr: \"(sceneU.viewProjection * meshU.world)\", type: \"mat4f\" };\n case 7: // CameraPosition\n return { expr: \"sceneU.vEyePosition.xyz\", type: \"vec3f\" };\n case 8: // FogColor\n return { expr: \"sceneU.vFogColor.xyz\", type: \"vec3f\" };\n default:\n throw new Error(`InputBlock: unsupported systemValue ${sv} on block \"${block.name}\"`);\n }\n void stage;\n void state;\n}\n\nfunction emitUniform(block: NodeBlock, state: NodeBuildState): NodeExpr {\n // Determine the WGSL type. BJS serializes the port type under `type`.\n const portType = (block.serialized[\"type\"] as BjsType | undefined) ?? 0x10;\n const type = bjsTypeToNodeType(portType);\n // UBO field name — use block name (must be unique; parser enforces via namedInputs key).\n const fieldName = sanitize(block.name || `input${block.id}`);\n // Dedup.\n if (!state.nodeUboFields.find((f) => f._name === fieldName)) {\n state.nodeUboFields.push({ _name: fieldName, _type: WGSL[type] as any });\n // If this is a literal value (no override yet), it will be written into the\n // UBO at material-build time; for shader generation we just reference the field.\n // We ignore the inline literal here — the UBO write path handles that.\n }\n void wgslLiteral; // reserved for future default-literal constant-fold optimization\n return { expr: `nodeU.${fieldName}`, type };\n}\n\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, \"_\");\n}\n\nexport const emitter: BlockEmitter = {\n className: \"InputBlock\",\n emit(block, _outputName, stage, state, _ctx) {\n const mode = (block.serialized[\"mode\"] ?? block.serialized[\"_mode\"]) as number | undefined;\n if (mode === 1) {\n return emitAttribute(block, stage, state);\n }\n // System-value uniforms (World, WVP, CameraPosition, …) come from scene/mesh UBOs\n // rather than the material's node UBO, so they never appear in `nodeUboFields`.\n const sv = block.serialized[\"systemValue\"];\n if (typeof sv === \"number\") {\n return emitSystemValue(block, stage, state);\n }\n // Default to Uniform (mode 0 or unspecified).\n return emitUniform(block, state);\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { as as PBR2_HAS_IRIDESCENCE_MAP, at as PBR2_HAS_IRIDESCENCE_THICKNESS_MAP, au as PBR2_HAS_IRIDESCENCE, ae as PBR_HAS_METALLIC_REFLECTANCE_MAP, af as PBR_HAS_REFLECTANCE_MAP, ag as PBR2_HAS_REFLECTANCE_FACTORS } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
const PBR2_HAS_IRIDESCENCE_UV_TX = 1 << 20;
|
|
4
4
|
const PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX = 1 << 21;
|
|
@@ -240,4 +240,4 @@ export {
|
|
|
240
240
|
pbrExt,
|
|
241
241
|
writeIridescenceUBO
|
|
242
242
|
};
|
|
243
|
-
//# sourceMappingURL=iridescence-fragment-
|
|
243
|
+
//# sourceMappingURL=iridescence-fragment-DwZcCTdD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iridescence-fragment-Gymp7or5.js","sources":["../src/material/pbr/fragments/iridescence-fragment.ts"],"sourcesContent":["/**\n * Iridescence Fragment\n *\n * Native PBR thin-film iridescence (BJS PBRMaterial.iridescence and\n * KHR_materials_iridescence). Modifies the already-computed base-layer colorF0\n * before direct and IBL lighting consume it.\n */\n\nimport type { BindingDecl, ShaderFragment, UboField } from \"../../../shader/fragment-types.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport type { IridescenceProps, PbrMaterialProps } from \"../pbr-material.js\";\nimport {\n PBR_HAS_METALLIC_REFLECTANCE_MAP,\n PBR_HAS_REFLECTANCE_MAP,\n PBR2_HAS_IRIDESCENCE,\n PBR2_HAS_IRIDESCENCE_MAP,\n PBR2_HAS_IRIDESCENCE_THICKNESS_MAP,\n PBR2_HAS_REFLECTANCE_FACTORS,\n} from \"../pbr-flag-bits.js\";\n\nconst STAGE_FRAGMENT = 0x2;\nconst PBR2_HAS_IRIDESCENCE_UV_TX = 1 << 20;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX = 1 << 21;\nconst PBR2_HAS_IRIDESCENCE_UV2 = 1 << 22;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV2 = 1 << 23;\nconst IRI_MSH_HAS_UV2 = 1 << 7;\n\nconst IRIDESCENCE_HELPERS = `const IRI_XYZ_TO_REC709:mat3x3<f32>=mat3x3<f32>(\n3.2404542,-0.9692660,0.0556434,\n-1.5371385,1.8760108,-0.2040259,\n-0.4985314,0.0415560,1.0572252);\nfn iri_square3(x:vec3<f32>)->vec3<f32>{return x*x;}\nfn iri_iorFromAirF0(f0:vec3<f32>)->vec3<f32>{\nlet s=sqrt(clamp(f0,vec3<f32>(0.0),vec3<f32>(0.9999)));\nreturn (vec3<f32>(1.0)+s)/(vec3<f32>(1.0)-s);\n}\nfn iri_r0FromIor3(iorT:vec3<f32>,iorI:f32)->vec3<f32>{return iri_square3((iorT-vec3<f32>(iorI))/(iorT+vec3<f32>(iorI)));}\nfn iri_r0FromIor(iorT:f32,iorI:f32)->f32{let r=(iorT-iorI)/(iorT+iorI);return r*r;}\nfn iri_fresSchlick(c:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-c;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\nfn iri_evalSensitivity(opd:f32,shift:vec3<f32>)->vec3<f32>{\nlet phase=6.283185307179586*opd*1.0e-9;\nlet val=vec3<f32>(5.4856e-13,4.4201e-13,5.2481e-13);\nlet pos=vec3<f32>(1.6810e+06,1.7953e+06,2.2084e+06);\nlet vr=vec3<f32>(4.3278e+09,9.3046e+09,6.6121e+09);\nvar xyz=val*sqrt(6.283185307179586*vr)*cos(pos*phase+shift)*exp(-(phase*phase)*vr);\nxyz.x=xyz.x+9.7470e-14*sqrt(6.283185307179586*4.5282e+09)*cos(2.2399e+06*phase+shift.x)*exp(-4.5282e+09*phase*phase);\nxyz=xyz/1.0685e-7;\nreturn IRI_XYZ_TO_REC709*xyz;\n}\nfn iri_eval(outsideIor:f32,eta2:f32,cosTheta1:f32,thickness:f32,baseF0:vec3<f32>)->vec3<f32>{\nlet iridescenceIor=mix(outsideIor,eta2,smoothstep(0.0,0.03,thickness));\nlet eta=outsideIor/iridescenceIor;\nlet sinTheta2Sq=eta*eta*(1.0-cosTheta1*cosTheta1);\nlet cosTheta2Sq=1.0-sinTheta2Sq;\nif(cosTheta2Sq<0.0){return vec3<f32>(1.0);}\nlet cosTheta2=sqrt(cosTheta2Sq);\nlet r0=iri_r0FromIor(iridescenceIor,outsideIor);\nlet r12=iri_fresSchlick(cosTheta1,vec3<f32>(r0),vec3<f32>(1.0)).x;\nlet t121=1.0-r12;\nvar phi12=0.0;\nif(iridescenceIor<outsideIor){phi12=3.141592653589793;}\nlet phi21=3.141592653589793-phi12;\nlet baseIor=iri_iorFromAirF0(baseF0);\nlet r1=iri_r0FromIor3(baseIor,iridescenceIor);\nlet r23=iri_fresSchlick(cosTheta2,r1,vec3<f32>(1.0));\nvar phi23=vec3<f32>(0.0);\nif(baseIor.x<iridescenceIor){phi23.x=3.141592653589793;}\nif(baseIor.y<iridescenceIor){phi23.y=3.141592653589793;}\nif(baseIor.z<iridescenceIor){phi23.z=3.141592653589793;}\nlet opd=2.0*iridescenceIor*thickness*cosTheta2;\nlet phi=vec3<f32>(phi21)+phi23;\nlet r123=clamp(vec3<f32>(r12)*r23,vec3<f32>(1e-5),vec3<f32>(0.9999));\nlet smallR123=sqrt(r123);\nlet rs=(t121*t121)*r23/(vec3<f32>(1.0)-r123);\nvar outI=vec3<f32>(r12)+rs;\nvar cm=rs-vec3<f32>(t121);\nfor(var m:i32=1;m<=2;m=m+1){\ncm=cm*smallR123;\noutI=outI+cm*(2.0*iri_evalSensitivity(f32(m)*opd,f32(m)*phi));\n}\nreturn max(outI,vec3<f32>(0.0));\n}`;\n\nconst IRI_TEX: ReadonlyArray<readonly [number, \"texture\" | \"thicknessTexture\"]> = [\n [PBR2_HAS_IRIDESCENCE_MAP, \"texture\"],\n [PBR2_HAS_IRIDESCENCE_THICKNESS_MAP, \"thicknessTexture\"],\n];\n\nfunction uvBaseExpr(features2: number, meshFeatures: number, uv2Flag: number): string {\n return (features2 & uv2Flag) !== 0 && (meshFeatures & IRI_MSH_HAS_UV2) !== 0 ? \"input.uv2\" : \"input.uv\";\n}\n\nfunction uvDecl(name: string, baseUv: string, hasTx: boolean): string {\n return hasTx ? `let ${name}=vec2<f32>(dot(material.${name}m.xy,${baseUv}),dot(material.${name}m.zw,${baseUv}))+material.${name}t.xy;` : `let ${name}=${baseUv};`;\n}\n\nfunction uvTransformUboFields(name: string): UboField[] {\n return [\n { _name: `${name}m`, _type: \"vec4<f32>\" },\n { _name: `${name}t`, _type: \"vec4<f32>\" },\n ];\n}\n\nfunction writeUvTransform(data: Float32Array, offsets: ReadonlyMap<string, number>, name: string, tex: Texture2D | undefined): void {\n const mOff = offsets.get(`${name}m`);\n const tOff = offsets.get(`${name}t`);\n if (mOff === undefined || tOff === undefined) {\n return;\n }\n const mi = mOff / 4;\n const ti = tOff / 4;\n const sx = tex?.uScale ?? 1;\n const sy = tex?.vScale ?? 1;\n const ang = tex?.uAng ?? 0;\n const ox = tex?.uOffset ?? 0;\n const oy = tex?.vOffset ?? 0;\n if (ang === 0) {\n data[mi] = sx;\n data[mi + 1] = 0;\n data[mi + 2] = 0;\n data[mi + 3] = sy;\n } else {\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n data[mi] = c * sx;\n data[mi + 1] = -s * sy;\n data[mi + 2] = s * sx;\n data[mi + 3] = c * sy;\n }\n data[ti] = ox;\n data[ti + 1] = oy;\n data[ti + 2] = 0;\n data[ti + 3] = 0;\n}\n\nfunction createIridescenceFragment(features: number, features2: number, meshFeatures: number): ShaderFragment | null {\n if ((features2 & PBR2_HAS_IRIDESCENCE) === 0) {\n return null;\n }\n const hasIntensityMap = (features2 & PBR2_HAS_IRIDESCENCE_MAP) !== 0;\n const hasThicknessMap = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_MAP) !== 0;\n const hasIntensityUvTx = (features2 & PBR2_HAS_IRIDESCENCE_UV_TX) !== 0;\n const hasThicknessUvTx = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX) !== 0;\n const bindings: BindingDecl[] = [];\n const uboFields: UboField[] = [{ _name: \"iridescenceParams\", _type: \"vec4<f32>\" }];\n if (hasIntensityMap) {\n bindings.push(\n { _name: \"iridescenceTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasIntensityUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceUV\"));\n }\n }\n if (hasThicknessMap) {\n bindings.push(\n { _name: \"iridescenceThicknessTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceThicknessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasThicknessUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceThicknessUV\"));\n }\n }\n\n const scopeVars: string[] = [];\n if (hasIntensityMap) {\n scopeVars.push(uvDecl(\"iridescenceUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_UV2), hasIntensityUvTx));\n }\n if (hasThicknessMap) {\n scopeVars.push(uvDecl(\"iridescenceThicknessUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_THICKNESS_UV2), hasThicknessUvTx));\n }\n\n const intensity = hasIntensityMap ? \"material.iridescenceParams.x*textureSample(iridescenceTexture,iridescenceSampler_,iridescenceUV).r\" : \"material.iridescenceParams.x\";\n const thickness = hasThicknessMap\n ? \"mix(material.iridescenceParams.z,material.iridescenceParams.w,textureSample(iridescenceThicknessTexture,iridescenceThicknessSampler_,iridescenceThicknessUV).g)\"\n : \"material.iridescenceParams.w\";\n return {\n _id: \"iridescence\",\n _dependencies:\n (features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) !== 0 || (features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0 ? [\"reflectance\"] : undefined,\n _uboFields: uboFields,\n _bindings: bindings,\n _helperFunctions: IRIDESCENCE_HELPERS,\n _fragmentSlots: {\n ...(scopeVars.length ? { SV: scopeVars.join(\"\\n\") } : undefined),\n MF: `{\nlet iriIntensity=clamp(${intensity},0.0,1.0);\nlet iriThickness=max(${thickness},0.0);\nlet iriF0=iri_eval(1.0,max(material.iridescenceParams.y,1.0001),NdotV,iriThickness,colorF0);\ncolorF0=mix(colorF0,iriF0,iriIntensity);\n}`,\n },\n };\n}\n\nexport function writeIridescenceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const iri = material.iridescence as IridescenceProps | undefined;\n if (!iri?.isEnabled || !offsets.has(\"iridescenceParams\")) {\n return;\n }\n const off = offsets.get(\"iridescenceParams\")! / 4;\n data[off] = iri.intensity ?? 1.0;\n data[off + 1] = iri.indexOfRefraction ?? 1.3;\n data[off + 2] = iri.minimumThickness ?? 100;\n data[off + 3] = iri.maximumThickness ?? 400;\n writeUvTransform(data, offsets, \"iridescenceUV\", iri.texture);\n writeUvTransform(data, offsets, \"iridescenceThicknessUV\", iri.thicknessTexture);\n}\n\nexport const pbrExt: PbrExt = {\n id: \"iridescence\",\n phase: \"base-tex\",\n detect(mat) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri?.isEnabled) {\n return { f: 0, f2: 0 };\n }\n let f2 = PBR2_HAS_IRIDESCENCE;\n if (iri.texture) {\n f2 |= PBR2_HAS_IRIDESCENCE_MAP;\n if ((iri.texture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV_TX;\n }\n if ((iri.texture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV2;\n }\n }\n if (iri.thicknessTexture) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_MAP;\n if ((iri.thicknessTexture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX;\n }\n if ((iri.thicknessTexture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV2;\n }\n }\n return { f: 0, f2 };\n },\n frag: (ctx) => createIridescenceFragment(ctx._features, ctx._features2, ctx._meshFeatures),\n writeUbo: writeIridescenceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n const iri = (ctx._material as PbrMaterialProps).iridescence;\n if (!iri) {\n return b;\n }\n for (const [flag, key] of IRI_TEX) {\n const tex = iri[key];\n if ((ctx._features2 & flag) !== 0 && tex) {\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n }\n }\n return b;\n },\n textures(mat, t) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri) {\n return;\n }\n for (const [, key] of IRI_TEX) {\n const tex = iri[key];\n if (tex) {\n t.push(tex);\n }\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iridescence-fragment-DwZcCTdD.js","sources":["../src/material/pbr/fragments/iridescence-fragment.ts"],"sourcesContent":["/**\n * Iridescence Fragment\n *\n * Native PBR thin-film iridescence (BJS PBRMaterial.iridescence and\n * KHR_materials_iridescence). Modifies the already-computed base-layer colorF0\n * before direct and IBL lighting consume it.\n */\n\nimport type { BindingDecl, ShaderFragment, UboField } from \"../../../shader/fragment-types.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport type { IridescenceProps, PbrMaterialProps } from \"../pbr-material.js\";\nimport {\n PBR_HAS_METALLIC_REFLECTANCE_MAP,\n PBR_HAS_REFLECTANCE_MAP,\n PBR2_HAS_IRIDESCENCE,\n PBR2_HAS_IRIDESCENCE_MAP,\n PBR2_HAS_IRIDESCENCE_THICKNESS_MAP,\n PBR2_HAS_REFLECTANCE_FACTORS,\n} from \"../pbr-flag-bits.js\";\n\nconst STAGE_FRAGMENT = 0x2;\nconst PBR2_HAS_IRIDESCENCE_UV_TX = 1 << 20;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX = 1 << 21;\nconst PBR2_HAS_IRIDESCENCE_UV2 = 1 << 22;\nconst PBR2_HAS_IRIDESCENCE_THICKNESS_UV2 = 1 << 23;\nconst IRI_MSH_HAS_UV2 = 1 << 7;\n\nconst IRIDESCENCE_HELPERS = `const IRI_XYZ_TO_REC709:mat3x3<f32>=mat3x3<f32>(\n3.2404542,-0.9692660,0.0556434,\n-1.5371385,1.8760108,-0.2040259,\n-0.4985314,0.0415560,1.0572252);\nfn iri_square3(x:vec3<f32>)->vec3<f32>{return x*x;}\nfn iri_iorFromAirF0(f0:vec3<f32>)->vec3<f32>{\nlet s=sqrt(clamp(f0,vec3<f32>(0.0),vec3<f32>(0.9999)));\nreturn (vec3<f32>(1.0)+s)/(vec3<f32>(1.0)-s);\n}\nfn iri_r0FromIor3(iorT:vec3<f32>,iorI:f32)->vec3<f32>{return iri_square3((iorT-vec3<f32>(iorI))/(iorT+vec3<f32>(iorI)));}\nfn iri_r0FromIor(iorT:f32,iorI:f32)->f32{let r=(iorT-iorI)/(iorT+iorI);return r*r;}\nfn iri_fresSchlick(c:f32,F0:vec3<f32>,F90:vec3<f32>)->vec3<f32>{\nlet t=1.0-c;\nlet t2=t*t;\nreturn F0+(F90-F0)*(t2*t2*t);\n}\nfn iri_evalSensitivity(opd:f32,shift:vec3<f32>)->vec3<f32>{\nlet phase=6.283185307179586*opd*1.0e-9;\nlet val=vec3<f32>(5.4856e-13,4.4201e-13,5.2481e-13);\nlet pos=vec3<f32>(1.6810e+06,1.7953e+06,2.2084e+06);\nlet vr=vec3<f32>(4.3278e+09,9.3046e+09,6.6121e+09);\nvar xyz=val*sqrt(6.283185307179586*vr)*cos(pos*phase+shift)*exp(-(phase*phase)*vr);\nxyz.x=xyz.x+9.7470e-14*sqrt(6.283185307179586*4.5282e+09)*cos(2.2399e+06*phase+shift.x)*exp(-4.5282e+09*phase*phase);\nxyz=xyz/1.0685e-7;\nreturn IRI_XYZ_TO_REC709*xyz;\n}\nfn iri_eval(outsideIor:f32,eta2:f32,cosTheta1:f32,thickness:f32,baseF0:vec3<f32>)->vec3<f32>{\nlet iridescenceIor=mix(outsideIor,eta2,smoothstep(0.0,0.03,thickness));\nlet eta=outsideIor/iridescenceIor;\nlet sinTheta2Sq=eta*eta*(1.0-cosTheta1*cosTheta1);\nlet cosTheta2Sq=1.0-sinTheta2Sq;\nif(cosTheta2Sq<0.0){return vec3<f32>(1.0);}\nlet cosTheta2=sqrt(cosTheta2Sq);\nlet r0=iri_r0FromIor(iridescenceIor,outsideIor);\nlet r12=iri_fresSchlick(cosTheta1,vec3<f32>(r0),vec3<f32>(1.0)).x;\nlet t121=1.0-r12;\nvar phi12=0.0;\nif(iridescenceIor<outsideIor){phi12=3.141592653589793;}\nlet phi21=3.141592653589793-phi12;\nlet baseIor=iri_iorFromAirF0(baseF0);\nlet r1=iri_r0FromIor3(baseIor,iridescenceIor);\nlet r23=iri_fresSchlick(cosTheta2,r1,vec3<f32>(1.0));\nvar phi23=vec3<f32>(0.0);\nif(baseIor.x<iridescenceIor){phi23.x=3.141592653589793;}\nif(baseIor.y<iridescenceIor){phi23.y=3.141592653589793;}\nif(baseIor.z<iridescenceIor){phi23.z=3.141592653589793;}\nlet opd=2.0*iridescenceIor*thickness*cosTheta2;\nlet phi=vec3<f32>(phi21)+phi23;\nlet r123=clamp(vec3<f32>(r12)*r23,vec3<f32>(1e-5),vec3<f32>(0.9999));\nlet smallR123=sqrt(r123);\nlet rs=(t121*t121)*r23/(vec3<f32>(1.0)-r123);\nvar outI=vec3<f32>(r12)+rs;\nvar cm=rs-vec3<f32>(t121);\nfor(var m:i32=1;m<=2;m=m+1){\ncm=cm*smallR123;\noutI=outI+cm*(2.0*iri_evalSensitivity(f32(m)*opd,f32(m)*phi));\n}\nreturn max(outI,vec3<f32>(0.0));\n}`;\n\nconst IRI_TEX: ReadonlyArray<readonly [number, \"texture\" | \"thicknessTexture\"]> = [\n [PBR2_HAS_IRIDESCENCE_MAP, \"texture\"],\n [PBR2_HAS_IRIDESCENCE_THICKNESS_MAP, \"thicknessTexture\"],\n];\n\nfunction uvBaseExpr(features2: number, meshFeatures: number, uv2Flag: number): string {\n return (features2 & uv2Flag) !== 0 && (meshFeatures & IRI_MSH_HAS_UV2) !== 0 ? \"input.uv2\" : \"input.uv\";\n}\n\nfunction uvDecl(name: string, baseUv: string, hasTx: boolean): string {\n return hasTx ? `let ${name}=vec2<f32>(dot(material.${name}m.xy,${baseUv}),dot(material.${name}m.zw,${baseUv}))+material.${name}t.xy;` : `let ${name}=${baseUv};`;\n}\n\nfunction uvTransformUboFields(name: string): UboField[] {\n return [\n { _name: `${name}m`, _type: \"vec4<f32>\" },\n { _name: `${name}t`, _type: \"vec4<f32>\" },\n ];\n}\n\nfunction writeUvTransform(data: Float32Array, offsets: ReadonlyMap<string, number>, name: string, tex: Texture2D | undefined): void {\n const mOff = offsets.get(`${name}m`);\n const tOff = offsets.get(`${name}t`);\n if (mOff === undefined || tOff === undefined) {\n return;\n }\n const mi = mOff / 4;\n const ti = tOff / 4;\n const sx = tex?.uScale ?? 1;\n const sy = tex?.vScale ?? 1;\n const ang = tex?.uAng ?? 0;\n const ox = tex?.uOffset ?? 0;\n const oy = tex?.vOffset ?? 0;\n if (ang === 0) {\n data[mi] = sx;\n data[mi + 1] = 0;\n data[mi + 2] = 0;\n data[mi + 3] = sy;\n } else {\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n data[mi] = c * sx;\n data[mi + 1] = -s * sy;\n data[mi + 2] = s * sx;\n data[mi + 3] = c * sy;\n }\n data[ti] = ox;\n data[ti + 1] = oy;\n data[ti + 2] = 0;\n data[ti + 3] = 0;\n}\n\nfunction createIridescenceFragment(features: number, features2: number, meshFeatures: number): ShaderFragment | null {\n if ((features2 & PBR2_HAS_IRIDESCENCE) === 0) {\n return null;\n }\n const hasIntensityMap = (features2 & PBR2_HAS_IRIDESCENCE_MAP) !== 0;\n const hasThicknessMap = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_MAP) !== 0;\n const hasIntensityUvTx = (features2 & PBR2_HAS_IRIDESCENCE_UV_TX) !== 0;\n const hasThicknessUvTx = (features2 & PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX) !== 0;\n const bindings: BindingDecl[] = [];\n const uboFields: UboField[] = [{ _name: \"iridescenceParams\", _type: \"vec4<f32>\" }];\n if (hasIntensityMap) {\n bindings.push(\n { _name: \"iridescenceTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasIntensityUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceUV\"));\n }\n }\n if (hasThicknessMap) {\n bindings.push(\n { _name: \"iridescenceThicknessTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"iridescenceThicknessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n if (hasThicknessUvTx) {\n uboFields.push(...uvTransformUboFields(\"iridescenceThicknessUV\"));\n }\n }\n\n const scopeVars: string[] = [];\n if (hasIntensityMap) {\n scopeVars.push(uvDecl(\"iridescenceUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_UV2), hasIntensityUvTx));\n }\n if (hasThicknessMap) {\n scopeVars.push(uvDecl(\"iridescenceThicknessUV\", uvBaseExpr(features2, meshFeatures, PBR2_HAS_IRIDESCENCE_THICKNESS_UV2), hasThicknessUvTx));\n }\n\n const intensity = hasIntensityMap ? \"material.iridescenceParams.x*textureSample(iridescenceTexture,iridescenceSampler_,iridescenceUV).r\" : \"material.iridescenceParams.x\";\n const thickness = hasThicknessMap\n ? \"mix(material.iridescenceParams.z,material.iridescenceParams.w,textureSample(iridescenceThicknessTexture,iridescenceThicknessSampler_,iridescenceThicknessUV).g)\"\n : \"material.iridescenceParams.w\";\n return {\n _id: \"iridescence\",\n _dependencies:\n (features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) !== 0 || (features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0 ? [\"reflectance\"] : undefined,\n _uboFields: uboFields,\n _bindings: bindings,\n _helperFunctions: IRIDESCENCE_HELPERS,\n _fragmentSlots: {\n ...(scopeVars.length ? { SV: scopeVars.join(\"\\n\") } : undefined),\n MF: `{\nlet iriIntensity=clamp(${intensity},0.0,1.0);\nlet iriThickness=max(${thickness},0.0);\nlet iriF0=iri_eval(1.0,max(material.iridescenceParams.y,1.0001),NdotV,iriThickness,colorF0);\ncolorF0=mix(colorF0,iriF0,iriIntensity);\n}`,\n },\n };\n}\n\nexport function writeIridescenceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const iri = material.iridescence as IridescenceProps | undefined;\n if (!iri?.isEnabled || !offsets.has(\"iridescenceParams\")) {\n return;\n }\n const off = offsets.get(\"iridescenceParams\")! / 4;\n data[off] = iri.intensity ?? 1.0;\n data[off + 1] = iri.indexOfRefraction ?? 1.3;\n data[off + 2] = iri.minimumThickness ?? 100;\n data[off + 3] = iri.maximumThickness ?? 400;\n writeUvTransform(data, offsets, \"iridescenceUV\", iri.texture);\n writeUvTransform(data, offsets, \"iridescenceThicknessUV\", iri.thicknessTexture);\n}\n\nexport const pbrExt: PbrExt = {\n id: \"iridescence\",\n phase: \"base-tex\",\n detect(mat) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri?.isEnabled) {\n return { f: 0, f2: 0 };\n }\n let f2 = PBR2_HAS_IRIDESCENCE;\n if (iri.texture) {\n f2 |= PBR2_HAS_IRIDESCENCE_MAP;\n if ((iri.texture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV_TX;\n }\n if ((iri.texture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_UV2;\n }\n }\n if (iri.thicknessTexture) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_MAP;\n if ((iri.thicknessTexture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV_TX;\n }\n if ((iri.thicknessTexture as { _texCoord?: number })._texCoord === 1) {\n f2 |= PBR2_HAS_IRIDESCENCE_THICKNESS_UV2;\n }\n }\n return { f: 0, f2 };\n },\n frag: (ctx) => createIridescenceFragment(ctx._features, ctx._features2, ctx._meshFeatures),\n writeUbo: writeIridescenceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n const iri = (ctx._material as PbrMaterialProps).iridescence;\n if (!iri) {\n return b;\n }\n for (const [flag, key] of IRI_TEX) {\n const tex = iri[key];\n if ((ctx._features2 & flag) !== 0 && tex) {\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n }\n }\n return b;\n },\n textures(mat, t) {\n const iri = (mat as PbrMaterialProps).iridescence;\n if (!iri) {\n return;\n }\n for (const [, key] of IRI_TEX) {\n const tex = iri[key];\n if (tex) {\n t.push(tex);\n }\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const NME_LIGHTING_HELPER_KEY = "nme_lighting";
|
|
3
3
|
const NME_LIGHTING_HELPER_WGSL = `struct NmeLightResult {
|
|
4
4
|
diffuse: vec3<f32>,
|
|
@@ -120,4 +120,4 @@ const emitter = {
|
|
|
120
120
|
export {
|
|
121
121
|
emitter
|
|
122
122
|
};
|
|
123
|
-
//# sourceMappingURL=light-block-
|
|
123
|
+
//# sourceMappingURL=light-block-Np_h5gPI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light-block-
|
|
1
|
+
{"version":3,"file":"light-block-Np_h5gPI.js","sources":["../src/material/node/blocks/_lighting-helper.ts","../src/material/node/blocks/light-block.ts"],"sourcesContent":["/** Shared WGSL helper source for LightBlock.\n *\n * This module exports just the `nme_computeLighting` function definition.\n * The surrounding `LightEntry` / `lightsUniforms` struct decls and the\n * `@group(1) @binding(N) var<uniform> nmeLights` declaration are injected\n * by the pipeline builder (see node-pipeline.ts) once `state.usesLightsUbo`\n * is true. Keeping them out of the helper lets a single `MAX_LIGHTS` value\n * (at compile time) drive both the WGSL array length and the BGL entry size.\n */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport const NME_LIGHTING_HELPER_KEY = \"nme_lighting\";\n\nexport const NME_LIGHTING_HELPER_WGSL = `struct NmeLightResult {\n diffuse: vec3<f32>,\n specular: vec3<f32>,\n shadow: f32,\n};\n\nfn nme_computeLighting(\n worldPos: vec3<f32>,\n worldNormal: vec3<f32>,\n cameraPos: vec3<f32>,\n diffuseColor: vec3<f32>,\n specularColor: vec3<f32>,\n glossiness: f32,\n shadowFactors: array<f32, ${MAX_LIGHTS}>\n) -> NmeLightResult {\n var result: NmeLightResult;\n result.diffuse = vec3<f32>(0.0);\n result.specular = vec3<f32>(0.0);\n var aggShadow: f32 = 0.0;\n var numLights: f32 = 0.0;\n let viewDir = normalize(cameraPos - worldPos);\n let N = normalize(worldNormal);\n let lc = min(meshU.lc, ${MAX_LIGHTS}u);\n for (var i: u32 = 0u; i < lc; i = i + 1u) {\n let lightIndex = nli(i);\n let L = nmeLights.lights[lightIndex];\n let t = u32(L.vLightData.w);\n let sh = shadowFactors[lightIndex];\n var lv: vec3<f32>;\n var atten: f32 = 1.0;\n if (t == 3u) {\n // Hemispheric: ground/sky mix via half-lambert.\n let nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\n let diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\n result.diffuse = result.diffuse + diff * diffuseColor * sh;\n let H = normalize(viewDir + normalize(L.vLightData.xyz));\n let sf = pow(max(0.0, dot(N, H)), max(1.0, glossiness));\n result.specular = result.specular + sf * L.vLightSpecular.rgb * specularColor * sh;\n aggShadow = aggShadow + sh;\n numLights = numLights + 1.0;\n continue;\n }\n if (t == 1u) {\n // Directional: vLightData.xyz is the light's forward direction.\n lv = normalize(-L.vLightData.xyz);\n } else {\n // Point / Spot: vLightData.xyz is world-space position; range in vLightDiffuse.a.\n let d = L.vLightData.xyz - worldPos;\n atten = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\n lv = normalize(d);\n if (t == 2u) {\n // Spot cone falloff (vLightDirection.xyz=dir, .w=cosHalfAngle; vLightSpecular.a=exp).\n let c = max(0.0, dot(L.vLightDirection.xyz, -lv));\n if (c >= L.vLightDirection.w) {\n atten = atten * max(0.0, pow(c, L.vLightSpecular.a));\n } else {\n atten = 0.0;\n }\n }\n }\n let NdotL = max(0.0, dot(N, lv));\n result.diffuse = result.diffuse + L.vLightDiffuse.rgb * diffuseColor * NdotL * atten * sh;\n let H = normalize(lv + viewDir);\n let NdotH = max(0.0, dot(N, H));\n let specFactor = pow(NdotH, max(1.0, glossiness));\n result.specular = result.specular + L.vLightSpecular.rgb * specularColor * specFactor * atten * sh;\n aggShadow = aggShadow + sh;\n numLights = numLights + 1.0;\n }\n if (numLights > 0.0) {\n result.shadow = aggShadow / numLights;\n } else {\n result.shadow = 1.0;\n }\n return result;\n}\n`;\n","/** LightBlock — classic Blinn-Phong lighting.\n *\n * Inputs: worldPosition, worldNormal, cameraPosition, glossiness, glossPower\n * (optional), diffuseColor, specularColor.\n * Outputs: diffuseOutput (vec3), specularOutput (vec3), shadow (f32).\n *\n * The actual math lives in `_lighting-helper.ts` and is injected into the\n * fragment helper map. The pipeline builder is responsible for binding the\n * scene's Lights UBO under `nmeLights` / `nmeLightsCount` at group/binding\n * slots reserved for NME.\n */\n\nimport type { BlockEmitter, NodeExpr } from \"../node-types.js\";\nimport { NME_LIGHTING_HELPER_KEY, NME_LIGHTING_HELPER_WGSL } from \"./_lighting-helper.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(\n block: Parameters<BlockEmitter[\"emit\"]>[0],\n inputName: string,\n fallback: string,\n stage: Parameters<BlockEmitter[\"emit\"]>[2],\n state: Parameters<BlockEmitter[\"emit\"]>[3],\n ctx: Parameters<BlockEmitter[\"emit\"]>[4],\n target: \"vec3f\" | \"f32\"\n): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"LightBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n // Inject helper + mark the lights UBO as required.\n state.fragment.helpers.set(NME_LIGHTING_HELPER_KEY, NME_LIGHTING_HELPER_WGSL);\n state.usesLightsUbo = true;\n\n const memoKey = `_light_${block.id}_call`;\n const callExpr = state.fragment.memo.get(memoKey);\n let callVar: string;\n if (!callExpr) {\n const wp = resolveOptional(block, \"worldPosition\", \"vec3<f32>(0.0)\", stage, state, ctx, \"vec3f\");\n const wn = resolveOptional(block, \"worldNormal\", \"vec3<f32>(0.0, 1.0, 0.0)\", stage, state, ctx, \"vec3f\");\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", stage, state, ctx, \"vec3f\");\n const dc = resolveOptional(block, \"diffuseColor\", \"vec3<f32>(1.0)\", stage, state, ctx, \"vec3f\");\n const sc = resolveOptional(block, \"specularColor\", \"vec3<f32>(1.0)\", stage, state, ctx, \"vec3f\");\n const gl = resolveOptional(block, \"glossiness\", \"1.0\", stage, state, ctx, \"f32\");\n // BJS multiplies glossiness * glossPower; default glossPower is 1024 when unconnected.\n const gp = resolveOptional(block, \"glossPower\", \"1024.0\", stage, state, ctx, \"f32\");\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_lt${ctx.temp(state, \"light\")}`;\n state.fragment.body.push(`let ${callVar} = nme_computeLighting(${wp}, ${wn}, ${cp}, ${dc}, ${sc}, (${gl}) * (${gp}), ${sf});`);\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n } else {\n callVar = callExpr.expr;\n }\n\n const out: Record<string, NodeExpr> = {\n diffuseOutput: { expr: `${callVar}.diffuse`, type: \"vec3f\" },\n specularOutput: { expr: `${callVar}.specular`, type: \"vec3f\" },\n shadow: { expr: `${callVar}.shadow`, type: \"f32\" },\n };\n return out[outputName] ?? { expr: `${callVar}.diffuse`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":";AAYO,MAAM,0BAA0B;AAEhC,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAaR,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BASZ,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACpBxC,MAAM,qBAAqB,cAAc,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAEpG,SAAS,gBACL,OACA,WACA,UACA,OACA,OACA,KACA,QACM;AACN,QAAM,QAAQ,MAAM,OAAO,IAAI,SAAS;AACxC,MAAI,+BAAO,QAAQ;AACf,WAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,WAAW,OAAO,KAAK,GAAG,MAAM,EAAE;AAAA,EACzE;AACA,SAAO;AACX;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;AAEvC,UAAM,SAAS,QAAQ,IAAI,yBAAyB,wBAAwB;AAC5E,UAAM,gBAAgB;AAEtB,UAAM,UAAU,UAAU,MAAM,EAAE;AAClC,UAAM,WAAW,MAAM,SAAS,KAAK,IAAI,OAAO;AAChD,QAAI;AACJ,QAAI,CAAC,UAAU;AACX,YAAM,KAAK,gBAAgB,OAAO,iBAAiB,kBAAkB,OAAO,OAAO,KAAK,OAAO;AAC/F,YAAM,KAAK,gBAAgB,OAAO,eAAe,4BAA4B,OAAO,OAAO,KAAK,OAAO;AACvG,YAAM,KAAK,gBAAgB,OAAO,kBAAkB,oBAAoB,OAAO,OAAO,KAAK,OAAO;AAClG,YAAM,KAAK,gBAAgB,OAAO,gBAAgB,kBAAkB,OAAO,OAAO,KAAK,OAAO;AAC9F,YAAM,KAAK,gBAAgB,OAAO,iBAAiB,kBAAkB,OAAO,OAAO,KAAK,OAAO;AAC/F,YAAM,KAAK,gBAAgB,OAAO,cAAc,OAAO,OAAO,OAAO,KAAK,KAAK;AAE/E,YAAM,KAAK,gBAAgB,OAAO,cAAc,UAAU,OAAO,OAAO,KAAK,KAAK;AAClF,YAAM,KAAK,MAAM,aAAa,SAAS,IAAI,iCAAiC;AAC5E,gBAAU,MAAM,IAAI,KAAK,OAAO,OAAO,CAAC;AACxC,YAAM,SAAS,KAAK,KAAK,OAAO,OAAO,0BAA0B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI;AAC7H,YAAM,SAAS,KAAK,IAAI,SAAS,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,IACrE,OAAO;AACH,gBAAU,SAAS;AAAA,IACvB;AAEA,UAAM,MAAgC;AAAA,MAClC,eAAe,EAAE,MAAM,GAAG,OAAO,YAAY,MAAM,QAAA;AAAA,MACnD,gBAAgB,EAAE,MAAM,GAAG,OAAO,aAAa,MAAM,QAAA;AAAA,MACrD,QAAQ,EAAE,MAAM,GAAG,OAAO,WAAW,MAAM,MAAA;AAAA,IAAM;AAErD,WAAO,IAAI,UAAU,KAAK,EAAE,MAAM,GAAG,OAAO,YAAY,MAAM,QAAA;AAAA,EAClE;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aU as WGSL } from "./index-B7Qhw0xL.js";
|
|
2
2
|
function loopKey(stage, blockId) {
|
|
3
3
|
return `${stage}|${blockId}`;
|
|
4
4
|
}
|
|
@@ -68,4 +68,4 @@ const emitter = {
|
|
|
68
68
|
export {
|
|
69
69
|
emitter
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=loop-block-
|
|
71
|
+
//# sourceMappingURL=loop-block-BFkLFYGm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop-block-
|
|
1
|
+
{"version":3,"file":"loop-block-BFkLFYGm.js","sources":["../src/material/node/blocks/loop-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, Stage } from \"../node-types.js\";\nimport { WGSL } from \"../node-types.js\";\n\nfunction loopKey(stage: Stage, blockId: number): string {\n return `${stage}|${blockId}`;\n}\n\nfunction storageWritesForLoop(block: NodeBlock, ctx: Parameters<BlockEmitter[\"emit\"]>[4]): NodeBlock[] {\n const writes: NodeBlock[] = [];\n for (const candidate of ctx.graph.blocks.values()) {\n if (candidate.className !== \"StorageWriteBlock\") {\n continue;\n }\n const loopID = candidate.inputs.get(\"loopID\")?.source;\n if (loopID?.blockId === block.id && loopID.outputName === \"loopID\") {\n writes.push(candidate);\n }\n }\n return writes;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"LoopBlock\",\n emit(block, outputName, stage, state, ctx) {\n const active = state.loopVariables.get(loopKey(stage, block.id));\n if (outputName === \"index\") {\n if (!active) {\n throw new Error(`LoopBlock \"${block.name}\": index can only be read while emitting the loop body`);\n }\n return { expr: `f32(${active.indexVar})`, type: \"f32\" };\n }\n if (outputName === \"loopID\") {\n throw new Error(`LoopBlock \"${block.name}\": loopID can only be consumed by StorageReadBlock/StorageWriteBlock`);\n }\n if (outputName !== \"output\") {\n throw new Error(`LoopBlock \"${block.name}\": unsupported output \"${outputName}\"`);\n }\n\n const initial = ctx.resolve(block, \"input\", stage, state);\n const valueVar = ctx.temp(state, \"loop\");\n const indexVar = ctx.temp(state, \"loopIndex\");\n const body = stage === \"vertex\" ? state.vertex.body : state.fragment.body;\n body.push(`var ${valueVar}: ${WGSL[initial.type]} = ${initial.expr};`);\n\n const iterationsInput = block.inputs.get(\"iterations\");\n const iterations = iterationsInput?.source\n ? `i32(${ctx.cast(ctx.resolve(block, \"iterations\", stage, state), \"f32\").expr})`\n : String(Math.max(0, Math.floor((block.serialized[\"iterations\"] as number | undefined) ?? 4)));\n\n body.push(`for (var ${indexVar} = 0; ${indexVar} < ${iterations}; ${indexVar} = ${indexVar} + 1) {`);\n const key = loopKey(stage, block.id);\n const previous = state.loopVariables.get(key);\n const stageState = stage === \"vertex\" ? state.vertex : state.fragment;\n const previousMemo = new Map(stageState.memo);\n state.loopVariables.set(key, { valueVar, valueType: initial.type, indexVar });\n try {\n for (const write of storageWritesForLoop(block, ctx)) {\n const value = ctx.cast(ctx.resolve(write, \"value\", stage, state), initial.type);\n body.push(`${valueVar} = ${value.expr};`);\n }\n } finally {\n stageState.memo.clear();\n for (const [memoKey, memoValue] of previousMemo) {\n stageState.memo.set(memoKey, memoValue);\n }\n if (previous) {\n state.loopVariables.set(key, previous);\n } else {\n state.loopVariables.delete(key);\n }\n }\n body.push(\"}\");\n return { expr: valueVar, type: initial.type };\n },\n};\n"],"names":[],"mappings":";AAGA,SAAS,QAAQ,OAAc,SAAyB;AACpD,SAAO,GAAG,KAAK,IAAI,OAAO;AAC9B;AAEA,SAAS,qBAAqB,OAAkB,KAAuD;;AACnG,QAAM,SAAsB,CAAA;AAC5B,aAAW,aAAa,IAAI,MAAM,OAAO,UAAU;AAC/C,QAAI,UAAU,cAAc,qBAAqB;AAC7C;AAAA,IACJ;AACA,UAAM,UAAS,eAAU,OAAO,IAAI,QAAQ,MAA7B,mBAAgC;AAC/C,SAAI,iCAAQ,aAAY,MAAM,MAAM,OAAO,eAAe,UAAU;AAChE,aAAO,KAAK,SAAS;AAAA,IACzB;AAAA,EACJ;AACA,SAAO;AACX;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;AACvC,UAAM,SAAS,MAAM,cAAc,IAAI,QAAQ,OAAO,MAAM,EAAE,CAAC;AAC/D,QAAI,eAAe,SAAS;AACxB,UAAI,CAAC,QAAQ;AACT,cAAM,IAAI,MAAM,cAAc,MAAM,IAAI,wDAAwD;AAAA,MACpG;AACA,aAAO,EAAE,MAAM,OAAO,OAAO,QAAQ,KAAK,MAAM,MAAA;AAAA,IACpD;AACA,QAAI,eAAe,UAAU;AACzB,YAAM,IAAI,MAAM,cAAc,MAAM,IAAI,sEAAsE;AAAA,IAClH;AACA,QAAI,eAAe,UAAU;AACzB,YAAM,IAAI,MAAM,cAAc,MAAM,IAAI,0BAA0B,UAAU,GAAG;AAAA,IACnF;AAEA,UAAM,UAAU,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACxD,UAAM,WAAW,IAAI,KAAK,OAAO,MAAM;AACvC,UAAM,WAAW,IAAI,KAAK,OAAO,WAAW;AAC5C,UAAM,OAAO,UAAU,WAAW,MAAM,OAAO,OAAO,MAAM,SAAS;AACrE,SAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AAErE,UAAM,kBAAkB,MAAM,OAAO,IAAI,YAAY;AACrD,UAAM,cAAa,mDAAiB,UAC9B,OAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,cAAc,OAAO,KAAK,GAAG,KAAK,EAAE,IAAI,MAC3E,OAAO,KAAK,IAAI,GAAG,KAAK,MAAO,MAAM,WAAW,YAAY,KAA4B,CAAC,CAAC,CAAC;AAEjG,SAAK,KAAK,YAAY,QAAQ,SAAS,QAAQ,MAAM,UAAU,KAAK,QAAQ,MAAM,QAAQ,SAAS;AACnG,UAAM,MAAM,QAAQ,OAAO,MAAM,EAAE;AACnC,UAAM,WAAW,MAAM,cAAc,IAAI,GAAG;AAC5C,UAAM,aAAa,UAAU,WAAW,MAAM,SAAS,MAAM;AAC7D,UAAM,eAAe,IAAI,IAAI,WAAW,IAAI;AAC5C,UAAM,cAAc,IAAI,KAAK,EAAE,UAAU,WAAW,QAAQ,MAAM,UAAU;AAC5E,QAAI;AACA,iBAAW,SAAS,qBAAqB,OAAO,GAAG,GAAG;AAClD,cAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK,GAAG,QAAQ,IAAI;AAC9E,aAAK,KAAK,GAAG,QAAQ,MAAM,MAAM,IAAI,GAAG;AAAA,MAC5C;AAAA,IACJ,UAAA;AACI,iBAAW,KAAK,MAAA;AAChB,iBAAW,CAAC,SAAS,SAAS,KAAK,cAAc;AAC7C,mBAAW,KAAK,IAAI,SAAS,SAAS;AAAA,MAC1C;AACA,UAAI,UAAU;AACV,cAAM,cAAc,IAAI,KAAK,QAAQ;AAAA,MACzC,OAAO;AACH,cAAM,cAAc,OAAO,GAAG;AAAA,MAClC;AAAA,IACJ;AACA,SAAK,KAAK,GAAG;AACb,WAAO,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAA;AAAA,EAC3C;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b1 as computeUboLayout, a$ as SCENE_UBO_WGSL } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_VERTEX = 1;
|
|
3
3
|
const STAGE_FRAGMENT = 2;
|
|
4
4
|
function topoSort(fragments) {
|
|
@@ -82,7 +82,10 @@ function bglEntry(binding, decl) {
|
|
|
82
82
|
break;
|
|
83
83
|
case "texture": {
|
|
84
84
|
const def = decl._type._textureType === "texture_depth_2d" ? "depth" : decl._type._textureType === "texture_2d<u32>" ? "uint" : "float";
|
|
85
|
-
e.texture = {
|
|
85
|
+
e.texture = {
|
|
86
|
+
sampleType: decl._type._sampleType ?? def,
|
|
87
|
+
viewDimension: decl._type._textureType.includes("array") ? "2d-array" : decl._type._textureType.includes("cube") ? "cube" : "2d"
|
|
88
|
+
};
|
|
86
89
|
break;
|
|
87
90
|
}
|
|
88
91
|
case "sampler":
|
|
@@ -338,4 +341,4 @@ export {
|
|
|
338
341
|
MSH_HAS_VERTEX_COLOR as h,
|
|
339
342
|
MSH_HAS_INSTANCE_COLOR as i
|
|
340
343
|
};
|
|
341
|
-
//# sourceMappingURL=mesh-features-
|
|
344
|
+
//# sourceMappingURL=mesh-features-BAJpbMog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-features-BAJpbMog.js","sources":["../src/shader/shader-composer.ts","../src/material/mesh-features.ts"],"sourcesContent":["/**\n * Shader Composer — assembles ShaderFragment[] + ShaderTemplate into\n * final WGSL source + GPU layout descriptors. Pure function, no global state.\n * All shader text comes from template + fragment modules.\n */\nimport type { BindingDecl, ComposedShader, FragmentSlot, ShaderFragment, ShaderTemplate, VertexAttribute, VertexSlot, Varying } from \"./fragment-types.js\";\nimport { computeUboLayout } from \"./ubo-layout.js\";\nimport { SCENE_UBO_WGSL } from \"./scene-uniforms.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nfunction topoSort(fragments: readonly ShaderFragment[]): ShaderFragment[] {\n const byId = new Map<string, ShaderFragment>();\n for (const f of fragments) {\n if (byId.has(f._id)) {\n throw Error();\n }\n byId.set(f._id, f);\n }\n const inDeg = new Map<string, number>();\n const deps = new Map<string, string[]>();\n for (const f of fragments) {\n if (!inDeg.has(f._id)) {\n inDeg.set(f._id, 0);\n }\n for (const d of f._dependencies ?? []) {\n if (!byId.has(d)) {\n throw Error();\n }\n inDeg.set(f._id, (inDeg.get(f._id) ?? 0) + 1);\n let arr = deps.get(d);\n if (!arr) {\n arr = [];\n deps.set(d, arr);\n }\n arr.push(f._id);\n }\n }\n const q: string[] = [];\n for (const [id, d] of inDeg) {\n if (d === 0) {\n q.push(id);\n }\n }\n q.sort();\n const out: ShaderFragment[] = [];\n let qi = 0;\n while (qi < q.length) {\n const id = q[qi++]!;\n out.push(byId.get(id)!);\n for (const d of deps.get(id) ?? []) {\n const nd = (inDeg.get(d) ?? 1) - 1;\n inDeg.set(d, nd);\n if (nd === 0) {\n let i = qi;\n while (i < q.length && q[i]! < d) {\n i++;\n }\n q.splice(i, 0, d);\n }\n }\n }\n if (out.length !== fragments.length) {\n throw Error();\n }\n return out;\n}\n\nfunction dedup<T extends { _name: string }>(base: readonly T[], extra: readonly T[]): T[] {\n const seen = new Set<string>();\n const all: T[] = [];\n for (const v of base) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n for (const v of extra) {\n if (!seen.has(v._name)) {\n seen.add(v._name);\n all.push(v);\n }\n }\n return all;\n}\n\nfunction bglEntry(binding: number, decl: BindingDecl): GPUBindGroupLayoutEntry {\n const e: GPUBindGroupLayoutEntry = { binding, visibility: decl._visibility };\n switch (decl._type._kind) {\n case \"uniform-buffer\":\n e.buffer = { type: \"uniform\" };\n break;\n case \"texture\": {\n const def = decl._type._textureType === \"texture_depth_2d\" ? \"depth\" : decl._type._textureType === \"texture_2d<u32>\" ? \"uint\" : \"float\";\n e.texture = {\n sampleType: (decl._type._sampleType ?? def) as GPUTextureSampleType,\n viewDimension: decl._type._textureType.includes(\"array\") ? \"2d-array\" : decl._type._textureType.includes(\"cube\") ? \"cube\" : \"2d\",\n };\n break;\n }\n case \"sampler\":\n e.sampler = {\n type: decl._type._samplerType === \"sampler_comparison\" ? \"comparison\" : decl._type._samplerType === \"sampler_non_filtering\" ? \"non-filtering\" : \"filtering\",\n };\n break;\n case \"storage-texture\":\n e.storageTexture = { access: decl._type._access as GPUStorageTextureAccess, format: decl._type._format as GPUTextureFormat };\n break;\n }\n return e;\n}\n\nfunction declWGSL(g: number, b: number, d: BindingDecl): string {\n switch (d._type._kind) {\n case \"uniform-buffer\":\n return `@group(${g})@binding(${b}) var<uniform> ${d._name}:${d._name}Uniforms;`;\n case \"texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._textureType};`;\n case \"sampler\":\n return `@group(${g})@binding(${b}) var ${d._name}:${d._type._samplerType === \"sampler_non_filtering\" ? \"sampler\" : d._type._samplerType};`;\n case \"storage-texture\":\n return `@group(${g})@binding(${b}) var ${d._name}:texture_storage_2d<${d._type._format},${d._type._access}>;`;\n }\n}\n\nconst SLOT_RE = /\\/\\*([A-Z_0-9]+)\\*\\//g;\nfunction injectSlots(tpl: string, sorted: readonly ShaderFragment[], key: \"_fragmentSlots\" | \"_vertexSlots\"): string {\n return tpl.replace(SLOT_RE, (_, slot: string) => {\n const parts: string[] = [];\n for (const f of sorted) {\n const s = f[key] as Partial<Record<FragmentSlot | VertexSlot, string>> | undefined;\n if (s?.[slot as FragmentSlot | VertexSlot]) {\n parts.push(s[slot as FragmentSlot | VertexSlot]!);\n }\n }\n return parts.join(\"\\n\");\n });\n}\n\nexport function composeShader(template: ShaderTemplate, fragments: readonly ShaderFragment[]): ComposedShader {\n const sorted = topoSort(fragments);\n\n // Collect fragment data\n const fragAttrs: VertexAttribute[] = [];\n const fragVaryings: Varying[] = [];\n const helpers: string[] = [];\n const vHelpers: string[] = [];\n const vBuiltins: string[] = [];\n for (const f of sorted) {\n if (f._vertexAttributes) {\n fragAttrs.push(...f._vertexAttributes);\n }\n if (f._varyings) {\n fragVaryings.push(...f._varyings);\n }\n if (f._helperFunctions) {\n helpers.push(f._helperFunctions);\n }\n if (f._vertexHelperFunctions) {\n vHelpers.push(f._vertexHelperFunctions);\n }\n for (const b of f._vertexBuiltins ?? []) {\n vBuiltins.push(`@builtin(${b._builtin}) ${b._name}:${b._type},`);\n }\n }\n\n // Vertex attributes + layouts\n const allAttrs = dedup(template._baseVertexAttributes, fragAttrs);\n const inputLines: string[] = [];\n const _vertexBufferLayouts: GPUVertexBufferLayout[] = [];\n const groups = new Map<string, { loc: number; off: number; fmt: GPUVertexFormat }[]>();\n const firstOfGroup = new Map<string, VertexAttribute>();\n for (let i = 0; i < allAttrs.length; i++) {\n const a = allAttrs[i]!;\n inputLines.push(`@location(${i}) ${a._name}:${a._type},`);\n if (a._bufferGroup) {\n if (!groups.has(a._bufferGroup)) {\n groups.set(a._bufferGroup, []);\n firstOfGroup.set(a._bufferGroup, a);\n }\n groups.get(a._bufferGroup)!.push({ loc: i, off: a._offset ?? 0, fmt: a._gpuFormat });\n } else {\n _vertexBufferLayouts.push({\n arrayStride: a._arrayStride,\n stepMode: a._stepMode ?? \"vertex\",\n attributes: [{ shaderLocation: i, offset: a._offset ?? 0, format: a._gpuFormat }],\n });\n }\n }\n for (const [grp, attrs] of groups) {\n const f = firstOfGroup.get(grp)!;\n _vertexBufferLayouts.push({\n arrayStride: f._arrayStride,\n stepMode: f._stepMode ?? \"vertex\",\n attributes: attrs.map((a) => ({ shaderLocation: a.loc, offset: a.off, format: a.fmt })),\n });\n }\n let nextLoc = allAttrs.length;\n for (const f of sorted) {\n if (f._pipelineVertexBuffers) {\n const r = f._pipelineVertexBuffers(nextLoc);\n _vertexBufferLayouts.push(...r._buffers);\n nextLoc = r._nextLoc;\n }\n }\n\n // Varyings\n const allVary = dedup(template._baseVaryings, fragVaryings);\n const varyBody = `@builtin(position) clipPos:vec4f,\\n` + allVary.map((v, i) => `@location(${i}) ${v._name}:${v._type},`).join(\"\\n\");\n\n // UBO layouts\n const hasMaterialUbo = !!(template._baseMaterialUboFields && template._baseMaterialUboFields.length > 0);\n const meshFields = [...template._baseMeshUboFields];\n const materialFields = hasMaterialUbo ? [...template._baseMaterialUboFields] : [];\n for (const f of sorted) {\n if (f._uboFields?.length) {\n (hasMaterialUbo ? materialFields : meshFields).push(...f._uboFields);\n }\n }\n const _meshUboSpec = computeUboLayout(meshFields);\n const _materialUboSpec = hasMaterialUbo ? computeUboLayout(materialFields) : undefined;\n\n // Bindings\n const meshBGL: GPUBindGroupLayoutEntry[] = [{ binding: 0, visibility: STAGE_VERTEX | STAGE_FRAGMENT, buffer: { type: \"uniform\" } }];\n if (hasMaterialUbo) {\n meshBGL.push({ binding: 1, visibility: STAGE_FRAGMENT, buffer: { type: \"uniform\" } });\n }\n const shadowBGL: GPUBindGroupLayoutEntry[] = [];\n const vDecls: string[] = [];\n const fDecls: string[] = [];\n let mb = hasMaterialUbo ? 2 : 1,\n sb = 0;\n\n function addBinding(d: BindingDecl, _isVertex: boolean) {\n const isShadow = d._group === \"shadow\";\n const b = isShadow ? sb++ : mb++;\n const g = isShadow ? 2 : 1;\n (isShadow ? shadowBGL : meshBGL).push(bglEntry(b, d));\n const w = declWGSL(g, b, d);\n if (d._visibility & STAGE_VERTEX) {\n vDecls.push(w);\n }\n if (d._visibility & STAGE_FRAGMENT) {\n fDecls.push(w);\n }\n }\n\n for (const d of template._baseVertexBindings ?? []) {\n addBinding(d, true);\n }\n for (const f of sorted) {\n for (const d of f._vertexBindings ?? []) {\n addBinding(d, true);\n }\n }\n for (const d of template._baseBindings ?? []) {\n addBinding(d, false);\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => (b._group ?? \"mesh\") === \"mesh\")) {\n addBinding(d, false);\n }\n }\n for (const f of sorted) {\n for (const d of (f._bindings ?? []).filter((b) => b._group === \"shadow\")) {\n addBinding(d, false);\n }\n }\n\n const _fragmentKey = sorted.map((f) => f._id).join(\"|\");\n const vParams = (vBuiltins.length ? vBuiltins.join(\"\\n\") + \"\\n\" : \"\") + inputLines.join(\"\\n\");\n const meshStruct = `struct MeshUniforms{\\n${_meshUboSpec._structBody}\\n}`;\n const materialStruct = _materialUboSpec ? `\\nstruct MaterialUniforms{\\n${_materialUboSpec._structBody}\\n}\\n@group(1)@binding(1) var<uniform> material:MaterialUniforms;` : \"\";\n\n let _vertexWGSL = template._vertexTemplate;\n _vertexWGSL = _vertexWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _vertexWGSL = _vertexWGSL.replace(\"/*MU*/\", meshStruct);\n _vertexWGSL = _vertexWGSL.replace(\"/*VI*/\", `struct VertexInput{\\n${inputLines.join(\"\\n\")}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VO*/\", `struct VertexOutput{\\n${varyBody}\\n}`);\n _vertexWGSL = _vertexWGSL.replace(\"/*VD*/\", vDecls.join(\"\\n\"));\n _vertexWGSL = _vertexWGSL.replace(\"/*VP*/\", vParams);\n _vertexWGSL = _vertexWGSL.replace(\"/*VH*/\", vHelpers.join(\"\\n\"));\n // These dynamic keys are reserved from Terser property mangling in bundle-scenes-core.ts.\n _vertexWGSL = injectSlots(_vertexWGSL, sorted, \"_vertexSlots\");\n\n let _fragmentWGSL = template._fragmentTemplate;\n _fragmentWGSL = _fragmentWGSL.replace(\"/*SU*/\", SCENE_UBO_WGSL);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*MU*/\", meshStruct + materialStruct);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FI*/\", `struct FragmentInput{\\n${varyBody}\\n}`);\n _fragmentWGSL = _fragmentWGSL.replace(\"/*HF*/\", helpers.join(\"\\n\"));\n _fragmentWGSL = _fragmentWGSL.replace(\"/*FB*/\", fDecls.join(\"\\n\"));\n _fragmentWGSL = injectSlots(_fragmentWGSL, sorted, \"_fragmentSlots\");\n\n const _meshBGLDescriptor = { entries: meshBGL };\n const _shadowBGLDescriptor = shadowBGL.length ? { entries: shadowBGL } : null;\n\n return {\n _vertexWGSL,\n _fragmentWGSL,\n _meshBGLDescriptor,\n _shadowBGLDescriptor,\n _vertexBufferLayouts,\n _meshUboSpec,\n _materialUboSpec,\n _fragmentKey,\n };\n}\n","import type { Mesh } from \"../mesh/mesh.js\";\n\nexport const MSH_HAS_TANGENTS = 1 << 0;\nexport const MSH_HAS_SKELETON = 1 << 1;\nexport const MSH_HAS_SKELETON_8 = 1 << 2;\nexport const MSH_HAS_MORPH_TARGETS = 1 << 3;\nexport const MSH_HAS_THIN_INSTANCES = 1 << 4;\nexport const MSH_HAS_INSTANCE_COLOR = 1 << 5;\nexport const MSH_HAS_VERTEX_COLOR = 1 << 6;\nexport const MSH_HAS_UV2 = 1 << 7;\nexport const MSH_RECEIVE_SHADOWS = 1 << 8;\n\n/** @internal Compute mesh/pass feature bits shared by material renderers. */\nexport function _computeMeshFeatures(mesh: Mesh, receiveShadows = false): number {\n const gpu = mesh._gpu;\n let features = 0;\n if (gpu.tangentBuffer) {\n features |= MSH_HAS_TANGENTS;\n }\n if (mesh.skeleton) {\n features |= MSH_HAS_SKELETON;\n if (mesh.skeleton.joints1Buffer) {\n features |= MSH_HAS_SKELETON_8;\n }\n }\n if (mesh.morphTargets) {\n features |= MSH_HAS_MORPH_TARGETS;\n }\n if (mesh.thinInstances) {\n features |= MSH_HAS_THIN_INSTANCES;\n if (mesh.thinInstances.colors) {\n features |= MSH_HAS_INSTANCE_COLOR;\n }\n }\n if (gpu.colorBuffer) {\n features |= MSH_HAS_VERTEX_COLOR;\n }\n if (gpu.uv2Buffer) {\n features |= MSH_HAS_UV2;\n }\n if (receiveShadows) {\n features |= MSH_RECEIVE_SHADOWS;\n }\n return features;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as MSH_HAS_MORPH_TARGETS } from "./mesh-features-
|
|
1
|
+
import { b as MSH_HAS_MORPH_TARGETS } from "./mesh-features-BAJpbMog.js";
|
|
2
2
|
const STAGE_VERTEX = 1;
|
|
3
3
|
const MORPH_PRE_SKINNING = `var morphedPos = position;
|
|
4
4
|
var morphedNorm = normal;
|
|
@@ -56,4 +56,4 @@ export {
|
|
|
56
56
|
createMorphFragment,
|
|
57
57
|
pbrExt
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=morph-fragment-
|
|
59
|
+
//# sourceMappingURL=morph-fragment-DqH-w61u.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morph-fragment-
|
|
1
|
+
{"version":3,"file":"morph-fragment-DqH-w61u.js","sources":["../src/material/pbr/fragments/morph-fragment.ts"],"sourcesContent":["/**\n * Morph Target Fragment\n *\n * Vertex-stage morph target animation: texture-based morph deltas\n * applied before skinning. Only bundled when a scene uses morph targets.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\n\n// WebGPU shader stage constants\nconst STAGE_VERTEX = 0x1;\n\nconst MORPH_PRE_SKINNING = `var morphedPos = position;\nvar morphedNorm = normal;\nlet mCol = i32(vertexIndex % morph.texWidth);\nlet mRowInBand = i32(vertexIndex / morph.texWidth);\nfor (var i = 0u; i < morph.count; i = i + 1u) {\n let w = morph.weights[i];\n let posBase = i32(i * 2u) * i32(morph.rowsPerBand);\n let normBase = i32(i * 2u + 1u) * i32(morph.rowsPerBand);\n morphedPos = morphedPos + w * textureLoad(morphTargets, vec2<i32>(mCol, posBase + mRowInBand), 0).xyz;\n morphedNorm = morphedNorm + w * textureLoad(morphTargets, vec2<i32>(mCol, normBase + mRowInBand), 0).xyz;\n}`;\n\n/**\n * Create a morph target fragment.\n * The morph extension modifies position/normal variables before the world\n * transform, using morphedPos/morphedNorm in place of position/normal.\n */\nexport function createMorphFragment(): ShaderFragment {\n return {\n _id: \"morph\",\n\n _vertexBuiltins: [{ _name: \"vertexIndex\", _builtin: \"vertex_index\", _type: \"u32\" }],\n\n _vertexHelperFunctions: `struct morphUniforms {\\nweights: vec4<f32>,\\ncount: u32,\\ntexWidth: u32,\\nrowsPerBand: u32,\\n_p0: u32,\\n}`,\n\n _vertexBindings: [\n { _name: \"morphTargets\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" as const, _sampleType: \"unfilterable-float\" as const }, _visibility: STAGE_VERTEX },\n { _name: \"morph\", _type: { _kind: \"uniform-buffer\" as const }, _visibility: STAGE_VERTEX },\n ],\n\n _vertexSlots: {\n VR: MORPH_PRE_SKINNING,\n },\n };\n}\n\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { MSH_HAS_MORPH_TARGETS } from \"../../mesh-features.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"morph\",\n phase: \"vertex\",\n frag(ctx) {\n if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS)) {\n return null;\n }\n return createMorphFragment();\n },\n bind(ctx, entries, b) {\n const mesh = ctx._mesh;\n if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS) || !mesh?.morphTargets) {\n return b;\n }\n entries.push({ binding: b++, resource: mesh.morphTargets.texture.createView() });\n // Weights UBO is pushed separately by the pipeline (needs engine-side buffer handle).\n // Caller supplies weightsBuffer on mesh.morphTargets.\n if (mesh.morphTargets.weightsBuffer) {\n entries.push({ binding: b++, resource: { buffer: mesh.morphTargets.weightsBuffer } });\n }\n return b;\n },\n};\n"],"names":[],"mappings":";AAUA,MAAM,eAAe;AAErB,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpB,SAAS,sBAAsC;AAClD,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,iBAAiB,CAAC,EAAE,OAAO,eAAe,UAAU,gBAAgB,OAAO,OAAO;AAAA,IAElF,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAExB,iBAAiB;AAAA,MACb,EAAE,OAAO,gBAAgB,OAAO,EAAE,OAAO,WAAW,cAAc,mBAA4B,aAAa,wBAAiC,aAAa,aAAA;AAAA,MACzJ,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,iBAAA,GAA6B,aAAa,aAAA;AAAA,IAAa;AAAA,IAG7F,cAAc;AAAA,MACV,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAKO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,QAAI,EAAE,IAAI,gBAAgB,wBAAwB;AAC9C,aAAO;AAAA,IACX;AACA,WAAO,oBAAA;AAAA,EACX;AAAA,EACA,KAAK,KAAK,SAAS,GAAG;AAClB,UAAM,OAAO,IAAI;AACjB,QAAI,EAAE,IAAI,gBAAgB,0BAA0B,EAAC,6BAAM,eAAc;AACrE,aAAO;AAAA,IACX;AACA,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,aAAa,QAAQ,WAAA,EAAW,CAAG;AAG/E,QAAI,KAAK,aAAa,eAAe;AACjC,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,QAAQ,KAAK,aAAa,cAAA,EAAc,CAAG;AAAA,IACxF;AACA,WAAO;AAAA,EACX;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
|
|
2
2
|
function MULTI_LIGHT_STRUCTS() {
|
|
3
3
|
return `
|
|
4
4
|
struct LightEntry {
|
|
@@ -63,7 +63,7 @@ var directSpecular = vec3<f32>(0.0);
|
|
|
63
63
|
let directRoughness = max(roughness, AA_factor_x);
|
|
64
64
|
let directAlphaG = directRoughness * directRoughness + 0.0005;
|
|
65
65
|
var shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill("1.0").join(", ")});
|
|
66
|
-
let
|
|
66
|
+
let lightCount = min(mesh.lc, ${MAX_LIGHTS}u);
|
|
67
67
|
/*AS*/
|
|
68
68
|
// First-light aliases — kept at directLightBlock scope so the AD slot below
|
|
69
69
|
// (clearcoat / sheen / subsurface) sees the same single-light variable names
|
|
@@ -79,7 +79,7 @@ let lightAtten = pl0.atten * shadowFactors[lightIndex0];
|
|
|
79
79
|
let H = normalize(V + L);
|
|
80
80
|
let NdotH = clamp(dot(N, H), 0.0000001, 1.0);
|
|
81
81
|
let VdotH = saturate(dot(V, H));
|
|
82
|
-
for (var li = 0u; li <
|
|
82
|
+
for (var li = 0u; li < lightCount; li++) {
|
|
83
83
|
var pl: PbrLightResult;
|
|
84
84
|
let lightIndex = mli(li);
|
|
85
85
|
if (li == 0u) { pl = pl0; } else { pl = computePbrLight(lights.lights[lightIndex], N, input.worldPos, material.lightFalloffMode); }
|
|
@@ -109,4 +109,4 @@ export {
|
|
|
109
109
|
MULTI_LIGHT_STRUCTS,
|
|
110
110
|
getMultiLightLoop
|
|
111
111
|
};
|
|
112
|
-
//# sourceMappingURL=multilight-wgsl-
|
|
112
|
+
//# sourceMappingURL=multilight-wgsl-B9Mf9d-q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multilight-wgsl-
|
|
1
|
+
{"version":3,"file":"multilight-wgsl-B9Mf9d-q.js","sources":["../src/material/pbr/fragments/multilight-wgsl.ts"],"sourcesContent":["/** Multi-light WGSL helpers for PBR template.\n * Separated into its own module so non-shadow PBR scenes don't pay the bundle cost. */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function MULTI_LIGHT_STRUCTS(): string {\n return `\nstruct LightEntry {\nvLightData: vec4<f32>,\nvLightDiffuse: vec4<f32>,\nvLightSpecular: vec4<f32>,\nvLightDirection: vec4<f32>,\n};\nstruct lightsUniforms {\ncount: u32, _p0: u32, _p1: u32, _p2: u32,\nlights: array<LightEntry, ${MAX_LIGHTS}>,\n};\n`;\n}\n\nexport const COMPUTE_PBR_LIGHT = `\nstruct PbrLightResult { L: vec3<f32>, NdotL: f32, atten: f32, color: vec3<f32>, specColor: vec3<f32>, isHemi: bool };\nfn computePbrLight(entry: LightEntry, N: vec3<f32>, worldPos: vec3<f32>, lightFalloffMode: f32) -> PbrLightResult {\nvar r: PbrLightResult;\nlet t = u32(entry.vLightData.w);\nr.isHemi = t == 3u;\nr.specColor = entry.vLightDiffuse.rgb;\nif (t == 3u) {\nr.L = normalize(entry.vLightData.xyz);\nr.NdotL = dot(N, r.L) * 0.5 + 0.5;\nr.atten = 1.0;\nr.color = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, r.NdotL);\nreturn r;\n}\nif (t == 1u) {\nr.L = normalize(-entry.vLightData.xyz);\nr.atten = 1.0;\n} else {\nlet toLight = entry.vLightData.xyz - worldPos;\nlet d2 = dot(toLight, toLight);\nlet dist = sqrt(d2);\nr.L = toLight / max(dist, 0.0001);\n let physicalFalloff = lightFalloffMode >= 0.5;\n let rangeAtt = select(max(0.0, 1.0 - dist / entry.vLightDiffuse.a), 1.0 / max(d2, 0.0000001), physicalFalloff);\n if (t == 2u) {\n let cosHalfAngle = entry.vLightDirection.w;\n let c = dot(-entry.vLightDirection.xyz, r.L);\n let standardDirFalloff = select(0.0, max(0.0, pow(max(c, 0.0), entry.vLightSpecular.a)), c >= cosHalfAngle);\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let physicalDirFalloff = exp2(kappa * (c - 1.0));\n r.atten = rangeAtt * select(standardDirFalloff, physicalDirFalloff, physicalFalloff);\n } else {\n r.atten = rangeAtt;\n }\n}\nr.NdotL = max(dot(N, r.L), 0.0);\nr.color = entry.vLightDiffuse.rgb;\nreturn r;\n}\n`;\n\n/** The multi-light direct lighting loop WGSL block for the PBR template.\n * Contains slot markers AD and BL for fragment injection.\n * Generated at call time because MAX_LIGHTS is runtime-configurable via `setMaxLights`. */\nexport function getMultiLightLoop(): string {\n return `var directDiffuse = vec3<f32>(0.0);\nvar directSpecular = vec3<f32>(0.0);\n// BJS direct-light specular: roughness is clamped by the geometric AA factor\n// BEFORE being squared (matches BJS pbrDirectLightingFunctions.fx line 103).\n// The IBL-path alphaG already has AA_factor_y additively baked in; direct\n// specular uses its own squaring after max(roughness, AA_factor_x).\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nlet lightCount = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AS*/\n// First-light aliases — kept at directLightBlock scope so the AD slot below\n// (clearcoat / sheen / subsurface) sees the same single-light variable names\n// it was originally written against. Multi-light direct contributions\n// for those ancillary BRDFs are not yet supported (single-light parity only).\nlet lightIndex0 = mli(0u);\nlet entry0 = lights.lights[lightIndex0];\nlet pl0 = computePbrLight(entry0, N, input.worldPos, material.lightFalloffMode);\nlet L = pl0.L;\nlet NdotL = pl0.NdotL;\nlet lightColor = pl0.specColor;\nlet lightAtten = pl0.atten * shadowFactors[lightIndex0];\nlet H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nfor (var li = 0u; li < lightCount; li++) {\nvar pl: PbrLightResult;\nlet lightIndex = mli(li);\nif (li == 0u) { pl = pl0; } else { pl = computePbrLight(lights.lights[lightIndex], N, input.worldPos, material.lightFalloffMode); }\nlet sf = shadowFactors[lightIndex];\nif (pl.isHemi) {\ndirectDiffuse += pl.color * surfaceAlbedo * material.directIntensity * sf;\n} else {\ndirectDiffuse += surfaceAlbedo * (1.0 / PI) * pl.NdotL * pl.color * pl.atten * material.directIntensity * sf;\n}\n// Specular uses pl.NdotL (hemispheric 0.5+0.5*dot for hemi, max(dot,0) for others)\n// and pl.specColor (un-mixed light diffuse — matches single-light fast path\n// and Std's LIGHTING_FN which uses vLightSpecular for the specular bounce).\nif (pl.NdotL > 0.0 && pl.atten > 0.0) {\nlet specH = normalize(V + pl.L);\nlet specNdotH = clamp(dot(N, specH), 0.0000001, 1.0);\nlet specVdotH = saturate(dot(V, specH));\nlet D = distributionGGX(specNdotH, directAlphaG);\nlet G = geometrySmithGGX(pl.NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(specVdotH, colorF0, colorF90);\ndirectSpecular += coloredFresnel * D * G * pl.NdotL * pl.specColor * pl.atten * material.directIntensity * sf;\n}\n}\n/*AD*/`;\n}\n"],"names":[],"mappings":";AAKO,SAAS,sBAA8B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BASiB,UAAU;AAAA;AAAA;AAGtC;AAEO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4C1B,SAAS,oBAA4B;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAQsB,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,gCAC5D,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwC1C;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { A as createMaterialView } from "./index-B7Qhw0xL.js";
|
|
2
|
+
function createShaderNoColorMaterialView(source) {
|
|
3
|
+
return createMaterialView(source, { features: 0 });
|
|
4
|
+
}
|
|
5
|
+
export {
|
|
6
|
+
createShaderNoColorMaterialView
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=no-color-view-DsyLSL-W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-color-view-DsyLSL-W.js","sources":["../src/material/shader/no-color-view.ts"],"sourcesContent":["/** ShaderMaterial material view helper with no colour output (for shadow casting). */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport type { ShaderMaterial } from \"./shader-material.js\";\n\n/**\n * Create a no-colour view over a ShaderMaterial source, used by the shadow caster pass.\n *\n * Unlike standard/PBR/node, a ShaderMaterial needs no feature flag to drop its colour output: the shader\n * pipeline already omits the fragment stage when the render target has no colour attachment (the depth-only\n * shadow map). The view exists purely so the caster gets its OWN renderable + system UBO (written with the\n * shadow camera's view-projection) instead of clobbering the source material's main-pass UBO.\n */\nexport function createShaderNoColorMaterialView(source: ShaderMaterial): MaterialView {\n return createMaterialView(source, { features: 0 });\n}\n"],"names":[],"mappings":";AAcO,SAAS,gCAAgC,QAAsC;AAClF,SAAO,mBAAmB,QAAQ,EAAE,UAAU,GAAG;AACrD;"}
|
|
@@ -15,7 +15,7 @@ function hasBlockEmitter(key) {
|
|
|
15
15
|
function baseBlockLoader(key) {
|
|
16
16
|
switch (key) {
|
|
17
17
|
case "InputBlock":
|
|
18
|
-
return () => import("./input-block-
|
|
18
|
+
return () => import("./input-block-Coi_aZwl.js");
|
|
19
19
|
case "VectorMergerBlock":
|
|
20
20
|
return () => import("./vector-merger-CrW-ONB0.js");
|
|
21
21
|
case "FragmentOutputBlock":
|
|
@@ -47,7 +47,7 @@ function baseBlockLoader(key) {
|
|
|
47
47
|
case "LerpBlock":
|
|
48
48
|
return () => import("./lerp-block-DjI2SfmI.js");
|
|
49
49
|
case "ClampBlock":
|
|
50
|
-
return () => import("./clamp-block-
|
|
50
|
+
return () => import("./clamp-block-CxRBPlUq.js");
|
|
51
51
|
case "SmoothStepBlock":
|
|
52
52
|
return () => import("./smoothstep-block-Di4t37x-.js");
|
|
53
53
|
case "RemapBlock":
|
|
@@ -71,7 +71,7 @@ function baseBlockLoader(key) {
|
|
|
71
71
|
case "ViewDirectionBlock":
|
|
72
72
|
return () => import("./view-direction-CWVucfnT.js");
|
|
73
73
|
case "LightBlock":
|
|
74
|
-
return () => import("./light-block-
|
|
74
|
+
return () => import("./light-block-Np_h5gPI.js");
|
|
75
75
|
case "LightInformationBlock":
|
|
76
76
|
return () => import("./light-information-VJbW0jbs.js");
|
|
77
77
|
case "FogBlock":
|
|
@@ -91,9 +91,9 @@ function baseBlockLoader(key) {
|
|
|
91
91
|
case "ReflectionTextureBlock":
|
|
92
92
|
return () => import("./reflection-texture-block-C3QtzoV8.js");
|
|
93
93
|
case "PBRMetallicRoughnessBlock":
|
|
94
|
-
return () => import("./pbr-metallic-roughness-block-
|
|
94
|
+
return () => import("./pbr-metallic-roughness-block-BFwZj2Nw.js");
|
|
95
95
|
case "PBRMetallicRoughnessBlock__full":
|
|
96
|
-
return () => import("./pbr-metallic-roughness-block-full-
|
|
96
|
+
return () => import("./pbr-metallic-roughness-block-full-5t0HT3xl.js");
|
|
97
97
|
case "ReflectionBlock":
|
|
98
98
|
return () => import("./reflection-block-DqcwyYqr.js");
|
|
99
99
|
case "ClearCoatBlock":
|
|
@@ -135,7 +135,7 @@ function extraRegistryLoader(key) {
|
|
|
135
135
|
case "CurveBlock":
|
|
136
136
|
case "WaveBlock":
|
|
137
137
|
case "RandomNumberBlock":
|
|
138
|
-
return () => import("./node-registry-extra-math-
|
|
138
|
+
return () => import("./node-registry-extra-math-6ezzTkPj.js");
|
|
139
139
|
case "ColorMergerBlock":
|
|
140
140
|
case "ColorConverterBlock":
|
|
141
141
|
case "DesaturateBlock":
|
|
@@ -178,7 +178,7 @@ function extraRegistryLoader(key) {
|
|
|
178
178
|
case "LoopBlock":
|
|
179
179
|
case "StorageReadBlock":
|
|
180
180
|
case "StorageWriteBlock":
|
|
181
|
-
return () => import("./node-registry-extra-compat-
|
|
181
|
+
return () => import("./node-registry-extra-compat-Ch7ApZHF.js");
|
|
182
182
|
default:
|
|
183
183
|
return null;
|
|
184
184
|
}
|
|
@@ -187,4 +187,4 @@ export {
|
|
|
187
187
|
hasBlockEmitter,
|
|
188
188
|
loadBlockEmitter
|
|
189
189
|
};
|
|
190
|
-
//# sourceMappingURL=node-registry-
|
|
190
|
+
//# sourceMappingURL=node-registry-Bd-AlrgC.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-registry-DwgC4yth.js","sources":["../src/material/node/node-registry.ts"],"sourcesContent":["/** Node-block registry — side-effect-free lazy dispatch.\n *\n * Each block lives in its own module under `./blocks/`. The base registry keeps\n * the pre-existing NME surface inline; newer block families are routed through\n * small extension registries so older scenes don't fetch every new loader.\n */\n\nimport type { BlockEmitter } from \"./node-types.js\";\n\nexport type BlockLoader = () => Promise<{ emitter: BlockEmitter }>;\n\n/** Resolve a block emitter by key. Throws if the block is not registered. */\nexport async function loadBlockEmitter(key: string): Promise<BlockEmitter> {\n const baseLoader = baseBlockLoader(key);\n if (baseLoader) {\n return (await baseLoader()).emitter;\n }\n const extra = await loadExtraBlockEmitter(key);\n if (extra) {\n return extra;\n }\n throw new Error(`NodeMaterial: no emitter registered for block \"${key}\"`);\n}\n\n/** Returns true if a key is registered (used by tests). */\nexport function hasBlockEmitter(key: string): boolean {\n return !!baseBlockLoader(key) || !!extraRegistryLoader(key);\n}\n\nfunction baseBlockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"InputBlock\":\n return () => import(\"./blocks/input-block.js\");\n case \"VectorMergerBlock\":\n return () => import(\"./blocks/vector-merger.js\");\n case \"FragmentOutputBlock\":\n return () => import(\"./blocks/fragment-output.js\");\n case \"AddBlock\":\n return () => import(\"./blocks/add-block.js\");\n case \"SubtractBlock\":\n return () => import(\"./blocks/subtract-block.js\");\n case \"MultiplyBlock\":\n return () => import(\"./blocks/multiply-block.js\");\n case \"MinBlock\":\n return () => import(\"./blocks/min-block.js\");\n case \"MaxBlock\":\n return () => import(\"./blocks/max-block.js\");\n case \"PowBlock\":\n return () => import(\"./blocks/pow-block.js\");\n case \"StepBlock\":\n return () => import(\"./blocks/step-block.js\");\n case \"DotBlock\":\n return () => import(\"./blocks/dot-block.js\");\n case \"ScaleBlock\":\n return () => import(\"./blocks/scale-block.js\");\n case \"OneMinusBlock\":\n return () => import(\"./blocks/oneminus-block.js\");\n case \"NegateBlock\":\n return () => import(\"./blocks/negate-block.js\");\n case \"NormalizeBlock\":\n return () => import(\"./blocks/normalize-block.js\");\n case \"LerpBlock\":\n return () => import(\"./blocks/lerp-block.js\");\n case \"ClampBlock\":\n return () => import(\"./blocks/clamp-block.js\");\n case \"SmoothStepBlock\":\n return () => import(\"./blocks/smoothstep-block.js\");\n case \"RemapBlock\":\n return () => import(\"./blocks/remap-block.js\");\n case \"TrigonometryBlock\":\n return () => import(\"./blocks/trigonometry-block.js\");\n case \"VectorSplitterBlock\":\n return () => import(\"./blocks/vector-splitter.js\");\n case \"ColorSplitterBlock\":\n return () => import(\"./blocks/color-splitter.js\");\n case \"TransformBlock\":\n return () => import(\"./blocks/transform-block.js\");\n case \"VertexOutputBlock\":\n return () => import(\"./blocks/vertex-output.js\");\n case \"TextureBlock\":\n return () => import(\"./blocks/texture-block.js\");\n case \"ImageSourceBlock\":\n return () => import(\"./blocks/image-source.js\");\n case \"FrontFacingBlock\":\n return () => import(\"./blocks/front-facing.js\");\n case \"ViewDirectionBlock\":\n return () => import(\"./blocks/view-direction.js\");\n case \"LightBlock\":\n return () => import(\"./blocks/light-block.js\");\n case \"LightInformationBlock\":\n return () => import(\"./blocks/light-information.js\");\n case \"FogBlock\":\n return () => import(\"./blocks/fog-block.js\");\n case \"PerturbNormalBlock\":\n return () => import(\"./blocks/perturb-normal.js\");\n case \"BonesBlock\":\n return () => import(\"./blocks/bones-block.js\");\n case \"InstancesBlock\":\n return () => import(\"./blocks/instances-block.js\");\n case \"MorphTargetsBlock\":\n return () => import(\"./blocks/morph-targets.js\");\n case \"ShadowMapBlock\":\n return () => import(\"./blocks/shadow-map.js\");\n case \"DiscardBlock\":\n return () => import(\"./blocks/discard-block.js\");\n case \"ReflectionTextureBlock\":\n return () => import(\"./blocks/reflection-texture-block.js\");\n case \"PBRMetallicRoughnessBlock\":\n return () => import(\"./blocks/pbr-metallic-roughness-block.js\");\n case \"PBRMetallicRoughnessBlock__full\":\n return () => import(\"./blocks/pbr-metallic-roughness-block-full.js\");\n case \"ReflectionBlock\":\n return () => import(\"./blocks/reflection-block.js\");\n case \"ClearCoatBlock\":\n return () => import(\"./blocks/clearcoat-block.js\");\n case \"SheenBlock\":\n return () => import(\"./blocks/sheen-block.js\");\n case \"AnisotropyBlock\":\n return () => import(\"./blocks/anisotropy-block.js\");\n case \"SubSurfaceBlock\":\n return () => import(\"./blocks/subsurface-block.js\");\n case \"RefractionBlock\":\n return () => import(\"./blocks/refraction-block.js\");\n default:\n return null;\n }\n}\n\nasync function loadExtraBlockEmitter(key: string): Promise<BlockEmitter | null> {\n const loader = extraRegistryLoader(key);\n if (!loader) {\n return null;\n }\n return (await loader()).loadExtraEmitter(key);\n}\n\nfunction extraRegistryLoader(key: string): (() => Promise<{ loadExtraEmitter(key: string): Promise<BlockEmitter> }>) | null {\n switch (key) {\n case \"DivideBlock\":\n case \"ModBlock\":\n case \"ReciprocalBlock\":\n case \"LengthBlock\":\n case \"DistanceBlock\":\n case \"CrossBlock\":\n case \"ReflectBlock\":\n case \"RefractBlock\":\n case \"ArcTan2Block\":\n case \"FresnelBlock\":\n case \"OppositeBlock\":\n case \"NLerpBlock\":\n case \"ConditionalBlock\":\n case \"CurveBlock\":\n case \"WaveBlock\":\n case \"RandomNumberBlock\":\n return () => import(\"./node-registry-extra-math.js\");\n case \"ColorMergerBlock\":\n case \"ColorConverterBlock\":\n case \"DesaturateBlock\":\n case \"GradientBlock\":\n case \"PosterizeBlock\":\n case \"ReplaceColorBlock\":\n case \"PannerBlock\":\n case \"Rotate2dBlock\":\n case \"TriPlanarBlock\":\n case \"BiPlanarBlock\":\n case \"CloudBlock\":\n case \"SimplexPerlin3DBlock\":\n case \"VoronoiNoiseBlock\":\n case \"WorleyNoise3DBlock\":\n return () => import(\"./node-registry-extra-procedural.js\");\n case \"DerivativeBlock\":\n case \"HeightToNormalBlock\":\n case \"TBNBlock\":\n case \"NormalBlendBlock\":\n case \"AmbientOcclusionBlock\":\n case \"FragCoordBlock\":\n case \"ScreenSizeBlock\":\n case \"ScreenSpaceBlock\":\n case \"TwirlBlock\":\n case \"FragDepthBlock\":\n case \"MatrixBuilder\":\n case \"MatrixSplitterBlock\":\n case \"MatrixTransposeBlock\":\n case \"MatrixDeterminantBlock\":\n return () => import(\"./node-registry-extra-advanced.js\");\n case \"ElbowBlock\":\n case \"NodeMaterialTeleportInBlock\":\n case \"NodeMaterialTeleportOutBlock\":\n case \"NodeMaterialDebugBlock\":\n case \"MeshAttributeExistsBlock\":\n case \"ClipPlanesBlock\":\n case \"ReflectionTextureBaseBlock\":\n case \"ImageProcessingBlock\":\n case \"IridescenceBlock\":\n case \"LoopBlock\":\n case \"StorageReadBlock\":\n case \"StorageWriteBlock\":\n return () => import(\"./node-registry-extra-compat.js\");\n default:\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-registry-Bd-AlrgC.js","sources":["../src/material/node/node-registry.ts"],"sourcesContent":["/** Node-block registry — side-effect-free lazy dispatch.\n *\n * Each block lives in its own module under `./blocks/`. The base registry keeps\n * the pre-existing NME surface inline; newer block families are routed through\n * small extension registries so older scenes don't fetch every new loader.\n */\n\nimport type { BlockEmitter } from \"./node-types.js\";\n\nexport type BlockLoader = () => Promise<{ emitter: BlockEmitter }>;\n\n/** Resolve a block emitter by key. Throws if the block is not registered. */\nexport async function loadBlockEmitter(key: string): Promise<BlockEmitter> {\n const baseLoader = baseBlockLoader(key);\n if (baseLoader) {\n return (await baseLoader()).emitter;\n }\n const extra = await loadExtraBlockEmitter(key);\n if (extra) {\n return extra;\n }\n throw new Error(`NodeMaterial: no emitter registered for block \"${key}\"`);\n}\n\n/** Returns true if a key is registered (used by tests). */\nexport function hasBlockEmitter(key: string): boolean {\n return !!baseBlockLoader(key) || !!extraRegistryLoader(key);\n}\n\nfunction baseBlockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"InputBlock\":\n return () => import(\"./blocks/input-block.js\");\n case \"VectorMergerBlock\":\n return () => import(\"./blocks/vector-merger.js\");\n case \"FragmentOutputBlock\":\n return () => import(\"./blocks/fragment-output.js\");\n case \"AddBlock\":\n return () => import(\"./blocks/add-block.js\");\n case \"SubtractBlock\":\n return () => import(\"./blocks/subtract-block.js\");\n case \"MultiplyBlock\":\n return () => import(\"./blocks/multiply-block.js\");\n case \"MinBlock\":\n return () => import(\"./blocks/min-block.js\");\n case \"MaxBlock\":\n return () => import(\"./blocks/max-block.js\");\n case \"PowBlock\":\n return () => import(\"./blocks/pow-block.js\");\n case \"StepBlock\":\n return () => import(\"./blocks/step-block.js\");\n case \"DotBlock\":\n return () => import(\"./blocks/dot-block.js\");\n case \"ScaleBlock\":\n return () => import(\"./blocks/scale-block.js\");\n case \"OneMinusBlock\":\n return () => import(\"./blocks/oneminus-block.js\");\n case \"NegateBlock\":\n return () => import(\"./blocks/negate-block.js\");\n case \"NormalizeBlock\":\n return () => import(\"./blocks/normalize-block.js\");\n case \"LerpBlock\":\n return () => import(\"./blocks/lerp-block.js\");\n case \"ClampBlock\":\n return () => import(\"./blocks/clamp-block.js\");\n case \"SmoothStepBlock\":\n return () => import(\"./blocks/smoothstep-block.js\");\n case \"RemapBlock\":\n return () => import(\"./blocks/remap-block.js\");\n case \"TrigonometryBlock\":\n return () => import(\"./blocks/trigonometry-block.js\");\n case \"VectorSplitterBlock\":\n return () => import(\"./blocks/vector-splitter.js\");\n case \"ColorSplitterBlock\":\n return () => import(\"./blocks/color-splitter.js\");\n case \"TransformBlock\":\n return () => import(\"./blocks/transform-block.js\");\n case \"VertexOutputBlock\":\n return () => import(\"./blocks/vertex-output.js\");\n case \"TextureBlock\":\n return () => import(\"./blocks/texture-block.js\");\n case \"ImageSourceBlock\":\n return () => import(\"./blocks/image-source.js\");\n case \"FrontFacingBlock\":\n return () => import(\"./blocks/front-facing.js\");\n case \"ViewDirectionBlock\":\n return () => import(\"./blocks/view-direction.js\");\n case \"LightBlock\":\n return () => import(\"./blocks/light-block.js\");\n case \"LightInformationBlock\":\n return () => import(\"./blocks/light-information.js\");\n case \"FogBlock\":\n return () => import(\"./blocks/fog-block.js\");\n case \"PerturbNormalBlock\":\n return () => import(\"./blocks/perturb-normal.js\");\n case \"BonesBlock\":\n return () => import(\"./blocks/bones-block.js\");\n case \"InstancesBlock\":\n return () => import(\"./blocks/instances-block.js\");\n case \"MorphTargetsBlock\":\n return () => import(\"./blocks/morph-targets.js\");\n case \"ShadowMapBlock\":\n return () => import(\"./blocks/shadow-map.js\");\n case \"DiscardBlock\":\n return () => import(\"./blocks/discard-block.js\");\n case \"ReflectionTextureBlock\":\n return () => import(\"./blocks/reflection-texture-block.js\");\n case \"PBRMetallicRoughnessBlock\":\n return () => import(\"./blocks/pbr-metallic-roughness-block.js\");\n case \"PBRMetallicRoughnessBlock__full\":\n return () => import(\"./blocks/pbr-metallic-roughness-block-full.js\");\n case \"ReflectionBlock\":\n return () => import(\"./blocks/reflection-block.js\");\n case \"ClearCoatBlock\":\n return () => import(\"./blocks/clearcoat-block.js\");\n case \"SheenBlock\":\n return () => import(\"./blocks/sheen-block.js\");\n case \"AnisotropyBlock\":\n return () => import(\"./blocks/anisotropy-block.js\");\n case \"SubSurfaceBlock\":\n return () => import(\"./blocks/subsurface-block.js\");\n case \"RefractionBlock\":\n return () => import(\"./blocks/refraction-block.js\");\n default:\n return null;\n }\n}\n\nasync function loadExtraBlockEmitter(key: string): Promise<BlockEmitter | null> {\n const loader = extraRegistryLoader(key);\n if (!loader) {\n return null;\n }\n return (await loader()).loadExtraEmitter(key);\n}\n\nfunction extraRegistryLoader(key: string): (() => Promise<{ loadExtraEmitter(key: string): Promise<BlockEmitter> }>) | null {\n switch (key) {\n case \"DivideBlock\":\n case \"ModBlock\":\n case \"ReciprocalBlock\":\n case \"LengthBlock\":\n case \"DistanceBlock\":\n case \"CrossBlock\":\n case \"ReflectBlock\":\n case \"RefractBlock\":\n case \"ArcTan2Block\":\n case \"FresnelBlock\":\n case \"OppositeBlock\":\n case \"NLerpBlock\":\n case \"ConditionalBlock\":\n case \"CurveBlock\":\n case \"WaveBlock\":\n case \"RandomNumberBlock\":\n return () => import(\"./node-registry-extra-math.js\");\n case \"ColorMergerBlock\":\n case \"ColorConverterBlock\":\n case \"DesaturateBlock\":\n case \"GradientBlock\":\n case \"PosterizeBlock\":\n case \"ReplaceColorBlock\":\n case \"PannerBlock\":\n case \"Rotate2dBlock\":\n case \"TriPlanarBlock\":\n case \"BiPlanarBlock\":\n case \"CloudBlock\":\n case \"SimplexPerlin3DBlock\":\n case \"VoronoiNoiseBlock\":\n case \"WorleyNoise3DBlock\":\n return () => import(\"./node-registry-extra-procedural.js\");\n case \"DerivativeBlock\":\n case \"HeightToNormalBlock\":\n case \"TBNBlock\":\n case \"NormalBlendBlock\":\n case \"AmbientOcclusionBlock\":\n case \"FragCoordBlock\":\n case \"ScreenSizeBlock\":\n case \"ScreenSpaceBlock\":\n case \"TwirlBlock\":\n case \"FragDepthBlock\":\n case \"MatrixBuilder\":\n case \"MatrixSplitterBlock\":\n case \"MatrixTransposeBlock\":\n case \"MatrixDeterminantBlock\":\n return () => import(\"./node-registry-extra-advanced.js\");\n case \"ElbowBlock\":\n case \"NodeMaterialTeleportInBlock\":\n case \"NodeMaterialTeleportOutBlock\":\n case \"NodeMaterialDebugBlock\":\n case \"MeshAttributeExistsBlock\":\n case \"ClipPlanesBlock\":\n case \"ReflectionTextureBaseBlock\":\n case \"ImageProcessingBlock\":\n case \"IridescenceBlock\":\n case \"LoopBlock\":\n case \"StorageReadBlock\":\n case \"StorageWriteBlock\":\n return () => import(\"./node-registry-extra-compat.js\");\n default:\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ function blockLoader(key) {
|
|
|
19
19
|
case "IridescenceBlock":
|
|
20
20
|
return () => import("./iridescence-block-B0pRFoOU.js");
|
|
21
21
|
case "LoopBlock":
|
|
22
|
-
return () => import("./loop-block-
|
|
22
|
+
return () => import("./loop-block-BFkLFYGm.js");
|
|
23
23
|
case "StorageReadBlock":
|
|
24
24
|
return () => import("./storage-read-block-BdzhJfln.js");
|
|
25
25
|
case "StorageWriteBlock":
|
|
@@ -38,4 +38,4 @@ async function loadExtraEmitter(key) {
|
|
|
38
38
|
export {
|
|
39
39
|
loadExtraEmitter
|
|
40
40
|
};
|
|
41
|
-
//# sourceMappingURL=node-registry-extra-compat-
|
|
41
|
+
//# sourceMappingURL=node-registry-extra-compat-Ch7ApZHF.js.map
|