@babylonjs/lite 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_mat4-storage-f64-Bvh5TymE.js +10 -0
- package/_mat4-storage-f64-Bvh5TymE.js.map +1 -0
- package/{alpha-test-fragment-CUiHCw7W.js → alpha-test-fragment-BCChpzaV.js} +2 -2
- package/{alpha-test-fragment-CUiHCw7W.js.map → alpha-test-fragment-BCChpzaV.js.map} +1 -1
- package/{background-dds-skybox-yHTqabU3.js → background-dds-skybox-ZjrSIxrT.js} +4 -4
- package/background-dds-skybox-ZjrSIxrT.js.map +1 -0
- package/{background-ground-DIw6D3qf.js → background-ground-B2Mie-MI.js} +3 -3
- package/background-ground-B2Mie-MI.js.map +1 -0
- package/{background-hdr-skybox-c4uuTmkP.js → background-hdr-skybox-DDRJYuT2.js} +3 -3
- package/background-hdr-skybox-DDRJYuT2.js.map +1 -0
- package/{background-solid-skybox-DPGBpPbm.js → background-solid-skybox-fjXlnWaD.js} +3 -3
- package/{background-solid-skybox-DPGBpPbm.js.map → background-solid-skybox-fjXlnWaD.js.map} +1 -1
- package/{billboard-renderable-D8mlVGCd.js → billboard-renderable-DKmlOgbM.js} +2 -2
- package/{billboard-renderable-D8mlVGCd.js.map → billboard-renderable-DKmlOgbM.js.map} +1 -1
- package/{clamp-block-BdII67hT.js → clamp-block-CxRBPlUq.js} +2 -2
- package/{clamp-block-BdII67hT.js.map → clamp-block-CxRBPlUq.js.map} +1 -1
- package/{clearcoat-fragment-LCiG98Rf.js → clearcoat-fragment-KbZAa0TA.js} +2 -2
- package/{clearcoat-fragment-LCiG98Rf.js.map → clearcoat-fragment-KbZAa0TA.js.map} +1 -1
- package/{create-skeleton-C9JdIJnb.js → create-skeleton-BBI5urcj.js} +2 -2
- package/{create-skeleton-C9JdIJnb.js.map → create-skeleton-BBI5urcj.js.map} +1 -1
- package/{cubemap-skybox-material-DvXMVc4k.js → cubemap-skybox-material-DvW81drX.js} +2 -2
- package/{cubemap-skybox-material-DvXMVc4k.js.map → cubemap-skybox-material-DvW81drX.js.map} +1 -1
- package/{curve-block-BlJpXVYv.js → curve-block-Dh_xdUj-.js} +2 -2
- package/{curve-block-BlJpXVYv.js.map → curve-block-Dh_xdUj-.js.map} +1 -1
- package/{emissive-fragment-BnNvbBCw.js → emissive-fragment-DD8cvHyx.js} +2 -2
- package/{emissive-fragment-BnNvbBCw.js.map → emissive-fragment-DD8cvHyx.js.map} +1 -1
- package/{esm-shadow-view-DGKdF1NI.js → esm-shadow-view-15S4JK6p.js} +2 -2
- package/{esm-shadow-view-DGKdF1NI.js.map → esm-shadow-view-15S4JK6p.js.map} +1 -1
- package/{esm-shadow-view-Dk9NFtLq.js → esm-shadow-view-DHVS9r7H.js} +2 -2
- package/{esm-shadow-view-Dk9NFtLq.js.map → esm-shadow-view-DHVS9r7H.js.map} +1 -1
- package/{esm-shadow-view-DN9HIaM4.js → esm-shadow-view-DYAc62Kl.js} +2 -2
- package/{esm-shadow-view-DN9HIaM4.js.map → esm-shadow-view-DYAc62Kl.js.map} +1 -1
- package/{gaussian-splatting-pipeline-sh-DgJl7l56.js → gaussian-splatting-pipeline-sh-BvkUhA9V.js} +2 -2
- package/{gaussian-splatting-pipeline-sh-DgJl7l56.js.map → gaussian-splatting-pipeline-sh-BvkUhA9V.js.map} +1 -1
- package/{gltf-animation-D7uyTyO3.js → gltf-animation-KnPzeOIY.js} +3 -3
- package/{gltf-animation-D7uyTyO3.js.map → gltf-animation-KnPzeOIY.js.map} +1 -1
- package/gltf-color-normalize-Qxl-9C48.js +29 -0
- package/gltf-color-normalize-Qxl-9C48.js.map +1 -0
- package/{gltf-ext-basisu-CPg5kPrx.js → gltf-ext-basisu-kmth3UWX.js} +7 -4
- package/gltf-ext-basisu-kmth3UWX.js.map +1 -0
- package/{gltf-ext-node-visibility-MafA9ot2.js → gltf-ext-node-visibility-BjRRd6si.js} +2 -2
- package/{gltf-ext-node-visibility-MafA9ot2.js.map → gltf-ext-node-visibility-BjRRd6si.js.map} +1 -1
- package/{gltf-ext-uv-transform-CE_-T1Tr.js → gltf-ext-uv-transform-MHmR-YyM.js} +2 -2
- package/{gltf-ext-uv-transform-CE_-T1Tr.js.map → gltf-ext-uv-transform-MHmR-YyM.js.map} +1 -1
- package/{gltf-feature-animation-pointer-BjpwOOqo.js → gltf-feature-animation-pointer-rFqLfbO_.js} +3 -3
- package/{gltf-feature-animation-pointer-BjpwOOqo.js.map → gltf-feature-animation-pointer-rFqLfbO_.js.map} +1 -1
- package/{gltf-feature-animations-CCizegp8.js → gltf-feature-animations-DikONdzi.js} +2 -2
- package/{gltf-feature-animations-CCizegp8.js.map → gltf-feature-animations-DikONdzi.js.map} +1 -1
- package/{gltf-feature-gpu-instancing-2e_CFQnl.js → gltf-feature-gpu-instancing-Cj1XjmM6.js} +5 -4
- package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +1 -0
- package/{gltf-feature-lights-punctual-DDDg4j0U.js → gltf-feature-lights-punctual-C-0SlGmD.js} +5 -5
- package/{gltf-feature-lights-punctual-DDDg4j0U.js.map → gltf-feature-lights-punctual-C-0SlGmD.js.map} +1 -1
- package/{gltf-feature-morph-CKCw6tkX.js → gltf-feature-morph-BAcY14XU.js} +3 -3
- package/{gltf-feature-morph-CKCw6tkX.js.map → gltf-feature-morph-BAcY14XU.js.map} +1 -1
- package/gltf-feature-registry-97sY_x5O.js +59 -0
- package/gltf-feature-registry-97sY_x5O.js.map +1 -0
- package/{gltf-feature-skeleton-D8hWLqi2.js → gltf-feature-skeleton-lVjkDfIU.js} +3 -3
- package/{gltf-feature-skeleton-D8hWLqi2.js.map → gltf-feature-skeleton-lVjkDfIU.js.map} +1 -1
- package/{gltf-feature-variants-Ds6v9byg.js → gltf-feature-variants-BphF4JmV.js} +2 -2
- package/{gltf-feature-variants-Ds6v9byg.js.map → gltf-feature-variants-BphF4JmV.js.map} +1 -1
- package/{gltf-interleave-DGnUlz28.js → gltf-interleave-C9eBqH_F.js} +2 -2
- package/{gltf-interleave-DGnUlz28.js.map → gltf-interleave-C9eBqH_F.js.map} +1 -1
- package/gltf-normals-b2h74380.js +37 -0
- package/gltf-normals-b2h74380.js.map +1 -0
- package/{gltf-pbr-builder-ext-BFOxOCnQ.js → gltf-pbr-builder-ext-DPC0zg_u.js} +2 -2
- package/{gltf-pbr-builder-ext-BFOxOCnQ.js.map → gltf-pbr-builder-ext-DPC0zg_u.js.map} +1 -1
- package/{gltf-variants-DFbr8EES.js → gltf-variants-CnBEZr0o.js} +4 -4
- package/{gltf-variants-DFbr8EES.js.map → gltf-variants-CnBEZr0o.js.map} +1 -1
- package/{gs-picking-pipeline-DzfMASL9.js → gs-picking-pipeline-Bx8LTav6.js} +2 -2
- package/{gs-picking-pipeline-DzfMASL9.js.map → gs-picking-pipeline-Bx8LTav6.js.map} +1 -1
- package/{index-C8HOR2sB.js → index-B7Qhw0xL.js} +3047 -1037
- package/index-B7Qhw0xL.js.map +1 -0
- package/index.d.ts +504 -17
- package/index.js +322 -304
- package/{input-block-DgAJBzN_.js → input-block-Coi_aZwl.js} +2 -2
- package/{input-block-DgAJBzN_.js.map → input-block-Coi_aZwl.js.map} +1 -1
- package/{iridescence-fragment-Gymp7or5.js → iridescence-fragment-DwZcCTdD.js} +2 -2
- package/{iridescence-fragment-Gymp7or5.js.map → iridescence-fragment-DwZcCTdD.js.map} +1 -1
- package/{light-block-B11ew7FA.js → light-block-Np_h5gPI.js} +2 -2
- package/{light-block-B11ew7FA.js.map → light-block-Np_h5gPI.js.map} +1 -1
- package/{loop-block-Bb23EOMb.js → loop-block-BFkLFYGm.js} +2 -2
- package/{loop-block-Bb23EOMb.js.map → loop-block-BFkLFYGm.js.map} +1 -1
- package/{mesh-features-BLENkYVt.js → mesh-features-BAJpbMog.js} +6 -3
- package/mesh-features-BAJpbMog.js.map +1 -0
- package/{morph-fragment-DOVo70gP.js → morph-fragment-DqH-w61u.js} +2 -2
- package/{morph-fragment-DOVo70gP.js.map → morph-fragment-DqH-w61u.js.map} +1 -1
- package/{multilight-wgsl-BGyiIOp3.js → multilight-wgsl-B9Mf9d-q.js} +4 -4
- package/{multilight-wgsl-BGyiIOp3.js.map → multilight-wgsl-B9Mf9d-q.js.map} +1 -1
- package/no-color-view-DsyLSL-W.js +8 -0
- package/no-color-view-DsyLSL-W.js.map +1 -0
- package/{node-registry-DwgC4yth.js → node-registry-Bd-AlrgC.js} +8 -8
- package/{node-registry-DwgC4yth.js.map → node-registry-Bd-AlrgC.js.map} +1 -1
- package/{node-registry-extra-compat-Dhrw8fDQ.js → node-registry-extra-compat-Ch7ApZHF.js} +2 -2
- package/{node-registry-extra-compat-Dhrw8fDQ.js.map → node-registry-extra-compat-Ch7ApZHF.js.map} +1 -1
- package/{node-registry-extra-math-CsAHvIZo.js → node-registry-extra-math-6ezzTkPj.js} +2 -2
- package/{node-registry-extra-math-CsAHvIZo.js.map → node-registry-extra-math-6ezzTkPj.js.map} +1 -1
- package/{node-renderable-DlLIdBmd.js → node-renderable-CS0CmsSp.js} +28 -11
- package/node-renderable-CS0CmsSp.js.map +1 -0
- package/{node-shadow-DKrcqmNg.js → node-shadow-CpnrdvtJ.js} +2 -2
- package/{node-shadow-DKrcqmNg.js.map → node-shadow-CpnrdvtJ.js.map} +1 -1
- package/{normal-map-fragment-DpsIXrJf.js → normal-map-fragment-DradEMl-.js} +3 -3
- package/{normal-map-fragment-DpsIXrJf.js.map → normal-map-fragment-DradEMl-.js.map} +1 -1
- package/pack-mat4-with-offset-BqB8Jqo7.js +37 -0
- package/pack-mat4-with-offset-BqB8Jqo7.js.map +1 -0
- package/package.json +3 -3
- package/{parse-camera-DM3oJJeT.js → parse-camera-CgV4bWc0.js} +2 -2
- package/{parse-camera-DM3oJJeT.js.map → parse-camera-CgV4bWc0.js.map} +1 -1
- package/pbr-fog-wgsl-BqdCid6r.js +8 -0
- package/pbr-fog-wgsl-BqdCid6r.js.map +1 -0
- package/{pbr-metallic-roughness-block-h_KAOZrW.js → pbr-metallic-roughness-block-BFwZj2Nw.js} +2 -2
- package/{pbr-metallic-roughness-block-h_KAOZrW.js.map → pbr-metallic-roughness-block-BFwZj2Nw.js.map} +1 -1
- package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js → pbr-metallic-roughness-block-full-5t0HT3xl.js} +2 -2
- package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js.map → pbr-metallic-roughness-block-full-5t0HT3xl.js.map} +1 -1
- package/{pbr-mr-helper-core-CIwm-T1G.js → pbr-mr-helper-core-R5tOZ8Ap.js} +2 -2
- package/{pbr-mr-helper-core-CIwm-T1G.js.map → pbr-mr-helper-core-R5tOZ8Ap.js.map} +1 -1
- package/{pbr-refraction-DGmMSa2v.js → pbr-refraction-Dd11HnaI.js} +2 -2
- package/{pbr-refraction-DGmMSa2v.js.map → pbr-refraction-Dd11HnaI.js.map} +1 -1
- package/{pbr-renderable-BJxUtPBb.js → pbr-renderable-BHAdF5Vw.js} +80 -38
- package/pbr-renderable-BHAdF5Vw.js.map +1 -0
- package/{pbr-shadow-fragment-LO9SlbJj.js → pbr-shadow-fragment-BxUrFJYZ.js} +6 -1
- package/pbr-shadow-fragment-BxUrFJYZ.js.map +1 -0
- package/{pbr-template-ext-8q7BcTDf.js → pbr-template-ext-CGgB2n2y.js} +3 -2
- package/{pbr-template-ext-8q7BcTDf.js.map → pbr-template-ext-CGgB2n2y.js.map} +1 -1
- package/{pbr-tracking-B3alzn91.js → pbr-tracking-D6i3yPb7.js} +2 -2
- package/{pbr-tracking-B3alzn91.js.map → pbr-tracking-D6i3yPb7.js.map} +1 -1
- package/pbr-transmission-ext-Dll8EYwE.js +190 -0
- package/pbr-transmission-ext-Dll8EYwE.js.map +1 -0
- package/{reflectance-fragment-BCrgPmrt.js → reflectance-fragment-ejMJ4O1o.js} +2 -2
- package/{reflectance-fragment-BCrgPmrt.js.map → reflectance-fragment-ejMJ4O1o.js.map} +1 -1
- package/{shader-renderable-D-6796KR.js → shader-renderable-BMf_vvO0.js} +41 -12
- package/shader-renderable-BMf_vvO0.js.map +1 -0
- package/shader-thin-instance-5_WUfi3m.js +150 -0
- package/shader-thin-instance-5_WUfi3m.js.map +1 -0
- package/shadow-fragment-core-DHN2G6FI.js.map +1 -1
- package/{sheen-fragment-Dze2f7XJ.js → sheen-fragment-CS6z29Fs.js} +2 -2
- package/{sheen-fragment-Dze2f7XJ.js.map → sheen-fragment-CS6z29Fs.js.map} +1 -1
- package/{singlelight-directional-wgsl-CmUDZxwz.js → singlelight-directional-wgsl-4MIgZMeC.js} +2 -2
- package/{singlelight-directional-wgsl-CmUDZxwz.js.map → singlelight-directional-wgsl-4MIgZMeC.js.map} +1 -1
- package/{singlelight-hemispheric-wgsl-t-83IP_s.js → singlelight-hemispheric-wgsl-CK-GUYWe.js} +2 -2
- package/{singlelight-hemispheric-wgsl-t-83IP_s.js.map → singlelight-hemispheric-wgsl-CK-GUYWe.js.map} +1 -1
- package/{singlelight-point-wgsl-CLzULIYV.js → singlelight-point-wgsl-CYtzqCbP.js} +2 -2
- package/{singlelight-point-wgsl-CLzULIYV.js.map → singlelight-point-wgsl-CYtzqCbP.js.map} +1 -1
- package/{singlelight-spot-wgsl-DEEUrfVM.js → singlelight-spot-wgsl-DVbaVufF.js} +2 -2
- package/{singlelight-spot-wgsl-DEEUrfVM.js.map → singlelight-spot-wgsl-DVbaVufF.js.map} +1 -1
- package/{skeleton-fragment-B_XlFbtx.js → skeleton-fragment-BOVmc8YS.js} +2 -2
- package/{skeleton-fragment-B_XlFbtx.js.map → skeleton-fragment-BOVmc8YS.js.map} +1 -1
- package/{skybox-renderable-DDwzu-PT.js → skybox-renderable-DDcCPSly.js} +3 -3
- package/{skybox-renderable-DDwzu-PT.js.map → skybox-renderable-DDcCPSly.js.map} +1 -1
- package/{standard-renderable-GjxL9xSf.js → standard-renderable-D1bhoF0K.js} +27 -81
- package/standard-renderable-D1bhoF0K.js.map +1 -0
- package/{std-ambient-fragment-BoUsD06w.js → std-ambient-fragment-C6WNm8dQ.js} +2 -2
- package/{std-ambient-fragment-BoUsD06w.js.map → std-ambient-fragment-C6WNm8dQ.js.map} +1 -1
- package/{std-cube-reflection-fragment-ulqc3bsP.js → std-cube-reflection-fragment-Bqutpy2q.js} +2 -2
- package/{std-cube-reflection-fragment-ulqc3bsP.js.map → std-cube-reflection-fragment-Bqutpy2q.js.map} +1 -1
- package/{std-emissive-fragment-DNGj1HdQ.js → std-emissive-fragment-B-A83rqX.js} +2 -2
- package/{std-emissive-fragment-DNGj1HdQ.js.map → std-emissive-fragment-B-A83rqX.js.map} +1 -1
- package/{std-lightmap-fragment-Bqj89aIe.js → std-lightmap-fragment-Df7KJezh.js} +2 -2
- package/{std-lightmap-fragment-Bqj89aIe.js.map → std-lightmap-fragment-Df7KJezh.js.map} +1 -1
- package/{std-opacity-fragment-KuPh5N2Z.js → std-opacity-fragment-D9et2jip.js} +2 -2
- package/{std-opacity-fragment-KuPh5N2Z.js.map → std-opacity-fragment-D9et2jip.js.map} +1 -1
- package/{std-reflection-fragment-BA5Ghn_M.js → std-reflection-fragment-DBJeT-yg.js} +2 -2
- package/{std-reflection-fragment-BA5Ghn_M.js.map → std-reflection-fragment-DBJeT-yg.js.map} +1 -1
- package/std-shadow-fragment-C6fD8rW-.js +13 -0
- package/std-shadow-fragment-C6fD8rW-.js.map +1 -0
- package/{std-specular-fragment-CE-6scqd.js → std-specular-fragment-C2ZOss-t.js} +2 -2
- package/{std-specular-fragment-CE-6scqd.js.map → std-specular-fragment-C2ZOss-t.js.map} +1 -1
- package/{std-tracking-CNKZ-hJN.js → std-tracking-C4L4nQGc.js} +2 -2
- package/{std-tracking-CNKZ-hJN.js.map → std-tracking-C4L4nQGc.js.map} +1 -1
- package/{subsurface-fragment-liM3y2-P.js → subsurface-fragment-C1H4ytqK.js} +2 -2
- package/{subsurface-fragment-liM3y2-P.js.map → subsurface-fragment-C1H4ytqK.js.map} +1 -1
- package/thin-instance-cull-binding-CCxrPNO6.js +310 -0
- package/thin-instance-cull-binding-CCxrPNO6.js.map +1 -0
- package/{thin-instance-gpu-C9Gv_Z1w.js → thin-instance-gpu-E8DBd8XL.js} +20 -3
- package/thin-instance-gpu-E8DBd8XL.js.map +1 -0
- package/{tracking-primitives-wgdBY85t.js → tracking-primitives-w4BVV9p9.js} +2 -2
- package/{tracking-primitives-wgdBY85t.js.map → tracking-primitives-w4BVV9p9.js.map} +1 -1
- package/{unlit-fragment-BIlhJpz6.js → unlit-fragment-DU9_mhzZ.js} +2 -2
- package/{unlit-fragment-BIlhJpz6.js.map → unlit-fragment-DU9_mhzZ.js.map} +1 -1
- package/{wgsl-helpers-DyzNzCeE.js → wgsl-helpers-D8sl1VVA.js} +4 -4
- package/{wgsl-helpers-DyzNzCeE.js.map → wgsl-helpers-D8sl1VVA.js.map} +1 -1
- package/background-dds-skybox-yHTqabU3.js.map +0 -1
- package/background-ground-DIw6D3qf.js.map +0 -1
- package/background-hdr-skybox-c4uuTmkP.js.map +0 -1
- package/gltf-ext-basisu-CPg5kPrx.js.map +0 -1
- package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +0 -1
- package/index-C8HOR2sB.js.map +0 -1
- package/mesh-features-BLENkYVt.js.map +0 -1
- package/node-renderable-DlLIdBmd.js.map +0 -1
- package/pbr-renderable-BJxUtPBb.js.map +0 -1
- package/pbr-shadow-fragment-LO9SlbJj.js.map +0 -1
- package/pbr-transmission-ext-BxW4CEGu.js +0 -581
- package/pbr-transmission-ext-BxW4CEGu.js.map +0 -1
- package/shader-renderable-D-6796KR.js.map +0 -1
- package/standard-renderable-GjxL9xSf.js.map +0 -1
- package/std-shadow-fragment-FNQfrJuC.js +0 -8
- package/std-shadow-fragment-FNQfrJuC.js.map +0 -1
- package/thin-instance-gpu-C9Gv_Z1w.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skybox-renderable-DDwzu-PT.js","sources":["../shaders/skybox-cubemap.vertex.wgsl?raw","../shaders/skybox-cubemap.fragment.wgsl?raw","../src/material/standard/skybox-cubemap.ts","../src/loader-skybox/skybox-renderable.ts"],"sourcesContent":["export default \"// Skybox CubeMap Vertex Shader\\n// Passes object-space position (for cube texture lookup) and world-space position.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n};\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct VertexOutput {\\n @builtin(position) clipPos: vec4<f32>,\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vPositionLocal: vec3<f32>,\\n @location(2) vFogDistance: vec3<f32>,\\n};\\n\\n@vertex\\nfn main(\\n @location(0) position: vec3<f32>,\\n @location(1) normal: vec3<f32>,\\n) -> VertexOutput {\\n var out: VertexOutput;\\n let worldPos = mesh.world * vec4<f32>(position, 1.0);\\n out.vPositionW = worldPos.xyz;\\n out.vPositionLocal = position;\\n out.clipPos = scene.viewProjection * worldPos;\\n out.vFogDistance = (scene.view * worldPos).xyz;\\n return out;\\n}\\n\"","export default \"// Skybox CubeMap Fragment Shader\\n// Samples cube texture using object-space position as lookup direction.\\n// Matches Babylon StandardMaterial with REFLECTION + REFLECTIONMAP_SKYBOX.\\n\\n@group(1) @binding(1) var cubeTexture: texture_cube<f32>;\\n@group(1) @binding(2) var cubeSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vPositionLocal: vec3<f32>,\\n @location(2) vFogDistance: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n // SKYBOX_MODE: use object-space position as cube lookup direction\\n let lookupDir = normalize(input.vPositionLocal);\\n var color = textureSample(cubeTexture, cubeSampler, lookupDir);\\n\\n // Apply fog\\n if (scene.vFogInfos.x > 0.0) {\\n let fog = calcFogFactor(input.vFogDistance);\\n color = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\\n }\\n\\n return color;\\n}\\n\"","/**\n * Skybox CubeMap Material — renders a cube map on the inside of a box.\n * Material owns shaders (pillar 4c). Self-contained pipeline and bind groups.\n *\n * Used for StandardMaterial + CubeTexture(SKYBOX_MODE) in Babylon.\n * Renders backfaces (no culling → sees inside of box).\n */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport skyVertSrc from \"../../../shaders/skybox-cubemap.vertex.wgsl?raw\";\nimport skyFragSrc from \"../../../shaders/skybox-cubemap.fragment.wgsl?raw\";\nimport { getSceneBindGroupLayout, createDefaultPipelineDescriptor } from \"../../render/scene-helpers.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\n\nexport interface SkyboxCubeMapGPU {\n /** Sig-keyed pipeline lookup (called from `bind()` once the target sig is known). */\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n meshBindGroup: GPUBindGroup;\n meshUBO: GPUBuffer;\n meshBindGroupLayout: GPUBindGroupLayout;\n /** Pre-compiled shader modules — sig-independent. */\n vertModule: GPUShaderModule;\n fragModule: GPUShaderModule;\n /** Per-sig pipeline cache, owned by this skybox instance. */\n pipelines: Map<string, GPURenderPipeline>;\n}\n\n/**\n * Build the per-skybox GPU resources (mesh BGL + bind group + UBO + shader modules\n * + pipeline cache). The pipeline is created lazily by `getPipeline(engine, sig)`\n * once the target sig is known. The scene bind group is supplied per-pass by the\n * active RenderTask.\n */\nexport function buildSkyboxCubeMapGPU(engine: EngineContext, worldMatrix: Float32Array, cubeView: GPUTextureView, cubeSampler: GPUSampler): SkyboxCubeMapGPU {\n const device = engine._device;\n const meshBindGroupLayout = device.createBindGroupLayout({\n label: \"skybox-cm-mesh\",\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n ],\n });\n\n const meshUBO = createUniformBuffer(engine, worldMatrix);\n const meshBindGroup = device.createBindGroup({\n layout: meshBindGroupLayout,\n entries: [\n { binding: 0, resource: { buffer: meshUBO } },\n { binding: 1, resource: cubeView },\n { binding: 2, resource: cubeSampler },\n ],\n });\n\n const vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + skyVertSrc, label: \"skybox-cm-vert\" });\n const fragModule = device.createShaderModule({ code: SCENE_UBO_WGSL + WGSL_FOG + skyFragSrc, label: \"skybox-cm-frag\" });\n\n const gpu: SkyboxCubeMapGPU = {\n getPipeline(_engine, sig) {\n const key = targetSignatureKey(sig);\n const cached = gpu.pipelines.get(key);\n if (cached) {\n return cached;\n }\n const pipeline = _engine._device.createRenderPipeline(\n createDefaultPipelineDescriptor({\n _label: \"skybox-cubemap-pipeline\",\n _engine,\n _bgls: [getSceneBindGroupLayout(_engine), gpu.meshBindGroupLayout],\n _vertModule: gpu.vertModule,\n _fragModule: gpu.fragModule,\n _vertexBuffers: [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n ],\n _format: sig._colorFormat!,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare,\n _msaaSamples: sig._sampleCount,\n _cullMode: \"none\",\n _flipY: sig._flipY,\n })\n );\n gpu.pipelines.set(key, pipeline);\n return pipeline;\n },\n meshBindGroup,\n meshUBO,\n meshBindGroupLayout,\n vertModule,\n fragModule,\n pipelines: new Map(),\n };\n return gpu;\n}\n","/** Skybox renderable for cube-texture skyboxes (standard-material scenes).\n * Wraps the existing skybox-cubemap material into a Renderable. */\n\nimport type { SceneContext } from \"../scene/scene.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\nimport type { SkyboxData } from \"./load-skybox.js\";\nimport type { Renderable } from \"../render/renderable.js\";\nimport { buildSkyboxCubeMapGPU } from \"../material/standard/skybox-cubemap.js\";\n\n/** Build a skybox Renderable from a SkyboxData (loaded via loadSkybox). */\nexport function buildSkyboxRenderable(scene: SceneContext, skybox: SkyboxData): Renderable {\n const engine = scene.engine;\n\n const gpu = buildSkyboxCubeMapGPU(engine, skybox.worldMatrix, skybox.cubeView, skybox.cubeSampler);\n\n const r: Renderable = {\n order: 0, // skybox behind everything\n isTransparent: false,\n bind(eng, sig) {\n const pipeline = gpu.getPipeline(eng as EngineContext, sig);\n return {\n renderable: r,\n pipeline,\n draw(pass) {\n pass.setBindGroup(1, gpu.meshBindGroup);\n pass.setVertexBuffer(0, skybox.posBuffer);\n pass.setVertexBuffer(1, skybox.normBuffer);\n pass.setIndexBuffer(skybox.idxBuffer, \"uint32\");\n pass.drawIndexed(skybox.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n"],"names":[],"mappings":";;AAAA,MAAA,aAAe;ACAf,MAAA,aAAe;ACqCR,SAAS,sBAAsB,QAAuB,aAA2B,UAA0B,aAA2C;AACzJ,QAAM,SAAS,OAAO;AACtB,QAAM,sBAAsB,OAAO,sBAAsB;AAAA,IACrD,OAAO;AAAA,IACP,SAAS;AAAA,MACL,EAAE,SAAS,GAAG,YAAY,eAAe,QAAQ,QAAQ,EAAE,MAAM,YAAU;AAAA,MAC3E,EAAE,SAAS,GAAG,YAAY,eAAe,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,OAAA,EAAO;AAAA,MACzG,EAAE,SAAS,GAAG,YAAY,eAAe,UAAU,SAAS,CAAA,EAAC;AAAA,IAAE;AAAA,EACnE,CACH;AAED,QAAM,UAAU,oBAAoB,QAAQ,WAAW;AACvD,QAAM,gBAAgB,OAAO,gBAAgB;AAAA,IACzC,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,EAAE,SAAS,GAAG,UAAU,EAAE,QAAQ,UAAQ;AAAA,MAC1C,EAAE,SAAS,GAAG,UAAU,SAAA;AAAA,MACxB,EAAE,SAAS,GAAG,UAAU,YAAA;AAAA,IAAY;AAAA,EACxC,CACH;AAED,QAAM,aAAa,OAAO,mBAAmB,EAAE,MAAM,iBAAiB,YAAY,OAAO,kBAAkB;AAC3G,QAAM,aAAa,OAAO,mBAAmB,EAAE,MAAM,iBAAiB,WAAW,YAAY,OAAO,kBAAkB;AAEtH,QAAM,MAAwB;AAAA,IAC1B,YAAY,SAAS,KAAK;AACtB,YAAM,MAAM,mBAAmB,GAAG;AAClC,YAAM,SAAS,IAAI,UAAU,IAAI,GAAG;AACpC,UAAI,QAAQ;AACR,eAAO;AAAA,MACX;AACA,YAAM,WAAW,QAAQ,QAAQ;AAAA,QAC7B,gCAAgC;AAAA,UAC5B,QAAQ;AAAA,UACR;AAAA,UACA,OAAO,CAAC,wBAAwB,OAAO,GAAG,IAAI,mBAAmB;AAAA,UACjE,aAAa,IAAI;AAAA,UACjB,aAAa,IAAI;AAAA,UACjB,gBAAgB;AAAA,YACZ,EAAE,aAAa,IAAI,YAAY,CAAC,EAAE,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,YAAA,CAAgC,EAAA;AAAA,YACxG,EAAE,aAAa,IAAI,YAAY,CAAC,EAAE,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,YAAA,CAAgC,EAAA;AAAA,UAAE;AAAA,UAE9G,SAAS,IAAI;AAAA,UACb,qBAAqB,IAAI;AAAA,UACzB,eAAe,IAAI;AAAA,UACnB,cAAc,IAAI;AAAA,UAClB,WAAW;AAAA,UACX,QAAQ,IAAI;AAAA,QAAA,CACf;AAAA,MAAA;AAEL,UAAI,UAAU,IAAI,KAAK,QAAQ;AAC/B,aAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,+BAAe,IAAA;AAAA,EAAI;AAEvB,SAAO;AACX;ACxFO,SAAS,sBAAsB,OAAqB,QAAgC;AACvF,QAAM,SAAS,MAAM;AAErB,QAAM,MAAM,sBAAsB,QAAQ,OAAO,aAAa,OAAO,UAAU,OAAO,WAAW;AAEjG,QAAM,IAAgB;AAAA,IAClB,OAAO;AAAA;AAAA,IACP,eAAe;AAAA,IACf,KAAK,KAAK,KAAK;AACX,YAAM,WAAW,IAAI,YAAY,KAAsB,GAAG;AAC1D,aAAO;AAAA,QACH,YAAY;AAAA,QACZ;AAAA,QACA,KAAK,MAAM;AACP,eAAK,aAAa,GAAG,IAAI,aAAa;AACtC,eAAK,gBAAgB,GAAG,OAAO,SAAS;AACxC,eAAK,gBAAgB,GAAG,OAAO,UAAU;AACzC,eAAK,eAAe,OAAO,WAAW,QAAQ;AAC9C,eAAK,YAAY,OAAO,QAAQ;AAChC,iBAAO;AAAA,QACX;AAAA,MAAA;AAAA,IAER;AAAA,EAAA;AAEJ,SAAO;AACX;"}
|
|
1
|
+
{"version":3,"file":"skybox-renderable-DDcCPSly.js","sources":["../shaders/skybox-cubemap.vertex.wgsl?raw","../shaders/skybox-cubemap.fragment.wgsl?raw","../src/material/standard/skybox-cubemap.ts","../src/loader-skybox/skybox-renderable.ts"],"sourcesContent":["export default \"// Skybox CubeMap Vertex Shader\\n// Passes object-space position (for cube texture lookup) and world-space position.\\n\\nstruct MeshUniforms {\\n world: mat4x4<f32>,\\n};\\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\\n\\nstruct VertexOutput {\\n @builtin(position) clipPos: vec4<f32>,\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vPositionLocal: vec3<f32>,\\n @location(2) vFogDistance: vec3<f32>,\\n};\\n\\n@vertex\\nfn main(\\n @location(0) position: vec3<f32>,\\n @location(1) normal: vec3<f32>,\\n) -> VertexOutput {\\n var out: VertexOutput;\\n let worldPos = mesh.world * vec4<f32>(position, 1.0);\\n out.vPositionW = worldPos.xyz;\\n out.vPositionLocal = position;\\n out.clipPos = scene.viewProjection * worldPos;\\n out.vFogDistance = (scene.view * worldPos).xyz;\\n return out;\\n}\\n\"","export default \"// Skybox CubeMap Fragment Shader\\n// Samples cube texture using object-space position as lookup direction.\\n// Matches Babylon StandardMaterial with REFLECTION + REFLECTIONMAP_SKYBOX.\\n\\n@group(1) @binding(1) var cubeTexture: texture_cube<f32>;\\n@group(1) @binding(2) var cubeSampler: sampler;\\n\\nstruct FragmentInput {\\n @location(0) vPositionW: vec3<f32>,\\n @location(1) vPositionLocal: vec3<f32>,\\n @location(2) vFogDistance: vec3<f32>,\\n};\\n\\n@fragment\\nfn main(input: FragmentInput) -> @location(0) vec4<f32> {\\n // SKYBOX_MODE: use object-space position as cube lookup direction\\n let lookupDir = normalize(input.vPositionLocal);\\n var color = textureSample(cubeTexture, cubeSampler, lookupDir);\\n\\n // Apply fog\\n if (scene.vFogInfos.x > 0.0) {\\n let fog = calcFogFactor(input.vFogDistance);\\n color = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\\n }\\n\\n return color;\\n}\\n\"","/**\n * Skybox CubeMap Material — renders a cube map on the inside of a box.\n * Material owns shaders (pillar 4c). Self-contained pipeline and bind groups.\n *\n * Used for StandardMaterial + CubeTexture(SKYBOX_MODE) in Babylon.\n * Renders backfaces (no culling → sees inside of box).\n */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport skyVertSrc from \"../../../shaders/skybox-cubemap.vertex.wgsl?raw\";\nimport skyFragSrc from \"../../../shaders/skybox-cubemap.fragment.wgsl?raw\";\nimport { getSceneBindGroupLayout, createDefaultPipelineDescriptor } from \"../../render/scene-helpers.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { SCENE_UBO_WGSL } from \"../../shader/scene-uniforms.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { targetSignatureKey } from \"../../engine/render-target.js\";\n\nexport interface SkyboxCubeMapGPU {\n /** Sig-keyed pipeline lookup (called from `bind()` once the target sig is known). */\n getPipeline(engine: EngineContext, sig: RenderTargetSignature): GPURenderPipeline;\n meshBindGroup: GPUBindGroup;\n meshUBO: GPUBuffer;\n meshBindGroupLayout: GPUBindGroupLayout;\n /** Pre-compiled shader modules — sig-independent. */\n vertModule: GPUShaderModule;\n fragModule: GPUShaderModule;\n /** Per-sig pipeline cache, owned by this skybox instance. */\n pipelines: Map<string, GPURenderPipeline>;\n}\n\n/**\n * Build the per-skybox GPU resources (mesh BGL + bind group + UBO + shader modules\n * + pipeline cache). The pipeline is created lazily by `getPipeline(engine, sig)`\n * once the target sig is known. The scene bind group is supplied per-pass by the\n * active RenderTask.\n */\nexport function buildSkyboxCubeMapGPU(engine: EngineContext, worldMatrix: Float32Array, cubeView: GPUTextureView, cubeSampler: GPUSampler): SkyboxCubeMapGPU {\n const device = engine._device;\n const meshBindGroupLayout = device.createBindGroupLayout({\n label: \"skybox-cm-mesh\",\n entries: [\n { binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: \"uniform\" } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"cube\" } },\n { binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n ],\n });\n\n const meshUBO = createUniformBuffer(engine, worldMatrix);\n const meshBindGroup = device.createBindGroup({\n layout: meshBindGroupLayout,\n entries: [\n { binding: 0, resource: { buffer: meshUBO } },\n { binding: 1, resource: cubeView },\n { binding: 2, resource: cubeSampler },\n ],\n });\n\n const vertModule = device.createShaderModule({ code: SCENE_UBO_WGSL + skyVertSrc, label: \"skybox-cm-vert\" });\n const fragModule = device.createShaderModule({ code: SCENE_UBO_WGSL + WGSL_FOG + skyFragSrc, label: \"skybox-cm-frag\" });\n\n const gpu: SkyboxCubeMapGPU = {\n getPipeline(_engine, sig) {\n const key = targetSignatureKey(sig);\n const cached = gpu.pipelines.get(key);\n if (cached) {\n return cached;\n }\n const pipeline = _engine._device.createRenderPipeline(\n createDefaultPipelineDescriptor({\n _label: \"skybox-cubemap-pipeline\",\n _engine,\n _bgls: [getSceneBindGroupLayout(_engine), gpu.meshBindGroupLayout],\n _vertModule: gpu.vertModule,\n _fragModule: gpu.fragModule,\n _vertexBuffers: [\n { arrayStride: 12, attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n { arrayStride: 12, attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x3\" as GPUVertexFormat }] },\n ],\n _format: sig._colorFormat!,\n _depthStencilFormat: sig._depthStencilFormat,\n _depthCompare: sig._depthCompare,\n _msaaSamples: sig._sampleCount,\n _cullMode: \"none\",\n _flipY: sig._flipY,\n })\n );\n gpu.pipelines.set(key, pipeline);\n return pipeline;\n },\n meshBindGroup,\n meshUBO,\n meshBindGroupLayout,\n vertModule,\n fragModule,\n pipelines: new Map(),\n };\n return gpu;\n}\n","/** Skybox renderable for cube-texture skyboxes (standard-material scenes).\n * Wraps the existing skybox-cubemap material into a Renderable. */\n\nimport type { SceneContext } from \"../scene/scene.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\nimport type { SkyboxData } from \"./load-skybox.js\";\nimport type { Renderable } from \"../render/renderable.js\";\nimport { buildSkyboxCubeMapGPU } from \"../material/standard/skybox-cubemap.js\";\n\n/** Build a skybox Renderable from a SkyboxData (loaded via loadSkybox). */\nexport function buildSkyboxRenderable(scene: SceneContext, skybox: SkyboxData): Renderable {\n const engine = scene.engine;\n\n const gpu = buildSkyboxCubeMapGPU(engine, skybox.worldMatrix, skybox.cubeView, skybox.cubeSampler);\n\n const r: Renderable = {\n order: 0, // skybox behind everything\n isTransparent: false,\n bind(eng, sig) {\n const pipeline = gpu.getPipeline(eng as EngineContext, sig);\n return {\n renderable: r,\n pipeline,\n draw(pass) {\n pass.setBindGroup(1, gpu.meshBindGroup);\n pass.setVertexBuffer(0, skybox.posBuffer);\n pass.setVertexBuffer(1, skybox.normBuffer);\n pass.setIndexBuffer(skybox.idxBuffer, \"uint32\");\n pass.drawIndexed(skybox.idxCount);\n return 1;\n },\n };\n },\n };\n return r;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { e as composeShader, f as MSH_RECEIVE_SHADOWS, _ as _computeMeshFeatures,
|
|
1
|
+
import { bE as _getStdExts, bn as appendMeshLightUboFields, M as MAX_LIGHTS, bo as meshLightIndexWGSL, bF as clearSceneBGLCache, a_ as createUniformBuffer, bG as _getStdExtsSorted, bH as _standardFeatureKey, bI as HAS_DIFFUSE_TEXTURE, bJ as NEEDS_UV, E as ESM_SHADOW_OUTPUT, t as targetSignatureKey, j as getSceneBindGroupLayout, bj as REVERSE_DEPTH_COMPARE, bK as DOUBLE_SIDED, bL as NO_COLOR_OUTPUT, a7 as HAS_OPACITY_TEXTURE, B as MATERIAL_ALPHA_BLEND, bM as DISABLE_LIGHTING, bN as DIFFUSE_USES_UV2, bO as NEEDS_UV2, bB as clearSamplerCache, bP as _computeStandardMaterialFeatures, p as packMat4IntoF32, a as writeMeshLightSelection, b4 as acquireTexture, b5 as releaseTexture, bQ as _standardShaderVariantKey } from "./index-B7Qhw0xL.js";
|
|
2
|
+
import { a as WGSL_FOG } from "./wgsl-helpers-D8sl1VVA.js";
|
|
3
|
+
import { e as composeShader, f as MSH_RECEIVE_SHADOWS, _ as _computeMeshFeatures, i as MSH_HAS_INSTANCE_COLOR, g as MSH_HAS_THIN_INSTANCES } from "./mesh-features-BAJpbMog.js";
|
|
4
4
|
function collectStdBoundTextures(mat) {
|
|
5
5
|
var _a;
|
|
6
6
|
const t = [];
|
|
@@ -12,70 +12,6 @@ function collectStdBoundTextures(mat) {
|
|
|
12
12
|
}
|
|
13
13
|
return t;
|
|
14
14
|
}
|
|
15
|
-
function _computeStandardMaterialFeatures(m) {
|
|
16
|
-
let f = 0;
|
|
17
|
-
if (m.diffuseTexture) {
|
|
18
|
-
f |= HAS_DIFFUSE_TEXTURE;
|
|
19
|
-
if (m.diffuseCoordIndex === 1) {
|
|
20
|
-
f |= DIFFUSE_USES_UV2;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
if (m.emissiveTexture) {
|
|
24
|
-
f |= HAS_EMISSIVE_TEXTURE;
|
|
25
|
-
if (m.emissiveTexture._sampleType === "depth") {
|
|
26
|
-
f |= HAS_DEPTH_EMISSIVE_TEXTURE;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
if (m.bumpTexture) {
|
|
30
|
-
f |= HAS_BUMP_TEXTURE;
|
|
31
|
-
}
|
|
32
|
-
if (m.specularTexture) {
|
|
33
|
-
f |= HAS_SPECULAR_TEXTURE;
|
|
34
|
-
if (m.specularCoordIndex === 1) {
|
|
35
|
-
f |= SPECULAR_USES_UV2;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
if (m.ambientTexture) {
|
|
39
|
-
f |= HAS_AMBIENT_TEXTURE;
|
|
40
|
-
if (m.ambientCoordIndex === 1) {
|
|
41
|
-
f |= AMBIENT_USES_UV2;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (m.lightmapTexture) {
|
|
45
|
-
f |= HAS_LIGHTMAP_TEXTURE;
|
|
46
|
-
if (m.lightmapCoordIndex === 1) {
|
|
47
|
-
f |= LIGHTMAP_USES_UV2;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (m.opacityTexture) {
|
|
51
|
-
f |= HAS_OPACITY_TEXTURE;
|
|
52
|
-
if (m.opacityFromRGB) {
|
|
53
|
-
f |= OPACITY_FROM_RGB;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
if (!m.backFaceCulling) {
|
|
57
|
-
f |= DOUBLE_SIDED;
|
|
58
|
-
}
|
|
59
|
-
if (m.reflectionTexture) {
|
|
60
|
-
f |= HAS_REFLECTION_TEXTURE;
|
|
61
|
-
}
|
|
62
|
-
if (m.reflectionCubeTexture) {
|
|
63
|
-
f |= HAS_CUBE_REFLECTION;
|
|
64
|
-
}
|
|
65
|
-
if (m.disableLighting) {
|
|
66
|
-
f |= DISABLE_LIGHTING;
|
|
67
|
-
}
|
|
68
|
-
if (m.alpha < 1) {
|
|
69
|
-
f |= MATERIAL_ALPHA_BLEND;
|
|
70
|
-
}
|
|
71
|
-
return f;
|
|
72
|
-
}
|
|
73
|
-
function _standardFeatureKey(features, meshFeatures, variant = "") {
|
|
74
|
-
return variant ? `${features}:${meshFeatures}:${variant}` : `${features}:${meshFeatures}`;
|
|
75
|
-
}
|
|
76
|
-
function _standardShaderVariantKey(shadowLights) {
|
|
77
|
-
return shadowLights.length === 0 ? "" : shadowLights.map((sl) => `${sl.lightIndex}${sl.shadowType === "pcf" ? "p" : "e"}`).join(",");
|
|
78
|
-
}
|
|
79
15
|
const STAGE_VERTEX = 1;
|
|
80
16
|
const STAGE_FRAGMENT = 2;
|
|
81
17
|
const LIGHTING_FN = `
|
|
@@ -459,7 +395,7 @@ const _stdMatScratch = new Float32Array(24);
|
|
|
459
395
|
function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
460
396
|
const engine = scene.engine;
|
|
461
397
|
const device = engine._device;
|
|
462
|
-
const { tiSync, tiFragment, shadowFragment } = factories;
|
|
398
|
+
const { tiSync, tiFragment, shadowFragment, cull } = factories;
|
|
463
399
|
const shadowLights = [];
|
|
464
400
|
for (let i = 0; i < scene.lights.length; i++) {
|
|
465
401
|
const sg = scene.lights[i].shadowGenerator;
|
|
@@ -470,6 +406,7 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
470
406
|
const hasSomeShadows = shadowLights.length > 0;
|
|
471
407
|
const shadowBGCache = /* @__PURE__ */ new Map();
|
|
472
408
|
const rebuildSingle = (s, mesh, materialOverride) => {
|
|
409
|
+
var _a, _b;
|
|
473
410
|
const mat = materialOverride ?? mesh.material;
|
|
474
411
|
const renderFeatures = mat._renderFeatures ?? (mat._renderFeatures = { features: _computeStandardMaterialFeatures(mat) });
|
|
475
412
|
const isOverride = materialOverride != null;
|
|
@@ -511,7 +448,8 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
511
448
|
const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);
|
|
512
449
|
const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];
|
|
513
450
|
const meshUboData = new Float32Array(bindings._composed._meshUboSpec._totalBytes / 4);
|
|
514
|
-
|
|
451
|
+
const _packMeshWorld = ((_a = engine._makePackMeshWorld) == null ? void 0 : _a.call(engine, s)) ?? packMat4IntoF32;
|
|
452
|
+
_packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);
|
|
515
453
|
writeMeshLightSelection(mesh, s.lights, meshUboData);
|
|
516
454
|
const meshUBO = createUniformBuffer(engine, meshUboData);
|
|
517
455
|
const textureLevel = (features & NEEDS_UV) !== 0 ? 1 : 0;
|
|
@@ -554,13 +492,13 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
554
492
|
let _lastWorldVersion = mesh.worldMatrixVersion;
|
|
555
493
|
let _lastLightsCount = s.lights.length;
|
|
556
494
|
const sortCenter = [mesh.worldMatrix[12], mesh.worldMatrix[13], mesh.worldMatrix[14]];
|
|
557
|
-
const
|
|
495
|
+
const _baseUpdate = () => {
|
|
558
496
|
const worldVersion = mesh.worldMatrixVersion;
|
|
559
497
|
if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {
|
|
560
498
|
sortCenter[0] = mesh.worldMatrix[12];
|
|
561
499
|
sortCenter[1] = mesh.worldMatrix[13];
|
|
562
500
|
sortCenter[2] = mesh.worldMatrix[14];
|
|
563
|
-
meshUboData
|
|
501
|
+
_packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);
|
|
564
502
|
writeMeshLightSelection(mesh, s.lights, meshUboData);
|
|
565
503
|
device.queue.writeBuffer(meshUBO, 0, meshUboData);
|
|
566
504
|
_lastWorldVersion = worldVersion;
|
|
@@ -574,16 +512,20 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
574
512
|
device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);
|
|
575
513
|
}
|
|
576
514
|
};
|
|
577
|
-
const
|
|
578
|
-
|
|
515
|
+
const _invalidate = () => {
|
|
516
|
+
_lastWorldVersion = -1;
|
|
517
|
+
};
|
|
518
|
+
const update = ((_b = engine._wrapRenderableForFO) == null ? void 0 : _b.call(engine, _baseUpdate, s, _invalidate)) ?? _baseUpdate;
|
|
519
|
+
const draw = (pass, cullBinding) => {
|
|
520
|
+
var _a2, _b2, _c, _d;
|
|
579
521
|
if (!isOverride && mesh.material !== mat) {
|
|
580
522
|
return 0;
|
|
581
523
|
}
|
|
582
524
|
const g = mesh._gpu;
|
|
583
525
|
let slot = 0;
|
|
584
526
|
const vb = g._vbLayout;
|
|
585
|
-
pass.setVertexBuffer(slot++, g.positionBuffer, (
|
|
586
|
-
pass.setVertexBuffer(slot++, g.normalBuffer, (
|
|
527
|
+
pass.setVertexBuffer(slot++, g.positionBuffer, (_a2 = vb == null ? void 0 : vb._p) == null ? void 0 : _a2._offset);
|
|
528
|
+
pass.setVertexBuffer(slot++, g.normalBuffer, (_b2 = vb == null ? void 0 : vb._n) == null ? void 0 : _b2._offset);
|
|
587
529
|
if (needsUV) {
|
|
588
530
|
pass.setVertexBuffer(slot++, g.uvBuffer, (_c = vb == null ? void 0 : vb._u) == null ? void 0 : _c._offset);
|
|
589
531
|
}
|
|
@@ -592,14 +534,16 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
592
534
|
}
|
|
593
535
|
const ti = hasThinInstances ? mesh.thinInstances : null;
|
|
594
536
|
if (ti && tiSync) {
|
|
595
|
-
slot = tiSync(engine, ti, pass, slot, hasInstanceColor);
|
|
537
|
+
slot = tiSync(engine, ti, pass, slot, hasInstanceColor, cullBinding == null ? void 0 : cullBinding.cullDrawBufs);
|
|
596
538
|
}
|
|
597
539
|
pass.setIndexBuffer(g.indexBuffer, g.indexFormat);
|
|
598
540
|
pass.setBindGroup(1, meshBindGroup);
|
|
599
541
|
if (receiveShadows && shadowBindGroup) {
|
|
600
542
|
pass.setBindGroup(2, shadowBindGroup);
|
|
601
543
|
}
|
|
602
|
-
if (
|
|
544
|
+
if (cullBinding) {
|
|
545
|
+
cullBinding.draw(pass, g.indexCount, ti.count);
|
|
546
|
+
} else if (ti && ti.count > 0) {
|
|
603
547
|
pass.drawIndexed(g.indexCount, ti.count);
|
|
604
548
|
} else {
|
|
605
549
|
pass.drawIndexed(g.indexCount);
|
|
@@ -611,11 +555,13 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
611
555
|
isTransparent,
|
|
612
556
|
mesh,
|
|
613
557
|
bind(eng, sig) {
|
|
558
|
+
const pipeline = getOrCreateStandardPipeline(eng, sig, bindings);
|
|
559
|
+
const cb = cull == null ? void 0 : cull.tryBind(r, s, mesh, engine, hasInstanceColor, isTransparent, update);
|
|
614
560
|
return {
|
|
615
561
|
renderable: r,
|
|
616
|
-
pipeline
|
|
617
|
-
update,
|
|
618
|
-
draw
|
|
562
|
+
pipeline,
|
|
563
|
+
update: cb ? cb.update : update,
|
|
564
|
+
draw: (pass) => draw(pass, cb)
|
|
619
565
|
};
|
|
620
566
|
}
|
|
621
567
|
};
|
|
@@ -633,4 +579,4 @@ function buildStandardMeshRenderables(scene, meshes, factories) {
|
|
|
633
579
|
export {
|
|
634
580
|
buildStandardMeshRenderables
|
|
635
581
|
};
|
|
636
|
-
//# sourceMappingURL=standard-renderable-
|
|
582
|
+
//# sourceMappingURL=standard-renderable-D1bhoF0K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-renderable-D1bhoF0K.js","sources":["../src/material/standard/collect-std-bound-textures.ts","../src/material/standard/standard-template.ts","../src/material/standard/standard-pipeline.ts","../src/material/standard/standard-renderable.ts"],"sourcesContent":["import type { Texture2D } from \"../../texture/texture-2d.js\";\nimport { _getStdExts } from \"./standard-flags.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\n\n/** Collect all non-null textures referenced by a Standard material (for acquire/release). */\nexport function collectStdBoundTextures(mat: StandardMaterialProps): Texture2D[] {\n const t: Texture2D[] = [];\n if (mat.diffuseTexture) {\n t.push(mat.diffuseTexture);\n }\n for (const ext of _getStdExts().values()) {\n ext._textures?.(mat, t);\n }\n return t;\n}\n","/**\n * Standard Base Template\n *\n * Provides the base Standard (Blinn-Phong) shader structure with slot markers.\n * Parameterized by feature configuration (textures, UV, shadow, reflection, fog).\n *\n * The Standard material uses 3 separate UBOs in group 1:\n * binding 0: mesh UBO (world matrix)\n * binding 1: material UBO (colors, levels)\n * Plus optional texture/sampler bindings at fixed slots.\n */\n\nimport type { ShaderTemplate, UboField, VertexAttribute, Varying, BindingDecl } from \"../../shader/fragment-types.js\";\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { appendMeshLightUboFields, meshLightIndexWGSL } from \"../../render/lights-ubo.js\";\n\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\n// ── Lighting function (always present unless disableLighting) ───\n\nconst LIGHTING_FN = `\nfn computeLighting(viewDir: vec3<f32>, N: vec3<f32>, L: LightEntry, g: f32, P: vec3<f32>) -> array<vec3<f32>, 2> {\nvar lv: vec3<f32>;\nvar a: f32 = 1.0;\nlet t = u32(L.vLightData.w);\nif (t == 3u) {\nlet nl = 0.5 + 0.5 * dot(N, normalize(L.vLightData.xyz));\nlet diff = mix(L.vLightDirection.xyz, L.vLightDiffuse.rgb, nl);\nlet h = normalize(viewDir + normalize(L.vLightData.xyz));\nvar s = pow(max(0.0, dot(N, h)), max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb);\n}\nif (t == 1u) {\nlv = normalize(-L.vLightData.xyz);\n} else {\nlet d = L.vLightData.xyz - P;\na = max(0.0, 1.0 - length(d) / L.vLightDiffuse.a);\nlv = normalize(d);\nif (t == 2u) {\nlet c = max(0.0, dot(L.vLightDirection.xyz, -lv));\nif (c >= L.vLightDirection.w) { a *= max(0.0, pow(c, L.vLightSpecular.a)); } else { a = 0.0; }\n}\n}\nlet nl = max(0.0, dot(N, lv));\nlet diff = nl * L.vLightDiffuse.rgb * a;\nlet h = normalize(viewDir + lv);\nvar s = max(0.0, dot(N, h));\ns = pow(s, max(1.0, g));\nreturn array<vec3<f32>, 2>(diff, s * L.vLightSpecular.rgb * a);\n}\n`;\n\nexport interface StandardTemplateConfig {\n /** @internal */\n readonly _diffuse?: boolean;\n /** @internal UV coordinate channels used */\n readonly _needsUV: boolean;\n /** @internal */\n readonly _needsUV2: boolean;\n /** @internal */\n readonly _diffuseUsesUV2?: boolean;\n /** @internal Disable lighting (unlit material) */\n readonly _disableLighting?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes no color. */\n readonly _noColorOutput?: boolean;\n /** @internal Generate a fragment stage that runs discard/alpha-test logic and writes ESM shadow color. */\n readonly _esmShadowOutput?: boolean;\n}\n\n/**\n * Create a Standard material ShaderTemplate from configuration.\n * The template contains slot markers that the composer fills.\n */\nexport function createStandardTemplate(config: StandardTemplateConfig, esmShadowDepthCode = \"\"): ShaderTemplate {\n const { _diffuse, _needsUV, _needsUV2, _diffuseUsesUV2, _disableLighting, _noColorOutput, _esmShadowOutput } = config;\n\n // ── Base vertex attributes ──────────────────────────────────\n const _baseVertexAttributes: VertexAttribute[] = [\n { _name: \"position\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n { _name: \"normal\", _type: \"vec3<f32>\", _gpuFormat: \"float32x3\", _arrayStride: 12 },\n ];\n if (_needsUV) {\n _baseVertexAttributes.push({ _name: \"uv\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n if (_needsUV2) {\n _baseVertexAttributes.push({ _name: \"uv2\", _type: \"vec2<f32>\", _gpuFormat: \"float32x2\", _arrayStride: 8 });\n }\n\n // ── Base varyings ───────────────────────────────────────────\n const _baseVaryings: Varying[] = [\n { _name: \"vp\", _type: \"vec3<f32>\" },\n { _name: \"vn\", _type: \"vec3<f32>\" },\n { _name: \"vf\", _type: \"vec3<f32>\" },\n ];\n if (_needsUV) {\n _baseVaryings.push({ _name: \"vu\", _type: \"vec2<f32>\" });\n }\n if (_needsUV2) {\n _baseVaryings.push({ _name: \"vv\", _type: \"vec2<f32>\" });\n }\n // shadow varyings (vPositionFromLight, vDepthMetric) are provided by std-shadow-fragment\n\n // ── Base UBO fields (mesh = world matrix + affected light indices) ──────────────\n const _baseMeshUboFields: UboField[] = [{ _name: \"world\", _type: \"mat4x4<f32>\" }];\n appendMeshLightUboFields(_baseMeshUboFields);\n\n // ── Base bindings (group 1, starting after mesh UBO at 0) ───\n // Order: material, diffuse*, shadow/UV*, emissive*, bump*, specular*, ambient*, lightmap*, opacity*, reflection*\n // The shadow/UV UBO is placed AFTER diffuse so its auto-assigned binding index\n // matches the conventional slot 5 when diffuse is present (bindings 3,4).\n const _baseBindings: BindingDecl[] = [{ _name: \"mat\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT }];\n\n if (_diffuse) {\n _baseBindings.push(\n { _name: \"dT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"dS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n // UV params UBO — only when UVs are actually emitted.\n if (_needsUV) {\n _baseBindings.push({ _name: \"up\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_VERTEX });\n }\n if (_esmShadowOutput) {\n _baseBindings.push({ _name: \"shadowParams\", _type: { _kind: \"uniform-buffer\" }, _visibility: STAGE_FRAGMENT });\n }\n // bump bindings are provided by the normal-map fragment (not baseBindings)\n // emissive, specular, ambient, lightmap, opacity, reflection bindings\n // are provided by their respective fragments (not baseBindings)\n\n // Shadow map bindings (group 2) are provided by std-shadow-fragment\n\n // ── Vertex template ─────────────────────────────────────────\n\n const uvPassthrough = _needsUV ? `out.vu = uv * up.u.xy + up.u.zw;` : \"\";\n\n const uv2Passthrough = _needsUV2 ? `out.vv = uv2;` : \"\";\n\n // Vertex UBO struct definitions (must be before binding declarations)\n const vertexUboStructs = _needsUV ? `struct upUniforms { u: vec4<f32>, }` : \"\";\n\n const _vertexTemplate = `/*SU*/\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${vertexUboStructs}\n/*VH*/\n/*VD*/\n/*VO*/\n@vertex fn main(\n/*VP*/\n) -> VertexOutput {\nvar out: VertexOutput;\n/*VR*/\nvar finalWorld = mesh.world;\n/*VW*/\nlet worldPos4 = finalWorld * vec4<f32>(position, 1.0);\nout.vp = worldPos4.xyz;\nlet normalWorld = mat3x3<f32>(finalWorld[0].xyz, finalWorld[1].xyz, finalWorld[2].xyz);\nout.vn = normalize(normalWorld * normal);\nout.clipPos = scene.viewProjection * worldPos4;\nout.vf = (scene.view * worldPos4).xyz;\n${uvPassthrough}\n${uv2Passthrough}\n/*VB*/\nreturn out;\n}`;\n\n // ── Fragment template ────────────────────────────────────────\n\n const lightsStructs = `\nstruct LightEntry { vLightData: vec4<f32>, vLightDiffuse: vec4<f32>, vLightSpecular: vec4<f32>, vLightDirection: vec4<f32> };\nstruct lightsUniforms { count: u32, _p0: u32, _p1: u32, _p2: u32, lights: array<LightEntry, ${MAX_LIGHTS}> };\n@group(0) @binding(1) var<uniform> lights: lightsUniforms;\n`;\n\n const materialStruct = `\nstruct matUniforms {\ndc: vec4<f32>,\nsc: vec4<f32>,\nec: vec3<f32>,\nbs: f32,\nac: vec3<f32>,\ntl: f32,\nambTexLvl: f32,\nlmLvl: f32,\nopLvl: f32,\naCut: f32,\nrLvl: f32,\nrCm: f32,\n_0: f32,\n_1: f32,\n};\n`;\n\n const helpers = _disableLighting ? WGSL_FOG : WGSL_FOG + LIGHTING_FN;\n // reflection, shadow, bump helpers are provided by their respective fragments\n\n // Main fragment body — mirrors old composeFragmentShader exactly\n const doubleSidedEntry = `@fragment fn main(input: FragmentInput)${_noColorOutput ? \"\" : \" -> @location(0) vec4<f32>\"} {`;\n\n // View direction\n const viewDirCode = !_disableLighting ? `let viewDirectionW = normalize(scene.vEyePosition.xyz - input.vp);` : \"\";\n\n // Normal computation — fragment can override via AC slot\n const normalCode = _disableLighting ? \"\" : `var normalW = normalize(input.vn);`;\n\n // Opacity — default from material alpha, fragment can modify via AT\n const opacityCode = `var alpha = mat.dc.a;`;\n\n // Base color + alpha test. Texture alpha used for discard only (not blended into output alpha),\n // matching BJS ALPHATEST without ALPHAFROMDIFFUSE.\n const baseColorCode = _diffuse\n ? `let _ds = textureSample(dT, dS, ${_diffuseUsesUV2 ? \"input.vv\" : \"input.vu\"});\nif (_ds.a < mat.aCut) { discard; }\nvar baseColor = _ds.rgb * mat.tl;`\n : `var baseColor = vec3<f32>(1.0, 1.0, 1.0);`;\n\n // Diffuse color + emissive + specular — defaults, fragments can override via AT\n const diffuseColorCode = `let diffuseColor = mat.dc.rgb;`;\n const emissiveCode = `var emissiveContrib = mat.ec;`;\n const specularColorCode = !_disableLighting ? `var specularColor = mat.sc.rgb;` : \"\";\n // Lighting block (only when lighting enabled)\n let lightingBlock: string;\n if (!_disableLighting) {\n // Shadow — default to 1.0, fragment overrides via AD slot\n // shadowFactors array is populated by std-shadow-fragment (one per light index)\n lightingBlock = `var glossiness = mat.sc.a;\nvar diffuseBase = vec3<f32>(0.0);\nvar specularBase = vec3<f32>(0.0);\nvar shadowFactors = array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")});\nvar baseAmbientColor = vec3<f32>(1.0, 1.0, 1.0);\nvar reflectionColor = vec3<f32>(0.0);\nlet lc = min(mesh.lc, ${MAX_LIGHTS}u);\n/*AD*/\nfor (var li = 0u; li < lc; li++) {\nlet lightIndex = mli(li);\nlet r = computeLighting(viewDirectionW, normalW, lights.lights[lightIndex], glossiness, input.vp);\nlet sf = shadowFactors[lightIndex];\ndiffuseBase += r[0] * sf;\nspecularBase += r[1] * sf;\n}\nlet finalDiffuse = clamp(diffuseBase * diffuseColor + emissiveContrib + mat.ac, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor;\nlet finalSpecular = specularBase * specularColor;\nvar color = vec4<f32>(finalDiffuse * baseAmbientColor + finalSpecular + reflectionColor, alpha);`;\n } else {\n lightingBlock = `var color = vec4<f32>(clamp(emissiveContrib * diffuseColor, vec3<f32>(0.0), vec3<f32>(1.0)) * baseColor, alpha);`;\n }\n\n const _fragmentTemplate = `/*SU*/\n${lightsStructs}\n${materialStruct}\n${_esmShadowOutput ? \"struct shadowParamsUniforms { biasAndScale: vec4<f32>, depthValues: vec4<f32>, }\" : \"\"}\n/*MU*/\n@group(1) @binding(0) var<uniform> mesh: MeshUniforms;\n${!_disableLighting ? meshLightIndexWGSL(\"mesh\") : \"\"}\n${helpers}\n/*HF*/\n/*FB*/\n/*FI*/\n${doubleSidedEntry}\n/*SV*/\n${viewDirCode}\n${normalCode}\n/*AC*/\n${opacityCode}\n${baseColorCode}\n${diffuseColorCode}\n${emissiveCode}\n${specularColorCode}\n/*AT*/\n${_noColorOutput ? \"return;\" : _esmShadowOutput ? esmShadowDepthCode : \"\"}\n${lightingBlock}\n/*BC*/\ncolor = vec4<f32>(max(color.rgb, vec3<f32>(0.0)), color.a);\nif (scene.vFogInfos.x > 0.0) {\nlet fog = calcFogFactor(input.vf);\ncolor = vec4<f32>(mix(scene.vFogColor.rgb, color.rgb, fog), color.a);\n}\n/*BA*/\n${_noColorOutput ? \"\" : \"return color;\"}\n}`;\n\n return {\n _vertexTemplate,\n _fragmentTemplate,\n _baseMeshUboFields,\n _baseVertexAttributes,\n _baseVaryings,\n _baseBindings,\n };\n}\n","/** Dynamic StandardMaterial pipeline builder — creates and caches GPU render\n * pipelines based on per-material feature flags.\n *\n * Feature flags (bitmask):\n * HAS_DIFFUSE_TEXTURE — diffuse texture sampling + UV attribute\n * HAS_EMISSIVE_TEXTURE — emissive texture sampling + UV attribute\n * Derived flag (computed automatically):\n * NEEDS_UV = HAS_DIFFUSE_TEXTURE | HAS_EMISSIVE_TEXTURE\n *\n * Pipelines are cached per (features, format, msaaSamples) tuple.\n * Shared scene UBO layout is identical across all variants (176 bytes). */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { RenderTargetSignature } from \"../../engine/render-target.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _standardFeatureKey } from \"./standard-material.js\";\nimport { getSceneBindGroupLayout, clearSceneBGLCache } from \"../../render/scene-helpers.js\";\nimport { createStandardTemplate } from \"./standard-template.js\";\nimport { composeShader } from \"../../shader/shader-composer.js\";\nimport type { ComposedShader, ShaderFragment } from \"../../shader/fragment-types.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { REVERSE_DEPTH_COMPARE, targetSignatureKey } from \"../../engine/render-target.js\";\nimport {\n DIFFUSE_USES_UV2,\n DISABLE_LIGHTING,\n DOUBLE_SIDED,\n HAS_DIFFUSE_TEXTURE,\n HAS_OPACITY_TEXTURE,\n MATERIAL_ALPHA_BLEND,\n NEEDS_UV,\n NEEDS_UV2,\n NO_COLOR_OUTPUT,\n ESM_SHADOW_OUTPUT,\n _getStdExtsSorted,\n} from \"./standard-flags.js\";\nimport { MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\n\n// ─── Composer Path (Phase 1) ────────────────────────────────────────\n// Converts feature bitmask → StandardTemplateConfig → ComposedShader.\n// This produces identical WGSL to the old string-builder path but via\n// the generic composer, enabling fragment-based extensions in Phase 2.\n\n/** Compose Standard shader via the generic ShaderComposer.\n * @param fragments - Optional extra fragments (e.g. thin-instance). */\nfunction composeStandardShader(features: number, _meshFeatures = 0, fragments: ShaderFragment[] = [], esmShadowDepthCode = \"\"): ComposedShader {\n const has = (bit: number) => (features & bit) !== 0;\n const template = createStandardTemplate(\n {\n _diffuse: has(HAS_DIFFUSE_TEXTURE),\n _needsUV: has(NEEDS_UV),\n _needsUV2: has(NEEDS_UV2),\n _diffuseUsesUV2: has(DIFFUSE_USES_UV2),\n _disableLighting: has(DISABLE_LIGHTING),\n _noColorOutput: has(NO_COLOR_OUTPUT),\n _esmShadowOutput: has(ESM_SHADOW_OUTPUT),\n },\n esmShadowDepthCode\n );\n return composeShader(template, fragments);\n}\n\n// ─── Shader Bindings (sig-independent) ──────────────────────────────\n\n/** Cached per-(features, fragments) shader bindings: BGLs + composed shader +\n * per-sig pipeline cache. Created once at renderable build time, shared across\n * all sig-specific pipelines. */\nexport interface StandardShaderBindings {\n /** @internal */\n _features: number;\n /** @internal */\n _meshFeatures: number;\n /** @internal */\n _meshBGL: GPUBindGroupLayout;\n /** @internal */\n _shadowBGL: GPUBindGroupLayout | null;\n /** @internal */\n _composed: ComposedShader;\n /** @internal Per-sig pipeline cache. Key = `targetSignatureKey(sig)`. */\n _pipelines: Map<string, GPURenderPipeline>;\n}\n\n// ─── Caches ─────────────────────────────────────────────────────────\n\n/** Per-(features:fk) shader bindings cache (sig-independent). */\nconst _bindingsCache = new Map<string, StandardShaderBindings>();\nlet _composedCache: Map<string, ComposedShader> | null = null;\nlet _cachedDevice: GPUDevice | null = null;\n\nfunction getComposedCache(): Map<string, ComposedShader> {\n if (!_composedCache) {\n _composedCache = new Map();\n }\n return _composedCache;\n}\n\nfunction ensureDevice(engine: EngineContext): void {\n if (_cachedDevice !== engine._device) {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = engine._device;\n }\n}\n\n/** Clear the pipeline cache. Must be called when a GPU device is destroyed. */\nexport function clearStandardPipelineCache(): void {\n _bindingsCache.clear();\n _composedCache?.clear();\n clearSceneBGLCache();\n _cachedDevice = null;\n}\n\n/** Get-or-build the sig-independent shader bindings for a given feature/fragment set.\n * Used at renderable build time so per-mesh bind groups can be created BEFORE the\n * first bind() call (when sig is known). */\nexport function getOrCreateStandardBindings(\n engine: EngineContext,\n features: number,\n meshFeatures: number,\n fragments: ShaderFragment[] = [],\n shaderKey = \"\",\n esmShadowDepthCode = \"\"\n): StandardShaderBindings {\n ensureDevice(engine);\n const key = _standardFeatureKey(features, meshFeatures, shaderKey);\n const cached = _bindingsCache.get(key);\n if (cached) {\n return cached;\n }\n\n const cc = getComposedCache();\n let composed = cc.get(key);\n if (!composed) {\n composed = composeStandardShader(features, meshFeatures, fragments, esmShadowDepthCode);\n cc.set(key, composed);\n }\n\n const device = engine._device;\n const meshBGL = device.createBindGroupLayout(composed._meshBGLDescriptor);\n let shadowBGL: GPUBindGroupLayout | null = null;\n const hasShadow = (meshFeatures & MSH_RECEIVE_SHADOWS) !== 0;\n if (hasShadow && composed._shadowBGLDescriptor) {\n shadowBGL = device.createBindGroupLayout(composed._shadowBGLDescriptor);\n }\n\n const bindings: StandardShaderBindings = {\n _features: features,\n _meshFeatures: meshFeatures,\n _meshBGL: meshBGL,\n _shadowBGL: shadowBGL,\n _composed: composed,\n _pipelines: new Map(),\n };\n _bindingsCache.set(key, bindings);\n return bindings;\n}\n\n/** Get-or-build a sig-specific pipeline on top of a shader bindings. Called at bind() time. */\nexport function getOrCreateStandardPipeline(engine: EngineContext, sig: RenderTargetSignature, bindings: StandardShaderBindings): GPURenderPipeline {\n ensureDevice(engine);\n const key = targetSignatureKey(sig);\n const cached = bindings._pipelines.get(key);\n if (cached) {\n return cached;\n }\n\n const device = engine._device;\n const composed = bindings._composed;\n const features = bindings._features;\n const sceneBGL = getSceneBindGroupLayout(engine);\n const bgls: GPUBindGroupLayout[] = bindings._shadowBGL ? [sceneBGL, bindings._meshBGL, bindings._shadowBGL] : [sceneBGL, bindings._meshBGL];\n\n const vertModule = device.createShaderModule({ code: composed._vertexWGSL });\n const noColorOutput = (features & NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n const fragModule = !sig._colorFormat && !noColorOutput ? null : device.createShaderModule({ code: composed._fragmentWGSL });\n\n const needsBlend = !esmShadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || (features & MATERIAL_ALPHA_BLEND) !== 0);\n const colorTarget: GPUColorTargetState | null = noColorOutput\n ? null\n : needsBlend\n ? {\n format: sig._colorFormat!,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }\n : { format: sig._colorFormat! };\n\n const pipeline = device.createRenderPipeline({\n layout: device.createPipelineLayout({ bindGroupLayouts: bgls }),\n vertex: { module: vertModule, entryPoint: \"main\", buffers: composed._vertexBufferLayouts },\n ...(fragModule ? { fragment: { module: fragModule, entryPoint: \"main\", targets: colorTarget ? [colorTarget] : [] } } : {}),\n ...(sig._depthStencilFormat\n ? {\n depthStencil: {\n format: sig._depthStencilFormat,\n depthCompare: sig._depthCompare ?? REVERSE_DEPTH_COMPARE,\n depthWriteEnabled: noColorOutput || esmShadowOutput || !needsBlend,\n },\n }\n : {}),\n multisample: { count: sig._sampleCount },\n primitive: { topology: \"triangle-list\", cullMode: features & DOUBLE_SIDED ? \"none\" : \"back\", frontFace: sig._flipY ? \"cw\" : \"ccw\" },\n });\n\n bindings._pipelines.set(key, pipeline);\n return pipeline;\n}\n\n// ─── Per-Mesh GPU Setup ─────────────────────────────────────────────\n\n/** Build the per-mesh material bind group (group 1). The mesh UBO\n * and material UBO are created/owned by the caller — this\n * function only assembles the bind group entries that match the composer's\n * binding layout.\n *\n * Mirrors `createPbrMeshBindGroup` in pbr-pipeline.ts. */\nexport function createStandardMeshBindGroup(\n engine: EngineContext,\n bindings: StandardShaderBindings,\n meshUBO: GPUBuffer,\n materialUBO: GPUBuffer,\n material: StandardMaterialProps\n): GPUBindGroup {\n const device = engine._device;\n const features = bindings._features;\n const needsUV = (features & NEEDS_UV) !== 0;\n const hasDiffuseTex = (features & HAS_DIFFUSE_TEXTURE) !== 0;\n const esmShadowOutput = (features & ESM_SHADOW_OUTPUT) !== 0;\n\n // Sequential numbering matches composer output.\n let nextBinding = 0;\n const entries: GPUBindGroupEntry[] = [\n { binding: nextBinding++, resource: { buffer: meshUBO } },\n { binding: nextBinding++, resource: { buffer: materialUBO } },\n ];\n\n if (hasDiffuseTex) {\n const tex = material.diffuseTexture!;\n entries.push({ binding: nextBinding++, resource: tex.texture.createView() }, { binding: nextBinding++, resource: tex.sampler });\n }\n\n // UV params UBO (only when UVs are actually emitted).\n if (needsUV) {\n const uvData = new Float32Array(4);\n const scaleX = material.uvScale[0];\n let scaleY = material.uvScale[1];\n let offsetY = 0;\n // Flip V for y-down source data (e.g. basis/compressed textures).\n // uv * (sx, sy) + (ox, oy) with vFlip becomes uv.xy * (sx, -sy) + (ox, sy+oy).\n if (material.diffuseTexture?.invertY) {\n offsetY = scaleY;\n scaleY = -scaleY;\n }\n uvData[0] = scaleX;\n uvData[1] = scaleY;\n uvData[2] = 0;\n uvData[3] = offsetY;\n entries.push({ binding: nextBinding++, resource: { buffer: createUniformBuffer(engine, uvData) } });\n }\n\n if (esmShadowOutput) {\n entries.push({\n binding: nextBinding++,\n resource: { buffer: (material as StandardMaterialProps & { readonly _esmShadowParamsUBO: GPUBuffer })._esmShadowParamsUBO },\n });\n }\n\n // Fragment-contributed bindings — iterate ext registry in alphabetical id order\n // to match composer's fragment sort order.\n const sortedExts = _getStdExtsSorted();\n for (const ext of sortedExts) {\n if (features & ext._feature && ext._bind) {\n nextBinding = ext._bind(material, entries, nextBinding);\n }\n }\n\n return device.createBindGroup({ layout: bindings._meshBGL, entries });\n}\n\n// ─── Internal Helpers ───────────────────────────────────────────────\n\n/** Write standard material properties into a pre-allocated Float32Array (24 floats). */\nexport function writeStdMaterialData(data: Float32Array, mat: StandardMaterialProps, textureLevel: number): void {\n const { diffuseColor: dc, specularColor: sc, emissiveColor: ec, ambientColor: ac } = mat;\n data[0] = dc[0];\n data[1] = dc[1];\n data[2] = dc[2];\n data[3] = mat.alpha;\n data[4] = sc[0];\n data[5] = sc[1];\n data[6] = sc[2];\n data[7] = mat.specularPower;\n data[8] = ec[0];\n data[9] = ec[1];\n data[10] = ec[2];\n data[11] = 1.0 / mat.bumpLevel;\n data[12] = ac[0];\n data[13] = ac[1];\n data[14] = ac[2];\n data[15] = textureLevel;\n data[16] = mat.ambientTexLevel;\n data[17] = mat.lightmapLevel;\n data[18] = mat.opacityLevel;\n data[19] = mat.alphaCutOff;\n data[20] = mat.reflectionLevel;\n data[21] = mat.reflectionCoordMode;\n}\n","/** Standard mesh renderable — builds Renderables from Mesh + StandardMaterial.\n *\n * `buildStandardMeshRenderables` does shared per-scene setup, then delegates\n * per-mesh work to `buildSingleStandardRenderable`. The same single-mesh\n * function is reused by the material-swap path. */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { Renderable, MeshGroupBuildResult } from \"../../render/renderable.js\";\nimport { collectStdBoundTextures } from \"./collect-std-bound-textures.js\";\nimport type { StandardMaterialProps } from \"./standard-material.js\";\nimport { _computeStandardMaterialFeatures, _standardShaderVariantKey } from \"./standard-material.js\";\nimport { acquireTexture, releaseTexture, clearSamplerCache } from \"../../resource/gpu-pool.js\";\nimport { createUniformBuffer } from \"../../resource/gpu-buffers.js\";\nimport { getOrCreateStandardBindings, getOrCreateStandardPipeline, createStandardMeshBindGroup, clearStandardPipelineCache, writeStdMaterialData } from \"./standard-pipeline.js\";\nimport { ESM_SHADOW_OUTPUT, NO_COLOR_OUTPUT, NEEDS_UV, NEEDS_UV2, HAS_OPACITY_TEXTURE, _getStdExts } from \"./standard-flags.js\";\nimport type { ShaderFragment } from \"../../shader/fragment-types.js\";\nimport type { ShadowGenerator } from \"../../shadow/shadow-generator.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport type { Material, MaterialRenderFeatures } from \"../material.js\";\nimport { _computeMeshFeatures, MSH_HAS_INSTANCE_COLOR, MSH_HAS_THIN_INSTANCES, MSH_RECEIVE_SHADOWS } from \"../mesh-features.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\n\n/** Scratch buffer for material UBO writes (24 floats = 96 bytes). Reused across\n * every Standard renderable since binding updates are single-threaded per frame. */\nconst _stdMatScratch = new Float32Array(24);\n\n/** Thin instance GPU sync callback type — loaded dynamically only when needed. */\ntype ThinInstanceSync = (\n engine: EngineContext,\n ti: any,\n pass: GPURenderPassEncoder | GPURenderBundleEncoder,\n slot: number,\n hasColor: boolean,\n drawBuffers?: import(\"../../mesh/thin-instance-gpu.js\").ThinInstanceDrawBuffers | null\n) => number;\n\n/** Fragment factories passed from the async group builder. */\nexport interface StdFragmentFactories {\n tiSync?: ThinInstanceSync;\n tiFragment?: (hasColor: boolean) => ShaderFragment;\n shadowFragment?: (shadowLights: import(\"./fragments/std-shadow-fragment.js\").ShadowLightSlot[]) => ShaderFragment;\n /** Present only when the scene has at least one culling-enabled thin-instance mesh. */\n cull?: typeof import(\"../../mesh/thin-instance-cull-binding.js\");\n}\n\n/** Build Renderable(s) + a SceneUniformUpdater for a set of standard meshes.\n * The `rebuildSingle` closure is reused later (via `_rebuildSingle` on the group\n * builder) for material swaps + per-pass material overrides. */\nexport function buildStandardMeshRenderables(scene: SceneContext, meshes: Mesh[], factories: StdFragmentFactories): MeshGroupBuildResult {\n const engine = scene.engine;\n const device = engine._device;\n const { tiSync, tiFragment, shadowFragment, cull } = factories;\n\n // Collect per-light shadow info.\n const shadowLights: { lightIndex: number; shadowType: \"esm\" | \"pcf\" | \"csm\"; gen: ShadowGenerator }[] = [];\n for (let i = 0; i < scene.lights.length; i++) {\n const sg = scene.lights[i]!.shadowGenerator;\n if (sg) {\n shadowLights.push({ lightIndex: i, shadowType: sg._shadowType, gen: sg });\n }\n }\n const hasSomeShadows = shadowLights.length > 0;\n\n // All receiving meshes in this build share the same shadow generators,\n // so keying the shadow BG by `bindings._shadowBGL` alone is correct.\n const shadowBGCache = new Map<GPUBindGroupLayout, GPUBindGroup>();\n // Closure used both for the initial per-mesh build below AND for later\n // material-swap / per-pass-override rebuilds (set on standardGroupBuilder._rebuildSingle).\n const rebuildSingle = (s: SceneContext, mesh: Mesh, materialOverride?: Material): Renderable => {\n const mat = (materialOverride ?? mesh.material) as StandardMaterialProps;\n const renderFeatures = (mat._renderFeatures ??= { features: _computeStandardMaterialFeatures(mat) }) as MaterialRenderFeatures;\n const isOverride = materialOverride != null;\n const features = renderFeatures.features;\n const shadowOutput = (features & (NO_COLOR_OUTPUT | ESM_SHADOW_OUTPUT)) !== 0;\n const receiveShadows = !shadowOutput && mesh.receiveShadows && hasSomeShadows;\n const meshFeatures = _computeMeshFeatures(mesh, receiveShadows);\n // Build per-feature fragment list (deduped via pipeline cache).\n const frags: ShaderFragment[] = [];\n for (const ext of _getStdExts().values()) {\n if (features & ext._feature) {\n const f = ext._frag(features);\n if (f) {\n frags.push(f);\n }\n }\n }\n let shaderKey = \"\";\n if (meshFeatures & MSH_RECEIVE_SHADOWS && shadowFragment) {\n const slots = shadowLights.map((sl) => ({ lightIndex: sl.lightIndex, shadowType: sl.shadowType }));\n shaderKey = _standardShaderVariantKey(slots);\n frags.push(shadowFragment(slots));\n }\n if (meshFeatures & MSH_HAS_THIN_INSTANCES && tiFragment) {\n const hasColor = !!(meshFeatures & MSH_HAS_INSTANCE_COLOR);\n const tiFrag = tiFragment(hasColor);\n if (hasColor) {\n // Standard applies instance color to final color (BC), not to baseColor (AT) like PBR.\n const { _fragmentSlots: _fragmentSlots, ...rest } = tiFrag;\n frags.push({\n ...rest,\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb * input.vInstanceColor.rgb, color.a * input.vInstanceColor.a);`,\n },\n });\n } else {\n frags.push(tiFrag);\n }\n }\n const esmShadowDepthCode = (features & ESM_SHADOW_OUTPUT) !== 0 ? (mat as StandardMaterialProps & { readonly _esmShadowDepthCode: string })._esmShadowDepthCode : \"\";\n const bindings = getOrCreateStandardBindings(engine, features, meshFeatures, frags, shaderKey, esmShadowDepthCode);\n\n const meshShadowGens = receiveShadows ? shadowLights.map((sl) => sl.gen) : [];\n\n const meshUboData = new Float32Array(bindings._composed._meshUboSpec._totalBytes / 4);\n const _packMeshWorld = engine._makePackMeshWorld?.(s as SceneContext) ?? packMat4IntoF32;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n const meshUBO = createUniformBuffer(engine, meshUboData);\n const textureLevel = (features & NEEDS_UV) !== 0 ? 1.0 : 0;\n const matData = new Float32Array(24);\n writeStdMaterialData(matData, mat, textureLevel);\n const materialUBO = createUniformBuffer(engine, matData);\n const meshBindGroup = createStandardMeshBindGroup(engine, bindings, meshUBO, materialUBO, mat);\n\n // Shadow bind group (group 2) — shared across receiving meshes via shadowBGCache.\n let shadowBindGroup: GPUBindGroup | null = null;\n if (meshShadowGens.length > 0 && bindings._shadowBGL) {\n let cached = shadowBGCache.get(bindings._shadowBGL);\n if (!cached) {\n const entries: GPUBindGroupEntry[] = [];\n let b = 0;\n for (const sg of meshShadowGens) {\n entries.push({ binding: b++, resource: sg._depthTexture.createView() });\n entries.push({ binding: b++, resource: sg._depthSampler });\n entries.push({ binding: b++, resource: { buffer: sg._shadowUBO } });\n }\n cached = device.createBindGroup({ layout: bindings._shadowBGL, entries });\n shadowBGCache.set(bindings._shadowBGL, cached);\n }\n shadowBindGroup = cached;\n }\n\n const needsUV = (features & NEEDS_UV) !== 0;\n const needsUV2 = (features & NEEDS_UV2) !== 0;\n const hasThinInstances = (meshFeatures & MSH_HAS_THIN_INSTANCES) !== 0;\n const hasInstanceColor = (meshFeatures & MSH_HAS_INSTANCE_COLOR) !== 0;\n const isTransparent = !shadowOutput && ((features & HAS_OPACITY_TEXTURE) !== 0 || mat.alpha < 1);\n\n const boundTextures = collectStdBoundTextures(mat);\n for (const t of boundTextures) {\n acquireTexture(t);\n }\n s._meshDisposables.set(mesh, [\n () => {\n for (const t of boundTextures) {\n releaseTexture(t);\n }\n },\n ]);\n\n let _lastWorldVersion = mesh.worldMatrixVersion;\n let _lastLightsCount = s.lights.length;\n const sortCenter = [mesh.worldMatrix[12]!, mesh.worldMatrix[13]!, mesh.worldMatrix[14]!] as [number, number, number];\n const _baseUpdate = (): void => {\n const worldVersion = mesh.worldMatrixVersion;\n if (worldVersion !== _lastWorldVersion || s.lights.length !== _lastLightsCount) {\n sortCenter[0] = mesh.worldMatrix[12]!;\n sortCenter[1] = mesh.worldMatrix[13]!;\n sortCenter[2] = mesh.worldMatrix[14]!;\n _packMeshWorld(meshUboData, mesh.worldMatrix, 0, 0);\n writeMeshLightSelection(mesh, s.lights, meshUboData);\n device.queue.writeBuffer(meshUBO, 0, meshUboData as Float32Array<ArrayBuffer>);\n _lastWorldVersion = worldVersion;\n _lastLightsCount = s.lights.length;\n }\n const uboVersion = mat._uboVersion;\n if (uboVersion !== _lastUboVersion) {\n _lastUboVersion = uboVersion;\n _stdMatScratch.fill(0);\n writeStdMaterialData(_stdMatScratch, mat, textureLevel);\n device.queue.writeBuffer(materialUBO, 0, _stdMatScratch.buffer, 0, 96);\n }\n };\n // FO-version wrapper applied only when the engine has floating-origin\n // on. The wrapper lives in the dynamic-imported `floating-origin.ts`\n // module and is the sole owner of `_lastFoVersion` tracking. For\n // non-LWR engines `_wrapRenderableForFO` is undefined and `update`\n // is the bare closure — no FO bytes in the closure body.\n const _invalidate = (): void => {\n _lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, s as SceneContext, _invalidate) ?? _baseUpdate;\n\n const draw = (pass: GPURenderPassEncoder | GPURenderBundleEncoder, cullBinding?: import(\"../../mesh/thin-instance-cull-binding.js\").TiCullBinding): number => {\n // For per-pass material overrides, skip the mesh.material === mat guard\n // because the override material is intentionally not the mesh's current one.\n if (!isOverride && mesh.material !== mat) {\n return 0;\n }\n const g = mesh._gpu;\n let slot = 0;\n const vb = g._vbLayout;\n pass.setVertexBuffer(slot++, g.positionBuffer, vb?._p?._offset);\n pass.setVertexBuffer(slot++, g.normalBuffer, vb?._n?._offset);\n if (needsUV) {\n pass.setVertexBuffer(slot++, g.uvBuffer, vb?._u?._offset);\n }\n if (needsUV2 && g.uv2Buffer) {\n pass.setVertexBuffer(slot++, g.uv2Buffer, vb?._u2?._offset);\n }\n\n const ti = hasThinInstances ? mesh.thinInstances : null;\n if (ti && tiSync) {\n slot = tiSync(engine, ti, pass, slot, hasInstanceColor, cullBinding?.cullDrawBufs);\n }\n\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, meshBindGroup);\n if (receiveShadows && shadowBindGroup) {\n pass.setBindGroup(2, shadowBindGroup);\n }\n if (cullBinding) {\n cullBinding.draw(pass, g.indexCount, ti!.count);\n } else if (ti && ti.count > 0) {\n pass.drawIndexed(g.indexCount, ti.count);\n } else {\n pass.drawIndexed(g.indexCount);\n }\n return 1;\n };\n\n const r: Renderable = {\n order: mesh.renderOrder ?? (isTransparent ? 200 : 100),\n isTransparent,\n mesh,\n bind(eng, sig) {\n const pipeline = getOrCreateStandardPipeline(eng as EngineContext, sig, bindings);\n // Opaque-only GPU culling (opt-in): tryBind gates on opt-in + transparency, returns the per-binding cull lifecycle.\n const cb = cull?.tryBind(r, s, mesh, engine, hasInstanceColor, isTransparent, update);\n return {\n renderable: r,\n pipeline,\n update: cb ? cb.update : update,\n draw: (pass) => draw(pass, cb),\n };\n },\n };\n r._worldCenter = sortCenter;\n let _lastUboVersion = mat._uboVersion;\n return r;\n };\n\n const renderables = meshes.map((m) => rebuildSingle(scene, m));\n\n scene._disposables.push(\n () => clearStandardPipelineCache(),\n () => clearSamplerCache(engine)\n );\n\n return { renderables, rebuildSingle };\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a3 as HAS_AMBIENT_TEXTURE, a4 as AMBIENT_USES_UV2 } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdAmbientFragment(usesUV2) {
|
|
4
4
|
const uv = usesUV2 ? "input.vv" : "input.vu";
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdAmbientFragment,
|
|
35
35
|
stdAmbientExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-ambient-fragment-
|
|
37
|
+
//# sourceMappingURL=std-ambient-fragment-C6WNm8dQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-ambient-fragment-
|
|
1
|
+
{"version":3,"file":"std-ambient-fragment-C6WNm8dQ.js","sources":["../src/material/standard/fragments/std-ambient-fragment.ts"],"sourcesContent":["/** Standard Ambient Texture Fragment — multiplies final diffuse by ambient occlusion texture. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_AMBIENT_TEXTURE, AMBIENT_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdAmbientFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-ambient\",\n _bindings: [\n { _name: \"aT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"aS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AD: `baseAmbientColor = textureSample(aT, aS, ${uv}).rgb * mat.ambTexLvl;`,\n },\n };\n}\n\nexport const stdAmbientExt: StdExt = {\n _id: \"std-ambient\",\n _phase: \"mesh\",\n _feature: HAS_AMBIENT_TEXTURE,\n _frag: (features) => createStdAmbientFragment((features & AMBIENT_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.ambientTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.ambientTexture) {\n out.push(mat.ambientTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,yBAAyB,SAAkC;AACvE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI,4CAA4C,EAAE;AAAA,IAAA;AAAA,EACtD;AAER;AAEO,MAAM,gBAAwB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,0BAA0B,WAAW,sBAAsB,CAAC;AAAA,EACjF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,gBAAgB;AACpB,UAAI,KAAK,IAAI,cAAc;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
|
package/{std-cube-reflection-fragment-ulqc3bsP.js → std-cube-reflection-fragment-Bqutpy2q.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aa as HAS_CUBE_REFLECTION } from "./index-B7Qhw0xL.js";
|
|
2
2
|
function createStdCubeReflectionFragment() {
|
|
3
3
|
return {
|
|
4
4
|
_id: "std-cube-reflection",
|
|
@@ -28,4 +28,4 @@ export {
|
|
|
28
28
|
createStdCubeReflectionFragment,
|
|
29
29
|
stdCubeReflectionExt
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=std-cube-reflection-fragment-
|
|
31
|
+
//# sourceMappingURL=std-cube-reflection-fragment-Bqutpy2q.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-cube-reflection-fragment-
|
|
1
|
+
{"version":3,"file":"std-cube-reflection-fragment-Bqutpy2q.js","sources":["../src/material/standard/fragments/std-cube-reflection-fragment.ts"],"sourcesContent":["/** Cube reflection fragment — dynamically imported for scenes with cube reflection textures. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_CUBE_REFLECTION } from \"../standard-flags.js\";\n\nexport function createStdCubeReflectionFragment(): ShaderFragment {\n return {\n _id: \"std-cube-reflection\",\n _bindings: [\n { _name: \"cRT\", _type: { _kind: \"texture\", _textureType: \"texture_cube<f32>\" }, _visibility: 0x2 },\n { _name: \"cRS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: 0x2 },\n ],\n _fragmentSlots: {\n AD: `{let v=normalize(input.vp-scene.vEyePosition.xyz);reflectionColor=textureSample(cRT,cRS,reflect(v,normalW)).rgb*mat.rLvl;}`,\n },\n };\n}\n\nexport const stdCubeReflectionExt: StdExt = {\n _id: \"std-cube-reflection\",\n _phase: \"mesh\",\n _feature: HAS_CUBE_REFLECTION,\n _frag: createStdCubeReflectionFragment,\n _bind(mat, entries, b) {\n const cube = mat.reflectionCubeTexture!;\n entries.push({ binding: b++, resource: cube.view });\n entries.push({ binding: b++, resource: cube.sampler });\n return b;\n },\n // Cube textures are tracked separately; no Texture2D[] contribution.\n};\n"],"names":[],"mappings":";AAKO,SAAS,kCAAkD;AAC9D,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW,cAAc,oBAAA,GAAuB,aAAa,EAAA;AAAA,MAC7F,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,EAAA;AAAA,IAAI;AAAA,IAE3F,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,uBAA+B;AAAA,EACxC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,OAAO,IAAI;AACjB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,MAAM;AAClD,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,KAAK,SAAS;AACrD,WAAO;AAAA,EACX;AAAA;AAEJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { $ as HAS_EMISSIVE_TEXTURE, a0 as HAS_DEPTH_EMISSIVE_TEXTURE } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdEmissiveFragment(depthTexture) {
|
|
4
4
|
return {
|
|
@@ -37,4 +37,4 @@ export {
|
|
|
37
37
|
createStdEmissiveFragment,
|
|
38
38
|
stdEmissiveExt
|
|
39
39
|
};
|
|
40
|
-
//# sourceMappingURL=std-emissive-fragment-
|
|
40
|
+
//# sourceMappingURL=std-emissive-fragment-B-A83rqX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-emissive-fragment-
|
|
1
|
+
{"version":3,"file":"std-emissive-fragment-B-A83rqX.js","sources":["../src/material/standard/fragments/std-emissive-fragment.ts"],"sourcesContent":["/** Standard Emissive Texture Fragment — multiplies emissive contribution by texture sample. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_DEPTH_EMISSIVE_TEXTURE, HAS_EMISSIVE_TEXTURE } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdEmissiveFragment(depthTexture: boolean): ShaderFragment {\n return {\n _id: \"std-emissive\",\n _bindings: [\n {\n _name: \"eT\",\n _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\", _sampleType: depthTexture ? \"unfilterable-float\" : undefined },\n _visibility: STAGE_FRAGMENT,\n },\n { _name: \"eS\", _type: { _kind: \"sampler\", _samplerType: depthTexture ? \"sampler_non_filtering\" : \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: `emissiveContrib = mat.ec + textureSample(eT, eS, input.vu).rgb * mat.tl;`,\n },\n };\n}\n\nexport const stdEmissiveExt: StdExt = {\n _id: \"std-emissive\",\n _phase: \"mesh\",\n _feature: HAS_EMISSIVE_TEXTURE,\n _frag: (features) => createStdEmissiveFragment((features & HAS_DEPTH_EMISSIVE_TEXTURE) !== 0),\n _bind(mat: StandardMaterialProps, entries: GPUBindGroupEntry[], b: number): number {\n const tex = mat.emissiveTexture!;\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.emissiveTexture) {\n out.push(mat.emissiveTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,cAAuC;AAC7E,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP;AAAA,QACI,OAAO;AAAA,QACP,OAAO,EAAE,OAAO,WAAW,cAAc,mBAAmB,aAAa,eAAe,uBAAuB,OAAA;AAAA,QAC/G,aAAa;AAAA,MAAA;AAAA,MAEjB,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,eAAe,0BAA0B,UAAA,GAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAE9I,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,gCAAgC,CAAC;AAAA,EAC5F,MAAM,KAA4B,SAA8B,GAAmB;AAC/E,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,MAAM;AACjD,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a5 as HAS_LIGHTMAP_TEXTURE, a6 as LIGHTMAP_USES_UV2 } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdLightmapFragment(usesUV2) {
|
|
4
4
|
const uv = usesUV2 ? "input.vv" : "input.vu";
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdLightmapFragment,
|
|
35
35
|
stdLightmapExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-lightmap-fragment-
|
|
37
|
+
//# sourceMappingURL=std-lightmap-fragment-Df7KJezh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-lightmap-fragment-
|
|
1
|
+
{"version":3,"file":"std-lightmap-fragment-Df7KJezh.js","sources":["../src/material/standard/fragments/std-lightmap-fragment.ts"],"sourcesContent":["/** Standard Lightmap Fragment — additively blends lightmap into final color. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_LIGHTMAP_TEXTURE, LIGHTMAP_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdLightmapFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-lightmap\",\n _bindings: [\n { _name: \"lT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"lS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n BC: `color = vec4<f32>(color.rgb + textureSample(lT, lS, ${uv}).rgb * mat.lmLvl, color.a);`,\n },\n };\n}\n\nexport const stdLightmapExt: StdExt = {\n _id: \"std-lightmap\",\n _phase: \"mesh\",\n _feature: HAS_LIGHTMAP_TEXTURE,\n _frag: (features) => createStdLightmapFragment((features & LIGHTMAP_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.lightmapTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.lightmapTexture) {\n out.push(mat.lightmapTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,SAAkC;AACxE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI,uDAAuD,EAAE;AAAA,IAAA;AAAA,EACjE;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,uBAAuB,CAAC;AAAA,EACnF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a7 as HAS_OPACITY_TEXTURE, a8 as OPACITY_FROM_RGB } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdOpacityFragment(fromRGB) {
|
|
4
4
|
const opacityCalc = fromRGB ? `{ let opSample = textureSample(oT, oS, input.vu); alpha *= dot(opSample.rgb, vec3<f32>(0.3, 0.59, 0.11)) * mat.opLvl; }` : `alpha *= textureSample(oT, oS, input.vu).a * mat.opLvl;`;
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdOpacityFragment,
|
|
35
35
|
stdOpacityExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-opacity-fragment-
|
|
37
|
+
//# sourceMappingURL=std-opacity-fragment-D9et2jip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-opacity-fragment-
|
|
1
|
+
{"version":3,"file":"std-opacity-fragment-D9et2jip.js","sources":["../src/material/standard/fragments/std-opacity-fragment.ts"],"sourcesContent":["/** Standard Opacity Texture Fragment — modulates alpha by opacity texture. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_OPACITY_TEXTURE, OPACITY_FROM_RGB } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdOpacityFragment(fromRGB: boolean): ShaderFragment {\n const opacityCalc = fromRGB\n ? `{ let opSample = textureSample(oT, oS, input.vu); alpha *= dot(opSample.rgb, vec3<f32>(0.3, 0.59, 0.11)) * mat.opLvl; }`\n : `alpha *= textureSample(oT, oS, input.vu).a * mat.opLvl;`;\n return {\n _id: \"std-opacity\",\n _bindings: [\n { _name: \"oT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"oS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: opacityCalc,\n },\n };\n}\n\nexport const stdOpacityExt: StdExt = {\n _id: \"std-opacity\",\n _phase: \"mesh\",\n _feature: HAS_OPACITY_TEXTURE,\n _frag: (features) => createStdOpacityFragment((features & OPACITY_FROM_RGB) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.opacityTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.opacityTexture) {\n out.push(mat.opacityTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,yBAAyB,SAAkC;AACvE,QAAM,cAAc,UACd,4HACA;AACN,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,gBAAwB;AAAA,EACjC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,0BAA0B,WAAW,sBAAsB,CAAC;AAAA,EACjF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,gBAAgB;AACpB,UAAI,KAAK,IAAI,cAAc;AAAA,IAC/B;AAAA,EACJ;AACJ;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a9 as HAS_REFLECTION_TEXTURE } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
const REFLECTION_HELPERS = `
|
|
4
4
|
fn computeSphericalCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {
|
|
@@ -54,4 +54,4 @@ export {
|
|
|
54
54
|
createStdReflectionFragment,
|
|
55
55
|
stdReflectionExt
|
|
56
56
|
};
|
|
57
|
-
//# sourceMappingURL=std-reflection-fragment-
|
|
57
|
+
//# sourceMappingURL=std-reflection-fragment-DBJeT-yg.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-reflection-fragment-
|
|
1
|
+
{"version":3,"file":"std-reflection-fragment-DBJeT-yg.js","sources":["../src/material/standard/fragments/std-reflection-fragment.ts"],"sourcesContent":["/** Standard Reflection Texture Fragment — spherical/planar environment reflection. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nconst REFLECTION_HELPERS = `\nfn computeSphericalCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {\nlet viewDir = normalize((scene.view * vec4<f32>(worldPos, 1.0)).xyz);\nlet viewNormal = normalize((scene.view * vec4<f32>(worldNormal, 0.0)).xyz);\nvar r = reflect(viewDir, viewNormal);\nr.z = r.z - 1.0;\nlet m = 2.0 * length(r);\nreturn vec2<f32>(r.x / m + 0.5, r.y / m + 0.5);\n}\nfn computePlanarCoords(worldPos: vec3<f32>, worldNormal: vec3<f32>) -> vec2<f32> {\nlet viewDir = worldPos - scene.vEyePosition.xyz;\nlet coords = normalize(reflect(viewDir, worldNormal));\nreturn vec2<f32>(coords.x, 1.0 - coords.y);\n}\n`;\n\nexport function createStdReflectionFragment(): ShaderFragment {\n return {\n _id: \"std-reflection\",\n _bindings: [\n { _name: \"rT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"rS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _helperFunctions: REFLECTION_HELPERS,\n _fragmentSlots: {\n AD: `{\nvar reflCoords: vec2<f32>;\nif (mat.rCm < 1.5) { reflCoords = computeSphericalCoords(input.vp, normalW); }\nelse { reflCoords = computePlanarCoords(input.vp, normalW); }\nreflectionColor = textureSample(rT, rS, reflCoords).rgb * mat.rLvl;\n}`,\n },\n };\n}\n\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_REFLECTION_TEXTURE } from \"../standard-flags.js\";\n\nexport const stdReflectionExt: StdExt = {\n _id: \"std-reflection\",\n _phase: \"mesh\",\n _feature: HAS_REFLECTION_TEXTURE,\n _frag: createStdReflectionFragment,\n _bind(mat, entries, b) {\n const tex = mat.reflectionTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.reflectionTexture) {\n out.push(mat.reflectionTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAGA,MAAM,iBAAiB;AAEvB,MAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBpB,SAAS,8BAA8C;AAC1D,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,MACZ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA;AAAA,EAMR;AAER;AAOO,MAAM,mBAA2B;AAAA,EACpC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,mBAAmB;AACvB,UAAI,KAAK,IAAI,iBAAiB;AAAA,IAClC;AAAA,EACJ;AACJ;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { c as createShadowFragment } from "./shadow-fragment-core-DHN2G6FI.js";
|
|
2
|
+
import { ab as getCsmStdReceiverFactory } from "./index-B7Qhw0xL.js";
|
|
3
|
+
function createStdShadowFragment(shadowLights) {
|
|
4
|
+
const csmSlots = shadowLights.filter((sl) => sl.shadowType === "csm");
|
|
5
|
+
if (csmSlots.length > 0) {
|
|
6
|
+
return getCsmStdReceiverFactory()(csmSlots.map((s) => ({ lightIndex: s.lightIndex })));
|
|
7
|
+
}
|
|
8
|
+
return createShadowFragment("std-shadow", shadowLights);
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
createStdShadowFragment
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=std-shadow-fragment-C6fD8rW-.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"std-shadow-fragment-C6fD8rW-.js","sources":["../src/material/standard/fragments/std-shadow-fragment.ts"],"sourcesContent":["/**\n * Standard Shadow Fragment — Per-Light Shadow Support\n *\n * Thin wrapper around the shared shadow-fragment-core for Standard materials.\n * Only bundled when a scene uses shadow-receiving Standard meshes.\n */\n\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport { createShadowFragment } from \"../../../shader/fragments/shadow-fragment-core.js\";\nimport { getCsmStdReceiverFactory } from \"../../../shadow/csm-receiver-registry.js\";\n\nexport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\nimport type { ShadowLightSlot } from \"../../../shader/fragments/shadow-fragment-core.js\";\n\n/**\n * Create a per-light shadow fragment for Standard materials.\n * Each shadow-casting light gets its own varying, bindings, and sampling code.\n * The shadow factor for each light is stored in shadowFactors[lightIndex].\n *\n * If any slot is a cascaded-shadow (`\"csm\"`) light, the cascaded receiver factory\n * registered by the CSM generator is used (v1: a scene mixing CSM with ESM/PCF\n * receivers on the same mesh is unsupported). Otherwise the plain ESM/PCF core is used.\n */\nexport function createStdShadowFragment(shadowLights: ShadowLightSlot[]): ShaderFragment {\n const csmSlots = shadowLights.filter((sl) => sl.shadowType === \"csm\");\n if (csmSlots.length > 0) {\n return getCsmStdReceiverFactory()!(csmSlots.map((s) => ({ lightIndex: s.lightIndex })));\n }\n return createShadowFragment(\"std-shadow\", shadowLights);\n}\n"],"names":[],"mappings":";;AAuBO,SAAS,wBAAwB,cAAiD;AACrF,QAAM,WAAW,aAAa,OAAO,CAAC,OAAO,GAAG,eAAe,KAAK;AACpE,MAAI,SAAS,SAAS,GAAG;AACrB,WAAO,yBAAA,EAA4B,SAAS,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,WAAA,EAAa,CAAC;AAAA,EAC1F;AACA,SAAO,qBAAqB,cAAc,YAAY;AAC1D;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { a1 as HAS_SPECULAR_TEXTURE, a2 as SPECULAR_USES_UV2 } from "./index-B7Qhw0xL.js";
|
|
2
2
|
const STAGE_FRAGMENT = 2;
|
|
3
3
|
function createStdSpecularFragment(usesUV2) {
|
|
4
4
|
const uv = usesUV2 ? "input.vv" : "input.vu";
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
createStdSpecularFragment,
|
|
35
35
|
stdSpecularExt
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=std-specular-fragment-
|
|
37
|
+
//# sourceMappingURL=std-specular-fragment-C2ZOss-t.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"std-specular-fragment-
|
|
1
|
+
{"version":3,"file":"std-specular-fragment-C2ZOss-t.js","sources":["../src/material/standard/fragments/std-specular-fragment.ts"],"sourcesContent":["/** Standard Specular Texture Fragment — replaces specular color with texture sample. */\nimport type { ShaderFragment } from \"../../../shader/fragment-types.js\";\nimport type { StandardMaterialProps } from \"../standard-material.js\";\nimport type { Texture2D } from \"../../../texture/texture-2d.js\";\nimport type { StdExt } from \"../standard-flags.js\";\nimport { HAS_SPECULAR_TEXTURE, SPECULAR_USES_UV2 } from \"../standard-flags.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nexport function createStdSpecularFragment(usesUV2: boolean): ShaderFragment {\n const uv = usesUV2 ? \"input.vv\" : \"input.vu\";\n return {\n _id: \"std-specular\",\n _bindings: [\n { _name: \"sT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"sS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n _fragmentSlots: {\n AT: `specularColor = textureSample(sT, sS, ${uv}).rgb;`,\n },\n };\n}\n\nexport const stdSpecularExt: StdExt = {\n _id: \"std-specular\",\n _phase: \"mesh\",\n _feature: HAS_SPECULAR_TEXTURE,\n _frag: (features) => createStdSpecularFragment((features & SPECULAR_USES_UV2) !== 0),\n _bind(mat, entries, b) {\n const tex = mat.specularTexture!;\n entries.push({ binding: b++, resource: tex.texture.createView() });\n entries.push({ binding: b++, resource: tex.sampler });\n return b;\n },\n _textures(mat: StandardMaterialProps, out: Texture2D[]): void {\n if (mat.specularTexture) {\n out.push(mat.specularTexture);\n }\n },\n};\n"],"names":[],"mappings":";AAOA,MAAM,iBAAiB;AAEhB,SAAS,0BAA0B,SAAkC;AACxE,QAAM,KAAK,UAAU,aAAa;AAClC,SAAO;AAAA,IACH,KAAK;AAAA,IACL,WAAW;AAAA,MACP,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAAqB,aAAa,eAAA;AAAA,MAC1F,EAAE,OAAO,MAAM,OAAO,EAAE,OAAO,WAAW,cAAc,aAAa,aAAa,eAAA;AAAA,IAAe;AAAA,IAErG,gBAAgB;AAAA,MACZ,IAAI,yCAAyC,EAAE;AAAA,IAAA;AAAA,EACnD;AAER;AAEO,MAAM,iBAAyB;AAAA,EAClC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO,CAAC,aAAa,2BAA2B,WAAW,uBAAuB,CAAC;AAAA,EACnF,MAAM,KAAK,SAAS,GAAG;AACnB,UAAM,MAAM,IAAI;AAChB,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,QAAQ,WAAA,GAAc;AACjE,YAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,SAAS;AACpD,WAAO;AAAA,EACX;AAAA,EACA,UAAU,KAA4B,KAAwB;AAC1D,QAAI,IAAI,iBAAiB;AACrB,UAAI,KAAK,IAAI,eAAe;AAAA,IAChC;AAAA,EACJ;AACJ;"}
|