@babylonjs/lite 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_math-factory-C-QqW-Wi.js +55 -0
- package/_math-factory-C-QqW-Wi.js.map +1 -0
- package/add-block-CikX5gWy.js +6 -0
- package/add-block-CikX5gWy.js.map +1 -0
- package/alpha-test-fragment-CUiHCw7W.js +22 -0
- package/alpha-test-fragment-CUiHCw7W.js.map +1 -0
- package/ambient-occlusion-block-DForhWL3.js +77 -0
- package/ambient-occlusion-block-DForhWL3.js.map +1 -0
- package/anisotropy-block-D5fXH_OY.js +12 -0
- package/anisotropy-block-D5fXH_OY.js.map +1 -0
- package/anisotropy-fragment-HgasXS7l.js +89 -0
- package/anisotropy-fragment-HgasXS7l.js.map +1 -0
- package/arc-tan2-block-d8sWt_x0.js +12 -0
- package/arc-tan2-block-d8sWt_x0.js.map +1 -0
- package/assets/splat-sort-worker-Crg3CaCc.js.map +1 -0
- package/background-dds-skybox-yHTqabU3.js +221 -0
- package/background-dds-skybox-yHTqabU3.js.map +1 -0
- package/background-ground-DIw6D3qf.js +235 -0
- package/background-ground-DIw6D3qf.js.map +1 -0
- package/background-hdr-skybox-c4uuTmkP.js +179 -0
- package/background-hdr-skybox-c4uuTmkP.js.map +1 -0
- package/background-solid-skybox-DPGBpPbm.js +235 -0
- package/background-solid-skybox-DPGBpPbm.js.map +1 -0
- package/bake-local-matrix-Dfpd3b06.js +28 -0
- package/bake-local-matrix-Dfpd3b06.js.map +1 -0
- package/billboard-renderable-D8mlVGCd.js +242 -0
- package/billboard-renderable-D8mlVGCd.js.map +1 -0
- package/biplanar-block-DZnKuV81.js +115 -0
- package/biplanar-block-DZnKuV81.js.map +1 -0
- package/bones-block-D6IhqUVV.js +31 -0
- package/bones-block-D6IhqUVV.js.map +1 -0
- package/clamp-block-BdII67hT.js +21 -0
- package/clamp-block-BdII67hT.js.map +1 -0
- package/clearcoat-block-BGML4npi.js +12 -0
- package/clearcoat-block-BGML4npi.js.map +1 -0
- package/clearcoat-fragment-LCiG98Rf.js +256 -0
- package/clearcoat-fragment-LCiG98Rf.js.map +1 -0
- package/clip-planes-block-BPfFJrbf.js +26 -0
- package/clip-planes-block-BPfFJrbf.js.map +1 -0
- package/cloud-block-BeVrangc.js +90 -0
- package/cloud-block-BeVrangc.js.map +1 -0
- package/color-converter-block-CvwKiW4k.js +123 -0
- package/color-converter-block-CvwKiW4k.js.map +1 -0
- package/color-merger-CCu21ZII.js +57 -0
- package/color-merger-CCu21ZII.js.map +1 -0
- package/color-splitter-CGn1G4ow.js +33 -0
- package/color-splitter-CGn1G4ow.js.map +1 -0
- package/conditional-block-Cd2pbejI.js +51 -0
- package/conditional-block-Cd2pbejI.js.map +1 -0
- package/create-skeleton-C9JdIJnb.js +44 -0
- package/create-skeleton-C9JdIJnb.js.map +1 -0
- package/cross-block-DCrLwCpt.js +12 -0
- package/cross-block-DCrLwCpt.js.map +1 -0
- package/cubemap-skybox-material-DvXMVc4k.js +79 -0
- package/cubemap-skybox-material-DvXMVc4k.js.map +1 -0
- package/curve-block-BlJpXVYv.js +89 -0
- package/curve-block-BlJpXVYv.js.map +1 -0
- package/debug-block-D2pg4Yf6.js +14 -0
- package/debug-block-D2pg4Yf6.js.map +1 -0
- package/derivative-block-B8KjtaWs.js +20 -0
- package/derivative-block-B8KjtaWs.js.map +1 -0
- package/desaturate-block-C1RghNSB.js +15 -0
- package/desaturate-block-C1RghNSB.js.map +1 -0
- package/discard-block-B2jKjaEL.js +21 -0
- package/discard-block-B2jKjaEL.js.map +1 -0
- package/distance-block-3NkgFZ3f.js +16 -0
- package/distance-block-3NkgFZ3f.js.map +1 -0
- package/divide-block-ZyepIg_-.js +6 -0
- package/divide-block-ZyepIg_-.js.map +1 -0
- package/dot-block-VlfAC6cD.js +16 -0
- package/dot-block-VlfAC6cD.js.map +1 -0
- package/elbow-block-NEOiIxzO.js +10 -0
- package/elbow-block-NEOiIxzO.js.map +1 -0
- package/emissive-fragment-BnNvbBCw.js +39 -0
- package/emissive-fragment-BnNvbBCw.js.map +1 -0
- package/esm-shadow-view-DGKdF1NI.js +18 -0
- package/esm-shadow-view-DGKdF1NI.js.map +1 -0
- package/esm-shadow-view-DN9HIaM4.js +15 -0
- package/esm-shadow-view-DN9HIaM4.js.map +1 -0
- package/esm-shadow-view-Dk9NFtLq.js +15 -0
- package/esm-shadow-view-Dk9NFtLq.js.map +1 -0
- package/fog-block-DJ9hEolm.js +41 -0
- package/fog-block-DJ9hEolm.js.map +1 -0
- package/frag-coord-block-DzXfFgfV.js +25 -0
- package/frag-coord-block-DzXfFgfV.js.map +1 -0
- package/frag-depth-block-UQbeKP2D.js +34 -0
- package/frag-depth-block-UQbeKP2D.js.map +1 -0
- package/fragment-output-BOphkIeh.js +26 -0
- package/fragment-output-BOphkIeh.js.map +1 -0
- package/fresnel-block-DefHWeO-.js +20 -0
- package/fresnel-block-DefHWeO-.js.map +1 -0
- package/front-facing-0d6aiyrv.js +11 -0
- package/front-facing-0d6aiyrv.js.map +1 -0
- package/gaussian-splatting-pipeline-sh-DgJl7l56.js +500 -0
- package/gaussian-splatting-pipeline-sh-DgJl7l56.js.map +1 -0
- package/gltf-animation-D7uyTyO3.js +245 -0
- package/gltf-animation-D7uyTyO3.js.map +1 -0
- package/gltf-ext-anisotropy-CknJiJK8.js +22 -0
- package/gltf-ext-anisotropy-CknJiJK8.js.map +1 -0
- package/gltf-ext-basisu-CPg5kPrx.js +452 -0
- package/gltf-ext-basisu-CPg5kPrx.js.map +1 -0
- package/gltf-ext-clearcoat-CLH2SVph.js +31 -0
- package/gltf-ext-clearcoat-CLH2SVph.js.map +1 -0
- package/gltf-ext-dielectric-qHzlnvdl.js +105 -0
- package/gltf-ext-dielectric-qHzlnvdl.js.map +1 -0
- package/gltf-ext-emissive-strength-nzGZXZVK.js +19 -0
- package/gltf-ext-emissive-strength-nzGZXZVK.js.map +1 -0
- package/gltf-ext-iridescence-C6bq7jiM.js +26 -0
- package/gltf-ext-iridescence-C6bq7jiM.js.map +1 -0
- package/gltf-ext-node-visibility-MafA9ot2.js +25 -0
- package/gltf-ext-node-visibility-MafA9ot2.js.map +1 -0
- package/gltf-ext-orm-CT18G_vQ.js +33 -0
- package/gltf-ext-orm-CT18G_vQ.js.map +1 -0
- package/gltf-ext-quantization-CpZyLDIz.js +94 -0
- package/gltf-ext-quantization-CpZyLDIz.js.map +1 -0
- package/gltf-ext-sheen-BgIxUzyZ.js +25 -0
- package/gltf-ext-sheen-BgIxUzyZ.js.map +1 -0
- package/gltf-ext-spec-gloss-D0LJLBUM.js +24 -0
- package/gltf-ext-spec-gloss-D0LJLBUM.js.map +1 -0
- package/gltf-ext-unlit-D2ANui0V.js +16 -0
- package/gltf-ext-unlit-D2ANui0V.js.map +1 -0
- package/gltf-ext-uv-transform-CE_-T1Tr.js +38 -0
- package/gltf-ext-uv-transform-CE_-T1Tr.js.map +1 -0
- package/gltf-feature-animation-pointer-BjpwOOqo.js +88 -0
- package/gltf-feature-animation-pointer-BjpwOOqo.js.map +1 -0
- package/gltf-feature-animations-CCizegp8.js +15 -0
- package/gltf-feature-animations-CCizegp8.js.map +1 -0
- package/gltf-feature-draco-yGSMGTE3.js +124 -0
- package/gltf-feature-draco-yGSMGTE3.js.map +1 -0
- package/gltf-feature-gpu-instancing-2e_CFQnl.js +151 -0
- package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +1 -0
- package/gltf-feature-lights-punctual-DDDg4j0U.js +71 -0
- package/gltf-feature-lights-punctual-DDDg4j0U.js.map +1 -0
- package/gltf-feature-meshopt-Des96YFI.js +84 -0
- package/gltf-feature-meshopt-Des96YFI.js.map +1 -0
- package/gltf-feature-morph-CKCw6tkX.js +29 -0
- package/gltf-feature-morph-CKCw6tkX.js.map +1 -0
- package/gltf-feature-skeleton-D8hWLqi2.js +36 -0
- package/gltf-feature-skeleton-D8hWLqi2.js.map +1 -0
- package/gltf-feature-variants-Ds6v9byg.js +17 -0
- package/gltf-feature-variants-Ds6v9byg.js.map +1 -0
- package/gltf-feature-xmp-BUfq_IVG.js +15 -0
- package/gltf-feature-xmp-BUfq_IVG.js.map +1 -0
- package/gltf-glb-parser-D6UZWFuC.js +27 -0
- package/gltf-glb-parser-D6UZWFuC.js.map +1 -0
- package/gltf-interleave-DGnUlz28.js +241 -0
- package/gltf-interleave-DGnUlz28.js.map +1 -0
- package/gltf-pbr-builder-ext-BFOxOCnQ.js +85 -0
- package/gltf-pbr-builder-ext-BFOxOCnQ.js.map +1 -0
- package/gltf-variants-DFbr8EES.js +88 -0
- package/gltf-variants-DFbr8EES.js.map +1 -0
- package/gradient-block-DL_60sDc.js +50 -0
- package/gradient-block-DL_60sDc.js.map +1 -0
- package/gs-picking-pipeline-DzfMASL9.js +280 -0
- package/gs-picking-pipeline-DzfMASL9.js.map +1 -0
- package/height-to-normal-block-DhPHkDFg.js +65 -0
- package/height-to-normal-block-DhPHkDFg.js.map +1 -0
- package/ibl-fragment-DqQVi8k0.js +91 -0
- package/ibl-fragment-DqQVi8k0.js.map +1 -0
- package/ibl-skybox-wgsl-DCah0kWV.js +13 -0
- package/ibl-skybox-wgsl-DCah0kWV.js.map +1 -0
- package/image-processing-block-DwrhhmuF.js +40 -0
- package/image-processing-block-DwrhhmuF.js.map +1 -0
- package/image-source-BuMJgd9-.js +17 -0
- package/image-source-BuMJgd9-.js.map +1 -0
- package/index-C8HOR2sB.js +19222 -0
- package/index-C8HOR2sB.js.map +1 -0
- package/index.d.ts +4611 -0
- package/index.js +309 -0
- package/index.js.map +1 -0
- package/input-block-DgAJBzN_.js +109 -0
- package/input-block-DgAJBzN_.js.map +1 -0
- package/instances-block-BaSSiz8m.js +12 -0
- package/instances-block-BaSSiz8m.js.map +1 -0
- package/iridescence-block-B0pRFoOU.js +67 -0
- package/iridescence-block-B0pRFoOU.js.map +1 -0
- package/iridescence-fragment-Gymp7or5.js +243 -0
- package/iridescence-fragment-Gymp7or5.js.map +1 -0
- package/length-block-ChOkeiHR.js +11 -0
- package/length-block-ChOkeiHR.js.map +1 -0
- package/lerp-block-DjI2SfmI.js +18 -0
- package/lerp-block-DjI2SfmI.js.map +1 -0
- package/light-block-B11ew7FA.js +123 -0
- package/light-block-B11ew7FA.js.map +1 -0
- package/light-information-VJbW0jbs.js +19 -0
- package/light-information-VJbW0jbs.js.map +1 -0
- package/loop-block-Bb23EOMb.js +71 -0
- package/loop-block-Bb23EOMb.js.map +1 -0
- package/manifold-AS8POaOr.js +3022 -0
- package/manifold-AS8POaOr.js.map +1 -0
- package/manifold-RCa7RkKz.js +5 -0
- package/manifold-RCa7RkKz.js.map +1 -0
- package/matrix-blocks-acWn_V6g.js +51 -0
- package/matrix-blocks-acWn_V6g.js.map +1 -0
- package/max-block-CjFgljZ7.js +6 -0
- package/max-block-CjFgljZ7.js.map +1 -0
- package/mesh-attribute-exists-block-BfK8UiSL.js +44 -0
- package/mesh-attribute-exists-block-BfK8UiSL.js.map +1 -0
- package/mesh-features-BLENkYVt.js +341 -0
- package/mesh-features-BLENkYVt.js.map +1 -0
- package/min-block-CHtBngNl.js +6 -0
- package/min-block-CHtBngNl.js.map +1 -0
- package/mod-block-Ceizv8Y7.js +6 -0
- package/mod-block-Ceizv8Y7.js.map +1 -0
- package/morph-fragment-DOVo70gP.js +59 -0
- package/morph-fragment-DOVo70gP.js.map +1 -0
- package/morph-targets-55z342ZB.js +35 -0
- package/morph-targets-55z342ZB.js.map +1 -0
- package/multilight-wgsl-BGyiIOp3.js +112 -0
- package/multilight-wgsl-BGyiIOp3.js.map +1 -0
- package/multiply-block-DaXLJ7Ud.js +6 -0
- package/multiply-block-DaXLJ7Ud.js.map +1 -0
- package/negate-block-9CSLc5pM.js +6 -0
- package/negate-block-9CSLc5pM.js.map +1 -0
- package/nlerp-block-BNK1adIb.js +21 -0
- package/nlerp-block-BNK1adIb.js.map +1 -0
- package/node-env-BPZXZzBf.js +39 -0
- package/node-env-BPZXZzBf.js.map +1 -0
- package/node-registry-DwgC4yth.js +190 -0
- package/node-registry-DwgC4yth.js.map +1 -0
- package/node-registry-extra-advanced-2DJVt67-.js +45 -0
- package/node-registry-extra-advanced-2DJVt67-.js.map +1 -0
- package/node-registry-extra-compat-Dhrw8fDQ.js +41 -0
- package/node-registry-extra-compat-Dhrw8fDQ.js.map +1 -0
- package/node-registry-extra-math-CsAHvIZo.js +49 -0
- package/node-registry-extra-math-CsAHvIZo.js.map +1 -0
- package/node-registry-extra-procedural-5pLQ3Bhz.js +45 -0
- package/node-registry-extra-procedural-5pLQ3Bhz.js.map +1 -0
- package/node-renderable-DlLIdBmd.js +269 -0
- package/node-renderable-DlLIdBmd.js.map +1 -0
- package/node-shadow-DKrcqmNg.js +122 -0
- package/node-shadow-DKrcqmNg.js.map +1 -0
- package/node-snippet-DUMm9qEO.js +22 -0
- package/node-snippet-DUMm9qEO.js.map +1 -0
- package/normal-blend-block-BfH_nBoj.js +29 -0
- package/normal-blend-block-BfH_nBoj.js.map +1 -0
- package/normal-map-fragment-DpsIXrJf.js +38 -0
- package/normal-map-fragment-DpsIXrJf.js.map +1 -0
- package/normalize-block-F2bLNj9K.js +6 -0
- package/normalize-block-F2bLNj9K.js.map +1 -0
- package/oneminus-block-BP9x4Dc3.js +6 -0
- package/oneminus-block-BP9x4Dc3.js.map +1 -0
- package/opposite-block-Cnqmm-lH.js +6 -0
- package/opposite-block-Cnqmm-lH.js.map +1 -0
- package/package.json +26 -0
- package/panner-block-BwMQq-6Y.js +13 -0
- package/panner-block-BwMQq-6Y.js.map +1 -0
- package/parse-camera-DM3oJJeT.js +23 -0
- package/parse-camera-DM3oJJeT.js.map +1 -0
- package/pbr-aces-wgsl-HpiQHGN_.js +13 -0
- package/pbr-aces-wgsl-HpiQHGN_.js.map +1 -0
- package/pbr-metallic-roughness-block-full-6vMm1Jk6.js +763 -0
- package/pbr-metallic-roughness-block-full-6vMm1Jk6.js.map +1 -0
- package/pbr-metallic-roughness-block-h_KAOZrW.js +104 -0
- package/pbr-metallic-roughness-block-h_KAOZrW.js.map +1 -0
- package/pbr-mr-helper-core-CIwm-T1G.js +237 -0
- package/pbr-mr-helper-core-CIwm-T1G.js.map +1 -0
- package/pbr-refraction-DGmMSa2v.js +17 -0
- package/pbr-refraction-DGmMSa2v.js.map +1 -0
- package/pbr-renderable-BJxUtPBb.js +961 -0
- package/pbr-renderable-BJxUtPBb.js.map +1 -0
- package/pbr-shadow-fragment-LO9SlbJj.js +14 -0
- package/pbr-shadow-fragment-LO9SlbJj.js.map +1 -0
- package/pbr-template-ext-8q7BcTDf.js +88 -0
- package/pbr-template-ext-8q7BcTDf.js.map +1 -0
- package/pbr-tracking-B3alzn91.js +31 -0
- package/pbr-tracking-B3alzn91.js.map +1 -0
- package/pbr-transmission-ext-BxW4CEGu.js +581 -0
- package/pbr-transmission-ext-BxW4CEGu.js.map +1 -0
- package/perturb-normal-0Q8EM9ig.js +39 -0
- package/perturb-normal-0Q8EM9ig.js.map +1 -0
- package/posterize-block-DfdKsbEf.js +28 -0
- package/posterize-block-DfdKsbEf.js.map +1 -0
- package/pow-block-DI5ICzhc.js +13 -0
- package/pow-block-DI5ICzhc.js.map +1 -0
- package/random-number-block-2OyRYljF.js +15 -0
- package/random-number-block-2OyRYljF.js.map +1 -0
- package/reciprocal-block-Ck3CW-j-.js +14 -0
- package/reciprocal-block-Ck3CW-j-.js.map +1 -0
- package/reflect-block-CizpzrX4.js +12 -0
- package/reflect-block-CizpzrX4.js.map +1 -0
- package/reflectance-fragment-BCrgPmrt.js +143 -0
- package/reflectance-fragment-BCrgPmrt.js.map +1 -0
- package/reflection-block-DqcwyYqr.js +12 -0
- package/reflection-block-DqcwyYqr.js.map +1 -0
- package/reflection-texture-base-block-1xmJ0HDj.js +10 -0
- package/reflection-texture-base-block-1xmJ0HDj.js.map +1 -0
- package/reflection-texture-block-C3QtzoV8.js +60 -0
- package/reflection-texture-block-C3QtzoV8.js.map +1 -0
- package/refract-block-HHiAk-7U.js +13 -0
- package/refract-block-HHiAk-7U.js.map +1 -0
- package/refraction-block-U8y6XiXs.js +11 -0
- package/refraction-block-U8y6XiXs.js.map +1 -0
- package/refraction-dispersion-wgsl-DdQCyyO1.js +16 -0
- package/refraction-dispersion-wgsl-DdQCyyO1.js.map +1 -0
- package/remap-block-DxK1W1vp.js +27 -0
- package/remap-block-DxK1W1vp.js.map +1 -0
- package/replace-color-block-1m--hiru.js +17 -0
- package/replace-color-block-1m--hiru.js.map +1 -0
- package/rgbd-decode-DCvzUYeI.js +110 -0
- package/rgbd-decode-DCvzUYeI.js.map +1 -0
- package/rotate2d-block-nEe1N2MJ.js +15 -0
- package/rotate2d-block-nEe1N2MJ.js.map +1 -0
- package/scale-block-C5Z8159G.js +13 -0
- package/scale-block-C5Z8159G.js.map +1 -0
- package/scene-material-swap-C2ykv55W.js +34 -0
- package/scene-material-swap-C2ykv55W.js.map +1 -0
- package/screen-size-block-BVNnOvE8.js +21 -0
- package/screen-size-block-BVNnOvE8.js.map +1 -0
- package/screen-space-block-CwaxdfSe.js +28 -0
- package/screen-space-block-CwaxdfSe.js.map +1 -0
- package/shader-renderable-D-6796KR.js +531 -0
- package/shader-renderable-D-6796KR.js.map +1 -0
- package/shadow-fragment-core-DHN2G6FI.js +110 -0
- package/shadow-fragment-core-DHN2G6FI.js.map +1 -0
- package/shadow-map-CQNQC-Fw.js +13 -0
- package/shadow-map-CQNQC-Fw.js.map +1 -0
- package/sheen-block-BugfJqK3.js +12 -0
- package/sheen-block-BugfJqK3.js.map +1 -0
- package/sheen-fragment-Dze2f7XJ.js +215 -0
- package/sheen-fragment-Dze2f7XJ.js.map +1 -0
- package/simplex-perlin-3d-block-CcMtofzV.js +58 -0
- package/simplex-perlin-3d-block-CcMtofzV.js.map +1 -0
- package/singlelight-directional-wgsl-CmUDZxwz.js +39 -0
- package/singlelight-directional-wgsl-CmUDZxwz.js.map +1 -0
- package/singlelight-hemispheric-wgsl-t-83IP_s.js +40 -0
- package/singlelight-hemispheric-wgsl-t-83IP_s.js.map +1 -0
- package/singlelight-point-wgsl-CLzULIYV.js +45 -0
- package/singlelight-point-wgsl-CLzULIYV.js.map +1 -0
- package/singlelight-spot-wgsl-DEEUrfVM.js +47 -0
- package/singlelight-spot-wgsl-DEEUrfVM.js.map +1 -0
- package/skeleton-fragment-B_XlFbtx.js +71 -0
- package/skeleton-fragment-B_XlFbtx.js.map +1 -0
- package/skybox-renderable-DDwzu-PT.js +92 -0
- package/skybox-renderable-DDwzu-PT.js.map +1 -0
- package/skybox.vertex-DJgi072W.js +5 -0
- package/skybox.vertex-DJgi072W.js.map +1 -0
- package/smoothstep-block-Di4t37x-.js +15 -0
- package/smoothstep-block-Di4t37x-.js.map +1 -0
- package/splat-ply-compressed-BahdBG1r.js +394 -0
- package/splat-ply-compressed-BahdBG1r.js.map +1 -0
- package/standard-renderable-GjxL9xSf.js +636 -0
- package/standard-renderable-GjxL9xSf.js.map +1 -0
- package/std-ambient-fragment-BoUsD06w.js +37 -0
- package/std-ambient-fragment-BoUsD06w.js.map +1 -0
- package/std-cube-reflection-fragment-ulqc3bsP.js +31 -0
- package/std-cube-reflection-fragment-ulqc3bsP.js.map +1 -0
- package/std-emissive-fragment-DNGj1HdQ.js +40 -0
- package/std-emissive-fragment-DNGj1HdQ.js.map +1 -0
- package/std-lightmap-fragment-Bqj89aIe.js +37 -0
- package/std-lightmap-fragment-Bqj89aIe.js.map +1 -0
- package/std-opacity-fragment-KuPh5N2Z.js +37 -0
- package/std-opacity-fragment-KuPh5N2Z.js.map +1 -0
- package/std-reflection-fragment-BA5Ghn_M.js +57 -0
- package/std-reflection-fragment-BA5Ghn_M.js.map +1 -0
- package/std-shadow-fragment-FNQfrJuC.js +8 -0
- package/std-shadow-fragment-FNQfrJuC.js.map +1 -0
- package/std-specular-fragment-CE-6scqd.js +37 -0
- package/std-specular-fragment-CE-6scqd.js.map +1 -0
- package/std-tracking-CNKZ-hJN.js +15 -0
- package/std-tracking-CNKZ-hJN.js.map +1 -0
- package/step-block-BkywzTYm.js +13 -0
- package/step-block-BkywzTYm.js.map +1 -0
- package/storage-read-block-BdzhJfln.js +25 -0
- package/storage-read-block-BdzhJfln.js.map +1 -0
- package/storage-write-block-DjLKZ0Ro.js +11 -0
- package/storage-write-block-DjLKZ0Ro.js.map +1 -0
- package/subsurface-block-CBhxT9ui.js +12 -0
- package/subsurface-block-CBhxT9ui.js.map +1 -0
- package/subsurface-fragment-liM3y2-P.js +158 -0
- package/subsurface-fragment-liM3y2-P.js.map +1 -0
- package/subtract-block-NPfKvzQP.js +6 -0
- package/subtract-block-NPfKvzQP.js.map +1 -0
- package/swapchain-overlay-DcCSFDp7.js +35 -0
- package/swapchain-overlay-DcCSFDp7.js.map +1 -0
- package/tbn-block-ByOI6Y43.js +43 -0
- package/tbn-block-ByOI6Y43.js.map +1 -0
- package/teleport-in-block-BMa17cqq.js +10 -0
- package/teleport-in-block-BMa17cqq.js.map +1 -0
- package/teleport-out-block-5AkB25H6.js +19 -0
- package/teleport-out-block-5AkB25H6.js.map +1 -0
- package/texture-block-rr21KIL_.js +70 -0
- package/texture-block-rr21KIL_.js.map +1 -0
- package/thin-instance-fragment-hsv-RyDs.js +69 -0
- package/thin-instance-fragment-hsv-RyDs.js.map +1 -0
- package/thin-instance-gpu-C9Gv_Z1w.js +62 -0
- package/thin-instance-gpu-C9Gv_Z1w.js.map +1 -0
- package/tracking-primitives-wgdBY85t.js +82 -0
- package/tracking-primitives-wgdBY85t.js.map +1 -0
- package/transform-block-DbRph9JI.js +32 -0
- package/transform-block-DbRph9JI.js.map +1 -0
- package/trigonometry-block-BYQcTHiD.js +36 -0
- package/trigonometry-block-BYQcTHiD.js.map +1 -0
- package/triplanar-block-BZHkD9hX.js +148 -0
- package/triplanar-block-BZHkD9hX.js.map +1 -0
- package/twirl-block-78WtdiBd.js +39 -0
- package/twirl-block-78WtdiBd.js.map +1 -0
- package/unlit-fragment-BIlhJpz6.js +43 -0
- package/unlit-fragment-BIlhJpz6.js.map +1 -0
- package/uv-transform-fragment-hYujGpZg.js +47 -0
- package/uv-transform-fragment-hYujGpZg.js.map +1 -0
- package/vector-merger-CrW-ONB0.js +43 -0
- package/vector-merger-CrW-ONB0.js.map +1 -0
- package/vector-splitter-BoJuHrAU.js +34 -0
- package/vector-splitter-BoJuHrAU.js.map +1 -0
- package/vertex-output-Cvft64y0.js +14 -0
- package/vertex-output-Cvft64y0.js.map +1 -0
- package/view-direction-CWVucfnT.js +12 -0
- package/view-direction-CWVucfnT.js.map +1 -0
- package/voronoi-noise-block-iNQxa_Ls.js +43 -0
- package/voronoi-noise-block-iNQxa_Ls.js.map +1 -0
- package/wave-block-CY_mk1ec.js +41 -0
- package/wave-block-CY_mk1ec.js.map +1 -0
- package/wgsl-helpers-DyzNzCeE.js +48 -0
- package/wgsl-helpers-DyzNzCeE.js.map +1 -0
- package/worley-noise-3d-block-CyR2-k4s.js +58 -0
- package/worley-noise-3d-block-CyR2-k4s.js.map +1 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const SPLIT_OUTPUT = {
|
|
2
|
+
row0: { expr: (input) => `(${input})[0]`, type: "vec4f" },
|
|
3
|
+
row1: { expr: (input) => `(${input})[1]`, type: "vec4f" },
|
|
4
|
+
row2: { expr: (input) => `(${input})[2]`, type: "vec4f" },
|
|
5
|
+
row3: { expr: (input) => `(${input})[3]`, type: "vec4f" },
|
|
6
|
+
col0: { expr: (input) => `vec4<f32>((${input})[0][0], (${input})[1][0], (${input})[2][0], (${input})[3][0])`, type: "vec4f" },
|
|
7
|
+
col1: { expr: (input) => `vec4<f32>((${input})[0][1], (${input})[1][1], (${input})[2][1], (${input})[3][1])`, type: "vec4f" },
|
|
8
|
+
col2: { expr: (input) => `vec4<f32>((${input})[0][2], (${input})[1][2], (${input})[2][2], (${input})[3][2])`, type: "vec4f" },
|
|
9
|
+
col3: { expr: (input) => `vec4<f32>((${input})[0][3], (${input})[1][3], (${input})[2][3], (${input})[3][3])`, type: "vec4f" }
|
|
10
|
+
};
|
|
11
|
+
function optionalVec4(block, inputName, fallback, stage, state, ctx) {
|
|
12
|
+
const input = block.inputs.get(inputName);
|
|
13
|
+
if (!(input == null ? void 0 : input.source)) {
|
|
14
|
+
return fallback;
|
|
15
|
+
}
|
|
16
|
+
return ctx.cast(ctx.resolve(block, inputName, stage, state), "vec4f").expr;
|
|
17
|
+
}
|
|
18
|
+
function emitMatrixBuilder(block, stage, state, ctx) {
|
|
19
|
+
const row0 = optionalVec4(block, "row0", "vec4<f32>(1.0, 0.0, 0.0, 0.0)", stage, state, ctx);
|
|
20
|
+
const row1 = optionalVec4(block, "row1", "vec4<f32>(0.0, 1.0, 0.0, 0.0)", stage, state, ctx);
|
|
21
|
+
const row2 = optionalVec4(block, "row2", "vec4<f32>(0.0, 0.0, 1.0, 0.0)", stage, state, ctx);
|
|
22
|
+
const row3 = optionalVec4(block, "row3", "vec4<f32>(0.0, 0.0, 0.0, 1.0)", stage, state, ctx);
|
|
23
|
+
return { expr: `mat4x4<f32>(${row0}, ${row1}, ${row2}, ${row3})`, type: "mat4f" };
|
|
24
|
+
}
|
|
25
|
+
const emitter = {
|
|
26
|
+
className: "MatrixBlocks",
|
|
27
|
+
emit(block, outputName, stage, state, ctx) {
|
|
28
|
+
if (block.className === "MatrixBuilder") {
|
|
29
|
+
return emitMatrixBuilder(block, stage, state, ctx);
|
|
30
|
+
}
|
|
31
|
+
const input = ctx.cast(ctx.resolve(block, "input", stage, state), "mat4f");
|
|
32
|
+
if (block.className === "MatrixTransposeBlock") {
|
|
33
|
+
return { expr: `transpose(${input.expr})`, type: "mat4f" };
|
|
34
|
+
}
|
|
35
|
+
if (block.className === "MatrixDeterminantBlock") {
|
|
36
|
+
return { expr: `determinant(${input.expr})`, type: "f32" };
|
|
37
|
+
}
|
|
38
|
+
if (block.className === "MatrixSplitterBlock") {
|
|
39
|
+
const output = SPLIT_OUTPUT[outputName];
|
|
40
|
+
if (!output) {
|
|
41
|
+
throw new Error(`NodeMaterial: MatrixSplitterBlock has no output "${outputName}"`);
|
|
42
|
+
}
|
|
43
|
+
return { expr: output.expr(input.expr), type: output.type };
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`NodeMaterial: unsupported matrix block "${block.className}"`);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export {
|
|
49
|
+
emitter
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=matrix-blocks-acWn_V6g.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix-blocks-acWn_V6g.js","sources":["../src/material/node/blocks/matrix-blocks.ts"],"sourcesContent":["/** Matrix operation emitters.\n *\n * Supports MatrixBuilder, MatrixSplitterBlock, MatrixTransposeBlock, and\n * MatrixDeterminantBlock. Babylon.js' WGSL MatrixBuilder path emits\n * `mat4x4f(row0, row1, row2, row3)`; WGSL matrix constructors take column\n * vectors, so Lite follows that exact constructor ordering.\n */\n\nimport type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, NodeExpr, NodeValueType, Stage } from \"../node-types.js\";\n\nconst SPLIT_OUTPUT: Record<string, { readonly expr: (input: string) => string; readonly type: NodeValueType }> = {\n row0: { expr: (input) => `(${input})[0]`, type: \"vec4f\" },\n row1: { expr: (input) => `(${input})[1]`, type: \"vec4f\" },\n row2: { expr: (input) => `(${input})[2]`, type: \"vec4f\" },\n row3: { expr: (input) => `(${input})[3]`, type: \"vec4f\" },\n col0: { expr: (input) => `vec4<f32>((${input})[0][0], (${input})[1][0], (${input})[2][0], (${input})[3][0])`, type: \"vec4f\" },\n col1: { expr: (input) => `vec4<f32>((${input})[0][1], (${input})[1][1], (${input})[2][1], (${input})[3][1])`, type: \"vec4f\" },\n col2: { expr: (input) => `vec4<f32>((${input})[0][2], (${input})[1][2], (${input})[2][2], (${input})[3][2])`, type: \"vec4f\" },\n col3: { expr: (input) => `vec4<f32>((${input})[0][3], (${input})[1][3], (${input})[2][3], (${input})[3][3])`, type: \"vec4f\" },\n};\n\nfunction optionalVec4(block: NodeBlock, inputName: string, fallback: string, stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (!input?.source) {\n return fallback;\n }\n return ctx.cast(ctx.resolve(block, inputName, stage, state), \"vec4f\").expr;\n}\n\nfunction emitMatrixBuilder(block: NodeBlock, stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): NodeExpr {\n const row0 = optionalVec4(block, \"row0\", \"vec4<f32>(1.0, 0.0, 0.0, 0.0)\", stage, state, ctx);\n const row1 = optionalVec4(block, \"row1\", \"vec4<f32>(0.0, 1.0, 0.0, 0.0)\", stage, state, ctx);\n const row2 = optionalVec4(block, \"row2\", \"vec4<f32>(0.0, 0.0, 1.0, 0.0)\", stage, state, ctx);\n const row3 = optionalVec4(block, \"row3\", \"vec4<f32>(0.0, 0.0, 0.0, 1.0)\", stage, state, ctx);\n return { expr: `mat4x4<f32>(${row0}, ${row1}, ${row2}, ${row3})`, type: \"mat4f\" };\n}\n\nexport const emitter: BlockEmitter = {\n className: \"MatrixBlocks\",\n emit(block, outputName, stage, state, ctx) {\n if (block.className === \"MatrixBuilder\") {\n return emitMatrixBuilder(block, stage, state, ctx);\n }\n const input = ctx.cast(ctx.resolve(block, \"input\", stage, state), \"mat4f\");\n if (block.className === \"MatrixTransposeBlock\") {\n return { expr: `transpose(${input.expr})`, type: \"mat4f\" };\n }\n if (block.className === \"MatrixDeterminantBlock\") {\n return { expr: `determinant(${input.expr})`, type: \"f32\" };\n }\n if (block.className === \"MatrixSplitterBlock\") {\n const output = SPLIT_OUTPUT[outputName];\n if (!output) {\n throw new Error(`NodeMaterial: MatrixSplitterBlock has no output \"${outputName}\"`);\n }\n return { expr: output.expr(input.expr), type: output.type };\n }\n throw new Error(`NodeMaterial: unsupported matrix block \"${block.className}\"`);\n },\n};\n"],"names":[],"mappings":"AAUA,MAAM,eAA2G;AAAA,EAC7G,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,QAAQ,MAAM,QAAA;AAAA,EAChD,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,QAAQ,MAAM,QAAA;AAAA,EAChD,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,QAAQ,MAAM,QAAA;AAAA,EAChD,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK,QAAQ,MAAM,QAAA;AAAA,EAChD,MAAM,EAAE,MAAM,CAAC,UAAU,cAAc,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK,YAAY,MAAM,QAAA;AAAA,EACpH,MAAM,EAAE,MAAM,CAAC,UAAU,cAAc,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK,YAAY,MAAM,QAAA;AAAA,EACpH,MAAM,EAAE,MAAM,CAAC,UAAU,cAAc,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK,YAAY,MAAM,QAAA;AAAA,EACpH,MAAM,EAAE,MAAM,CAAC,UAAU,cAAc,KAAK,aAAa,KAAK,aAAa,KAAK,aAAa,KAAK,YAAY,MAAM,QAAA;AACxH;AAEA,SAAS,aAAa,OAAkB,WAAmB,UAAkB,OAAc,OAAuB,KAA8B;AAC5I,QAAM,QAAQ,MAAM,OAAO,IAAI,SAAS;AACxC,MAAI,EAAC,+BAAO,SAAQ;AAChB,WAAO;AAAA,EACX;AACA,SAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,WAAW,OAAO,KAAK,GAAG,OAAO,EAAE;AAC1E;AAEA,SAAS,kBAAkB,OAAkB,OAAc,OAAuB,KAAgC;AAC9G,QAAM,OAAO,aAAa,OAAO,QAAQ,iCAAiC,OAAO,OAAO,GAAG;AAC3F,QAAM,OAAO,aAAa,OAAO,QAAQ,iCAAiC,OAAO,OAAO,GAAG;AAC3F,QAAM,OAAO,aAAa,OAAO,QAAQ,iCAAiC,OAAO,OAAO,GAAG;AAC3F,QAAM,OAAO,aAAa,OAAO,QAAQ,iCAAiC,OAAO,OAAO,GAAG;AAC3F,SAAO,EAAE,MAAM,eAAe,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,QAAA;AAC5E;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;AACvC,QAAI,MAAM,cAAc,iBAAiB;AACrC,aAAO,kBAAkB,OAAO,OAAO,OAAO,GAAG;AAAA,IACrD;AACA,UAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK,GAAG,OAAO;AACzE,QAAI,MAAM,cAAc,wBAAwB;AAC5C,aAAO,EAAE,MAAM,aAAa,MAAM,IAAI,KAAK,MAAM,QAAA;AAAA,IACrD;AACA,QAAI,MAAM,cAAc,0BAA0B;AAC9C,aAAO,EAAE,MAAM,eAAe,MAAM,IAAI,KAAK,MAAM,MAAA;AAAA,IACvD;AACA,QAAI,MAAM,cAAc,uBAAuB;AAC3C,YAAM,SAAS,aAAa,UAAU;AACtC,UAAI,CAAC,QAAQ;AACT,cAAM,IAAI,MAAM,oDAAoD,UAAU,GAAG;AAAA,MACrF;AACA,aAAO,EAAE,MAAM,OAAO,KAAK,MAAM,IAAI,GAAG,MAAM,OAAO,KAAA;AAAA,IACzD;AACA,UAAM,IAAI,MAAM,2CAA2C,MAAM,SAAS,GAAG;AAAA,EACjF;AACJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"max-block-CjFgljZ7.js","sources":["../src/material/node/blocks/max-block.ts"],"sourcesContent":["import { binaryEmitter } from \"./_math-factory.js\";\nexport const emitter = binaryEmitter(\"MaxBlock\", (l, r) => `max(${l}, ${r})`);\n"],"names":[],"mappings":";AACO,MAAM,UAAU,cAAc,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG;"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function attributeFlag(attributeType) {
|
|
2
|
+
switch (attributeType) {
|
|
3
|
+
case 1:
|
|
4
|
+
return "1.0";
|
|
5
|
+
case 2:
|
|
6
|
+
return "meshU.receivesShadow.z";
|
|
7
|
+
case 3:
|
|
8
|
+
return "meshU.receivesShadow.w";
|
|
9
|
+
case 4:
|
|
10
|
+
return "meshU.receivesShadow.y";
|
|
11
|
+
case 5:
|
|
12
|
+
return "0.0";
|
|
13
|
+
case 6:
|
|
14
|
+
// UV3
|
|
15
|
+
case 7:
|
|
16
|
+
// UV4
|
|
17
|
+
case 8:
|
|
18
|
+
// UV5
|
|
19
|
+
case 9:
|
|
20
|
+
return "0.0";
|
|
21
|
+
default:
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const emitter = {
|
|
26
|
+
className: "MeshAttributeExistsBlock",
|
|
27
|
+
emit(block, _outputName, stage, state, ctx) {
|
|
28
|
+
state.usesMeshAttributeExists = true;
|
|
29
|
+
const input = ctx.resolve(block, "input", stage, state);
|
|
30
|
+
const flag = attributeFlag(block.serialized["attributeType"] ?? 0);
|
|
31
|
+
if (flag === null) {
|
|
32
|
+
return input;
|
|
33
|
+
}
|
|
34
|
+
const fallback = ctx.cast(ctx.resolve(block, "fallback", stage, state), input.type);
|
|
35
|
+
const expr = ctx.temp(state, "attr");
|
|
36
|
+
const s = stage === "vertex" ? state.vertex : state.fragment;
|
|
37
|
+
s.body.push(`let ${expr} = select(${fallback.expr}, ${input.expr}, ${flag} > 0.5);`);
|
|
38
|
+
return { expr, type: input.type };
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
export {
|
|
42
|
+
emitter
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=mesh-attribute-exists-block-BfK8UiSL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-attribute-exists-block-BfK8UiSL.js","sources":["../src/material/node/blocks/mesh-attribute-exists-block.ts"],"sourcesContent":["/** MeshAttributeExistsBlock — per-mesh attribute branch.\n *\n * Babylon.js emits preprocessor branches based on the mesh attribute defines\n * (`UV1`, `TANGENT`, `VERTEXCOLOR_NME`, ...). Babylon Lite batches meshes that\n * share the same NME pipeline, so the equivalent decision is a per-mesh uniform\n * flag written beside the world matrix. Missing attributes still bind zero\n * buffers to satisfy the pipeline layout, but this block selects the serialized\n * fallback value when the real mesh attribute is absent.\n */\n\nimport type { BlockEmitter, NodeExpr } from \"../node-types.js\";\n\nfunction attributeFlag(attributeType: number): string | null {\n switch (attributeType) {\n case 1: // Normal\n return \"1.0\";\n case 2: // Tangent\n return \"meshU.receivesShadow.z\";\n case 3: // VertexColor\n return \"meshU.receivesShadow.w\";\n case 4: // UV1\n return \"meshU.receivesShadow.y\";\n case 5: // UV2\n return \"0.0\";\n case 6: // UV3\n case 7: // UV4\n case 8: // UV5\n case 9: // UV6\n return \"0.0\";\n default:\n return null;\n }\n}\n\nexport const emitter: BlockEmitter = {\n className: \"MeshAttributeExistsBlock\",\n emit(block, _outputName, stage, state, ctx) {\n state.usesMeshAttributeExists = true;\n const input = ctx.resolve(block, \"input\", stage, state);\n const flag = attributeFlag((block.serialized[\"attributeType\"] as number | undefined) ?? 0);\n if (flag === null) {\n return input;\n }\n const fallback = ctx.cast(ctx.resolve(block, \"fallback\", stage, state), input.type);\n const expr = ctx.temp(state, \"attr\");\n const s = stage === \"vertex\" ? state.vertex : state.fragment;\n s.body.push(`let ${expr} = select(${fallback.expr}, ${input.expr}, ${flag} > 0.5);`);\n return { expr, type: input.type } as NodeExpr;\n },\n};\n"],"names":[],"mappings":"AAYA,SAAS,cAAc,eAAsC;AACzD,UAAQ,eAAA;AAAA,IACJ,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AACD,aAAO;AAAA,IACX,KAAK;AAAA;AAAA,IACL,KAAK;AAAA;AAAA,IACL,KAAK;AAAA;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EAAA;AAEnB;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,0BAA0B;AAChC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,UAAM,OAAO,cAAe,MAAM,WAAW,eAAe,KAA4B,CAAC;AACzF,QAAI,SAAS,MAAM;AACf,aAAO;AAAA,IACX;AACA,UAAM,WAAW,IAAI,KAAK,IAAI,QAAQ,OAAO,YAAY,OAAO,KAAK,GAAG,MAAM,IAAI;AAClF,UAAM,OAAO,IAAI,KAAK,OAAO,MAAM;AACnC,UAAM,IAAI,UAAU,WAAW,MAAM,SAAS,MAAM;AACpD,MAAE,KAAK,KAAK,OAAO,IAAI,aAAa,SAAS,IAAI,KAAK,MAAM,IAAI,KAAK,IAAI,UAAU;AACnF,WAAO,EAAE,MAAM,MAAM,MAAM,KAAA;AAAA,EAC/B;AACJ;"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { aV as computeUboLayout, aW as SCENE_UBO_WGSL } from "./index-C8HOR2sB.js";
|
|
2
|
+
const STAGE_VERTEX = 1;
|
|
3
|
+
const STAGE_FRAGMENT = 2;
|
|
4
|
+
function topoSort(fragments) {
|
|
5
|
+
const byId = /* @__PURE__ */ new Map();
|
|
6
|
+
for (const f of fragments) {
|
|
7
|
+
if (byId.has(f._id)) {
|
|
8
|
+
throw Error();
|
|
9
|
+
}
|
|
10
|
+
byId.set(f._id, f);
|
|
11
|
+
}
|
|
12
|
+
const inDeg = /* @__PURE__ */ new Map();
|
|
13
|
+
const deps = /* @__PURE__ */ new Map();
|
|
14
|
+
for (const f of fragments) {
|
|
15
|
+
if (!inDeg.has(f._id)) {
|
|
16
|
+
inDeg.set(f._id, 0);
|
|
17
|
+
}
|
|
18
|
+
for (const d of f._dependencies ?? []) {
|
|
19
|
+
if (!byId.has(d)) {
|
|
20
|
+
throw Error();
|
|
21
|
+
}
|
|
22
|
+
inDeg.set(f._id, (inDeg.get(f._id) ?? 0) + 1);
|
|
23
|
+
let arr = deps.get(d);
|
|
24
|
+
if (!arr) {
|
|
25
|
+
arr = [];
|
|
26
|
+
deps.set(d, arr);
|
|
27
|
+
}
|
|
28
|
+
arr.push(f._id);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const q = [];
|
|
32
|
+
for (const [id, d] of inDeg) {
|
|
33
|
+
if (d === 0) {
|
|
34
|
+
q.push(id);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
q.sort();
|
|
38
|
+
const out = [];
|
|
39
|
+
let qi = 0;
|
|
40
|
+
while (qi < q.length) {
|
|
41
|
+
const id = q[qi++];
|
|
42
|
+
out.push(byId.get(id));
|
|
43
|
+
for (const d of deps.get(id) ?? []) {
|
|
44
|
+
const nd = (inDeg.get(d) ?? 1) - 1;
|
|
45
|
+
inDeg.set(d, nd);
|
|
46
|
+
if (nd === 0) {
|
|
47
|
+
let i = qi;
|
|
48
|
+
while (i < q.length && q[i] < d) {
|
|
49
|
+
i++;
|
|
50
|
+
}
|
|
51
|
+
q.splice(i, 0, d);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (out.length !== fragments.length) {
|
|
56
|
+
throw Error();
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function dedup(base, extra) {
|
|
61
|
+
const seen = /* @__PURE__ */ new Set();
|
|
62
|
+
const all = [];
|
|
63
|
+
for (const v of base) {
|
|
64
|
+
if (!seen.has(v._name)) {
|
|
65
|
+
seen.add(v._name);
|
|
66
|
+
all.push(v);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const v of extra) {
|
|
70
|
+
if (!seen.has(v._name)) {
|
|
71
|
+
seen.add(v._name);
|
|
72
|
+
all.push(v);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return all;
|
|
76
|
+
}
|
|
77
|
+
function bglEntry(binding, decl) {
|
|
78
|
+
const e = { binding, visibility: decl._visibility };
|
|
79
|
+
switch (decl._type._kind) {
|
|
80
|
+
case "uniform-buffer":
|
|
81
|
+
e.buffer = { type: "uniform" };
|
|
82
|
+
break;
|
|
83
|
+
case "texture": {
|
|
84
|
+
const def = decl._type._textureType === "texture_depth_2d" ? "depth" : decl._type._textureType === "texture_2d<u32>" ? "uint" : "float";
|
|
85
|
+
e.texture = { sampleType: decl._type._sampleType ?? def, viewDimension: decl._type._textureType.includes("cube") ? "cube" : "2d" };
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case "sampler":
|
|
89
|
+
e.sampler = {
|
|
90
|
+
type: decl._type._samplerType === "sampler_comparison" ? "comparison" : decl._type._samplerType === "sampler_non_filtering" ? "non-filtering" : "filtering"
|
|
91
|
+
};
|
|
92
|
+
break;
|
|
93
|
+
case "storage-texture":
|
|
94
|
+
e.storageTexture = { access: decl._type._access, format: decl._type._format };
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
return e;
|
|
98
|
+
}
|
|
99
|
+
function declWGSL(g, b, d) {
|
|
100
|
+
switch (d._type._kind) {
|
|
101
|
+
case "uniform-buffer":
|
|
102
|
+
return `@group(${g})@binding(${b}) var<uniform> ${d._name}:${d._name}Uniforms;`;
|
|
103
|
+
case "texture":
|
|
104
|
+
return `@group(${g})@binding(${b}) var ${d._name}:${d._type._textureType};`;
|
|
105
|
+
case "sampler":
|
|
106
|
+
return `@group(${g})@binding(${b}) var ${d._name}:${d._type._samplerType === "sampler_non_filtering" ? "sampler" : d._type._samplerType};`;
|
|
107
|
+
case "storage-texture":
|
|
108
|
+
return `@group(${g})@binding(${b}) var ${d._name}:texture_storage_2d<${d._type._format},${d._type._access}>;`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const SLOT_RE = /\/\*([A-Z_0-9]+)\*\//g;
|
|
112
|
+
function injectSlots(tpl, sorted, key) {
|
|
113
|
+
return tpl.replace(SLOT_RE, (_, slot) => {
|
|
114
|
+
const parts = [];
|
|
115
|
+
for (const f of sorted) {
|
|
116
|
+
const s = f[key];
|
|
117
|
+
if (s == null ? void 0 : s[slot]) {
|
|
118
|
+
parts.push(s[slot]);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return parts.join("\n");
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function composeShader(template, fragments) {
|
|
125
|
+
var _a;
|
|
126
|
+
const sorted = topoSort(fragments);
|
|
127
|
+
const fragAttrs = [];
|
|
128
|
+
const fragVaryings = [];
|
|
129
|
+
const helpers = [];
|
|
130
|
+
const vHelpers = [];
|
|
131
|
+
const vBuiltins = [];
|
|
132
|
+
for (const f of sorted) {
|
|
133
|
+
if (f._vertexAttributes) {
|
|
134
|
+
fragAttrs.push(...f._vertexAttributes);
|
|
135
|
+
}
|
|
136
|
+
if (f._varyings) {
|
|
137
|
+
fragVaryings.push(...f._varyings);
|
|
138
|
+
}
|
|
139
|
+
if (f._helperFunctions) {
|
|
140
|
+
helpers.push(f._helperFunctions);
|
|
141
|
+
}
|
|
142
|
+
if (f._vertexHelperFunctions) {
|
|
143
|
+
vHelpers.push(f._vertexHelperFunctions);
|
|
144
|
+
}
|
|
145
|
+
for (const b of f._vertexBuiltins ?? []) {
|
|
146
|
+
vBuiltins.push(`@builtin(${b._builtin}) ${b._name}:${b._type},`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const allAttrs = dedup(template._baseVertexAttributes, fragAttrs);
|
|
150
|
+
const inputLines = [];
|
|
151
|
+
const _vertexBufferLayouts = [];
|
|
152
|
+
const groups = /* @__PURE__ */ new Map();
|
|
153
|
+
const firstOfGroup = /* @__PURE__ */ new Map();
|
|
154
|
+
for (let i = 0; i < allAttrs.length; i++) {
|
|
155
|
+
const a = allAttrs[i];
|
|
156
|
+
inputLines.push(`@location(${i}) ${a._name}:${a._type},`);
|
|
157
|
+
if (a._bufferGroup) {
|
|
158
|
+
if (!groups.has(a._bufferGroup)) {
|
|
159
|
+
groups.set(a._bufferGroup, []);
|
|
160
|
+
firstOfGroup.set(a._bufferGroup, a);
|
|
161
|
+
}
|
|
162
|
+
groups.get(a._bufferGroup).push({ loc: i, off: a._offset ?? 0, fmt: a._gpuFormat });
|
|
163
|
+
} else {
|
|
164
|
+
_vertexBufferLayouts.push({
|
|
165
|
+
arrayStride: a._arrayStride,
|
|
166
|
+
stepMode: a._stepMode ?? "vertex",
|
|
167
|
+
attributes: [{ shaderLocation: i, offset: a._offset ?? 0, format: a._gpuFormat }]
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
for (const [grp, attrs] of groups) {
|
|
172
|
+
const f = firstOfGroup.get(grp);
|
|
173
|
+
_vertexBufferLayouts.push({
|
|
174
|
+
arrayStride: f._arrayStride,
|
|
175
|
+
stepMode: f._stepMode ?? "vertex",
|
|
176
|
+
attributes: attrs.map((a) => ({ shaderLocation: a.loc, offset: a.off, format: a.fmt }))
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
let nextLoc = allAttrs.length;
|
|
180
|
+
for (const f of sorted) {
|
|
181
|
+
if (f._pipelineVertexBuffers) {
|
|
182
|
+
const r = f._pipelineVertexBuffers(nextLoc);
|
|
183
|
+
_vertexBufferLayouts.push(...r._buffers);
|
|
184
|
+
nextLoc = r._nextLoc;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const allVary = dedup(template._baseVaryings, fragVaryings);
|
|
188
|
+
const varyBody = `@builtin(position) clipPos:vec4f,
|
|
189
|
+
` + allVary.map((v, i) => `@location(${i}) ${v._name}:${v._type},`).join("\n");
|
|
190
|
+
const hasMaterialUbo = !!(template._baseMaterialUboFields && template._baseMaterialUboFields.length > 0);
|
|
191
|
+
const meshFields = [...template._baseMeshUboFields];
|
|
192
|
+
const materialFields = hasMaterialUbo ? [...template._baseMaterialUboFields] : [];
|
|
193
|
+
for (const f of sorted) {
|
|
194
|
+
if ((_a = f._uboFields) == null ? void 0 : _a.length) {
|
|
195
|
+
(hasMaterialUbo ? materialFields : meshFields).push(...f._uboFields);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const _meshUboSpec = computeUboLayout(meshFields);
|
|
199
|
+
const _materialUboSpec = hasMaterialUbo ? computeUboLayout(materialFields) : void 0;
|
|
200
|
+
const meshBGL = [{ binding: 0, visibility: STAGE_VERTEX | STAGE_FRAGMENT, buffer: { type: "uniform" } }];
|
|
201
|
+
if (hasMaterialUbo) {
|
|
202
|
+
meshBGL.push({ binding: 1, visibility: STAGE_FRAGMENT, buffer: { type: "uniform" } });
|
|
203
|
+
}
|
|
204
|
+
const shadowBGL = [];
|
|
205
|
+
const vDecls = [];
|
|
206
|
+
const fDecls = [];
|
|
207
|
+
let mb = hasMaterialUbo ? 2 : 1, sb = 0;
|
|
208
|
+
function addBinding(d, _isVertex) {
|
|
209
|
+
const isShadow = d._group === "shadow";
|
|
210
|
+
const b = isShadow ? sb++ : mb++;
|
|
211
|
+
const g = isShadow ? 2 : 1;
|
|
212
|
+
(isShadow ? shadowBGL : meshBGL).push(bglEntry(b, d));
|
|
213
|
+
const w = declWGSL(g, b, d);
|
|
214
|
+
if (d._visibility & STAGE_VERTEX) {
|
|
215
|
+
vDecls.push(w);
|
|
216
|
+
}
|
|
217
|
+
if (d._visibility & STAGE_FRAGMENT) {
|
|
218
|
+
fDecls.push(w);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
for (const d of template._baseVertexBindings ?? []) {
|
|
222
|
+
addBinding(d);
|
|
223
|
+
}
|
|
224
|
+
for (const f of sorted) {
|
|
225
|
+
for (const d of f._vertexBindings ?? []) {
|
|
226
|
+
addBinding(d);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
for (const d of template._baseBindings ?? []) {
|
|
230
|
+
addBinding(d);
|
|
231
|
+
}
|
|
232
|
+
for (const f of sorted) {
|
|
233
|
+
for (const d of (f._bindings ?? []).filter((b) => (b._group ?? "mesh") === "mesh")) {
|
|
234
|
+
addBinding(d);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
for (const f of sorted) {
|
|
238
|
+
for (const d of (f._bindings ?? []).filter((b) => b._group === "shadow")) {
|
|
239
|
+
addBinding(d);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const _fragmentKey = sorted.map((f) => f._id).join("|");
|
|
243
|
+
const vParams = (vBuiltins.length ? vBuiltins.join("\n") + "\n" : "") + inputLines.join("\n");
|
|
244
|
+
const meshStruct = `struct MeshUniforms{
|
|
245
|
+
${_meshUboSpec._structBody}
|
|
246
|
+
}`;
|
|
247
|
+
const materialStruct = _materialUboSpec ? `
|
|
248
|
+
struct MaterialUniforms{
|
|
249
|
+
${_materialUboSpec._structBody}
|
|
250
|
+
}
|
|
251
|
+
@group(1)@binding(1) var<uniform> material:MaterialUniforms;` : "";
|
|
252
|
+
let _vertexWGSL = template._vertexTemplate;
|
|
253
|
+
_vertexWGSL = _vertexWGSL.replace("/*SU*/", SCENE_UBO_WGSL);
|
|
254
|
+
_vertexWGSL = _vertexWGSL.replace("/*MU*/", meshStruct);
|
|
255
|
+
_vertexWGSL = _vertexWGSL.replace("/*VI*/", `struct VertexInput{
|
|
256
|
+
${inputLines.join("\n")}
|
|
257
|
+
}`);
|
|
258
|
+
_vertexWGSL = _vertexWGSL.replace("/*VO*/", `struct VertexOutput{
|
|
259
|
+
${varyBody}
|
|
260
|
+
}`);
|
|
261
|
+
_vertexWGSL = _vertexWGSL.replace("/*VD*/", vDecls.join("\n"));
|
|
262
|
+
_vertexWGSL = _vertexWGSL.replace("/*VP*/", vParams);
|
|
263
|
+
_vertexWGSL = _vertexWGSL.replace("/*VH*/", vHelpers.join("\n"));
|
|
264
|
+
_vertexWGSL = injectSlots(_vertexWGSL, sorted, "_vertexSlots");
|
|
265
|
+
let _fragmentWGSL = template._fragmentTemplate;
|
|
266
|
+
_fragmentWGSL = _fragmentWGSL.replace("/*SU*/", SCENE_UBO_WGSL);
|
|
267
|
+
_fragmentWGSL = _fragmentWGSL.replace("/*MU*/", meshStruct + materialStruct);
|
|
268
|
+
_fragmentWGSL = _fragmentWGSL.replace("/*FI*/", `struct FragmentInput{
|
|
269
|
+
${varyBody}
|
|
270
|
+
}`);
|
|
271
|
+
_fragmentWGSL = _fragmentWGSL.replace("/*HF*/", helpers.join("\n"));
|
|
272
|
+
_fragmentWGSL = _fragmentWGSL.replace("/*FB*/", fDecls.join("\n"));
|
|
273
|
+
_fragmentWGSL = injectSlots(_fragmentWGSL, sorted, "_fragmentSlots");
|
|
274
|
+
const _meshBGLDescriptor = { entries: meshBGL };
|
|
275
|
+
const _shadowBGLDescriptor = shadowBGL.length ? { entries: shadowBGL } : null;
|
|
276
|
+
return {
|
|
277
|
+
_vertexWGSL,
|
|
278
|
+
_fragmentWGSL,
|
|
279
|
+
_meshBGLDescriptor,
|
|
280
|
+
_shadowBGLDescriptor,
|
|
281
|
+
_vertexBufferLayouts,
|
|
282
|
+
_meshUboSpec,
|
|
283
|
+
_materialUboSpec,
|
|
284
|
+
_fragmentKey
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
const MSH_HAS_TANGENTS = 1 << 0;
|
|
288
|
+
const MSH_HAS_SKELETON = 1 << 1;
|
|
289
|
+
const MSH_HAS_SKELETON_8 = 1 << 2;
|
|
290
|
+
const MSH_HAS_MORPH_TARGETS = 1 << 3;
|
|
291
|
+
const MSH_HAS_THIN_INSTANCES = 1 << 4;
|
|
292
|
+
const MSH_HAS_INSTANCE_COLOR = 1 << 5;
|
|
293
|
+
const MSH_HAS_VERTEX_COLOR = 1 << 6;
|
|
294
|
+
const MSH_HAS_UV2 = 1 << 7;
|
|
295
|
+
const MSH_RECEIVE_SHADOWS = 1 << 8;
|
|
296
|
+
function _computeMeshFeatures(mesh, receiveShadows = false) {
|
|
297
|
+
const gpu = mesh._gpu;
|
|
298
|
+
let features = 0;
|
|
299
|
+
if (gpu.tangentBuffer) {
|
|
300
|
+
features |= MSH_HAS_TANGENTS;
|
|
301
|
+
}
|
|
302
|
+
if (mesh.skeleton) {
|
|
303
|
+
features |= MSH_HAS_SKELETON;
|
|
304
|
+
if (mesh.skeleton.joints1Buffer) {
|
|
305
|
+
features |= MSH_HAS_SKELETON_8;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (mesh.morphTargets) {
|
|
309
|
+
features |= MSH_HAS_MORPH_TARGETS;
|
|
310
|
+
}
|
|
311
|
+
if (mesh.thinInstances) {
|
|
312
|
+
features |= MSH_HAS_THIN_INSTANCES;
|
|
313
|
+
if (mesh.thinInstances.colors) {
|
|
314
|
+
features |= MSH_HAS_INSTANCE_COLOR;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
if (gpu.colorBuffer) {
|
|
318
|
+
features |= MSH_HAS_VERTEX_COLOR;
|
|
319
|
+
}
|
|
320
|
+
if (gpu.uv2Buffer) {
|
|
321
|
+
features |= MSH_HAS_UV2;
|
|
322
|
+
}
|
|
323
|
+
if (receiveShadows) {
|
|
324
|
+
features |= MSH_RECEIVE_SHADOWS;
|
|
325
|
+
}
|
|
326
|
+
return features;
|
|
327
|
+
}
|
|
328
|
+
export {
|
|
329
|
+
MSH_HAS_SKELETON as M,
|
|
330
|
+
_computeMeshFeatures as _,
|
|
331
|
+
MSH_HAS_SKELETON_8 as a,
|
|
332
|
+
MSH_HAS_MORPH_TARGETS as b,
|
|
333
|
+
MSH_HAS_UV2 as c,
|
|
334
|
+
MSH_HAS_TANGENTS as d,
|
|
335
|
+
composeShader as e,
|
|
336
|
+
MSH_RECEIVE_SHADOWS as f,
|
|
337
|
+
MSH_HAS_THIN_INSTANCES as g,
|
|
338
|
+
MSH_HAS_VERTEX_COLOR as h,
|
|
339
|
+
MSH_HAS_INSTANCE_COLOR as i
|
|
340
|
+
};
|
|
341
|
+
//# sourceMappingURL=mesh-features-BLENkYVt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-features-BLENkYVt.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 = { sampleType: (decl._type._sampleType ?? def) as GPUTextureSampleType, viewDimension: decl._type._textureType.includes(\"cube\") ? \"cube\" : \"2d\" };\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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"min-block-CHtBngNl.js","sources":["../src/material/node/blocks/min-block.ts"],"sourcesContent":["import { binaryEmitter } from \"./_math-factory.js\";\nexport const emitter = binaryEmitter(\"MinBlock\", (l, r) => `min(${l}, ${r})`);\n"],"names":[],"mappings":";AACO,MAAM,UAAU,cAAc,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod-block-Ceizv8Y7.js","sources":["../src/material/node/blocks/mod-block.ts"],"sourcesContent":["import { binaryEmitter } from \"./_math-factory.js\";\n\nexport const emitter = binaryEmitter(\"ModBlock\", (l, r) => `${l} % ${r}`);\n"],"names":[],"mappings":";AAEO,MAAM,UAAU,cAAc,YAAY,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE;"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { b as MSH_HAS_MORPH_TARGETS } from "./mesh-features-BLENkYVt.js";
|
|
2
|
+
const STAGE_VERTEX = 1;
|
|
3
|
+
const MORPH_PRE_SKINNING = `var morphedPos = position;
|
|
4
|
+
var morphedNorm = normal;
|
|
5
|
+
let mCol = i32(vertexIndex % morph.texWidth);
|
|
6
|
+
let mRowInBand = i32(vertexIndex / morph.texWidth);
|
|
7
|
+
for (var i = 0u; i < morph.count; i = i + 1u) {
|
|
8
|
+
let w = morph.weights[i];
|
|
9
|
+
let posBase = i32(i * 2u) * i32(morph.rowsPerBand);
|
|
10
|
+
let normBase = i32(i * 2u + 1u) * i32(morph.rowsPerBand);
|
|
11
|
+
morphedPos = morphedPos + w * textureLoad(morphTargets, vec2<i32>(mCol, posBase + mRowInBand), 0).xyz;
|
|
12
|
+
morphedNorm = morphedNorm + w * textureLoad(morphTargets, vec2<i32>(mCol, normBase + mRowInBand), 0).xyz;
|
|
13
|
+
}`;
|
|
14
|
+
function createMorphFragment() {
|
|
15
|
+
return {
|
|
16
|
+
_id: "morph",
|
|
17
|
+
_vertexBuiltins: [{ _name: "vertexIndex", _builtin: "vertex_index", _type: "u32" }],
|
|
18
|
+
_vertexHelperFunctions: `struct morphUniforms {
|
|
19
|
+
weights: vec4<f32>,
|
|
20
|
+
count: u32,
|
|
21
|
+
texWidth: u32,
|
|
22
|
+
rowsPerBand: u32,
|
|
23
|
+
_p0: u32,
|
|
24
|
+
}`,
|
|
25
|
+
_vertexBindings: [
|
|
26
|
+
{ _name: "morphTargets", _type: { _kind: "texture", _textureType: "texture_2d<f32>", _sampleType: "unfilterable-float" }, _visibility: STAGE_VERTEX },
|
|
27
|
+
{ _name: "morph", _type: { _kind: "uniform-buffer" }, _visibility: STAGE_VERTEX }
|
|
28
|
+
],
|
|
29
|
+
_vertexSlots: {
|
|
30
|
+
VR: MORPH_PRE_SKINNING
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const pbrExt = {
|
|
35
|
+
id: "morph",
|
|
36
|
+
phase: "vertex",
|
|
37
|
+
frag(ctx) {
|
|
38
|
+
if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS)) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return createMorphFragment();
|
|
42
|
+
},
|
|
43
|
+
bind(ctx, entries, b) {
|
|
44
|
+
const mesh = ctx._mesh;
|
|
45
|
+
if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS) || !(mesh == null ? void 0 : mesh.morphTargets)) {
|
|
46
|
+
return b;
|
|
47
|
+
}
|
|
48
|
+
entries.push({ binding: b++, resource: mesh.morphTargets.texture.createView() });
|
|
49
|
+
if (mesh.morphTargets.weightsBuffer) {
|
|
50
|
+
entries.push({ binding: b++, resource: { buffer: mesh.morphTargets.weightsBuffer } });
|
|
51
|
+
}
|
|
52
|
+
return b;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
createMorphFragment,
|
|
57
|
+
pbrExt
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=morph-fragment-DOVo70gP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"morph-fragment-DOVo70gP.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;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const PASSTHROUGH_KINDS = /* @__PURE__ */ new Set(["tangent", "uv", "uv2"]);
|
|
2
|
+
const emitter = {
|
|
3
|
+
className: "MorphTargetsBlock",
|
|
4
|
+
stage: "vertex",
|
|
5
|
+
emit(block, outputName, stage, state, ctx) {
|
|
6
|
+
state.usesMorphTargets = true;
|
|
7
|
+
const kind = outputName.replace(/Output$/, "");
|
|
8
|
+
const input = block.inputs.get(kind);
|
|
9
|
+
if (!(input == null ? void 0 : input.source)) {
|
|
10
|
+
return fallback(kind);
|
|
11
|
+
}
|
|
12
|
+
const v = ctx.resolve(block, kind, stage, state);
|
|
13
|
+
if (kind === "position") {
|
|
14
|
+
const base = ctx.cast(v, "vec3f").expr;
|
|
15
|
+
return { expr: `nme_morphPosition(${base}, vertexIndex)`, type: "vec3f" };
|
|
16
|
+
}
|
|
17
|
+
if (kind === "normal") {
|
|
18
|
+
const base = ctx.cast(v, "vec3f").expr;
|
|
19
|
+
return { expr: `nme_morphNormal(${base}, vertexIndex)`, type: "vec3f" };
|
|
20
|
+
}
|
|
21
|
+
if (PASSTHROUGH_KINDS.has(kind)) {
|
|
22
|
+
return v;
|
|
23
|
+
}
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
function fallback(kind) {
|
|
28
|
+
const type = kind === "uv" || kind === "uv2" ? "vec2f" : kind === "tangent" ? "vec4f" : "vec3f";
|
|
29
|
+
const zero = type === "vec2f" ? "vec2<f32>(0.0)" : type === "vec4f" ? "vec4<f32>(0.0)" : "vec3<f32>(0.0)";
|
|
30
|
+
return { expr: zero, type };
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
emitter
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=morph-targets-55z342ZB.js.map
|