@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,235 @@
|
|
|
1
|
+
import { b2 as getBilinearSampler, e as createMappedBuffer, aY as createUniformBuffer, D as targetSignatureKey, aW as SCENE_UBO_WGSL, F as getSceneBindGroupLayout } from "./index-C8HOR2sB.js";
|
|
2
|
+
import { a as WGSL_DITHER, b as WGSL_NO_DITHER } from "./wgsl-helpers-DyzNzCeE.js";
|
|
3
|
+
const groundVertSrc = "// Background Ground Vertex Shader\n// Matches BJS shd_15: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n};\n\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) normal: vec3<f32>,\n @location(2) uv: vec2<f32>,\n};\n\nstruct VertexOutput {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) vPositionW: vec3<f32>,\n @location(1) vNormalW: vec3<f32>,\n @location(2) vUV: vec2<f32>,\n};\n\n@vertex\nfn main(input: VertexInput) -> VertexOutput {\n var output: VertexOutput;\n let finalWorld = mesh.world;\n let worldPos4 = finalWorld * vec4<f32>(input.position, 1.0);\n output.vPositionW = worldPos4.xyz;\n output.clipPos = scene.viewProjection * worldPos4;\n let normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\n output.vNormalW = normalize(normalWorld * input.normal);\n output.vUV = input.uv;\n return output;\n}\n";
|
|
4
|
+
const groundFragSrc = "// Background Ground Fragment Shader\n// Matches BJS shd_16: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\n// Verified via Spector.GPU capture of BJS scene 1\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n primaryColor: vec3<f32>,\n alpha: f32,\n backgroundCenter: vec3<f32>,\n _pad: f32,\n};\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n\n@group(1) @binding(1) var groundTexture: texture_2d<f32>;\n@group(1) @binding(2) var groundSampler: sampler;\n\nstruct FragmentInput {\n @location(0) vPositionW: vec3<f32>,\n @location(1) vNormalW: vec3<f32>,\n @location(2) vUV: vec2<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n let normalW = normalize(input.vNormalW);\n\n // Sample diffuse texture (BJS backgroundGround.png: white RGB, radial alpha gradient)\n let diffuseMap = textureSample(groundTexture, groundSampler, input.vUV);\n\n // BJS: reflectionColor = vec4(1) (no REFLECTION define)\n let diffuseColor = diffuseMap.rgb;\n let colorBase = max(diffuseColor, vec3<f32>(0.0));\n let mainColor = mesh.primaryColor;\n let finalColor = colorBase * mainColor;\n\n // Alpha starts from material alpha, multiplied by texture alpha\n var finalAlpha = mesh.alpha * diffuseMap.a;\n\n // OPACITYFRESNEL — BJS shd_16 lines 367-370\n let viewAngleToFloor = dot(normalW, normalize(scene.vEyePosition.xyz - mesh.backgroundCenter));\n const startAngle: f32 = 0.1;\n let fadeFactor = clamp(viewAngleToFloor / startAngle, 0.0, 1.0);\n finalAlpha *= fadeFactor * fadeFactor;\n\n // Image processing (preserves alpha)\n var color = vec4<f32>(finalColor, finalAlpha);\n if (scene.vImageInfos.w >= 0.0) {\n color = applyImageProcessing(color);\n }\n\n // PREMULTIPLYALPHA — BJS shd_16 line 373\n color = vec4<f32>(color.rgb * color.a, color.a);\n\n // Dithering\n color = vec4<f32>(color.rgb + vec3<f32>(dither(input.vPositionW.xy, 0.5)), color.a);\n color = max(color, vec4<f32>(0.0));\n\n return color;\n}\n";
|
|
5
|
+
const WGSL_IMAGE_PROCESSING = `
|
|
6
|
+
fn applyImageProcessing(result: vec4<f32>) -> vec4<f32> {
|
|
7
|
+
var rgb = result.rgb;
|
|
8
|
+
rgb *= scene.vImageInfos.x;
|
|
9
|
+
const tonemappingCalibration: f32 = 1.590579;
|
|
10
|
+
rgb = 1.0 - exp2(-tonemappingCalibration * rgb);
|
|
11
|
+
rgb = pow(rgb, vec3<f32>(1.0 / 2.2));
|
|
12
|
+
rgb = clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0));
|
|
13
|
+
let highContrast = rgb * rgb * (3.0 - 2.0 * rgb);
|
|
14
|
+
if (scene.vImageInfos.y < 1.0) {
|
|
15
|
+
rgb = mix(vec3<f32>(0.5), rgb, scene.vImageInfos.y);
|
|
16
|
+
} else {
|
|
17
|
+
rgb = mix(rgb, highContrast, scene.vImageInfos.y - 1.0);
|
|
18
|
+
}
|
|
19
|
+
rgb = max(rgb, vec3<f32>(0.0));
|
|
20
|
+
return vec4<f32>(rgb, result.a);
|
|
21
|
+
}
|
|
22
|
+
`;
|
|
23
|
+
const BG_MESH_UNIFORM_SIZE = 96;
|
|
24
|
+
async function buildGroundRenderable(engine, groundSize, rootPosition, primaryColor, groundTextureUrl, groundImagePromise, enableNoise = true) {
|
|
25
|
+
const fragCode = SCENE_UBO_WGSL + WGSL_IMAGE_PROCESSING + (enableNoise ? WGSL_DITHER : WGSL_NO_DITHER) + groundFragSrc;
|
|
26
|
+
const gndMat = createGroundMaterial(enableNoise, fragCode);
|
|
27
|
+
const eps = 2220446049250313e-31;
|
|
28
|
+
const groundWorld = new Float32Array(16);
|
|
29
|
+
groundWorld[0] = 1;
|
|
30
|
+
groundWorld[5] = eps;
|
|
31
|
+
groundWorld[6] = -1;
|
|
32
|
+
groundWorld[9] = 1;
|
|
33
|
+
groundWorld[10] = eps;
|
|
34
|
+
groundWorld[12] = rootPosition[0];
|
|
35
|
+
groundWorld[13] = rootPosition[1];
|
|
36
|
+
groundWorld[14] = rootPosition[2];
|
|
37
|
+
groundWorld[15] = 1;
|
|
38
|
+
const gndBufs = createGroundBuffers(engine, groundSize);
|
|
39
|
+
const gndUBO = createBgMeshUBO(engine, groundWorld, primaryColor);
|
|
40
|
+
const groundTex = await loadGroundTexture(engine, groundTextureUrl, groundImagePromise);
|
|
41
|
+
const groundTexView = groundTex.createView();
|
|
42
|
+
const groundSamp = getBilinearSampler(engine);
|
|
43
|
+
const gndBG = gndMat.createBindGroup(engine, gndUBO, groundTexView, groundSamp);
|
|
44
|
+
const r = {
|
|
45
|
+
order: 200,
|
|
46
|
+
// ground renders last (transparent)
|
|
47
|
+
isTransparent: true,
|
|
48
|
+
bind(eng, sig) {
|
|
49
|
+
return {
|
|
50
|
+
renderable: r,
|
|
51
|
+
pipeline: gndMat.getPipeline(eng, sig),
|
|
52
|
+
draw(pass) {
|
|
53
|
+
pass.setBindGroup(1, gndBG);
|
|
54
|
+
pass.setVertexBuffer(0, gndBufs.posBuffer);
|
|
55
|
+
pass.setVertexBuffer(1, gndBufs.normBuffer);
|
|
56
|
+
pass.setVertexBuffer(2, gndBufs.uvBuffer);
|
|
57
|
+
pass.setIndexBuffer(gndBufs.idxBuffer, "uint16");
|
|
58
|
+
pass.drawIndexed(gndBufs.idxCount);
|
|
59
|
+
return 1;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
return r;
|
|
65
|
+
}
|
|
66
|
+
const _gndPipelines = /* @__PURE__ */ new Map();
|
|
67
|
+
let _gndLayout = null;
|
|
68
|
+
let _gndCachedDevice = null;
|
|
69
|
+
function createGroundMaterial(enableNoise, fragCode) {
|
|
70
|
+
function getLayout(engine) {
|
|
71
|
+
const device = engine._device;
|
|
72
|
+
if (_gndLayout && _gndCachedDevice === device) {
|
|
73
|
+
return _gndLayout;
|
|
74
|
+
}
|
|
75
|
+
_gndLayout = device.createBindGroupLayout({
|
|
76
|
+
label: "ground-material",
|
|
77
|
+
entries: [
|
|
78
|
+
{ binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: "uniform" } },
|
|
79
|
+
{ binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: "float", viewDimension: "2d" } },
|
|
80
|
+
{ binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: { type: "filtering" } }
|
|
81
|
+
]
|
|
82
|
+
});
|
|
83
|
+
_gndCachedDevice = device;
|
|
84
|
+
return _gndLayout;
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
getPipeline(engine, sig) {
|
|
88
|
+
const device = engine._device;
|
|
89
|
+
if (_gndCachedDevice !== device) {
|
|
90
|
+
_gndPipelines.clear();
|
|
91
|
+
_gndLayout = null;
|
|
92
|
+
_gndCachedDevice = device;
|
|
93
|
+
}
|
|
94
|
+
const key = `${+enableNoise}|${targetSignatureKey(sig)}`;
|
|
95
|
+
const cached = _gndPipelines.get(key);
|
|
96
|
+
if (cached) {
|
|
97
|
+
return cached;
|
|
98
|
+
}
|
|
99
|
+
const vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + groundVertSrc, label: "ground-vert" });
|
|
100
|
+
const fragModule = device.createShaderModule({ code: fragCode, label: "ground-frag" });
|
|
101
|
+
const pipeline = device.createRenderPipeline({
|
|
102
|
+
label: "ground-pipeline",
|
|
103
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), getLayout(engine)] }),
|
|
104
|
+
vertex: {
|
|
105
|
+
module: vertModule,
|
|
106
|
+
entryPoint: "main",
|
|
107
|
+
buffers: [
|
|
108
|
+
{ arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: "float32x3" }] },
|
|
109
|
+
{ arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: "float32x3" }] },
|
|
110
|
+
{ arrayStride: 8, attributes: [{ shaderLocation: 2, offset: 0, format: "float32x2" }] }
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
fragment: {
|
|
114
|
+
module: fragModule,
|
|
115
|
+
entryPoint: "main",
|
|
116
|
+
targets: [
|
|
117
|
+
{
|
|
118
|
+
format: sig._colorFormat,
|
|
119
|
+
blend: {
|
|
120
|
+
color: { srcFactor: "one", dstFactor: "one-minus-src-alpha", operation: "add" },
|
|
121
|
+
alpha: { srcFactor: "one", dstFactor: "one-minus-src-alpha", operation: "add" }
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
depthStencil: {
|
|
127
|
+
format: sig._depthStencilFormat ?? "depth24plus-stencil8",
|
|
128
|
+
depthCompare: sig._depthCompare ?? "greater-equal",
|
|
129
|
+
depthWriteEnabled: false
|
|
130
|
+
},
|
|
131
|
+
multisample: { count: sig._sampleCount },
|
|
132
|
+
primitive: { topology: "triangle-list", cullMode: "back", frontFace: sig._flipY ? "cw" : "ccw" }
|
|
133
|
+
});
|
|
134
|
+
_gndPipelines.set(key, pipeline);
|
|
135
|
+
return pipeline;
|
|
136
|
+
},
|
|
137
|
+
createBindGroup(engine, meshUBO, groundTextureView, groundSampler) {
|
|
138
|
+
const device = engine._device;
|
|
139
|
+
return device.createBindGroup({
|
|
140
|
+
layout: getLayout(engine),
|
|
141
|
+
entries: [
|
|
142
|
+
{ binding: 0, resource: { buffer: meshUBO } },
|
|
143
|
+
{ binding: 1, resource: groundTextureView },
|
|
144
|
+
{ binding: 2, resource: groundSampler }
|
|
145
|
+
]
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function createGroundBuffers(engine, groundSize) {
|
|
151
|
+
const h = groundSize / 2;
|
|
152
|
+
const positions = new Float32Array([
|
|
153
|
+
-h,
|
|
154
|
+
-h,
|
|
155
|
+
0,
|
|
156
|
+
h,
|
|
157
|
+
-h,
|
|
158
|
+
0,
|
|
159
|
+
h,
|
|
160
|
+
h,
|
|
161
|
+
0,
|
|
162
|
+
-h,
|
|
163
|
+
h,
|
|
164
|
+
0
|
|
165
|
+
]);
|
|
166
|
+
const normals = new Float32Array([
|
|
167
|
+
0,
|
|
168
|
+
0,
|
|
169
|
+
1,
|
|
170
|
+
0,
|
|
171
|
+
0,
|
|
172
|
+
1,
|
|
173
|
+
0,
|
|
174
|
+
0,
|
|
175
|
+
1,
|
|
176
|
+
0,
|
|
177
|
+
0,
|
|
178
|
+
1
|
|
179
|
+
]);
|
|
180
|
+
const uvs = new Float32Array([
|
|
181
|
+
0,
|
|
182
|
+
0,
|
|
183
|
+
1,
|
|
184
|
+
0,
|
|
185
|
+
1,
|
|
186
|
+
1,
|
|
187
|
+
0,
|
|
188
|
+
1
|
|
189
|
+
]);
|
|
190
|
+
const indices = new Uint16Array([0, 2, 1, 0, 3, 2]);
|
|
191
|
+
return {
|
|
192
|
+
posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),
|
|
193
|
+
normBuffer: createMappedBuffer(engine, normals, GPUBufferUsage.VERTEX),
|
|
194
|
+
uvBuffer: createMappedBuffer(engine, uvs, GPUBufferUsage.VERTEX),
|
|
195
|
+
idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),
|
|
196
|
+
idxCount: 6
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function createBgMeshUBO(engine, world, primaryColor) {
|
|
200
|
+
const data = new Float32Array(BG_MESH_UNIFORM_SIZE / 4);
|
|
201
|
+
data.set(world, 0);
|
|
202
|
+
data[16] = primaryColor[0];
|
|
203
|
+
data[17] = primaryColor[1];
|
|
204
|
+
data[18] = primaryColor[2];
|
|
205
|
+
data[19] = 0.9;
|
|
206
|
+
data[20] = 0;
|
|
207
|
+
data[21] = 0;
|
|
208
|
+
data[22] = 0;
|
|
209
|
+
return createUniformBuffer(engine, data);
|
|
210
|
+
}
|
|
211
|
+
async function loadGroundTexture(engine, url, preloadedImage) {
|
|
212
|
+
const device = engine._device;
|
|
213
|
+
if (!url) {
|
|
214
|
+
const tex2 = device.createTexture({
|
|
215
|
+
size: [1, 1],
|
|
216
|
+
format: "rgba8unorm",
|
|
217
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
|
|
218
|
+
});
|
|
219
|
+
device.queue.writeTexture({ texture: tex2 }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);
|
|
220
|
+
return tex2;
|
|
221
|
+
}
|
|
222
|
+
const bmp = preloadedImage ? await preloadedImage : await fetch(url).then((r) => r.blob()).then((b) => createImageBitmap(b, { premultiplyAlpha: "none" }));
|
|
223
|
+
const tex = device.createTexture({
|
|
224
|
+
size: [bmp.width, bmp.height],
|
|
225
|
+
format: "rgba8unorm",
|
|
226
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
|
|
227
|
+
});
|
|
228
|
+
device.queue.copyExternalImageToTexture({ source: bmp }, { texture: tex }, [bmp.width, bmp.height]);
|
|
229
|
+
bmp.close();
|
|
230
|
+
return tex;
|
|
231
|
+
}
|
|
232
|
+
export {
|
|
233
|
+
buildGroundRenderable
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=background-ground-DIw6D3qf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-ground-DIw6D3qf.js","sources":["../shaders/background.vertex.wgsl?raw","../shaders/background.ground.fragment.wgsl?raw","../src/material/pbr/background-ground.ts"],"sourcesContent":["export default \"// Background Ground Vertex Shader\\n// Matches BJS shd_15: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n};\\n\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct VertexInput {\\n @location(0) position: vec3<f32>,\\n @location(1) normal: vec3<f32>,\\n @location(2) uv: vec2<f32>,\\n};\\n\\nstruct VertexOutput {\\n @builtin(position) clipPos: vec4<f32>,\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vNormalW: vec3<f32>,\\n @location(2) vUV: vec2<f32>,\\n};\\n\\n@vertex\\nfn main(input: VertexInput) -> VertexOutput {\\n var output: VertexOutput;\\n let finalWorld = mesh.world;\\n let worldPos4 = finalWorld * vec4<f32>(input.position, 1.0);\\n output.vPositionW = worldPos4.xyz;\\n output.clipPos = scene.viewProjection * worldPos4;\\n let normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\\n output.vNormalW = normalize(normalWorld * input.normal);\\n output.vUV = input.uv;\\n return output;\\n}\\n\"","export default \"// Background Ground Fragment Shader\\n// Matches BJS shd_16: DIFFUSE, OPACITYFRESNEL, PREMULTIPLYALPHA (no REFLECTION)\\n// Verified via Spector.GPU capture of BJS scene 1\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n primaryColor: vec3<f32>,\\n alpha: f32,\\n backgroundCenter: vec3<f32>,\\n _pad: f32,\\n};\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\n@group(1) @binding(1) var groundTexture: texture_2d<f32>;\\n@group(1) @binding(2) var groundSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vNormalW: vec3<f32>,\\n @location(2) vUV: vec2<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n let normalW = normalize(input.vNormalW);\\n\\n // Sample diffuse texture (BJS backgroundGround.png: white RGB, radial alpha gradient)\\n let diffuseMap = textureSample(groundTexture, groundSampler, input.vUV);\\n\\n // BJS: reflectionColor = vec4(1) (no REFLECTION define)\\n let diffuseColor = diffuseMap.rgb;\\n let colorBase = max(diffuseColor, vec3<f32>(0.0));\\n let mainColor = mesh.primaryColor;\\n let finalColor = colorBase * mainColor;\\n\\n // Alpha starts from material alpha, multiplied by texture alpha\\n var finalAlpha = mesh.alpha * diffuseMap.a;\\n\\n // OPACITYFRESNEL — BJS shd_16 lines 367-370\\n let viewAngleToFloor = dot(normalW, normalize(scene.vEyePosition.xyz - mesh.backgroundCenter));\\n const startAngle: f32 = 0.1;\\n let fadeFactor = clamp(viewAngleToFloor / startAngle, 0.0, 1.0);\\n finalAlpha *= fadeFactor * fadeFactor;\\n\\n // Image processing (preserves alpha)\\n var color = vec4<f32>(finalColor, finalAlpha);\\n if (scene.vImageInfos.w >= 0.0) {\\n color = applyImageProcessing(color);\\n }\\n\\n // PREMULTIPLYALPHA — BJS shd_16 line 373\\n color = vec4<f32>(color.rgb * color.a, color.a);\\n\\n // Dithering\\n color = vec4<f32>(color.rgb + vec3<f32>(dither(input.vPositionW.xy, 0.5)), color.a);\\n color = max(color, vec4<f32>(0.0));\\n\\n return color;\\n}\\n\"","/** Ground plane renderable — lazy-loaded only when a scene includes a ground.\n * Contains the ground material, mesh buffers, texture loading, and UBO creation.\n * Tree-shaken away from scenes that use `skipGround: true`. */\n\nimport type { Mat4 } from \"../../math/types.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { Renderable } from \"../../render/renderable.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { getBilinearSampler } from \"../../resource/samplers.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getSceneBindGroupLayout } from \"../../render/scene-helpers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport groundVertSrc from \"../../../shaders/background.vertex.wgsl?raw\";\nimport groundFragSrc from \"../../../shaders/background.ground.fragment.wgsl?raw\";\nimport { createMappedBuffer } from \"../../resource/gpu-buffers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { WGSL_DITHER, WGSL_NO_DITHER } from \"../../shader/wgsl-helpers.js\";\n\n// ── Ground-frag-only WGSL helpers (kept here so scenes that don't load the ground\n// don't pay for the image-processing helper in the shared wgsl-helpers chunk). ──\n\n/** Image processing: exposure → Reinhard tonemap → gamma → contrast. */\nconst WGSL_IMAGE_PROCESSING = `\nfn applyImageProcessing(result: vec4<f32>) -> vec4<f32> {\nvar rgb = result.rgb;\nrgb *= scene.vImageInfos.x;\nconst tonemappingCalibration: f32 = 1.590579;\nrgb = 1.0 - exp2(-tonemappingCalibration * rgb);\nrgb = pow(rgb, vec3<f32>(1.0 / 2.2));\nrgb = clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0));\nlet highContrast = rgb * rgb * (3.0 - 2.0 * rgb);\nif (scene.vImageInfos.y < 1.0) {\nrgb = mix(vec3<f32>(0.5), rgb, scene.vImageInfos.y);\n} else {\nrgb = mix(rgb, highContrast, scene.vImageInfos.y - 1.0);\n}\nrgb = max(rgb, vec3<f32>(0.0));\nreturn vec4<f32>(rgb, result.a);\n}\n`;\n\nconst BG_MESH_UNIFORM_SIZE = 96; // mat4x4 + primaryColor vec3 + alpha + backgroundCenter vec3 + pad\n\n/** Build the ground renderable for a PBR environment scene. */\nexport async function buildGroundRenderable(\n engine: EngineContext,\n groundSize: number,\n rootPosition: [number, number, number],\n primaryColor: [number, number, number],\n groundTextureUrl?: string,\n groundImagePromise?: Promise<ImageBitmap>,\n enableNoise = true\n): Promise<Renderable> {\n const fragCode = SCENE_UBO_WGSL + WGSL_IMAGE_PROCESSING + (enableNoise ? WGSL_DITHER : WGSL_NO_DITHER) + groundFragSrc;\n const gndMat = createGroundMaterial(enableNoise, fragCode);\n\n // Ground world: rotated 90° X (XY→XZ), translated to rootPosition\n // Column-major for WGSL: ground quad in XY plane, normal +Z → world +Y\n // Offset Y by -0.01 to prevent z-fighting with scene floor geometry.\n const eps = 2.220446049250313e-16;\n const groundWorld = new Float32Array(16) as Mat4;\n groundWorld[0] = 1;\n groundWorld[5] = eps;\n groundWorld[6] = -1;\n groundWorld[9] = 1;\n groundWorld[10] = eps;\n groundWorld[12] = rootPosition[0];\n groundWorld[13] = rootPosition[1];\n groundWorld[14] = rootPosition[2];\n groundWorld[15] = 1;\n\n const gndBufs = createGroundBuffers(engine, groundSize);\n const gndUBO = createBgMeshUBO(engine, groundWorld, primaryColor);\n\n const groundTex = await loadGroundTexture(engine, groundTextureUrl, groundImagePromise);\n const groundTexView = groundTex.createView();\n const groundSamp = getBilinearSampler(engine);\n const gndBG = gndMat.createBindGroup(engine, gndUBO, groundTexView, groundSamp);\n\n const r: Renderable = {\n order: 200, // ground renders last (transparent)\n isTransparent: true,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: gndMat.getPipeline(eng as EngineContext, sig),\n draw(pass) {\n pass.setBindGroup(1, gndBG);\n pass.setVertexBuffer(0, gndBufs.posBuffer);\n pass.setVertexBuffer(1, gndBufs.normBuffer);\n pass.setVertexBuffer(2, gndBufs.uvBuffer);\n pass.setIndexBuffer(gndBufs.idxBuffer, \"uint16\");\n pass.drawIndexed(gndBufs.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n// ─── Ground Material ────────────────────────────────────────────────────────\n\ninterface GroundMaterial {\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n createBindGroup(engine: EngineContext, meshUBO: GPUBuffer, groundTextureView: GPUTextureView, groundSampler: GPUSampler): GPUBindGroup;\n}\n\n/** Module-global pipeline cache — keyed by noise mode + full target signature (color/depth/samples/flipY).\n * All ground renderables share this cache. */\nconst _gndPipelines = new Map<string, GPURenderPipeline>();\nlet _gndLayout: GPUBindGroupLayout | null = null;\nlet _gndCachedDevice: GPUDevice | null = null;\n\nfunction createGroundMaterial(enableNoise: boolean, fragCode: string): GroundMaterial {\n function getLayout(engine: EngineContext): GPUBindGroupLayout {\n const device = engine._device;\n if (_gndLayout && _gndCachedDevice === device) {\n return _gndLayout;\n }\n _gndLayout = device.createBindGroupLayout({\n label: \"ground-material\",\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"filtering\" } },\n ],\n });\n _gndCachedDevice = device;\n return _gndLayout;\n }\n\n return {\n getPipeline(engine, sig) {\n const device = engine._device;\n if (_gndCachedDevice !== device) {\n _gndPipelines.clear();\n _gndLayout = null;\n _gndCachedDevice = device;\n }\n const key = `${+enableNoise}|${targetSignatureKey(sig)}`;\n const cached = _gndPipelines.get(key);\n if (cached) {\n return cached;\n }\n const vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + groundVertSrc, label: \"ground-vert\" });\n const fragModule = device.createShaderModule({ code: fragCode, label: \"ground-frag\" });\n\n // Matches BJS rp_8: premultiplied alpha blend, depthWrite=false\n const pipeline = device.createRenderPipeline({\n label: \"ground-pipeline\",\n layout: device.createPipelineLayout({ bindGroupLayouts: [getSceneBindGroupLayout(engine), getLayout(engine)] }),\n vertex: {\n module: vertModule,\n entryPoint: \"main\",\n buffers: [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n { arrayStride: 8, attributes: [{ shaderLocation: 2, offset: 0, format: \"float32x2\" as GPUVertexFormat }] },\n ],\n },\n fragment: {\n module: fragModule,\n entryPoint: \"main\",\n targets: [\n {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\", operation: \"add\" },\n },\n },\n ],\n },\n depthStencil: {\n format: sig._depthStencilFormat ?? \"depth24plus-stencil8\",\n depthCompare: sig._depthCompare ?? \"greater-equal\",\n depthWriteEnabled: false,\n },\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: \"back\", frontFace: sig._flipY ? \"cw\" : \"ccw\" },\n });\n _gndPipelines.set(key, pipeline);\n return pipeline;\n },\n\n createBindGroup(engine, meshUBO, groundTextureView, groundSampler) {\n const device = engine._device;\n return device.createBindGroup({\n layout: getLayout(engine),\n entries: [\n { binding: 0, resource: { buffer: meshUBO } },\n { binding: 1, resource: groundTextureView },\n { binding: 2, resource: groundSampler },\n ],\n });\n },\n };\n}\n\n// ─── Ground Mesh Data ───────────────────────────────────────────────────────\n\n/** Ground quad (4 verts, 6 indices — matches BJS CreatePlane with BACKSIDE).\n * XY plane, normals +Z (become +Y after world rotation). */\nfunction createGroundBuffers(\n engine: EngineContext,\n groundSize: number\n): {\n posBuffer: GPUBuffer;\n normBuffer: GPUBuffer;\n uvBuffer: GPUBuffer;\n idxBuffer: GPUBuffer;\n idxCount: number;\n} {\n const h = groundSize / 2;\n // prettier-ignore\n const positions = new Float32Array([\n -h, -h, 0,\n h, -h, 0,\n h, h, 0,\n -h, h, 0,\n ]);\n // prettier-ignore\n const normals = new Float32Array([\n 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1,\n ]);\n // prettier-ignore\n const uvs = new Float32Array([\n 0, 0, 1, 0, 1, 1, 0, 1,\n ]);\n // BACKSIDE winding\n // prettier-ignore\n const indices = new Uint16Array([0, 2, 1, 0, 3, 2]);\n\n return {\n posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),\n normBuffer: createMappedBuffer(engine, normals, GPUBufferUsage.VERTEX),\n uvBuffer: createMappedBuffer(engine, uvs, GPUBufferUsage.VERTEX),\n idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),\n idxCount: 6,\n };\n}\n\n// ─── Ground UBO ─────────────────────────────────────────────────────────────\n\nfunction createBgMeshUBO(engine: EngineContext, world: Mat4, primaryColor: [number, number, number]): GPUBuffer {\n const data = new Float32Array(BG_MESH_UNIFORM_SIZE / 4);\n data.set(world, 0); // offset 0: world mat4x4\n data[16] = primaryColor[0]; // offset 64: primaryColor.r\n data[17] = primaryColor[1]; // offset 68: primaryColor.g\n data[18] = primaryColor[2]; // offset 72: primaryColor.b\n data[19] = 0.9; // offset 76: alpha (BJS default groundOpacity)\n data[20] = 0;\n data[21] = 0;\n data[22] = 0; // offset 80: backgroundCenter\n return createUniformBuffer(engine, data);\n}\n\n// ─── Ground Texture ─────────────────────────────────────────────────────────\n\n/** Load a ground diffuse texture from URL and upload to GPU.\n * Falls back to a 1×1 white pixel if no URL provided. */\nasync function loadGroundTexture(engine: EngineContext, url?: string, preloadedImage?: Promise<ImageBitmap>): Promise<GPUTexture> {\n const device = engine._device;\n if (!url) {\n const tex = device.createTexture({\n size: [1, 1],\n format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n device.queue.writeTexture({ texture: tex }, new Uint8Array([255, 255, 255, 255]), { bytesPerRow: 4 }, [1, 1]);\n return tex;\n }\n // Use pre-fetched image if available (started early in loadEnvironment)\n const bmp = preloadedImage\n ? await preloadedImage\n : await fetch(url)\n .then((r) => r.blob())\n .then((b) => createImageBitmap(b, { premultiplyAlpha: \"none\" }));\n const tex = device.createTexture({\n size: [bmp.width, bmp.height],\n format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n });\n device.queue.copyExternalImageToTexture({ source: bmp }, { texture: tex }, [bmp.width, bmp.height]);\n bmp.close();\n return tex;\n}\n"],"names":["tex"],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { c as createCubemapSkyboxMaterial } from "./cubemap-skybox-material-DvXMVc4k.js";
|
|
2
|
+
import { s as skyboxVertSrc } from "./skybox.vertex-DJgi072W.js";
|
|
3
|
+
import { e as createMappedBuffer, aY as createUniformBuffer, aW as SCENE_UBO_WGSL } from "./index-C8HOR2sB.js";
|
|
4
|
+
const skyboxHdrFragSrc = "// HDR Skybox Fragment Shader — samples HDR environment cubemap with image processing.\n// Used when scene has an HDR environment rendered as the background.\n// Matches BJS BackgroundMaterial: cubemap at LOD 0 + exposure + gamma + contrast.\n\nstruct MeshUniforms {\n world: mat4x4<f32>,\n primaryColor: vec3<f32>,\n _pad: f32,\n skyOutputColor: vec3<f32>,\n _pad2: f32,\n exposureLinear: f32,\n contrast: f32,\n _pad3: f32,\n _pad4: f32,\n};\n\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n@group(1) @binding(1) var envCubemap: texture_cube<f32>;\n@group(1) @binding(2) var envSampler: sampler;\n\nstruct FragmentInput {\n @location(0) positionUVW: vec3<f32>,\n @location(1) positionW: vec3<f32>,\n};\n\n@fragment\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\n let dir = normalize(input.positionUVW);\n var color = textureSampleLevel(envCubemap, envSampler, dir, 0.0).rgb;\n\n // Image processing: exposure → gamma → contrast (matches BJS applyImageProcessing)\n color *= mesh.exposureLinear;\n color = pow(color, vec3<f32>(1.0 / 2.2));\n color = clamp(color, vec3<f32>(0.0), vec3<f32>(1.0));\n\n let highContrast = color * color * (3.0 - 2.0 * color);\n if (mesh.contrast < 1.0) { color = mix(vec3<f32>(0.5), color, mesh.contrast); }\n else { color = mix(color, highContrast, mesh.contrast - 1.0); }\n color = max(color, vec3<f32>(0.0));\n\n return vec4<f32>(color, 1.0);\n}\n";
|
|
5
|
+
const SKY_HDR_UNIFORM_SIZE = 112;
|
|
6
|
+
function createSkyboxBuffers(engine, S) {
|
|
7
|
+
const positions = new Float32Array([
|
|
8
|
+
S,
|
|
9
|
+
-S,
|
|
10
|
+
S,
|
|
11
|
+
-S,
|
|
12
|
+
-S,
|
|
13
|
+
S,
|
|
14
|
+
-S,
|
|
15
|
+
S,
|
|
16
|
+
S,
|
|
17
|
+
S,
|
|
18
|
+
S,
|
|
19
|
+
S,
|
|
20
|
+
S,
|
|
21
|
+
S,
|
|
22
|
+
-S,
|
|
23
|
+
-S,
|
|
24
|
+
S,
|
|
25
|
+
-S,
|
|
26
|
+
-S,
|
|
27
|
+
-S,
|
|
28
|
+
-S,
|
|
29
|
+
S,
|
|
30
|
+
-S,
|
|
31
|
+
-S,
|
|
32
|
+
S,
|
|
33
|
+
S,
|
|
34
|
+
-S,
|
|
35
|
+
S,
|
|
36
|
+
-S,
|
|
37
|
+
-S,
|
|
38
|
+
S,
|
|
39
|
+
-S,
|
|
40
|
+
S,
|
|
41
|
+
S,
|
|
42
|
+
S,
|
|
43
|
+
S,
|
|
44
|
+
-S,
|
|
45
|
+
S,
|
|
46
|
+
S,
|
|
47
|
+
-S,
|
|
48
|
+
-S,
|
|
49
|
+
S,
|
|
50
|
+
-S,
|
|
51
|
+
-S,
|
|
52
|
+
-S,
|
|
53
|
+
-S,
|
|
54
|
+
S,
|
|
55
|
+
-S,
|
|
56
|
+
-S,
|
|
57
|
+
S,
|
|
58
|
+
S,
|
|
59
|
+
-S,
|
|
60
|
+
S,
|
|
61
|
+
-S,
|
|
62
|
+
S,
|
|
63
|
+
S,
|
|
64
|
+
-S,
|
|
65
|
+
S,
|
|
66
|
+
S,
|
|
67
|
+
S,
|
|
68
|
+
S,
|
|
69
|
+
-S,
|
|
70
|
+
S,
|
|
71
|
+
S,
|
|
72
|
+
-S,
|
|
73
|
+
-S,
|
|
74
|
+
-S,
|
|
75
|
+
-S,
|
|
76
|
+
-S,
|
|
77
|
+
-S,
|
|
78
|
+
-S,
|
|
79
|
+
S
|
|
80
|
+
]);
|
|
81
|
+
const indices = new Uint16Array([
|
|
82
|
+
2,
|
|
83
|
+
1,
|
|
84
|
+
0,
|
|
85
|
+
3,
|
|
86
|
+
2,
|
|
87
|
+
0,
|
|
88
|
+
6,
|
|
89
|
+
5,
|
|
90
|
+
4,
|
|
91
|
+
7,
|
|
92
|
+
6,
|
|
93
|
+
4,
|
|
94
|
+
10,
|
|
95
|
+
9,
|
|
96
|
+
8,
|
|
97
|
+
11,
|
|
98
|
+
10,
|
|
99
|
+
8,
|
|
100
|
+
14,
|
|
101
|
+
13,
|
|
102
|
+
12,
|
|
103
|
+
15,
|
|
104
|
+
14,
|
|
105
|
+
12,
|
|
106
|
+
18,
|
|
107
|
+
17,
|
|
108
|
+
16,
|
|
109
|
+
19,
|
|
110
|
+
18,
|
|
111
|
+
16,
|
|
112
|
+
22,
|
|
113
|
+
21,
|
|
114
|
+
20,
|
|
115
|
+
23,
|
|
116
|
+
22,
|
|
117
|
+
20
|
|
118
|
+
]);
|
|
119
|
+
return {
|
|
120
|
+
posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),
|
|
121
|
+
idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),
|
|
122
|
+
idxCount: 36
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function buildSkyboxWorldMatrix(rootPosition) {
|
|
126
|
+
const world = new Float32Array(16);
|
|
127
|
+
world[0] = 1;
|
|
128
|
+
world[5] = 1;
|
|
129
|
+
world[10] = 1;
|
|
130
|
+
world[15] = 1;
|
|
131
|
+
world[12] = rootPosition[0];
|
|
132
|
+
world[13] = rootPosition[1];
|
|
133
|
+
world[14] = rootPosition[2];
|
|
134
|
+
return world;
|
|
135
|
+
}
|
|
136
|
+
function buildHdrSkyboxRenderable(scene, envTextures, skyHalfSize, rootPosition, primaryColor) {
|
|
137
|
+
const engine = scene.engine;
|
|
138
|
+
const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);
|
|
139
|
+
const cc = scene.clearColor;
|
|
140
|
+
const skyBufs = createSkyboxBuffers(engine, skyHalfSize);
|
|
141
|
+
const mat = createCubemapSkyboxMaterial("skybox-hdr", SCENE_UBO_WGSL + skyboxVertSrc, skyboxHdrFragSrc);
|
|
142
|
+
const ubo = createSkyHdrMeshUBO(engine, skyboxWorld, primaryColor, [cc.r, cc.g, cc.b], scene.imageProcessing.exposure, scene.imageProcessing.contrast);
|
|
143
|
+
const bindGroup = mat.createBindGroup(engine, ubo, envTextures.specularCubeView, envTextures.cubeSampler);
|
|
144
|
+
const r = {
|
|
145
|
+
order: 0,
|
|
146
|
+
isTransparent: false,
|
|
147
|
+
bind(eng, sig) {
|
|
148
|
+
return {
|
|
149
|
+
renderable: r,
|
|
150
|
+
pipeline: mat.getPipeline(eng, sig),
|
|
151
|
+
draw(pass) {
|
|
152
|
+
pass.setBindGroup(1, bindGroup);
|
|
153
|
+
pass.setVertexBuffer(0, skyBufs.posBuffer);
|
|
154
|
+
pass.setIndexBuffer(skyBufs.idxBuffer, "uint16");
|
|
155
|
+
pass.drawIndexed(skyBufs.idxCount);
|
|
156
|
+
return 1;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
return r;
|
|
162
|
+
}
|
|
163
|
+
function createSkyHdrMeshUBO(engine, world, primaryColor, skyOutputColor, exposure, contrast) {
|
|
164
|
+
const data = new Float32Array(SKY_HDR_UNIFORM_SIZE / 4);
|
|
165
|
+
data.set(world, 0);
|
|
166
|
+
data[16] = primaryColor[0];
|
|
167
|
+
data[17] = primaryColor[1];
|
|
168
|
+
data[18] = primaryColor[2];
|
|
169
|
+
data[20] = skyOutputColor[0];
|
|
170
|
+
data[21] = skyOutputColor[1];
|
|
171
|
+
data[22] = skyOutputColor[2];
|
|
172
|
+
data[24] = exposure;
|
|
173
|
+
data[25] = contrast;
|
|
174
|
+
return createUniformBuffer(engine, data);
|
|
175
|
+
}
|
|
176
|
+
export {
|
|
177
|
+
buildHdrSkyboxRenderable
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=background-hdr-skybox-c4uuTmkP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-hdr-skybox-c4uuTmkP.js","sources":["../shaders/skybox-hdr.fragment.wgsl?raw","../src/material/pbr/background-hdr-skybox.ts"],"sourcesContent":["export default \"// HDR Skybox Fragment Shader — samples HDR environment cubemap with image processing.\\n// Used when scene has an HDR environment rendered as the background.\\n// Matches BJS BackgroundMaterial: cubemap at LOD 0 + exposure + gamma + contrast.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n primaryColor: vec3<f32>,\\n _pad: f32,\\n skyOutputColor: vec3<f32>,\\n _pad2: f32,\\n exposureLinear: f32,\\n contrast: f32,\\n _pad3: f32,\\n _pad4: f32,\\n};\\n\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n@group(1) @binding(1) var envCubemap: texture_cube<f32>;\\n@group(1) @binding(2) var envSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) positionUVW: vec3<f32>,\\n @location(1) positionW: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n let dir = normalize(input.positionUVW);\\n var color = textureSampleLevel(envCubemap, envSampler, dir, 0.0).rgb;\\n\\n // Image processing: exposure → gamma → contrast (matches BJS applyImageProcessing)\\n color *= mesh.exposureLinear;\\n color = pow(color, vec3<f32>(1.0 / 2.2));\\n color = clamp(color, vec3<f32>(0.0), vec3<f32>(1.0));\\n\\n let highContrast = color * color * (3.0 - 2.0 * color);\\n if (mesh.contrast < 1.0) { color = mix(vec3<f32>(0.5), color, mesh.contrast); }\\n else { color = mix(color, highContrast, mesh.contrast - 1.0); }\\n color = max(color, vec3<f32>(0.0));\\n\\n return vec4<f32>(color, 1.0);\\n}\\n\"","/** HDR cubemap skybox — lazy-loaded only when useCubemapSkybox is true.\n * Contains the HDR skybox material, shader, UBO, and skybox geometry.\n * Self-contained: computes scene bounds and builds a full Renderable.\n * Tree-shaken away from scenes that use the default solid-color skybox. */\n\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { EnvironmentTextures } from \"../../loader-env/load-env.js\";\nimport type { Mat4 } from \"../../math/types.js\";\nimport type { Renderable } from \"../../render/renderable.js\";\nimport { createCubemapSkyboxMaterial } from \"./cubemap-skybox-material.js\";\nimport skyboxVertSrc from \"../../../shaders/skybox.vertex.wgsl?raw\";\nimport skyboxHdrFragSrc from \"../../../shaders/skybox-hdr.fragment.wgsl?raw\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createMappedBuffer, createUniformBuffer } from \"../../resource/gpu-buffers.js\";\n\nconst SKY_HDR_UNIFORM_SIZE = 112; // mat4x4 + primaryColor vec3 + pad + skyOutputColor vec3 + pad + exposure + contrast + pad2\n\nfunction createSkyboxBuffers(engine: EngineContext, S: number): { posBuffer: GPUBuffer; idxBuffer: GPUBuffer; idxCount: number } {\n // prettier-ignore\n const positions = new Float32Array([\n S,-S, S, -S,-S, S, -S, S, S, S, S, S,\n S, S,-S, -S, S,-S, -S,-S,-S, S,-S,-S,\n S, S,-S, S,-S,-S, S,-S, S, S, S, S,\n -S, S, S, -S,-S, S, -S,-S,-S, -S, S,-S,\n -S, S, S, -S, S,-S, S, S,-S, S, S, S,\n S,-S, S, S,-S,-S, -S,-S,-S, -S,-S, S,\n ]);\n // prettier-ignore\n const indices = new Uint16Array([\n 2, 1, 0, 3, 2, 0, 6, 5, 4, 7, 6, 4,\n 10, 9, 8, 11,10, 8, 14,13,12, 15,14,12,\n 18,17,16, 19,18,16, 22,21,20, 23,22,20,\n ]);\n return {\n posBuffer: createMappedBuffer(engine, positions, GPUBufferUsage.VERTEX),\n idxBuffer: createMappedBuffer(engine, indices, GPUBufferUsage.INDEX),\n idxCount: 36,\n };\n}\n\nfunction buildSkyboxWorldMatrix(rootPosition: [number, number, number]): Mat4 {\n const world = new Float32Array(16) as Mat4;\n world[0] = 1;\n world[5] = 1;\n world[10] = 1;\n world[15] = 1;\n world[12] = rootPosition[0];\n world[13] = rootPosition[1];\n world[14] = rootPosition[2];\n return world;\n}\n\n/** Build an HDR cubemap skybox as a complete Renderable (order 0). */\nexport function buildHdrSkyboxRenderable(\n scene: SceneContext,\n envTextures: EnvironmentTextures,\n skyHalfSize: number,\n rootPosition: [number, number, number],\n primaryColor: [number, number, number]\n): Renderable {\n const engine = scene.engine;\n\n const skyboxWorld = buildSkyboxWorldMatrix(rootPosition);\n\n const cc = scene.clearColor;\n\n const skyBufs = createSkyboxBuffers(engine, skyHalfSize);\n const mat = createCubemapSkyboxMaterial(\"skybox-hdr\", SCENE_UBO_WGSL + skyboxVertSrc, skyboxHdrFragSrc);\n const ubo = createSkyHdrMeshUBO(engine, skyboxWorld, primaryColor, [cc.r, cc.g, cc.b], scene.imageProcessing.exposure, scene.imageProcessing.contrast);\n\n const bindGroup = mat.createBindGroup(engine, ubo, envTextures.specularCubeView!, envTextures.cubeSampler);\n\n const r: Renderable = {\n order: 0,\n isTransparent: false,\n bind(eng, sig) {\n return {\n renderable: r,\n pipeline: mat.getPipeline(eng as EngineContext, sig),\n draw(pass) {\n pass.setBindGroup(1, bindGroup);\n pass.setVertexBuffer(0, skyBufs.posBuffer);\n pass.setIndexBuffer(skyBufs.idxBuffer, \"uint16\");\n pass.drawIndexed(skyBufs.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n\n// ─── HDR Skybox UBO ─────────────────────────────────────────────────────────────\n\nfunction createSkyHdrMeshUBO(\n engine: EngineContext,\n world: Float32Array,\n primaryColor: [number, number, number],\n skyOutputColor: [number, number, number],\n exposure: number,\n contrast: number\n): GPUBuffer {\n const data = new Float32Array(SKY_HDR_UNIFORM_SIZE / 4);\n data.set(world, 0);\n data[16] = primaryColor[0];\n data[17] = primaryColor[1];\n data[18] = primaryColor[2];\n data[20] = skyOutputColor[0];\n data[21] = skyOutputColor[1];\n data[22] = skyOutputColor[2];\n data[24] = exposure; // exposureLinear\n data[25] = contrast; // contrast\n return createUniformBuffer(engine, data);\n}\n"],"names":[],"mappings":"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"}
|