@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,110 @@
|
|
|
1
|
+
const STAGE_FRAGMENT = 2;
|
|
2
|
+
const STAGE_VERTEX = 1;
|
|
3
|
+
function createShadowFragment(id, shadowLights) {
|
|
4
|
+
const varyings = [];
|
|
5
|
+
const bindings = [];
|
|
6
|
+
const vertexLines = [];
|
|
7
|
+
const fragmentLines = [];
|
|
8
|
+
const helperParts = [];
|
|
9
|
+
for (const slot of shadowLights) {
|
|
10
|
+
const li = slot.lightIndex;
|
|
11
|
+
const suffix = `_${li}`;
|
|
12
|
+
varyings.push({ _name: `vPosFromLight${suffix}`, _type: "vec4<f32>" }, { _name: `vDepthMetric${suffix}`, _type: "f32" });
|
|
13
|
+
if (slot.shadowType === "pcf") {
|
|
14
|
+
bindings.push(
|
|
15
|
+
{ _name: `shadowTex${suffix}`, _type: { _kind: "texture", _textureType: "texture_depth_2d", _sampleType: "depth" }, _group: "shadow", _visibility: STAGE_FRAGMENT },
|
|
16
|
+
{ _name: `shadowComp${suffix}`, _type: { _kind: "sampler", _samplerType: "sampler_comparison" }, _group: "shadow", _visibility: STAGE_FRAGMENT }
|
|
17
|
+
);
|
|
18
|
+
} else {
|
|
19
|
+
bindings.push(
|
|
20
|
+
{ _name: `shadowTex${suffix}`, _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _group: "shadow", _visibility: STAGE_FRAGMENT },
|
|
21
|
+
{ _name: `shadowSamp${suffix}`, _type: { _kind: "sampler", _samplerType: "sampler" }, _group: "shadow", _visibility: STAGE_FRAGMENT }
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
bindings.push({ _name: `shadowInfo${suffix}`, _type: { _kind: "uniform-buffer" }, _group: "shadow", _visibility: STAGE_FRAGMENT | STAGE_VERTEX });
|
|
25
|
+
vertexLines.push(
|
|
26
|
+
`out.vPosFromLight${suffix} = shadowInfo${suffix}.lightMatrix * worldPos4;`,
|
|
27
|
+
`out.vDepthMetric${suffix} = (out.vPosFromLight${suffix}.z + shadowInfo${suffix}.depthValues.x) / shadowInfo${suffix}.depthValues.y;`
|
|
28
|
+
);
|
|
29
|
+
if (slot.shadowType === "pcf") {
|
|
30
|
+
fragmentLines.push(
|
|
31
|
+
`shadowFactors[${li}] = computeShadowPCF${suffix}(input.vPosFromLight${suffix}, input.vDepthMetric${suffix}, shadowInfo${suffix}.shadowsInfo.x, shadowInfo${suffix}.shadowsInfo.y, shadowInfo${suffix}.shadowsInfo.z);`
|
|
32
|
+
);
|
|
33
|
+
} else {
|
|
34
|
+
fragmentLines.push(
|
|
35
|
+
`shadowFactors[${li}] = computeShadowESM${suffix}(input.vPosFromLight${suffix}, input.vDepthMetric${suffix}, shadowInfo${suffix}.shadowsInfo.x, shadowInfo${suffix}.shadowsInfo.z, shadowInfo${suffix}.shadowsInfo.w);`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
for (const slot of shadowLights) {
|
|
40
|
+
const li = slot.lightIndex;
|
|
41
|
+
const suffix = `_${li}`;
|
|
42
|
+
helperParts.push(`struct shadowInfo${suffix}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`);
|
|
43
|
+
if (slot.shadowType === "pcf") {
|
|
44
|
+
helperParts.push(`
|
|
45
|
+
fn computeShadowPCF${suffix}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {
|
|
46
|
+
let clipSpace = posFromLight.xyz / posFromLight.w;
|
|
47
|
+
let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);
|
|
48
|
+
if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }
|
|
49
|
+
let depthRef = clamp(clipSpace.z, 0.0, 1.0);
|
|
50
|
+
var tc = uv * mapSz + 0.5;
|
|
51
|
+
let st = fract(tc);
|
|
52
|
+
let base = (floor(tc) - 0.5) * invMapSz;
|
|
53
|
+
let uvw0 = 4.0 - 3.0 * st;
|
|
54
|
+
let uvw1 = vec2<f32>(7.0);
|
|
55
|
+
let uvw2 = 1.0 + 3.0 * st;
|
|
56
|
+
let u = vec3<f32>((3.0 - 2.0 * st.x) / uvw0.x - 2.0, (3.0 + st.x) / uvw1.x, st.x / uvw2.x + 2.0) * invMapSz;
|
|
57
|
+
let v = vec3<f32>((3.0 - 2.0 * st.y) / uvw0.y - 2.0, (3.0 + st.y) / uvw1.y, st.y / uvw2.y + 2.0) * invMapSz;
|
|
58
|
+
var sh = 0.0;
|
|
59
|
+
sh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[0], v[0]), depthRef);
|
|
60
|
+
sh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[1], v[0]), depthRef);
|
|
61
|
+
sh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[2], v[0]), depthRef);
|
|
62
|
+
sh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[0], v[1]), depthRef);
|
|
63
|
+
sh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[1], v[1]), depthRef);
|
|
64
|
+
sh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[2], v[1]), depthRef);
|
|
65
|
+
sh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[0], v[2]), depthRef);
|
|
66
|
+
sh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[1], v[2]), depthRef);
|
|
67
|
+
sh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[2], v[2]), depthRef);
|
|
68
|
+
sh /= 144.0;
|
|
69
|
+
return mix(darkness, 1.0, sh);
|
|
70
|
+
}`);
|
|
71
|
+
} else {
|
|
72
|
+
helperParts.push(`
|
|
73
|
+
fn computeFallOff${suffix}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {
|
|
74
|
+
let mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));
|
|
75
|
+
return mix(value, 1.0, mask);
|
|
76
|
+
}
|
|
77
|
+
fn computeShadowESM${suffix}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {
|
|
78
|
+
let clipSpace = posFromLight.xyz / posFromLight.w;
|
|
79
|
+
let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);
|
|
80
|
+
if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }
|
|
81
|
+
let shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);
|
|
82
|
+
let shadowMapSample = textureSampleLevel(shadowTex${suffix}, shadowSamp${suffix}, uv, 0.0).x;
|
|
83
|
+
let esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);
|
|
84
|
+
return computeFallOff${suffix}(esm, clipSpace.xy, frustumEdgeFalloff);
|
|
85
|
+
}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const vertexHelperParts = [];
|
|
89
|
+
for (const slot of shadowLights) {
|
|
90
|
+
const suffix = `_${slot.lightIndex}`;
|
|
91
|
+
vertexHelperParts.push(`struct shadowInfo${suffix}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
_id: id,
|
|
95
|
+
_varyings: varyings,
|
|
96
|
+
_bindings: bindings,
|
|
97
|
+
_helperFunctions: helperParts.join("\n"),
|
|
98
|
+
_vertexHelperFunctions: vertexHelperParts.join("\n"),
|
|
99
|
+
_vertexSlots: {
|
|
100
|
+
VB: vertexLines.join("\n")
|
|
101
|
+
},
|
|
102
|
+
_fragmentSlots: {
|
|
103
|
+
AD: fragmentLines.join("\n")
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
createShadowFragment as c
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=shadow-fragment-core-DHN2G6FI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-fragment-core-DHN2G6FI.js","sources":["../src/shader/fragments/shadow-fragment-core.ts"],"sourcesContent":["/**\n * Shadow Fragment Core — Shared WGSL Generation for Shadows\n *\n * Contains the shadow sampling WGSL codegen shared by both Standard and PBR\n * materials. Each material wrapper calls `createShadowFragment` with its own\n * fragment ID (\"std-shadow\" / \"pbr-shadow\"), keeping the generated shader\n * code byte-for-byte identical.\n *\n * Zero module-level side effects — safe for tree-shaking.\n */\n\nimport type { ShaderFragment, BindingDecl, Varying } from \"../fragment-types.js\";\n\nconst STAGE_FRAGMENT = 0x2;\nconst STAGE_VERTEX = 0x1;\n\n/** Describes one shadow-casting light for the fragment generator. */\nexport interface ShadowLightSlot {\n /** Index of this light in the scene.lights array (0-based). */\n lightIndex: number;\n /** Shadow type for this light. */\n shadowType: \"esm\" | \"pcf\";\n}\n\n/**\n * Create a per-light shadow fragment.\n * Each shadow-casting light gets its own varying, bindings, and sampling code.\n * The shadow factor for each light is stored in shadowFactors[lightIndex].\n */\nexport function createShadowFragment(id: string, shadowLights: ShadowLightSlot[]): ShaderFragment {\n const varyings: Varying[] = [];\n const bindings: BindingDecl[] = [];\n const vertexLines: string[] = [];\n const fragmentLines: string[] = [];\n const helperParts: string[] = [];\n\n for (const slot of shadowLights) {\n const li = slot.lightIndex;\n const suffix = `_${li}`;\n\n varyings.push({ _name: `vPosFromLight${suffix}`, _type: \"vec4<f32>\" }, { _name: `vDepthMetric${suffix}`, _type: \"f32\" });\n\n if (slot.shadowType === \"pcf\") {\n bindings.push(\n { _name: `shadowTex${suffix}`, _type: { _kind: \"texture\", _textureType: \"texture_depth_2d\", _sampleType: \"depth\" }, _group: \"shadow\", _visibility: STAGE_FRAGMENT },\n { _name: `shadowComp${suffix}`, _type: { _kind: \"sampler\", _samplerType: \"sampler_comparison\" }, _group: \"shadow\", _visibility: STAGE_FRAGMENT }\n );\n } else {\n bindings.push(\n { _name: `shadowTex${suffix}`, _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _group: \"shadow\", _visibility: STAGE_FRAGMENT },\n { _name: `shadowSamp${suffix}`, _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _group: \"shadow\", _visibility: STAGE_FRAGMENT }\n );\n }\n bindings.push({ _name: `shadowInfo${suffix}`, _type: { _kind: \"uniform-buffer\" }, _group: \"shadow\", _visibility: STAGE_FRAGMENT | STAGE_VERTEX });\n\n vertexLines.push(\n `out.vPosFromLight${suffix} = shadowInfo${suffix}.lightMatrix * worldPos4;`,\n `out.vDepthMetric${suffix} = (out.vPosFromLight${suffix}.z + shadowInfo${suffix}.depthValues.x) / shadowInfo${suffix}.depthValues.y;`\n );\n\n if (slot.shadowType === \"pcf\") {\n fragmentLines.push(\n `shadowFactors[${li}] = computeShadowPCF${suffix}(input.vPosFromLight${suffix}, input.vDepthMetric${suffix}, shadowInfo${suffix}.shadowsInfo.x, shadowInfo${suffix}.shadowsInfo.y, shadowInfo${suffix}.shadowsInfo.z);`\n );\n } else {\n fragmentLines.push(\n `shadowFactors[${li}] = computeShadowESM${suffix}(input.vPosFromLight${suffix}, input.vDepthMetric${suffix}, shadowInfo${suffix}.shadowsInfo.x, shadowInfo${suffix}.shadowsInfo.z, shadowInfo${suffix}.shadowsInfo.w);`\n );\n }\n }\n\n // Helper structs + sampling functions\n for (const slot of shadowLights) {\n const li = slot.lightIndex;\n const suffix = `_${li}`;\n helperParts.push(`struct shadowInfo${suffix}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`);\n\n if (slot.shadowType === \"pcf\") {\n helperParts.push(`\nfn computeShadowPCF${suffix}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {\nlet clipSpace = posFromLight.xyz / posFromLight.w;\nlet uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\nif (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\nlet depthRef = clamp(clipSpace.z, 0.0, 1.0);\nvar tc = uv * mapSz + 0.5;\nlet st = fract(tc);\nlet base = (floor(tc) - 0.5) * invMapSz;\nlet uvw0 = 4.0 - 3.0 * st;\nlet uvw1 = vec2<f32>(7.0);\nlet uvw2 = 1.0 + 3.0 * st;\nlet u = vec3<f32>((3.0 - 2.0 * st.x) / uvw0.x - 2.0, (3.0 + st.x) / uvw1.x, st.x / uvw2.x + 2.0) * invMapSz;\nlet v = vec3<f32>((3.0 - 2.0 * st.y) / uvw0.y - 2.0, (3.0 + st.y) / uvw1.y, st.y / uvw2.y + 2.0) * invMapSz;\nvar sh = 0.0;\nsh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[0], v[0]), depthRef);\nsh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[1], v[0]), depthRef);\nsh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[2], v[0]), depthRef);\nsh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[0], v[1]), depthRef);\nsh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[1], v[1]), depthRef);\nsh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[2], v[1]), depthRef);\nsh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[0], v[2]), depthRef);\nsh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[1], v[2]), depthRef);\nsh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suffix}, shadowComp${suffix}, base + vec2<f32>(u[2], v[2]), depthRef);\nsh /= 144.0;\nreturn mix(darkness, 1.0, sh);\n}`);\n } else {\n helperParts.push(`\nfn computeFallOff${suffix}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {\nlet mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));\nreturn mix(value, 1.0, mask);\n}\nfn computeShadowESM${suffix}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {\nlet clipSpace = posFromLight.xyz / posFromLight.w;\nlet uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\nif (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\nlet shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);\nlet shadowMapSample = textureSampleLevel(shadowTex${suffix}, shadowSamp${suffix}, uv, 0.0).x;\nlet esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);\nreturn computeFallOff${suffix}(esm, clipSpace.xy, frustumEdgeFalloff);\n}`);\n }\n }\n\n // Vertex helper: UBO struct declarations (needed for lightMatrix access in vertex shader)\n const vertexHelperParts: string[] = [];\n for (const slot of shadowLights) {\n const suffix = `_${slot.lightIndex}`;\n vertexHelperParts.push(`struct shadowInfo${suffix}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`);\n }\n\n return {\n _id: id,\n _varyings: varyings,\n _bindings: bindings,\n _helperFunctions: helperParts.join(\"\\n\"),\n _vertexHelperFunctions: vertexHelperParts.join(\"\\n\"),\n _vertexSlots: {\n VB: vertexLines.join(\"\\n\"),\n },\n _fragmentSlots: {\n AD: fragmentLines.join(\"\\n\"),\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const emitter = {
|
|
2
|
+
className: "ShadowMapBlock",
|
|
3
|
+
stage: "fragment",
|
|
4
|
+
emit(block, _outputName, _stage, _state, _ctx) {
|
|
5
|
+
const idxRaw = block.serialized.lightId;
|
|
6
|
+
const idx = typeof idxRaw === "number" ? idxRaw : 0;
|
|
7
|
+
return { expr: `_NME_SHADOW_${idx}_`, type: "f32" };
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
emitter
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=shadow-map-CQNQC-Fw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-map-CQNQC-Fw.js","sources":["../src/material/node/blocks/shadow-map.ts"],"sourcesContent":["/** ShadowMapBlock — samples a light's shadow map and returns a shadow factor.\n *\n * Inputs: worldPosition, worldNormal, lightDirection.\n * Output: output (f32 in [0, 1], 1.0 = fully lit).\n *\n * The pipeline builder is responsible for binding the shadow map +\n * light-space-projection matrix under `_NME_SHADOW_MAP_<idx>_` sentinels.\n * Until that integration lands this emitter returns a conservative 1.0 — the\n * pipeline builder rewrites the expression when a real shadow generator is\n * attached to the selected light.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ShadowMapBlock\",\n stage: \"fragment\",\n emit(block, _outputName, _stage, _state, _ctx) {\n const idxRaw = block.serialized.lightId;\n const idx = typeof idxRaw === \"number\" ? idxRaw : 0;\n return { expr: `_NME_SHADOW_${idx}_`, type: \"f32\" };\n },\n};\n"],"names":[],"mappings":"AAcO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,aAAa,QAAQ,QAAQ,MAAM;AAC3C,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,MAAM,OAAO,WAAW,WAAW,SAAS;AAClD,WAAO,EAAE,MAAM,eAAe,GAAG,KAAK,MAAM,MAAA;AAAA,EAChD;AACJ;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const emitter = {
|
|
2
|
+
className: "SheenBlock",
|
|
3
|
+
stage: "fragment",
|
|
4
|
+
emit(_block, _outputName, _stage, state, _ctx) {
|
|
5
|
+
state.usesSheen = true;
|
|
6
|
+
return { expr: `vec3<f32>(0.0)`, type: "vec3f" };
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
emitter
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=sheen-block-BugfJqK3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheen-block-BugfJqK3.js","sources":["../src/material/node/blocks/sheen-block.ts"],"sourcesContent":["/** SheenBlock — soft cloth/velvet sheen layer marker for PBR-MR.\n *\n * Like ClearCoatBlock, this is a marker: it flips `state.usesSheen` so PBR-MR\n * knows to emit the Charlie-NDF + Ashikhmin-visibility code path, and PBR-MR\n * walks into the connected SheenBlock to gather intensity / color / roughness.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"SheenBlock\",\n stage: \"fragment\",\n emit(_block, _outputName, _stage, state, _ctx) {\n state.usesSheen = true;\n return { expr: `vec3<f32>(0.0)`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AASO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,QAAQ,aAAa,QAAQ,OAAO,MAAM;AAC3C,UAAM,YAAY;AAClB,WAAO,EAAE,MAAM,kBAAkB,MAAM,QAAA;AAAA,EAC3C;AACJ;"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { aA as PBR_HAS_SHEEN_TEXTURE, aB as PBR_HAS_SHEEN, aC as PBR2_HAS_SHEEN_UV_TX, aD as PBR_HAS_SHEEN_ALBEDO_SCALING } from "./index-C8HOR2sB.js";
|
|
2
|
+
const STAGE_FRAGMENT = 2;
|
|
3
|
+
const SHEEN_HELPERS = `
|
|
4
|
+
fn normalDistributionFunction_CharlieSheen(NdotH_sh: f32, alphaG_sh: f32) -> f32 {
|
|
5
|
+
let invR = 1.0 / alphaG_sh;
|
|
6
|
+
let cos2h = NdotH_sh * NdotH_sh;
|
|
7
|
+
let sin2h = 1.0 - cos2h;
|
|
8
|
+
return (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * 3.141592653589793);
|
|
9
|
+
}
|
|
10
|
+
fn visibility_Ashikhmin(NdotL_sh: f32, NdotV_sh: f32) -> f32 {
|
|
11
|
+
return 1.0 / (4.0 * (NdotL_sh + NdotV_sh - NdotL_sh * NdotV_sh));
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
const SHEEN_DIRECT_MOD = (intensityExpr) => `
|
|
15
|
+
{
|
|
16
|
+
let shIntensity = ${intensityExpr};
|
|
17
|
+
let shColorScaled = sheenColorFinal * shIntensity;
|
|
18
|
+
let shRoughness_clamped = max(sheenRoughnessAdjusted, AA_factor_x);
|
|
19
|
+
let shAlphaG = shRoughness_clamped * shRoughness_clamped + 0.0005;
|
|
20
|
+
let shD = normalDistributionFunction_CharlieSheen(NdotH, shAlphaG);
|
|
21
|
+
let shV = visibility_Ashikhmin(NdotL, NdotV);
|
|
22
|
+
sheenDirectTerm = shColorScaled * shD * shV * NdotL * lightColor * lightAtten * material.directIntensity;
|
|
23
|
+
}
|
|
24
|
+
`;
|
|
25
|
+
const SHEEN_IBL_MOD = (intensityExpr, albedoScaling) => `
|
|
26
|
+
{
|
|
27
|
+
let shIntensity_ibl = ${intensityExpr};
|
|
28
|
+
let shColorScaled = sheenColorFinal * shIntensity_ibl;
|
|
29
|
+
let shRoughness_ibl = sheenRoughnessAdjusted;
|
|
30
|
+
let shAlphaG_ibl = shRoughness_ibl * shRoughness_ibl + 0.0005 + AA_factor_y;
|
|
31
|
+
var shSpecLod = log2(cubemapDim * shAlphaG_ibl) * scene.vImageInfos.z;
|
|
32
|
+
let shEnvRadiance = textureSampleLevel(iblTexture, iblSampler, R, clamp(shSpecLod, 0.0, maxLod)).rgb * material.environmentIntensity;
|
|
33
|
+
let shBrdf = textureSampleLevel(brdfLUT, brdfSampler_, vec2<f32>(NdotV, shRoughness_ibl), 0.0);
|
|
34
|
+
let shEnvReflectance = shColorScaled * shBrdf.b${albedoScaling ? " * seo * eho" : ""};
|
|
35
|
+
sheenIblTerm = shEnvRadiance * shEnvReflectance;
|
|
36
|
+
${albedoScaling ? "let shMax = max(shColorScaled.r, max(shColorScaled.g, shColorScaled.b));\nsheenAlbedoScaling = 1.0 - shMax * shBrdf.b;" : ""}
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
const SHEEN_IBL_COLOR_MOD = (albedoScaling) => albedoScaling ? `
|
|
40
|
+
{
|
|
41
|
+
color = (finalIrradiance
|
|
42
|
+
+ finalRadianceScaled
|
|
43
|
+
+ finalSpecularScaled
|
|
44
|
+
+ directDiffuse) * sheenAlbedoScaling
|
|
45
|
+
+ sheenDirectTerm
|
|
46
|
+
+ sheenIblTerm
|
|
47
|
+
+ emissive;
|
|
48
|
+
}
|
|
49
|
+
` : `
|
|
50
|
+
{
|
|
51
|
+
color = finalIrradiance
|
|
52
|
+
+ finalRadianceScaled
|
|
53
|
+
+ finalSpecularScaled
|
|
54
|
+
+ directDiffuse
|
|
55
|
+
+ sheenDirectTerm
|
|
56
|
+
+ sheenIblTerm
|
|
57
|
+
+ emissive;
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
const SHEEN_NON_IBL_MOD = `
|
|
61
|
+
{
|
|
62
|
+
color = color + sheenDirectTerm;
|
|
63
|
+
}
|
|
64
|
+
`;
|
|
65
|
+
function createSheenFragment(hasSheenTexture, hasIbl = false, hasAlbedoScaling = false, hasSheenUvTx = false) {
|
|
66
|
+
let scopeVars = `var sheenDirectTerm = vec3<f32>(0.0);
|
|
67
|
+
var sheenIblTerm = vec3<f32>(0.0);
|
|
68
|
+
var sheenAlbedoScaling = 1.0;
|
|
69
|
+
var sheenColorFinal = material.sheenParams.rgb;
|
|
70
|
+
var sheenRoughnessAdjusted = material.sheenParams2.x;`;
|
|
71
|
+
if (hasSheenTexture) {
|
|
72
|
+
const gammaStmt = hasAlbedoScaling ? "sheenMapData.rgb" : "pow(sheenMapData.rgb, vec3<f32>(2.2))";
|
|
73
|
+
const sheenUvDecl = hasSheenUvTx ? "let sheenUV = vec2<f32>(dot(material.sheenUVm.xy, input.uv), dot(material.sheenUVm.zw, input.uv)) + material.sheenUVt.xy;" : "let sheenUV = input.uv;";
|
|
74
|
+
scopeVars += `
|
|
75
|
+
{
|
|
76
|
+
${sheenUvDecl}
|
|
77
|
+
let sheenMapData = textureSample(sheenTexture_, sheenSampler_, sheenUV);
|
|
78
|
+
sheenColorFinal *= ${gammaStmt};
|
|
79
|
+
sheenRoughnessAdjusted *= sheenMapData.a;
|
|
80
|
+
}`;
|
|
81
|
+
}
|
|
82
|
+
const intensityExpr = hasAlbedoScaling ? "material.sheenParams.a" : "material.sheenParams.a * (1.0 - dielectricF0)";
|
|
83
|
+
const slots = {
|
|
84
|
+
SV: scopeVars,
|
|
85
|
+
AD: SHEEN_DIRECT_MOD(intensityExpr)
|
|
86
|
+
};
|
|
87
|
+
if (hasIbl) {
|
|
88
|
+
slots.AI = SHEEN_IBL_MOD(intensityExpr, hasAlbedoScaling) + SHEEN_IBL_COLOR_MOD(hasAlbedoScaling);
|
|
89
|
+
} else {
|
|
90
|
+
slots.NI = SHEEN_NON_IBL_MOD;
|
|
91
|
+
}
|
|
92
|
+
const bindings = [];
|
|
93
|
+
if (hasSheenTexture) {
|
|
94
|
+
bindings.push(
|
|
95
|
+
{ _name: "sheenTexture_", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
|
|
96
|
+
{ _name: "sheenSampler_", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
const uboFields = [
|
|
100
|
+
{ _name: "sheenParams", _type: "vec4<f32>" },
|
|
101
|
+
{ _name: "sheenParams2", _type: "vec4<f32>" }
|
|
102
|
+
];
|
|
103
|
+
if (hasSheenUvTx) {
|
|
104
|
+
uboFields.push({ _name: "sheenUVm", _type: "vec4<f32>" }, { _name: "sheenUVt", _type: "vec4<f32>" });
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
_id: "sheen",
|
|
108
|
+
_dependencies: hasIbl ? ["ibl"] : void 0,
|
|
109
|
+
_uboFields: uboFields,
|
|
110
|
+
_bindings: bindings,
|
|
111
|
+
_helperFunctions: SHEEN_HELPERS,
|
|
112
|
+
_fragmentSlots: slots
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function writeSheenUBO(data, material, offsets) {
|
|
116
|
+
const sh = material.sheen;
|
|
117
|
+
if (!(sh == null ? void 0 : sh.isEnabled) || !offsets.has("sheenParams")) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const off = offsets.get("sheenParams") / 4;
|
|
121
|
+
const color = sh.color ?? [1, 1, 1];
|
|
122
|
+
data[off] = color[0];
|
|
123
|
+
data[off + 1] = color[1];
|
|
124
|
+
data[off + 2] = color[2];
|
|
125
|
+
data[off + 3] = sh.intensity ?? 1;
|
|
126
|
+
data[off + 4] = sh.roughness ?? 0;
|
|
127
|
+
data[off + 5] = sh.texture ? 1 : 0;
|
|
128
|
+
const mOff = offsets.get("sheenUVm");
|
|
129
|
+
const tOff = offsets.get("sheenUVt");
|
|
130
|
+
if (mOff === void 0 || tOff === void 0) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const tex = sh.texture;
|
|
134
|
+
const sx = (tex == null ? void 0 : tex.uScale) ?? 1;
|
|
135
|
+
const sy = (tex == null ? void 0 : tex.vScale) ?? 1;
|
|
136
|
+
const ang = (tex == null ? void 0 : tex.uAng) ?? 0;
|
|
137
|
+
const ox = (tex == null ? void 0 : tex.uOffset) ?? 0;
|
|
138
|
+
const oy = (tex == null ? void 0 : tex.vOffset) ?? 0;
|
|
139
|
+
const mi = mOff / 4;
|
|
140
|
+
const ti = tOff / 4;
|
|
141
|
+
if (ang === 0) {
|
|
142
|
+
data[mi] = sx;
|
|
143
|
+
data[mi + 1] = 0;
|
|
144
|
+
data[mi + 2] = 0;
|
|
145
|
+
data[mi + 3] = sy;
|
|
146
|
+
} else {
|
|
147
|
+
const c = Math.cos(ang);
|
|
148
|
+
const s = Math.sin(ang);
|
|
149
|
+
data[mi] = c * sx;
|
|
150
|
+
data[mi + 1] = -s * sy;
|
|
151
|
+
data[mi + 2] = s * sx;
|
|
152
|
+
data[mi + 3] = c * sy;
|
|
153
|
+
}
|
|
154
|
+
data[ti] = ox;
|
|
155
|
+
data[ti + 1] = oy;
|
|
156
|
+
data[ti + 2] = 0;
|
|
157
|
+
data[ti + 3] = 0;
|
|
158
|
+
}
|
|
159
|
+
const pbrExt = {
|
|
160
|
+
id: "sheen",
|
|
161
|
+
phase: "base-tex",
|
|
162
|
+
detect(mat) {
|
|
163
|
+
const sh = mat.sheen;
|
|
164
|
+
if (!(sh == null ? void 0 : sh.isEnabled)) {
|
|
165
|
+
return { f: 0, f2: 0 };
|
|
166
|
+
}
|
|
167
|
+
let f = PBR_HAS_SHEEN;
|
|
168
|
+
let f2 = 0;
|
|
169
|
+
if (sh.texture) {
|
|
170
|
+
f |= PBR_HAS_SHEEN_TEXTURE;
|
|
171
|
+
if (sh.texture._hasTx) {
|
|
172
|
+
f2 |= PBR2_HAS_SHEEN_UV_TX;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (sh.albedoScaling) {
|
|
176
|
+
f |= PBR_HAS_SHEEN_ALBEDO_SCALING;
|
|
177
|
+
}
|
|
178
|
+
return { f, f2 };
|
|
179
|
+
},
|
|
180
|
+
frag(ctx) {
|
|
181
|
+
if (!(ctx._features & PBR_HAS_SHEEN)) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return createSheenFragment(
|
|
185
|
+
(ctx._features & PBR_HAS_SHEEN_TEXTURE) !== 0,
|
|
186
|
+
ctx._hasIbl,
|
|
187
|
+
(ctx._features & PBR_HAS_SHEEN_ALBEDO_SCALING) !== 0,
|
|
188
|
+
(ctx._features2 & PBR2_HAS_SHEEN_UV_TX) !== 0
|
|
189
|
+
);
|
|
190
|
+
},
|
|
191
|
+
writeUbo: writeSheenUBO,
|
|
192
|
+
bind(ctx, entries, b) {
|
|
193
|
+
if ((ctx._features & PBR_HAS_SHEEN_TEXTURE) === 0) {
|
|
194
|
+
return b;
|
|
195
|
+
}
|
|
196
|
+
const sh = ctx._material.sheen;
|
|
197
|
+
if (sh == null ? void 0 : sh.texture) {
|
|
198
|
+
entries.push({ binding: b++, resource: sh.texture.view });
|
|
199
|
+
entries.push({ binding: b++, resource: sh.texture.sampler });
|
|
200
|
+
}
|
|
201
|
+
return b;
|
|
202
|
+
},
|
|
203
|
+
textures(mat, out) {
|
|
204
|
+
const sh = mat.sheen;
|
|
205
|
+
if (sh == null ? void 0 : sh.texture) {
|
|
206
|
+
out.push(sh.texture);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
export {
|
|
211
|
+
createSheenFragment,
|
|
212
|
+
pbrExt,
|
|
213
|
+
writeSheenUBO
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=sheen-fragment-Dze2f7XJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheen-fragment-Dze2f7XJ.js","sources":["../src/material/pbr/fragments/sheen-fragment.ts"],"sourcesContent":["/**\n * Sheen Fragment\n *\n * Adds a soft velvet-like sheen layer (fabric, cloth).\n * Only bundled when a scene uses PbrMaterialProps.sheen.\n *\n * Math follows BJS PBRSheenConfiguration:\n * - Charlie NDF (sheen distribution)\n * - Ashikhmin visibility\n * - IBL: environment sampled at sheen roughness, BRDF LUT blue channel\n * - Energy conservation: albedo scaled by (1 - maxSheenColor * brdf.b)\n */\n\nimport type { ShaderFragment, BindingDecl, UboField } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps, SheenProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_SHEEN, PBR_HAS_SHEEN_TEXTURE, PBR_HAS_SHEEN_ALBEDO_SCALING, PBR2_HAS_SHEEN_UV_TX } from \"../pbr-flag-bits.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nconst SHEEN_HELPERS = `\nfn normalDistributionFunction_CharlieSheen(NdotH_sh: f32, alphaG_sh: f32) -> f32 {\nlet invR = 1.0 / alphaG_sh;\nlet cos2h = NdotH_sh * NdotH_sh;\nlet sin2h = 1.0 - cos2h;\nreturn (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * 3.141592653589793);\n}\nfn visibility_Ashikhmin(NdotL_sh: f32, NdotV_sh: f32) -> f32 {\nreturn 1.0 / (4.0 * (NdotL_sh + NdotV_sh - NdotL_sh * NdotV_sh));\n}\n`;\n\nconst SHEEN_DIRECT_MOD = (intensityExpr: string): string => `\n{\nlet shIntensity = ${intensityExpr};\nlet shColorScaled = sheenColorFinal * shIntensity;\nlet shRoughness_clamped = max(sheenRoughnessAdjusted, AA_factor_x);\nlet shAlphaG = shRoughness_clamped * shRoughness_clamped + 0.0005;\nlet shD = normalDistributionFunction_CharlieSheen(NdotH, shAlphaG);\nlet shV = visibility_Ashikhmin(NdotL, NdotV);\nsheenDirectTerm = shColorScaled * shD * shV * NdotL * lightColor * lightAtten * material.directIntensity;\n}\n`;\n\nconst SHEEN_IBL_MOD = (intensityExpr: string, albedoScaling: boolean): string => `\n{\nlet shIntensity_ibl = ${intensityExpr};\nlet shColorScaled = sheenColorFinal * shIntensity_ibl;\nlet shRoughness_ibl = sheenRoughnessAdjusted;\nlet shAlphaG_ibl = shRoughness_ibl * shRoughness_ibl + 0.0005 + AA_factor_y;\nvar shSpecLod = log2(cubemapDim * shAlphaG_ibl) * scene.vImageInfos.z;\nlet shEnvRadiance = textureSampleLevel(iblTexture, iblSampler, R, clamp(shSpecLod, 0.0, maxLod)).rgb * material.environmentIntensity;\nlet shBrdf = textureSampleLevel(brdfLUT, brdfSampler_, vec2<f32>(NdotV, shRoughness_ibl), 0.0);\nlet shEnvReflectance = shColorScaled * shBrdf.b${albedoScaling ? \" * seo * eho\" : \"\"};\nsheenIblTerm = shEnvRadiance * shEnvReflectance;\n${albedoScaling ? \"let shMax = max(shColorScaled.r, max(shColorScaled.g, shColorScaled.b));\\nsheenAlbedoScaling = 1.0 - shMax * shBrdf.b;\" : \"\"}\n}\n`;\n\nconst SHEEN_IBL_COLOR_MOD = (albedoScaling: boolean): string =>\n albedoScaling\n ? `\n{\ncolor = (finalIrradiance\n + finalRadianceScaled\n + finalSpecularScaled\n + directDiffuse) * sheenAlbedoScaling\n + sheenDirectTerm\n + sheenIblTerm\n + emissive;\n}\n`\n : `\n{\ncolor = finalIrradiance\n + finalRadianceScaled\n + finalSpecularScaled\n + directDiffuse\n + sheenDirectTerm\n + sheenIblTerm\n + emissive;\n}\n`;\n\nconst SHEEN_NON_IBL_MOD = `\n{\ncolor = color + sheenDirectTerm;\n}\n`;\n\n/**\n * Create a sheen fragment.\n * @param hasSheenTexture - Whether the material has a sheen texture.\n * @param hasIbl - Whether IBL is active for this pipeline.\n * @param hasAlbedoScaling - When true, uses BJS-spec sheen math (no F0 attenuation,\n * proper base-layer albedo scaling, treats sheen texture as linear — upload\n * as sRGB so the sampler does the conversion). When false (legacy), applies\n * pow(rgb, 2.2) to the texture and uses (1-F0) as the sheen intensity scalar.\n */\nexport function createSheenFragment(hasSheenTexture: boolean, hasIbl: boolean = false, hasAlbedoScaling: boolean = false, hasSheenUvTx: boolean = false): ShaderFragment {\n let scopeVars = `var sheenDirectTerm = vec3<f32>(0.0);\nvar sheenIblTerm = vec3<f32>(0.0);\nvar sheenAlbedoScaling = 1.0;\nvar sheenColorFinal = material.sheenParams.rgb;\nvar sheenRoughnessAdjusted = material.sheenParams2.x;`;\n if (hasSheenTexture) {\n const gammaStmt = hasAlbedoScaling ? \"sheenMapData.rgb\" : \"pow(sheenMapData.rgb, vec3<f32>(2.2))\";\n const sheenUvDecl = hasSheenUvTx\n ? \"let sheenUV = vec2<f32>(dot(material.sheenUVm.xy, input.uv), dot(material.sheenUVm.zw, input.uv)) + material.sheenUVt.xy;\"\n : \"let sheenUV = input.uv;\";\n scopeVars += `\n{\n${sheenUvDecl}\nlet sheenMapData = textureSample(sheenTexture_, sheenSampler_, sheenUV);\nsheenColorFinal *= ${gammaStmt};\nsheenRoughnessAdjusted *= sheenMapData.a;\n}`;\n }\n\n const intensityExpr = hasAlbedoScaling ? \"material.sheenParams.a\" : \"material.sheenParams.a * (1.0 - dielectricF0)\";\n const slots: Partial<Record<string, string>> = {\n SV: scopeVars,\n AD: SHEEN_DIRECT_MOD(intensityExpr),\n };\n // AI and NI are mutually exclusive — only one path runs\n if (hasIbl) {\n slots.AI = SHEEN_IBL_MOD(intensityExpr, hasAlbedoScaling) + SHEEN_IBL_COLOR_MOD(hasAlbedoScaling);\n } else {\n slots.NI = SHEEN_NON_IBL_MOD;\n }\n\n const bindings: BindingDecl[] = [];\n if (hasSheenTexture) {\n bindings.push(\n { _name: \"sheenTexture_\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"sheenSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n const uboFields: UboField[] = [\n { _name: \"sheenParams\", _type: \"vec4<f32>\" },\n { _name: \"sheenParams2\", _type: \"vec4<f32>\" },\n ];\n if (hasSheenUvTx) {\n uboFields.push({ _name: \"sheenUVm\", _type: \"vec4<f32>\" }, { _name: \"sheenUVt\", _type: \"vec4<f32>\" });\n }\n\n return {\n _id: \"sheen\",\n _dependencies: hasIbl ? [\"ibl\"] : undefined,\n\n _uboFields: uboFields,\n\n _bindings: bindings,\n\n _helperFunctions: SHEEN_HELPERS,\n\n _fragmentSlots: slots,\n };\n}\n\n/** Write the sheen material-UBO slice (sheenParams, sheenParams2, optional UV transform). */\nexport function writeSheenUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const sh = material.sheen as SheenProps | undefined;\n if (!sh?.isEnabled || !offsets.has(\"sheenParams\")) {\n return;\n }\n const off = offsets.get(\"sheenParams\")! / 4;\n const color = sh.color ?? [1, 1, 1];\n data[off] = color[0]!;\n data[off + 1] = color[1]!;\n data[off + 2] = color[2]!;\n data[off + 3] = sh.intensity ?? 1.0;\n data[off + 4] = sh.roughness ?? 0.0;\n data[off + 5] = sh.texture ? 1.0 : 0.0;\n\n // Optional per-texture UV transform (KHR_texture_transform on sheenColorTexture).\n const mOff = offsets.get(\"sheenUVm\");\n const tOff = offsets.get(\"sheenUVt\");\n if (mOff === undefined || tOff === undefined) {\n return;\n }\n const tex = sh.texture;\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 const mi = mOff / 4;\n const ti = tOff / 4;\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\nexport const pbrExt: PbrExt = {\n id: \"sheen\",\n phase: \"base-tex\",\n detect(mat) {\n const sh = (mat as PbrMaterialProps).sheen as SheenProps | undefined;\n if (!sh?.isEnabled) {\n return { f: 0, f2: 0 };\n }\n let f = PBR_HAS_SHEEN;\n let f2 = 0;\n if (sh.texture) {\n f |= PBR_HAS_SHEEN_TEXTURE;\n if ((sh.texture as { _hasTx?: boolean })._hasTx) {\n f2 |= PBR2_HAS_SHEEN_UV_TX;\n }\n }\n if (sh.albedoScaling) {\n f |= PBR_HAS_SHEEN_ALBEDO_SCALING;\n }\n return { f, f2 };\n },\n frag(ctx) {\n if (!(ctx._features & PBR_HAS_SHEEN)) {\n return null;\n }\n return createSheenFragment(\n (ctx._features & PBR_HAS_SHEEN_TEXTURE) !== 0,\n ctx._hasIbl,\n (ctx._features & PBR_HAS_SHEEN_ALBEDO_SCALING) !== 0,\n (ctx._features2 & PBR2_HAS_SHEEN_UV_TX) !== 0\n );\n },\n writeUbo: writeSheenUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n if ((ctx._features & PBR_HAS_SHEEN_TEXTURE) === 0) {\n return b;\n }\n const sh = (ctx._material as PbrMaterialProps).sheen as SheenProps | undefined;\n if (sh?.texture) {\n entries.push({ binding: b++, resource: sh.texture.view });\n entries.push({ binding: b++, resource: sh.texture.sampler });\n }\n return b;\n },\n textures(mat, out) {\n const sh = (mat as PbrMaterialProps).sheen;\n if (sh?.texture) {\n out.push(sh.texture);\n }\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const emitter = {
|
|
2
|
+
className: "SimplexPerlin3DBlock",
|
|
3
|
+
emit(block, _outputName, stage, state, ctx) {
|
|
4
|
+
const seed = ctx.cast(ctx.resolve(block, "seed", stage, state), "vec3f");
|
|
5
|
+
state[stage].helpers.set(
|
|
6
|
+
"nme_simplexPerlin3D",
|
|
7
|
+
`fn nme_simplexPerlin3D(source: vec3<f32>) -> f32 {
|
|
8
|
+
let SKEWFACTOR = 1.0 / 3.0;
|
|
9
|
+
let UNSKEWFACTOR = 1.0 / 6.0;
|
|
10
|
+
let SIMPLEX_CORNER_POS = 0.5;
|
|
11
|
+
let SIMPLEX_TETRAHEDRON_HEIGHT = 0.7071067811865476;
|
|
12
|
+
var P = source;
|
|
13
|
+
if (P.x == 0.0 && P.y == 0.0 && P.z == 0.0) {
|
|
14
|
+
P.x = 0.00001;
|
|
15
|
+
}
|
|
16
|
+
P *= SIMPLEX_TETRAHEDRON_HEIGHT;
|
|
17
|
+
var Pi = floor(P + dot(P, vec3<f32>(SKEWFACTOR)));
|
|
18
|
+
let x0 = P - Pi + dot(Pi, vec3<f32>(UNSKEWFACTOR));
|
|
19
|
+
let g = step(x0.yzx, x0.xyz);
|
|
20
|
+
let l = vec3<f32>(1.0) - g;
|
|
21
|
+
var Pi_1 = min(g.xyz, l.zxy);
|
|
22
|
+
var Pi_2 = max(g.xyz, l.zxy);
|
|
23
|
+
let x1 = x0 - Pi_1 + vec3<f32>(UNSKEWFACTOR);
|
|
24
|
+
let x2 = x0 - Pi_2 + vec3<f32>(SKEWFACTOR);
|
|
25
|
+
let x3 = x0 - vec3<f32>(SIMPLEX_CORNER_POS);
|
|
26
|
+
let v1234_x = vec4<f32>(x0.x, x1.x, x2.x, x3.x);
|
|
27
|
+
let v1234_y = vec4<f32>(x0.y, x1.y, x2.y, x3.y);
|
|
28
|
+
let v1234_z = vec4<f32>(x0.z, x1.z, x2.z, x3.z);
|
|
29
|
+
Pi = Pi - floor(Pi * (1.0 / 69.0)) * 69.0;
|
|
30
|
+
let Pi_inc1 = step(Pi, vec3<f32>(69.0 - 1.5)) * (Pi + vec3<f32>(1.0));
|
|
31
|
+
var Pt = vec4<f32>(Pi.x, Pi.y, Pi_inc1.x, Pi_inc1.y) + vec4<f32>(50.0, 161.0, 50.0, 161.0);
|
|
32
|
+
Pt *= Pt;
|
|
33
|
+
let V1xy_V2xy = mix(vec4<f32>(Pt.x, Pt.y, Pt.x, Pt.y), vec4<f32>(Pt.z, Pt.w, Pt.z, Pt.w), vec4<f32>(Pi_1.x, Pi_1.y, Pi_2.x, Pi_2.y));
|
|
34
|
+
Pt = vec4<f32>(Pt.x, V1xy_V2xy.x, V1xy_V2xy.z, Pt.z) * vec4<f32>(Pt.y, V1xy_V2xy.y, V1xy_V2xy.w, Pt.w);
|
|
35
|
+
let SOMELARGEFLOATS = vec3<f32>(635.298681, 682.357502, 668.926525);
|
|
36
|
+
let ZINC = vec3<f32>(48.500388, 65.294118, 63.934599);
|
|
37
|
+
let lowz_mods = vec3<f32>(1.0) / (SOMELARGEFLOATS + Pi.zzz * ZINC);
|
|
38
|
+
let highz_mods = vec3<f32>(1.0) / (SOMELARGEFLOATS + Pi_inc1.zzz * ZINC);
|
|
39
|
+
Pi_1 = select(highz_mods, lowz_mods, Pi_1.z < 0.5);
|
|
40
|
+
Pi_2 = select(highz_mods, lowz_mods, Pi_2.z < 0.5);
|
|
41
|
+
let hash_0 = fract(Pt * vec4<f32>(lowz_mods.x, Pi_1.x, Pi_2.x, highz_mods.x)) - vec4<f32>(0.49999);
|
|
42
|
+
let hash_1 = fract(Pt * vec4<f32>(lowz_mods.y, Pi_1.y, Pi_2.y, highz_mods.y)) - vec4<f32>(0.49999);
|
|
43
|
+
let hash_2 = fract(Pt * vec4<f32>(lowz_mods.z, Pi_1.z, Pi_2.z, highz_mods.z)) - vec4<f32>(0.49999);
|
|
44
|
+
let grad_results = inverseSqrt(hash_0 * hash_0 + hash_1 * hash_1 + hash_2 * hash_2) * (hash_0 * v1234_x + hash_1 * v1234_y + hash_2 * v1234_z);
|
|
45
|
+
let FINAL_NORMALIZATION = 37.837227241611314;
|
|
46
|
+
var kernel_weights = v1234_x * v1234_x + v1234_y * v1234_y + v1234_z * v1234_z;
|
|
47
|
+
kernel_weights = max(vec4<f32>(0.5) - kernel_weights, vec4<f32>(0.0));
|
|
48
|
+
kernel_weights = kernel_weights * kernel_weights * kernel_weights;
|
|
49
|
+
return dot(kernel_weights, grad_results) * FINAL_NORMALIZATION;
|
|
50
|
+
}`
|
|
51
|
+
);
|
|
52
|
+
return { expr: `nme_simplexPerlin3D(${seed.expr})`, type: "f32" };
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
export {
|
|
56
|
+
emitter
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=simplex-perlin-3d-block-CcMtofzV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplex-perlin-3d-block-CcMtofzV.js","sources":["../src/material/node/blocks/simplex-perlin-3d-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"SimplexPerlin3DBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const seed = ctx.cast(ctx.resolve(block, \"seed\", stage, state), \"vec3f\");\n state[stage].helpers.set(\n \"nme_simplexPerlin3D\",\n `fn nme_simplexPerlin3D(source: vec3<f32>) -> f32 {\nlet SKEWFACTOR = 1.0 / 3.0;\nlet UNSKEWFACTOR = 1.0 / 6.0;\nlet SIMPLEX_CORNER_POS = 0.5;\nlet SIMPLEX_TETRAHEDRON_HEIGHT = 0.7071067811865476;\nvar P = source;\nif (P.x == 0.0 && P.y == 0.0 && P.z == 0.0) {\nP.x = 0.00001;\n}\nP *= SIMPLEX_TETRAHEDRON_HEIGHT;\nvar Pi = floor(P + dot(P, vec3<f32>(SKEWFACTOR)));\nlet x0 = P - Pi + dot(Pi, vec3<f32>(UNSKEWFACTOR));\nlet g = step(x0.yzx, x0.xyz);\nlet l = vec3<f32>(1.0) - g;\nvar Pi_1 = min(g.xyz, l.zxy);\nvar Pi_2 = max(g.xyz, l.zxy);\nlet x1 = x0 - Pi_1 + vec3<f32>(UNSKEWFACTOR);\nlet x2 = x0 - Pi_2 + vec3<f32>(SKEWFACTOR);\nlet x3 = x0 - vec3<f32>(SIMPLEX_CORNER_POS);\nlet v1234_x = vec4<f32>(x0.x, x1.x, x2.x, x3.x);\nlet v1234_y = vec4<f32>(x0.y, x1.y, x2.y, x3.y);\nlet v1234_z = vec4<f32>(x0.z, x1.z, x2.z, x3.z);\nPi = Pi - floor(Pi * (1.0 / 69.0)) * 69.0;\nlet Pi_inc1 = step(Pi, vec3<f32>(69.0 - 1.5)) * (Pi + vec3<f32>(1.0));\nvar Pt = vec4<f32>(Pi.x, Pi.y, Pi_inc1.x, Pi_inc1.y) + vec4<f32>(50.0, 161.0, 50.0, 161.0);\nPt *= Pt;\nlet V1xy_V2xy = mix(vec4<f32>(Pt.x, Pt.y, Pt.x, Pt.y), vec4<f32>(Pt.z, Pt.w, Pt.z, Pt.w), vec4<f32>(Pi_1.x, Pi_1.y, Pi_2.x, Pi_2.y));\nPt = vec4<f32>(Pt.x, V1xy_V2xy.x, V1xy_V2xy.z, Pt.z) * vec4<f32>(Pt.y, V1xy_V2xy.y, V1xy_V2xy.w, Pt.w);\nlet SOMELARGEFLOATS = vec3<f32>(635.298681, 682.357502, 668.926525);\nlet ZINC = vec3<f32>(48.500388, 65.294118, 63.934599);\nlet lowz_mods = vec3<f32>(1.0) / (SOMELARGEFLOATS + Pi.zzz * ZINC);\nlet highz_mods = vec3<f32>(1.0) / (SOMELARGEFLOATS + Pi_inc1.zzz * ZINC);\nPi_1 = select(highz_mods, lowz_mods, Pi_1.z < 0.5);\nPi_2 = select(highz_mods, lowz_mods, Pi_2.z < 0.5);\nlet hash_0 = fract(Pt * vec4<f32>(lowz_mods.x, Pi_1.x, Pi_2.x, highz_mods.x)) - vec4<f32>(0.49999);\nlet hash_1 = fract(Pt * vec4<f32>(lowz_mods.y, Pi_1.y, Pi_2.y, highz_mods.y)) - vec4<f32>(0.49999);\nlet hash_2 = fract(Pt * vec4<f32>(lowz_mods.z, Pi_1.z, Pi_2.z, highz_mods.z)) - vec4<f32>(0.49999);\nlet grad_results = inverseSqrt(hash_0 * hash_0 + hash_1 * hash_1 + hash_2 * hash_2) * (hash_0 * v1234_x + hash_1 * v1234_y + hash_2 * v1234_z);\nlet FINAL_NORMALIZATION = 37.837227241611314;\nvar kernel_weights = v1234_x * v1234_x + v1234_y * v1234_y + v1234_z * v1234_z;\nkernel_weights = max(vec4<f32>(0.5) - kernel_weights, vec4<f32>(0.0));\nkernel_weights = kernel_weights * kernel_weights * kernel_weights;\nreturn dot(kernel_weights, grad_results) * FINAL_NORMALIZATION;\n}`\n );\n return { expr: `nme_simplexPerlin3D(${seed.expr})`, type: \"f32\" };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,OAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,QAAQ,OAAO,KAAK,GAAG,OAAO;AACvE,UAAM,KAAK,EAAE,QAAQ;AAAA,MACjB;AAAA,MACA;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,IAAA;AA6CJ,WAAO,EAAE,MAAM,uBAAuB,KAAK,IAAI,KAAK,MAAM,MAAA;AAAA,EAC9D;AACJ;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
|
|
2
|
+
const SINGLE_LIGHT_STRUCTS = `
|
|
3
|
+
struct LightEntry {
|
|
4
|
+
vLightData: vec4<f32>,
|
|
5
|
+
vLightDiffuse: vec4<f32>,
|
|
6
|
+
vLightSpecular: vec4<f32>,
|
|
7
|
+
vLightDirection: vec4<f32>,
|
|
8
|
+
};
|
|
9
|
+
struct lightsUniforms {
|
|
10
|
+
count: u32, _p0: u32, _p1: u32, _p2: u32,
|
|
11
|
+
lights: array<LightEntry, ${MAX_LIGHTS}>,
|
|
12
|
+
};
|
|
13
|
+
`;
|
|
14
|
+
function specularBlock() {
|
|
15
|
+
return `let H = normalize(V + L);
|
|
16
|
+
let NdotH = clamp(dot(N, H), 0.0000001, 1.0);
|
|
17
|
+
let VdotH = saturate(dot(V, H));
|
|
18
|
+
let directRoughness = max(roughness, AA_factor_x);
|
|
19
|
+
let directAlphaG = directRoughness * directRoughness + 0.0005;
|
|
20
|
+
let D = distributionGGX(NdotH, directAlphaG);
|
|
21
|
+
let G = geometrySmithGGX(NdotL, NdotV, directAlphaG);
|
|
22
|
+
let coloredFresnel = fresnelSchlick(VdotH, colorF0, colorF90);
|
|
23
|
+
var directSpecular = coloredFresnel * D * G * NdotL * lightColor * lightAtten * material.directIntensity;`;
|
|
24
|
+
}
|
|
25
|
+
function getSingleLightBlock() {
|
|
26
|
+
return `let entry = lights.lights[mli(0u)];
|
|
27
|
+
let L = normalize(-entry.vLightData.xyz);
|
|
28
|
+
let NdotL = max(dot(N, L), 0.0);
|
|
29
|
+
let lightAtten = 1.0;
|
|
30
|
+
let lightColor = entry.vLightDiffuse.rgb;
|
|
31
|
+
var directDiffuse = surfaceAlbedo * (1.0 / PI) * NdotL * lightColor * material.directIntensity;
|
|
32
|
+
${specularBlock()}
|
|
33
|
+
/*AD*/`;
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
SINGLE_LIGHT_STRUCTS,
|
|
37
|
+
getSingleLightBlock
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=singlelight-directional-wgsl-CmUDZxwz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singlelight-directional-wgsl-CmUDZxwz.js","sources":["../src/material/pbr/fragments/singlelight-directional-wgsl.ts"],"sourcesContent":["/** Single directional-light WGSL helpers for the PBR template. */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport const SINGLE_LIGHT_STRUCTS = `\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,\n lights: array<LightEntry, ${MAX_LIGHTS}>,\n};\n`;\n\nfunction specularBlock(): string {\n return `let H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nlet D = distributionGGX(NdotH, directAlphaG);\nlet G = geometrySmithGGX(NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(VdotH, colorF0, colorF90);\nvar directSpecular = coloredFresnel * D * G * NdotL * lightColor * lightAtten * material.directIntensity;`;\n}\n\nexport function getSingleLightBlock(): string {\n return `let entry = lights.lights[mli(0u)];\nlet L = normalize(-entry.vLightData.xyz);\nlet NdotL = max(dot(N, L), 0.0);\nlet lightAtten = 1.0;\nlet lightColor = entry.vLightDiffuse.rgb;\nvar directDiffuse = surfaceAlbedo * (1.0 / PI) * NdotL * lightColor * material.directIntensity;\n${specularBlock()}\n/*AD*/`;\n}\n"],"names":[],"mappings":";AAIO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCASJ,UAAU;AAAA;AAAA;AAI1C,SAAS,gBAAwB;AAC7B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASX;AAEO,SAAS,sBAA8B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,eAAe;AAAA;AAEjB;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
|
|
2
|
+
const SINGLE_LIGHT_STRUCTS = `
|
|
3
|
+
struct LightEntry {
|
|
4
|
+
vLightData: vec4<f32>,
|
|
5
|
+
vLightDiffuse: vec4<f32>,
|
|
6
|
+
vLightSpecular: vec4<f32>,
|
|
7
|
+
vLightDirection: vec4<f32>,
|
|
8
|
+
};
|
|
9
|
+
struct lightsUniforms {
|
|
10
|
+
count: u32, _p0: u32, _p1: u32, _p2: u32,
|
|
11
|
+
lights: array<LightEntry, ${MAX_LIGHTS}>,
|
|
12
|
+
};
|
|
13
|
+
`;
|
|
14
|
+
function specularBlock() {
|
|
15
|
+
return `let H = normalize(V + L);
|
|
16
|
+
let NdotH = clamp(dot(N, H), 0.0000001, 1.0);
|
|
17
|
+
let VdotH = saturate(dot(V, H));
|
|
18
|
+
let directRoughness = max(roughness, AA_factor_x);
|
|
19
|
+
let directAlphaG = directRoughness * directRoughness + 0.0005;
|
|
20
|
+
let D = distributionGGX(NdotH, directAlphaG);
|
|
21
|
+
let G = geometrySmithGGX(NdotL, NdotV, directAlphaG);
|
|
22
|
+
let coloredFresnel = fresnelSchlick(VdotH, colorF0, colorF90);
|
|
23
|
+
var directSpecular = coloredFresnel * D * G * NdotL * lightColor * lightAtten * material.directIntensity;`;
|
|
24
|
+
}
|
|
25
|
+
function getSingleLightBlock() {
|
|
26
|
+
return `let entry = lights.lights[mli(0u)];
|
|
27
|
+
let L = normalize(entry.vLightData.xyz);
|
|
28
|
+
let NdotL = dot(N, L) * 0.5 + 0.5;
|
|
29
|
+
let lightAtten = 1.0;
|
|
30
|
+
let lightColor = entry.vLightDiffuse.rgb;
|
|
31
|
+
let hemiDiffuse = mix(entry.vLightDirection.xyz, lightColor, NdotL);
|
|
32
|
+
var directDiffuse = hemiDiffuse * surfaceAlbedo * material.directIntensity;
|
|
33
|
+
${specularBlock()}
|
|
34
|
+
/*AD*/`;
|
|
35
|
+
}
|
|
36
|
+
export {
|
|
37
|
+
SINGLE_LIGHT_STRUCTS,
|
|
38
|
+
getSingleLightBlock
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=singlelight-hemispheric-wgsl-t-83IP_s.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singlelight-hemispheric-wgsl-t-83IP_s.js","sources":["../src/material/pbr/fragments/singlelight-hemispheric-wgsl.ts"],"sourcesContent":["/** Single hemispheric-light WGSL helpers for the PBR template. */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport const SINGLE_LIGHT_STRUCTS = `\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,\n lights: array<LightEntry, ${MAX_LIGHTS}>,\n};\n`;\n\nfunction specularBlock(): string {\n return `let H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nlet D = distributionGGX(NdotH, directAlphaG);\nlet G = geometrySmithGGX(NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(VdotH, colorF0, colorF90);\nvar directSpecular = coloredFresnel * D * G * NdotL * lightColor * lightAtten * material.directIntensity;`;\n}\n\nexport function getSingleLightBlock(): string {\n return `let entry = lights.lights[mli(0u)];\nlet L = normalize(entry.vLightData.xyz);\nlet NdotL = dot(N, L) * 0.5 + 0.5;\nlet lightAtten = 1.0;\nlet lightColor = entry.vLightDiffuse.rgb;\nlet hemiDiffuse = mix(entry.vLightDirection.xyz, lightColor, NdotL);\nvar directDiffuse = hemiDiffuse * surfaceAlbedo * material.directIntensity;\n${specularBlock()}\n/*AD*/`;\n}\n"],"names":[],"mappings":";AAIO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCASJ,UAAU;AAAA;AAAA;AAI1C,SAAS,gBAAwB;AAC7B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASX;AAEO,SAAS,sBAA8B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,eAAe;AAAA;AAEjB;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
|
|
2
|
+
const SINGLE_LIGHT_STRUCTS = `
|
|
3
|
+
struct LightEntry {
|
|
4
|
+
vLightData: vec4<f32>,
|
|
5
|
+
vLightDiffuse: vec4<f32>,
|
|
6
|
+
vLightSpecular: vec4<f32>,
|
|
7
|
+
vLightDirection: vec4<f32>,
|
|
8
|
+
};
|
|
9
|
+
struct lightsUniforms {
|
|
10
|
+
count: u32, _p0: u32, _p1: u32, _p2: u32,
|
|
11
|
+
lights: array<LightEntry, ${MAX_LIGHTS}>,
|
|
12
|
+
};
|
|
13
|
+
`;
|
|
14
|
+
function specularBlock() {
|
|
15
|
+
return `let H = normalize(V + L);
|
|
16
|
+
let NdotH = clamp(dot(N, H), 0.0000001, 1.0);
|
|
17
|
+
let VdotH = saturate(dot(V, H));
|
|
18
|
+
let directRoughness = max(roughness, AA_factor_x);
|
|
19
|
+
let directAlphaG = directRoughness * directRoughness + 0.0005;
|
|
20
|
+
let D = distributionGGX(NdotH, directAlphaG);
|
|
21
|
+
let G = geometrySmithGGX(NdotL, NdotV, directAlphaG);
|
|
22
|
+
let coloredFresnel = fresnelSchlick(VdotH, colorF0, colorF90);
|
|
23
|
+
var directSpecular = coloredFresnel * D * G * NdotL * lightColor * lightAtten * material.directIntensity;`;
|
|
24
|
+
}
|
|
25
|
+
function getSingleLightBlock() {
|
|
26
|
+
return `let entry = lights.lights[mli(0u)];
|
|
27
|
+
let lightToFrag = entry.vLightData.xyz - input.worldPos;
|
|
28
|
+
let lightDist2 = dot(lightToFrag, lightToFrag);
|
|
29
|
+
let L = normalize(lightToFrag);
|
|
30
|
+
let NdotL = max(dot(N, L), 0.0);
|
|
31
|
+
let range = entry.vLightDiffuse.a;
|
|
32
|
+
let physicalFalloff = material.lightFalloffMode >= 0.5;
|
|
33
|
+
let physicalAtten = 1.0 / max(lightDist2, 0.0001);
|
|
34
|
+
let standardAtten = max(0.0, 1.0 - sqrt(lightDist2) / range);
|
|
35
|
+
let lightAtten = select(standardAtten, physicalAtten, physicalFalloff);
|
|
36
|
+
let lightColor = entry.vLightDiffuse.rgb;
|
|
37
|
+
var directDiffuse = surfaceAlbedo * (1.0 / PI) * NdotL * lightColor * lightAtten * material.directIntensity;
|
|
38
|
+
${specularBlock()}
|
|
39
|
+
/*AD*/`;
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
SINGLE_LIGHT_STRUCTS,
|
|
43
|
+
getSingleLightBlock
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=singlelight-point-wgsl-CLzULIYV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singlelight-point-wgsl-CLzULIYV.js","sources":["../src/material/pbr/fragments/singlelight-point-wgsl.ts"],"sourcesContent":["/** Single point-light WGSL helpers for the PBR template. */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport const SINGLE_LIGHT_STRUCTS = `\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,\n lights: array<LightEntry, ${MAX_LIGHTS}>,\n};\n`;\n\nfunction specularBlock(): string {\n return `let H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nlet D = distributionGGX(NdotH, directAlphaG);\nlet G = geometrySmithGGX(NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(VdotH, colorF0, colorF90);\nvar directSpecular = coloredFresnel * D * G * NdotL * lightColor * lightAtten * material.directIntensity;`;\n}\n\nexport function getSingleLightBlock(): string {\n return `let entry = lights.lights[mli(0u)];\nlet lightToFrag = entry.vLightData.xyz - input.worldPos;\nlet lightDist2 = dot(lightToFrag, lightToFrag);\nlet L = normalize(lightToFrag);\nlet NdotL = max(dot(N, L), 0.0);\nlet range = entry.vLightDiffuse.a;\nlet physicalFalloff = material.lightFalloffMode >= 0.5;\nlet physicalAtten = 1.0 / max(lightDist2, 0.0001);\nlet standardAtten = max(0.0, 1.0 - sqrt(lightDist2) / range);\nlet lightAtten = select(standardAtten, physicalAtten, physicalFalloff);\nlet lightColor = entry.vLightDiffuse.rgb;\nvar directDiffuse = surfaceAlbedo * (1.0 / PI) * NdotL * lightColor * lightAtten * material.directIntensity;\n${specularBlock()}\n/*AD*/`;\n}\n"],"names":[],"mappings":";AAIO,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCASJ,UAAU;AAAA;AAAA;AAI1C,SAAS,gBAAwB;AAC7B,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASX;AAEO,SAAS,sBAA8B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYT,eAAe;AAAA;AAEjB;"}
|