@babylonjs/lite 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +51 -0
- package/THIRD_PARTY_NOTICES.txt +318 -0
- package/{_mat4-storage-f64-BW9sTaVh.js → _mat4-storage-f64-WeexU-hd.js} +2 -2
- package/{_mat4-storage-f64-BW9sTaVh.js.map → _mat4-storage-f64-WeexU-hd.js.map} +1 -1
- package/{alpha-test-fragment-eUG971h3.js → alpha-test-fragment-x2mnjLgC.js} +2 -2
- package/{alpha-test-fragment-eUG971h3.js.map → alpha-test-fragment-x2mnjLgC.js.map} +1 -1
- package/{background-dds-skybox-BwG0kYQP.js → background-dds-skybox-BpcDr-9c.js} +3 -3
- package/{background-dds-skybox-BwG0kYQP.js.map → background-dds-skybox-BpcDr-9c.js.map} +1 -1
- package/{background-ground-DiFpKJzF.js → background-ground-Bm6gjWqx.js} +2 -2
- package/{background-ground-DiFpKJzF.js.map → background-ground-Bm6gjWqx.js.map} +1 -1
- package/{background-hdr-skybox-DIgJhvfj.js → background-hdr-skybox-CSFo8RX6.js} +3 -3
- package/{background-hdr-skybox-DIgJhvfj.js.map → background-hdr-skybox-CSFo8RX6.js.map} +1 -1
- package/{background-solid-skybox--fqHdan_.js → background-solid-skybox-DOOBeDIz.js} +2 -2
- package/{background-solid-skybox--fqHdan_.js.map → background-solid-skybox-DOOBeDIz.js.map} +1 -1
- package/{billboard-renderable-HY2XCd52.js → billboard-renderable-IJfCpeDS.js} +2 -2
- package/{billboard-renderable-HY2XCd52.js.map → billboard-renderable-IJfCpeDS.js.map} +1 -1
- package/{clamp-block-XHdUk2Va.js → clamp-block-BD_t8I89.js} +2 -2
- package/{clamp-block-XHdUk2Va.js.map → clamp-block-BD_t8I89.js.map} +1 -1
- package/{clearcoat-fragment-CHYw8MPB.js → clearcoat-fragment-Dj7vGX2u.js} +2 -2
- package/{clearcoat-fragment-CHYw8MPB.js.map → clearcoat-fragment-Dj7vGX2u.js.map} +1 -1
- package/{create-skeleton-9tdiUjRP.js → create-skeleton-s0hjrC3A.js} +2 -2
- package/{create-skeleton-9tdiUjRP.js.map → create-skeleton-s0hjrC3A.js.map} +1 -1
- package/{cubemap-skybox-material-DqQ0dyz8.js → cubemap-skybox-material-8lzbgi7K.js} +2 -2
- package/{cubemap-skybox-material-DqQ0dyz8.js.map → cubemap-skybox-material-8lzbgi7K.js.map} +1 -1
- package/{curve-block-S27sXrJQ.js → curve-block-Ditr4R7V.js} +2 -2
- package/{curve-block-S27sXrJQ.js.map → curve-block-Ditr4R7V.js.map} +1 -1
- package/{emissive-fragment-CZMQ0_bF.js → emissive-fragment-BOAezkfk.js} +2 -2
- package/{emissive-fragment-CZMQ0_bF.js.map → emissive-fragment-BOAezkfk.js.map} +1 -1
- package/{esm-shadow-view-Cl36rOrK.js → esm-shadow-view-DRpyRAfa.js} +2 -2
- package/{esm-shadow-view-Cl36rOrK.js.map → esm-shadow-view-DRpyRAfa.js.map} +1 -1
- package/{esm-shadow-view-CUwxbnMR.js → esm-shadow-view-DmIORQGZ.js} +2 -2
- package/{esm-shadow-view-CUwxbnMR.js.map → esm-shadow-view-DmIORQGZ.js.map} +1 -1
- package/{esm-shadow-view-DKQ-FSoV.js → esm-shadow-view-JCPaOOi7.js} +2 -2
- package/{esm-shadow-view-DKQ-FSoV.js.map → esm-shadow-view-JCPaOOi7.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-DDo7QQ8l.js → gaussian-splatting-pipeline-sh-B30Mu56i.js} +2 -2
- package/{gaussian-splatting-pipeline-sh-DDo7QQ8l.js.map → gaussian-splatting-pipeline-sh-B30Mu56i.js.map} +1 -1
- package/{geometry-texture-output-BmuAquio.js → geometry-texture-output-DURiaJ_n.js} +2 -2
- package/{geometry-texture-output-BmuAquio.js.map → geometry-texture-output-DURiaJ_n.js.map} +1 -1
- package/{geometry-view-xWZmq799.js → geometry-view-DRrscyWU.js} +4 -4
- package/{geometry-view-xWZmq799.js.map → geometry-view-DRrscyWU.js.map} +1 -1
- package/{gltf-animation-Bq7k_5HA.js → gltf-animation-BjnXkop6.js} +2 -2
- package/{gltf-animation-Bq7k_5HA.js.map → gltf-animation-BjnXkop6.js.map} +1 -1
- package/{gltf-ext-basisu-C5teqxzQ.js → gltf-ext-basisu-DtzVV1Xx.js} +2 -2
- package/{gltf-ext-basisu-C5teqxzQ.js.map → gltf-ext-basisu-DtzVV1Xx.js.map} +1 -1
- package/{gltf-ext-node-visibility-DnGTKkMf.js → gltf-ext-node-visibility-BhX0DmiP.js} +2 -2
- package/{gltf-ext-node-visibility-DnGTKkMf.js.map → gltf-ext-node-visibility-BhX0DmiP.js.map} +1 -1
- package/{gltf-ext-quantization-DheC7FhB.js → gltf-ext-quantization-DaymajCR.js} +2 -2
- package/{gltf-ext-quantization-DheC7FhB.js.map → gltf-ext-quantization-DaymajCR.js.map} +1 -1
- package/{gltf-ext-uv-transform-DljdVllE.js → gltf-ext-uv-transform-DFmNJ8kA.js} +2 -2
- package/{gltf-ext-uv-transform-DljdVllE.js.map → gltf-ext-uv-transform-DFmNJ8kA.js.map} +1 -1
- package/{gltf-feature-animation-pointer-DVhymFLK.js → gltf-feature-animation-pointer-C40tqOhL.js} +3 -3
- package/{gltf-feature-animation-pointer-DVhymFLK.js.map → gltf-feature-animation-pointer-C40tqOhL.js.map} +1 -1
- package/{gltf-feature-animations-hxC3y3bJ.js → gltf-feature-animations-v0S_yb4T.js} +2 -2
- package/{gltf-feature-animations-hxC3y3bJ.js.map → gltf-feature-animations-v0S_yb4T.js.map} +1 -1
- package/{gltf-feature-draco-B7Q_cMUv.js → gltf-feature-draco-CljWrsna.js} +2 -2
- package/{gltf-feature-draco-B7Q_cMUv.js.map → gltf-feature-draco-CljWrsna.js.map} +1 -1
- package/{gltf-feature-gpu-instancing-C7sRzWv7.js → gltf-feature-gpu-instancing-BoeSm6Tn.js} +2 -2
- package/{gltf-feature-gpu-instancing-C7sRzWv7.js.map → gltf-feature-gpu-instancing-BoeSm6Tn.js.map} +1 -1
- package/{gltf-feature-lights-punctual-DF7kya14.js → gltf-feature-lights-punctual-BCTwgyi_.js} +5 -5
- package/{gltf-feature-lights-punctual-DF7kya14.js.map → gltf-feature-lights-punctual-BCTwgyi_.js.map} +1 -1
- package/{gltf-feature-meshopt-DRG9hEqT.js → gltf-feature-meshopt-DItMkOMt.js} +2 -2
- package/{gltf-feature-meshopt-DRG9hEqT.js.map → gltf-feature-meshopt-DItMkOMt.js.map} +1 -1
- package/{gltf-feature-morph-DZydYgWp.js → gltf-feature-morph-Cv0mEYIq.js} +3 -3
- package/{gltf-feature-morph-DZydYgWp.js.map → gltf-feature-morph-Cv0mEYIq.js.map} +1 -1
- package/{gltf-feature-registry-DeYdy3DV.js → gltf-feature-registry-wNbt6UC-.js} +15 -15
- package/{gltf-feature-registry-DeYdy3DV.js.map → gltf-feature-registry-wNbt6UC-.js.map} +1 -1
- package/{gltf-feature-skeleton-B9och1W0.js → gltf-feature-skeleton-Deh2UBAn.js} +3 -3
- package/{gltf-feature-skeleton-B9och1W0.js.map → gltf-feature-skeleton-Deh2UBAn.js.map} +1 -1
- package/{gltf-feature-variants-CY_Qft7f.js → gltf-feature-variants-DGSdFNJq.js} +2 -2
- package/{gltf-feature-variants-CY_Qft7f.js.map → gltf-feature-variants-DGSdFNJq.js.map} +1 -1
- package/{gltf-glb-parser-CqOeXFOz.js → gltf-glb-parser-DSQWsT4r.js} +2 -2
- package/{gltf-glb-parser-CqOeXFOz.js.map → gltf-glb-parser-DSQWsT4r.js.map} +1 -1
- package/{gltf-interleave-DWf27t-h.js → gltf-interleave-OBqmlu-h.js} +11 -4
- package/gltf-interleave-OBqmlu-h.js.map +1 -0
- package/{gltf-normals-b2h74380.js → gltf-normals-D_P0KA4b.js} +10 -2
- package/gltf-normals-D_P0KA4b.js.map +1 -0
- package/{gltf-pbr-builder-ext-DvFxuOqN.js → gltf-pbr-builder-ext-3imk8Tev.js} +2 -2
- package/{gltf-pbr-builder-ext-DvFxuOqN.js.map → gltf-pbr-builder-ext-3imk8Tev.js.map} +1 -1
- package/{gltf-variants-CUvzYGYX.js → gltf-variants-Dyr54wwg.js} +4 -4
- package/{gltf-variants-CUvzYGYX.js.map → gltf-variants-Dyr54wwg.js.map} +1 -1
- package/{gpu-task-timer-Dgkff80h.js → gpu-task-timer-DVBNZfq5.js} +2 -2
- package/{gpu-task-timer-Dgkff80h.js.map → gpu-task-timer-DVBNZfq5.js.map} +1 -1
- package/{gs-picking-pipeline-55sM5LzV.js → gs-picking-pipeline-CERN-Trj.js} +2 -2
- package/{gs-picking-pipeline-55sM5LzV.js.map → gs-picking-pipeline-CERN-Trj.js.map} +1 -1
- package/{havok-floating-origin-5xp32P-C.js → havok-floating-origin-VVdJRUYc.js} +2 -2
- package/{havok-floating-origin-5xp32P-C.js.map → havok-floating-origin-VVdJRUYc.js.map} +1 -1
- package/{index-CYZDclhF.js → index-7Bk-uLSM.js} +2 -2
- package/{index-CYZDclhF.js.map → index-7Bk-uLSM.js.map} +1 -1
- package/{index-C-tEgwbZ.js → index-BgY3QEzL.js} +2817 -1166
- package/index-BgY3QEzL.js.map +1 -0
- package/{index-SMJ67XwT.js → index-Dr5LK2tg.js} +2 -2
- package/{index-SMJ67XwT.js.map → index-Dr5LK2tg.js.map} +1 -1
- package/index.d.ts +572 -18
- package/index.js +499 -464
- package/{input-block-DbRYCnet.js → input-block-DjdlndCL.js} +2 -2
- package/{input-block-DbRYCnet.js.map → input-block-DjdlndCL.js.map} +1 -1
- package/{iridescence-fragment-S3Ko1jvC.js → iridescence-fragment-kfsCs8lN.js} +2 -2
- package/{iridescence-fragment-S3Ko1jvC.js.map → iridescence-fragment-kfsCs8lN.js.map} +1 -1
- package/{light-block-CAqWkucp.js → light-block-qjCrz3de.js} +2 -2
- package/{light-block-CAqWkucp.js.map → light-block-qjCrz3de.js.map} +1 -1
- package/{loop-block-ch-biPFY.js → loop-block-C8vkQ2bz.js} +2 -2
- package/{loop-block-ch-biPFY.js.map → loop-block-C8vkQ2bz.js.map} +1 -1
- package/{manifold-AS8POaOr.js → manifold-DeXMNgxT.js} +3 -3
- package/{manifold-AS8POaOr.js.map → manifold-DeXMNgxT.js.map} +1 -1
- package/{morph-fragment-D9he3Ksk.js → morph-fragment-NpZYyIIU.js} +2 -2
- package/{morph-fragment-D9he3Ksk.js.map → morph-fragment-NpZYyIIU.js.map} +1 -1
- package/{multilight-wgsl-74aXpcJG.js → multilight-wgsl-I5SncF0q.js} +2 -2
- package/{multilight-wgsl-74aXpcJG.js.map → multilight-wgsl-I5SncF0q.js.map} +1 -1
- package/{node-env-B2bjGcMS.js → node-env-D7Aee08u.js} +2 -2
- package/{node-env-B2bjGcMS.js.map → node-env-D7Aee08u.js.map} +1 -1
- package/{node-geometry-view-CSXlEAhG.js → node-geometry-view-DfKXWNfV.js} +3 -3
- package/{node-geometry-view-CSXlEAhG.js.map → node-geometry-view-DfKXWNfV.js.map} +1 -1
- package/{node-registry-extra-compat-BEQH_ksg.js → node-registry-extra-compat-CDLeBR1P.js} +2 -2
- package/{node-registry-extra-compat-BEQH_ksg.js.map → node-registry-extra-compat-CDLeBR1P.js.map} +1 -1
- package/{node-registry-extra-math-Bm32WBAa.js → node-registry-extra-math-BA8_l4lB.js} +2 -2
- package/{node-registry-extra-math-Bm32WBAa.js.map → node-registry-extra-math-BA8_l4lB.js.map} +1 -1
- package/{node-renderable-BMHny4tC.js → node-renderable-EwLLnaL1.js} +2 -2
- package/{node-renderable-BMHny4tC.js.map → node-renderable-EwLLnaL1.js.map} +1 -1
- package/{node-shadow-BRiz7CT1.js → node-shadow-CeTmT6g4.js} +2 -2
- package/{node-shadow-BRiz7CT1.js.map → node-shadow-CeTmT6g4.js.map} +1 -1
- package/{normal-map-fragment-sE3TjF4U.js → normal-map-fragment-BHImLyM-.js} +2 -2
- package/{normal-map-fragment-sE3TjF4U.js.map → normal-map-fragment-BHImLyM-.js.map} +1 -1
- package/package.json +10 -3
- package/{parse-camera-CmZBS423.js → parse-camera-5IGdctAS.js} +2 -2
- package/{parse-camera-CmZBS423.js.map → parse-camera-5IGdctAS.js.map} +1 -1
- package/{pbr-geometry-view-T3vMABM8.js → pbr-geometry-view-Dthf9Aut.js} +3 -3
- package/{pbr-geometry-view-T3vMABM8.js.map → pbr-geometry-view-Dthf9Aut.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-CHC8w-Uv.js → pbr-metallic-roughness-block-full-DD6zI_Lx.js} +2 -2
- package/{pbr-metallic-roughness-block-full-CHC8w-Uv.js.map → pbr-metallic-roughness-block-full-DD6zI_Lx.js.map} +1 -1
- package/{pbr-metallic-roughness-block-DbozMlHU.js → pbr-metallic-roughness-block-g7wjzwN_.js} +2 -2
- package/{pbr-metallic-roughness-block-DbozMlHU.js.map → pbr-metallic-roughness-block-g7wjzwN_.js.map} +1 -1
- package/{pbr-mr-helper-core-DGRgbRXl.js → pbr-mr-helper-core-CWROQ7OA.js} +2 -2
- package/{pbr-mr-helper-core-DGRgbRXl.js.map → pbr-mr-helper-core-CWROQ7OA.js.map} +1 -1
- package/{pbr-refraction-CquDP9JO.js → pbr-refraction-Dxsm_gii.js} +2 -2
- package/{pbr-refraction-CquDP9JO.js.map → pbr-refraction-Dxsm_gii.js.map} +1 -1
- package/{pbr-renderable-CaHKHU0g.js → pbr-renderable-CuKWalEM.js} +22 -22
- package/{pbr-renderable-CaHKHU0g.js.map → pbr-renderable-CuKWalEM.js.map} +1 -1
- package/{pbr-shadow-fragment-DmnNe6yz.js → pbr-shadow-fragment-waeIBQUq.js} +2 -2
- package/{pbr-shadow-fragment-DmnNe6yz.js.map → pbr-shadow-fragment-waeIBQUq.js.map} +1 -1
- package/{pbr-tracking-Bo7RTANK.js → pbr-tracking-CdeqbBrh.js} +2 -2
- package/{pbr-tracking-Bo7RTANK.js.map → pbr-tracking-CdeqbBrh.js.map} +1 -1
- package/{pbr-transmission-ext-CoGcJBGE.js → pbr-transmission-ext-BNiXngZc.js} +2 -2
- package/{pbr-transmission-ext-CoGcJBGE.js.map → pbr-transmission-ext-BNiXngZc.js.map} +1 -1
- package/{recast-navigation.wasm-DG_0AFuk.js → recast-navigation.wasm-VC4lGlEe.js} +3 -3
- package/{recast-navigation.wasm-DG_0AFuk.js.map → recast-navigation.wasm-VC4lGlEe.js.map} +1 -1
- package/{recast-navigation.wasm-compat-C-Bf2ylB.js → recast-navigation.wasm-compat-CTwYOzRz.js} +3 -3
- package/{recast-navigation.wasm-compat-C-Bf2ylB.js.map → recast-navigation.wasm-compat-CTwYOzRz.js.map} +1 -1
- package/{reflectance-fragment-CExe6qDY.js → reflectance-fragment-BQFZ_pgy.js} +2 -2
- package/{reflectance-fragment-CExe6qDY.js.map → reflectance-fragment-BQFZ_pgy.js.map} +1 -1
- package/{rgbd-decode-DkiiiIlt.js → rgbd-decode-duTlXMWd.js} +2 -2
- package/{rgbd-decode-DkiiiIlt.js.map → rgbd-decode-duTlXMWd.js.map} +1 -1
- package/{screenshot-readback-avr_tYGZ.js → screenshot-readback-DnxR4rhp.js} +2 -2
- package/{screenshot-readback-avr_tYGZ.js.map → screenshot-readback-DnxR4rhp.js.map} +1 -1
- package/{shader-composer-CZagsJDS.js → shader-composer-CBy2i8nU.js} +2 -2
- package/{shader-composer-CZagsJDS.js.map → shader-composer-CBy2i8nU.js.map} +1 -1
- package/{shader-renderable-D5sbgzxt.js → shader-renderable-DVMVD6zP.js} +4 -4
- package/{shader-renderable-D5sbgzxt.js.map → shader-renderable-DVMVD6zP.js.map} +1 -1
- package/{shader-thin-instance-CkQ8rrfH.js → shader-thin-instance-CsDo3ULk.js} +2 -2
- package/{shader-thin-instance-CkQ8rrfH.js.map → shader-thin-instance-CsDo3ULk.js.map} +1 -1
- package/{sheen-fragment-BEigjpTX.js → sheen-fragment-B_Jd7wrr.js} +2 -2
- package/{sheen-fragment-BEigjpTX.js.map → sheen-fragment-B_Jd7wrr.js.map} +1 -1
- package/{singlelight-directional-wgsl-Ccsk-ys3.js → singlelight-directional-wgsl-Bw84txva.js} +2 -2
- package/{singlelight-directional-wgsl-Ccsk-ys3.js.map → singlelight-directional-wgsl-Bw84txva.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-DL-jpc97.js → singlelight-hemispheric-wgsl-DjxhgI8r.js} +2 -2
- package/{singlelight-hemispheric-wgsl-DL-jpc97.js.map → singlelight-hemispheric-wgsl-DjxhgI8r.js.map} +1 -1
- package/{singlelight-point-wgsl-hYmiP6ys.js → singlelight-point-wgsl-iA1aRkXA.js} +2 -2
- package/{singlelight-point-wgsl-hYmiP6ys.js.map → singlelight-point-wgsl-iA1aRkXA.js.map} +1 -1
- package/{singlelight-spot-wgsl-DSjp1p1C.js → singlelight-spot-wgsl-MDdTdstF.js} +2 -2
- package/{singlelight-spot-wgsl-DSjp1p1C.js.map → singlelight-spot-wgsl-MDdTdstF.js.map} +1 -1
- package/{skeleton-fragment-B__bUbPK.js → skeleton-fragment-COdHWFcK.js} +2 -2
- package/{skeleton-fragment-B__bUbPK.js.map → skeleton-fragment-COdHWFcK.js.map} +1 -1
- package/{skybox-renderable-BH6uUkal.js → skybox-renderable-DJYkfw32.js} +2 -2
- package/{skybox-renderable-BH6uUkal.js.map → skybox-renderable-DJYkfw32.js.map} +1 -1
- package/{splat-ply-compressed-BGNK6dnh.js → splat-ply-compressed-SxMlsKNK.js} +2 -2
- package/{splat-ply-compressed-BGNK6dnh.js.map → splat-ply-compressed-SxMlsKNK.js.map} +1 -1
- package/{standard-pipeline-BvFynkwL.js → standard-pipeline-DXFOUqU_.js} +3 -3
- package/{standard-pipeline-BvFynkwL.js.map → standard-pipeline-DXFOUqU_.js.map} +1 -1
- package/{standard-renderable-1Q3zemys.js → standard-renderable-BAc-i-ig.js} +3 -3
- package/{standard-renderable-1Q3zemys.js.map → standard-renderable-BAc-i-ig.js.map} +1 -1
- package/{std-ambient-fragment-__F1KTEu.js → std-ambient-fragment-P8dHZ4An.js} +2 -2
- package/{std-ambient-fragment-__F1KTEu.js.map → std-ambient-fragment-P8dHZ4An.js.map} +1 -1
- package/{std-cube-reflection-fragment-DidM0byH.js → std-cube-reflection-fragment-CF03MuQt.js} +2 -2
- package/{std-cube-reflection-fragment-DidM0byH.js.map → std-cube-reflection-fragment-CF03MuQt.js.map} +1 -1
- package/{std-emissive-fragment-Bj62X4Np.js → std-emissive-fragment-P8yJGclx.js} +2 -2
- package/{std-emissive-fragment-Bj62X4Np.js.map → std-emissive-fragment-P8yJGclx.js.map} +1 -1
- package/{std-lightmap-fragment-DXvfWvKc.js → std-lightmap-fragment-CymEG79z.js} +9 -6
- package/std-lightmap-fragment-CymEG79z.js.map +1 -0
- package/{std-opacity-fragment-BzMMb1K_.js → std-opacity-fragment-DLa1zV06.js} +2 -2
- package/{std-opacity-fragment-BzMMb1K_.js.map → std-opacity-fragment-DLa1zV06.js.map} +1 -1
- package/{std-reflection-fragment-DC9Kvu1C.js → std-reflection-fragment-BLySsYos.js} +2 -2
- package/{std-reflection-fragment-DC9Kvu1C.js.map → std-reflection-fragment-BLySsYos.js.map} +1 -1
- package/{std-shadow-fragment-BnMHeF1-.js → std-shadow-fragment-C_q27Mdi.js} +2 -2
- package/{std-shadow-fragment-BnMHeF1-.js.map → std-shadow-fragment-C_q27Mdi.js.map} +1 -1
- package/{std-specular-fragment-Bio681OG.js → std-specular-fragment-CaBXyAWY.js} +2 -2
- package/{std-specular-fragment-Bio681OG.js.map → std-specular-fragment-CaBXyAWY.js.map} +1 -1
- package/{std-tracking-BTcrry2o.js → std-tracking-Bw61Dv98.js} +2 -2
- package/{std-tracking-BTcrry2o.js.map → std-tracking-Bw61Dv98.js.map} +1 -1
- package/{subsurface-fragment-DpKib445.js → subsurface-fragment-BNQoG9gr.js} +2 -2
- package/{subsurface-fragment-DpKib445.js.map → subsurface-fragment-BNQoG9gr.js.map} +1 -1
- package/{thin-instance-cull-binding-DwZi7mlE.js → thin-instance-cull-binding-BNC5JiGw.js} +3 -3
- package/{thin-instance-cull-binding-DwZi7mlE.js.map → thin-instance-cull-binding-BNC5JiGw.js.map} +1 -1
- package/{thin-instance-gpu-uY2NOv0J.js → thin-instance-gpu-C1DGstap.js} +2 -2
- package/{thin-instance-gpu-uY2NOv0J.js.map → thin-instance-gpu-C1DGstap.js.map} +1 -1
- package/{tracking-primitives-Ck5bgCuo.js → tracking-primitives-CMBWLxGr.js} +2 -2
- package/{tracking-primitives-Ck5bgCuo.js.map → tracking-primitives-CMBWLxGr.js.map} +1 -1
- package/{unlit-fragment-nc6hu3Mw.js → unlit-fragment-BsHrS9XX.js} +2 -2
- package/{unlit-fragment-nc6hu3Mw.js.map → unlit-fragment-BsHrS9XX.js.map} +1 -1
- package/gltf-interleave-DWf27t-h.js.map +0 -1
- package/gltf-normals-b2h74380.js.map +0 -1
- package/index-C-tEgwbZ.js.map +0 -1
- package/std-lightmap-fragment-DXvfWvKc.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b9 as MSH_HAS_MORPH_TARGETS } from "./index-BgY3QEzL.js";
|
|
2
2
|
const STAGE_VERTEX = 1;
|
|
3
3
|
const MORPH_PRE_SKINNING = `var morphedPos = position;
|
|
4
4
|
var morphedNorm = normal;
|
|
@@ -56,4 +56,4 @@ export {
|
|
|
56
56
|
createMorphFragment,
|
|
57
57
|
pbrExt
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=morph-fragment-
|
|
59
|
+
//# sourceMappingURL=morph-fragment-NpZYyIIU.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"morph-fragment-
|
|
1
|
+
{"version":3,"file":"morph-fragment-NpZYyIIU.js","sources":["../src/material/pbr/fragments/morph-fragment.ts"],"sourcesContent":["/**\n * Morph Target Fragment\n *\n * Vertex-stage morph target animation: texture-based morph deltas\n * applied before skinning. Only bundled when a scene uses morph targets.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\n\n// WebGPU shader stage constants\nconst STAGE_VERTEX = 0x1;\n\nconst MORPH_PRE_SKINNING = `var morphedPos = position;\nvar morphedNorm = normal;\nlet mCol = i32(vertexIndex % morph.texWidth);\nlet mRowInBand = i32(vertexIndex / morph.texWidth);\nfor (var i = 0u; i < morph.count; i = i + 1u) {\n let w = morph.weights[i];\n let posBase = i32(i * 2u) * i32(morph.rowsPerBand);\n let normBase = i32(i * 2u + 1u) * i32(morph.rowsPerBand);\n morphedPos = morphedPos + w * textureLoad(morphTargets, vec2<i32>(mCol, posBase + mRowInBand), 0).xyz;\n morphedNorm = morphedNorm + w * textureLoad(morphTargets, vec2<i32>(mCol, normBase + mRowInBand), 0).xyz;\n}`;\n\n/**\n * Create a morph target fragment.\n * The morph extension modifies position/normal variables before the world\n * transform, using morphedPos/morphedNorm in place of position/normal.\n */\nexport function createMorphFragment(): ShaderFragment {\n return {\n _id: \"morph\",\n\n _vertexBuiltins: [{ _name: \"vertexIndex\", _builtin: \"vertex_index\", _type: \"u32\" }],\n\n _vertexHelperFunctions: `struct morphUniforms {\\nweights: vec4<f32>,\\ncount: u32,\\ntexWidth: u32,\\nrowsPerBand: u32,\\n_p0: u32,\\n}`,\n\n _vertexBindings: [\n { _name: \"morphTargets\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" as const, _sampleType: \"unfilterable-float\" as const }, _visibility: STAGE_VERTEX },\n { _name: \"morph\", _type: { _kind: \"uniform-buffer\" as const }, _visibility: STAGE_VERTEX },\n ],\n\n _vertexSlots: {\n VR: MORPH_PRE_SKINNING,\n },\n };\n}\n\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { MSH_HAS_MORPH_TARGETS } from \"../../mesh-features.js\";\n\nexport const pbrExt: PbrExt = {\n id: \"morph\",\n phase: \"vertex\",\n frag(ctx) {\n if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS)) {\n return null;\n }\n return createMorphFragment();\n },\n bind(ctx, entries, b) {\n const mesh = ctx._mesh;\n if (!(ctx._meshFeatures & MSH_HAS_MORPH_TARGETS) || !mesh?.morphTargets) {\n return b;\n }\n entries.push({ binding: b++, resource: mesh.morphTargets.texture.createView() });\n // Weights UBO is pushed separately by the pipeline (needs engine-side buffer handle).\n // Caller supplies weightsBuffer on mesh.morphTargets.\n if (mesh.morphTargets.weightsBuffer) {\n entries.push({ binding: b++, resource: { buffer: mesh.morphTargets.weightsBuffer } });\n }\n return b;\n },\n};\n"],"names":[],"mappings":";AAUA,MAAM,eAAe;AAErB,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBpB,SAAS,sBAAsC;AAClD,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,iBAAiB,CAAC,EAAE,OAAO,eAAe,UAAU,gBAAgB,OAAO,OAAO;AAAA,IAElF,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAExB,iBAAiB;AAAA,MACb,EAAE,OAAO,gBAAgB,OAAO,EAAE,OAAO,WAAW,cAAc,mBAA4B,aAAa,wBAAiC,aAAa,aAAA;AAAA,MACzJ,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,iBAAA,GAA6B,aAAa,aAAA;AAAA,IAAa;AAAA,IAG7F,cAAc;AAAA,MACV,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAKO,MAAM,SAAiB;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,KAAK,KAAK;AACN,QAAI,EAAE,IAAI,gBAAgB,wBAAwB;AAC9C,aAAO;AAAA,IACX;AACA,WAAO,oBAAA;AAAA,EACX;AAAA,EACA,KAAK,KAAK,SAAS,GAAG;AAClB,UAAM,OAAO,IAAI;AACjB,QAAI,EAAE,IAAI,gBAAgB,0BAA0B,EAAC,6BAAM,eAAc;AACrE,aAAO;AAAA,IACX;AACA,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,aAAa,QAAQ,WAAA,EAAW,CAAG;AAG/E,QAAI,KAAK,aAAa,eAAe;AACjC,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,EAAE,QAAQ,KAAK,aAAa,cAAA,EAAc,CAAG;AAAA,IACxF;AACA,WAAO;AAAA,EACX;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS } from "./index-BgY3QEzL.js";
|
|
2
2
|
function MULTI_LIGHT_STRUCTS() {
|
|
3
3
|
return `
|
|
4
4
|
struct LightEntry {
|
|
@@ -109,4 +109,4 @@ export {
|
|
|
109
109
|
MULTI_LIGHT_STRUCTS,
|
|
110
110
|
getMultiLightLoop
|
|
111
111
|
};
|
|
112
|
-
//# sourceMappingURL=multilight-wgsl-
|
|
112
|
+
//# sourceMappingURL=multilight-wgsl-I5SncF0q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multilight-wgsl-
|
|
1
|
+
{"version":3,"file":"multilight-wgsl-I5SncF0q.js","sources":["../src/material/pbr/fragments/multilight-wgsl.ts"],"sourcesContent":["/** Multi-light WGSL helpers for PBR template.\n * Separated into its own module so non-shadow PBR scenes don't pay the bundle cost. */\n\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nexport function MULTI_LIGHT_STRUCTS(): string {\n return `\nstruct LightEntry {\nvLightData: vec4<f32>,\nvLightDiffuse: vec4<f32>,\nvLightSpecular: vec4<f32>,\nvLightDirection: vec4<f32>,\n};\nstruct lightsUniforms {\ncount: u32, _p0: u32, _p1: u32, _p2: u32,\nlights: array<LightEntry, ${MAX_LIGHTS}>,\n};\n`;\n}\n\nexport const COMPUTE_PBR_LIGHT = `\nstruct PbrLightResult { L: vec3<f32>, NdotL: f32, atten: f32, color: vec3<f32>, specColor: vec3<f32>, isHemi: bool };\nfn computePbrLight(entry: LightEntry, N: vec3<f32>, worldPos: vec3<f32>, lightFalloffMode: f32) -> PbrLightResult {\nvar r: PbrLightResult;\nlet t = u32(entry.vLightData.w);\nr.isHemi = t == 3u;\nr.specColor = entry.vLightDiffuse.rgb;\nif (t == 3u) {\nr.L = normalize(entry.vLightData.xyz);\nr.NdotL = dot(N, r.L) * 0.5 + 0.5;\nr.atten = 1.0;\nr.color = mix(entry.vLightDirection.xyz, entry.vLightDiffuse.rgb, r.NdotL);\nreturn r;\n}\nif (t == 1u) {\nr.L = normalize(-entry.vLightData.xyz);\nr.atten = 1.0;\n} else {\nlet toLight = entry.vLightData.xyz - worldPos;\nlet d2 = dot(toLight, toLight);\nlet dist = sqrt(d2);\nr.L = toLight / max(dist, 0.0001);\n let physicalFalloff = lightFalloffMode >= 0.5;\n let rangeAtt = select(max(0.0, 1.0 - dist / entry.vLightDiffuse.a), 1.0 / max(d2, 0.0000001), physicalFalloff);\n if (t == 2u) {\n let cosHalfAngle = entry.vLightDirection.w;\n let c = dot(-entry.vLightDirection.xyz, r.L);\n let standardDirFalloff = select(0.0, max(0.0, pow(max(c, 0.0), entry.vLightSpecular.a)), c >= cosHalfAngle);\n let kappa = 6.64385618977 / max(1.0 - cosHalfAngle, 0.0001);\n let physicalDirFalloff = exp2(kappa * (c - 1.0));\n r.atten = rangeAtt * select(standardDirFalloff, physicalDirFalloff, physicalFalloff);\n } else {\n r.atten = rangeAtt;\n }\n}\nr.NdotL = max(dot(N, r.L), 0.0);\nr.color = entry.vLightDiffuse.rgb;\nreturn r;\n}\n`;\n\n/** The multi-light direct lighting loop WGSL block for the PBR template.\n * Contains slot markers AD and BL for fragment injection.\n * Generated at call time because MAX_LIGHTS is runtime-configurable via `setMaxLights`. */\nexport function getMultiLightLoop(): string {\n return `var directDiffuse = vec3<f32>(0.0);\nvar directSpecular = vec3<f32>(0.0);\n// BJS direct-light specular: roughness is clamped by the geometric AA factor\n// BEFORE being squared (matches BJS pbrDirectLightingFunctions.fx line 103).\n// The IBL-path alphaG already has AA_factor_y additively baked in; direct\n// specular uses its own squaring after max(roughness, AA_factor_x).\nlet directRoughness = max(roughness, AA_factor_x);\nlet directAlphaG = directRoughness * directRoughness + 0.0005;\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nlet lightCount = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AS*/\n// First-light aliases — kept at directLightBlock scope so the AD slot below\n// (clearcoat / sheen / subsurface) sees the same single-light variable names\n// it was originally written against. Multi-light direct contributions\n// for those ancillary BRDFs are not yet supported (single-light parity only).\nlet lightIndex0 = mli(0u);\nlet entry0 = lights.lights[lightIndex0];\nlet pl0 = computePbrLight(entry0, N, input.worldPos, material.lightFalloffMode);\nlet L = pl0.L;\nlet NdotL = pl0.NdotL;\nlet lightColor = pl0.specColor;\nlet lightAtten = pl0.atten * shadowFactors[lightIndex0];\nlet H = normalize(V + L);\nlet NdotH = clamp(dot(N, H), 0.0000001, 1.0);\nlet VdotH = saturate(dot(V, H));\nfor (var li = 0u; li < lightCount; li++) {\nvar pl: PbrLightResult;\nlet lightIndex = mli(li);\nif (li == 0u) { pl = pl0; } else { pl = computePbrLight(lights.lights[lightIndex], N, input.worldPos, material.lightFalloffMode); }\nlet sf = shadowFactors[lightIndex];\nif (pl.isHemi) {\ndirectDiffuse += pl.color * surfaceAlbedo * material.directIntensity * sf;\n} else {\ndirectDiffuse += surfaceAlbedo * (1.0 / PI) * pl.NdotL * pl.color * pl.atten * material.directIntensity * sf;\n}\n// Specular uses pl.NdotL (hemispheric 0.5+0.5*dot for hemi, max(dot,0) for others)\n// and pl.specColor (un-mixed light diffuse — matches single-light fast path\n// and Std's LIGHTING_FN which uses vLightSpecular for the specular bounce).\nif (pl.NdotL > 0.0 && pl.atten > 0.0) {\nlet specH = normalize(V + pl.L);\nlet specNdotH = clamp(dot(N, specH), 0.0000001, 1.0);\nlet specVdotH = saturate(dot(V, specH));\nlet D = distributionGGX(specNdotH, directAlphaG);\nlet G = geometrySmithGGX(pl.NdotL, NdotV, directAlphaG);\nlet coloredFresnel = fresnelSchlick(specVdotH, colorF0, colorF90);\ndirectSpecular += coloredFresnel * D * G * pl.NdotL * pl.specColor * pl.atten * material.directIntensity * sf;\n}\n}\n/*AD*/`;\n}\n"],"names":[],"mappings":";AAKO,SAAS,sBAA8B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BASiB,UAAU;AAAA;AAAA;AAGtC;AAEO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4C1B,SAAS,oBAA4B;AACxC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAQsB,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,gCAC5D,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwC1C;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SS } from "./index-
|
|
1
|
+
import { S as SS } from "./index-BgY3QEzL.js";
|
|
2
2
|
function emitEnv(startBinding) {
|
|
3
3
|
const iblTexBinding = startBinding;
|
|
4
4
|
const iblSampBinding = startBinding + 1;
|
|
@@ -37,4 +37,4 @@ export {
|
|
|
37
37
|
emitEnv,
|
|
38
38
|
pushEnvBindGroupEntries
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=node-env-
|
|
40
|
+
//# sourceMappingURL=node-env-D7Aee08u.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-env-
|
|
1
|
+
{"version":3,"file":"node-env-D7Aee08u.js","sources":["../src/material/node/node-env.ts"],"sourcesContent":["/** Node Material — env IBL extension (dynamically imported).\n *\n * Loaded ONLY when a graph's emitGraph pass set `state.usesEnv = true` (i.e.\n * a ReflectionBlock fed PBRMetallicRoughnessBlock.reflection). Scenes whose\n * NME graphs contain neither block never bundle this module — keeping the\n * per-NME-scene cost flat for non-env materials (scenes 60-66).\n *\n * Provides the env-aware compile + renderable paths:\n * 1. Group-1 binding allocation + WGSL var decls + BGL entries for the\n * env IBL textures and samplers (specular cube, BRDF LUT, plus their\n * samplers).\n * 2. Bind-group entry construction from `scene._envTextures`.\n *\n * SH coefficients and env scalars are read from the canonical frame-graph\n * scene UBO; NodeMaterial does not allocate or write a private scene UBO.\n */\n\nimport { SS } from \"../../engine/gpu-flags.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\n\nexport interface EnvEmit {\n readonly bindings: {\n /** @internal */\n readonly _iblTexture: number;\n /** @internal */\n readonly _iblSampler: number;\n /** @internal */\n readonly _brdfLUT: number;\n /** @internal */\n readonly _brdfSampler: number;\n };\n readonly wgslDecls: string;\n readonly bglEntries: readonly GPUBindGroupLayoutEntry[];\n readonly bindingCount: number;\n}\n\n/** Allocate the 4 group-1 bindings for env IBL (cube + sampler, BRDF LUT 2D + sampler)\n * starting at `startBinding`, and produce the WGSL `@group(1) @binding(...)` var decls\n * plus the matching BGL entries. */\nexport function emitEnv(startBinding: number): EnvEmit {\n const iblTexBinding = startBinding;\n const iblSampBinding = startBinding + 1;\n const brdfTexBinding = startBinding + 2;\n const brdfSampBinding = startBinding + 3;\n const wgslDecls = [\n `@group(1) @binding(${iblTexBinding}) var nmeIblTexture: texture_cube<f32>;`,\n `@group(1) @binding(${iblSampBinding}) var nmeIblSampler: sampler;`,\n `@group(1) @binding(${brdfTexBinding}) var nmeBrdfLUT: texture_2d<f32>;`,\n `@group(1) @binding(${brdfSampBinding}) var nmeBrdfSampler: sampler;`,\n ].join(\"\\n\");\n const bglEntries: GPUBindGroupLayoutEntry[] = [\n { binding: iblTexBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: iblSampBinding, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } },\n { binding: brdfTexBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: brdfSampBinding, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } },\n ];\n return {\n bindings: { _iblTexture: iblTexBinding, _iblSampler: iblSampBinding, _brdfLUT: brdfTexBinding, _brdfSampler: brdfSampBinding },\n wgslDecls,\n bglEntries,\n bindingCount: 4,\n };\n}\n\n/** Append env IBL texture/sampler entries to a bind-group entries array. */\nexport function pushEnvBindGroupEntries(\n scene: SceneContext,\n /** @internal */\n envBindings: { _iblTexture: number; _iblSampler: number; _brdfLUT: number; _brdfSampler: number },\n entries: GPUBindGroupEntry[]\n): void {\n const env = (scene as unknown as { _envTextures?: import(\"../../loader-env/load-env.js\").EnvironmentTextures })._envTextures;\n if (!env) {\n throw new Error(\"NodeMaterial: PBR/Reflection block requires scene environment but scene._envTextures is unset. Call loadEnvironment() before registerScene().\");\n }\n entries.push({ binding: envBindings._iblTexture, resource: env.specularCubeView });\n entries.push({ binding: envBindings._iblSampler, resource: env.cubeSampler });\n entries.push({ binding: envBindings._brdfLUT, resource: env.brdfLutView });\n entries.push({ binding: envBindings._brdfSampler, resource: env.brdfSampler });\n}\n"],"names":[],"mappings":";AAuCO,SAAS,QAAQ,cAA+B;AACnD,QAAM,gBAAgB;AACtB,QAAM,iBAAiB,eAAe;AACtC,QAAM,iBAAiB,eAAe;AACtC,QAAM,kBAAkB,eAAe;AACvC,QAAM,YAAY;AAAA,IACd,sBAAsB,aAAa;AAAA,IACnC,sBAAsB,cAAc;AAAA,IACpC,sBAAsB,cAAc;AAAA,IACpC,sBAAsB,eAAe;AAAA,EAAA,EACvC,KAAK,IAAI;AACX,QAAM,aAAwC;AAAA,IAC1C,EAAE,SAAS,eAAe,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,OAAA,EAAO;AAAA,IACzG,EAAE,SAAS,gBAAgB,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,cAAY;AAAA,IACjF,EAAE,SAAS,gBAAgB,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,IACxG,EAAE,SAAS,iBAAiB,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,YAAA,EAAY;AAAA,EAAE;AAExF,SAAO;AAAA,IACH,UAAU,EAAE,aAAa,eAAe,aAAa,gBAAgB,UAAU,gBAAgB,cAAc,gBAAA;AAAA,IAC7G;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAAA;AAEtB;AAGO,SAAS,wBACZ,OAEA,aACA,SACI;AACJ,QAAM,MAAO,MAAmG;AAChH,MAAI,CAAC,KAAK;AACN,UAAM,IAAI,MAAM,+IAA+I;AAAA,EACnK;AACA,UAAQ,KAAK,EAAE,SAAS,YAAY,aAAa,UAAU,IAAI,kBAAkB;AACjF,UAAQ,KAAK,EAAE,SAAS,YAAY,aAAa,UAAU,IAAI,aAAa;AAC5E,UAAQ,KAAK,EAAE,SAAS,YAAY,UAAU,UAAU,IAAI,aAAa;AACzE,UAAQ,KAAK,EAAE,SAAS,YAAY,cAAc,UAAU,IAAI,aAAa;AACjF;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { B as BU, p as packMat4IntoF32, M as MAX_LIGHTS,
|
|
2
|
-
import { getAttrBuffer, writeAttributeFlags } from "./node-renderable-
|
|
1
|
+
import { B as BU, p as packMat4IntoF32, M as MAX_LIGHTS, bA as findBlockByClassName, bB as emitGraph, y as targetSignatureKey, c as compileNodePipeline, S as SS, a as F32, G as GeometryTextureType, b as writeMeshLightSelection, bC as sanitize, bD as bjsTypeToNodeType, bE as extractDefault, bF as floatCount, P as createMaterialView, bG as NODE_GEOMETRY_OUTPUT } from "./index-BgY3QEzL.js";
|
|
2
|
+
import { getAttrBuffer, writeAttributeFlags } from "./node-renderable-EwLLnaL1.js";
|
|
3
3
|
const nodeGeometryGroupBuilder = (async () => {
|
|
4
4
|
throw new Error("node-geometry view does not support scene group building");
|
|
5
5
|
});
|
|
@@ -288,4 +288,4 @@ function createNodeGeometryMaterialView(source, config) {
|
|
|
288
288
|
export {
|
|
289
289
|
createNodeGeometryMaterialView
|
|
290
290
|
};
|
|
291
|
-
//# sourceMappingURL=node-geometry-view-
|
|
291
|
+
//# sourceMappingURL=node-geometry-view-DfKXWNfV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-geometry-view-CSXlEAhG.js","sources":["../src/material/node/node-geometry-renderable.ts","../src/material/node/node-geometry-view.ts"],"sourcesContent":["/** Node Material geometry-MRT renderable factory.\n *\n * Builds a {@link Renderable} that draws a single mesh through a\n * {@link createNodeGeometryMaterialView} into the geometry renderer task's\n * multi-attachment render target. Parallel to\n * `standard-geometry-renderable.ts` / `pbr-geometry-renderable.ts` but for the\n * NodeMaterial family.\n *\n * The geometry shader is produced by **re-walking** the parsed graph from the\n * `GeometryTextureOutputBlock` terminal (instead of `FragmentOutputBlock`).\n * That second `emitGraph` pass fills `state._geometryInputs` with the WGSL\n * expression for every connected geometry input; this module turns those into\n * the per-attachment `FragmentOutput` writes (falling back to the engine\n * default for unconnected attachments) and feeds them to\n * {@link compileNodePipeline} via its `_mrtOutput` option.\n *\n * This module is imported only by {@link createNodeGeometryMaterialView}, which\n * the geometry renderer task dynamic-imports — node scenes that never use the\n * geometry renderer pay zero bytes for it.\n */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport { BU, SS } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuilder, Renderable } from \"../../render/renderable.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\nimport type { SceneContext } from \"../../scene/scene-core.js\";\nimport type { Material } from \"../material.js\";\nimport { GeometryTextureType } from \"../../frame-graph/geometry-types.js\";\nimport type { NodeExpr, NodeBuildState, NodeGraph } from \"./node-types.js\";\nimport { emitGraph } from \"./node-emitter.js\";\nimport { findBlockByClassName } from \"./node-parser.js\";\nimport { compileNodePipeline, type NodeCompileResult, type MrtOutputOpts } from \"./node-pipeline.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { sanitize, bjsTypeToNodeType, floatCount, extractDefault } from \"./node-material.js\";\nimport { getAttrBuffer, writeAttributeFlags } from \"./node-renderable.js\";\nimport type { NodeGeometryMaterialView } from \"./node-geometry-view.js\";\n\n/** Singleton {@link MeshGroupBuilder} that node geometry views point at via their\n * overridden `_buildGroup`. The async builder body is unreachable — geometry\n * views are dispatched per-mesh via the geometry renderer task which calls\n * `_rebuildSingle` directly. */\nexport const nodeGeometryGroupBuilder: MeshGroupBuilder = (async () => {\n throw new Error(\"node-geometry view does not support scene group building\");\n}) as MeshGroupBuilder;\nnodeGeometryGroupBuilder._rebuildSingle = (scene: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const view = (materialOverride ?? mesh.material) as NodeGeometryMaterialView;\n return buildNodeGeometryRenderable(scene, mesh, view);\n};\nnodeGeometryGroupBuilder._materialFamily = \"node\";\n\n/** Shared per-view geometry resources, computed once and cached on the view. */\ninterface NodeGeometryViewResources {\n readonly _vertexWgsl: string;\n readonly _fragmentWgsl: string;\n readonly _geomState: NodeBuildState;\n readonly _struct: string;\n /** Fully-assembled fs_main return body (`var out…; return out;`), indented\n * one level with a trailing newline — ready to splice straight into the\n * node pipeline's `fs_main` (no WGSL assembly leaks into node-pipeline.ts). */\n readonly _fsReturn: string;\n readonly _needsGpUbo: boolean;\n readonly _attrNames: readonly string[];\n /** Per-target-signature compile (pipeline + BGL). */\n readonly _compileBySig: Map<string, NodeCompileResult>;\n /** Shared node UBO (one per material, format-independent). Allocated on first compile. */\n _nodeUBO: GPUBuffer | null;\n _nodeUBOReady: boolean;\n}\n\nconst ZERO = (wg: string): string => `vec4<f32>(0.0, 0.0, 0.0, ${wg})`;\n\n/** Build the per-attachment WGSL write for one geometry texture type, reading a\n * connected graph input when present and falling back to the engine default. */\nfunction geomWrite(type: GeometryTextureType, inputs: Map<GeometryTextureType, NodeExpr>, gpRef: { needsGp: boolean }): string {\n const wg = \"1.0\"; // opaque node materials: writeGeometryInfo gate is always 1.\n const v = inputs.get(type);\n const wp = inputs.get(GeometryTextureType.WORLD_POSITION);\n switch (type) {\n case GeometryTextureType.WORLD_POSITION:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.LOCAL_POSITION:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.WORLD_NORMAL:\n return v ? `vec4<f32>(normalize(${v.expr}) * 0.5 + vec3<f32>(0.5), ${wg})` : ZERO(wg);\n case GeometryTextureType.VIEW_NORMAL:\n return v ? `vec4<f32>(normalize(${v.expr}), ${wg})` : ZERO(wg);\n case GeometryTextureType.REFLECTIVITY:\n // Stored as vec4 — vec4(rgb, a) * writeGeometryInfo.\n return v ? `(${v.expr}) * ${wg}` : ZERO(wg);\n case GeometryTextureType.ALBEDO:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.IRRADIANCE:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.SCREENSPACE_DEPTH:\n return v ? `vec4<f32>(${v.expr}, 0.0, 0.0, ${wg})` : `vec4<f32>(in.position.z, 0.0, 0.0, ${wg})`;\n case GeometryTextureType.VIEW_DEPTH:\n if (v) {\n return `vec4<f32>(${v.expr}, 0.0, 0.0, ${wg})`;\n }\n return wp ? `vec4<f32>((scene.view * vec4<f32>(${wp.expr}, 1.0)).z, 0.0, 0.0, ${wg})` : ZERO(wg);\n case GeometryTextureType.NORMALIZED_VIEW_DEPTH:\n if (v) {\n return `vec4<f32>(${v.expr}, 0.0, 0.0, ${wg})`;\n }\n if (wp) {\n gpRef.needsGp = true;\n return `vec4<f32>(((scene.view * vec4<f32>(${wp.expr}, 1.0)).z - nmeGeom.cameraNearFar.x) / (nmeGeom.cameraNearFar.y - nmeGeom.cameraNearFar.x), 0.0, 0.0, ${wg})`;\n }\n return ZERO(wg);\n case GeometryTextureType.LINEAR_VELOCITY:\n // Stored as vec3 — node materials do not compute velocity, default 0.\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n }\n}\n\n/** Re-emit the graph from the GeometryTextureOutputBlock terminal and build the\n * shared geometry resources (WGSL bodies + FragmentOutput struct + writes). */\nfunction ensureGeometryResources(view: NodeGeometryMaterialView): NodeGeometryViewResources {\n const cached = view._geometry as NodeGeometryViewResources | undefined;\n if (cached) {\n return cached;\n }\n const source = view.source as NodeMaterial;\n const graph = source._graph;\n const geomRoot = findBlockByClassName(graph, \"GeometryTextureOutputBlock\");\n if (!geomRoot) {\n throw new Error(\"NodeMaterial geometry view: graph has no GeometryTextureOutputBlock\");\n }\n const vertRoot = findBlockByClassName(graph, \"VertexOutputBlock\");\n const { vertexWgsl, fragmentWgsl, state } = emitGraph(\n graph,\n source._emitters as Map<string, import(\"./node-types.js\").BlockEmitter>,\n geomRoot.id,\n vertRoot ? vertRoot.id : null,\n [],\n {\n hasSkeleton: source._hasSkeleton,\n hasInstances: source._hasInstances,\n }\n );\n if (state.usesMorphTargets || state.usesEnv || state.shadowLights.length > 0) {\n throw new Error(\"NodeMaterial geometry view: morph / env / shadow inputs are not supported in the geometry pass\");\n }\n\n const inputs = state._geometryInputs ?? new Map<GeometryTextureType, NodeExpr>();\n const attachments = view._geometryAttachments;\n const gpRef = { needsGp: false };\n const structLines = attachments.map((_, i) => `@location(${i}) f${i}: vec4<f32>,`);\n const struct = `struct FragmentOutput {\\n${structLines.join(\"\\n\")}\\n};`;\n const writeLines = attachments.map((type, i) => `out.f${i} = ${geomWrite(type, inputs, gpRef)};`);\n // Pre-indent the full return body here (one level + trailing newline) so the\n // node pipeline just splices the string — no geometry WGSL assembly in the\n // always-loaded compileNodePipeline.\n const fsReturn = [\"var out: FragmentOutput;\", ...writeLines, \"return out;\"].map((l) => ` ${l}`).join(\"\\n\") + \"\\n\";\n\n const res: NodeGeometryViewResources = {\n _vertexWgsl: vertexWgsl,\n _fragmentWgsl: fragmentWgsl,\n _geomState: state,\n _struct: struct,\n _fsReturn: fsReturn,\n _needsGpUbo: gpRef.needsGp,\n _attrNames: state.vertexAttributes.map((a) => a._name),\n _compileBySig: new Map(),\n _nodeUBO: null,\n _nodeUBOReady: false,\n };\n Object.defineProperty(view, \"_geometry\", { value: res, enumerable: false, configurable: true });\n return res;\n}\n\n/** Compile (or fetch cached) the geometry MRT pipeline for a target signature. */\nfunction ensureGeometryCompile(view: NodeGeometryMaterialView, res: NodeGeometryViewResources, engine: EngineContext, sig: RenderTargetSignature): NodeCompileResult {\n const key = targetSignatureKey(sig);\n const cached = res._compileBySig.get(key);\n if (cached) {\n return cached;\n }\n const source = view.source as NodeMaterial;\n const colorFormats = (sig as RenderTargetSignature & { _colorFormats?: readonly GPUTextureFormat[] })._colorFormats ?? (sig._colorFormat ? [sig._colorFormat] : []);\n if (colorFormats.length === 0) {\n throw new Error(\"node-geometry: render target has no color attachments\");\n }\n const cullMode: GPUCullMode = source._graph.backFaceCulling ? (view._reverseCulling ? \"front\" : \"back\") : \"none\";\n // All geometry-specific WGSL object-literals + the MRT pipeline descriptor\n // live here (lazy module). compileNodePipeline only splices strings + calls\n // these callbacks, so non-geometry node scenes bundle none of it.\n const mrtOutput: MrtOutputOpts = {\n _struct: res._struct,\n _fsReturnType: \" -> FragmentOutput\",\n _fsReturn: res._fsReturn,\n _cacheKey: `3|mrt:${colorFormats.join()}:${cullMode}`,\n _needsGpUbo: res._needsGpUbo,\n _buildGeomUbo: (binding) => ({\n _wgsl: `struct NmeGeomParams { previousViewProjection: mat4x4<f32>, cameraNearFar: vec4<f32> };\\n@group(1) @binding(${binding}) var<uniform> nmeGeom: NmeGeomParams;`,\n _bglEntry: { binding, visibility: SS.FRAGMENT, buffer: { type: \"uniform\" } },\n }),\n // Geometry MRT renders upright into offscreen targets (the task packs an\n // un-flipped scene UBO), matching the Standard/PBR geometry renderables.\n _buildPipeline: (device, a) =>\n device.createRenderPipeline({\n label: \"node-material-geometry\",\n layout: device.createPipelineLayout({ bindGroupLayouts: [a._sceneBGL, a._meshBGL] }),\n vertex: { module: a._shaderModule, entryPoint: \"vs_main\", buffers: a._vertexBuffers },\n fragment: { module: a._shaderModule, entryPoint: \"fs_main\", targets: colorFormats.map((f) => ({ format: f })) },\n depthStencil: { format: a._depthFormat, depthCompare: a._depthCompare, depthWriteEnabled: true },\n multisample: { count: a._msaaSamples },\n primitive: { topology: \"triangle-list\", cullMode, frontFace: \"ccw\" },\n }),\n };\n const compile = compileNodePipeline(res._geomState, res._vertexWgsl, res._fragmentWgsl, {\n _engine: engine,\n _format: engine.format,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare ?? \"greater-equal\",\n _msaaSamples: sig._sampleCount,\n _backFaceCulling: source._graph.backFaceCulling,\n _alphaMode: 0,\n _mrtOutput: mrtOutput,\n });\n res._compileBySig.set(key, compile);\n return compile;\n}\n\n/** Resolve the default uniform value (as a Float32Array) for the InputBlock\n * whose sanitized name matches `sanitizedName`. Used by {@link ensureGeometryNodeUBO}\n * for uniforms that only appear in the geometry re-emit — e.g. a constant\n * reflectivity colour referenced solely by the GeometryTextureOutputBlock\n * terminal and therefore absent from the colour pass's `_uniformValues`.\n * Returns null when no matching scalar/vector uniform InputBlock exists. Lives\n * here (not in the always-loaded `node-material.ts`) so non-geometry node\n * scenes pay zero bytes for it; the tiny helpers it calls (`sanitize`,\n * `bjsTypeToNodeType`, `floatCount`, `extractDefault`) are already retained by\n * the always-loaded UBO writer and merely re-exported. */\nfunction extractNodeUniformDefault(graph: NodeGraph, sanitizedName: string): Float32Array | null {\n for (const block of graph.blocks.values()) {\n if (block.className !== \"InputBlock\") {\n continue;\n }\n if (sanitize(block.name || `input${block.id}`) !== sanitizedName) {\n continue;\n }\n const type = bjsTypeToNodeType((block.serialized[\"type\"] as number | undefined) ?? 0x10);\n if (type === \"mat4f\") {\n return null;\n }\n const values = new F32(floatCount(type));\n values.set(extractDefault(block.serialized[\"value\"], type));\n return values;\n }\n return null;\n}\n\n/** Build / refresh the shared geometry node UBO (constants + live uniform overlays). */\nfunction ensureGeometryNodeUBO(res: NodeGeometryViewResources, compile: NodeCompileResult, engine: EngineContext, source: NodeMaterial): GPUBuffer | null {\n if (res._nodeUBOReady) {\n return res._nodeUBO;\n }\n res._nodeUBOReady = true;\n if (compile._nodeUboBinding === null || compile._nodeUboSize === 0) {\n return null;\n }\n const scratch = new F32(compile._nodeUboSize / 4);\n for (const [name, offsetBytes] of compile._nodeUboOffsets) {\n const live = source._uniformValues.get(name);\n if (live) {\n scratch.set(live._values, offsetBytes >> 2);\n continue;\n }\n const def = extractNodeUniformDefault(source._graph, name);\n if (def) {\n scratch.set(def, offsetBytes >> 2);\n }\n }\n const ubo = engine._device.createBuffer({ label: \"node-geom-ubo\", size: compile._nodeUboSize, usage: BU.UNIFORM | BU.COPY_DST });\n engine._device.queue.writeBuffer(ubo, 0, scratch);\n res._nodeUBO = ubo;\n return ubo;\n}\n\nfunction buildGeometryBindGroup(\n engine: EngineContext,\n source: NodeMaterial,\n compile: NodeCompileResult,\n meshUBO: GPUBuffer,\n nodeUBO: GPUBuffer | null,\n view: NodeGeometryMaterialView\n): GPUBindGroup {\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: meshUBO } }];\n if (nodeUBO && compile._nodeUboBinding !== null) {\n entries.push({ binding: compile._nodeUboBinding, resource: { buffer: nodeUBO } });\n }\n for (const tb of compile._textureBindings) {\n const tex = source._textureSlots.get(tb._name)?.current;\n if (!tex) {\n throw new Error(`NodeMaterial geometry view: texture binding \"${tb._name}\" not set. Provide it via material.inputs[\"${tb._name}\"].texture before the first render.`);\n }\n entries.push({ binding: tb._texBinding, resource: tex.view }, { binding: tb._sampBinding, resource: tex.sampler });\n }\n if (compile._geometryGpBinding !== null) {\n if (!view._gpUBO) {\n throw new Error(\"NodeMaterial geometry view: NORMALIZED_VIEW_DEPTH requested but no geometry-params UBO was provided by the task.\");\n }\n entries.push({ binding: compile._geometryGpBinding, resource: { buffer: view._gpUBO } });\n }\n return engine._device.createBindGroup({ label: \"node-geom-bg\", layout: compile._meshBGL, entries });\n}\n\n/** Build a {@link Renderable} for one mesh drawn through a NodeMaterial geometry view. */\nexport function buildNodeGeometryRenderable(scene: SceneContext, mesh: Mesh, view: NodeGeometryMaterialView): Renderable {\n const engine = scene.surface.engine;\n const device = engine._device;\n const source = view.source as NodeMaterial;\n const res = ensureGeometryResources(view);\n\n // Per-mesh UBO: world (64B) + receivesShadow (vec4) + light count/indices.\n const meshUboBytes = (96 + 16 * Math.ceil(MAX_LIGHTS / 4) + 15) & ~15;\n const meshUBO = device.createBuffer({ label: \"node-geom-mesh-ubo\", size: meshUboBytes, usage: BU.UNIFORM | BU.COPY_DST });\n const meshScratch = new F32(meshUboBytes / 4);\n const packMeshWorld = engine._makePackMeshWorld?.(scene) ?? packMat4IntoF32;\n\n let needsAttrFlags = false;\n const writeMesh = (): void => {\n packMeshWorld(meshScratch, mesh.worldMatrix, 0, 0);\n meshScratch[16] = mesh.receiveShadows ? 1 : 0;\n if (needsAttrFlags) {\n writeAttributeFlags(mesh, meshScratch);\n }\n writeMeshLightSelection(mesh, scene.lights, meshScratch.subarray(4));\n device.queue.writeBuffer(meshUBO, 0, meshScratch as Float32Array<ArrayBuffer>);\n };\n\n let bindGroup: GPUBindGroup | null = null;\n let lastWorldVersion = -1;\n let lastLightsCount = -1;\n\n const sortCenter: [number, number, number] = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!];\n\n const r: Renderable = {\n order: mesh.renderOrder ?? 100,\n isTransparent: false,\n mesh,\n bind(eng: EngineContext, sig: RenderTargetSignature) {\n const compile = ensureGeometryCompile(view, res, eng as EngineContext, sig);\n needsAttrFlags = compile._usesMeshAttributeFlags;\n const nodeUBO = ensureGeometryNodeUBO(res, compile, eng as EngineContext, source);\n bindGroup = buildGeometryBindGroup(eng as EngineContext, source, compile, meshUBO, nodeUBO, view);\n\n const update = (): void => {\n if (mesh.worldMatrixVersion !== lastWorldVersion || scene.lights.length !== lastLightsCount) {\n writeMesh();\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n lastWorldVersion = mesh.worldMatrixVersion;\n lastLightsCount = scene.lights.length;\n }\n };\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder): number => {\n if (mesh.visible === false) {\n return 0;\n }\n const g = mesh._gpu;\n for (let i = 0; i < res._attrNames.length; i++) {\n pass.setVertexBuffer(i, getAttrBuffer(engine, g, res._attrNames[i]!));\n }\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, bindGroup!);\n pass.drawIndexed(g.indexCount);\n return 1;\n };\n return { renderable: r, pipeline: compile._pipeline, update, draw };\n },\n };\n r._worldCenter = sortCenter;\n return r;\n}\n","/** NodeMaterial view helper that targets geometry-rendering MRT output.\n *\n * The geometry renderer task wraps each NodeMaterial caster in a\n * `NodeGeometryMaterialView`. The view carries the per-task attachment list,\n * optional `gp` UBO (camera near/far, shared across the task's materials), and\n * reverse-culling flag, and shadows {@link Material._buildGroup} with\n * {@link nodeGeometryGroupBuilder} so the geometry renderer task materialises a\n * {@link Renderable} through the node geometry renderable infrastructure — no\n * view-aware branching needed in core render-task.\n *\n * The geometry-output WGSL itself is produced by re-walking the parsed graph\n * from the `GeometryTextureOutputBlock` terminal in\n * `./node-geometry-renderable.ts`. Mirrors `material/standard/geometry-view.ts`\n * and `material/node/esm-shadow-view.ts`. */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport type { GeometryTextureType } from \"../../frame-graph/geometry-types.js\";\nimport { NODE_GEOMETRY_OUTPUT } from \"./node-flags.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { nodeGeometryGroupBuilder } from \"./node-geometry-renderable.js\";\n\n/** Per-task ordered attachment list driving the geometry template. The array\n * index is the MRT color-attachment slot used in `@location(i)`. */\nexport type NodeGeometryAttachments = readonly GeometryTextureType[];\n\n/** Per-(task, material) NodeMaterial geometry view configuration. */\nexport interface NodeGeometryViewConfig {\n /** Ordered MRT attachment list — index = `@location(i)`. */\n readonly attachments: NodeGeometryAttachments;\n /** When true the task additionally wants the real (lit) material color at\n * `@location(N)`. NodeMaterial geometry views do not implement the extra\n * color attachment (the realColor impostor is dropped); passing `true`\n * throws so callers don't silently mismatch the render-pass attachments. */\n readonly emitColor: boolean;\n /** Per-task camera-near-far UBO. Required when {@link attachments} contains\n * `NORMALIZED_VIEW_DEPTH` (and the input is left unconnected). */\n readonly gpUBO?: GPUBuffer | null;\n /** Flip culling direction. */\n readonly reverseCulling?: boolean;\n}\n\n/** NodeMaterial view that emits geometry textures instead of shaded colour. */\nexport interface NodeGeometryMaterialView extends MaterialView {\n /** @internal Ordered MRT attachment list — index = `@location(i)`. */\n readonly _geometryAttachments: NodeGeometryAttachments;\n /** @internal Optional per-task geometry-params UBO. */\n readonly _gpUBO: GPUBuffer | null;\n /** @internal */\n readonly _reverseCulling: boolean;\n /** @internal Shared per-view resources cache populated lazily by the renderable factory. */\n _geometry?: unknown;\n}\n\n/** Wrap a NodeMaterial as a geometry-output view.\n * - Sets the `NODE_GEOMETRY_OUTPUT` feature bit.\n * - Shadows `_buildGroup` with {@link nodeGeometryGroupBuilder} so the natural\n * `material._buildGroup._rebuildSingle` dispatch builds a geometry-MRT\n * renderable for this view. */\nexport function createNodeGeometryMaterialView(source: NodeMaterial, config: NodeGeometryViewConfig): NodeGeometryMaterialView {\n if (config.emitColor) {\n throw new Error(\"NodeMaterial geometry view: emitColor (real-color target) is not supported — omit targetTexture on the geometry task.\");\n }\n const baseFeatures = source._renderFeatures?.features ?? 0;\n const view = createMaterialView(source, { features: baseFeatures | NODE_GEOMETRY_OUTPUT }) as NodeGeometryMaterialView;\n Object.defineProperty(view, \"_geometryAttachments\", { value: config.attachments, enumerable: false });\n Object.defineProperty(view, \"_gpUBO\", { value: config.gpUBO ?? null, enumerable: false });\n Object.defineProperty(view, \"_reverseCulling\", { value: config.reverseCulling ?? false, enumerable: false });\n Object.defineProperty(view, \"_buildGroup\", { value: nodeGeometryGroupBuilder, enumerable: false });\n return view;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-geometry-view-DfKXWNfV.js","sources":["../src/material/node/node-geometry-renderable.ts","../src/material/node/node-geometry-view.ts"],"sourcesContent":["/** Node Material geometry-MRT renderable factory.\n *\n * Builds a {@link Renderable} that draws a single mesh through a\n * {@link createNodeGeometryMaterialView} into the geometry renderer task's\n * multi-attachment render target. Parallel to\n * `standard-geometry-renderable.ts` / `pbr-geometry-renderable.ts` but for the\n * NodeMaterial family.\n *\n * The geometry shader is produced by **re-walking** the parsed graph from the\n * `GeometryTextureOutputBlock` terminal (instead of `FragmentOutputBlock`).\n * That second `emitGraph` pass fills `state._geometryInputs` with the WGSL\n * expression for every connected geometry input; this module turns those into\n * the per-attachment `FragmentOutput` writes (falling back to the engine\n * default for unconnected attachments) and feeds them to\n * {@link compileNodePipeline} via its `_mrtOutput` option.\n *\n * This module is imported only by {@link createNodeGeometryMaterialView}, which\n * the geometry renderer task dynamic-imports — node scenes that never use the\n * geometry renderer pay zero bytes for it.\n */\n\nimport { F32 } from \"../../engine/typed-arrays.js\";\nimport { BU, SS } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuilder, Renderable } from \"../../render/renderable.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\nimport type { SceneContext } from \"../../scene/scene-core.js\";\nimport type { Material } from \"../material.js\";\nimport { GeometryTextureType } from \"../../frame-graph/geometry-types.js\";\nimport type { NodeExpr, NodeBuildState, NodeGraph } from \"./node-types.js\";\nimport { emitGraph } from \"./node-emitter.js\";\nimport { findBlockByClassName } from \"./node-parser.js\";\nimport { compileNodePipeline, type NodeCompileResult, type MrtOutputOpts } from \"./node-pipeline.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { sanitize, bjsTypeToNodeType, floatCount, extractDefault } from \"./node-material.js\";\nimport { getAttrBuffer, writeAttributeFlags } from \"./node-renderable.js\";\nimport type { NodeGeometryMaterialView } from \"./node-geometry-view.js\";\n\n/** Singleton {@link MeshGroupBuilder} that node geometry views point at via their\n * overridden `_buildGroup`. The async builder body is unreachable — geometry\n * views are dispatched per-mesh via the geometry renderer task which calls\n * `_rebuildSingle` directly. */\nexport const nodeGeometryGroupBuilder: MeshGroupBuilder = (async () => {\n throw new Error(\"node-geometry view does not support scene group building\");\n}) as MeshGroupBuilder;\nnodeGeometryGroupBuilder._rebuildSingle = (scene: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const view = (materialOverride ?? mesh.material) as NodeGeometryMaterialView;\n return buildNodeGeometryRenderable(scene, mesh, view);\n};\nnodeGeometryGroupBuilder._materialFamily = \"node\";\n\n/** Shared per-view geometry resources, computed once and cached on the view. */\ninterface NodeGeometryViewResources {\n readonly _vertexWgsl: string;\n readonly _fragmentWgsl: string;\n readonly _geomState: NodeBuildState;\n readonly _struct: string;\n /** Fully-assembled fs_main return body (`var out…; return out;`), indented\n * one level with a trailing newline — ready to splice straight into the\n * node pipeline's `fs_main` (no WGSL assembly leaks into node-pipeline.ts). */\n readonly _fsReturn: string;\n readonly _needsGpUbo: boolean;\n readonly _attrNames: readonly string[];\n /** Per-target-signature compile (pipeline + BGL). */\n readonly _compileBySig: Map<string, NodeCompileResult>;\n /** Shared node UBO (one per material, format-independent). Allocated on first compile. */\n _nodeUBO: GPUBuffer | null;\n _nodeUBOReady: boolean;\n}\n\nconst ZERO = (wg: string): string => `vec4<f32>(0.0, 0.0, 0.0, ${wg})`;\n\n/** Build the per-attachment WGSL write for one geometry texture type, reading a\n * connected graph input when present and falling back to the engine default. */\nfunction geomWrite(type: GeometryTextureType, inputs: Map<GeometryTextureType, NodeExpr>, gpRef: { needsGp: boolean }): string {\n const wg = \"1.0\"; // opaque node materials: writeGeometryInfo gate is always 1.\n const v = inputs.get(type);\n const wp = inputs.get(GeometryTextureType.WORLD_POSITION);\n switch (type) {\n case GeometryTextureType.WORLD_POSITION:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.LOCAL_POSITION:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.WORLD_NORMAL:\n return v ? `vec4<f32>(normalize(${v.expr}) * 0.5 + vec3<f32>(0.5), ${wg})` : ZERO(wg);\n case GeometryTextureType.VIEW_NORMAL:\n return v ? `vec4<f32>(normalize(${v.expr}), ${wg})` : ZERO(wg);\n case GeometryTextureType.REFLECTIVITY:\n // Stored as vec4 — vec4(rgb, a) * writeGeometryInfo.\n return v ? `(${v.expr}) * ${wg}` : ZERO(wg);\n case GeometryTextureType.ALBEDO:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.IRRADIANCE:\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n case GeometryTextureType.SCREENSPACE_DEPTH:\n return v ? `vec4<f32>(${v.expr}, 0.0, 0.0, ${wg})` : `vec4<f32>(in.position.z, 0.0, 0.0, ${wg})`;\n case GeometryTextureType.VIEW_DEPTH:\n if (v) {\n return `vec4<f32>(${v.expr}, 0.0, 0.0, ${wg})`;\n }\n return wp ? `vec4<f32>((scene.view * vec4<f32>(${wp.expr}, 1.0)).z, 0.0, 0.0, ${wg})` : ZERO(wg);\n case GeometryTextureType.NORMALIZED_VIEW_DEPTH:\n if (v) {\n return `vec4<f32>(${v.expr}, 0.0, 0.0, ${wg})`;\n }\n if (wp) {\n gpRef.needsGp = true;\n return `vec4<f32>(((scene.view * vec4<f32>(${wp.expr}, 1.0)).z - nmeGeom.cameraNearFar.x) / (nmeGeom.cameraNearFar.y - nmeGeom.cameraNearFar.x), 0.0, 0.0, ${wg})`;\n }\n return ZERO(wg);\n case GeometryTextureType.LINEAR_VELOCITY:\n // Stored as vec3 — node materials do not compute velocity, default 0.\n return v ? `vec4<f32>(${v.expr}, ${wg})` : ZERO(wg);\n }\n}\n\n/** Re-emit the graph from the GeometryTextureOutputBlock terminal and build the\n * shared geometry resources (WGSL bodies + FragmentOutput struct + writes). */\nfunction ensureGeometryResources(view: NodeGeometryMaterialView): NodeGeometryViewResources {\n const cached = view._geometry as NodeGeometryViewResources | undefined;\n if (cached) {\n return cached;\n }\n const source = view.source as NodeMaterial;\n const graph = source._graph;\n const geomRoot = findBlockByClassName(graph, \"GeometryTextureOutputBlock\");\n if (!geomRoot) {\n throw new Error(\"NodeMaterial geometry view: graph has no GeometryTextureOutputBlock\");\n }\n const vertRoot = findBlockByClassName(graph, \"VertexOutputBlock\");\n const { vertexWgsl, fragmentWgsl, state } = emitGraph(\n graph,\n source._emitters as Map<string, import(\"./node-types.js\").BlockEmitter>,\n geomRoot.id,\n vertRoot ? vertRoot.id : null,\n [],\n {\n hasSkeleton: source._hasSkeleton,\n hasInstances: source._hasInstances,\n }\n );\n if (state.usesMorphTargets || state.usesEnv || state.shadowLights.length > 0) {\n throw new Error(\"NodeMaterial geometry view: morph / env / shadow inputs are not supported in the geometry pass\");\n }\n\n const inputs = state._geometryInputs ?? new Map<GeometryTextureType, NodeExpr>();\n const attachments = view._geometryAttachments;\n const gpRef = { needsGp: false };\n const structLines = attachments.map((_, i) => `@location(${i}) f${i}: vec4<f32>,`);\n const struct = `struct FragmentOutput {\\n${structLines.join(\"\\n\")}\\n};`;\n const writeLines = attachments.map((type, i) => `out.f${i} = ${geomWrite(type, inputs, gpRef)};`);\n // Pre-indent the full return body here (one level + trailing newline) so the\n // node pipeline just splices the string — no geometry WGSL assembly in the\n // always-loaded compileNodePipeline.\n const fsReturn = [\"var out: FragmentOutput;\", ...writeLines, \"return out;\"].map((l) => ` ${l}`).join(\"\\n\") + \"\\n\";\n\n const res: NodeGeometryViewResources = {\n _vertexWgsl: vertexWgsl,\n _fragmentWgsl: fragmentWgsl,\n _geomState: state,\n _struct: struct,\n _fsReturn: fsReturn,\n _needsGpUbo: gpRef.needsGp,\n _attrNames: state.vertexAttributes.map((a) => a._name),\n _compileBySig: new Map(),\n _nodeUBO: null,\n _nodeUBOReady: false,\n };\n Object.defineProperty(view, \"_geometry\", { value: res, enumerable: false, configurable: true });\n return res;\n}\n\n/** Compile (or fetch cached) the geometry MRT pipeline for a target signature. */\nfunction ensureGeometryCompile(view: NodeGeometryMaterialView, res: NodeGeometryViewResources, engine: EngineContext, sig: RenderTargetSignature): NodeCompileResult {\n const key = targetSignatureKey(sig);\n const cached = res._compileBySig.get(key);\n if (cached) {\n return cached;\n }\n const source = view.source as NodeMaterial;\n const colorFormats = (sig as RenderTargetSignature & { _colorFormats?: readonly GPUTextureFormat[] })._colorFormats ?? (sig._colorFormat ? [sig._colorFormat] : []);\n if (colorFormats.length === 0) {\n throw new Error(\"node-geometry: render target has no color attachments\");\n }\n const cullMode: GPUCullMode = source._graph.backFaceCulling ? (view._reverseCulling ? \"front\" : \"back\") : \"none\";\n // All geometry-specific WGSL object-literals + the MRT pipeline descriptor\n // live here (lazy module). compileNodePipeline only splices strings + calls\n // these callbacks, so non-geometry node scenes bundle none of it.\n const mrtOutput: MrtOutputOpts = {\n _struct: res._struct,\n _fsReturnType: \" -> FragmentOutput\",\n _fsReturn: res._fsReturn,\n _cacheKey: `3|mrt:${colorFormats.join()}:${cullMode}`,\n _needsGpUbo: res._needsGpUbo,\n _buildGeomUbo: (binding) => ({\n _wgsl: `struct NmeGeomParams { previousViewProjection: mat4x4<f32>, cameraNearFar: vec4<f32> };\\n@group(1) @binding(${binding}) var<uniform> nmeGeom: NmeGeomParams;`,\n _bglEntry: { binding, visibility: SS.FRAGMENT, buffer: { type: \"uniform\" } },\n }),\n // Geometry MRT renders upright into offscreen targets (the task packs an\n // un-flipped scene UBO), matching the Standard/PBR geometry renderables.\n _buildPipeline: (device, a) =>\n device.createRenderPipeline({\n label: \"node-material-geometry\",\n layout: device.createPipelineLayout({ bindGroupLayouts: [a._sceneBGL, a._meshBGL] }),\n vertex: { module: a._shaderModule, entryPoint: \"vs_main\", buffers: a._vertexBuffers },\n fragment: { module: a._shaderModule, entryPoint: \"fs_main\", targets: colorFormats.map((f) => ({ format: f })) },\n depthStencil: { format: a._depthFormat, depthCompare: a._depthCompare, depthWriteEnabled: true },\n multisample: { count: a._msaaSamples },\n primitive: { topology: \"triangle-list\", cullMode, frontFace: \"ccw\" },\n }),\n };\n const compile = compileNodePipeline(res._geomState, res._vertexWgsl, res._fragmentWgsl, {\n _engine: engine,\n _format: engine.format,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare ?? \"greater-equal\",\n _msaaSamples: sig._sampleCount,\n _backFaceCulling: source._graph.backFaceCulling,\n _alphaMode: 0,\n _mrtOutput: mrtOutput,\n });\n res._compileBySig.set(key, compile);\n return compile;\n}\n\n/** Resolve the default uniform value (as a Float32Array) for the InputBlock\n * whose sanitized name matches `sanitizedName`. Used by {@link ensureGeometryNodeUBO}\n * for uniforms that only appear in the geometry re-emit — e.g. a constant\n * reflectivity colour referenced solely by the GeometryTextureOutputBlock\n * terminal and therefore absent from the colour pass's `_uniformValues`.\n * Returns null when no matching scalar/vector uniform InputBlock exists. Lives\n * here (not in the always-loaded `node-material.ts`) so non-geometry node\n * scenes pay zero bytes for it; the tiny helpers it calls (`sanitize`,\n * `bjsTypeToNodeType`, `floatCount`, `extractDefault`) are already retained by\n * the always-loaded UBO writer and merely re-exported. */\nfunction extractNodeUniformDefault(graph: NodeGraph, sanitizedName: string): Float32Array | null {\n for (const block of graph.blocks.values()) {\n if (block.className !== \"InputBlock\") {\n continue;\n }\n if (sanitize(block.name || `input${block.id}`) !== sanitizedName) {\n continue;\n }\n const type = bjsTypeToNodeType((block.serialized[\"type\"] as number | undefined) ?? 0x10);\n if (type === \"mat4f\") {\n return null;\n }\n const values = new F32(floatCount(type));\n values.set(extractDefault(block.serialized[\"value\"], type));\n return values;\n }\n return null;\n}\n\n/** Build / refresh the shared geometry node UBO (constants + live uniform overlays). */\nfunction ensureGeometryNodeUBO(res: NodeGeometryViewResources, compile: NodeCompileResult, engine: EngineContext, source: NodeMaterial): GPUBuffer | null {\n if (res._nodeUBOReady) {\n return res._nodeUBO;\n }\n res._nodeUBOReady = true;\n if (compile._nodeUboBinding === null || compile._nodeUboSize === 0) {\n return null;\n }\n const scratch = new F32(compile._nodeUboSize / 4);\n for (const [name, offsetBytes] of compile._nodeUboOffsets) {\n const live = source._uniformValues.get(name);\n if (live) {\n scratch.set(live._values, offsetBytes >> 2);\n continue;\n }\n const def = extractNodeUniformDefault(source._graph, name);\n if (def) {\n scratch.set(def, offsetBytes >> 2);\n }\n }\n const ubo = engine._device.createBuffer({ label: \"node-geom-ubo\", size: compile._nodeUboSize, usage: BU.UNIFORM | BU.COPY_DST });\n engine._device.queue.writeBuffer(ubo, 0, scratch);\n res._nodeUBO = ubo;\n return ubo;\n}\n\nfunction buildGeometryBindGroup(\n engine: EngineContext,\n source: NodeMaterial,\n compile: NodeCompileResult,\n meshUBO: GPUBuffer,\n nodeUBO: GPUBuffer | null,\n view: NodeGeometryMaterialView\n): GPUBindGroup {\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: meshUBO } }];\n if (nodeUBO && compile._nodeUboBinding !== null) {\n entries.push({ binding: compile._nodeUboBinding, resource: { buffer: nodeUBO } });\n }\n for (const tb of compile._textureBindings) {\n const tex = source._textureSlots.get(tb._name)?.current;\n if (!tex) {\n throw new Error(`NodeMaterial geometry view: texture binding \"${tb._name}\" not set. Provide it via material.inputs[\"${tb._name}\"].texture before the first render.`);\n }\n entries.push({ binding: tb._texBinding, resource: tex.view }, { binding: tb._sampBinding, resource: tex.sampler });\n }\n if (compile._geometryGpBinding !== null) {\n if (!view._gpUBO) {\n throw new Error(\"NodeMaterial geometry view: NORMALIZED_VIEW_DEPTH requested but no geometry-params UBO was provided by the task.\");\n }\n entries.push({ binding: compile._geometryGpBinding, resource: { buffer: view._gpUBO } });\n }\n return engine._device.createBindGroup({ label: \"node-geom-bg\", layout: compile._meshBGL, entries });\n}\n\n/** Build a {@link Renderable} for one mesh drawn through a NodeMaterial geometry view. */\nexport function buildNodeGeometryRenderable(scene: SceneContext, mesh: Mesh, view: NodeGeometryMaterialView): Renderable {\n const engine = scene.surface.engine;\n const device = engine._device;\n const source = view.source as NodeMaterial;\n const res = ensureGeometryResources(view);\n\n // Per-mesh UBO: world (64B) + receivesShadow (vec4) + light count/indices.\n const meshUboBytes = (96 + 16 * Math.ceil(MAX_LIGHTS / 4) + 15) & ~15;\n const meshUBO = device.createBuffer({ label: \"node-geom-mesh-ubo\", size: meshUboBytes, usage: BU.UNIFORM | BU.COPY_DST });\n const meshScratch = new F32(meshUboBytes / 4);\n const packMeshWorld = engine._makePackMeshWorld?.(scene) ?? packMat4IntoF32;\n\n let needsAttrFlags = false;\n const writeMesh = (): void => {\n packMeshWorld(meshScratch, mesh.worldMatrix, 0, 0);\n meshScratch[16] = mesh.receiveShadows ? 1 : 0;\n if (needsAttrFlags) {\n writeAttributeFlags(mesh, meshScratch);\n }\n writeMeshLightSelection(mesh, scene.lights, meshScratch.subarray(4));\n device.queue.writeBuffer(meshUBO, 0, meshScratch as Float32Array<ArrayBuffer>);\n };\n\n let bindGroup: GPUBindGroup | null = null;\n let lastWorldVersion = -1;\n let lastLightsCount = -1;\n\n const sortCenter: [number, number, number] = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!];\n\n const r: Renderable = {\n order: mesh.renderOrder ?? 100,\n isTransparent: false,\n mesh,\n bind(eng: EngineContext, sig: RenderTargetSignature) {\n const compile = ensureGeometryCompile(view, res, eng as EngineContext, sig);\n needsAttrFlags = compile._usesMeshAttributeFlags;\n const nodeUBO = ensureGeometryNodeUBO(res, compile, eng as EngineContext, source);\n bindGroup = buildGeometryBindGroup(eng as EngineContext, source, compile, meshUBO, nodeUBO, view);\n\n const update = (): void => {\n if (mesh.worldMatrixVersion !== lastWorldVersion || scene.lights.length !== lastLightsCount) {\n writeMesh();\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n lastWorldVersion = mesh.worldMatrixVersion;\n lastLightsCount = scene.lights.length;\n }\n };\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder): number => {\n if (mesh.visible === false) {\n return 0;\n }\n const g = mesh._gpu;\n for (let i = 0; i < res._attrNames.length; i++) {\n pass.setVertexBuffer(i, getAttrBuffer(engine, g, res._attrNames[i]!));\n }\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, bindGroup!);\n pass.drawIndexed(g.indexCount);\n return 1;\n };\n return { renderable: r, pipeline: compile._pipeline, update, draw };\n },\n };\n r._worldCenter = sortCenter;\n return r;\n}\n","/** NodeMaterial view helper that targets geometry-rendering MRT output.\n *\n * The geometry renderer task wraps each NodeMaterial caster in a\n * `NodeGeometryMaterialView`. The view carries the per-task attachment list,\n * optional `gp` UBO (camera near/far, shared across the task's materials), and\n * reverse-culling flag, and shadows {@link Material._buildGroup} with\n * {@link nodeGeometryGroupBuilder} so the geometry renderer task materialises a\n * {@link Renderable} through the node geometry renderable infrastructure — no\n * view-aware branching needed in core render-task.\n *\n * The geometry-output WGSL itself is produced by re-walking the parsed graph\n * from the `GeometryTextureOutputBlock` terminal in\n * `./node-geometry-renderable.ts`. Mirrors `material/standard/geometry-view.ts`\n * and `material/node/esm-shadow-view.ts`. */\n\nimport { createMaterialView } from \"../material-view.js\";\nimport type { MaterialView } from \"../material.js\";\nimport type { GeometryTextureType } from \"../../frame-graph/geometry-types.js\";\nimport { NODE_GEOMETRY_OUTPUT } from \"./node-flags.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { nodeGeometryGroupBuilder } from \"./node-geometry-renderable.js\";\n\n/** Per-task ordered attachment list driving the geometry template. The array\n * index is the MRT color-attachment slot used in `@location(i)`. */\nexport type NodeGeometryAttachments = readonly GeometryTextureType[];\n\n/** Per-(task, material) NodeMaterial geometry view configuration. */\nexport interface NodeGeometryViewConfig {\n /** Ordered MRT attachment list — index = `@location(i)`. */\n readonly attachments: NodeGeometryAttachments;\n /** When true the task additionally wants the real (lit) material color at\n * `@location(N)`. NodeMaterial geometry views do not implement the extra\n * color attachment (the realColor impostor is dropped); passing `true`\n * throws so callers don't silently mismatch the render-pass attachments. */\n readonly emitColor: boolean;\n /** Per-task camera-near-far UBO. Required when {@link attachments} contains\n * `NORMALIZED_VIEW_DEPTH` (and the input is left unconnected). */\n readonly gpUBO?: GPUBuffer | null;\n /** Flip culling direction. */\n readonly reverseCulling?: boolean;\n}\n\n/** NodeMaterial view that emits geometry textures instead of shaded colour. */\nexport interface NodeGeometryMaterialView extends MaterialView {\n /** @internal Ordered MRT attachment list — index = `@location(i)`. */\n readonly _geometryAttachments: NodeGeometryAttachments;\n /** @internal Optional per-task geometry-params UBO. */\n readonly _gpUBO: GPUBuffer | null;\n /** @internal */\n readonly _reverseCulling: boolean;\n /** @internal Shared per-view resources cache populated lazily by the renderable factory. */\n _geometry?: unknown;\n}\n\n/** Wrap a NodeMaterial as a geometry-output view.\n * - Sets the `NODE_GEOMETRY_OUTPUT` feature bit.\n * - Shadows `_buildGroup` with {@link nodeGeometryGroupBuilder} so the natural\n * `material._buildGroup._rebuildSingle` dispatch builds a geometry-MRT\n * renderable for this view. */\nexport function createNodeGeometryMaterialView(source: NodeMaterial, config: NodeGeometryViewConfig): NodeGeometryMaterialView {\n if (config.emitColor) {\n throw new Error(\"NodeMaterial geometry view: emitColor (real-color target) is not supported — omit targetTexture on the geometry task.\");\n }\n const baseFeatures = source._renderFeatures?.features ?? 0;\n const view = createMaterialView(source, { features: baseFeatures | NODE_GEOMETRY_OUTPUT }) as NodeGeometryMaterialView;\n Object.defineProperty(view, \"_geometryAttachments\", { value: config.attachments, enumerable: false });\n Object.defineProperty(view, \"_gpUBO\", { value: config.gpUBO ?? null, enumerable: false });\n Object.defineProperty(view, \"_reverseCulling\", { value: config.reverseCulling ?? false, enumerable: false });\n Object.defineProperty(view, \"_buildGroup\", { value: nodeGeometryGroupBuilder, enumerable: false });\n return view;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ function blockLoader(key) {
|
|
|
19
19
|
case "IridescenceBlock":
|
|
20
20
|
return () => import("./iridescence-block-B0pRFoOU.js");
|
|
21
21
|
case "LoopBlock":
|
|
22
|
-
return () => import("./loop-block-
|
|
22
|
+
return () => import("./loop-block-C8vkQ2bz.js");
|
|
23
23
|
case "StorageReadBlock":
|
|
24
24
|
return () => import("./storage-read-block-BdzhJfln.js");
|
|
25
25
|
case "StorageWriteBlock":
|
|
@@ -38,4 +38,4 @@ async function loadExtraEmitter(key) {
|
|
|
38
38
|
export {
|
|
39
39
|
loadExtraEmitter
|
|
40
40
|
};
|
|
41
|
-
//# sourceMappingURL=node-registry-extra-compat-
|
|
41
|
+
//# sourceMappingURL=node-registry-extra-compat-CDLeBR1P.js.map
|
package/{node-registry-extra-compat-BEQH_ksg.js.map → node-registry-extra-compat-CDLeBR1P.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-registry-extra-compat-
|
|
1
|
+
{"version":3,"file":"node-registry-extra-compat-CDLeBR1P.js","sources":["../src/material/node/node-registry-extra-compat.ts"],"sourcesContent":["import type { BlockEmitter } from \"./node-types.js\";\nimport type { BlockLoader } from \"./node-registry.js\";\n\nfunction blockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"ElbowBlock\":\n return () => import(\"./blocks/elbow-block.js\");\n case \"NodeMaterialTeleportInBlock\":\n return () => import(\"./blocks/teleport-in-block.js\");\n case \"NodeMaterialTeleportOutBlock\":\n return () => import(\"./blocks/teleport-out-block.js\");\n case \"NodeMaterialDebugBlock\":\n return () => import(\"./blocks/debug-block.js\");\n case \"MeshAttributeExistsBlock\":\n return () => import(\"./blocks/mesh-attribute-exists-block.js\");\n case \"ClipPlanesBlock\":\n return () => import(\"./blocks/clip-planes-block.js\");\n case \"ReflectionTextureBaseBlock\":\n return () => import(\"./blocks/reflection-texture-base-block.js\");\n case \"ImageProcessingBlock\":\n return () => import(\"./blocks/image-processing-block.js\");\n case \"IridescenceBlock\":\n return () => import(\"./blocks/iridescence-block.js\");\n case \"LoopBlock\":\n return () => import(\"./blocks/loop-block.js\");\n case \"StorageReadBlock\":\n return () => import(\"./blocks/storage-read-block.js\");\n case \"StorageWriteBlock\":\n return () => import(\"./blocks/storage-write-block.js\");\n default:\n return null;\n }\n}\n\nexport async function loadExtraEmitter(key: string): Promise<BlockEmitter> {\n const loader = blockLoader(key);\n if (!loader) {\n throw new Error(`NodeMaterial: no compatibility extension emitter registered for block \"${key}\"`);\n }\n return (await loader()).emitter;\n}\n"],"names":[],"mappings":"AAGA,SAAS,YAAY,KAAiC;AAClD,UAAQ,KAAA;AAAA,IACJ,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,kCAAgC;AAAA,IACxD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,2CAAyC;AAAA,IACjE,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,6CAA2C;AAAA,IACnE,KAAK;AACD,aAAO,MAAM,OAAO,sCAAoC;AAAA,IAC5D,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,0BAAwB;AAAA,IAChD,KAAK;AACD,aAAO,MAAM,OAAO,kCAAgC;AAAA,IACxD,KAAK;AACD,aAAO,MAAM,OAAO,mCAAiC;AAAA,IACzD;AACI,aAAO;AAAA,EAAA;AAEnB;AAEA,eAAsB,iBAAiB,KAAoC;AACvE,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,0EAA0E,GAAG,GAAG;AAAA,EACpG;AACA,UAAQ,MAAM,UAAU;AAC5B;"}
|
|
@@ -27,7 +27,7 @@ function blockLoader(key) {
|
|
|
27
27
|
case "ConditionalBlock":
|
|
28
28
|
return () => import("./conditional-block-Cd2pbejI.js");
|
|
29
29
|
case "CurveBlock":
|
|
30
|
-
return () => import("./curve-block-
|
|
30
|
+
return () => import("./curve-block-Ditr4R7V.js");
|
|
31
31
|
case "WaveBlock":
|
|
32
32
|
return () => import("./wave-block-CY_mk1ec.js");
|
|
33
33
|
case "RandomNumberBlock":
|
|
@@ -46,4 +46,4 @@ async function loadExtraEmitter(key) {
|
|
|
46
46
|
export {
|
|
47
47
|
loadExtraEmitter
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=node-registry-extra-math-
|
|
49
|
+
//# sourceMappingURL=node-registry-extra-math-BA8_l4lB.js.map
|
package/{node-registry-extra-math-Bm32WBAa.js.map → node-registry-extra-math-BA8_l4lB.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-registry-extra-math-
|
|
1
|
+
{"version":3,"file":"node-registry-extra-math-BA8_l4lB.js","sources":["../src/material/node/node-registry-extra-math.ts"],"sourcesContent":["import type { BlockEmitter } from \"./node-types.js\";\nimport type { BlockLoader } from \"./node-registry.js\";\n\nfunction blockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"DivideBlock\":\n return () => import(\"./blocks/divide-block.js\");\n case \"ModBlock\":\n return () => import(\"./blocks/mod-block.js\");\n case \"ReciprocalBlock\":\n return () => import(\"./blocks/reciprocal-block.js\");\n case \"LengthBlock\":\n return () => import(\"./blocks/length-block.js\");\n case \"DistanceBlock\":\n return () => import(\"./blocks/distance-block.js\");\n case \"CrossBlock\":\n return () => import(\"./blocks/cross-block.js\");\n case \"ReflectBlock\":\n return () => import(\"./blocks/reflect-block.js\");\n case \"RefractBlock\":\n return () => import(\"./blocks/refract-block.js\");\n case \"ArcTan2Block\":\n return () => import(\"./blocks/arc-tan2-block.js\");\n case \"FresnelBlock\":\n return () => import(\"./blocks/fresnel-block.js\");\n case \"OppositeBlock\":\n return () => import(\"./blocks/opposite-block.js\");\n case \"NLerpBlock\":\n return () => import(\"./blocks/nlerp-block.js\");\n case \"ConditionalBlock\":\n return () => import(\"./blocks/conditional-block.js\");\n case \"CurveBlock\":\n return () => import(\"./blocks/curve-block.js\");\n case \"WaveBlock\":\n return () => import(\"./blocks/wave-block.js\");\n case \"RandomNumberBlock\":\n return () => import(\"./blocks/random-number-block.js\");\n default:\n return null;\n }\n}\n\nexport async function loadExtraEmitter(key: string): Promise<BlockEmitter> {\n const loader = blockLoader(key);\n if (!loader) {\n throw new Error(`NodeMaterial: no math extension emitter registered for block \"${key}\"`);\n }\n return (await loader()).emitter;\n}\n"],"names":[],"mappings":"AAGA,SAAS,YAAY,KAAiC;AAClD,UAAQ,KAAA;AAAA,IACJ,KAAK;AACD,aAAO,MAAM,OAAO,4BAA0B;AAAA,IAClD,KAAK;AACD,aAAO,MAAM,OAAO,yBAAuB;AAAA,IAC/C,KAAK;AACD,aAAO,MAAM,OAAO,gCAA8B;AAAA,IACtD,KAAK;AACD,aAAO,MAAM,OAAO,4BAA0B;AAAA,IAClD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,0BAAwB;AAAA,IAChD,KAAK;AACD,aAAO,MAAM,OAAO,mCAAiC;AAAA,IACzD;AACI,aAAO;AAAA,EAAA;AAEnB;AAEA,eAAsB,iBAAiB,KAAoC;AACvE,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,iEAAiE,GAAG,GAAG;AAAA,EAC3F;AACA,UAAQ,MAAM,UAAU;AAC5B;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as compileNodePipeline, B as BU, w as writeNodeUBO, p as packMat4IntoF32, a as F32, b as writeMeshLightSelection, N as NODE_ESM_SHADOW_OUTPUT, d as NODE_NO_COLOR_OUTPUT, M as MAX_LIGHTS, T as TU, U as U32, e as U8 } from "./index-
|
|
1
|
+
import { c as compileNodePipeline, B as BU, w as writeNodeUBO, p as packMat4IntoF32, a as F32, b as writeMeshLightSelection, N as NODE_ESM_SHADOW_OUTPUT, d as NODE_NO_COLOR_OUTPUT, M as MAX_LIGHTS, T as TU, U as U32, e as U8 } from "./index-BgY3QEzL.js";
|
|
2
2
|
const emptyMorphByEngine = /* @__PURE__ */ new WeakMap();
|
|
3
3
|
function getEmptyMorph(engine) {
|
|
4
4
|
const cached = emptyMorphByEngine.get(engine);
|
|
@@ -285,4 +285,4 @@ export {
|
|
|
285
285
|
getAttrBuffer,
|
|
286
286
|
writeAttributeFlags
|
|
287
287
|
};
|
|
288
|
-
//# sourceMappingURL=node-renderable-
|
|
288
|
+
//# sourceMappingURL=node-renderable-EwLLnaL1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-renderable-BMHny4tC.js","sources":["../src/material/node/node-renderable.ts"],"sourcesContent":["/** Node Material — MeshGroupBuilder + Renderable implementation.\n *\n * Parallel to `standard-renderable.ts`. Each NodeMaterial owns one compile\n * result (pipeline + BGLs); this builder creates per-mesh GPU resources\n * (mesh UBO, node UBO, bind groups) and returns a Renderable\n * that emits draws in the main pass.\n */\n\nimport { F32, U32, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { writeNodeUBO } from \"./node-material.js\";\nimport { compileNodePipeline } from \"./node-pipeline.js\";\nimport { NODE_ESM_SHADOW_OUTPUT, NODE_NO_COLOR_OUTPUT } from \"./node-flags.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\n\n// Per-engine cached no-op morph target: a 1×1 rgba32float texture + a UBO with\n// count=0 + sensible texWidth/rowsPerBand. Meshes without their own morph\n// targets reuse this so materials that contain a MorphTargetsBlock still work\n// (the WGSL loops over `count` and passes through when zero).\nconst emptyMorphByEngine = new WeakMap<EngineContext, { texture: GPUTexture; weightsBuffer: GPUBuffer }>();\nfunction getEmptyMorph(engine: EngineContext): { texture: GPUTexture; weightsBuffer: GPUBuffer } {\n const cached = emptyMorphByEngine.get(engine);\n if (cached) {\n return cached;\n }\n const texture = engine._device.createTexture({\n label: \"node-morph-empty\",\n size: [1, 1],\n format: \"rgba32float\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n engine._device.queue.writeTexture({ texture }, new F32([0, 0, 0, 0]).buffer, { bytesPerRow: 16 }, { width: 1, height: 1 });\n const ubo = new ArrayBuffer(32);\n const u32 = new U32(ubo, 16, 4);\n u32[0] = 0; // count\n u32[1] = 1; // texWidth\n u32[2] = 1; // rowsPerBand\n const weightsBuffer = engine._device.createBuffer({ label: \"node-morph-empty-ubo\", size: 32, usage: BU.UNIFORM | BU.COPY_DST });\n engine._device.queue.writeBuffer(weightsBuffer, 0, new U8(ubo));\n const entry = { texture, weightsBuffer };\n emptyMorphByEngine.set(engine, entry);\n return entry;\n}\n\ninterface NodePacket {\n readonly _mesh: Mesh;\n readonly _meshUBO: GPUBuffer;\n readonly _meshBG: GPUBindGroup;\n readonly _meshScratch: Float32Array;\n _lastWorldVersion: number;\n _lastReceivesShadow: number;\n _lastLightsCount: number;\n}\n\ntype NodeRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\n/** Build NME renderables for a set of meshes that share a NodeMaterial. */\nexport function buildNodeMeshRenderables(scene: SceneContext, meshes: Mesh[], materialOverride?: Material): MeshGroupBuildResult {\n const engine = scene.surface.engine;\n const device = engine._device;\n\n // All meshes in this group use the same NodeMaterial (scene-core batches by ctor).\n // We deliberately do NOT re-group by material instance: each renderable loops\n // packets of the same pipeline. For phase 1 every mesh with an NME material\n // shares that one material instance.\n const byMaterial = new Map<NodeMaterial, Mesh[]>();\n for (const m of meshes) {\n const mat = (materialOverride ?? m.material) as NodeMaterial;\n let list = byMaterial.get(mat);\n if (!list) {\n list = [];\n byMaterial.set(mat, list);\n }\n list.push(m);\n }\n\n const renderables: Renderable[] = [];\n\n for (const [material, matMeshes] of byMaterial) {\n const featureFlags = material._renderFeatures?.features ?? 0;\n const noColorOutput = (featureFlags & NODE_NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (featureFlags & NODE_ESM_SHADOW_OUTPUT) !== 0;\n const shadowOutput = noColorOutput || esmShadowOutput;\n const compile = shadowOutput\n ? compileNodePipeline(material._state, material._vertexBody, material._fragmentBody, {\n _engine: engine,\n _format: esmShadowOutput ? \"rgba16float\" : engine.format,\n _depthStencilFormat: \"depth32float\",\n _depthCompare: \"less-equal\",\n _msaaSamples: 1,\n _backFaceCulling: material._graph.backFaceCulling,\n _noColorOutput: noColorOutput,\n _esmShadowOutput: esmShadowOutput,\n _esmShadowDepthCode: esmShadowOutput ? material._esmShadowDepthCode : undefined,\n _alphaMode: esmShadowOutput ? 0 : undefined,\n // The shared fragment body still references env IBL/BRDF samplers\n // (e.g. nmeBrdfLUT) even in the no-color shadow-depth variant, so we\n // must emit the env decls + BGL entries here too; otherwise WGSL fails\n // to resolve those identifiers. _envEmitter is undefined for non-env\n // materials (state.usesEnv === false), leaving them unaffected.\n _envEmitter: material._envHelpers?.emitEnv,\n })\n : material._compile;\n const meshBGL = compile._meshBGL;\n\n // Node UBO is per-material (same across all meshes using it).\n let nodeUBO: GPUBuffer | null = null;\n if (compile._nodeUboBinding !== null && compile._nodeUboSize > 0) {\n nodeUBO = device.createBuffer({ label: \"node-ubo\", size: compile._nodeUboSize, usage: BU.UNIFORM | BU.COPY_DST });\n writeNodeUBO(engine, nodeUBO, material);\n material._nodeUBO = nodeUBO;\n }\n\n const _packMeshWorld = engine._makePackMeshWorld?.(scene as SceneContext) ?? packMat4IntoF32;\n const packets: NodePacket[] = [];\n for (const _mesh of matMeshes) {\n // Mesh UBO layout: world (64B) + receivesShadow (vec4, 16B) + lightCount/indices.\n const meshUboBytes = 96 + 16 * Math.ceil(MAX_LIGHTS / 4);\n const _meshUBO = device.createBuffer({ label: \"node-mesh-ubo\", size: (meshUboBytes + 15) & ~15, usage: BU.UNIFORM | BU.COPY_DST });\n const _meshScratch = new F32(((meshUboBytes + 15) & ~15) / 4);\n _packMeshWorld(_meshScratch, _mesh.worldMatrix, 0, 0);\n const recv = _mesh.receiveShadows ? 1 : 0;\n _meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(_mesh, _meshScratch);\n }\n writeMeshLightSelection(_mesh, scene.lights, _meshScratch.subarray(4));\n device.queue.writeBuffer(_meshUBO, 0, _meshScratch);\n\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: _meshUBO } }];\n if (nodeUBO) {\n entries.push({ binding: compile._nodeUboBinding!, resource: { buffer: nodeUBO } });\n }\n for (const tb of compile._textureBindings) {\n const slot = material._textureSlots.get(tb._name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(\n `NodeMaterial: texture binding \"${tb._name}\" not set. Provide it via options.textures or material.inputs[\"${tb._name}\"].texture before the first render.`\n );\n }\n entries.push({ binding: tb._texBinding, resource: tex.view });\n entries.push({ binding: tb._sampBinding, resource: tex.sampler });\n }\n if (compile._morphBindings !== null) {\n const mt = (_mesh as { morphTargets?: { texture: GPUTexture; weightsBuffer: GPUBuffer } | null }).morphTargets ?? getEmptyMorph(engine);\n entries.push({ binding: compile._morphBindings._textureBinding, resource: mt.texture.createView() });\n entries.push({ binding: compile._morphBindings._uboBinding, resource: { buffer: mt.weightsBuffer } });\n }\n if (compile._envBindings) {\n material._envHelpers!.pushEnvBindGroupEntries(scene, compile._envBindings, entries);\n }\n for (let si = 0; si < compile._shadowBindings.length; si++) {\n const sb = compile._shadowBindings[si]!;\n const sg = material._shadowGenerators[si];\n if (!sg) {\n throw new Error(`NodeMaterial: material requires shadow generator #${si} but none was supplied to parseNodeMaterialFromSnippet({ shadowGenerators }).`);\n }\n entries.push({ binding: sb._texBinding, resource: sg._depthTexture.createView() });\n entries.push({ binding: sb._sampBinding, resource: sg._depthSampler });\n entries.push({ binding: sb._uboBinding, resource: { buffer: sg._shadowUBO } });\n }\n if (compile._esmShadowParamsBinding !== null) {\n entries.push({\n binding: compile._esmShadowParamsBinding,\n resource: { buffer: material._esmShadowParamsUBO! },\n });\n }\n const _meshBG = device.createBindGroup({ label: \"node-mesh-bg\", layout: meshBGL, entries });\n\n packets.push({\n _mesh,\n _meshUBO,\n _meshBG,\n _meshScratch,\n _lastWorldVersion: _mesh.worldMatrixVersion,\n _lastReceivesShadow: recv,\n _lastLightsCount: scene.lights.length,\n });\n }\n\n // Vertex attribute order (matches compile.state — captured on material).\n const attrNames = material._vertexAttrNames;\n\n const updatePacketUBO = (pkt: NodePacket): void => {\n const recv = pkt._mesh.receiveShadows ? 1 : 0;\n const worldVersion = pkt._mesh.worldMatrixVersion;\n const worldChanged = worldVersion !== pkt._lastWorldVersion;\n const recvChanged = recv !== pkt._lastReceivesShadow;\n const lightsChanged = scene.lights.length !== pkt._lastLightsCount;\n if (worldChanged || recvChanged || lightsChanged) {\n _packMeshWorld(pkt._meshScratch, pkt._mesh.worldMatrix, 0, 0);\n pkt._meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(pkt._mesh, pkt._meshScratch);\n }\n writeMeshLightSelection(pkt._mesh, scene.lights, pkt._meshScratch.subarray(4));\n device.queue.writeBuffer(pkt._meshUBO, 0, pkt._meshScratch as Float32Array<ArrayBuffer>);\n pkt._lastWorldVersion = worldVersion;\n pkt._lastReceivesShadow = recv;\n pkt._lastLightsCount = scene.lights.length;\n }\n };\n\n const updateNodeUBO = (): void => {\n if (nodeUBO && material._uboDirty) {\n material._uboDirty = false;\n writeNodeUBO(engine, nodeUBO, material);\n }\n };\n\n const drawPacket = (pass: NodeRenderPass, pkt: NodePacket): void => {\n const g = pkt._mesh._gpu;\n for (let i = 0; i < attrNames.length; i++) {\n const buf = getAttrBuffer(engine, g, attrNames[i]!);\n pass.setVertexBuffer(i, buf);\n }\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, pkt._meshBG);\n pass.drawIndexed(g.indexCount);\n };\n\n const isTransparent = !noColorOutput && !esmShadowOutput && material._needsAlphaBlending;\n\n if (isTransparent) {\n // Transparent materials: one renderable per mesh so each gets an\n // independent _worldCenter for back-to-front distance sorting.\n for (const pkt of packets) {\n const wm = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n const cx = pkt._mesh.position?.x ?? wm[12]!;\n const cy = pkt._mesh.position?.y ?? wm[13]!;\n const cz = pkt._mesh.position?.z ?? wm[14]!;\n const sortCenter: [number, number, number] = [cx, cy, cz];\n const _baseUpdate = (): void => {\n updatePacketUBO(pkt);\n updateNodeUBO();\n // Update world center for sorting.\n const m = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const _invalidate = (): void => {\n pkt._lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene as SceneContext, _invalidate) ?? _baseUpdate;\n const draw = (pass: NodeRenderPass): number => {\n drawPacket(pass, pkt);\n return 1;\n };\n const rTrans: Renderable = {\n order: 200,\n isTransparent: true,\n mesh: pkt._mesh,\n _worldCenter: sortCenter,\n bind() {\n return { renderable: rTrans, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rTrans);\n }\n } else {\n // Opaque: batch all meshes into one renderable for state efficiency.\n const _baseUpdate = (): void => {\n for (const pkt of packets) {\n updatePacketUBO(pkt);\n }\n updateNodeUBO();\n };\n const _invalidate = (): void => {\n for (const pkt of packets) {\n pkt._lastWorldVersion = -1;\n }\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene as SceneContext, _invalidate) ?? _baseUpdate;\n const draw = (pass: NodeRenderPass): number => {\n let draws = 0;\n for (const pkt of packets) {\n drawPacket(pass, pkt);\n draws++;\n }\n return draws;\n };\n const rOpaque: Renderable = {\n order: 100,\n isTransparent: false,\n bind() {\n return { renderable: rOpaque, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rOpaque);\n }\n }\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, override?: Material): Renderable => {\n return buildNodeMeshRenderables(s, [mesh], override).renderables[0]!;\n };\n\n return { renderables, rebuildSingle };\n}\n\n// Per-gpu-object cached zero buffers for attributes that a NodeMaterial's\n// vertex layout declares but the mesh itself doesn't provide (e.g. vertex\n// color on meshes that don't use VERTEXCOLOR). We allocate one zero buffer\n// lazily per gpu object, sized to its position vertex count × stride.\nconst zeroAttrCache = new WeakMap<object, Map<string, GPUBuffer>>();\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n // position buffer size in bytes / 12 (vec3) = vertex count.\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : name === \"tangent\" || name === \"color\" ? 16 : 16;\n const buf = engine._device.createBuffer({ label: `node-zero-${name}`, size: vertexCount * stride, usage: BU.VERTEX | BU.COPY_DST });\n // Initialize with zeros (buffer starts zeroed when not mappedAtCreation).\n cache.set(name, buf);\n return buf;\n}\n\nexport function getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer;\n case \"uv\":\n return gpu.uvBuffer;\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n default:\n throw new Error(`NodeMaterial: unsupported attribute \"${name}\"`);\n }\n}\n\nexport function writeAttributeFlags(mesh: Mesh, scratch: Float32Array): void {\n const gpu = mesh._gpu;\n scratch[17] = gpu.hasUv === false ? 0 : 1;\n scratch[18] = gpu.hasTangent ? 1 : 0;\n scratch[19] = gpu.hasColor ? 1 : 0;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-renderable-EwLLnaL1.js","sources":["../src/material/node/node-renderable.ts"],"sourcesContent":["/** Node Material — MeshGroupBuilder + Renderable implementation.\n *\n * Parallel to `standard-renderable.ts`. Each NodeMaterial owns one compile\n * result (pipeline + BGLs); this builder creates per-mesh GPU resources\n * (mesh UBO, node UBO, bind groups) and returns a Renderable\n * that emits draws in the main pass.\n */\n\nimport { F32, U32, U8 } from \"../../engine/typed-arrays.js\";\nimport { TU, BU } from \"../../engine/gpu-flags.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { writeNodeUBO } from \"./node-material.js\";\nimport { compileNodePipeline } from \"./node-pipeline.js\";\nimport { NODE_ESM_SHADOW_OUTPUT, NODE_NO_COLOR_OUTPUT } from \"./node-flags.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\n\n// Per-engine cached no-op morph target: a 1×1 rgba32float texture + a UBO with\n// count=0 + sensible texWidth/rowsPerBand. Meshes without their own morph\n// targets reuse this so materials that contain a MorphTargetsBlock still work\n// (the WGSL loops over `count` and passes through when zero).\nconst emptyMorphByEngine = new WeakMap<EngineContext, { texture: GPUTexture; weightsBuffer: GPUBuffer }>();\nfunction getEmptyMorph(engine: EngineContext): { texture: GPUTexture; weightsBuffer: GPUBuffer } {\n const cached = emptyMorphByEngine.get(engine);\n if (cached) {\n return cached;\n }\n const texture = engine._device.createTexture({\n label: \"node-morph-empty\",\n size: [1, 1],\n format: \"rgba32float\",\n usage: TU.TEXTURE_BINDING | TU.COPY_DST,\n });\n engine._device.queue.writeTexture({ texture }, new F32([0, 0, 0, 0]).buffer, { bytesPerRow: 16 }, { width: 1, height: 1 });\n const ubo = new ArrayBuffer(32);\n const u32 = new U32(ubo, 16, 4);\n u32[0] = 0; // count\n u32[1] = 1; // texWidth\n u32[2] = 1; // rowsPerBand\n const weightsBuffer = engine._device.createBuffer({ label: \"node-morph-empty-ubo\", size: 32, usage: BU.UNIFORM | BU.COPY_DST });\n engine._device.queue.writeBuffer(weightsBuffer, 0, new U8(ubo));\n const entry = { texture, weightsBuffer };\n emptyMorphByEngine.set(engine, entry);\n return entry;\n}\n\ninterface NodePacket {\n readonly _mesh: Mesh;\n readonly _meshUBO: GPUBuffer;\n readonly _meshBG: GPUBindGroup;\n readonly _meshScratch: Float32Array;\n _lastWorldVersion: number;\n _lastReceivesShadow: number;\n _lastLightsCount: number;\n}\n\ntype NodeRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\n/** Build NME renderables for a set of meshes that share a NodeMaterial. */\nexport function buildNodeMeshRenderables(scene: SceneContext, meshes: Mesh[], materialOverride?: Material): MeshGroupBuildResult {\n const engine = scene.surface.engine;\n const device = engine._device;\n\n // All meshes in this group use the same NodeMaterial (scene-core batches by ctor).\n // We deliberately do NOT re-group by material instance: each renderable loops\n // packets of the same pipeline. For phase 1 every mesh with an NME material\n // shares that one material instance.\n const byMaterial = new Map<NodeMaterial, Mesh[]>();\n for (const m of meshes) {\n const mat = (materialOverride ?? m.material) as NodeMaterial;\n let list = byMaterial.get(mat);\n if (!list) {\n list = [];\n byMaterial.set(mat, list);\n }\n list.push(m);\n }\n\n const renderables: Renderable[] = [];\n\n for (const [material, matMeshes] of byMaterial) {\n const featureFlags = material._renderFeatures?.features ?? 0;\n const noColorOutput = (featureFlags & NODE_NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (featureFlags & NODE_ESM_SHADOW_OUTPUT) !== 0;\n const shadowOutput = noColorOutput || esmShadowOutput;\n const compile = shadowOutput\n ? compileNodePipeline(material._state, material._vertexBody, material._fragmentBody, {\n _engine: engine,\n _format: esmShadowOutput ? \"rgba16float\" : engine.format,\n _depthStencilFormat: \"depth32float\",\n _depthCompare: \"less-equal\",\n _msaaSamples: 1,\n _backFaceCulling: material._graph.backFaceCulling,\n _noColorOutput: noColorOutput,\n _esmShadowOutput: esmShadowOutput,\n _esmShadowDepthCode: esmShadowOutput ? material._esmShadowDepthCode : undefined,\n _alphaMode: esmShadowOutput ? 0 : undefined,\n // The shared fragment body still references env IBL/BRDF samplers\n // (e.g. nmeBrdfLUT) even in the no-color shadow-depth variant, so we\n // must emit the env decls + BGL entries here too; otherwise WGSL fails\n // to resolve those identifiers. _envEmitter is undefined for non-env\n // materials (state.usesEnv === false), leaving them unaffected.\n _envEmitter: material._envHelpers?.emitEnv,\n })\n : material._compile;\n const meshBGL = compile._meshBGL;\n\n // Node UBO is per-material (same across all meshes using it).\n let nodeUBO: GPUBuffer | null = null;\n if (compile._nodeUboBinding !== null && compile._nodeUboSize > 0) {\n nodeUBO = device.createBuffer({ label: \"node-ubo\", size: compile._nodeUboSize, usage: BU.UNIFORM | BU.COPY_DST });\n writeNodeUBO(engine, nodeUBO, material);\n material._nodeUBO = nodeUBO;\n }\n\n const _packMeshWorld = engine._makePackMeshWorld?.(scene as SceneContext) ?? packMat4IntoF32;\n const packets: NodePacket[] = [];\n for (const _mesh of matMeshes) {\n // Mesh UBO layout: world (64B) + receivesShadow (vec4, 16B) + lightCount/indices.\n const meshUboBytes = 96 + 16 * Math.ceil(MAX_LIGHTS / 4);\n const _meshUBO = device.createBuffer({ label: \"node-mesh-ubo\", size: (meshUboBytes + 15) & ~15, usage: BU.UNIFORM | BU.COPY_DST });\n const _meshScratch = new F32(((meshUboBytes + 15) & ~15) / 4);\n _packMeshWorld(_meshScratch, _mesh.worldMatrix, 0, 0);\n const recv = _mesh.receiveShadows ? 1 : 0;\n _meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(_mesh, _meshScratch);\n }\n writeMeshLightSelection(_mesh, scene.lights, _meshScratch.subarray(4));\n device.queue.writeBuffer(_meshUBO, 0, _meshScratch);\n\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: _meshUBO } }];\n if (nodeUBO) {\n entries.push({ binding: compile._nodeUboBinding!, resource: { buffer: nodeUBO } });\n }\n for (const tb of compile._textureBindings) {\n const slot = material._textureSlots.get(tb._name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(\n `NodeMaterial: texture binding \"${tb._name}\" not set. Provide it via options.textures or material.inputs[\"${tb._name}\"].texture before the first render.`\n );\n }\n entries.push({ binding: tb._texBinding, resource: tex.view });\n entries.push({ binding: tb._sampBinding, resource: tex.sampler });\n }\n if (compile._morphBindings !== null) {\n const mt = (_mesh as { morphTargets?: { texture: GPUTexture; weightsBuffer: GPUBuffer } | null }).morphTargets ?? getEmptyMorph(engine);\n entries.push({ binding: compile._morphBindings._textureBinding, resource: mt.texture.createView() });\n entries.push({ binding: compile._morphBindings._uboBinding, resource: { buffer: mt.weightsBuffer } });\n }\n if (compile._envBindings) {\n material._envHelpers!.pushEnvBindGroupEntries(scene, compile._envBindings, entries);\n }\n for (let si = 0; si < compile._shadowBindings.length; si++) {\n const sb = compile._shadowBindings[si]!;\n const sg = material._shadowGenerators[si];\n if (!sg) {\n throw new Error(`NodeMaterial: material requires shadow generator #${si} but none was supplied to parseNodeMaterialFromSnippet({ shadowGenerators }).`);\n }\n entries.push({ binding: sb._texBinding, resource: sg._depthTexture.createView() });\n entries.push({ binding: sb._sampBinding, resource: sg._depthSampler });\n entries.push({ binding: sb._uboBinding, resource: { buffer: sg._shadowUBO } });\n }\n if (compile._esmShadowParamsBinding !== null) {\n entries.push({\n binding: compile._esmShadowParamsBinding,\n resource: { buffer: material._esmShadowParamsUBO! },\n });\n }\n const _meshBG = device.createBindGroup({ label: \"node-mesh-bg\", layout: meshBGL, entries });\n\n packets.push({\n _mesh,\n _meshUBO,\n _meshBG,\n _meshScratch,\n _lastWorldVersion: _mesh.worldMatrixVersion,\n _lastReceivesShadow: recv,\n _lastLightsCount: scene.lights.length,\n });\n }\n\n // Vertex attribute order (matches compile.state — captured on material).\n const attrNames = material._vertexAttrNames;\n\n const updatePacketUBO = (pkt: NodePacket): void => {\n const recv = pkt._mesh.receiveShadows ? 1 : 0;\n const worldVersion = pkt._mesh.worldMatrixVersion;\n const worldChanged = worldVersion !== pkt._lastWorldVersion;\n const recvChanged = recv !== pkt._lastReceivesShadow;\n const lightsChanged = scene.lights.length !== pkt._lastLightsCount;\n if (worldChanged || recvChanged || lightsChanged) {\n _packMeshWorld(pkt._meshScratch, pkt._mesh.worldMatrix, 0, 0);\n pkt._meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(pkt._mesh, pkt._meshScratch);\n }\n writeMeshLightSelection(pkt._mesh, scene.lights, pkt._meshScratch.subarray(4));\n device.queue.writeBuffer(pkt._meshUBO, 0, pkt._meshScratch as Float32Array<ArrayBuffer>);\n pkt._lastWorldVersion = worldVersion;\n pkt._lastReceivesShadow = recv;\n pkt._lastLightsCount = scene.lights.length;\n }\n };\n\n const updateNodeUBO = (): void => {\n if (nodeUBO && material._uboDirty) {\n material._uboDirty = false;\n writeNodeUBO(engine, nodeUBO, material);\n }\n };\n\n const drawPacket = (pass: NodeRenderPass, pkt: NodePacket): void => {\n const g = pkt._mesh._gpu;\n for (let i = 0; i < attrNames.length; i++) {\n const buf = getAttrBuffer(engine, g, attrNames[i]!);\n pass.setVertexBuffer(i, buf);\n }\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, pkt._meshBG);\n pass.drawIndexed(g.indexCount);\n };\n\n const isTransparent = !noColorOutput && !esmShadowOutput && material._needsAlphaBlending;\n\n if (isTransparent) {\n // Transparent materials: one renderable per mesh so each gets an\n // independent _worldCenter for back-to-front distance sorting.\n for (const pkt of packets) {\n const wm = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n const cx = pkt._mesh.position?.x ?? wm[12]!;\n const cy = pkt._mesh.position?.y ?? wm[13]!;\n const cz = pkt._mesh.position?.z ?? wm[14]!;\n const sortCenter: [number, number, number] = [cx, cy, cz];\n const _baseUpdate = (): void => {\n updatePacketUBO(pkt);\n updateNodeUBO();\n // Update world center for sorting.\n const m = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const _invalidate = (): void => {\n pkt._lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene as SceneContext, _invalidate) ?? _baseUpdate;\n const draw = (pass: NodeRenderPass): number => {\n drawPacket(pass, pkt);\n return 1;\n };\n const rTrans: Renderable = {\n order: 200,\n isTransparent: true,\n mesh: pkt._mesh,\n _worldCenter: sortCenter,\n bind() {\n return { renderable: rTrans, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rTrans);\n }\n } else {\n // Opaque: batch all meshes into one renderable for state efficiency.\n const _baseUpdate = (): void => {\n for (const pkt of packets) {\n updatePacketUBO(pkt);\n }\n updateNodeUBO();\n };\n const _invalidate = (): void => {\n for (const pkt of packets) {\n pkt._lastWorldVersion = -1;\n }\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene as SceneContext, _invalidate) ?? _baseUpdate;\n const draw = (pass: NodeRenderPass): number => {\n let draws = 0;\n for (const pkt of packets) {\n drawPacket(pass, pkt);\n draws++;\n }\n return draws;\n };\n const rOpaque: Renderable = {\n order: 100,\n isTransparent: false,\n bind() {\n return { renderable: rOpaque, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rOpaque);\n }\n }\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, override?: Material): Renderable => {\n return buildNodeMeshRenderables(s, [mesh], override).renderables[0]!;\n };\n\n return { renderables, rebuildSingle };\n}\n\n// Per-gpu-object cached zero buffers for attributes that a NodeMaterial's\n// vertex layout declares but the mesh itself doesn't provide (e.g. vertex\n// color on meshes that don't use VERTEXCOLOR). We allocate one zero buffer\n// lazily per gpu object, sized to its position vertex count × stride.\nconst zeroAttrCache = new WeakMap<object, Map<string, GPUBuffer>>();\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n // position buffer size in bytes / 12 (vec3) = vertex count.\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : name === \"tangent\" || name === \"color\" ? 16 : 16;\n const buf = engine._device.createBuffer({ label: `node-zero-${name}`, size: vertexCount * stride, usage: BU.VERTEX | BU.COPY_DST });\n // Initialize with zeros (buffer starts zeroed when not mappedAtCreation).\n cache.set(name, buf);\n return buf;\n}\n\nexport function getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer;\n case \"uv\":\n return gpu.uvBuffer;\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n default:\n throw new Error(`NodeMaterial: unsupported attribute \"${name}\"`);\n }\n}\n\nexport function writeAttributeFlags(mesh: Mesh, scratch: Float32Array): void {\n const gpu = mesh._gpu;\n scratch[17] = gpu.hasUv === false ? 0 : 1;\n scratch[18] = gpu.hasTangent ? 1 : 0;\n scratch[19] = gpu.hasColor ? 1 : 0;\n}\n"],"names":[],"mappings":";AA4BA,MAAM,yCAAyB,QAAA;AAC/B,SAAS,cAAc,QAA0E;AAC7F,QAAM,SAAS,mBAAmB,IAAI,MAAM;AAC5C,MAAI,QAAQ;AACR,WAAO;AAAA,EACX;AACA,QAAM,UAAU,OAAO,QAAQ,cAAc;AAAA,IACzC,OAAO;AAAA,IACP,MAAM,CAAC,GAAG,CAAC;AAAA,IACX,QAAQ;AAAA,IACR,OAAO,GAAG,kBAAkB,GAAG;AAAA,EAAA,CAClC;AACD,SAAO,QAAQ,MAAM,aAAa,EAAE,QAAA,GAAW,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,GAAA,GAAM,EAAE,OAAO,GAAG,QAAQ,GAAG;AACzH,QAAM,MAAM,IAAI,YAAY,EAAE;AAC9B,QAAM,MAAM,IAAI,IAAI,KAAK,IAAI,CAAC;AAC9B,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,MAAI,CAAC,IAAI;AACT,QAAM,gBAAgB,OAAO,QAAQ,aAAa,EAAE,OAAO,wBAAwB,MAAM,IAAI,OAAO,GAAG,UAAU,GAAG,UAAU;AAC9H,SAAO,QAAQ,MAAM,YAAY,eAAe,GAAG,IAAI,GAAG,GAAG,CAAC;AAC9D,QAAM,QAAQ,EAAE,SAAS,cAAA;AACzB,qBAAmB,IAAI,QAAQ,KAAK;AACpC,SAAO;AACX;AAeO,SAAS,yBAAyB,OAAqB,QAAgB,kBAAmD;;AAC7H,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,SAAS,OAAO;AAMtB,QAAM,iCAAiB,IAAA;AACvB,aAAW,KAAK,QAAQ;AACpB,UAAM,MAAO,oBAAoB,EAAE;AACnC,QAAI,OAAO,WAAW,IAAI,GAAG;AAC7B,QAAI,CAAC,MAAM;AACP,aAAO,CAAA;AACP,iBAAW,IAAI,KAAK,IAAI;AAAA,IAC5B;AACA,SAAK,KAAK,CAAC;AAAA,EACf;AAEA,QAAM,cAA4B,CAAA;AAElC,aAAW,CAAC,UAAU,SAAS,KAAK,YAAY;AAC5C,UAAM,iBAAe,cAAS,oBAAT,mBAA0B,aAAY;AAC3D,UAAM,iBAAiB,eAAe,0BAA0B;AAChE,UAAM,mBAAmB,eAAe,4BAA4B;AACpE,UAAM,eAAe,iBAAiB;AACtC,UAAM,UAAU,eACV,oBAAoB,SAAS,QAAQ,SAAS,aAAa,SAAS,eAAe;AAAA,MAC/E,SAAS;AAAA,MACT,SAAS,kBAAkB,gBAAgB,OAAO;AAAA,MAClD,qBAAqB;AAAA,MACrB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,kBAAkB,SAAS,OAAO;AAAA,MAClC,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB,qBAAqB,kBAAkB,SAAS,sBAAsB;AAAA,MACtE,YAAY,kBAAkB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMlC,cAAa,cAAS,gBAAT,mBAAsB;AAAA,IAAA,CACtC,IACD,SAAS;AACf,UAAM,UAAU,QAAQ;AAGxB,QAAI,UAA4B;AAChC,QAAI,QAAQ,oBAAoB,QAAQ,QAAQ,eAAe,GAAG;AAC9D,gBAAU,OAAO,aAAa,EAAE,OAAO,YAAY,MAAM,QAAQ,cAAc,OAAO,GAAG,UAAU,GAAG,UAAU;AAChH,mBAAa,QAAQ,SAAS,QAAQ;AACtC,eAAS,WAAW;AAAA,IACxB;AAEA,UAAM,mBAAiB,YAAO,uBAAP,gCAA4B,WAA0B;AAC7E,UAAM,UAAwB,CAAA;AAC9B,eAAW,SAAS,WAAW;AAE3B,YAAM,eAAe,KAAK,KAAK,KAAK,KAAK,aAAa,CAAC;AACvD,YAAM,WAAW,OAAO,aAAa,EAAE,OAAO,iBAAiB,MAAO,eAAe,KAAM,KAAK,OAAO,GAAG,UAAU,GAAG,UAAU;AACjI,YAAM,eAAe,IAAI,KAAM,eAAe,KAAM,OAAO,CAAC;AAC5D,qBAAe,cAAc,MAAM,aAAa,GAAG,CAAC;AACpD,YAAM,OAAO,MAAM,iBAAiB,IAAI;AACxC,mBAAa,EAAE,IAAI;AACnB,UAAI,QAAQ,yBAAyB;AACjC,4BAAoB,OAAO,YAAY;AAAA,MAC3C;AACA,8BAAwB,OAAO,MAAM,QAAQ,aAAa,SAAS,CAAC,CAAC;AACrE,aAAO,MAAM,YAAY,UAAU,GAAG,YAAY;AAElD,YAAM,UAA+B,CAAC,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,SAAA,GAAY;AACpF,UAAI,SAAS;AACT,gBAAQ,KAAK,EAAE,SAAS,QAAQ,iBAAkB,UAAU,EAAE,QAAQ,QAAA,GAAW;AAAA,MACrF;AACA,iBAAW,MAAM,QAAQ,kBAAkB;AACvC,cAAM,OAAO,SAAS,cAAc,IAAI,GAAG,KAAK;AAChD,cAAM,MAAM,6BAAM;AAClB,YAAI,CAAC,KAAK;AACN,gBAAM,IAAI;AAAA,YACN,kCAAkC,GAAG,KAAK,kEAAkE,GAAG,KAAK;AAAA,UAAA;AAAA,QAE5H;AACA,gBAAQ,KAAK,EAAE,SAAS,GAAG,aAAa,UAAU,IAAI,MAAM;AAC5D,gBAAQ,KAAK,EAAE,SAAS,GAAG,cAAc,UAAU,IAAI,SAAS;AAAA,MACpE;AACA,UAAI,QAAQ,mBAAmB,MAAM;AACjC,cAAM,KAAM,MAAsF,gBAAgB,cAAc,MAAM;AACtI,gBAAQ,KAAK,EAAE,SAAS,QAAQ,eAAe,iBAAiB,UAAU,GAAG,QAAQ,WAAA,EAAW,CAAG;AACnG,gBAAQ,KAAK,EAAE,SAAS,QAAQ,eAAe,aAAa,UAAU,EAAE,QAAQ,GAAG,cAAA,EAAc,CAAG;AAAA,MACxG;AACA,UAAI,QAAQ,cAAc;AACtB,iBAAS,YAAa,wBAAwB,OAAO,QAAQ,cAAc,OAAO;AAAA,MACtF;AACA,eAAS,KAAK,GAAG,KAAK,QAAQ,gBAAgB,QAAQ,MAAM;AACxD,cAAM,KAAK,QAAQ,gBAAgB,EAAE;AACrC,cAAM,KAAK,SAAS,kBAAkB,EAAE;AACxC,YAAI,CAAC,IAAI;AACL,gBAAM,IAAI,MAAM,qDAAqD,EAAE,+EAA+E;AAAA,QAC1J;AACA,gBAAQ,KAAK,EAAE,SAAS,GAAG,aAAa,UAAU,GAAG,cAAc,WAAA,GAAc;AACjF,gBAAQ,KAAK,EAAE,SAAS,GAAG,cAAc,UAAU,GAAG,eAAe;AACrE,gBAAQ,KAAK,EAAE,SAAS,GAAG,aAAa,UAAU,EAAE,QAAQ,GAAG,WAAA,EAAW,CAAG;AAAA,MACjF;AACA,UAAI,QAAQ,4BAA4B,MAAM;AAC1C,gBAAQ,KAAK;AAAA,UACT,SAAS,QAAQ;AAAA,UACjB,UAAU,EAAE,QAAQ,SAAS,oBAAA;AAAA,QAAqB,CACrD;AAAA,MACL;AACA,YAAM,UAAU,OAAO,gBAAgB,EAAE,OAAO,gBAAgB,QAAQ,SAAS,SAAS;AAE1F,cAAQ,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,mBAAmB,MAAM;AAAA,QACzB,qBAAqB;AAAA,QACrB,kBAAkB,MAAM,OAAO;AAAA,MAAA,CAClC;AAAA,IACL;AAGA,UAAM,YAAY,SAAS;AAE3B,UAAM,kBAAkB,CAAC,QAA0B;AAC/C,YAAM,OAAO,IAAI,MAAM,iBAAiB,IAAI;AAC5C,YAAM,eAAe,IAAI,MAAM;AAC/B,YAAM,eAAe,iBAAiB,IAAI;AAC1C,YAAM,cAAc,SAAS,IAAI;AACjC,YAAM,gBAAgB,MAAM,OAAO,WAAW,IAAI;AAClD,UAAI,gBAAgB,eAAe,eAAe;AAC9C,uBAAe,IAAI,cAAc,IAAI,MAAM,aAAa,GAAG,CAAC;AAC5D,YAAI,aAAa,EAAE,IAAI;AACvB,YAAI,QAAQ,yBAAyB;AACjC,8BAAoB,IAAI,OAAO,IAAI,YAAY;AAAA,QACnD;AACA,gCAAwB,IAAI,OAAO,MAAM,QAAQ,IAAI,aAAa,SAAS,CAAC,CAAC;AAC7E,eAAO,MAAM,YAAY,IAAI,UAAU,GAAG,IAAI,YAAyC;AACvF,YAAI,oBAAoB;AACxB,YAAI,sBAAsB;AAC1B,YAAI,mBAAmB,MAAM,OAAO;AAAA,MACxC;AAAA,IACJ;AAEA,UAAM,gBAAgB,MAAY;AAC9B,UAAI,WAAW,SAAS,WAAW;AAC/B,iBAAS,YAAY;AACrB,qBAAa,QAAQ,SAAS,QAAQ;AAAA,MAC1C;AAAA,IACJ;AAEA,UAAM,aAAa,CAAC,MAAsB,QAA0B;AAChE,YAAM,IAAI,IAAI,MAAM;AACpB,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACvC,cAAM,MAAM,cAAc,QAAQ,GAAG,UAAU,CAAC,CAAE;AAClD,aAAK,gBAAgB,GAAG,GAAG;AAAA,MAC/B;AACA,WAAK,eAAe,EAAE,aAAa,EAAE,WAAW;AAChD,WAAK,aAAa,GAAG,IAAI,OAAO;AAChC,WAAK,YAAY,EAAE,UAAU;AAAA,IACjC;AAEA,UAAM,gBAAgB,CAAC,iBAAiB,CAAC,mBAAmB,SAAS;AAErE,QAAI,eAAe;AAGf,iBAAW,OAAO,SAAS;AACvB,cAAM,KAAK,IAAI,MAAM;AACrB,cAAM,OAAK,SAAI,MAAM,aAAV,mBAAoB,MAAK,GAAG,EAAE;AACzC,cAAM,OAAK,SAAI,MAAM,aAAV,mBAAoB,MAAK,GAAG,EAAE;AACzC,cAAM,OAAK,SAAI,MAAM,aAAV,mBAAoB,MAAK,GAAG,EAAE;AACzC,cAAM,aAAuC,CAAC,IAAI,IAAI,EAAE;AACxD,cAAM,cAAc,MAAY;AAC5B,0BAAgB,GAAG;AACnB,wBAAA;AAEA,gBAAM,IAAI,IAAI,MAAM;AACpB,qBAAW,CAAC,IAAI,EAAE,EAAE;AACpB,qBAAW,CAAC,IAAI,EAAE,EAAE;AACpB,qBAAW,CAAC,IAAI,EAAE,EAAE;AAAA,QACxB;AACA,cAAM,cAAc,MAAY;AAC5B,cAAI,oBAAoB;AAAA,QAC5B;AACA,cAAM,WAAS,YAAO,yBAAP,gCAA8B,aAAa,OAAuB,iBAAgB;AACjG,cAAM,OAAO,CAAC,SAAiC;AAC3C,qBAAW,MAAM,GAAG;AACpB,iBAAO;AAAA,QACX;AACA,cAAM,SAAqB;AAAA,UACvB,OAAO;AAAA,UACP,eAAe;AAAA,UACf,MAAM,IAAI;AAAA,UACV,cAAc;AAAA,UACd,OAAO;AACH,mBAAO,EAAE,YAAY,QAAQ,UAAU,QAAQ,WAAW,QAAQ,KAAA;AAAA,UACtE;AAAA,QAAA;AAEJ,oBAAY,KAAK,MAAM;AAAA,MAC3B;AAAA,IACJ,OAAO;AAEH,YAAM,cAAc,MAAY;AAC5B,mBAAW,OAAO,SAAS;AACvB,0BAAgB,GAAG;AAAA,QACvB;AACA,sBAAA;AAAA,MACJ;AACA,YAAM,cAAc,MAAY;AAC5B,mBAAW,OAAO,SAAS;AACvB,cAAI,oBAAoB;AAAA,QAC5B;AAAA,MACJ;AACA,YAAM,WAAS,YAAO,yBAAP,gCAA8B,aAAa,OAAuB,iBAAgB;AACjG,YAAM,OAAO,CAAC,SAAiC;AAC3C,YAAI,QAAQ;AACZ,mBAAW,OAAO,SAAS;AACvB,qBAAW,MAAM,GAAG;AACpB;AAAA,QACJ;AACA,eAAO;AAAA,MACX;AACA,YAAM,UAAsB;AAAA,QACxB,OAAO;AAAA,QACP,eAAe;AAAA,QACf,OAAO;AACH,iBAAO,EAAE,YAAY,SAAS,UAAU,QAAQ,WAAW,QAAQ,KAAA;AAAA,QACvE;AAAA,MAAA;AAEJ,kBAAY,KAAK,OAAO;AAAA,IAC5B;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,GAAiB,MAAY,aAAoC;AACpF,WAAO,yBAAyB,GAAG,CAAC,IAAI,GAAG,QAAQ,EAAE,YAAY,CAAC;AAAA,EACtE;AAEA,SAAO,EAAE,aAAa,cAAA;AAC1B;AAMA,MAAM,oCAAoB,QAAA;AAC1B,SAAS,kBAAkB,QAAuB,KAAc,MAAyB;AACrF,MAAI,QAAQ,cAAc,IAAI,GAAwB;AACtD,MAAI,CAAC,OAAO;AACR,gCAAY,IAAA;AACZ,kBAAc,IAAI,KAA0B,KAAK;AAAA,EACrD;AACA,QAAM,WAAW,MAAM,IAAI,IAAI;AAC/B,MAAI,UAAU;AACV,WAAO;AAAA,EACX;AAEA,QAAM,cAAc,IAAI,eAAe,OAAO;AAC9C,QAAM,SAAS,SAAS,QAAQ,SAAS,QAAQ,IAAI,SAAS,WAAW,KAAK,SAAS,aAAa,SAAS,UAAU,KAAK;AAC5H,QAAM,MAAM,OAAO,QAAQ,aAAa,EAAE,OAAO,aAAa,IAAI,IAAI,MAAM,cAAc,QAAQ,OAAO,GAAG,SAAS,GAAG,UAAU;AAElI,QAAM,IAAI,MAAM,GAAG;AACnB,SAAO;AACX;AAEO,SAAS,cAAc,QAAuB,KAAc,MAAyB;AACxF,UAAQ,MAAA;AAAA,IACJ,KAAK;AACD,aAAO,IAAI;AAAA,IACf,KAAK;AACD,aAAO,IAAI;AAAA,IACf,KAAK;AACD,aAAO,IAAI;AAAA,IACf,KAAK;AACD,aAAO,IAAI,aAAa,kBAAkB,QAAQ,KAAK,KAAK;AAAA,IAChE,KAAK;AACD,aAAO,IAAI,iBAAiB,kBAAkB,QAAQ,KAAK,SAAS;AAAA,IACxE,KAAK;AACD,aAAO,IAAI,eAAe,kBAAkB,QAAQ,KAAK,OAAO;AAAA,IACpE;AACI,YAAM,IAAI,MAAM,wCAAwC,IAAI,GAAG;AAAA,EAAA;AAE3E;AAEO,SAAS,oBAAoB,MAAY,SAA6B;AACzE,QAAM,MAAM,KAAK;AACjB,UAAQ,EAAE,IAAI,IAAI,UAAU,QAAQ,IAAI;AACxC,UAAQ,EAAE,IAAI,IAAI,aAAa,IAAI;AACnC,UAAQ,EAAE,IAAI,IAAI,WAAW,IAAI;AACrC;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { M as MAX_LIGHTS, S as SS } from "./index-
|
|
1
|
+
import { M as MAX_LIGHTS, S as SS } from "./index-BgY3QEzL.js";
|
|
2
2
|
const SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;
|
|
3
3
|
const SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill("1.0").join(", ")})`;
|
|
4
4
|
function emitShadow(shadowLights, startBinding, varyings) {
|
|
@@ -119,4 +119,4 @@ fn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f
|
|
|
119
119
|
export {
|
|
120
120
|
emitShadow
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=node-shadow-
|
|
122
|
+
//# sourceMappingURL=node-shadow-CeTmT6g4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-shadow-BRiz7CT1.js","sources":["../src/material/node/node-shadow.ts"],"sourcesContent":["/** Node Material — shadow emission (dynamically imported).\n *\n * This module is imported ONLY when `parseNodeMaterialFromSnippet` receives\n * `shadowGenerators`. Scenes without shadows never bundle it, keeping the\n * shadow WGSL (PCF/ESM helper fns + binding wiring) off the critical path.\n *\n * Emits three things per shadow light (texture + sampler + shadowInfo UBO)\n * plus the vertex-stage varying computations and the fragment-stage\n * `nme_computeShadowFactors(input)` dispatcher consumed by the LightBlock.\n */\n\nimport { SS } from \"../../engine/gpu-flags.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport type { Varying } from \"../../shader/fragment-types.js\";\n\nconst SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;\nconst SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\n/** @internal */\nexport interface ShadowBinding {\n /** @internal */\n readonly _lightIndex: number;\n /** @internal */\n readonly _texBinding: number;\n /** @internal */\n readonly _sampBinding: number;\n /** @internal */\n readonly _uboBinding: number;\n /** @internal */\n readonly _shadowType: \"esm\" | \"pcf\";\n}\n\nexport interface ShadowEmit {\n /** @internal One per shadow-casting light (3 binding slots each). */\n readonly _bindings: readonly ShadowBinding[];\n /** @internal Module-scope WGSL: struct + binding decls + compute fns. */\n readonly _wgslDecls: string;\n /** @internal `nme_computeShadowFactors(input) -> array<f32, MAX_LIGHTS>` called from light blocks. */\n readonly _fragmentHelper: string;\n /** @internal Injected into vs_main body: populates vPosFromLight_i + vDepthMetric_i varyings. */\n readonly _vertexInject: string;\n /** @internal GPU BGL entries for group 1 (append to meshBglEntries). */\n readonly _bglEntries: readonly GPUBindGroupLayoutEntry[];\n /** @internal Total bindings consumed (= shadowLights.length * 3). */\n readonly _bindingCount: number;\n}\n\n/** Emit shadow WGSL + bindings for a NodeMaterial.\n * Mutates `varyings` (pushes vPosFromLight_i + vDepthMetric_i per light) so\n * buildVertexOut picks them up.\n */\nexport function emitShadow(shadowLights: readonly { lightIndex: number; shadowType: \"esm\" | \"pcf\" }[], startBinding: number, varyings: Varying[]): ShadowEmit {\n const _bindings: ShadowBinding[] = [];\n const wgslDecls: string[] = [];\n const _bglEntries: GPUBindGroupLayoutEntry[] = [];\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n if (!varyings.some((v) => v._name === `vPosFromLight${suf}`)) {\n varyings.push({ _name: `vPosFromLight${suf}`, _type: \"vec4<f32>\" });\n }\n if (!varyings.some((v) => v._name === `vDepthMetric${suf}`)) {\n varyings.push({ _name: `vDepthMetric${suf}`, _type: \"f32\" });\n }\n }\n const vertLines: string[] = [`let _shadowWp4 = meshU.world * vec4<f32>(in.position, 1.0);`];\n const dispatchLines: string[] = [`var _sf = ${SHADOW_FACTORS_ONE};`];\n let nextBinding = startBinding;\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n const _lightIndex = sl.lightIndex;\n const _texBinding = nextBinding++;\n const _sampBinding = nextBinding++;\n const _uboBinding = nextBinding++;\n const _shadowType = sl.shadowType;\n _bindings.push({ _lightIndex, _texBinding, _sampBinding, _uboBinding, _shadowType });\n wgslDecls.push(\n `struct shadowInfo${suf}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`,\n `@group(1) @binding(${_uboBinding}) var<uniform> shadowInfo${suf}: shadowInfo${suf}Uniforms;`\n );\n if (sl.shadowType === \"pcf\") {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_depth_2d;`,\n `@group(1) @binding(${_sampBinding}) var shadowComp${suf}: sampler_comparison;`,\n `fn computeShadowPCF${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n 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; }\n let depthRef = clamp(clipSpace.z, 0.0, 1.0);\n var tc = uv * mapSz + 0.5;\n let st = fract(tc);\n let base = (floor(tc) - 0.5) * invMapSz;\n let uvw0 = 4.0 - 3.0 * st;\n let uvw1 = vec2<f32>(7.0);\n let uvw2 = 1.0 + 3.0 * st;\n 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;\n 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;\n var sh = 0.0;\n sh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[0]), depthRef);\n sh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[0]), depthRef);\n sh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[0]), depthRef);\n sh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[1]), depthRef);\n sh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[1]), depthRef);\n sh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[1]), depthRef);\n sh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[2]), depthRef);\n sh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[2]), depthRef);\n sh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[2]), depthRef);\n sh /= 144.0;\n return mix(darkness, 1.0, sh);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowPCF${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.y, shadowInfo${suf}.shadowsInfo.z);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"depth\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: SS.FRAGMENT, sampler: { type: \"comparison\" } }\n );\n } else {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_2d<f32>;`,\n `@group(1) @binding(${_sampBinding}) var shadowSamp${suf}: sampler;`,\n `fn computeFallOff${suf}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {\n let mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));\n return mix(value, 1.0, mask);\n}\nfn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n 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; }\n let shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);\n let shadowMapSample = textureSampleLevel(shadowTex${suf}, shadowSamp${suf}, uv, 0.0).x;\n let esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);\n return computeFallOff${suf}(esm, clipSpace.xy, frustumEdgeFalloff);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowESM${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.z, shadowInfo${suf}.shadowsInfo.w);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } }\n );\n }\n vertLines.push(\n `out.vPosFromLight${suf} = shadowInfo${suf}.lightMatrix * _shadowWp4;`,\n `out.vDepthMetric${suf} = (out.vPosFromLight${suf}.z + shadowInfo${suf}.depthValues.x) / shadowInfo${suf}.depthValues.y;`\n );\n _bglEntries.push({\n binding: _uboBinding,\n visibility: SS.VERTEX | SS.FRAGMENT,\n buffer: { type: \"uniform\", minBindingSize: 96 },\n });\n }\n dispatchLines.push(`for (var _i = 0u; _i < ${MAX_LIGHTS}u; _i++) { _sf[_i] = mix(1.0, _sf[_i], meshU.receivesShadow.x); }`);\n dispatchLines.push(`return _sf;`);\n return {\n _bindings,\n _wgslDecls: wgslDecls.join(\"\\n\"),\n _fragmentHelper: `fn nme_computeShadowFactors(input: VertexOut) -> ${SHADOW_FACTORS_TYPE} {\\n ${dispatchLines.join(\"\\n \")}\\n}`,\n _vertexInject: vertLines.join(\"\\n \"),\n _bglEntries,\n _bindingCount: shadowLights.length * 3,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node-shadow-CeTmT6g4.js","sources":["../src/material/node/node-shadow.ts"],"sourcesContent":["/** Node Material — shadow emission (dynamically imported).\n *\n * This module is imported ONLY when `parseNodeMaterialFromSnippet` receives\n * `shadowGenerators`. Scenes without shadows never bundle it, keeping the\n * shadow WGSL (PCF/ESM helper fns + binding wiring) off the critical path.\n *\n * Emits three things per shadow light (texture + sampler + shadowInfo UBO)\n * plus the vertex-stage varying computations and the fragment-stage\n * `nme_computeShadowFactors(input)` dispatcher consumed by the LightBlock.\n */\n\nimport { SS } from \"../../engine/gpu-flags.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport type { Varying } from \"../../shader/fragment-types.js\";\n\nconst SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;\nconst SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\n/** @internal */\nexport interface ShadowBinding {\n /** @internal */\n readonly _lightIndex: number;\n /** @internal */\n readonly _texBinding: number;\n /** @internal */\n readonly _sampBinding: number;\n /** @internal */\n readonly _uboBinding: number;\n /** @internal */\n readonly _shadowType: \"esm\" | \"pcf\";\n}\n\nexport interface ShadowEmit {\n /** @internal One per shadow-casting light (3 binding slots each). */\n readonly _bindings: readonly ShadowBinding[];\n /** @internal Module-scope WGSL: struct + binding decls + compute fns. */\n readonly _wgslDecls: string;\n /** @internal `nme_computeShadowFactors(input) -> array<f32, MAX_LIGHTS>` called from light blocks. */\n readonly _fragmentHelper: string;\n /** @internal Injected into vs_main body: populates vPosFromLight_i + vDepthMetric_i varyings. */\n readonly _vertexInject: string;\n /** @internal GPU BGL entries for group 1 (append to meshBglEntries). */\n readonly _bglEntries: readonly GPUBindGroupLayoutEntry[];\n /** @internal Total bindings consumed (= shadowLights.length * 3). */\n readonly _bindingCount: number;\n}\n\n/** Emit shadow WGSL + bindings for a NodeMaterial.\n * Mutates `varyings` (pushes vPosFromLight_i + vDepthMetric_i per light) so\n * buildVertexOut picks them up.\n */\nexport function emitShadow(shadowLights: readonly { lightIndex: number; shadowType: \"esm\" | \"pcf\" }[], startBinding: number, varyings: Varying[]): ShadowEmit {\n const _bindings: ShadowBinding[] = [];\n const wgslDecls: string[] = [];\n const _bglEntries: GPUBindGroupLayoutEntry[] = [];\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n if (!varyings.some((v) => v._name === `vPosFromLight${suf}`)) {\n varyings.push({ _name: `vPosFromLight${suf}`, _type: \"vec4<f32>\" });\n }\n if (!varyings.some((v) => v._name === `vDepthMetric${suf}`)) {\n varyings.push({ _name: `vDepthMetric${suf}`, _type: \"f32\" });\n }\n }\n const vertLines: string[] = [`let _shadowWp4 = meshU.world * vec4<f32>(in.position, 1.0);`];\n const dispatchLines: string[] = [`var _sf = ${SHADOW_FACTORS_ONE};`];\n let nextBinding = startBinding;\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n const _lightIndex = sl.lightIndex;\n const _texBinding = nextBinding++;\n const _sampBinding = nextBinding++;\n const _uboBinding = nextBinding++;\n const _shadowType = sl.shadowType;\n _bindings.push({ _lightIndex, _texBinding, _sampBinding, _uboBinding, _shadowType });\n wgslDecls.push(\n `struct shadowInfo${suf}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`,\n `@group(1) @binding(${_uboBinding}) var<uniform> shadowInfo${suf}: shadowInfo${suf}Uniforms;`\n );\n if (sl.shadowType === \"pcf\") {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_depth_2d;`,\n `@group(1) @binding(${_sampBinding}) var shadowComp${suf}: sampler_comparison;`,\n `fn computeShadowPCF${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n 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; }\n let depthRef = clamp(clipSpace.z, 0.0, 1.0);\n var tc = uv * mapSz + 0.5;\n let st = fract(tc);\n let base = (floor(tc) - 0.5) * invMapSz;\n let uvw0 = 4.0 - 3.0 * st;\n let uvw1 = vec2<f32>(7.0);\n let uvw2 = 1.0 + 3.0 * st;\n 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;\n 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;\n var sh = 0.0;\n sh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[0]), depthRef);\n sh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[0]), depthRef);\n sh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[0]), depthRef);\n sh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[1]), depthRef);\n sh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[1]), depthRef);\n sh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[1]), depthRef);\n sh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[2]), depthRef);\n sh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[2]), depthRef);\n sh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[2]), depthRef);\n sh /= 144.0;\n return mix(darkness, 1.0, sh);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowPCF${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.y, shadowInfo${suf}.shadowsInfo.z);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"depth\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: SS.FRAGMENT, sampler: { type: \"comparison\" } }\n );\n } else {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_2d<f32>;`,\n `@group(1) @binding(${_sampBinding}) var shadowSamp${suf}: sampler;`,\n `fn computeFallOff${suf}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {\n let mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));\n return mix(value, 1.0, mask);\n}\nfn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n 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; }\n let shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);\n let shadowMapSample = textureSampleLevel(shadowTex${suf}, shadowSamp${suf}, uv, 0.0).x;\n let esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);\n return computeFallOff${suf}(esm, clipSpace.xy, frustumEdgeFalloff);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowESM${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.z, shadowInfo${suf}.shadowsInfo.w);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: SS.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: SS.FRAGMENT, sampler: { type: \"filtering\" } }\n );\n }\n vertLines.push(\n `out.vPosFromLight${suf} = shadowInfo${suf}.lightMatrix * _shadowWp4;`,\n `out.vDepthMetric${suf} = (out.vPosFromLight${suf}.z + shadowInfo${suf}.depthValues.x) / shadowInfo${suf}.depthValues.y;`\n );\n _bglEntries.push({\n binding: _uboBinding,\n visibility: SS.VERTEX | SS.FRAGMENT,\n buffer: { type: \"uniform\", minBindingSize: 96 },\n });\n }\n dispatchLines.push(`for (var _i = 0u; _i < ${MAX_LIGHTS}u; _i++) { _sf[_i] = mix(1.0, _sf[_i], meshU.receivesShadow.x); }`);\n dispatchLines.push(`return _sf;`);\n return {\n _bindings,\n _wgslDecls: wgslDecls.join(\"\\n\"),\n _fragmentHelper: `fn nme_computeShadowFactors(input: VertexOut) -> ${SHADOW_FACTORS_TYPE} {\\n ${dispatchLines.join(\"\\n \")}\\n}`,\n _vertexInject: vertLines.join(\"\\n \"),\n _bglEntries,\n _bindingCount: shadowLights.length * 3,\n };\n}\n"],"names":[],"mappings":";AAeA,MAAM,sBAAsB,cAAc,UAAU;AACpD,MAAM,qBAAqB,GAAG,mBAAmB,IAAI,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAmC1F,SAAS,WAAW,cAA4E,cAAsB,UAAiC;AAC1J,QAAM,YAA6B,CAAA;AACnC,QAAM,YAAsB,CAAA;AAC5B,QAAM,cAAyC,CAAA;AAC/C,aAAW,MAAM,cAAc;AAC3B,UAAM,MAAM,IAAI,GAAG,UAAU;AAC7B,QAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,gBAAgB,GAAG,EAAE,GAAG;AAC1D,eAAS,KAAK,EAAE,OAAO,gBAAgB,GAAG,IAAI,OAAO,aAAa;AAAA,IACtE;AACA,QAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,eAAe,GAAG,EAAE,GAAG;AACzD,eAAS,KAAK,EAAE,OAAO,eAAe,GAAG,IAAI,OAAO,OAAO;AAAA,IAC/D;AAAA,EACJ;AACA,QAAM,YAAsB,CAAC,6DAA6D;AAC1F,QAAM,gBAA0B,CAAC,aAAa,kBAAkB,GAAG;AACnE,MAAI,cAAc;AAClB,aAAW,MAAM,cAAc;AAC3B,UAAM,MAAM,IAAI,GAAG,UAAU;AAC7B,UAAM,cAAc,GAAG;AACvB,UAAM,cAAc;AACpB,UAAM,eAAe;AACrB,UAAM,cAAc;AACpB,UAAM,cAAc,GAAG;AACvB,cAAU,KAAK,EAAE,aAAa,aAAa,cAAc,aAAa,aAAa;AACnF,cAAU;AAAA,MACN,oBAAoB,GAAG;AAAA,MACvB,sBAAsB,WAAW,4BAA4B,GAAG,eAAe,GAAG;AAAA,IAAA;AAEtF,QAAI,GAAG,eAAe,OAAO;AACzB,gBAAU;AAAA,QACN,sBAAsB,WAAW,kBAAkB,GAAG;AAAA,QACtD,sBAAsB,YAAY,mBAAmB,GAAG;AAAA,QACxD,sBAAsB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAcwB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA;AAAA;AAAA;AAAA,MAAA;AAK1E,oBAAc;AAAA,QACV,OAAO,GAAG,UAAU,uBAAuB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,eAAe,GAAG,6BAA6B,GAAG,6BAA6B,GAAG;AAAA,MAAA;AAExL,kBAAY;AAAA,QACR,EAAE,SAAS,aAAa,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,QACrG,EAAE,SAAS,cAAc,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,aAAA,EAAa;AAAA,MAAE;AAAA,IAE1F,OAAO;AACH,gBAAU;AAAA,QACN,sBAAsB,WAAW,kBAAkB,GAAG;AAAA,QACtD,sBAAsB,YAAY,mBAAmB,GAAG;AAAA,QACxD,oBAAoB,GAAG;AAAA;AAAA;AAAA;AAAA,qBAIlB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,wDAKgC,GAAG,eAAe,GAAG;AAAA;AAAA,2BAElD,GAAG;AAAA;AAAA,MAAA;AAGlB,oBAAc;AAAA,QACV,OAAO,GAAG,UAAU,uBAAuB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,eAAe,GAAG,6BAA6B,GAAG,6BAA6B,GAAG;AAAA,MAAA;AAExL,kBAAY;AAAA,QACR,EAAE,SAAS,aAAa,YAAY,GAAG,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,QACrG,EAAE,SAAS,cAAc,YAAY,GAAG,UAAU,SAAS,EAAE,MAAM,YAAA,EAAY;AAAA,MAAE;AAAA,IAEzF;AACA,cAAU;AAAA,MACN,oBAAoB,GAAG,gBAAgB,GAAG;AAAA,MAC1C,mBAAmB,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,+BAA+B,GAAG;AAAA,IAAA;AAE5G,gBAAY,KAAK;AAAA,MACb,SAAS;AAAA,MACT,YAAY,GAAG,SAAS,GAAG;AAAA,MAC3B,QAAQ,EAAE,MAAM,WAAW,gBAAgB,GAAA;AAAA,IAAG,CACjD;AAAA,EACL;AACA,gBAAc,KAAK,0BAA0B,UAAU,mEAAmE;AAC1H,gBAAc,KAAK,aAAa;AAChC,SAAO;AAAA,IACH;AAAA,IACA,YAAY,UAAU,KAAK,IAAI;AAAA,IAC/B,iBAAiB,oDAAoD,mBAAmB;AAAA,MAAW,cAAc,KAAK,QAAQ,CAAC;AAAA;AAAA,IAC/H,eAAe,UAAU,KAAK,QAAQ;AAAA,IACtC;AAAA,IACA,eAAe,aAAa,SAAS;AAAA,EAAA;AAE7C;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ae as HAS_BUMP_TEXTURE } from "./index-
|
|
1
|
+
import { ae as HAS_BUMP_TEXTURE } from "./index-BgY3QEzL.js";
|
|
2
2
|
import { W as WGSL_PERTURB_NORMAL } from "./wgsl-helpers-D8sl1VVA.js";
|
|
3
3
|
const STAGE_FRAGMENT = 2;
|
|
4
4
|
function createNormalMapFragment() {
|
|
@@ -35,4 +35,4 @@ export {
|
|
|
35
35
|
bumpStdExt,
|
|
36
36
|
createNormalMapFragment
|
|
37
37
|
};
|
|
38
|
-
//# sourceMappingURL=normal-map-fragment-
|
|
38
|
+
//# sourceMappingURL=normal-map-fragment-BHImLyM-.js.map
|