@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.
Files changed (197) hide show
  1. package/_mat4-storage-f64-Bvh5TymE.js +10 -0
  2. package/_mat4-storage-f64-Bvh5TymE.js.map +1 -0
  3. package/{alpha-test-fragment-CUiHCw7W.js → alpha-test-fragment-BCChpzaV.js} +2 -2
  4. package/{alpha-test-fragment-CUiHCw7W.js.map → alpha-test-fragment-BCChpzaV.js.map} +1 -1
  5. package/{background-dds-skybox-yHTqabU3.js → background-dds-skybox-ZjrSIxrT.js} +4 -4
  6. package/background-dds-skybox-ZjrSIxrT.js.map +1 -0
  7. package/{background-ground-DIw6D3qf.js → background-ground-B2Mie-MI.js} +3 -3
  8. package/background-ground-B2Mie-MI.js.map +1 -0
  9. package/{background-hdr-skybox-c4uuTmkP.js → background-hdr-skybox-DDRJYuT2.js} +3 -3
  10. package/background-hdr-skybox-DDRJYuT2.js.map +1 -0
  11. package/{background-solid-skybox-DPGBpPbm.js → background-solid-skybox-fjXlnWaD.js} +3 -3
  12. package/{background-solid-skybox-DPGBpPbm.js.map → background-solid-skybox-fjXlnWaD.js.map} +1 -1
  13. package/{billboard-renderable-D8mlVGCd.js → billboard-renderable-DKmlOgbM.js} +2 -2
  14. package/{billboard-renderable-D8mlVGCd.js.map → billboard-renderable-DKmlOgbM.js.map} +1 -1
  15. package/{clamp-block-BdII67hT.js → clamp-block-CxRBPlUq.js} +2 -2
  16. package/{clamp-block-BdII67hT.js.map → clamp-block-CxRBPlUq.js.map} +1 -1
  17. package/{clearcoat-fragment-LCiG98Rf.js → clearcoat-fragment-KbZAa0TA.js} +2 -2
  18. package/{clearcoat-fragment-LCiG98Rf.js.map → clearcoat-fragment-KbZAa0TA.js.map} +1 -1
  19. package/{create-skeleton-C9JdIJnb.js → create-skeleton-BBI5urcj.js} +2 -2
  20. package/{create-skeleton-C9JdIJnb.js.map → create-skeleton-BBI5urcj.js.map} +1 -1
  21. package/{cubemap-skybox-material-DvXMVc4k.js → cubemap-skybox-material-DvW81drX.js} +2 -2
  22. package/{cubemap-skybox-material-DvXMVc4k.js.map → cubemap-skybox-material-DvW81drX.js.map} +1 -1
  23. package/{curve-block-BlJpXVYv.js → curve-block-Dh_xdUj-.js} +2 -2
  24. package/{curve-block-BlJpXVYv.js.map → curve-block-Dh_xdUj-.js.map} +1 -1
  25. package/{emissive-fragment-BnNvbBCw.js → emissive-fragment-DD8cvHyx.js} +2 -2
  26. package/{emissive-fragment-BnNvbBCw.js.map → emissive-fragment-DD8cvHyx.js.map} +1 -1
  27. package/{esm-shadow-view-DGKdF1NI.js → esm-shadow-view-15S4JK6p.js} +2 -2
  28. package/{esm-shadow-view-DGKdF1NI.js.map → esm-shadow-view-15S4JK6p.js.map} +1 -1
  29. package/{esm-shadow-view-Dk9NFtLq.js → esm-shadow-view-DHVS9r7H.js} +2 -2
  30. package/{esm-shadow-view-Dk9NFtLq.js.map → esm-shadow-view-DHVS9r7H.js.map} +1 -1
  31. package/{esm-shadow-view-DN9HIaM4.js → esm-shadow-view-DYAc62Kl.js} +2 -2
  32. package/{esm-shadow-view-DN9HIaM4.js.map → esm-shadow-view-DYAc62Kl.js.map} +1 -1
  33. package/{gaussian-splatting-pipeline-sh-DgJl7l56.js → gaussian-splatting-pipeline-sh-BvkUhA9V.js} +2 -2
  34. package/{gaussian-splatting-pipeline-sh-DgJl7l56.js.map → gaussian-splatting-pipeline-sh-BvkUhA9V.js.map} +1 -1
  35. package/{gltf-animation-D7uyTyO3.js → gltf-animation-KnPzeOIY.js} +3 -3
  36. package/{gltf-animation-D7uyTyO3.js.map → gltf-animation-KnPzeOIY.js.map} +1 -1
  37. package/gltf-color-normalize-Qxl-9C48.js +29 -0
  38. package/gltf-color-normalize-Qxl-9C48.js.map +1 -0
  39. package/{gltf-ext-basisu-CPg5kPrx.js → gltf-ext-basisu-kmth3UWX.js} +7 -4
  40. package/gltf-ext-basisu-kmth3UWX.js.map +1 -0
  41. package/{gltf-ext-node-visibility-MafA9ot2.js → gltf-ext-node-visibility-BjRRd6si.js} +2 -2
  42. package/{gltf-ext-node-visibility-MafA9ot2.js.map → gltf-ext-node-visibility-BjRRd6si.js.map} +1 -1
  43. package/{gltf-ext-uv-transform-CE_-T1Tr.js → gltf-ext-uv-transform-MHmR-YyM.js} +2 -2
  44. package/{gltf-ext-uv-transform-CE_-T1Tr.js.map → gltf-ext-uv-transform-MHmR-YyM.js.map} +1 -1
  45. package/{gltf-feature-animation-pointer-BjpwOOqo.js → gltf-feature-animation-pointer-rFqLfbO_.js} +3 -3
  46. package/{gltf-feature-animation-pointer-BjpwOOqo.js.map → gltf-feature-animation-pointer-rFqLfbO_.js.map} +1 -1
  47. package/{gltf-feature-animations-CCizegp8.js → gltf-feature-animations-DikONdzi.js} +2 -2
  48. package/{gltf-feature-animations-CCizegp8.js.map → gltf-feature-animations-DikONdzi.js.map} +1 -1
  49. package/{gltf-feature-gpu-instancing-2e_CFQnl.js → gltf-feature-gpu-instancing-Cj1XjmM6.js} +5 -4
  50. package/gltf-feature-gpu-instancing-Cj1XjmM6.js.map +1 -0
  51. package/{gltf-feature-lights-punctual-DDDg4j0U.js → gltf-feature-lights-punctual-C-0SlGmD.js} +5 -5
  52. package/{gltf-feature-lights-punctual-DDDg4j0U.js.map → gltf-feature-lights-punctual-C-0SlGmD.js.map} +1 -1
  53. package/{gltf-feature-morph-CKCw6tkX.js → gltf-feature-morph-BAcY14XU.js} +3 -3
  54. package/{gltf-feature-morph-CKCw6tkX.js.map → gltf-feature-morph-BAcY14XU.js.map} +1 -1
  55. package/gltf-feature-registry-97sY_x5O.js +59 -0
  56. package/gltf-feature-registry-97sY_x5O.js.map +1 -0
  57. package/{gltf-feature-skeleton-D8hWLqi2.js → gltf-feature-skeleton-lVjkDfIU.js} +3 -3
  58. package/{gltf-feature-skeleton-D8hWLqi2.js.map → gltf-feature-skeleton-lVjkDfIU.js.map} +1 -1
  59. package/{gltf-feature-variants-Ds6v9byg.js → gltf-feature-variants-BphF4JmV.js} +2 -2
  60. package/{gltf-feature-variants-Ds6v9byg.js.map → gltf-feature-variants-BphF4JmV.js.map} +1 -1
  61. package/{gltf-interleave-DGnUlz28.js → gltf-interleave-C9eBqH_F.js} +2 -2
  62. package/{gltf-interleave-DGnUlz28.js.map → gltf-interleave-C9eBqH_F.js.map} +1 -1
  63. package/gltf-normals-b2h74380.js +37 -0
  64. package/gltf-normals-b2h74380.js.map +1 -0
  65. package/{gltf-pbr-builder-ext-BFOxOCnQ.js → gltf-pbr-builder-ext-DPC0zg_u.js} +2 -2
  66. package/{gltf-pbr-builder-ext-BFOxOCnQ.js.map → gltf-pbr-builder-ext-DPC0zg_u.js.map} +1 -1
  67. package/{gltf-variants-DFbr8EES.js → gltf-variants-CnBEZr0o.js} +4 -4
  68. package/{gltf-variants-DFbr8EES.js.map → gltf-variants-CnBEZr0o.js.map} +1 -1
  69. package/{gs-picking-pipeline-DzfMASL9.js → gs-picking-pipeline-Bx8LTav6.js} +2 -2
  70. package/{gs-picking-pipeline-DzfMASL9.js.map → gs-picking-pipeline-Bx8LTav6.js.map} +1 -1
  71. package/{index-C8HOR2sB.js → index-B7Qhw0xL.js} +3047 -1037
  72. package/index-B7Qhw0xL.js.map +1 -0
  73. package/index.d.ts +504 -17
  74. package/index.js +322 -304
  75. package/{input-block-DgAJBzN_.js → input-block-Coi_aZwl.js} +2 -2
  76. package/{input-block-DgAJBzN_.js.map → input-block-Coi_aZwl.js.map} +1 -1
  77. package/{iridescence-fragment-Gymp7or5.js → iridescence-fragment-DwZcCTdD.js} +2 -2
  78. package/{iridescence-fragment-Gymp7or5.js.map → iridescence-fragment-DwZcCTdD.js.map} +1 -1
  79. package/{light-block-B11ew7FA.js → light-block-Np_h5gPI.js} +2 -2
  80. package/{light-block-B11ew7FA.js.map → light-block-Np_h5gPI.js.map} +1 -1
  81. package/{loop-block-Bb23EOMb.js → loop-block-BFkLFYGm.js} +2 -2
  82. package/{loop-block-Bb23EOMb.js.map → loop-block-BFkLFYGm.js.map} +1 -1
  83. package/{mesh-features-BLENkYVt.js → mesh-features-BAJpbMog.js} +6 -3
  84. package/mesh-features-BAJpbMog.js.map +1 -0
  85. package/{morph-fragment-DOVo70gP.js → morph-fragment-DqH-w61u.js} +2 -2
  86. package/{morph-fragment-DOVo70gP.js.map → morph-fragment-DqH-w61u.js.map} +1 -1
  87. package/{multilight-wgsl-BGyiIOp3.js → multilight-wgsl-B9Mf9d-q.js} +4 -4
  88. package/{multilight-wgsl-BGyiIOp3.js.map → multilight-wgsl-B9Mf9d-q.js.map} +1 -1
  89. package/no-color-view-DsyLSL-W.js +8 -0
  90. package/no-color-view-DsyLSL-W.js.map +1 -0
  91. package/{node-registry-DwgC4yth.js → node-registry-Bd-AlrgC.js} +8 -8
  92. package/{node-registry-DwgC4yth.js.map → node-registry-Bd-AlrgC.js.map} +1 -1
  93. package/{node-registry-extra-compat-Dhrw8fDQ.js → node-registry-extra-compat-Ch7ApZHF.js} +2 -2
  94. package/{node-registry-extra-compat-Dhrw8fDQ.js.map → node-registry-extra-compat-Ch7ApZHF.js.map} +1 -1
  95. package/{node-registry-extra-math-CsAHvIZo.js → node-registry-extra-math-6ezzTkPj.js} +2 -2
  96. package/{node-registry-extra-math-CsAHvIZo.js.map → node-registry-extra-math-6ezzTkPj.js.map} +1 -1
  97. package/{node-renderable-DlLIdBmd.js → node-renderable-CS0CmsSp.js} +28 -11
  98. package/node-renderable-CS0CmsSp.js.map +1 -0
  99. package/{node-shadow-DKrcqmNg.js → node-shadow-CpnrdvtJ.js} +2 -2
  100. package/{node-shadow-DKrcqmNg.js.map → node-shadow-CpnrdvtJ.js.map} +1 -1
  101. package/{normal-map-fragment-DpsIXrJf.js → normal-map-fragment-DradEMl-.js} +3 -3
  102. package/{normal-map-fragment-DpsIXrJf.js.map → normal-map-fragment-DradEMl-.js.map} +1 -1
  103. package/pack-mat4-with-offset-BqB8Jqo7.js +37 -0
  104. package/pack-mat4-with-offset-BqB8Jqo7.js.map +1 -0
  105. package/package.json +3 -3
  106. package/{parse-camera-DM3oJJeT.js → parse-camera-CgV4bWc0.js} +2 -2
  107. package/{parse-camera-DM3oJJeT.js.map → parse-camera-CgV4bWc0.js.map} +1 -1
  108. package/pbr-fog-wgsl-BqdCid6r.js +8 -0
  109. package/pbr-fog-wgsl-BqdCid6r.js.map +1 -0
  110. package/{pbr-metallic-roughness-block-h_KAOZrW.js → pbr-metallic-roughness-block-BFwZj2Nw.js} +2 -2
  111. package/{pbr-metallic-roughness-block-h_KAOZrW.js.map → pbr-metallic-roughness-block-BFwZj2Nw.js.map} +1 -1
  112. package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js → pbr-metallic-roughness-block-full-5t0HT3xl.js} +2 -2
  113. package/{pbr-metallic-roughness-block-full-6vMm1Jk6.js.map → pbr-metallic-roughness-block-full-5t0HT3xl.js.map} +1 -1
  114. package/{pbr-mr-helper-core-CIwm-T1G.js → pbr-mr-helper-core-R5tOZ8Ap.js} +2 -2
  115. package/{pbr-mr-helper-core-CIwm-T1G.js.map → pbr-mr-helper-core-R5tOZ8Ap.js.map} +1 -1
  116. package/{pbr-refraction-DGmMSa2v.js → pbr-refraction-Dd11HnaI.js} +2 -2
  117. package/{pbr-refraction-DGmMSa2v.js.map → pbr-refraction-Dd11HnaI.js.map} +1 -1
  118. package/{pbr-renderable-BJxUtPBb.js → pbr-renderable-BHAdF5Vw.js} +80 -38
  119. package/pbr-renderable-BHAdF5Vw.js.map +1 -0
  120. package/{pbr-shadow-fragment-LO9SlbJj.js → pbr-shadow-fragment-BxUrFJYZ.js} +6 -1
  121. package/pbr-shadow-fragment-BxUrFJYZ.js.map +1 -0
  122. package/{pbr-template-ext-8q7BcTDf.js → pbr-template-ext-CGgB2n2y.js} +3 -2
  123. package/{pbr-template-ext-8q7BcTDf.js.map → pbr-template-ext-CGgB2n2y.js.map} +1 -1
  124. package/{pbr-tracking-B3alzn91.js → pbr-tracking-D6i3yPb7.js} +2 -2
  125. package/{pbr-tracking-B3alzn91.js.map → pbr-tracking-D6i3yPb7.js.map} +1 -1
  126. package/pbr-transmission-ext-Dll8EYwE.js +190 -0
  127. package/pbr-transmission-ext-Dll8EYwE.js.map +1 -0
  128. package/{reflectance-fragment-BCrgPmrt.js → reflectance-fragment-ejMJ4O1o.js} +2 -2
  129. package/{reflectance-fragment-BCrgPmrt.js.map → reflectance-fragment-ejMJ4O1o.js.map} +1 -1
  130. package/{shader-renderable-D-6796KR.js → shader-renderable-BMf_vvO0.js} +41 -12
  131. package/shader-renderable-BMf_vvO0.js.map +1 -0
  132. package/shader-thin-instance-5_WUfi3m.js +150 -0
  133. package/shader-thin-instance-5_WUfi3m.js.map +1 -0
  134. package/shadow-fragment-core-DHN2G6FI.js.map +1 -1
  135. package/{sheen-fragment-Dze2f7XJ.js → sheen-fragment-CS6z29Fs.js} +2 -2
  136. package/{sheen-fragment-Dze2f7XJ.js.map → sheen-fragment-CS6z29Fs.js.map} +1 -1
  137. package/{singlelight-directional-wgsl-CmUDZxwz.js → singlelight-directional-wgsl-4MIgZMeC.js} +2 -2
  138. package/{singlelight-directional-wgsl-CmUDZxwz.js.map → singlelight-directional-wgsl-4MIgZMeC.js.map} +1 -1
  139. package/{singlelight-hemispheric-wgsl-t-83IP_s.js → singlelight-hemispheric-wgsl-CK-GUYWe.js} +2 -2
  140. package/{singlelight-hemispheric-wgsl-t-83IP_s.js.map → singlelight-hemispheric-wgsl-CK-GUYWe.js.map} +1 -1
  141. package/{singlelight-point-wgsl-CLzULIYV.js → singlelight-point-wgsl-CYtzqCbP.js} +2 -2
  142. package/{singlelight-point-wgsl-CLzULIYV.js.map → singlelight-point-wgsl-CYtzqCbP.js.map} +1 -1
  143. package/{singlelight-spot-wgsl-DEEUrfVM.js → singlelight-spot-wgsl-DVbaVufF.js} +2 -2
  144. package/{singlelight-spot-wgsl-DEEUrfVM.js.map → singlelight-spot-wgsl-DVbaVufF.js.map} +1 -1
  145. package/{skeleton-fragment-B_XlFbtx.js → skeleton-fragment-BOVmc8YS.js} +2 -2
  146. package/{skeleton-fragment-B_XlFbtx.js.map → skeleton-fragment-BOVmc8YS.js.map} +1 -1
  147. package/{skybox-renderable-DDwzu-PT.js → skybox-renderable-DDcCPSly.js} +3 -3
  148. package/{skybox-renderable-DDwzu-PT.js.map → skybox-renderable-DDcCPSly.js.map} +1 -1
  149. package/{standard-renderable-GjxL9xSf.js → standard-renderable-D1bhoF0K.js} +27 -81
  150. package/standard-renderable-D1bhoF0K.js.map +1 -0
  151. package/{std-ambient-fragment-BoUsD06w.js → std-ambient-fragment-C6WNm8dQ.js} +2 -2
  152. package/{std-ambient-fragment-BoUsD06w.js.map → std-ambient-fragment-C6WNm8dQ.js.map} +1 -1
  153. package/{std-cube-reflection-fragment-ulqc3bsP.js → std-cube-reflection-fragment-Bqutpy2q.js} +2 -2
  154. package/{std-cube-reflection-fragment-ulqc3bsP.js.map → std-cube-reflection-fragment-Bqutpy2q.js.map} +1 -1
  155. package/{std-emissive-fragment-DNGj1HdQ.js → std-emissive-fragment-B-A83rqX.js} +2 -2
  156. package/{std-emissive-fragment-DNGj1HdQ.js.map → std-emissive-fragment-B-A83rqX.js.map} +1 -1
  157. package/{std-lightmap-fragment-Bqj89aIe.js → std-lightmap-fragment-Df7KJezh.js} +2 -2
  158. package/{std-lightmap-fragment-Bqj89aIe.js.map → std-lightmap-fragment-Df7KJezh.js.map} +1 -1
  159. package/{std-opacity-fragment-KuPh5N2Z.js → std-opacity-fragment-D9et2jip.js} +2 -2
  160. package/{std-opacity-fragment-KuPh5N2Z.js.map → std-opacity-fragment-D9et2jip.js.map} +1 -1
  161. package/{std-reflection-fragment-BA5Ghn_M.js → std-reflection-fragment-DBJeT-yg.js} +2 -2
  162. package/{std-reflection-fragment-BA5Ghn_M.js.map → std-reflection-fragment-DBJeT-yg.js.map} +1 -1
  163. package/std-shadow-fragment-C6fD8rW-.js +13 -0
  164. package/std-shadow-fragment-C6fD8rW-.js.map +1 -0
  165. package/{std-specular-fragment-CE-6scqd.js → std-specular-fragment-C2ZOss-t.js} +2 -2
  166. package/{std-specular-fragment-CE-6scqd.js.map → std-specular-fragment-C2ZOss-t.js.map} +1 -1
  167. package/{std-tracking-CNKZ-hJN.js → std-tracking-C4L4nQGc.js} +2 -2
  168. package/{std-tracking-CNKZ-hJN.js.map → std-tracking-C4L4nQGc.js.map} +1 -1
  169. package/{subsurface-fragment-liM3y2-P.js → subsurface-fragment-C1H4ytqK.js} +2 -2
  170. package/{subsurface-fragment-liM3y2-P.js.map → subsurface-fragment-C1H4ytqK.js.map} +1 -1
  171. package/thin-instance-cull-binding-CCxrPNO6.js +310 -0
  172. package/thin-instance-cull-binding-CCxrPNO6.js.map +1 -0
  173. package/{thin-instance-gpu-C9Gv_Z1w.js → thin-instance-gpu-E8DBd8XL.js} +20 -3
  174. package/thin-instance-gpu-E8DBd8XL.js.map +1 -0
  175. package/{tracking-primitives-wgdBY85t.js → tracking-primitives-w4BVV9p9.js} +2 -2
  176. package/{tracking-primitives-wgdBY85t.js.map → tracking-primitives-w4BVV9p9.js.map} +1 -1
  177. package/{unlit-fragment-BIlhJpz6.js → unlit-fragment-DU9_mhzZ.js} +2 -2
  178. package/{unlit-fragment-BIlhJpz6.js.map → unlit-fragment-DU9_mhzZ.js.map} +1 -1
  179. package/{wgsl-helpers-DyzNzCeE.js → wgsl-helpers-D8sl1VVA.js} +4 -4
  180. package/{wgsl-helpers-DyzNzCeE.js.map → wgsl-helpers-D8sl1VVA.js.map} +1 -1
  181. package/background-dds-skybox-yHTqabU3.js.map +0 -1
  182. package/background-ground-DIw6D3qf.js.map +0 -1
  183. package/background-hdr-skybox-c4uuTmkP.js.map +0 -1
  184. package/gltf-ext-basisu-CPg5kPrx.js.map +0 -1
  185. package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +0 -1
  186. package/index-C8HOR2sB.js.map +0 -1
  187. package/mesh-features-BLENkYVt.js.map +0 -1
  188. package/node-renderable-DlLIdBmd.js.map +0 -1
  189. package/pbr-renderable-BJxUtPBb.js.map +0 -1
  190. package/pbr-shadow-fragment-LO9SlbJj.js.map +0 -1
  191. package/pbr-transmission-ext-BxW4CEGu.js +0 -581
  192. package/pbr-transmission-ext-BxW4CEGu.js.map +0 -1
  193. package/shader-renderable-D-6796KR.js.map +0 -1
  194. package/standard-renderable-GjxL9xSf.js.map +0 -1
  195. package/std-shadow-fragment-FNQfrJuC.js +0 -8
  196. package/std-shadow-fragment-FNQfrJuC.js.map +0 -1
  197. package/thin-instance-gpu-C9Gv_Z1w.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"node-registry-extra-compat-Dhrw8fDQ.js","sources":["../src/material/node/node-registry-extra-compat.ts"],"sourcesContent":["import type { BlockEmitter } from \"./node-types.js\";\nimport type { BlockLoader } from \"./node-registry.js\";\n\nfunction blockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"ElbowBlock\":\n return () => import(\"./blocks/elbow-block.js\");\n case \"NodeMaterialTeleportInBlock\":\n return () => import(\"./blocks/teleport-in-block.js\");\n case \"NodeMaterialTeleportOutBlock\":\n return () => import(\"./blocks/teleport-out-block.js\");\n case \"NodeMaterialDebugBlock\":\n return () => import(\"./blocks/debug-block.js\");\n case \"MeshAttributeExistsBlock\":\n return () => import(\"./blocks/mesh-attribute-exists-block.js\");\n case \"ClipPlanesBlock\":\n return () => import(\"./blocks/clip-planes-block.js\");\n case \"ReflectionTextureBaseBlock\":\n return () => import(\"./blocks/reflection-texture-base-block.js\");\n case \"ImageProcessingBlock\":\n return () => import(\"./blocks/image-processing-block.js\");\n case \"IridescenceBlock\":\n return () => import(\"./blocks/iridescence-block.js\");\n case \"LoopBlock\":\n return () => import(\"./blocks/loop-block.js\");\n case \"StorageReadBlock\":\n return () => import(\"./blocks/storage-read-block.js\");\n case \"StorageWriteBlock\":\n return () => import(\"./blocks/storage-write-block.js\");\n default:\n return null;\n }\n}\n\nexport async function loadExtraEmitter(key: string): Promise<BlockEmitter> {\n const loader = blockLoader(key);\n if (!loader) {\n throw new Error(`NodeMaterial: no compatibility extension emitter registered for block \"${key}\"`);\n }\n return (await loader()).emitter;\n}\n"],"names":[],"mappings":"AAGA,SAAS,YAAY,KAAiC;AAClD,UAAQ,KAAA;AAAA,IACJ,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,kCAAgC;AAAA,IACxD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,2CAAyC;AAAA,IACjE,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,6CAA2C;AAAA,IACnE,KAAK;AACD,aAAO,MAAM,OAAO,sCAAoC;AAAA,IAC5D,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,0BAAwB;AAAA,IAChD,KAAK;AACD,aAAO,MAAM,OAAO,kCAAgC;AAAA,IACxD,KAAK;AACD,aAAO,MAAM,OAAO,mCAAiC;AAAA,IACzD;AACI,aAAO;AAAA,EAAA;AAEnB;AAEA,eAAsB,iBAAiB,KAAoC;AACvE,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,0EAA0E,GAAG,GAAG;AAAA,EACpG;AACA,UAAQ,MAAM,UAAU;AAC5B;"}
1
+ {"version":3,"file":"node-registry-extra-compat-Ch7ApZHF.js","sources":["../src/material/node/node-registry-extra-compat.ts"],"sourcesContent":["import type { BlockEmitter } from \"./node-types.js\";\nimport type { BlockLoader } from \"./node-registry.js\";\n\nfunction blockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"ElbowBlock\":\n return () => import(\"./blocks/elbow-block.js\");\n case \"NodeMaterialTeleportInBlock\":\n return () => import(\"./blocks/teleport-in-block.js\");\n case \"NodeMaterialTeleportOutBlock\":\n return () => import(\"./blocks/teleport-out-block.js\");\n case \"NodeMaterialDebugBlock\":\n return () => import(\"./blocks/debug-block.js\");\n case \"MeshAttributeExistsBlock\":\n return () => import(\"./blocks/mesh-attribute-exists-block.js\");\n case \"ClipPlanesBlock\":\n return () => import(\"./blocks/clip-planes-block.js\");\n case \"ReflectionTextureBaseBlock\":\n return () => import(\"./blocks/reflection-texture-base-block.js\");\n case \"ImageProcessingBlock\":\n return () => import(\"./blocks/image-processing-block.js\");\n case \"IridescenceBlock\":\n return () => import(\"./blocks/iridescence-block.js\");\n case \"LoopBlock\":\n return () => import(\"./blocks/loop-block.js\");\n case \"StorageReadBlock\":\n return () => import(\"./blocks/storage-read-block.js\");\n case \"StorageWriteBlock\":\n return () => import(\"./blocks/storage-write-block.js\");\n default:\n return null;\n }\n}\n\nexport async function loadExtraEmitter(key: string): Promise<BlockEmitter> {\n const loader = blockLoader(key);\n if (!loader) {\n throw new Error(`NodeMaterial: no compatibility extension emitter registered for block \"${key}\"`);\n }\n return (await loader()).emitter;\n}\n"],"names":[],"mappings":"AAGA,SAAS,YAAY,KAAiC;AAClD,UAAQ,KAAA;AAAA,IACJ,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,kCAAgC;AAAA,IACxD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,2CAAyC;AAAA,IACjE,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,6CAA2C;AAAA,IACnE,KAAK;AACD,aAAO,MAAM,OAAO,sCAAoC;AAAA,IAC5D,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,0BAAwB;AAAA,IAChD,KAAK;AACD,aAAO,MAAM,OAAO,kCAAgC;AAAA,IACxD,KAAK;AACD,aAAO,MAAM,OAAO,mCAAiC;AAAA,IACzD;AACI,aAAO;AAAA,EAAA;AAEnB;AAEA,eAAsB,iBAAiB,KAAoC;AACvE,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,0EAA0E,GAAG,GAAG;AAAA,EACpG;AACA,UAAQ,MAAM,UAAU;AAC5B;"}
@@ -27,7 +27,7 @@ function blockLoader(key) {
27
27
  case "ConditionalBlock":
28
28
  return () => import("./conditional-block-Cd2pbejI.js");
29
29
  case "CurveBlock":
30
- return () => import("./curve-block-BlJpXVYv.js");
30
+ return () => import("./curve-block-Dh_xdUj-.js");
31
31
  case "WaveBlock":
32
32
  return () => import("./wave-block-CY_mk1ec.js");
33
33
  case "RandomNumberBlock":
@@ -46,4 +46,4 @@ async function loadExtraEmitter(key) {
46
46
  export {
47
47
  loadExtraEmitter
48
48
  };
49
- //# sourceMappingURL=node-registry-extra-math-CsAHvIZo.js.map
49
+ //# sourceMappingURL=node-registry-extra-math-6ezzTkPj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-registry-extra-math-CsAHvIZo.js","sources":["../src/material/node/node-registry-extra-math.ts"],"sourcesContent":["import type { BlockEmitter } from \"./node-types.js\";\nimport type { BlockLoader } from \"./node-registry.js\";\n\nfunction blockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"DivideBlock\":\n return () => import(\"./blocks/divide-block.js\");\n case \"ModBlock\":\n return () => import(\"./blocks/mod-block.js\");\n case \"ReciprocalBlock\":\n return () => import(\"./blocks/reciprocal-block.js\");\n case \"LengthBlock\":\n return () => import(\"./blocks/length-block.js\");\n case \"DistanceBlock\":\n return () => import(\"./blocks/distance-block.js\");\n case \"CrossBlock\":\n return () => import(\"./blocks/cross-block.js\");\n case \"ReflectBlock\":\n return () => import(\"./blocks/reflect-block.js\");\n case \"RefractBlock\":\n return () => import(\"./blocks/refract-block.js\");\n case \"ArcTan2Block\":\n return () => import(\"./blocks/arc-tan2-block.js\");\n case \"FresnelBlock\":\n return () => import(\"./blocks/fresnel-block.js\");\n case \"OppositeBlock\":\n return () => import(\"./blocks/opposite-block.js\");\n case \"NLerpBlock\":\n return () => import(\"./blocks/nlerp-block.js\");\n case \"ConditionalBlock\":\n return () => import(\"./blocks/conditional-block.js\");\n case \"CurveBlock\":\n return () => import(\"./blocks/curve-block.js\");\n case \"WaveBlock\":\n return () => import(\"./blocks/wave-block.js\");\n case \"RandomNumberBlock\":\n return () => import(\"./blocks/random-number-block.js\");\n default:\n return null;\n }\n}\n\nexport async function loadExtraEmitter(key: string): Promise<BlockEmitter> {\n const loader = blockLoader(key);\n if (!loader) {\n throw new Error(`NodeMaterial: no math extension emitter registered for block \"${key}\"`);\n }\n return (await loader()).emitter;\n}\n"],"names":[],"mappings":"AAGA,SAAS,YAAY,KAAiC;AAClD,UAAQ,KAAA;AAAA,IACJ,KAAK;AACD,aAAO,MAAM,OAAO,4BAA0B;AAAA,IAClD,KAAK;AACD,aAAO,MAAM,OAAO,yBAAuB;AAAA,IAC/C,KAAK;AACD,aAAO,MAAM,OAAO,gCAA8B;AAAA,IACtD,KAAK;AACD,aAAO,MAAM,OAAO,4BAA0B;AAAA,IAClD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,0BAAwB;AAAA,IAChD,KAAK;AACD,aAAO,MAAM,OAAO,mCAAiC;AAAA,IACzD;AACI,aAAO;AAAA,EAAA;AAEnB;AAEA,eAAsB,iBAAiB,KAAoC;AACvE,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,iEAAiE,GAAG,GAAG;AAAA,EAC3F;AACA,UAAQ,MAAM,UAAU;AAC5B;"}
1
+ {"version":3,"file":"node-registry-extra-math-6ezzTkPj.js","sources":["../src/material/node/node-registry-extra-math.ts"],"sourcesContent":["import type { BlockEmitter } from \"./node-types.js\";\nimport type { BlockLoader } from \"./node-registry.js\";\n\nfunction blockLoader(key: string): BlockLoader | null {\n switch (key) {\n case \"DivideBlock\":\n return () => import(\"./blocks/divide-block.js\");\n case \"ModBlock\":\n return () => import(\"./blocks/mod-block.js\");\n case \"ReciprocalBlock\":\n return () => import(\"./blocks/reciprocal-block.js\");\n case \"LengthBlock\":\n return () => import(\"./blocks/length-block.js\");\n case \"DistanceBlock\":\n return () => import(\"./blocks/distance-block.js\");\n case \"CrossBlock\":\n return () => import(\"./blocks/cross-block.js\");\n case \"ReflectBlock\":\n return () => import(\"./blocks/reflect-block.js\");\n case \"RefractBlock\":\n return () => import(\"./blocks/refract-block.js\");\n case \"ArcTan2Block\":\n return () => import(\"./blocks/arc-tan2-block.js\");\n case \"FresnelBlock\":\n return () => import(\"./blocks/fresnel-block.js\");\n case \"OppositeBlock\":\n return () => import(\"./blocks/opposite-block.js\");\n case \"NLerpBlock\":\n return () => import(\"./blocks/nlerp-block.js\");\n case \"ConditionalBlock\":\n return () => import(\"./blocks/conditional-block.js\");\n case \"CurveBlock\":\n return () => import(\"./blocks/curve-block.js\");\n case \"WaveBlock\":\n return () => import(\"./blocks/wave-block.js\");\n case \"RandomNumberBlock\":\n return () => import(\"./blocks/random-number-block.js\");\n default:\n return null;\n }\n}\n\nexport async function loadExtraEmitter(key: string): Promise<BlockEmitter> {\n const loader = blockLoader(key);\n if (!loader) {\n throw new Error(`NodeMaterial: no math extension emitter registered for block \"${key}\"`);\n }\n return (await loader()).emitter;\n}\n"],"names":[],"mappings":"AAGA,SAAS,YAAY,KAAiC;AAClD,UAAQ,KAAA;AAAA,IACJ,KAAK;AACD,aAAO,MAAM,OAAO,4BAA0B;AAAA,IAClD,KAAK;AACD,aAAO,MAAM,OAAO,yBAAuB;AAAA,IAC/C,KAAK;AACD,aAAO,MAAM,OAAO,gCAA8B;AAAA,IACtD,KAAK;AACD,aAAO,MAAM,OAAO,4BAA0B;AAAA,IAClD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,6BAA2B;AAAA,IACnD,KAAK;AACD,aAAO,MAAM,OAAO,8BAA4B;AAAA,IACpD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,iCAA+B;AAAA,IACvD,KAAK;AACD,aAAO,MAAM,OAAO,2BAAyB;AAAA,IACjD,KAAK;AACD,aAAO,MAAM,OAAO,0BAAwB;AAAA,IAChD,KAAK;AACD,aAAO,MAAM,OAAO,mCAAiC;AAAA,IACzD;AACI,aAAO;AAAA,EAAA;AAEnB;AAEA,eAAsB,iBAAiB,KAAoC;AACvE,QAAM,SAAS,YAAY,GAAG;AAC9B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,iEAAiE,GAAG,GAAG;AAAA,EAC3F;AACA,UAAQ,MAAM,UAAU;AAC5B;"}
@@ -1,4 +1,4 @@
1
- import { c as compileNodePipeline, w as writeNodeUBO, a as writeMeshLightSelection, N as NODE_ESM_SHADOW_OUTPUT, b as NODE_NO_COLOR_OUTPUT, M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
1
+ import { c as compileNodePipeline, w as writeNodeUBO, p as packMat4IntoF32, a as writeMeshLightSelection, N as NODE_ESM_SHADOW_OUTPUT, b as NODE_NO_COLOR_OUTPUT, M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
2
2
  const emptyMorphByEngine = /* @__PURE__ */ new WeakMap();
3
3
  function getEmptyMorph(engine) {
4
4
  const cached = emptyMorphByEngine.get(engine);
@@ -24,7 +24,7 @@ function getEmptyMorph(engine) {
24
24
  return entry;
25
25
  }
26
26
  function buildNodeMeshRenderables(scene, meshes, materialOverride) {
27
- var _a, _b, _c, _d;
27
+ var _a, _b, _c, _d, _e, _f, _g, _h;
28
28
  const engine = scene.engine;
29
29
  const device = engine._device;
30
30
  const byMaterial = /* @__PURE__ */ new Map();
@@ -53,7 +53,13 @@ function buildNodeMeshRenderables(scene, meshes, materialOverride) {
53
53
  _noColorOutput: noColorOutput,
54
54
  _esmShadowOutput: esmShadowOutput,
55
55
  _esmShadowDepthCode: esmShadowOutput ? material._esmShadowDepthCode : void 0,
56
- _alphaMode: esmShadowOutput ? 0 : void 0
56
+ _alphaMode: esmShadowOutput ? 0 : void 0,
57
+ // The shared fragment body still references env IBL/BRDF samplers
58
+ // (e.g. nmeBrdfLUT) even in the no-color shadow-depth variant, so we
59
+ // must emit the env decls + BGL entries here too; otherwise WGSL fails
60
+ // to resolve those identifiers. _envEmitter is undefined for non-env
61
+ // materials (state.usesEnv === false), leaving them unaffected.
62
+ _envEmitter: (_b = material._envHelpers) == null ? void 0 : _b.emitEnv
57
63
  }) : material._compile;
58
64
  const meshBGL = compile._meshBGL;
59
65
  let nodeUBO = null;
@@ -62,12 +68,13 @@ function buildNodeMeshRenderables(scene, meshes, materialOverride) {
62
68
  writeNodeUBO(engine, nodeUBO, material);
63
69
  material._nodeUBO = nodeUBO;
64
70
  }
71
+ const _packMeshWorld = ((_c = engine._makePackMeshWorld) == null ? void 0 : _c.call(engine, scene)) ?? packMat4IntoF32;
65
72
  const packets = [];
66
73
  for (const _mesh of matMeshes) {
67
74
  const meshUboBytes = 96 + 16 * Math.ceil(MAX_LIGHTS / 4);
68
75
  const _meshUBO = device.createBuffer({ label: "node-mesh-ubo", size: meshUboBytes + 15 & -16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
69
76
  const _meshScratch = new Float32Array((meshUboBytes + 15 & -16) / 4);
70
- _meshScratch.set(_mesh.worldMatrix, 0);
77
+ _packMeshWorld(_meshScratch, _mesh.worldMatrix, 0, 0);
71
78
  const recv = _mesh.receiveShadows ? 1 : 0;
72
79
  _meshScratch[16] = recv;
73
80
  if (compile._usesMeshAttributeFlags) {
@@ -133,7 +140,7 @@ function buildNodeMeshRenderables(scene, meshes, materialOverride) {
133
140
  const recvChanged = recv !== pkt._lastReceivesShadow;
134
141
  const lightsChanged = scene.lights.length !== pkt._lastLightsCount;
135
142
  if (worldChanged || recvChanged || lightsChanged) {
136
- pkt._meshScratch.set(pkt._mesh.worldMatrix, 0);
143
+ _packMeshWorld(pkt._meshScratch, pkt._mesh.worldMatrix, 0, 0);
137
144
  pkt._meshScratch[16] = recv;
138
145
  if (compile._usesMeshAttributeFlags) {
139
146
  writeAttributeFlags(pkt._mesh, pkt._meshScratch);
@@ -165,11 +172,11 @@ function buildNodeMeshRenderables(scene, meshes, materialOverride) {
165
172
  if (isTransparent) {
166
173
  for (const pkt of packets) {
167
174
  const wm = pkt._mesh.worldMatrix;
168
- const cx = ((_b = pkt._mesh.position) == null ? void 0 : _b.x) ?? wm[12];
169
- const cy = ((_c = pkt._mesh.position) == null ? void 0 : _c.y) ?? wm[13];
170
- const cz = ((_d = pkt._mesh.position) == null ? void 0 : _d.z) ?? wm[14];
175
+ const cx = ((_d = pkt._mesh.position) == null ? void 0 : _d.x) ?? wm[12];
176
+ const cy = ((_e = pkt._mesh.position) == null ? void 0 : _e.y) ?? wm[13];
177
+ const cz = ((_f = pkt._mesh.position) == null ? void 0 : _f.z) ?? wm[14];
171
178
  const sortCenter = [cx, cy, cz];
172
- const update = () => {
179
+ const _baseUpdate = () => {
173
180
  updatePacketUBO(pkt);
174
181
  updateNodeUBO();
175
182
  const m = pkt._mesh.worldMatrix;
@@ -177,6 +184,10 @@ function buildNodeMeshRenderables(scene, meshes, materialOverride) {
177
184
  sortCenter[1] = m[13];
178
185
  sortCenter[2] = m[14];
179
186
  };
187
+ const _invalidate = () => {
188
+ pkt._lastWorldVersion = -1;
189
+ };
190
+ const update = ((_g = engine._wrapRenderableForFO) == null ? void 0 : _g.call(engine, _baseUpdate, scene, _invalidate)) ?? _baseUpdate;
180
191
  const draw = (pass) => {
181
192
  drawPacket(pass, pkt);
182
193
  return 1;
@@ -193,12 +204,18 @@ function buildNodeMeshRenderables(scene, meshes, materialOverride) {
193
204
  renderables.push(rTrans);
194
205
  }
195
206
  } else {
196
- const update = () => {
207
+ const _baseUpdate = () => {
197
208
  for (const pkt of packets) {
198
209
  updatePacketUBO(pkt);
199
210
  }
200
211
  updateNodeUBO();
201
212
  };
213
+ const _invalidate = () => {
214
+ for (const pkt of packets) {
215
+ pkt._lastWorldVersion = -1;
216
+ }
217
+ };
218
+ const update = ((_h = engine._wrapRenderableForFO) == null ? void 0 : _h.call(engine, _baseUpdate, scene, _invalidate)) ?? _baseUpdate;
202
219
  const draw = (pass) => {
203
220
  let draws = 0;
204
221
  for (const pkt of packets) {
@@ -266,4 +283,4 @@ function writeAttributeFlags(mesh, scratch) {
266
283
  export {
267
284
  buildNodeMeshRenderables
268
285
  };
269
- //# sourceMappingURL=node-renderable-DlLIdBmd.js.map
286
+ //# sourceMappingURL=node-renderable-CS0CmsSp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-renderable-CS0CmsSp.js","sources":["../src/material/node/node-renderable.ts"],"sourcesContent":["/** Node Material — MeshGroupBuilder + Renderable implementation.\n *\n * Parallel to `standard-renderable.ts`. Each NodeMaterial owns one compile\n * result (pipeline + BGLs); this builder creates per-mesh GPU resources\n * (mesh UBO, node UBO, bind groups) and returns a Renderable\n * that emits draws in the main pass.\n */\n\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { SceneContext } from \"../../scene/scene.js\";\nimport type { Mesh } from \"../../mesh/mesh.js\";\nimport type { MeshGPU } from \"../../mesh/mesh.js\";\nimport type { MeshGroupBuildResult, Renderable } from \"../../render/renderable.js\";\nimport type { Material } from \"../material.js\";\nimport type { NodeMaterial } from \"./node-material.js\";\nimport { writeNodeUBO } from \"./node-material.js\";\nimport { compileNodePipeline } from \"./node-pipeline.js\";\nimport { NODE_ESM_SHADOW_OUTPUT, NODE_NO_COLOR_OUTPUT } from \"./node-flags.js\";\nimport { writeMeshLightSelection } from \"../../render/lights-ubo.js\";\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport { packMat4IntoF32 } from \"../../math/pack-mat4-into-f32.js\";\n\n// Per-engine cached no-op morph target: a 1×1 rgba32float texture + a UBO with\n// count=0 + sensible texWidth/rowsPerBand. Meshes without their own morph\n// targets reuse this so materials that contain a MorphTargetsBlock still work\n// (the WGSL loops over `count` and passes through when zero).\nconst emptyMorphByEngine = new WeakMap<EngineContext, { texture: GPUTexture; weightsBuffer: GPUBuffer }>();\nfunction getEmptyMorph(engine: EngineContext): { texture: GPUTexture; weightsBuffer: GPUBuffer } {\n const cached = emptyMorphByEngine.get(engine);\n if (cached) {\n return cached;\n }\n const texture = engine._device.createTexture({\n label: \"node-morph-empty\",\n size: [1, 1],\n format: \"rgba32float\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n engine._device.queue.writeTexture({ texture }, new Float32Array([0, 0, 0, 0]).buffer, { bytesPerRow: 16 }, { width: 1, height: 1 });\n const ubo = new ArrayBuffer(32);\n const u32 = new Uint32Array(ubo, 16, 4);\n u32[0] = 0; // count\n u32[1] = 1; // texWidth\n u32[2] = 1; // rowsPerBand\n const weightsBuffer = engine._device.createBuffer({ label: \"node-morph-empty-ubo\", size: 32, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n engine._device.queue.writeBuffer(weightsBuffer, 0, new Uint8Array(ubo));\n const entry = { texture, weightsBuffer };\n emptyMorphByEngine.set(engine, entry);\n return entry;\n}\n\ninterface NodePacket {\n readonly _mesh: Mesh;\n readonly _meshUBO: GPUBuffer;\n readonly _meshBG: GPUBindGroup;\n readonly _meshScratch: Float32Array;\n _lastWorldVersion: number;\n _lastReceivesShadow: number;\n _lastLightsCount: number;\n}\n\ntype NodeRenderPass = GPURenderPassEncoder | GPURenderBundleEncoder;\n\n/** Build NME renderables for a set of meshes that share a NodeMaterial. */\nexport function buildNodeMeshRenderables(scene: SceneContext, meshes: Mesh[], materialOverride?: Material): MeshGroupBuildResult {\n const engine = scene.engine;\n const device = engine._device;\n\n // All meshes in this group use the same NodeMaterial (scene-core batches by ctor).\n // We deliberately do NOT re-group by material instance: each renderable loops\n // packets of the same pipeline. For phase 1 every mesh with an NME material\n // shares that one material instance.\n const byMaterial = new Map<NodeMaterial, Mesh[]>();\n for (const m of meshes) {\n const mat = (materialOverride ?? m.material) as NodeMaterial;\n let list = byMaterial.get(mat);\n if (!list) {\n list = [];\n byMaterial.set(mat, list);\n }\n list.push(m);\n }\n\n const renderables: Renderable[] = [];\n\n for (const [material, matMeshes] of byMaterial) {\n const featureFlags = material._renderFeatures?.features ?? 0;\n const noColorOutput = (featureFlags & NODE_NO_COLOR_OUTPUT) !== 0;\n const esmShadowOutput = (featureFlags & NODE_ESM_SHADOW_OUTPUT) !== 0;\n const shadowOutput = noColorOutput || esmShadowOutput;\n const compile = shadowOutput\n ? compileNodePipeline(material._state, material._vertexBody, material._fragmentBody, {\n _engine: engine,\n _format: esmShadowOutput ? \"rgba16float\" : engine.format,\n _depthStencilFormat: \"depth32float\",\n _depthCompare: \"less-equal\",\n _msaaSamples: 1,\n _backFaceCulling: material._graph.backFaceCulling,\n _noColorOutput: noColorOutput,\n _esmShadowOutput: esmShadowOutput,\n _esmShadowDepthCode: esmShadowOutput ? material._esmShadowDepthCode : undefined,\n _alphaMode: esmShadowOutput ? 0 : undefined,\n // The shared fragment body still references env IBL/BRDF samplers\n // (e.g. nmeBrdfLUT) even in the no-color shadow-depth variant, so we\n // must emit the env decls + BGL entries here too; otherwise WGSL fails\n // to resolve those identifiers. _envEmitter is undefined for non-env\n // materials (state.usesEnv === false), leaving them unaffected.\n _envEmitter: material._envHelpers?.emitEnv,\n })\n : material._compile;\n const meshBGL = compile._meshBGL;\n\n // Node UBO is per-material (same across all meshes using it).\n let nodeUBO: GPUBuffer | null = null;\n if (compile._nodeUboBinding !== null && compile._nodeUboSize > 0) {\n nodeUBO = device.createBuffer({ label: \"node-ubo\", size: compile._nodeUboSize, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n writeNodeUBO(engine, nodeUBO, material);\n material._nodeUBO = nodeUBO;\n }\n\n const _packMeshWorld = engine._makePackMeshWorld?.(scene as SceneContext) ?? packMat4IntoF32;\n const packets: NodePacket[] = [];\n for (const _mesh of matMeshes) {\n // Mesh UBO layout: world (64B) + receivesShadow (vec4, 16B) + lightCount/indices.\n const meshUboBytes = 96 + 16 * Math.ceil(MAX_LIGHTS / 4);\n const _meshUBO = device.createBuffer({ label: \"node-mesh-ubo\", size: (meshUboBytes + 15) & ~15, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n const _meshScratch = new Float32Array(((meshUboBytes + 15) & ~15) / 4);\n _packMeshWorld(_meshScratch, _mesh.worldMatrix, 0, 0);\n const recv = _mesh.receiveShadows ? 1 : 0;\n _meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(_mesh, _meshScratch);\n }\n writeMeshLightSelection(_mesh, scene.lights, _meshScratch.subarray(4));\n device.queue.writeBuffer(_meshUBO, 0, _meshScratch);\n\n const entries: GPUBindGroupEntry[] = [{ binding: 0, resource: { buffer: _meshUBO } }];\n if (nodeUBO) {\n entries.push({ binding: compile._nodeUboBinding!, resource: { buffer: nodeUBO } });\n }\n for (const tb of compile._textureBindings) {\n const slot = material._textureSlots.get(tb._name);\n const tex = slot?.current;\n if (!tex) {\n throw new Error(\n `NodeMaterial: texture binding \"${tb._name}\" not set. Provide it via options.textures or material.inputs[\"${tb._name}\"].texture before the first render.`\n );\n }\n entries.push({ binding: tb._texBinding, resource: tex.view });\n entries.push({ binding: tb._sampBinding, resource: tex.sampler });\n }\n if (compile._morphBindings !== null) {\n const mt = (_mesh as { morphTargets?: { texture: GPUTexture; weightsBuffer: GPUBuffer } | null }).morphTargets ?? getEmptyMorph(engine);\n entries.push({ binding: compile._morphBindings._textureBinding, resource: mt.texture.createView() });\n entries.push({ binding: compile._morphBindings._uboBinding, resource: { buffer: mt.weightsBuffer } });\n }\n if (compile._envBindings) {\n material._envHelpers!.pushEnvBindGroupEntries(scene, compile._envBindings, entries);\n }\n for (let si = 0; si < compile._shadowBindings.length; si++) {\n const sb = compile._shadowBindings[si]!;\n const sg = material._shadowGenerators[si];\n if (!sg) {\n throw new Error(`NodeMaterial: material requires shadow generator #${si} but none was supplied to parseNodeMaterialFromSnippet({ shadowGenerators }).`);\n }\n entries.push({ binding: sb._texBinding, resource: sg._depthTexture.createView() });\n entries.push({ binding: sb._sampBinding, resource: sg._depthSampler });\n entries.push({ binding: sb._uboBinding, resource: { buffer: sg._shadowUBO } });\n }\n if (compile._esmShadowParamsBinding !== null) {\n entries.push({\n binding: compile._esmShadowParamsBinding,\n resource: { buffer: material._esmShadowParamsUBO! },\n });\n }\n const _meshBG = device.createBindGroup({ label: \"node-mesh-bg\", layout: meshBGL, entries });\n\n packets.push({\n _mesh,\n _meshUBO,\n _meshBG,\n _meshScratch,\n _lastWorldVersion: _mesh.worldMatrixVersion,\n _lastReceivesShadow: recv,\n _lastLightsCount: scene.lights.length,\n });\n }\n\n // Vertex attribute order (matches compile.state — captured on material).\n const attrNames = material._vertexAttrNames;\n\n const updatePacketUBO = (pkt: NodePacket): void => {\n const recv = pkt._mesh.receiveShadows ? 1 : 0;\n const worldVersion = pkt._mesh.worldMatrixVersion;\n const worldChanged = worldVersion !== pkt._lastWorldVersion;\n const recvChanged = recv !== pkt._lastReceivesShadow;\n const lightsChanged = scene.lights.length !== pkt._lastLightsCount;\n if (worldChanged || recvChanged || lightsChanged) {\n _packMeshWorld(pkt._meshScratch, pkt._mesh.worldMatrix, 0, 0);\n pkt._meshScratch[16] = recv;\n if (compile._usesMeshAttributeFlags) {\n writeAttributeFlags(pkt._mesh, pkt._meshScratch);\n }\n writeMeshLightSelection(pkt._mesh, scene.lights, pkt._meshScratch.subarray(4));\n device.queue.writeBuffer(pkt._meshUBO, 0, pkt._meshScratch as Float32Array<ArrayBuffer>);\n pkt._lastWorldVersion = worldVersion;\n pkt._lastReceivesShadow = recv;\n pkt._lastLightsCount = scene.lights.length;\n }\n };\n\n const updateNodeUBO = (): void => {\n if (nodeUBO && material._uboDirty) {\n material._uboDirty = false;\n writeNodeUBO(engine, nodeUBO, material);\n }\n };\n\n const drawPacket = (pass: NodeRenderPass, pkt: NodePacket): void => {\n const g = pkt._mesh._gpu;\n for (let i = 0; i < attrNames.length; i++) {\n const buf = getAttrBuffer(engine, g, attrNames[i]!);\n pass.setVertexBuffer(i, buf);\n }\n pass.setIndexBuffer(g.indexBuffer, g.indexFormat);\n pass.setBindGroup(1, pkt._meshBG);\n pass.drawIndexed(g.indexCount);\n };\n\n const isTransparent = !noColorOutput && !esmShadowOutput && material._needsAlphaBlending;\n\n if (isTransparent) {\n // Transparent materials: one renderable per mesh so each gets an\n // independent _worldCenter for back-to-front distance sorting.\n for (const pkt of packets) {\n const wm = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n const cx = pkt._mesh.position?.x ?? wm[12]!;\n const cy = pkt._mesh.position?.y ?? wm[13]!;\n const cz = pkt._mesh.position?.z ?? wm[14]!;\n const sortCenter: [number, number, number] = [cx, cy, cz];\n const _baseUpdate = (): void => {\n updatePacketUBO(pkt);\n updateNodeUBO();\n // Update world center for sorting.\n const m = pkt._mesh.worldMatrix as unknown as ArrayLike<number>;\n sortCenter[0] = m[12]!;\n sortCenter[1] = m[13]!;\n sortCenter[2] = m[14]!;\n };\n const _invalidate = (): void => {\n pkt._lastWorldVersion = -1;\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene as SceneContext, _invalidate) ?? _baseUpdate;\n const draw = (pass: NodeRenderPass): number => {\n drawPacket(pass, pkt);\n return 1;\n };\n const rTrans: Renderable = {\n order: 200,\n isTransparent: true,\n mesh: pkt._mesh,\n _worldCenter: sortCenter,\n bind() {\n return { renderable: rTrans, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rTrans);\n }\n } else {\n // Opaque: batch all meshes into one renderable for state efficiency.\n const _baseUpdate = (): void => {\n for (const pkt of packets) {\n updatePacketUBO(pkt);\n }\n updateNodeUBO();\n };\n const _invalidate = (): void => {\n for (const pkt of packets) {\n pkt._lastWorldVersion = -1;\n }\n };\n const update = engine._wrapRenderableForFO?.(_baseUpdate, scene as SceneContext, _invalidate) ?? _baseUpdate;\n const draw = (pass: NodeRenderPass): number => {\n let draws = 0;\n for (const pkt of packets) {\n drawPacket(pass, pkt);\n draws++;\n }\n return draws;\n };\n const rOpaque: Renderable = {\n order: 100,\n isTransparent: false,\n bind() {\n return { renderable: rOpaque, pipeline: compile._pipeline, update, draw };\n },\n };\n renderables.push(rOpaque);\n }\n }\n\n const rebuildSingle = (s: SceneContext, mesh: Mesh, override?: Material): Renderable => {\n return buildNodeMeshRenderables(s, [mesh], override).renderables[0]!;\n };\n\n return { renderables, rebuildSingle };\n}\n\n// Per-gpu-object cached zero buffers for attributes that a NodeMaterial's\n// vertex layout declares but the mesh itself doesn't provide (e.g. vertex\n// color on meshes that don't use VERTEXCOLOR). We allocate one zero buffer\n// lazily per gpu object, sized to its position vertex count × stride.\nconst zeroAttrCache = new WeakMap<object, Map<string, GPUBuffer>>();\nfunction getZeroAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n let cache = zeroAttrCache.get(gpu as unknown as object);\n if (!cache) {\n cache = new Map();\n zeroAttrCache.set(gpu as unknown as object, cache);\n }\n const existing = cache.get(name);\n if (existing) {\n return existing;\n }\n // position buffer size in bytes / 12 (vec3) = vertex count.\n const vertexCount = gpu.positionBuffer.size / 12;\n const stride = name === \"uv\" || name === \"uv2\" ? 8 : name === \"normal\" ? 12 : name === \"tangent\" || name === \"color\" ? 16 : 16;\n const buf = engine._device.createBuffer({ label: `node-zero-${name}`, size: vertexCount * stride, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST });\n // Initialize with zeros (buffer starts zeroed when not mappedAtCreation).\n cache.set(name, buf);\n return buf;\n}\n\nfunction getAttrBuffer(engine: EngineContext, gpu: MeshGPU, name: string): GPUBuffer {\n switch (name) {\n case \"position\":\n return gpu.positionBuffer;\n case \"normal\":\n return gpu.normalBuffer;\n case \"uv\":\n return gpu.uvBuffer;\n case \"uv2\":\n return gpu.uv2Buffer ?? getZeroAttrBuffer(engine, gpu, \"uv2\");\n case \"tangent\":\n return gpu.tangentBuffer ?? getZeroAttrBuffer(engine, gpu, \"tangent\");\n case \"color\":\n return gpu.colorBuffer ?? getZeroAttrBuffer(engine, gpu, \"color\");\n default:\n throw new Error(`NodeMaterial: unsupported attribute \"${name}\"`);\n }\n}\n\nfunction writeAttributeFlags(mesh: Mesh, scratch: Float32Array): void {\n const gpu = mesh._gpu;\n scratch[17] = gpu.hasUv === false ? 0 : 1;\n scratch[18] = gpu.hasTangent ? 1 : 0;\n scratch[19] = gpu.hasColor ? 1 : 0;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
1
+ import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
2
2
  const SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;
3
3
  const SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill("1.0").join(", ")})`;
4
4
  function emitShadow(shadowLights, startBinding, varyings) {
@@ -119,4 +119,4 @@ fn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f
119
119
  export {
120
120
  emitShadow
121
121
  };
122
- //# sourceMappingURL=node-shadow-DKrcqmNg.js.map
122
+ //# sourceMappingURL=node-shadow-CpnrdvtJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-shadow-DKrcqmNg.js","sources":["../src/material/node/node-shadow.ts"],"sourcesContent":["/** Node Material — shadow emission (dynamically imported).\n *\n * This module is imported ONLY when `parseNodeMaterialFromSnippet` receives\n * `shadowGenerators`. Scenes without shadows never bundle it, keeping the\n * shadow WGSL (PCF/ESM helper fns + binding wiring) off the critical path.\n *\n * Emits three things per shadow light (texture + sampler + shadowInfo UBO)\n * plus the vertex-stage varying computations and the fragment-stage\n * `nme_computeShadowFactors(input)` dispatcher consumed by the LightBlock.\n */\n\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport type { Varying } from \"../../shader/fragment-types.js\";\n\nconst SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;\nconst SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\n/** @internal */\nexport interface ShadowBinding {\n /** @internal */\n readonly _lightIndex: number;\n /** @internal */\n readonly _texBinding: number;\n /** @internal */\n readonly _sampBinding: number;\n /** @internal */\n readonly _uboBinding: number;\n /** @internal */\n readonly _shadowType: \"esm\" | \"pcf\";\n}\n\nexport interface ShadowEmit {\n /** @internal One per shadow-casting light (3 binding slots each). */\n readonly _bindings: readonly ShadowBinding[];\n /** @internal Module-scope WGSL: struct + binding decls + compute fns. */\n readonly _wgslDecls: string;\n /** @internal `nme_computeShadowFactors(input) -> array<f32, MAX_LIGHTS>` called from light blocks. */\n readonly _fragmentHelper: string;\n /** @internal Injected into vs_main body: populates vPosFromLight_i + vDepthMetric_i varyings. */\n readonly _vertexInject: string;\n /** @internal GPU BGL entries for group 1 (append to meshBglEntries). */\n readonly _bglEntries: readonly GPUBindGroupLayoutEntry[];\n /** @internal Total bindings consumed (= shadowLights.length * 3). */\n readonly _bindingCount: number;\n}\n\n/** Emit shadow WGSL + bindings for a NodeMaterial.\n * Mutates `varyings` (pushes vPosFromLight_i + vDepthMetric_i per light) so\n * buildVertexOut picks them up.\n */\nexport function emitShadow(shadowLights: readonly { lightIndex: number; shadowType: \"esm\" | \"pcf\" }[], startBinding: number, varyings: Varying[]): ShadowEmit {\n const _bindings: ShadowBinding[] = [];\n const wgslDecls: string[] = [];\n const _bglEntries: GPUBindGroupLayoutEntry[] = [];\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n if (!varyings.some((v) => v._name === `vPosFromLight${suf}`)) {\n varyings.push({ _name: `vPosFromLight${suf}`, _type: \"vec4<f32>\" });\n }\n if (!varyings.some((v) => v._name === `vDepthMetric${suf}`)) {\n varyings.push({ _name: `vDepthMetric${suf}`, _type: \"f32\" });\n }\n }\n const vertLines: string[] = [`let _shadowWp4 = meshU.world * vec4<f32>(in.position, 1.0);`];\n const dispatchLines: string[] = [`var _sf = ${SHADOW_FACTORS_ONE};`];\n let nextBinding = startBinding;\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n const _lightIndex = sl.lightIndex;\n const _texBinding = nextBinding++;\n const _sampBinding = nextBinding++;\n const _uboBinding = nextBinding++;\n const _shadowType = sl.shadowType;\n _bindings.push({ _lightIndex, _texBinding, _sampBinding, _uboBinding, _shadowType });\n wgslDecls.push(\n `struct shadowInfo${suf}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`,\n `@group(1) @binding(${_uboBinding}) var<uniform> shadowInfo${suf}: shadowInfo${suf}Uniforms;`\n );\n if (sl.shadowType === \"pcf\") {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_depth_2d;`,\n `@group(1) @binding(${_sampBinding}) var shadowComp${suf}: sampler_comparison;`,\n `fn computeShadowPCF${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\n let depthRef = clamp(clipSpace.z, 0.0, 1.0);\n var tc = uv * mapSz + 0.5;\n let st = fract(tc);\n let base = (floor(tc) - 0.5) * invMapSz;\n let uvw0 = 4.0 - 3.0 * st;\n let uvw1 = vec2<f32>(7.0);\n let uvw2 = 1.0 + 3.0 * st;\n let u = vec3<f32>((3.0 - 2.0 * st.x) / uvw0.x - 2.0, (3.0 + st.x) / uvw1.x, st.x / uvw2.x + 2.0) * invMapSz;\n let v = vec3<f32>((3.0 - 2.0 * st.y) / uvw0.y - 2.0, (3.0 + st.y) / uvw1.y, st.y / uvw2.y + 2.0) * invMapSz;\n var sh = 0.0;\n sh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[0]), depthRef);\n sh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[0]), depthRef);\n sh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[0]), depthRef);\n sh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[1]), depthRef);\n sh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[1]), depthRef);\n sh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[1]), depthRef);\n sh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[2]), depthRef);\n sh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[2]), depthRef);\n sh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[2]), depthRef);\n sh /= 144.0;\n return mix(darkness, 1.0, sh);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowPCF${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.y, shadowInfo${suf}.shadowsInfo.z);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"depth\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"comparison\" } }\n );\n } else {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_2d<f32>;`,\n `@group(1) @binding(${_sampBinding}) var shadowSamp${suf}: sampler;`,\n `fn computeFallOff${suf}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {\n let mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));\n return mix(value, 1.0, mask);\n}\nfn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\n let shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);\n let shadowMapSample = textureSampleLevel(shadowTex${suf}, shadowSamp${suf}, uv, 0.0).x;\n let esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);\n return computeFallOff${suf}(esm, clipSpace.xy, frustumEdgeFalloff);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowESM${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.z, shadowInfo${suf}.shadowsInfo.w);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"filtering\" } }\n );\n }\n vertLines.push(\n `out.vPosFromLight${suf} = shadowInfo${suf}.lightMatrix * _shadowWp4;`,\n `out.vDepthMetric${suf} = (out.vPosFromLight${suf}.z + shadowInfo${suf}.depthValues.x) / shadowInfo${suf}.depthValues.y;`\n );\n _bglEntries.push({\n binding: _uboBinding,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\", minBindingSize: 96 },\n });\n }\n dispatchLines.push(`for (var _i = 0u; _i < ${MAX_LIGHTS}u; _i++) { _sf[_i] = mix(1.0, _sf[_i], meshU.receivesShadow.x); }`);\n dispatchLines.push(`return _sf;`);\n return {\n _bindings,\n _wgslDecls: wgslDecls.join(\"\\n\"),\n _fragmentHelper: `fn nme_computeShadowFactors(input: VertexOut) -> ${SHADOW_FACTORS_TYPE} {\\n ${dispatchLines.join(\"\\n \")}\\n}`,\n _vertexInject: vertLines.join(\"\\n \"),\n _bglEntries,\n _bindingCount: shadowLights.length * 3,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node-shadow-CpnrdvtJ.js","sources":["../src/material/node/node-shadow.ts"],"sourcesContent":["/** Node Material — shadow emission (dynamically imported).\n *\n * This module is imported ONLY when `parseNodeMaterialFromSnippet` receives\n * `shadowGenerators`. Scenes without shadows never bundle it, keeping the\n * shadow WGSL (PCF/ESM helper fns + binding wiring) off the critical path.\n *\n * Emits three things per shadow light (texture + sampler + shadowInfo UBO)\n * plus the vertex-stage varying computations and the fragment-stage\n * `nme_computeShadowFactors(input)` dispatcher consumed by the LightBlock.\n */\n\nimport { MAX_LIGHTS } from \"../../light/types.js\";\nimport type { Varying } from \"../../shader/fragment-types.js\";\n\nconst SHADOW_FACTORS_TYPE = `array<f32, ${MAX_LIGHTS}>`;\nconst SHADOW_FACTORS_ONE = `${SHADOW_FACTORS_TYPE}(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\n/** @internal */\nexport interface ShadowBinding {\n /** @internal */\n readonly _lightIndex: number;\n /** @internal */\n readonly _texBinding: number;\n /** @internal */\n readonly _sampBinding: number;\n /** @internal */\n readonly _uboBinding: number;\n /** @internal */\n readonly _shadowType: \"esm\" | \"pcf\";\n}\n\nexport interface ShadowEmit {\n /** @internal One per shadow-casting light (3 binding slots each). */\n readonly _bindings: readonly ShadowBinding[];\n /** @internal Module-scope WGSL: struct + binding decls + compute fns. */\n readonly _wgslDecls: string;\n /** @internal `nme_computeShadowFactors(input) -> array<f32, MAX_LIGHTS>` called from light blocks. */\n readonly _fragmentHelper: string;\n /** @internal Injected into vs_main body: populates vPosFromLight_i + vDepthMetric_i varyings. */\n readonly _vertexInject: string;\n /** @internal GPU BGL entries for group 1 (append to meshBglEntries). */\n readonly _bglEntries: readonly GPUBindGroupLayoutEntry[];\n /** @internal Total bindings consumed (= shadowLights.length * 3). */\n readonly _bindingCount: number;\n}\n\n/** Emit shadow WGSL + bindings for a NodeMaterial.\n * Mutates `varyings` (pushes vPosFromLight_i + vDepthMetric_i per light) so\n * buildVertexOut picks them up.\n */\nexport function emitShadow(shadowLights: readonly { lightIndex: number; shadowType: \"esm\" | \"pcf\" }[], startBinding: number, varyings: Varying[]): ShadowEmit {\n const _bindings: ShadowBinding[] = [];\n const wgslDecls: string[] = [];\n const _bglEntries: GPUBindGroupLayoutEntry[] = [];\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n if (!varyings.some((v) => v._name === `vPosFromLight${suf}`)) {\n varyings.push({ _name: `vPosFromLight${suf}`, _type: \"vec4<f32>\" });\n }\n if (!varyings.some((v) => v._name === `vDepthMetric${suf}`)) {\n varyings.push({ _name: `vDepthMetric${suf}`, _type: \"f32\" });\n }\n }\n const vertLines: string[] = [`let _shadowWp4 = meshU.world * vec4<f32>(in.position, 1.0);`];\n const dispatchLines: string[] = [`var _sf = ${SHADOW_FACTORS_ONE};`];\n let nextBinding = startBinding;\n for (const sl of shadowLights) {\n const suf = `_${sl.lightIndex}`;\n const _lightIndex = sl.lightIndex;\n const _texBinding = nextBinding++;\n const _sampBinding = nextBinding++;\n const _uboBinding = nextBinding++;\n const _shadowType = sl.shadowType;\n _bindings.push({ _lightIndex, _texBinding, _sampBinding, _uboBinding, _shadowType });\n wgslDecls.push(\n `struct shadowInfo${suf}Uniforms { lightMatrix: mat4x4<f32>, depthValues: vec4<f32>, shadowsInfo: vec4<f32> };`,\n `@group(1) @binding(${_uboBinding}) var<uniform> shadowInfo${suf}: shadowInfo${suf}Uniforms;`\n );\n if (sl.shadowType === \"pcf\") {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_depth_2d;`,\n `@group(1) @binding(${_sampBinding}) var shadowComp${suf}: sampler_comparison;`,\n `fn computeShadowPCF${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, mapSz: f32, invMapSz: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\n let depthRef = clamp(clipSpace.z, 0.0, 1.0);\n var tc = uv * mapSz + 0.5;\n let st = fract(tc);\n let base = (floor(tc) - 0.5) * invMapSz;\n let uvw0 = 4.0 - 3.0 * st;\n let uvw1 = vec2<f32>(7.0);\n let uvw2 = 1.0 + 3.0 * st;\n let u = vec3<f32>((3.0 - 2.0 * st.x) / uvw0.x - 2.0, (3.0 + st.x) / uvw1.x, st.x / uvw2.x + 2.0) * invMapSz;\n let v = vec3<f32>((3.0 - 2.0 * st.y) / uvw0.y - 2.0, (3.0 + st.y) / uvw1.y, st.y / uvw2.y + 2.0) * invMapSz;\n var sh = 0.0;\n sh += uvw0.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[0]), depthRef);\n sh += uvw1.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[0]), depthRef);\n sh += uvw2.x * uvw0.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[0]), depthRef);\n sh += uvw0.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[1]), depthRef);\n sh += uvw1.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[1]), depthRef);\n sh += uvw2.x * uvw1.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[1]), depthRef);\n sh += uvw0.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[0], v[2]), depthRef);\n sh += uvw1.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[1], v[2]), depthRef);\n sh += uvw2.x * uvw2.y * textureSampleCompareLevel(shadowTex${suf}, shadowComp${suf}, base + vec2<f32>(u[2], v[2]), depthRef);\n sh /= 144.0;\n return mix(darkness, 1.0, sh);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowPCF${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.y, shadowInfo${suf}.shadowsInfo.z);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"depth\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"comparison\" } }\n );\n } else {\n wgslDecls.push(\n `@group(1) @binding(${_texBinding}) var shadowTex${suf}: texture_2d<f32>;`,\n `@group(1) @binding(${_sampBinding}) var shadowSamp${suf}: sampler;`,\n `fn computeFallOff${suf}(value: f32, clipSpace: vec2<f32>, frustumEdgeFalloff: f32) -> f32 {\n let mask = smoothstep(1.0 - frustumEdgeFalloff, 1.00000012, clamp(dot(clipSpace, clipSpace), 0.0, 1.0));\n return mix(value, 1.0, mask);\n}\nfn computeShadowESM${suf}(posFromLight: vec4<f32>, depthMetric: f32, darkness: f32, depthScale: f32, frustumEdgeFalloff: f32) -> f32 {\n let clipSpace = posFromLight.xyz / posFromLight.w;\n let uv = vec2<f32>(0.5 * clipSpace.x + 0.5, 0.5 - 0.5 * clipSpace.y);\n if (depthMetric < 0.0 || depthMetric > 1.0 || uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { return 1.0; }\n let shadowPixelDepth = clamp(depthMetric, 0.0, 1.0);\n let shadowMapSample = textureSampleLevel(shadowTex${suf}, shadowSamp${suf}, uv, 0.0).x;\n let esm = 1.0 - clamp(exp(min(87.0, depthScale * shadowPixelDepth)) * shadowMapSample, 0.0, 1.0 - darkness);\n return computeFallOff${suf}(esm, clipSpace.xy, frustumEdgeFalloff);\n}`\n );\n dispatchLines.push(\n `_sf[${sl.lightIndex}] = computeShadowESM${suf}(input.vPosFromLight${suf}, input.vDepthMetric${suf}, shadowInfo${suf}.shadowsInfo.x, shadowInfo${suf}.shadowsInfo.z, shadowInfo${suf}.shadowsInfo.w);`\n );\n _bglEntries.push(\n { binding: _texBinding, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\", viewDimension: \"2d\" } },\n { binding: _sampBinding, visibility: GPUShaderStage.FRAGMENT, sampler: { type: \"filtering\" } }\n );\n }\n vertLines.push(\n `out.vPosFromLight${suf} = shadowInfo${suf}.lightMatrix * _shadowWp4;`,\n `out.vDepthMetric${suf} = (out.vPosFromLight${suf}.z + shadowInfo${suf}.depthValues.x) / shadowInfo${suf}.depthValues.y;`\n );\n _bglEntries.push({\n binding: _uboBinding,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: { type: \"uniform\", minBindingSize: 96 },\n });\n }\n dispatchLines.push(`for (var _i = 0u; _i < ${MAX_LIGHTS}u; _i++) { _sf[_i] = mix(1.0, _sf[_i], meshU.receivesShadow.x); }`);\n dispatchLines.push(`return _sf;`);\n return {\n _bindings,\n _wgslDecls: wgslDecls.join(\"\\n\"),\n _fragmentHelper: `fn nme_computeShadowFactors(input: VertexOut) -> ${SHADOW_FACTORS_TYPE} {\\n ${dispatchLines.join(\"\\n \")}\\n}`,\n _vertexInject: vertLines.join(\"\\n \"),\n _bglEntries,\n _bindingCount: shadowLights.length * 3,\n };\n}\n"],"names":[],"mappings":";AAcA,MAAM,sBAAsB,cAAc,UAAU;AACpD,MAAM,qBAAqB,GAAG,mBAAmB,IAAI,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAmC1F,SAAS,WAAW,cAA4E,cAAsB,UAAiC;AAC1J,QAAM,YAA6B,CAAA;AACnC,QAAM,YAAsB,CAAA;AAC5B,QAAM,cAAyC,CAAA;AAC/C,aAAW,MAAM,cAAc;AAC3B,UAAM,MAAM,IAAI,GAAG,UAAU;AAC7B,QAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,gBAAgB,GAAG,EAAE,GAAG;AAC1D,eAAS,KAAK,EAAE,OAAO,gBAAgB,GAAG,IAAI,OAAO,aAAa;AAAA,IACtE;AACA,QAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,eAAe,GAAG,EAAE,GAAG;AACzD,eAAS,KAAK,EAAE,OAAO,eAAe,GAAG,IAAI,OAAO,OAAO;AAAA,IAC/D;AAAA,EACJ;AACA,QAAM,YAAsB,CAAC,6DAA6D;AAC1F,QAAM,gBAA0B,CAAC,aAAa,kBAAkB,GAAG;AACnE,MAAI,cAAc;AAClB,aAAW,MAAM,cAAc;AAC3B,UAAM,MAAM,IAAI,GAAG,UAAU;AAC7B,UAAM,cAAc,GAAG;AACvB,UAAM,cAAc;AACpB,UAAM,eAAe;AACrB,UAAM,cAAc;AACpB,UAAM,cAAc,GAAG;AACvB,cAAU,KAAK,EAAE,aAAa,aAAa,cAAc,aAAa,aAAa;AACnF,cAAU;AAAA,MACN,oBAAoB,GAAG;AAAA,MACvB,sBAAsB,WAAW,4BAA4B,GAAG,eAAe,GAAG;AAAA,IAAA;AAEtF,QAAI,GAAG,eAAe,OAAO;AACzB,gBAAU;AAAA,QACN,sBAAsB,WAAW,kBAAkB,GAAG;AAAA,QACtD,sBAAsB,YAAY,mBAAmB,GAAG;AAAA,QACxD,sBAAsB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAcwB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA,iEACrB,GAAG,eAAe,GAAG;AAAA;AAAA;AAAA;AAAA,MAAA;AAK1E,oBAAc;AAAA,QACV,OAAO,GAAG,UAAU,uBAAuB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,eAAe,GAAG,6BAA6B,GAAG,6BAA6B,GAAG;AAAA,MAAA;AAExL,kBAAY;AAAA,QACR,EAAE,SAAS,aAAa,YAAY,eAAe,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,QACjH,EAAE,SAAS,cAAc,YAAY,eAAe,UAAU,SAAS,EAAE,MAAM,aAAA,EAAa;AAAA,MAAE;AAAA,IAEtG,OAAO;AACH,gBAAU;AAAA,QACN,sBAAsB,WAAW,kBAAkB,GAAG;AAAA,QACtD,sBAAsB,YAAY,mBAAmB,GAAG;AAAA,QACxD,oBAAoB,GAAG;AAAA;AAAA;AAAA;AAAA,qBAIlB,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA,wDAKgC,GAAG,eAAe,GAAG;AAAA;AAAA,2BAElD,GAAG;AAAA;AAAA,MAAA;AAGlB,oBAAc;AAAA,QACV,OAAO,GAAG,UAAU,uBAAuB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,eAAe,GAAG,6BAA6B,GAAG,6BAA6B,GAAG;AAAA,MAAA;AAExL,kBAAY;AAAA,QACR,EAAE,SAAS,aAAa,YAAY,eAAe,UAAU,SAAS,EAAE,YAAY,SAAS,eAAe,KAAA,EAAK;AAAA,QACjH,EAAE,SAAS,cAAc,YAAY,eAAe,UAAU,SAAS,EAAE,MAAM,YAAA,EAAY;AAAA,MAAE;AAAA,IAErG;AACA,cAAU;AAAA,MACN,oBAAoB,GAAG,gBAAgB,GAAG;AAAA,MAC1C,mBAAmB,GAAG,wBAAwB,GAAG,kBAAkB,GAAG,+BAA+B,GAAG;AAAA,IAAA;AAE5G,gBAAY,KAAK;AAAA,MACb,SAAS;AAAA,MACT,YAAY,eAAe,SAAS,eAAe;AAAA,MACnD,QAAQ,EAAE,MAAM,WAAW,gBAAgB,GAAA;AAAA,IAAG,CACjD;AAAA,EACL;AACA,gBAAc,KAAK,0BAA0B,UAAU,mEAAmE;AAC1H,gBAAc,KAAK,aAAa;AAChC,SAAO;AAAA,IACH;AAAA,IACA,YAAY,UAAU,KAAK,IAAI;AAAA,IAC/B,iBAAiB,oDAAoD,mBAAmB;AAAA,MAAW,cAAc,KAAK,QAAQ,CAAC;AAAA;AAAA,IAC/H,eAAe,UAAU,KAAK,QAAQ;AAAA,IACtC;AAAA,IACA,eAAe,aAAa,SAAS;AAAA,EAAA;AAE7C;"}
@@ -1,5 +1,5 @@
1
- import { ac as HAS_BUMP_TEXTURE } from "./index-C8HOR2sB.js";
2
- import { W as WGSL_PERTURB_NORMAL } from "./wgsl-helpers-DyzNzCeE.js";
1
+ import { Z as HAS_BUMP_TEXTURE } from "./index-B7Qhw0xL.js";
2
+ import { W as WGSL_PERTURB_NORMAL } from "./wgsl-helpers-D8sl1VVA.js";
3
3
  const STAGE_FRAGMENT = 2;
4
4
  function createNormalMapFragment() {
5
5
  return {
@@ -35,4 +35,4 @@ export {
35
35
  bumpStdExt,
36
36
  createNormalMapFragment
37
37
  };
38
- //# sourceMappingURL=normal-map-fragment-DpsIXrJf.js.map
38
+ //# sourceMappingURL=normal-map-fragment-DradEMl-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normal-map-fragment-DpsIXrJf.js","sources":["../src/material/standard/fragments/normal-map-fragment.ts"],"sourcesContent":["/**\n * Normal Map Fragment (Cotangent Frame)\n *\n * Shared cotangent-frame bump mapping for Standard materials.\n * Uses screen-space derivatives to construct the TBN frame without\n * requiring explicit tangent vertex attributes.\n */\n\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_BUMP_TEXTURE } from \"../standard-flags.js\";\nimport { WGSL_PERTURB_NORMAL } from \"../../../shader/wgsl-helpers.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\n/**\n * Create a bump/normal map fragment for Standard material.\n * @param bumpLevel - The bump level (1.0 = default). bumpScale = 1/bumpLevel.\n */\nexport function createNormalMapFragment(): ShaderFragment {\n return {\n _id: \"normal-map\",\n\n _bindings: [\n { _name: \"bT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"bS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n\n _helperFunctions: WGSL_PERTURB_NORMAL,\n\n _fragmentSlots: {\n AC: `normalW = perturbNormal(input.vn, input.vp, input.vu, mat.bs);`,\n },\n };\n}\n\nexport const bumpStdExt: StdExt = {\n _id: \"normal-map\",\n _phase: \"mesh\",\n _feature: HAS_BUMP_TEXTURE,\n _frag: createNormalMapFragment,\n _bind(mat: StandardMaterialProps, entries: GPUBindGroupEntry[], b: number): number {\n const tex = mat.bumpTexture!;\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.bumpTexture) {\n out.push(mat.bumpTexture);\n }\n },\n};\n"],"names":[],"mappings":";;AAeA,MAAM,iBAAiB;AAMhB,SAAS,0BAA0C;AACtD,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,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,IAGrG,kBAAkB;AAAA,IAElB,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,aAAqB;AAAA,EAC9B,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAA4B,SAA8B,GAAmB;AAC/E,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,aAAa;AACjB,UAAI,KAAK,IAAI,WAAW;AAAA,IAC5B;AAAA,EACJ;AACJ;"}
1
+ {"version":3,"file":"normal-map-fragment-DradEMl-.js","sources":["../src/material/standard/fragments/normal-map-fragment.ts"],"sourcesContent":["/**\n * Normal Map Fragment (Cotangent Frame)\n *\n * Shared cotangent-frame bump mapping for Standard materials.\n * Uses screen-space derivatives to construct the TBN frame without\n * requiring explicit tangent vertex attributes.\n */\n\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_BUMP_TEXTURE } from \"../standard-flags.js\";\nimport { WGSL_PERTURB_NORMAL } from \"../../../shader/wgsl-helpers.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\n/**\n * Create a bump/normal map fragment for Standard material.\n * @param bumpLevel - The bump level (1.0 = default). bumpScale = 1/bumpLevel.\n */\nexport function createNormalMapFragment(): ShaderFragment {\n return {\n _id: \"normal-map\",\n\n _bindings: [\n { _name: \"bT\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"bS\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT },\n ],\n\n _helperFunctions: WGSL_PERTURB_NORMAL,\n\n _fragmentSlots: {\n AC: `normalW = perturbNormal(input.vn, input.vp, input.vu, mat.bs);`,\n },\n };\n}\n\nexport const bumpStdExt: StdExt = {\n _id: \"normal-map\",\n _phase: \"mesh\",\n _feature: HAS_BUMP_TEXTURE,\n _frag: createNormalMapFragment,\n _bind(mat: StandardMaterialProps, entries: GPUBindGroupEntry[], b: number): number {\n const tex = mat.bumpTexture!;\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.bumpTexture) {\n out.push(mat.bumpTexture);\n }\n },\n};\n"],"names":[],"mappings":";;AAeA,MAAM,iBAAiB;AAMhB,SAAS,0BAA0C;AACtD,SAAO;AAAA,IACH,KAAK;AAAA,IAEL,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,IAGrG,kBAAkB;AAAA,IAElB,gBAAgB;AAAA,MACZ,IAAI;AAAA,IAAA;AAAA,EACR;AAER;AAEO,MAAM,aAAqB;AAAA,EAC9B,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM,KAA4B,SAA8B,GAAmB;AAC/E,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,aAAa;AACjB,UAAI,KAAK,IAAI,WAAW;AAAA,IAC5B;AAAA,EACJ;AACJ;"}
@@ -0,0 +1,37 @@
1
+ function packMat4IntoF32WithOffset(view, mat, offsetFloats, srcOffsetFloats, offsetX, offsetY, offsetZ) {
2
+ const src = mat;
3
+ const s = srcOffsetFloats;
4
+ const o = offsetFloats;
5
+ view[o + 0] = src[s + 0];
6
+ view[o + 1] = src[s + 1];
7
+ view[o + 2] = src[s + 2];
8
+ view[o + 3] = src[s + 3];
9
+ view[o + 4] = src[s + 4];
10
+ view[o + 5] = src[s + 5];
11
+ view[o + 6] = src[s + 6];
12
+ view[o + 7] = src[s + 7];
13
+ view[o + 8] = src[s + 8];
14
+ view[o + 9] = src[s + 9];
15
+ view[o + 10] = src[s + 10];
16
+ view[o + 11] = src[s + 11];
17
+ view[o + 12] = src[s + 12] - offsetX;
18
+ view[o + 13] = src[s + 13] - offsetY;
19
+ view[o + 14] = src[s + 14] - offsetZ;
20
+ view[o + 15] = src[s + 15];
21
+ }
22
+ function makePackMeshWorld(scene) {
23
+ return (view, mat, offsetFloats, srcOffsetFloats) => {
24
+ const cam = scene.camera;
25
+ if (!cam) {
26
+ packMat4IntoF32WithOffset(view, mat, offsetFloats, srcOffsetFloats, 0, 0, 0);
27
+ return;
28
+ }
29
+ const w = cam.worldMatrix;
30
+ packMat4IntoF32WithOffset(view, mat, offsetFloats, srcOffsetFloats, w[12], w[13], w[14]);
31
+ };
32
+ }
33
+ export {
34
+ makePackMeshWorld,
35
+ packMat4IntoF32WithOffset
36
+ };
37
+ //# sourceMappingURL=pack-mat4-with-offset-BqB8Jqo7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-mat4-with-offset-BqB8Jqo7.js","sources":["../src/large-world/pack-mat4-with-offset.ts"],"sourcesContent":["/** LWR-only mesh-world UBO packer.\n *\n * Bundled ONLY in LWR-on bundles (dynamic-imported by `createEngine` inside\n * `if (useFloatingOrigin)`). Non-LWR scenes never reference this module —\n * their mesh-world uploads go through the precision-only\n * `math/pack-mat4-into-f32.ts` instead.\n *\n * Offset = active camera's world position, read live from the camera at\n * each pack. There is no scene-side mirror state. The camera's\n * `worldMatrixVersion` drives mesh-UBO re-uploads via `wrapRenderableForFO`\n * in `floating-origin.ts`. */\n\nimport type { Mat4 } from \"../math/types.js\";\nimport type { Mat4Storage } from \"../math/types.js\";\nimport type { SceneContext } from \"../scene/scene-core.js\";\n\n/** @internal Mesh-world packer with floating-origin offset subtraction.\n * Same 16-element layout as `packMat4IntoF32` but subtracts the offset\n * from the translation column `[12..14]` in JS-number (F64) precision\n * BEFORE the implicit F32 store at the typed-array assignment. For an\n * F64-backed mat the `large - large = small` step is computed at full\n * F64 precision; a single F32 store rounds the small remainder with\n * ample headroom. That's the whole precision-recovery trick.\n *\n * Takes `offsetX/Y/Z` as three scalars rather than a `[number, number, number]`\n * tuple to avoid any per-pack array allocation. */\nexport function packMat4IntoF32WithOffset(\n view: Float32Array,\n mat: Mat4 | Float32Array | Float64Array,\n offsetFloats: number,\n srcOffsetFloats: number,\n offsetX: number,\n offsetY: number,\n offsetZ: number\n): void {\n const src = mat as Mat4 as unknown as Mat4Storage;\n const s = srcOffsetFloats;\n const o = offsetFloats;\n view[o + 0] = src[s + 0]!;\n view[o + 1] = src[s + 1]!;\n view[o + 2] = src[s + 2]!;\n view[o + 3] = src[s + 3]!;\n view[o + 4] = src[s + 4]!;\n view[o + 5] = src[s + 5]!;\n view[o + 6] = src[s + 6]!;\n view[o + 7] = src[s + 7]!;\n view[o + 8] = src[s + 8]!;\n view[o + 9] = src[s + 9]!;\n view[o + 10] = src[s + 10]!;\n view[o + 11] = src[s + 11]!;\n view[o + 12] = src[s + 12]! - offsetX;\n view[o + 13] = src[s + 13]! - offsetY;\n view[o + 14] = src[s + 14]! - offsetZ;\n view[o + 15] = src[s + 15]!;\n}\n\n/** @internal Factory: bind a scene's camera into a closure that packs\n * mesh-world matrices with the live offset (camera world position)\n * subtracted. Engine sets `engine._makePackMeshWorld = makePackMeshWorld`\n * only when `useFloatingOrigin: true`. Renderables call the factory once\n * at construction to resolve their packer; the per-frame hot path then\n * derives offset from `scene.camera.worldMatrix` at each pack — zero\n * allocation, no mirror-state to keep in sync. */\nexport function makePackMeshWorld(scene: SceneContext): (view: Float32Array, mat: Mat4 | Float32Array | Float64Array, offsetFloats: number, srcOffsetFloats: number) => void {\n return (view: Float32Array, mat: Mat4 | Float32Array | Float64Array, offsetFloats: number, srcOffsetFloats: number): void => {\n const cam = scene.camera;\n if (!cam) {\n packMat4IntoF32WithOffset(view, mat, offsetFloats, srcOffsetFloats, 0, 0, 0);\n return;\n }\n const w = cam.worldMatrix;\n packMat4IntoF32WithOffset(view, mat, offsetFloats, srcOffsetFloats, w[12]!, w[13]!, w[14]!);\n };\n}\n"],"names":[],"mappings":"AA0BO,SAAS,0BACZ,MACA,KACA,cACA,iBACA,SACA,SACA,SACI;AACJ,QAAM,MAAM;AACZ,QAAM,IAAI;AACV,QAAM,IAAI;AACV,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACvB,OAAK,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;AACzB,OAAK,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;AACzB,OAAK,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAK;AAC9B,OAAK,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAK;AAC9B,OAAK,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAK;AAC9B,OAAK,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;AAC7B;AASO,SAAS,kBAAkB,OAA2I;AACzK,SAAO,CAAC,MAAoB,KAAyC,cAAsB,oBAAkC;AACzH,UAAM,MAAM,MAAM;AAClB,QAAI,CAAC,KAAK;AACN,gCAA0B,MAAM,KAAK,cAAc,iBAAiB,GAAG,GAAG,CAAC;AAC3E;AAAA,IACJ;AACA,UAAM,IAAI,IAAI;AACd,8BAA0B,MAAM,KAAK,cAAc,iBAAiB,EAAE,EAAE,GAAI,EAAE,EAAE,GAAI,EAAE,EAAE,CAAE;AAAA,EAC9F;AACJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/lite",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "module": "./index.js",
@@ -20,7 +20,7 @@
20
20
  "@recast-navigation/wasm": "0.43.0"
21
21
  },
22
22
  "babylonLiteRelease": {
23
- "azureBuildId": "54367",
24
- "sourceVersion": "f7e408a79bc357a33b26776f1509b046d2ed8597"
23
+ "azureBuildId": "54465",
24
+ "sourceVersion": "605adb9a7dc4eba301d7d998e10c1c76c0d996ea"
25
25
  }
26
26
  }
@@ -1,4 +1,4 @@
1
- import { C as createFreeCamera } from "./index-C8HOR2sB.js";
1
+ import { g as createFreeCamera } from "./index-B7Qhw0xL.js";
2
2
  function parseBabylonCamera(cd) {
3
3
  var _a, _b;
4
4
  const p = cd.position;
@@ -20,4 +20,4 @@ function parseBabylonCamera(cd) {
20
20
  export {
21
21
  parseBabylonCamera
22
22
  };
23
- //# sourceMappingURL=parse-camera-DM3oJJeT.js.map
23
+ //# sourceMappingURL=parse-camera-CgV4bWc0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-camera-DM3oJJeT.js","sources":["../src/loader-babylon/parse-camera.ts"],"sourcesContent":["/** Parse a FreeCamera from .babylon camera data. Dynamically imported by load-babylon.ts. */\nimport { createFreeCamera } from \"../camera/free-camera.js\";\nimport type { FreeCamera } from \"../camera/free-camera.js\";\n\nexport function parseBabylonCamera(cd: { position: number[]; rotation?: number[]; fov?: number; minZ?: number; maxZ?: number }): FreeCamera {\n const p = cd.position;\n const pitch = cd.rotation?.[0] ?? 0;\n const yaw = cd.rotation?.[1] ?? 0;\n const cp = Math.cos(pitch);\n const cam = createFreeCamera({ x: p[0]!, y: p[1]!, z: p[2]! }, { x: p[0]! + cp * Math.sin(yaw), y: p[1]! - Math.sin(pitch), z: p[2]! + cp * Math.cos(yaw) });\n if (cd.fov != null) {\n cam.fov = cd.fov;\n }\n if (cd.minZ != null) {\n cam.nearPlane = cd.minZ;\n }\n if (cd.maxZ != null) {\n cam.farPlane = cd.maxZ;\n }\n return cam;\n}\n"],"names":[],"mappings":";AAIO,SAAS,mBAAmB,IAAyG;;AACxI,QAAM,IAAI,GAAG;AACb,QAAM,UAAQ,QAAG,aAAH,mBAAc,OAAM;AAClC,QAAM,QAAM,QAAG,aAAH,mBAAc,OAAM;AAChC,QAAM,KAAK,KAAK,IAAI,KAAK;AACzB,QAAM,MAAM,iBAAiB,EAAE,GAAG,EAAE,CAAC,GAAI,GAAG,EAAE,CAAC,GAAI,GAAG,EAAE,CAAC,EAAA,GAAM,EAAE,GAAG,EAAE,CAAC,IAAK,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAK,KAAK,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,IAAK,KAAK,KAAK,IAAI,GAAG,GAAG;AAC3J,MAAI,GAAG,OAAO,MAAM;AAChB,QAAI,MAAM,GAAG;AAAA,EACjB;AACA,MAAI,GAAG,QAAQ,MAAM;AACjB,QAAI,YAAY,GAAG;AAAA,EACvB;AACA,MAAI,GAAG,QAAQ,MAAM;AACjB,QAAI,WAAW,GAAG;AAAA,EACtB;AACA,SAAO;AACX;"}
1
+ {"version":3,"file":"parse-camera-CgV4bWc0.js","sources":["../src/loader-babylon/parse-camera.ts"],"sourcesContent":["/** Parse a FreeCamera from .babylon camera data. Dynamically imported by load-babylon.ts. */\nimport { createFreeCamera } from \"../camera/free-camera.js\";\nimport type { FreeCamera } from \"../camera/free-camera.js\";\n\nexport function parseBabylonCamera(cd: { position: number[]; rotation?: number[]; fov?: number; minZ?: number; maxZ?: number }): FreeCamera {\n const p = cd.position;\n const pitch = cd.rotation?.[0] ?? 0;\n const yaw = cd.rotation?.[1] ?? 0;\n const cp = Math.cos(pitch);\n const cam = createFreeCamera({ x: p[0]!, y: p[1]!, z: p[2]! }, { x: p[0]! + cp * Math.sin(yaw), y: p[1]! - Math.sin(pitch), z: p[2]! + cp * Math.cos(yaw) });\n if (cd.fov != null) {\n cam.fov = cd.fov;\n }\n if (cd.minZ != null) {\n cam.nearPlane = cd.minZ;\n }\n if (cd.maxZ != null) {\n cam.farPlane = cd.maxZ;\n }\n return cam;\n}\n"],"names":[],"mappings":";AAIO,SAAS,mBAAmB,IAAyG;;AACxI,QAAM,IAAI,GAAG;AACb,QAAM,UAAQ,QAAG,aAAH,mBAAc,OAAM;AAClC,QAAM,QAAM,QAAG,aAAH,mBAAc,OAAM;AAChC,QAAM,KAAK,KAAK,IAAI,KAAK;AACzB,QAAM,MAAM,iBAAiB,EAAE,GAAG,EAAE,CAAC,GAAI,GAAG,EAAE,CAAC,GAAI,GAAG,EAAE,CAAC,EAAA,GAAM,EAAE,GAAG,EAAE,CAAC,IAAK,KAAK,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC,IAAK,KAAK,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC,IAAK,KAAK,KAAK,IAAI,GAAG,GAAG;AAC3J,MAAI,GAAG,OAAO,MAAM;AAChB,QAAI,MAAM,GAAG;AAAA,EACjB;AACA,MAAI,GAAG,QAAQ,MAAM;AACjB,QAAI,YAAY,GAAG;AAAA,EACvB;AACA,MAAI,GAAG,QAAQ,MAAM;AACjB,QAAI,WAAW,GAAG;AAAA,EACtB;AACA,SAAO;AACX;"}
@@ -0,0 +1,8 @@
1
+ import { a as WGSL_FOG } from "./wgsl-helpers-D8sl1VVA.js";
2
+ const PBR_FOG_HELPER = WGSL_FOG;
3
+ const PBR_FOG_BLOCK = `if(scene.vFogInfos.x>0.0){var fogFactor=calcFogFactor((scene.view*vec4<f32>(input.worldPos,1.0)).xyz);fogFactor=pow(fogFactor,2.2);color=mix(pow(scene.vFogColor.rgb,vec3<f32>(2.2)),color,fogFactor);}`;
4
+ export {
5
+ PBR_FOG_BLOCK,
6
+ PBR_FOG_HELPER
7
+ };
8
+ //# sourceMappingURL=pbr-fog-wgsl-BqdCid6r.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbr-fog-wgsl-BqdCid6r.js","sources":["../src/material/pbr/pbr-fog-wgsl.ts"],"sourcesContent":["/**\n * PBR fog receiver WGSL — the `calcFogFactor` helper plus the fog blend block.\n *\n * Dynamically imported by `pbr-renderable` ONLY when `scene.fog` is set, then threaded into the\n * PBR template as plain strings (the same pattern the ACES tonemap uses). This keeps every byte of\n * fog WGSL out of the bundles of PBR scenes that don't use fog — a static `import` of the helper\n * into `pbr-template` would defeat tree-shaking and inflate every PBR scene (see GUIDANCE §4c′).\n *\n * Parity notes (matches Babylon.js `pbr.fragment` exactly):\n * - Fog is mixed into the LINEAR HDR colour BEFORE the tonemap / image-processing chain\n * (BJS runs `fogFragment` before `pbrBlockImageProcessing`).\n * - The fog FACTOR is linearised: `fog = toLinearSpace(fog)` = `pow(fog, 2.2)` (default approx sRGB).\n * - The fog COLOUR is linearised too: BJS binds `vFogColor` with `linearSpace = true` for PBR\n * (`BindFogParameters`), whereas the Standard material binds it raw. Lite stores one raw\n * `vFogColor` in the scene UBO (correct for Standard, which has no trailing gamma), so the PBR\n * path linearises it here with `pow(.., 2.2)`; after Lite's trailing gamma encode the fully\n * fogged result returns to the authored fog colour (matching the background), exactly like BJS.\n * - The runtime `vFogInfos.x > 0.0` guard lets `fogMode` toggle none/linear/exp/exp2 at runtime.\n */\n\nimport { WGSL_FOG } from \"../../shader/wgsl-helpers.js\";\n\n/** `calcFogFactor` + `E_FOG` helper WGSL (reads `scene.vFogInfos`). */\nexport const PBR_FOG_HELPER = WGSL_FOG;\n\n/** Fog blend, emitted just before the PBR tonemap block (operates on the linear HDR `color`). */\nexport const PBR_FOG_BLOCK = `if(scene.vFogInfos.x>0.0){var fogFactor=calcFogFactor((scene.view*vec4<f32>(input.worldPos,1.0)).xyz);fogFactor=pow(fogFactor,2.2);color=mix(pow(scene.vFogColor.rgb,vec3<f32>(2.2)),color,fogFactor);}`;\n"],"names":[],"mappings":";AAuBO,MAAM,iBAAiB;AAGvB,MAAM,gBAAgB;"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
1
+ import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
2
2
  const HELPER_KEY_PREFIX = "nme_pbr_mr";
3
3
  const SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill("1.0").join(", ")})`;
4
4
  function resolveOptional(block, inputName, fallback, target, stage, state, ctx) {
@@ -101,4 +101,4 @@ const emitter = {
101
101
  export {
102
102
  emitter
103
103
  };
104
- //# sourceMappingURL=pbr-metallic-roughness-block-h_KAOZrW.js.map
104
+ //# sourceMappingURL=pbr-metallic-roughness-block-BFwZj2Nw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pbr-metallic-roughness-block-h_KAOZrW.js","sources":["../src/material/node/blocks/pbr-metallic-roughness-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n if (\n (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true ||\n block.inputs.get(\"clearcoat\")?.source ||\n block.inputs.get(\"sheen\")?.source ||\n block.inputs.get(\"subsurface\")?.source ||\n block.inputs.get(\"anisotropy\")?.source ||\n block.inputs.get(\"iridescence\")?.source\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core emitter cannot emit optional PBR feature code\");\n }\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_nocc_ccF0_nosh_norefr_noss_noani_noShAS___noaa`;\n if (!state.pbrMrHelperRequests.some((request) => request.key === helperKey)) {\n state.pbrMrHelperRequests.push({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat: false,\n useSheen: false,\n useRefraction: false,\n useSubsurface: false,\n useAnisotropy: false,\n useIridescence: false,\n useShAlbedoScaling: false,\n useCcBump: false,\n useCcTint: false,\n useSpecularAA: false,\n remapClearcoatF0: false,\n });\n }\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, 0.0, 0.0, 1.5, v3(0.5, 0.5, 1.0), v2(0.0), v3(1.0), 1.0, 0.0, 0.0, v3(1.0), 0.0, ${baseIorExpr}, 0.0, 1.5, 1.0, v3(1.0), 0.0, 0.0, v3(1.0), 0.0, v2(1.0, 0.0), v2(0.0), ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":";AAGA,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB,cAAc,UAAU,KAAK,IAAI,MAAM,UAAU,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,CAAC;AAEpG,SAAS,gBAAgB,OAAkB,WAAmB,UAAkB,QAAyB,OAAc,OAAuB,KAA8B;AACxK,QAAM,QAAQ,MAAM,OAAO,IAAI,SAAS;AACxC,MAAI,+BAAO,QAAQ;AACf,WAAO,IAAI,KAAK,IAAI,QAAQ,OAAO,WAAW,OAAO,KAAK,GAAG,MAAM,EAAE;AAAA,EACzE;AACA,SAAO;AACX;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;;AACvC,QACK,MAAM,WAAwD,+BAA+B,UAC9F,WAAM,OAAO,IAAI,WAAW,MAA5B,mBAA+B,aAC/B,WAAM,OAAO,IAAI,OAAO,MAAxB,mBAA2B,aAC3B,WAAM,OAAO,IAAI,YAAY,MAA7B,mBAAgC,aAChC,WAAM,OAAO,IAAI,YAAY,MAA7B,mBAAgC,aAChC,WAAM,OAAO,IAAI,aAAa,MAA9B,mBAAiC,SACnC;AACE,YAAM,IAAI,MAAM,yEAAyE;AAAA,IAC7F;AACA,UAAM,sBAAsB,CAAC,GAAC,WAAM,OAAO,IAAI,YAAY,MAA7B,mBAAgC;AAC9D,QAAI,qBAAqB;AACrB,YAAM,UAAU;AAChB,UAAI,QAAQ,OAAO,cAAc,OAAO,KAAK;AAAA,IACjD;AACA,UAAM,YAAY,GAAG,iBAAiB,IAAI,sBAAsB,QAAQ,OAAO;AAC/E,QAAI,CAAC,MAAM,oBAAoB,KAAK,CAAC,YAAY,QAAQ,QAAQ,SAAS,GAAG;AACzE,YAAM,oBAAoB,KAAK;AAAA,QAC3B,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,UAAU;AAAA,QACV,eAAe;AAAA,QACf,eAAe;AAAA,QACf,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,oBAAoB;AAAA,QACpB,WAAW;AAAA,QACX,WAAW;AAAA,QACX,eAAe;AAAA,QACf,kBAAkB;AAAA,MAAA,CACrB;AAAA,IACL;AACA,UAAM,gBAAgB;AAEtB,UAAM,UAAU,UAAU,MAAM,EAAE;AAClC,QAAI;AACJ,UAAM,WAAW,MAAM,SAAS,KAAK,IAAI,OAAO;AAChD,QAAI,UAAU;AACV,gBAAU,SAAS;AAAA,IACvB,OAAO;AACH,YAAM,KAAK,gBAAgB,OAAO,iBAAiB,WAAW,SAAS,OAAO,OAAO,GAAG;AACxF,YAAM,KAAK,gBAAgB,OAAO,eAAe,qBAAqB,SAAS,OAAO,OAAO,GAAG;AAChG,YAAM,YAAY,MAAM,OAAO,IAAI,iBAAiB;AACpD,YAAM,MAAK,uCAAW,UAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,mBAAmB,OAAO,KAAK,GAAG,OAAO,EAAE,OAAO;AAC7G,YAAM,KAAK,gBAAgB,OAAO,kBAAkB,oBAAoB,SAAS,OAAO,OAAO,GAAG;AAClG,YAAM,KAAK,gBAAgB,OAAO,aAAa,WAAW,SAAS,OAAO,OAAO,GAAG;AACpF,YAAM,KAAK,gBAAgB,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,GAAG;AAC7E,YAAM,KAAK,gBAAgB,OAAO,aAAa,OAAO,OAAO,OAAO,OAAO,GAAG;AAC9E,YAAM,KAAK,gBAAgB,OAAO,cAAc,OAAO,OAAO,OAAO,OAAO,GAAG;AAC/E,YAAM,cAAc,gBAAgB,OAAO,qBAAqB,OAAO,OAAO,OAAO,OAAO,GAAG;AAC/F,YAAM,KAAK,MAAM,aAAa,SAAS,IAAI,iCAAiC;AAC5E,gBAAU,QAAQ,IAAI,KAAK,OAAO,KAAK,CAAC;AACxC,YAAM,SAAS,KAAK;AAAA,QAChB,OAAO,OAAO,yBAAyB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sFAAsF,WAAW,4EAA4E,EAAE;AAAA,MAAA;AAE7Q,YAAM,SAAS,KAAK,IAAI,SAAS,EAAE,MAAM,SAAS,MAAM,SAAS;AAAA,IACrE;AAEA,YAAQ,YAAA;AAAA,MACJ,KAAK;AACD,eAAO,EAAE,MAAM,GAAG,OAAO,aAAa,MAAM,QAAA;AAAA,MAChD,KAAK;AACD,eAAO,EAAE,MAAM,GAAG,OAAO,eAAe,MAAM,QAAA;AAAA,MAClD,KAAK;AACD,eAAO,EAAE,MAAM,GAAG,OAAO,gBAAgB,MAAM,QAAA;AAAA,MACnD,KAAK;AACD,eAAO,EAAE,MAAM,GAAG,OAAO,eAAe,MAAM,QAAA;AAAA,MAClD,KAAK;AACD,eAAO,EAAE,MAAM,GAAG,OAAO,gBAAgB,MAAM,QAAA;AAAA,MACnD,KAAK;AACD,eAAO,EAAE,MAAM,GAAG,OAAO,WAAW,MAAM,MAAA;AAAA,MAC9C,KAAK,SAAS;AACV,cAAM,MAAM,MAAM;AAClB,cAAM,eAAe,IAAI,yBAAyB,QAAQ,IAAI,yBAAyB;AACvF,cAAM,KAAK,MAAM,OAAO,IAAI,SAAS;AACrC,cAAM,aAAY,yBAAI,UAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,WAAW,OAAO,KAAK,GAAG,KAAK,EAAE,OAAO;AACnG,YAAI,cAAc;AACd,iBAAO,EAAE,MAAM,SAAS,SAAS,MAAM,OAAO,mBAAmB,OAAO,4BAA4B,MAAM,MAAA;AAAA,QAC9G;AACA,eAAO,EAAE,MAAM,WAAW,MAAM,MAAA;AAAA,MACpC;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,EAAE,MAAM,WAAW,MAAM,QAAA;AAAA,MACpC;AACI,eAAO,EAAE,MAAM,GAAG,OAAO,aAAa,MAAM,QAAA;AAAA,IAAQ;AAAA,EAEhE;AACJ;"}
1
+ {"version":3,"file":"pbr-metallic-roughness-block-BFwZj2Nw.js","sources":["../src/material/node/blocks/pbr-metallic-roughness-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, Stage } from \"../node-types.js\";\nimport { MAX_LIGHTS } from \"../../../light/types.js\";\n\nconst HELPER_KEY_PREFIX = \"nme_pbr_mr\";\nconst SHADOW_FACTORS_ONE = `array<f32, ${MAX_LIGHTS}>(${new Array(MAX_LIGHTS).fill(\"1.0\").join(\", \")})`;\n\nfunction resolveOptional(block: NodeBlock, inputName: string, fallback: string, target: \"vec3f\" | \"f32\", stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n return ctx.cast(ctx.resolve(block, inputName, stage, state), target).expr;\n }\n return fallback;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PBRMetallicRoughnessBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n if (\n (block.serialized as { enableSpecularAntiAliasing?: boolean }).enableSpecularAntiAliasing === true ||\n block.inputs.get(\"clearcoat\")?.source ||\n block.inputs.get(\"sheen\")?.source ||\n block.inputs.get(\"subsurface\")?.source ||\n block.inputs.get(\"anisotropy\")?.source ||\n block.inputs.get(\"iridescence\")?.source\n ) {\n throw new Error(\"NodeMaterial: PBR-MR core emitter cannot emit optional PBR feature code\");\n }\n const reflectionConnected = !!block.inputs.get(\"reflection\")?.source;\n if (reflectionConnected) {\n state.usesEnv = true;\n ctx.resolve(block, \"reflection\", stage, state);\n }\n const helperKey = `${HELPER_KEY_PREFIX}_${reflectionConnected ? \"env\" : \"noenv\"}_nocc_ccF0_nosh_norefr_noss_noani_noShAS___noaa`;\n if (!state.pbrMrHelperRequests.some((request) => request.key === helperKey)) {\n state.pbrMrHelperRequests.push({\n key: helperKey,\n useEnv: reflectionConnected,\n useClearcoat: false,\n useSheen: false,\n useRefraction: false,\n useSubsurface: false,\n useAnisotropy: false,\n useIridescence: false,\n useShAlbedoScaling: false,\n useCcBump: false,\n useCcTint: false,\n useSpecularAA: false,\n remapClearcoatF0: false,\n });\n }\n state.usesLightsUbo = true;\n\n const memoKey = `_pbrmr_${block.id}_call`;\n let callVar: string;\n const existing = state.fragment.memo.get(memoKey);\n if (existing) {\n callVar = existing.expr;\n } else {\n const wp = resolveOptional(block, \"worldPosition\", \"v3(0.0)\", \"vec3f\", stage, state, ctx);\n const gn = resolveOptional(block, \"worldNormal\", \"v3(0.0, 1.0, 0.0)\", \"vec3f\", stage, state, ctx);\n const perturbed = block.inputs.get(\"perturbedNormal\");\n const wn = perturbed?.source ? ctx.cast(ctx.resolve(block, \"perturbedNormal\", stage, state), \"vec3f\").expr : gn;\n const cp = resolveOptional(block, \"cameraPosition\", \"_NME_CAMERA_POS_\", \"vec3f\", stage, state, ctx);\n const bc = resolveOptional(block, \"baseColor\", \"v3(1.0)\", \"vec3f\", stage, state, ctx);\n const me = resolveOptional(block, \"metallic\", \"0.0\", \"f32\", stage, state, ctx);\n const ro = resolveOptional(block, \"roughness\", \"0.5\", \"f32\", stage, state, ctx);\n const ao = resolveOptional(block, \"ambientOcc\", \"1.0\", \"f32\", stage, state, ctx);\n const baseIorExpr = resolveOptional(block, \"indexOfRefraction\", \"1.5\", \"f32\", stage, state, ctx);\n const sf = state.shadowLights.length > 0 ? `nme_computeShadowFactors(in)` : SHADOW_FACTORS_ONE;\n callVar = `_pbrR${ctx.temp(state, \"pbr\")}`;\n state.fragment.body.push(\n `let ${callVar} = nme_pbr_mr_compute(${wp}, ${gn}, ${wn}, ${cp}, ${bc}, ${me}, ${ro}, ${ao}, 0.0, 0.0, 1.5, v3(0.5, 0.5, 1.0), v2(0.0), v3(1.0), 1.0, 0.0, 0.0, v3(1.0), 0.0, ${baseIorExpr}, 0.0, 1.5, 1.0, v3(1.0), 0.0, 0.0, v3(1.0), 0.0, v2(1.0, 0.0), v2(0.0), ${sf});`\n );\n state.fragment.memo.set(memoKey, { expr: callVar, type: \"vec4f\" });\n }\n\n switch (outputName) {\n case \"lighting\":\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n case \"diffuseDir\":\n return { expr: `${callVar}.diffuseDir`, type: \"vec3f\" };\n case \"specularDir\":\n return { expr: `${callVar}.specularDir`, type: \"vec3f\" };\n case \"diffuseInd\":\n return { expr: `${callVar}.diffuseInd`, type: \"vec3f\" };\n case \"specularInd\":\n return { expr: `${callVar}.specularInd`, type: \"vec3f\" };\n case \"shadow\":\n return { expr: `${callVar}.shadow`, type: \"f32\" };\n case \"alpha\": {\n const cfg = block.serialized as { useSpecularOverAlpha?: boolean; useRadianceOverAlpha?: boolean };\n const useOverAlpha = cfg.useSpecularOverAlpha === true || cfg.useRadianceOverAlpha === true;\n const op = block.inputs.get(\"opacity\");\n const baseAlpha = op?.source ? ctx.cast(ctx.resolve(block, \"opacity\", stage, state), \"f32\").expr : \"1.0\";\n if (useOverAlpha) {\n return { expr: `clamp(${baseAlpha} + ${callVar}.lumOverAlpha * ${callVar}.lumOverAlpha, 0.0, 1.0)`, type: \"f32\" };\n }\n return { expr: baseAlpha, type: \"f32\" };\n }\n case \"ambientClr\":\n case \"clearcoatDir\":\n case \"clearcoatInd\":\n case \"sheenDir\":\n case \"sheenInd\":\n case \"refraction\":\n return { expr: `v3(0.0)`, type: \"vec3f\" };\n default:\n return { expr: `${callVar}.lighting`, type: \"vec3f\" };\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { M as MAX_LIGHTS } from "./index-C8HOR2sB.js";
1
+ import { M as MAX_LIGHTS } from "./index-B7Qhw0xL.js";
2
2
  function ccDirectBlock(useClearcoat, useCcTint) {
3
3
  if (!useClearcoat) {
4
4
  return "";
@@ -760,4 +760,4 @@ const emitter = {
760
760
  export {
761
761
  emitter
762
762
  };
763
- //# sourceMappingURL=pbr-metallic-roughness-block-full-6vMm1Jk6.js.map
763
+ //# sourceMappingURL=pbr-metallic-roughness-block-full-5t0HT3xl.js.map