@babylonjs/lite 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (417) hide show
  1. package/_math-factory-C-QqW-Wi.js +55 -0
  2. package/_math-factory-C-QqW-Wi.js.map +1 -0
  3. package/add-block-CikX5gWy.js +6 -0
  4. package/add-block-CikX5gWy.js.map +1 -0
  5. package/alpha-test-fragment-CUiHCw7W.js +22 -0
  6. package/alpha-test-fragment-CUiHCw7W.js.map +1 -0
  7. package/ambient-occlusion-block-DForhWL3.js +77 -0
  8. package/ambient-occlusion-block-DForhWL3.js.map +1 -0
  9. package/anisotropy-block-D5fXH_OY.js +12 -0
  10. package/anisotropy-block-D5fXH_OY.js.map +1 -0
  11. package/anisotropy-fragment-HgasXS7l.js +89 -0
  12. package/anisotropy-fragment-HgasXS7l.js.map +1 -0
  13. package/arc-tan2-block-d8sWt_x0.js +12 -0
  14. package/arc-tan2-block-d8sWt_x0.js.map +1 -0
  15. package/assets/splat-sort-worker-Crg3CaCc.js.map +1 -0
  16. package/background-dds-skybox-yHTqabU3.js +221 -0
  17. package/background-dds-skybox-yHTqabU3.js.map +1 -0
  18. package/background-ground-DIw6D3qf.js +235 -0
  19. package/background-ground-DIw6D3qf.js.map +1 -0
  20. package/background-hdr-skybox-c4uuTmkP.js +179 -0
  21. package/background-hdr-skybox-c4uuTmkP.js.map +1 -0
  22. package/background-solid-skybox-DPGBpPbm.js +235 -0
  23. package/background-solid-skybox-DPGBpPbm.js.map +1 -0
  24. package/bake-local-matrix-Dfpd3b06.js +28 -0
  25. package/bake-local-matrix-Dfpd3b06.js.map +1 -0
  26. package/billboard-renderable-D8mlVGCd.js +242 -0
  27. package/billboard-renderable-D8mlVGCd.js.map +1 -0
  28. package/biplanar-block-DZnKuV81.js +115 -0
  29. package/biplanar-block-DZnKuV81.js.map +1 -0
  30. package/bones-block-D6IhqUVV.js +31 -0
  31. package/bones-block-D6IhqUVV.js.map +1 -0
  32. package/clamp-block-BdII67hT.js +21 -0
  33. package/clamp-block-BdII67hT.js.map +1 -0
  34. package/clearcoat-block-BGML4npi.js +12 -0
  35. package/clearcoat-block-BGML4npi.js.map +1 -0
  36. package/clearcoat-fragment-LCiG98Rf.js +256 -0
  37. package/clearcoat-fragment-LCiG98Rf.js.map +1 -0
  38. package/clip-planes-block-BPfFJrbf.js +26 -0
  39. package/clip-planes-block-BPfFJrbf.js.map +1 -0
  40. package/cloud-block-BeVrangc.js +90 -0
  41. package/cloud-block-BeVrangc.js.map +1 -0
  42. package/color-converter-block-CvwKiW4k.js +123 -0
  43. package/color-converter-block-CvwKiW4k.js.map +1 -0
  44. package/color-merger-CCu21ZII.js +57 -0
  45. package/color-merger-CCu21ZII.js.map +1 -0
  46. package/color-splitter-CGn1G4ow.js +33 -0
  47. package/color-splitter-CGn1G4ow.js.map +1 -0
  48. package/conditional-block-Cd2pbejI.js +51 -0
  49. package/conditional-block-Cd2pbejI.js.map +1 -0
  50. package/create-skeleton-C9JdIJnb.js +44 -0
  51. package/create-skeleton-C9JdIJnb.js.map +1 -0
  52. package/cross-block-DCrLwCpt.js +12 -0
  53. package/cross-block-DCrLwCpt.js.map +1 -0
  54. package/cubemap-skybox-material-DvXMVc4k.js +79 -0
  55. package/cubemap-skybox-material-DvXMVc4k.js.map +1 -0
  56. package/curve-block-BlJpXVYv.js +89 -0
  57. package/curve-block-BlJpXVYv.js.map +1 -0
  58. package/debug-block-D2pg4Yf6.js +14 -0
  59. package/debug-block-D2pg4Yf6.js.map +1 -0
  60. package/derivative-block-B8KjtaWs.js +20 -0
  61. package/derivative-block-B8KjtaWs.js.map +1 -0
  62. package/desaturate-block-C1RghNSB.js +15 -0
  63. package/desaturate-block-C1RghNSB.js.map +1 -0
  64. package/discard-block-B2jKjaEL.js +21 -0
  65. package/discard-block-B2jKjaEL.js.map +1 -0
  66. package/distance-block-3NkgFZ3f.js +16 -0
  67. package/distance-block-3NkgFZ3f.js.map +1 -0
  68. package/divide-block-ZyepIg_-.js +6 -0
  69. package/divide-block-ZyepIg_-.js.map +1 -0
  70. package/dot-block-VlfAC6cD.js +16 -0
  71. package/dot-block-VlfAC6cD.js.map +1 -0
  72. package/elbow-block-NEOiIxzO.js +10 -0
  73. package/elbow-block-NEOiIxzO.js.map +1 -0
  74. package/emissive-fragment-BnNvbBCw.js +39 -0
  75. package/emissive-fragment-BnNvbBCw.js.map +1 -0
  76. package/esm-shadow-view-DGKdF1NI.js +18 -0
  77. package/esm-shadow-view-DGKdF1NI.js.map +1 -0
  78. package/esm-shadow-view-DN9HIaM4.js +15 -0
  79. package/esm-shadow-view-DN9HIaM4.js.map +1 -0
  80. package/esm-shadow-view-Dk9NFtLq.js +15 -0
  81. package/esm-shadow-view-Dk9NFtLq.js.map +1 -0
  82. package/fog-block-DJ9hEolm.js +41 -0
  83. package/fog-block-DJ9hEolm.js.map +1 -0
  84. package/frag-coord-block-DzXfFgfV.js +25 -0
  85. package/frag-coord-block-DzXfFgfV.js.map +1 -0
  86. package/frag-depth-block-UQbeKP2D.js +34 -0
  87. package/frag-depth-block-UQbeKP2D.js.map +1 -0
  88. package/fragment-output-BOphkIeh.js +26 -0
  89. package/fragment-output-BOphkIeh.js.map +1 -0
  90. package/fresnel-block-DefHWeO-.js +20 -0
  91. package/fresnel-block-DefHWeO-.js.map +1 -0
  92. package/front-facing-0d6aiyrv.js +11 -0
  93. package/front-facing-0d6aiyrv.js.map +1 -0
  94. package/gaussian-splatting-pipeline-sh-DgJl7l56.js +500 -0
  95. package/gaussian-splatting-pipeline-sh-DgJl7l56.js.map +1 -0
  96. package/gltf-animation-D7uyTyO3.js +245 -0
  97. package/gltf-animation-D7uyTyO3.js.map +1 -0
  98. package/gltf-ext-anisotropy-CknJiJK8.js +22 -0
  99. package/gltf-ext-anisotropy-CknJiJK8.js.map +1 -0
  100. package/gltf-ext-basisu-CPg5kPrx.js +452 -0
  101. package/gltf-ext-basisu-CPg5kPrx.js.map +1 -0
  102. package/gltf-ext-clearcoat-CLH2SVph.js +31 -0
  103. package/gltf-ext-clearcoat-CLH2SVph.js.map +1 -0
  104. package/gltf-ext-dielectric-qHzlnvdl.js +105 -0
  105. package/gltf-ext-dielectric-qHzlnvdl.js.map +1 -0
  106. package/gltf-ext-emissive-strength-nzGZXZVK.js +19 -0
  107. package/gltf-ext-emissive-strength-nzGZXZVK.js.map +1 -0
  108. package/gltf-ext-iridescence-C6bq7jiM.js +26 -0
  109. package/gltf-ext-iridescence-C6bq7jiM.js.map +1 -0
  110. package/gltf-ext-node-visibility-MafA9ot2.js +25 -0
  111. package/gltf-ext-node-visibility-MafA9ot2.js.map +1 -0
  112. package/gltf-ext-orm-CT18G_vQ.js +33 -0
  113. package/gltf-ext-orm-CT18G_vQ.js.map +1 -0
  114. package/gltf-ext-quantization-CpZyLDIz.js +94 -0
  115. package/gltf-ext-quantization-CpZyLDIz.js.map +1 -0
  116. package/gltf-ext-sheen-BgIxUzyZ.js +25 -0
  117. package/gltf-ext-sheen-BgIxUzyZ.js.map +1 -0
  118. package/gltf-ext-spec-gloss-D0LJLBUM.js +24 -0
  119. package/gltf-ext-spec-gloss-D0LJLBUM.js.map +1 -0
  120. package/gltf-ext-unlit-D2ANui0V.js +16 -0
  121. package/gltf-ext-unlit-D2ANui0V.js.map +1 -0
  122. package/gltf-ext-uv-transform-CE_-T1Tr.js +38 -0
  123. package/gltf-ext-uv-transform-CE_-T1Tr.js.map +1 -0
  124. package/gltf-feature-animation-pointer-BjpwOOqo.js +88 -0
  125. package/gltf-feature-animation-pointer-BjpwOOqo.js.map +1 -0
  126. package/gltf-feature-animations-CCizegp8.js +15 -0
  127. package/gltf-feature-animations-CCizegp8.js.map +1 -0
  128. package/gltf-feature-draco-yGSMGTE3.js +124 -0
  129. package/gltf-feature-draco-yGSMGTE3.js.map +1 -0
  130. package/gltf-feature-gpu-instancing-2e_CFQnl.js +151 -0
  131. package/gltf-feature-gpu-instancing-2e_CFQnl.js.map +1 -0
  132. package/gltf-feature-lights-punctual-DDDg4j0U.js +71 -0
  133. package/gltf-feature-lights-punctual-DDDg4j0U.js.map +1 -0
  134. package/gltf-feature-meshopt-Des96YFI.js +84 -0
  135. package/gltf-feature-meshopt-Des96YFI.js.map +1 -0
  136. package/gltf-feature-morph-CKCw6tkX.js +29 -0
  137. package/gltf-feature-morph-CKCw6tkX.js.map +1 -0
  138. package/gltf-feature-skeleton-D8hWLqi2.js +36 -0
  139. package/gltf-feature-skeleton-D8hWLqi2.js.map +1 -0
  140. package/gltf-feature-variants-Ds6v9byg.js +17 -0
  141. package/gltf-feature-variants-Ds6v9byg.js.map +1 -0
  142. package/gltf-feature-xmp-BUfq_IVG.js +15 -0
  143. package/gltf-feature-xmp-BUfq_IVG.js.map +1 -0
  144. package/gltf-glb-parser-D6UZWFuC.js +27 -0
  145. package/gltf-glb-parser-D6UZWFuC.js.map +1 -0
  146. package/gltf-interleave-DGnUlz28.js +241 -0
  147. package/gltf-interleave-DGnUlz28.js.map +1 -0
  148. package/gltf-pbr-builder-ext-BFOxOCnQ.js +85 -0
  149. package/gltf-pbr-builder-ext-BFOxOCnQ.js.map +1 -0
  150. package/gltf-variants-DFbr8EES.js +88 -0
  151. package/gltf-variants-DFbr8EES.js.map +1 -0
  152. package/gradient-block-DL_60sDc.js +50 -0
  153. package/gradient-block-DL_60sDc.js.map +1 -0
  154. package/gs-picking-pipeline-DzfMASL9.js +280 -0
  155. package/gs-picking-pipeline-DzfMASL9.js.map +1 -0
  156. package/height-to-normal-block-DhPHkDFg.js +65 -0
  157. package/height-to-normal-block-DhPHkDFg.js.map +1 -0
  158. package/ibl-fragment-DqQVi8k0.js +91 -0
  159. package/ibl-fragment-DqQVi8k0.js.map +1 -0
  160. package/ibl-skybox-wgsl-DCah0kWV.js +13 -0
  161. package/ibl-skybox-wgsl-DCah0kWV.js.map +1 -0
  162. package/image-processing-block-DwrhhmuF.js +40 -0
  163. package/image-processing-block-DwrhhmuF.js.map +1 -0
  164. package/image-source-BuMJgd9-.js +17 -0
  165. package/image-source-BuMJgd9-.js.map +1 -0
  166. package/index-C8HOR2sB.js +19222 -0
  167. package/index-C8HOR2sB.js.map +1 -0
  168. package/index.d.ts +4611 -0
  169. package/index.js +309 -0
  170. package/index.js.map +1 -0
  171. package/input-block-DgAJBzN_.js +109 -0
  172. package/input-block-DgAJBzN_.js.map +1 -0
  173. package/instances-block-BaSSiz8m.js +12 -0
  174. package/instances-block-BaSSiz8m.js.map +1 -0
  175. package/iridescence-block-B0pRFoOU.js +67 -0
  176. package/iridescence-block-B0pRFoOU.js.map +1 -0
  177. package/iridescence-fragment-Gymp7or5.js +243 -0
  178. package/iridescence-fragment-Gymp7or5.js.map +1 -0
  179. package/length-block-ChOkeiHR.js +11 -0
  180. package/length-block-ChOkeiHR.js.map +1 -0
  181. package/lerp-block-DjI2SfmI.js +18 -0
  182. package/lerp-block-DjI2SfmI.js.map +1 -0
  183. package/light-block-B11ew7FA.js +123 -0
  184. package/light-block-B11ew7FA.js.map +1 -0
  185. package/light-information-VJbW0jbs.js +19 -0
  186. package/light-information-VJbW0jbs.js.map +1 -0
  187. package/loop-block-Bb23EOMb.js +71 -0
  188. package/loop-block-Bb23EOMb.js.map +1 -0
  189. package/manifold-AS8POaOr.js +3022 -0
  190. package/manifold-AS8POaOr.js.map +1 -0
  191. package/manifold-RCa7RkKz.js +5 -0
  192. package/manifold-RCa7RkKz.js.map +1 -0
  193. package/matrix-blocks-acWn_V6g.js +51 -0
  194. package/matrix-blocks-acWn_V6g.js.map +1 -0
  195. package/max-block-CjFgljZ7.js +6 -0
  196. package/max-block-CjFgljZ7.js.map +1 -0
  197. package/mesh-attribute-exists-block-BfK8UiSL.js +44 -0
  198. package/mesh-attribute-exists-block-BfK8UiSL.js.map +1 -0
  199. package/mesh-features-BLENkYVt.js +341 -0
  200. package/mesh-features-BLENkYVt.js.map +1 -0
  201. package/min-block-CHtBngNl.js +6 -0
  202. package/min-block-CHtBngNl.js.map +1 -0
  203. package/mod-block-Ceizv8Y7.js +6 -0
  204. package/mod-block-Ceizv8Y7.js.map +1 -0
  205. package/morph-fragment-DOVo70gP.js +59 -0
  206. package/morph-fragment-DOVo70gP.js.map +1 -0
  207. package/morph-targets-55z342ZB.js +35 -0
  208. package/morph-targets-55z342ZB.js.map +1 -0
  209. package/multilight-wgsl-BGyiIOp3.js +112 -0
  210. package/multilight-wgsl-BGyiIOp3.js.map +1 -0
  211. package/multiply-block-DaXLJ7Ud.js +6 -0
  212. package/multiply-block-DaXLJ7Ud.js.map +1 -0
  213. package/negate-block-9CSLc5pM.js +6 -0
  214. package/negate-block-9CSLc5pM.js.map +1 -0
  215. package/nlerp-block-BNK1adIb.js +21 -0
  216. package/nlerp-block-BNK1adIb.js.map +1 -0
  217. package/node-env-BPZXZzBf.js +39 -0
  218. package/node-env-BPZXZzBf.js.map +1 -0
  219. package/node-registry-DwgC4yth.js +190 -0
  220. package/node-registry-DwgC4yth.js.map +1 -0
  221. package/node-registry-extra-advanced-2DJVt67-.js +45 -0
  222. package/node-registry-extra-advanced-2DJVt67-.js.map +1 -0
  223. package/node-registry-extra-compat-Dhrw8fDQ.js +41 -0
  224. package/node-registry-extra-compat-Dhrw8fDQ.js.map +1 -0
  225. package/node-registry-extra-math-CsAHvIZo.js +49 -0
  226. package/node-registry-extra-math-CsAHvIZo.js.map +1 -0
  227. package/node-registry-extra-procedural-5pLQ3Bhz.js +45 -0
  228. package/node-registry-extra-procedural-5pLQ3Bhz.js.map +1 -0
  229. package/node-renderable-DlLIdBmd.js +269 -0
  230. package/node-renderable-DlLIdBmd.js.map +1 -0
  231. package/node-shadow-DKrcqmNg.js +122 -0
  232. package/node-shadow-DKrcqmNg.js.map +1 -0
  233. package/node-snippet-DUMm9qEO.js +22 -0
  234. package/node-snippet-DUMm9qEO.js.map +1 -0
  235. package/normal-blend-block-BfH_nBoj.js +29 -0
  236. package/normal-blend-block-BfH_nBoj.js.map +1 -0
  237. package/normal-map-fragment-DpsIXrJf.js +38 -0
  238. package/normal-map-fragment-DpsIXrJf.js.map +1 -0
  239. package/normalize-block-F2bLNj9K.js +6 -0
  240. package/normalize-block-F2bLNj9K.js.map +1 -0
  241. package/oneminus-block-BP9x4Dc3.js +6 -0
  242. package/oneminus-block-BP9x4Dc3.js.map +1 -0
  243. package/opposite-block-Cnqmm-lH.js +6 -0
  244. package/opposite-block-Cnqmm-lH.js.map +1 -0
  245. package/package.json +26 -0
  246. package/panner-block-BwMQq-6Y.js +13 -0
  247. package/panner-block-BwMQq-6Y.js.map +1 -0
  248. package/parse-camera-DM3oJJeT.js +23 -0
  249. package/parse-camera-DM3oJJeT.js.map +1 -0
  250. package/pbr-aces-wgsl-HpiQHGN_.js +13 -0
  251. package/pbr-aces-wgsl-HpiQHGN_.js.map +1 -0
  252. package/pbr-metallic-roughness-block-full-6vMm1Jk6.js +763 -0
  253. package/pbr-metallic-roughness-block-full-6vMm1Jk6.js.map +1 -0
  254. package/pbr-metallic-roughness-block-h_KAOZrW.js +104 -0
  255. package/pbr-metallic-roughness-block-h_KAOZrW.js.map +1 -0
  256. package/pbr-mr-helper-core-CIwm-T1G.js +237 -0
  257. package/pbr-mr-helper-core-CIwm-T1G.js.map +1 -0
  258. package/pbr-refraction-DGmMSa2v.js +17 -0
  259. package/pbr-refraction-DGmMSa2v.js.map +1 -0
  260. package/pbr-renderable-BJxUtPBb.js +961 -0
  261. package/pbr-renderable-BJxUtPBb.js.map +1 -0
  262. package/pbr-shadow-fragment-LO9SlbJj.js +14 -0
  263. package/pbr-shadow-fragment-LO9SlbJj.js.map +1 -0
  264. package/pbr-template-ext-8q7BcTDf.js +88 -0
  265. package/pbr-template-ext-8q7BcTDf.js.map +1 -0
  266. package/pbr-tracking-B3alzn91.js +31 -0
  267. package/pbr-tracking-B3alzn91.js.map +1 -0
  268. package/pbr-transmission-ext-BxW4CEGu.js +581 -0
  269. package/pbr-transmission-ext-BxW4CEGu.js.map +1 -0
  270. package/perturb-normal-0Q8EM9ig.js +39 -0
  271. package/perturb-normal-0Q8EM9ig.js.map +1 -0
  272. package/posterize-block-DfdKsbEf.js +28 -0
  273. package/posterize-block-DfdKsbEf.js.map +1 -0
  274. package/pow-block-DI5ICzhc.js +13 -0
  275. package/pow-block-DI5ICzhc.js.map +1 -0
  276. package/random-number-block-2OyRYljF.js +15 -0
  277. package/random-number-block-2OyRYljF.js.map +1 -0
  278. package/reciprocal-block-Ck3CW-j-.js +14 -0
  279. package/reciprocal-block-Ck3CW-j-.js.map +1 -0
  280. package/reflect-block-CizpzrX4.js +12 -0
  281. package/reflect-block-CizpzrX4.js.map +1 -0
  282. package/reflectance-fragment-BCrgPmrt.js +143 -0
  283. package/reflectance-fragment-BCrgPmrt.js.map +1 -0
  284. package/reflection-block-DqcwyYqr.js +12 -0
  285. package/reflection-block-DqcwyYqr.js.map +1 -0
  286. package/reflection-texture-base-block-1xmJ0HDj.js +10 -0
  287. package/reflection-texture-base-block-1xmJ0HDj.js.map +1 -0
  288. package/reflection-texture-block-C3QtzoV8.js +60 -0
  289. package/reflection-texture-block-C3QtzoV8.js.map +1 -0
  290. package/refract-block-HHiAk-7U.js +13 -0
  291. package/refract-block-HHiAk-7U.js.map +1 -0
  292. package/refraction-block-U8y6XiXs.js +11 -0
  293. package/refraction-block-U8y6XiXs.js.map +1 -0
  294. package/refraction-dispersion-wgsl-DdQCyyO1.js +16 -0
  295. package/refraction-dispersion-wgsl-DdQCyyO1.js.map +1 -0
  296. package/remap-block-DxK1W1vp.js +27 -0
  297. package/remap-block-DxK1W1vp.js.map +1 -0
  298. package/replace-color-block-1m--hiru.js +17 -0
  299. package/replace-color-block-1m--hiru.js.map +1 -0
  300. package/rgbd-decode-DCvzUYeI.js +110 -0
  301. package/rgbd-decode-DCvzUYeI.js.map +1 -0
  302. package/rotate2d-block-nEe1N2MJ.js +15 -0
  303. package/rotate2d-block-nEe1N2MJ.js.map +1 -0
  304. package/scale-block-C5Z8159G.js +13 -0
  305. package/scale-block-C5Z8159G.js.map +1 -0
  306. package/scene-material-swap-C2ykv55W.js +34 -0
  307. package/scene-material-swap-C2ykv55W.js.map +1 -0
  308. package/screen-size-block-BVNnOvE8.js +21 -0
  309. package/screen-size-block-BVNnOvE8.js.map +1 -0
  310. package/screen-space-block-CwaxdfSe.js +28 -0
  311. package/screen-space-block-CwaxdfSe.js.map +1 -0
  312. package/shader-renderable-D-6796KR.js +531 -0
  313. package/shader-renderable-D-6796KR.js.map +1 -0
  314. package/shadow-fragment-core-DHN2G6FI.js +110 -0
  315. package/shadow-fragment-core-DHN2G6FI.js.map +1 -0
  316. package/shadow-map-CQNQC-Fw.js +13 -0
  317. package/shadow-map-CQNQC-Fw.js.map +1 -0
  318. package/sheen-block-BugfJqK3.js +12 -0
  319. package/sheen-block-BugfJqK3.js.map +1 -0
  320. package/sheen-fragment-Dze2f7XJ.js +215 -0
  321. package/sheen-fragment-Dze2f7XJ.js.map +1 -0
  322. package/simplex-perlin-3d-block-CcMtofzV.js +58 -0
  323. package/simplex-perlin-3d-block-CcMtofzV.js.map +1 -0
  324. package/singlelight-directional-wgsl-CmUDZxwz.js +39 -0
  325. package/singlelight-directional-wgsl-CmUDZxwz.js.map +1 -0
  326. package/singlelight-hemispheric-wgsl-t-83IP_s.js +40 -0
  327. package/singlelight-hemispheric-wgsl-t-83IP_s.js.map +1 -0
  328. package/singlelight-point-wgsl-CLzULIYV.js +45 -0
  329. package/singlelight-point-wgsl-CLzULIYV.js.map +1 -0
  330. package/singlelight-spot-wgsl-DEEUrfVM.js +47 -0
  331. package/singlelight-spot-wgsl-DEEUrfVM.js.map +1 -0
  332. package/skeleton-fragment-B_XlFbtx.js +71 -0
  333. package/skeleton-fragment-B_XlFbtx.js.map +1 -0
  334. package/skybox-renderable-DDwzu-PT.js +92 -0
  335. package/skybox-renderable-DDwzu-PT.js.map +1 -0
  336. package/skybox.vertex-DJgi072W.js +5 -0
  337. package/skybox.vertex-DJgi072W.js.map +1 -0
  338. package/smoothstep-block-Di4t37x-.js +15 -0
  339. package/smoothstep-block-Di4t37x-.js.map +1 -0
  340. package/splat-ply-compressed-BahdBG1r.js +394 -0
  341. package/splat-ply-compressed-BahdBG1r.js.map +1 -0
  342. package/standard-renderable-GjxL9xSf.js +636 -0
  343. package/standard-renderable-GjxL9xSf.js.map +1 -0
  344. package/std-ambient-fragment-BoUsD06w.js +37 -0
  345. package/std-ambient-fragment-BoUsD06w.js.map +1 -0
  346. package/std-cube-reflection-fragment-ulqc3bsP.js +31 -0
  347. package/std-cube-reflection-fragment-ulqc3bsP.js.map +1 -0
  348. package/std-emissive-fragment-DNGj1HdQ.js +40 -0
  349. package/std-emissive-fragment-DNGj1HdQ.js.map +1 -0
  350. package/std-lightmap-fragment-Bqj89aIe.js +37 -0
  351. package/std-lightmap-fragment-Bqj89aIe.js.map +1 -0
  352. package/std-opacity-fragment-KuPh5N2Z.js +37 -0
  353. package/std-opacity-fragment-KuPh5N2Z.js.map +1 -0
  354. package/std-reflection-fragment-BA5Ghn_M.js +57 -0
  355. package/std-reflection-fragment-BA5Ghn_M.js.map +1 -0
  356. package/std-shadow-fragment-FNQfrJuC.js +8 -0
  357. package/std-shadow-fragment-FNQfrJuC.js.map +1 -0
  358. package/std-specular-fragment-CE-6scqd.js +37 -0
  359. package/std-specular-fragment-CE-6scqd.js.map +1 -0
  360. package/std-tracking-CNKZ-hJN.js +15 -0
  361. package/std-tracking-CNKZ-hJN.js.map +1 -0
  362. package/step-block-BkywzTYm.js +13 -0
  363. package/step-block-BkywzTYm.js.map +1 -0
  364. package/storage-read-block-BdzhJfln.js +25 -0
  365. package/storage-read-block-BdzhJfln.js.map +1 -0
  366. package/storage-write-block-DjLKZ0Ro.js +11 -0
  367. package/storage-write-block-DjLKZ0Ro.js.map +1 -0
  368. package/subsurface-block-CBhxT9ui.js +12 -0
  369. package/subsurface-block-CBhxT9ui.js.map +1 -0
  370. package/subsurface-fragment-liM3y2-P.js +158 -0
  371. package/subsurface-fragment-liM3y2-P.js.map +1 -0
  372. package/subtract-block-NPfKvzQP.js +6 -0
  373. package/subtract-block-NPfKvzQP.js.map +1 -0
  374. package/swapchain-overlay-DcCSFDp7.js +35 -0
  375. package/swapchain-overlay-DcCSFDp7.js.map +1 -0
  376. package/tbn-block-ByOI6Y43.js +43 -0
  377. package/tbn-block-ByOI6Y43.js.map +1 -0
  378. package/teleport-in-block-BMa17cqq.js +10 -0
  379. package/teleport-in-block-BMa17cqq.js.map +1 -0
  380. package/teleport-out-block-5AkB25H6.js +19 -0
  381. package/teleport-out-block-5AkB25H6.js.map +1 -0
  382. package/texture-block-rr21KIL_.js +70 -0
  383. package/texture-block-rr21KIL_.js.map +1 -0
  384. package/thin-instance-fragment-hsv-RyDs.js +69 -0
  385. package/thin-instance-fragment-hsv-RyDs.js.map +1 -0
  386. package/thin-instance-gpu-C9Gv_Z1w.js +62 -0
  387. package/thin-instance-gpu-C9Gv_Z1w.js.map +1 -0
  388. package/tracking-primitives-wgdBY85t.js +82 -0
  389. package/tracking-primitives-wgdBY85t.js.map +1 -0
  390. package/transform-block-DbRph9JI.js +32 -0
  391. package/transform-block-DbRph9JI.js.map +1 -0
  392. package/trigonometry-block-BYQcTHiD.js +36 -0
  393. package/trigonometry-block-BYQcTHiD.js.map +1 -0
  394. package/triplanar-block-BZHkD9hX.js +148 -0
  395. package/triplanar-block-BZHkD9hX.js.map +1 -0
  396. package/twirl-block-78WtdiBd.js +39 -0
  397. package/twirl-block-78WtdiBd.js.map +1 -0
  398. package/unlit-fragment-BIlhJpz6.js +43 -0
  399. package/unlit-fragment-BIlhJpz6.js.map +1 -0
  400. package/uv-transform-fragment-hYujGpZg.js +47 -0
  401. package/uv-transform-fragment-hYujGpZg.js.map +1 -0
  402. package/vector-merger-CrW-ONB0.js +43 -0
  403. package/vector-merger-CrW-ONB0.js.map +1 -0
  404. package/vector-splitter-BoJuHrAU.js +34 -0
  405. package/vector-splitter-BoJuHrAU.js.map +1 -0
  406. package/vertex-output-Cvft64y0.js +14 -0
  407. package/vertex-output-Cvft64y0.js.map +1 -0
  408. package/view-direction-CWVucfnT.js +12 -0
  409. package/view-direction-CWVucfnT.js.map +1 -0
  410. package/voronoi-noise-block-iNQxa_Ls.js +43 -0
  411. package/voronoi-noise-block-iNQxa_Ls.js.map +1 -0
  412. package/wave-block-CY_mk1ec.js +41 -0
  413. package/wave-block-CY_mk1ec.js.map +1 -0
  414. package/wgsl-helpers-DyzNzCeE.js +48 -0
  415. package/wgsl-helpers-DyzNzCeE.js.map +1 -0
  416. package/worley-noise-3d-block-CyR2-k4s.js +58 -0
  417. package/worley-noise-3d-block-CyR2-k4s.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbr-transmission-ext-BxW4CEGu.js","sources":["../src/resource/trilinear-anisotropic-sampler.ts","../src/frame-graph/transmission.ts","../src/material/pbr/fragments/refraction-rtt-fragment.ts","../src/material/pbr/pbr-transmission-ext.ts"],"sourcesContent":["import type { EngineContext } from \"../engine/engine.js\";\nimport { getOrCreateSampler } from \"./gpu-pool.js\";\n\nconst _trilinearAnisotropicDesc: GPUSamplerDescriptor = {\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n addressModeU: \"repeat\",\n addressModeV: \"repeat\",\n addressModeW: \"repeat\",\n maxAnisotropy: 4,\n};\n\nexport function getTrilinearAnisotropicSampler(engine: EngineContext): GPUSampler {\n return getOrCreateSampler(engine, _trilinearAnisotropicDesc);\n}\n","import type { EngineContext } from \"../engine/engine.js\";\nimport { _vis } from \"../engine/engine.js\";\nimport { getBilinearSampler } from \"../resource/samplers.js\";\nimport { getTrilinearAnisotropicSampler } from \"../resource/trilinear-anisotropic-sampler.js\";\nimport type { Texture2D } from \"../texture/texture-2d.js\";\nimport { recordMipmaps } from \"../texture/generate-mipmaps.js\";\nimport { biasedMipLevelCount } from \"../texture/mip-count.js\";\nimport type { DrawBinding } from \"../render/renderable.js\";\nimport type { RenderTask } from \"./render-task.js\";\nimport type { SceneContext } from \"../scene/scene-core.js\";\nimport { createImageProcessingTask } from \"./image-processing-task.js\";\n\nexport interface RenderTaskTransmissionState {\n readonly texture: Texture2D;\n /** @internal */\n readonly _baseView: GPUTextureView;\n /** @internal */\n _sourceWidth: number;\n /** @internal */\n _sourceHeight: number;\n /** @internal */\n _sourceTexture: GPUTexture | null;\n /** @internal */\n _blit: TransmissionBlitState | null;\n /** @internal */\n readonly _copyCount: number;\n /** @internal */\n readonly _generateMipmaps: boolean;\n /** @internal */\n _copies: number;\n}\n\ninterface TransmissionBlitState {\n readonly _pipeline: GPURenderPipeline;\n readonly _bindGroup: GPUBindGroup;\n}\n\nconst BLIT_SHADER = `@group(0)@binding(0)var t:texture_2d<f32>;@group(0)@binding(1)var s:sampler;struct V{@builtin(position)p:vec4f,@location(0)u:vec2f};@vertex fn vs(@builtin(vertex_index)i:u32)->V{var p=array<vec2f,3>(vec2f(-1,-1),vec2f(3,-1),vec2f(-1,3));var u=array<vec2f,3>(vec2f(0,1),vec2f(2,1),vec2f(0,-1));return V(vec4f(p[i],0,1),u[i]);}@fragment fn fs(v:V)->@location(0)vec4f{return textureSample(t,s,v.u);}`;\nconst BLIT_MSAA_SHADER = `@group(0)@binding(0)var t:texture_multisampled_2d<f32>;struct V{@builtin(position)p:vec4f,@location(0)u:vec2f};@vertex fn vs(@builtin(vertex_index)i:u32)->V{var p=array<vec2f,3>(vec2f(-1,-1),vec2f(3,-1),vec2f(-1,3));var u=array<vec2f,3>(vec2f(0,1),vec2f(2,1),vec2f(0,-1));return V(vec4f(p[i],0,1),u[i]);}fn l(p:vec2i)->vec4f{let n=textureNumSamples(t);var c=vec4f(0);for(var i=0u;i<n;i++){c+=textureLoad(t,p,i);}return c/f32(n);}@fragment fn fs(v:V)->@location(0)vec4f{let d=vec2i(textureDimensions(t));let q=clamp(v.u*vec2f(d)-.5,vec2f(0),vec2f(d-vec2i(1)));let p=vec2i(floor(q));let f=fract(q);let p1=min(p+vec2i(1),d-vec2i(1));return mix(mix(l(p),l(vec2i(p1.x,p.y)),f.x),mix(l(vec2i(p.x,p1.y)),l(p1),f.x),f.y);}`;\nconst REFRACTION_LOD_BIAS = 4;\nlet blitPipelines: Map<string, GPURenderPipeline> | null = null;\nlet blitShader: GPUShaderModule | null = null;\nlet blitMsaaShader: GPUShaderModule | null = null;\nlet blitBgl: GPUBindGroupLayout | null = null;\nlet blitMsaaBgl: GPUBindGroupLayout | null = null;\nlet blitDevice: GPUDevice | null = null;\n\nexport function enableSceneTransmission(scene: SceneContext, engine: EngineContext): void {\n markPbrMaterialsLinear(scene);\n let lastRenderTask: RenderTask | null = null;\n for (const task of scene._frameGraph._tasks) {\n if (\"_renderables\" in task) {\n const renderTask = task as RenderTask;\n enableRenderTaskTransmission(renderTask, engine);\n lastRenderTask = renderTask;\n }\n }\n if (lastRenderTask && !scene._frameGraph._tasks.some((task) => task.name === \"transmission-image-processing\")) {\n scene._frameGraph._tasks.push(createImageProcessingTask({ name: \"transmission-image-processing\", source: lastRenderTask._config.rt }, engine, scene));\n }\n}\n\nexport function enableRenderTaskTransmission(task: RenderTask, engine: EngineContext): void {\n if (task._executeWithTransmission) {\n return;\n }\n retargetRenderTaskToLinearOffscreen(task, engine);\n let state: RenderTaskTransmissionState | null = null;\n const record = task.record.bind(task);\n const execute = task.execute?.bind(task);\n const dispose = task.dispose?.bind(task);\n task.record = () => {\n disposeRenderTaskTransmission(state);\n state = createRenderTaskTransmission(task, engine);\n (task._targetSignature as { _transmissionTexture?: Texture2D })._transmissionTexture = state.texture;\n record();\n configureTransmissionSource(state, task, engine);\n };\n if (execute) {\n task.execute = () => executeRenderTaskLinear(task.scene, execute);\n }\n task.dispose = () => {\n disposeRenderTaskTransmission(state);\n state = null;\n dispose?.();\n };\n task._executeWithTransmission = (sampleCount) => executePassWithTransmission(task, engine, state!, sampleCount);\n}\n\nfunction retargetRenderTaskToLinearOffscreen(task: RenderTask, engine: EngineContext): void {\n const desc = task._config.rt._descriptor;\n if (desc.resolveToSwapchain) {\n desc.resolveToSwapchain = false;\n desc.colorFormat = \"rgba16float\";\n desc.flipY = false;\n task._opaqueBundles.length = 0;\n task._lastVersion = -1;\n } else if (!desc.colorFormat) {\n desc.colorFormat = \"rgba16float\";\n }\n desc.sampleCount = engine.msaaSamples;\n const sig = task._targetSignature as {\n _colorFormat?: GPUTextureFormat;\n _depthStencilFormat?: GPUTextureFormat;\n _depthCompare?: GPUCompareFunction;\n _sampleCount: number;\n _flipY?: boolean;\n };\n sig._colorFormat = desc.colorFormat;\n sig._depthStencilFormat = desc.depthStencilFormat;\n sig._depthCompare = desc._depthCompare;\n sig._sampleCount = desc.sampleCount;\n sig._flipY = desc.flipY ?? true;\n}\n\nfunction executeRenderTaskLinear(scene: SceneContext, execute: () => number): number {\n const imageProcessing = scene.imageProcessing as { exposure: number; contrast: number; toneMappingEnabled: boolean | number };\n const toneMappingEnabled = imageProcessing.toneMappingEnabled;\n const clearColor = scene.clearColor;\n const linearClearColor = inverseImageProcessedColor(clearColor, imageProcessing.exposure, imageProcessing.contrast, toneMappingEnabled === true);\n imageProcessing.toneMappingEnabled = -1;\n scene.clearColor = linearClearColor;\n try {\n return execute();\n } finally {\n scene.clearColor = clearColor;\n imageProcessing.toneMappingEnabled = toneMappingEnabled;\n }\n}\n\nfunction inverseImageProcessedColor(color: GPUColorDict, exposure: number, contrast: number, toneMapping: boolean): GPUColorDict {\n return {\n r: inverseImageProcessedChannel(color.r, exposure, contrast, toneMapping),\n g: inverseImageProcessedChannel(color.g, exposure, contrast, toneMapping),\n b: inverseImageProcessedChannel(color.b, exposure, contrast, toneMapping),\n a: color.a,\n };\n}\n\nfunction inverseImageProcessedChannel(value: number, exposure: number, contrast: number, toneMapping: boolean): number {\n let c = clamp01(value);\n if (contrast < 1) {\n c = contrast > 0 ? clamp01((c - 0.5 * (1 - contrast)) / contrast) : 0.5;\n } else if (contrast > 1) {\n const mixAmount = contrast - 1;\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 16; i++) {\n const mid = (lo + hi) * 0.5;\n const high = mid * mid * (3 - 2 * mid);\n const out = mid + (high - mid) * mixAmount;\n if (out < c) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n c = (lo + hi) * 0.5;\n }\n c = c ** 2.2;\n if (toneMapping) {\n c = -Math.log2(Math.max(1 - c, 1e-6)) / 1.5905790328979492;\n }\n return exposure > 0 ? c / exposure : c;\n}\n\nfunction clamp01(v: number): number {\n return Math.min(Math.max(v, 0), 1);\n}\n\nfunction markPbrMaterialsLinear(scene: SceneContext): void {\n for (const mesh of scene.meshes) {\n const mat = mesh.material as { _linearImageProcessing?: boolean; _renderFeatures?: unknown } | undefined;\n if (mat) {\n mat._linearImageProcessing = true;\n mat._renderFeatures = undefined;\n }\n }\n}\n\nfunction createRenderTaskTransmission(task: RenderTask, engine: EngineContext): RenderTaskTransmissionState {\n const rt = task._config.rt;\n const width = 1024;\n const height = 1024;\n const format: GPUTextureFormat = \"rgba16float\";\n const generateMipmaps = shouldGenerateMipmaps(task._config.transmission);\n const texture = engine._device.createTexture({\n label: task.name,\n size: { width, height },\n format,\n mipLevelCount: generateMipmaps ? biasedMipLevelCount(width, height, REFRACTION_LOD_BIAS) : 1,\n usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n });\n const tex: Texture2D = {\n texture,\n view: texture.createView(),\n sampler: getTrilinearAnisotropicSampler(engine),\n width,\n height,\n invertY: false,\n };\n return {\n texture: tex,\n _baseView: texture.createView({ baseMipLevel: 0, mipLevelCount: 1 }),\n _sourceWidth: rt._width,\n _sourceHeight: rt._height,\n _sourceTexture: null,\n _blit: null,\n _copyCount: normalizeCopyCount(task._config.transmission),\n _generateMipmaps: generateMipmaps,\n _copies: 0,\n };\n}\n\nfunction configureTransmissionSource(state: RenderTaskTransmissionState, task: RenderTask, engine: EngineContext): void {\n const rt = task._config.rt;\n state._sourceWidth = rt._width;\n state._sourceHeight = rt._height;\n state._sourceTexture = rt._colorTexture;\n const sampleCount = task._targetSignature._sampleCount;\n if (!state._sourceTexture) {\n return;\n }\n state._blit = shouldBlitTransmission(state, sampleCount) ? createTransmissionBlit(state, engine, state._sourceTexture, sampleCount > 1) : null;\n}\n\nfunction disposeRenderTaskTransmission(state: RenderTaskTransmissionState | null | undefined): void {\n state?.texture.texture.destroy();\n}\n\nexport function executePassWithTransmission(task: RenderTask, engine: EngineContext, state: RenderTaskTransmissionState, sampleCount: number): number {\n state._copies = 0;\n const transparent = task._transparentBindings;\n let pass = beginTaskPass(task, null, sampleCount, false);\n let draws = drawBaseTask(task, pass);\n let lastPipeline: GPURenderPipeline | null = null;\n for (let i = 0; i < transparent.length; i++) {\n const binding = transparent[i]!;\n const transmissive = binding.renderable._transmissive === true;\n if (transmissive && canUpdateTransmission(state)) {\n pass.end();\n updateTransmissionTexture(state, engine);\n pass = beginTaskPass(task, null, sampleCount, true);\n setPassState(task, pass);\n lastPipeline = null;\n }\n const mesh = binding.renderable.mesh;\n if (mesh && mesh.visible === false) {\n continue;\n }\n if (binding.pipeline !== lastPipeline) {\n pass.setPipeline(binding.pipeline);\n lastPipeline = binding.pipeline;\n }\n draws += binding.draw(pass, engine);\n }\n pass.end();\n return draws;\n}\n\nfunction updateTransmissionTexture(state: RenderTaskTransmissionState, engine: EngineContext): void {\n if (!state._sourceTexture) {\n throw new Error(\"No transmission source\");\n }\n if (state._blit) {\n blitToTransmission(state, engine);\n } else {\n engine._currentEncoder.copyTextureToTexture(\n { texture: state._sourceTexture },\n { texture: state.texture.texture },\n { width: state.texture.width, height: state.texture.height }\n );\n }\n if (state._generateMipmaps) {\n recordMipmaps(engine, state.texture.texture, engine._currentEncoder);\n }\n state._copies++;\n}\n\nfunction getBlitPipeline(engine: EngineContext, format: GPUTextureFormat, multisampled: boolean): GPURenderPipeline {\n const device = engine._device;\n if (device !== blitDevice) {\n blitPipelines?.clear();\n blitPipelines = null;\n blitShader = null;\n blitMsaaShader = null;\n blitBgl = null;\n blitMsaaBgl = null;\n blitDevice = device;\n }\n if (multisampled) {\n blitMsaaShader ??= device.createShaderModule({ code: BLIT_MSAA_SHADER });\n blitMsaaBgl ??= device.createBindGroupLayout({\n entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"unfilterable-float\", multisampled: true } }],\n });\n } else {\n blitShader ??= device.createShaderModule({ code: BLIT_SHADER });\n blitBgl ??= device.createBindGroupLayout({\n entries: [\n { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: \"float\" } },\n { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: {} },\n ],\n });\n }\n blitPipelines ??= new Map();\n const key = `${format}:${multisampled ? \"msaa\" : \"\"}`;\n let pipeline = blitPipelines.get(key);\n if (!pipeline) {\n const bgl = multisampled ? blitMsaaBgl! : blitBgl!;\n pipeline = device.createRenderPipeline({\n label: \"transmission-copy\",\n layout: device.createPipelineLayout({ bindGroupLayouts: [bgl] }),\n vertex: { module: multisampled ? blitMsaaShader! : blitShader!, entryPoint: \"vs\" },\n fragment: { module: multisampled ? blitMsaaShader! : blitShader!, entryPoint: \"fs\", targets: [{ format }] },\n primitive: { topology: \"triangle-list\" },\n });\n blitPipelines.set(key, pipeline);\n }\n return pipeline;\n}\n\nfunction shouldBlitTransmission(state: RenderTaskTransmissionState, sampleCount: number): boolean {\n return sampleCount > 1 || state._sourceWidth !== state.texture.width || state._sourceHeight !== state.texture.height;\n}\n\nfunction createTransmissionBlit(state: RenderTaskTransmissionState, engine: EngineContext, source: GPUTexture, multisampled: boolean): TransmissionBlitState {\n const device = engine._device;\n const pipeline = getBlitPipeline(engine, state.texture.texture.format, multisampled);\n const bindGroup = device.createBindGroup({\n layout: multisampled ? blitMsaaBgl! : blitBgl!,\n entries: multisampled\n ? [{ binding: 0, resource: source.createView() }]\n : [\n { binding: 0, resource: source.createView() },\n { binding: 1, resource: getBilinearSampler(engine) },\n ],\n });\n return { _pipeline: pipeline, _bindGroup: bindGroup };\n}\n\nfunction blitToTransmission(state: RenderTaskTransmissionState, engine: EngineContext): void {\n const blit = state._blit!;\n const pass = engine._currentEncoder.beginRenderPass({\n colorAttachments: [{ view: state._baseView, loadOp: \"clear\", storeOp: \"store\", clearValue: { r: 0, g: 0, b: 0, a: 0 } }],\n });\n pass.setPipeline(blit._pipeline);\n pass.setBindGroup(0, blit._bindGroup);\n pass.draw(3);\n pass.end();\n}\n\nfunction canUpdateTransmission(state: RenderTaskTransmissionState): boolean {\n return state._copyCount === 0 || state._copies < state._copyCount;\n}\n\nfunction beginTaskPass(task: RenderTask, resolveTarget: GPUTextureView | null, sampleCount: number, load: boolean): GPURenderPassEncoder {\n const att = task._colorAttachment;\n const depthLoadOp = load || !task._config.clr ? \"load\" : \"clear\";\n if (load) {\n att.loadOp = \"load\";\n }\n const depthAttachment = task._renderPassDescriptor.depthStencilAttachment;\n if (depthAttachment) {\n depthAttachment.depthLoadOp = depthLoadOp;\n if (depthAttachment.stencilLoadOp) {\n depthAttachment.stencilLoadOp = depthLoadOp;\n }\n }\n if (sampleCount > 1) {\n att.resolveTarget = resolveTarget ?? undefined;\n } else {\n att.resolveTarget = undefined;\n }\n return task.engine._currentEncoder.beginRenderPass(task._renderPassDescriptor);\n}\n\nfunction setPassState(task: RenderTask, pass: GPURenderPassEncoder): void {\n const cfg = task._config;\n const rt = cfg.rt;\n const scene = task.scene;\n const camera = cfg.cam ?? scene.camera;\n const v = camera?.viewport;\n if (v) {\n const rw = rt._width;\n const rh = rt._height;\n const x = Math.floor(v.x * rw);\n const y = Math.floor((1 - v.y - v.height) * rh);\n const w = Math.ceil((v.x + v.width) * rw) - x;\n const h = Math.ceil((1 - v.y) * rh) - y;\n pass.setViewport(x, y, w, h, 0, 1);\n pass.setScissorRect(x, y, w, h);\n }\n pass.setBindGroup(0, task._sceneBG);\n}\n\nfunction drawBaseTask(task: RenderTask, pass: GPURenderPassEncoder): number {\n const eng = task.engine;\n const rt = task._config.rt;\n const scene = task.scene;\n const opaqueBindings = task._opaqueBindings;\n const opaqueBundles = task._opaqueBundles;\n\n setPassState(task, pass);\n\n if (task._lastVersion !== scene._renderableVersion || task._lastVis !== _vis || opaqueBundles.length === 0) {\n const desc = rt._descriptor;\n const be = eng._device.createRenderBundleEncoder({\n colorFormats: desc.colorFormat ? [desc.colorFormat] : [],\n depthStencilFormat: desc.depthStencilFormat,\n sampleCount: desc.sampleCount ?? 1,\n });\n be.setBindGroup(0, task._sceneBG);\n drawList(be, opaqueBindings, eng);\n opaqueBundles[0] = be.finish();\n task._lastVersion = scene._renderableVersion;\n task._lastVis = _vis;\n }\n let draws = opaqueBindings.length;\n pass.executeBundles(opaqueBundles);\n pass.setBindGroup(0, task._sceneBG);\n draws += drawList(pass, task._directBindings, eng);\n return draws;\n}\n\nfunction drawList(enc: GPURenderPassEncoder | GPURenderBundleEncoder, list: readonly DrawBinding[], engine: EngineContext): number {\n let lp: GPURenderPipeline | null = null;\n let draws = 0;\n for (const b of list) {\n const mesh = b.renderable.mesh;\n if (mesh && mesh.visible === false) {\n continue;\n }\n if (b.pipeline !== lp) {\n enc.setPipeline(b.pipeline);\n lp = b.pipeline;\n }\n draws += b.draw(enc, engine);\n }\n return draws;\n}\n\nfunction normalizeCopyCount(cfg: RenderTask[\"_config\"][\"transmission\"]): number {\n const count = cfg?.copyCount ?? 1;\n return count === Infinity ? 0 : Math.max(0, count | 0);\n}\n\nfunction shouldGenerateMipmaps(cfg: RenderTask[\"_config\"][\"transmission\"]): boolean {\n return cfg?.generateMipmaps !== false;\n}\n","import type { ShaderFragment, UboField } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps, SubSurfaceProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { getTrilinearAnisotropicSampler } from \"../../../resource/trilinear-anisotropic-sampler.js\";\nimport {\n PBR_HAS_THICKNESS_MAP,\n PBR2_HAS_DISPERSION,\n PBR2_HAS_REFRACTION,\n PBR2_HAS_REFRACTION_MAP,\n PBR2_HAS_THICKNESS_GLTF_CHANNEL,\n PBR2_HAS_VOLUME,\n PBR2_LINEAR_IMAGE_PROCESSING,\n} from \"../pbr-flag-bits.js\";\n\ntype TransmissionMat = PbrMaterialProps & { _linearImageProcessing?: boolean };\nconst LINEAR_IMAGE_PROCESSING_SLOTS = { NI: `if(scene.vImageInfos.w>=0.0){`, BC: `}` };\n\nfunction makeRefractionMod(\n hasVolume: boolean,\n hasMap: boolean,\n hasThicknessMap: boolean,\n useGltfThicknessChannel: boolean,\n hasDispersion: boolean,\n dispersionSampleWgsl: string | undefined\n): string {\n const thicknessScaleLine = hasVolume || hasThicknessMap ? `let ts=max(length(mesh.world[0].xyz),max(length(mesh.world[1].xyz),length(mesh.world[2].xyz)));` : ``;\n const thicknessLine = hasThicknessMap\n ? `let ths=textureSample(thicknessTexture_,thicknessSampler_,input.uv).${useGltfThicknessChannel ? \"g\" : \"r\"};\nlet th=(material.thicknessParams.x+ths*material.thicknessParams.y)*ts;`\n : hasVolume\n ? `let th=material.refractionParams.z*ts;`\n : `let th=material.refractionParams.z;`;\n const textureLine = hasMap ? `let ri=material.refractionParams.x*textureSample(refractionMapTexture,refractionMapSampler,input.uv).r;` : `let ri=material.refractionParams.x;`;\n const absorptionLine = hasVolume ? `let ab=exp(material.volumeParams.rgb*th);` : ``;\n const refractionLine = hasVolume\n ? `let fr=er*surfaceAlbedo*(ri*ab)*(vec3<f32>(1.0)-colorSpecularEnvReflectance.rgb);`\n : `let fr=er*surfaceAlbedo*ri*(vec3<f32>(1.0)-colorSpecularEnvReflectance.rgb);`;\n\n // Refracted environment sample. Dispersion splits the refracted ray into\n // per-RGB index-of-refraction offsets (chromatic aberration); that 3-ray WGSL\n // is injected from a dynamically-imported module (see refraction-dispersion-wgsl.ts)\n // so non-dispersion transmission scenes keep the lean single-ray path below.\n const sampleLines =\n hasDispersion && dispersionSampleWgsl\n ? dispersionSampleWgsl\n : `let rd=refract(-V,N,material.refractionParams.y);\nlet cp=scene.viewProjection*vec4<f32>(input.worldPos+rd*th,1.0);\nlet ruv=(cp.xy/cp.w)*vec2<f32>(0.5,-0.5)+vec2<f32>(0.5,0.5);\nlet er=textureSampleLevel(refractionTexture,refractionSampler_,ruv,lv).rgb*material.environmentIntensity;`;\n\n return `{\n${thicknessScaleLine}\n${textureLine}\n${thicknessLine}\nlet ro=1.0-ri;\nlet ra=mix(alphaG,0.0,clamp(material.refractionParams.w*3.0-2.0,0.0,1.0));\nlet lv=clamp(log2(f32(textureDimensions(refractionTexture).x)*ra)-4.0,0.0,f32(textureNumLevels(refractionTexture)-1));\n${sampleLines}\n${absorptionLine}\n${refractionLine}\ncolor=finalIrradiance*ro*ro+finalRadianceScaled+finalSpecularScaled+directDiffuse*ro*ro+fr+emissive;\n}`;\n}\n\nfunction createRefractionRttFragment(\n hasVolume: boolean,\n hasMap: boolean,\n hasThicknessMap: boolean,\n useGltfThicknessChannel: boolean,\n linearImageProcessing: boolean,\n hasDispersion: boolean,\n dispersionSampleWgsl: string | undefined\n): ShaderFragment {\n const uboFields: UboField[] = [{ _name: \"refractionParams\", _type: \"vec4<f32>\" as const }];\n if (hasVolume) {\n uboFields.push({ _name: \"volumeParams\", _type: \"vec4<f32>\" as const });\n }\n if (hasThicknessMap) {\n uboFields.push({ _name: \"thicknessParams\", _type: \"vec4<f32>\" as const });\n }\n const bindings = [\n { _name: \"refractionTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" } as const, _visibility: 2 },\n { _name: \"refractionSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" } as const, _visibility: 2 },\n ];\n if (hasMap) {\n bindings.push(\n { _name: \"refractionMapTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" } as const, _visibility: 2 },\n { _name: \"refractionMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" } as const, _visibility: 2 }\n );\n }\n if (hasThicknessMap) {\n bindings.push(\n { _name: \"thicknessTexture_\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" } as const, _visibility: 2 },\n { _name: \"thicknessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" } as const, _visibility: 2 }\n );\n }\n return {\n _id: \"refraction\",\n _dependencies: [\"ibl\"],\n _uboFields: uboFields,\n _bindings: bindings,\n _fragmentSlots: linearImageProcessing\n ? { AI: makeRefractionMod(hasVolume, hasMap, hasThicknessMap, useGltfThicknessChannel, hasDispersion, dispersionSampleWgsl), ...LINEAR_IMAGE_PROCESSING_SLOTS }\n : { AI: makeRefractionMod(hasVolume, hasMap, hasThicknessMap, useGltfThicknessChannel, hasDispersion, dispersionSampleWgsl) },\n };\n}\n\nfunction writeRefractionUBO(data: Float32Array, mat: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const ss = mat.subsurface as SubSurfaceProps | undefined;\n const refr = ss?.refraction;\n if (!refr) {\n return;\n }\n const off = offsets.get(\"refractionParams\");\n if (off === undefined) {\n return;\n }\n const o = off / 4;\n data[o] = refr.intensity ?? 0;\n const ior = refr.indexOfRefraction ?? 1.5;\n const thick = ss!.thickness;\n data[o + 1] = 1.0 / (refr.useThicknessAsDepth && thick?.max ? ior : 1.0);\n data[o + 2] = refr.useThicknessAsDepth ? (thick?.max ?? 0.0) : 1.0;\n data[o + 3] = 1.0 / ior;\n\n const vOff = offsets.get(\"volumeParams\");\n if (vOff !== undefined) {\n const vo = vOff / 4;\n const tint = ss!.tint?.color ?? [1, 1, 1];\n const dist = Math.max(ss!.tint?.atDistance ?? 1, 0.0001);\n data[vo] = Math.log(Math.max(tint[0]!, 1e-6)) / dist;\n data[vo + 1] = Math.log(Math.max(tint[1]!, 1e-6)) / dist;\n data[vo + 2] = Math.log(Math.max(tint[2]!, 1e-6)) / dist;\n // w carries the chromatic dispersion strength (0 when no KHR_materials_dispersion).\n data[vo + 3] = refr.dispersion ?? 0;\n }\n\n const tOff = offsets.get(\"thicknessParams\");\n if (tOff !== undefined) {\n const to = tOff / 4;\n const min = thick?.min ?? 0;\n const max = thick?.max ?? 1;\n data[to] = min;\n data[to + 1] = max - min;\n }\n}\n\n/** Build the PBR refraction/transmission extension. When the scene contains a\n * dispersive material, `dispersionSampleWgsl` carries the per-RGB 3-ray sample\n * WGSL (dynamically imported, scene-isolated); otherwise it is undefined and the\n * lean single-ray refraction path is emitted. */\nexport function makeRefractionRttExt(dispersionSampleWgsl?: string): PbrExt {\n return {\n id: \"refraction\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as TransmissionMat;\n const ss = m.subsurface as SubSurfaceProps | undefined;\n const refr = ss?.refraction;\n const linearImageProcessing = m._linearImageProcessing ? PBR2_LINEAR_IMAGE_PROCESSING : 0;\n const intensity = m.transmissive ? (refr?.intensity ?? 0) : 0;\n if (intensity <= 0) {\n return { f: 0, f2: linearImageProcessing };\n }\n let f = 0;\n let f2 = linearImageProcessing | PBR2_HAS_REFRACTION;\n if (refr?.texture) {\n f2 |= PBR2_HAS_REFRACTION_MAP;\n }\n if (ss?.thickness?.texture) {\n f |= PBR_HAS_THICKNESS_MAP;\n }\n if (ss?.thickness?.useGlTFChannel) {\n f2 |= PBR2_HAS_THICKNESS_GLTF_CHANNEL;\n }\n if (ss?.tint?.atDistance !== undefined) {\n f2 |= PBR2_HAS_VOLUME;\n // Dispersion requires the volume path (per-channel etas + volumeParams.w storage).\n if (refr?.dispersion) {\n f2 |= PBR2_HAS_DISPERSION;\n }\n }\n return { f, f2 };\n },\n frag(ctx) {\n const linearImageProcessing = (ctx._features2 & PBR2_LINEAR_IMAGE_PROCESSING) !== 0;\n if (!(ctx._features2 & PBR2_HAS_REFRACTION)) {\n return linearImageProcessing ? { _id: \"linear\", _fragmentSlots: LINEAR_IMAGE_PROCESSING_SLOTS } : null;\n }\n return createRefractionRttFragment(\n (ctx._features2 & PBR2_HAS_VOLUME) !== 0,\n (ctx._features2 & PBR2_HAS_REFRACTION_MAP) !== 0,\n (ctx._features & PBR_HAS_THICKNESS_MAP) !== 0,\n (ctx._features2 & PBR2_HAS_THICKNESS_GLTF_CHANNEL) !== 0,\n linearImageProcessing,\n (ctx._features2 & PBR2_HAS_DISPERSION) !== 0,\n dispersionSampleWgsl\n );\n },\n writeUbo(data, mat, offsets) {\n writeRefractionUBO(data, mat as PbrMaterialProps, offsets);\n },\n bind(ctx, entries, b) {\n if (!(ctx._features2 & PBR2_HAS_REFRACTION)) {\n return b;\n }\n const texture = ctx._refractionTexture;\n if (!texture) {\n throw new Error(\"PBR transmission requires a frame-graph refraction texture.\");\n }\n entries.push({ binding: b++, resource: texture.view });\n entries.push({ binding: b++, resource: texture.sampler });\n if ((ctx._features2 & PBR2_HAS_REFRACTION_MAP) !== 0) {\n const map = ((ctx._material as PbrMaterialProps).subsurface?.refraction as SubSurfaceProps[\"refraction\"] | undefined)?.texture!;\n entries.push({ binding: b++, resource: map.view });\n entries.push({ binding: b++, resource: getTrilinearAnisotropicSampler(ctx._engine) });\n }\n if ((ctx._features & PBR_HAS_THICKNESS_MAP) !== 0) {\n const thickness = (ctx._material as PbrMaterialProps).subsurface?.thickness?.texture!;\n entries.push({ binding: b++, resource: thickness.view });\n entries.push({ binding: b++, resource: thickness.sampler });\n }\n return b;\n },\n textures(mat, out) {\n const tex = (mat as PbrMaterialProps).subsurface?.refraction?.texture;\n if (tex) {\n out.push(tex);\n }\n const thickness = (mat as PbrMaterialProps).subsurface?.thickness?.texture;\n if (thickness) {\n out.push(thickness);\n }\n },\n };\n}\n","import type { SceneContext } from \"../../scene/scene.js\";\nimport type { EngineContext } from \"../../engine/engine.js\";\nimport type { PbrExt } from \"./pbr-flags.js\";\nimport { enableSceneTransmission } from \"../../frame-graph/transmission.js\";\nimport { makeRefractionRttExt } from \"./fragments/refraction-rtt-fragment.js\";\n\nexport function registerPbrTransmission(scene: SceneContext, engine: EngineContext, register: (ext: PbrExt) => void, dispersionSampleWgsl?: string): void {\n enableSceneTransmission(scene, engine);\n register(makeRefractionRttExt(dispersionSampleWgsl));\n}\n"],"names":[],"mappings":";AAGA,MAAM,4BAAkD;AAAA,EACpD,WAAW;AAAA,EACX,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AACnB;AAEO,SAAS,+BAA+B,QAAmC;AAC9E,SAAO,mBAAmB,QAAQ,yBAAyB;AAC/D;ACsBA,MAAM,cAAc;AACpB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAC5B,IAAI,gBAAuD;AAC3D,IAAI,aAAqC;AACzC,IAAI,iBAAyC;AAC7C,IAAI,UAAqC;AACzC,IAAI,cAAyC;AAC7C,IAAI,aAA+B;AAE5B,SAAS,wBAAwB,OAAqB,QAA6B;AACtF,yBAAuB,KAAK;AAC5B,MAAI,iBAAoC;AACxC,aAAW,QAAQ,MAAM,YAAY,QAAQ;AACzC,QAAI,kBAAkB,MAAM;AACxB,YAAM,aAAa;AACnB,mCAA6B,YAAY,MAAM;AAC/C,uBAAiB;AAAA,IACrB;AAAA,EACJ;AACA,MAAI,kBAAkB,CAAC,MAAM,YAAY,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,+BAA+B,GAAG;AAC3G,UAAM,YAAY,OAAO,KAAK,0BAA0B,EAAE,MAAM,iCAAiC,QAAQ,eAAe,QAAQ,GAAA,GAAM,QAAQ,KAAK,CAAC;AAAA,EACxJ;AACJ;AAEO,SAAS,6BAA6B,MAAkB,QAA6B;;AACxF,MAAI,KAAK,0BAA0B;AAC/B;AAAA,EACJ;AACA,sCAAoC,MAAM,MAAM;AAChD,MAAI,QAA4C;AAChD,QAAM,SAAS,KAAK,OAAO,KAAK,IAAI;AACpC,QAAM,WAAU,UAAK,YAAL,mBAAc,KAAK;AACnC,QAAM,WAAU,UAAK,YAAL,mBAAc,KAAK;AACnC,OAAK,SAAS,MAAM;AAChB,kCAA8B,KAAK;AACnC,YAAQ,6BAA6B,MAAM,MAAM;AAChD,SAAK,iBAA0D,uBAAuB,MAAM;AAC7F,WAAA;AACA,gCAA4B,OAAO,MAAM,MAAM;AAAA,EACnD;AACA,MAAI,SAAS;AACT,SAAK,UAAU,MAAM,wBAAwB,KAAK,OAAO,OAAO;AAAA,EACpE;AACA,OAAK,UAAU,MAAM;AACjB,kCAA8B,KAAK;AACnC,YAAQ;AACR;AAAA,EACJ;AACA,OAAK,2BAA2B,CAAC,gBAAgB,4BAA4B,MAAM,QAAQ,OAAQ,WAAW;AAClH;AAEA,SAAS,oCAAoC,MAAkB,QAA6B;AACxF,QAAM,OAAO,KAAK,QAAQ,GAAG;AAC7B,MAAI,KAAK,oBAAoB;AACzB,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AACnB,SAAK,QAAQ;AACb,SAAK,eAAe,SAAS;AAC7B,SAAK,eAAe;AAAA,EACxB,WAAW,CAAC,KAAK,aAAa;AAC1B,SAAK,cAAc;AAAA,EACvB;AACA,OAAK,cAAc,OAAO;AAC1B,QAAM,MAAM,KAAK;AAOjB,MAAI,eAAe,KAAK;AACxB,MAAI,sBAAsB,KAAK;AAC/B,MAAI,gBAAgB,KAAK;AACzB,MAAI,eAAe,KAAK;AACxB,MAAI,SAAS,KAAK,SAAS;AAC/B;AAEA,SAAS,wBAAwB,OAAqB,SAA+B;AACjF,QAAM,kBAAkB,MAAM;AAC9B,QAAM,qBAAqB,gBAAgB;AAC3C,QAAM,aAAa,MAAM;AACzB,QAAM,mBAAmB,2BAA2B,YAAY,gBAAgB,UAAU,gBAAgB,UAAU,uBAAuB,IAAI;AAC/I,kBAAgB,qBAAqB;AACrC,QAAM,aAAa;AACnB,MAAI;AACA,WAAO,QAAA;AAAA,EACX,UAAA;AACI,UAAM,aAAa;AACnB,oBAAgB,qBAAqB;AAAA,EACzC;AACJ;AAEA,SAAS,2BAA2B,OAAqB,UAAkB,UAAkB,aAAoC;AAC7H,SAAO;AAAA,IACH,GAAG,6BAA6B,MAAM,GAAG,UAAU,UAAU,WAAW;AAAA,IACxE,GAAG,6BAA6B,MAAM,GAAG,UAAU,UAAU,WAAW;AAAA,IACxE,GAAG,6BAA6B,MAAM,GAAG,UAAU,UAAU,WAAW;AAAA,IACxE,GAAG,MAAM;AAAA,EAAA;AAEjB;AAEA,SAAS,6BAA6B,OAAe,UAAkB,UAAkB,aAA8B;AACnH,MAAI,IAAI,QAAQ,KAAK;AACrB,MAAI,WAAW,GAAG;AACd,QAAI,WAAW,IAAI,SAAS,IAAI,OAAO,IAAI,aAAa,QAAQ,IAAI;AAAA,EACxE,WAAW,WAAW,GAAG;AACrB,UAAM,YAAY,WAAW;AAC7B,QAAI,KAAK;AACT,QAAI,KAAK;AACT,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACzB,YAAM,OAAO,KAAK,MAAM;AACxB,YAAM,OAAO,MAAM,OAAO,IAAI,IAAI;AAClC,YAAM,MAAM,OAAO,OAAO,OAAO;AACjC,UAAI,MAAM,GAAG;AACT,aAAK;AAAA,MACT,OAAO;AACH,aAAK;AAAA,MACT;AAAA,IACJ;AACA,SAAK,KAAK,MAAM;AAAA,EACpB;AACA,MAAI,KAAK;AACT,MAAI,aAAa;AACb,QAAI,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI;AAAA,EAC5C;AACA,SAAO,WAAW,IAAI,IAAI,WAAW;AACzC;AAEA,SAAS,QAAQ,GAAmB;AAChC,SAAO,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AACrC;AAEA,SAAS,uBAAuB,OAA2B;AACvD,aAAW,QAAQ,MAAM,QAAQ;AAC7B,UAAM,MAAM,KAAK;AACjB,QAAI,KAAK;AACL,UAAI,yBAAyB;AAC7B,UAAI,kBAAkB;AAAA,IAC1B;AAAA,EACJ;AACJ;AAEA,SAAS,6BAA6B,MAAkB,QAAoD;AACxG,QAAM,KAAK,KAAK,QAAQ;AACxB,QAAM,QAAQ;AACd,QAAM,SAAS;AACf,QAAM,SAA2B;AACjC,QAAM,kBAAkB,sBAAsB,KAAK,QAAQ,YAAY;AACvE,QAAM,UAAU,OAAO,QAAQ,cAAc;AAAA,IACzC,OAAO,KAAK;AAAA,IACZ,MAAM,EAAE,OAAO,OAAA;AAAA,IACf;AAAA,IACA,eAAe,kBAAkB,oBAAoB,OAAO,QAAQ,mBAAmB,IAAI;AAAA,IAC3F,OAAO,gBAAgB,oBAAoB,gBAAgB,kBAAkB,gBAAgB;AAAA,EAAA,CAChG;AACD,QAAM,MAAiB;AAAA,IACnB;AAAA,IACA,MAAM,QAAQ,WAAA;AAAA,IACd,SAAS,+BAA+B,MAAM;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EAAA;AAEb,SAAO;AAAA,IACH,SAAS;AAAA,IACT,WAAW,QAAQ,WAAW,EAAE,cAAc,GAAG,eAAe,GAAG;AAAA,IACnE,cAAc,GAAG;AAAA,IACjB,eAAe,GAAG;AAAA,IAClB,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,YAAY,mBAAmB,KAAK,QAAQ,YAAY;AAAA,IACxD,kBAAkB;AAAA,IAClB,SAAS;AAAA,EAAA;AAEjB;AAEA,SAAS,4BAA4B,OAAoC,MAAkB,QAA6B;AACpH,QAAM,KAAK,KAAK,QAAQ;AACxB,QAAM,eAAe,GAAG;AACxB,QAAM,gBAAgB,GAAG;AACzB,QAAM,iBAAiB,GAAG;AAC1B,QAAM,cAAc,KAAK,iBAAiB;AAC1C,MAAI,CAAC,MAAM,gBAAgB;AACvB;AAAA,EACJ;AACA,QAAM,QAAQ,uBAAuB,OAAO,WAAW,IAAI,uBAAuB,OAAO,QAAQ,MAAM,gBAAgB,cAAc,CAAC,IAAI;AAC9I;AAEA,SAAS,8BAA8B,OAA6D;AAChG,iCAAO,QAAQ,QAAQ;AAC3B;AAEO,SAAS,4BAA4B,MAAkB,QAAuB,OAAoC,aAA6B;AAClJ,QAAM,UAAU;AAChB,QAAM,cAAc,KAAK;AACzB,MAAI,OAAO,cAAc,MAAM,MAAM,aAAa,KAAK;AACvD,MAAI,QAAQ,aAAa,MAAM,IAAI;AACnC,MAAI,eAAyC;AAC7C,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AACzC,UAAM,UAAU,YAAY,CAAC;AAC7B,UAAM,eAAe,QAAQ,WAAW,kBAAkB;AAC1D,QAAI,gBAAgB,sBAAsB,KAAK,GAAG;AAC9C,WAAK,IAAA;AACL,gCAA0B,OAAO,MAAM;AACvC,aAAO,cAAc,MAAM,MAAM,aAAa,IAAI;AAClD,mBAAa,MAAM,IAAI;AACvB,qBAAe;AAAA,IACnB;AACA,UAAM,OAAO,QAAQ,WAAW;AAChC,QAAI,QAAQ,KAAK,YAAY,OAAO;AAChC;AAAA,IACJ;AACA,QAAI,QAAQ,aAAa,cAAc;AACnC,WAAK,YAAY,QAAQ,QAAQ;AACjC,qBAAe,QAAQ;AAAA,IAC3B;AACA,aAAS,QAAQ,KAAK,MAAM,MAAM;AAAA,EACtC;AACA,OAAK,IAAA;AACL,SAAO;AACX;AAEA,SAAS,0BAA0B,OAAoC,QAA6B;AAChG,MAAI,CAAC,MAAM,gBAAgB;AACvB,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC5C;AACA,MAAI,MAAM,OAAO;AACb,uBAAmB,OAAO,MAAM;AAAA,EACpC,OAAO;AACH,WAAO,gBAAgB;AAAA,MACnB,EAAE,SAAS,MAAM,eAAA;AAAA,MACjB,EAAE,SAAS,MAAM,QAAQ,QAAA;AAAA,MACzB,EAAE,OAAO,MAAM,QAAQ,OAAO,QAAQ,MAAM,QAAQ,OAAA;AAAA,IAAO;AAAA,EAEnE;AACA,MAAI,MAAM,kBAAkB;AACxB,kBAAc,QAAQ,MAAM,QAAQ,SAAS,OAAO,eAAe;AAAA,EACvE;AACA,QAAM;AACV;AAEA,SAAS,gBAAgB,QAAuB,QAA0B,cAA0C;AAChH,QAAM,SAAS,OAAO;AACtB,MAAI,WAAW,YAAY;AACvB,mDAAe;AACf,oBAAgB;AAChB,iBAAa;AACb,qBAAiB;AACjB,cAAU;AACV,kBAAc;AACd,iBAAa;AAAA,EACjB;AACA,MAAI,cAAc;AACd,wCAAmB,OAAO,mBAAmB,EAAE,MAAM,kBAAkB;AACvE,kCAAgB,OAAO,sBAAsB;AAAA,MACzC,SAAS,CAAC,EAAE,SAAS,GAAG,YAAY,eAAe,UAAU,SAAS,EAAE,YAAY,sBAAsB,cAAc,KAAA,GAAQ;AAAA,IAAA,CACnI;AAAA,EACL,OAAO;AACH,gCAAe,OAAO,mBAAmB,EAAE,MAAM,aAAa;AAC9D,0BAAY,OAAO,sBAAsB;AAAA,MACrC,SAAS;AAAA,QACL,EAAE,SAAS,GAAG,YAAY,eAAe,UAAU,SAAS,EAAE,YAAY,UAAQ;AAAA,QAClF,EAAE,SAAS,GAAG,YAAY,eAAe,UAAU,SAAS,CAAA,EAAC;AAAA,MAAE;AAAA,IACnE,CACH;AAAA,EACL;AACA,wDAAsB,IAAA;AACtB,QAAM,MAAM,GAAG,MAAM,IAAI,eAAe,SAAS,EAAE;AACnD,MAAI,WAAW,cAAc,IAAI,GAAG;AACpC,MAAI,CAAC,UAAU;AACX,UAAM,MAAM,eAAe,cAAe;AAC1C,eAAW,OAAO,qBAAqB;AAAA,MACnC,OAAO;AAAA,MACP,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,GAAG,GAAG;AAAA,MAC/D,QAAQ,EAAE,QAAQ,eAAe,iBAAkB,YAAa,YAAY,KAAA;AAAA,MAC5E,UAAU,EAAE,QAAQ,eAAe,iBAAkB,YAAa,YAAY,MAAM,SAAS,CAAC,EAAE,OAAA,CAAQ,EAAA;AAAA,MACxG,WAAW,EAAE,UAAU,gBAAA;AAAA,IAAgB,CAC1C;AACD,kBAAc,IAAI,KAAK,QAAQ;AAAA,EACnC;AACA,SAAO;AACX;AAEA,SAAS,uBAAuB,OAAoC,aAA8B;AAC9F,SAAO,cAAc,KAAK,MAAM,iBAAiB,MAAM,QAAQ,SAAS,MAAM,kBAAkB,MAAM,QAAQ;AAClH;AAEA,SAAS,uBAAuB,OAAoC,QAAuB,QAAoB,cAA8C;AACzJ,QAAM,SAAS,OAAO;AACtB,QAAM,WAAW,gBAAgB,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,YAAY;AACnF,QAAM,YAAY,OAAO,gBAAgB;AAAA,IACrC,QAAQ,eAAe,cAAe;AAAA,IACtC,SAAS,eACH,CAAC,EAAE,SAAS,GAAG,UAAU,OAAO,WAAA,EAAW,CAAG,IAC9C;AAAA,MACI,EAAE,SAAS,GAAG,UAAU,OAAO,aAAW;AAAA,MAC1C,EAAE,SAAS,GAAG,UAAU,mBAAmB,MAAM,EAAA;AAAA,IAAE;AAAA,EACvD,CACT;AACD,SAAO,EAAE,WAAW,UAAU,YAAY,UAAA;AAC9C;AAEA,SAAS,mBAAmB,OAAoC,QAA6B;AACzF,QAAM,OAAO,MAAM;AACnB,QAAM,OAAO,OAAO,gBAAgB,gBAAgB;AAAA,IAChD,kBAAkB,CAAC,EAAE,MAAM,MAAM,WAAW,QAAQ,SAAS,SAAS,SAAS,YAAY,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAE,CAAG;AAAA,EAAA,CAC1H;AACD,OAAK,YAAY,KAAK,SAAS;AAC/B,OAAK,aAAa,GAAG,KAAK,UAAU;AACpC,OAAK,KAAK,CAAC;AACX,OAAK,IAAA;AACT;AAEA,SAAS,sBAAsB,OAA6C;AACxE,SAAO,MAAM,eAAe,KAAK,MAAM,UAAU,MAAM;AAC3D;AAEA,SAAS,cAAc,MAAkB,eAAsC,aAAqB,MAAqC;AACrI,QAAM,MAAM,KAAK;AACjB,QAAM,cAAc,QAAQ,CAAC,KAAK,QAAQ,MAAM,SAAS;AACzD,MAAI,MAAM;AACN,QAAI,SAAS;AAAA,EACjB;AACA,QAAM,kBAAkB,KAAK,sBAAsB;AACnD,MAAI,iBAAiB;AACjB,oBAAgB,cAAc;AAC9B,QAAI,gBAAgB,eAAe;AAC/B,sBAAgB,gBAAgB;AAAA,IACpC;AAAA,EACJ;AACA,MAAI,cAAc,GAAG;AACjB,QAAI,gBAAiC;AAAA,EACzC,OAAO;AACH,QAAI,gBAAgB;AAAA,EACxB;AACA,SAAO,KAAK,OAAO,gBAAgB,gBAAgB,KAAK,qBAAqB;AACjF;AAEA,SAAS,aAAa,MAAkB,MAAkC;AACtE,QAAM,MAAM,KAAK;AACjB,QAAM,KAAK,IAAI;AACf,QAAM,QAAQ,KAAK;AACnB,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,QAAM,IAAI,iCAAQ;AAClB,MAAI,GAAG;AACH,UAAM,KAAK,GAAG;AACd,UAAM,KAAK,GAAG;AACd,UAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE;AAC7B,UAAM,IAAI,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE;AAC9C,UAAM,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI;AAC5C,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI;AACtC,SAAK,YAAY,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACjC,SAAK,eAAe,GAAG,GAAG,GAAG,CAAC;AAAA,EAClC;AACA,OAAK,aAAa,GAAG,KAAK,QAAQ;AACtC;AAEA,SAAS,aAAa,MAAkB,MAAoC;AACxE,QAAM,MAAM,KAAK;AACjB,QAAM,KAAK,KAAK,QAAQ;AACxB,QAAM,QAAQ,KAAK;AACnB,QAAM,iBAAiB,KAAK;AAC5B,QAAM,gBAAgB,KAAK;AAE3B,eAAa,MAAM,IAAI;AAEvB,MAAI,KAAK,iBAAiB,MAAM,sBAAsB,KAAK,aAAa,QAAQ,cAAc,WAAW,GAAG;AACxG,UAAM,OAAO,GAAG;AAChB,UAAM,KAAK,IAAI,QAAQ,0BAA0B;AAAA,MAC7C,cAAc,KAAK,cAAc,CAAC,KAAK,WAAW,IAAI,CAAA;AAAA,MACtD,oBAAoB,KAAK;AAAA,MACzB,aAAa,KAAK,eAAe;AAAA,IAAA,CACpC;AACD,OAAG,aAAa,GAAG,KAAK,QAAQ;AAChC,aAAS,IAAI,gBAAgB,GAAG;AAChC,kBAAc,CAAC,IAAI,GAAG,OAAA;AACtB,SAAK,eAAe,MAAM;AAC1B,SAAK,WAAW;AAAA,EACpB;AACA,MAAI,QAAQ,eAAe;AAC3B,OAAK,eAAe,aAAa;AACjC,OAAK,aAAa,GAAG,KAAK,QAAQ;AAClC,WAAS,SAAS,MAAM,KAAK,iBAAiB,GAAG;AACjD,SAAO;AACX;AAEA,SAAS,SAAS,KAAoD,MAA8B,QAA+B;AAC/H,MAAI,KAA+B;AACnC,MAAI,QAAQ;AACZ,aAAW,KAAK,MAAM;AAClB,UAAM,OAAO,EAAE,WAAW;AAC1B,QAAI,QAAQ,KAAK,YAAY,OAAO;AAChC;AAAA,IACJ;AACA,QAAI,EAAE,aAAa,IAAI;AACnB,UAAI,YAAY,EAAE,QAAQ;AAC1B,WAAK,EAAE;AAAA,IACX;AACA,aAAS,EAAE,KAAK,KAAK,MAAM;AAAA,EAC/B;AACA,SAAO;AACX;AAEA,SAAS,mBAAmB,KAAoD;AAC5E,QAAM,SAAQ,2BAAK,cAAa;AAChC,SAAO,UAAU,WAAW,IAAI,KAAK,IAAI,GAAG,QAAQ,CAAC;AACzD;AAEA,SAAS,sBAAsB,KAAqD;AAChF,UAAO,2BAAK,qBAAoB;AACpC;ACjbA,MAAM,gCAAgC,EAAE,IAAI,iCAAiC,IAAI,IAAA;AAEjF,SAAS,kBACL,WACA,QACA,iBACA,yBACA,eACA,sBACM;AACN,QAAM,qBAAqB,aAAa,kBAAkB,oGAAoG;AAC9J,QAAM,gBAAgB,kBAChB,uEAAuE,0BAA0B,MAAM,GAAG;AAAA,0EAE1G,YACE,2CACA;AACR,QAAM,cAAc,SAAS,4GAA4G;AACzI,QAAM,iBAAiB,YAAY,8CAA8C;AACjF,QAAM,iBAAiB,YACjB,sFACA;AAMN,QAAM,cACF,iBAAiB,uBACX,uBACA;AAAA;AAAA;AAAA;AAKV,SAAO;AAAA,EACT,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,aAAa;AAAA;AAAA;AAAA;AAAA,EAIb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,cAAc;AAAA;AAAA;AAGhB;AAEA,SAAS,4BACL,WACA,QACA,iBACA,yBACA,uBACA,eACA,sBACc;AACd,QAAM,YAAwB,CAAC,EAAE,OAAO,oBAAoB,OAAO,aAAsB;AACzF,MAAI,WAAW;AACX,cAAU,KAAK,EAAE,OAAO,gBAAgB,OAAO,aAAsB;AAAA,EACzE;AACA,MAAI,iBAAiB;AACjB,cAAU,KAAK,EAAE,OAAO,mBAAmB,OAAO,aAAsB;AAAA,EAC5E;AACA,QAAM,WAAW;AAAA,IACb,EAAE,OAAO,qBAAqB,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAA8B,aAAa,EAAA;AAAA,IAClH,EAAE,OAAO,sBAAsB,OAAO,EAAE,OAAO,WAAW,cAAc,aAAsB,aAAa,EAAA;AAAA,EAAE;AAEjH,MAAI,QAAQ;AACR,aAAS;AAAA,MACL,EAAE,OAAO,wBAAwB,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAA8B,aAAa,EAAA;AAAA,MACrH,EAAE,OAAO,wBAAwB,OAAO,EAAE,OAAO,WAAW,cAAc,aAAsB,aAAa,EAAA;AAAA,IAAE;AAAA,EAEvH;AACA,MAAI,iBAAiB;AACjB,aAAS;AAAA,MACL,EAAE,OAAO,qBAAqB,OAAO,EAAE,OAAO,WAAW,cAAc,kBAAA,GAA8B,aAAa,EAAA;AAAA,MAClH,EAAE,OAAO,qBAAqB,OAAO,EAAE,OAAO,WAAW,cAAc,aAAsB,aAAa,EAAA;AAAA,IAAE;AAAA,EAEpH;AACA,SAAO;AAAA,IACH,KAAK;AAAA,IACL,eAAe,CAAC,KAAK;AAAA,IACrB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,gBAAgB,wBACV,EAAE,IAAI,kBAAkB,WAAW,QAAQ,iBAAiB,yBAAyB,eAAe,oBAAoB,GAAG,GAAG,8BAAA,IAC9H,EAAE,IAAI,kBAAkB,WAAW,QAAQ,iBAAiB,yBAAyB,eAAe,oBAAoB,EAAA;AAAA,EAAE;AAExI;AAEA,SAAS,mBAAmB,MAAoB,KAAuB,SAA4C;;AAC/G,QAAM,KAAK,IAAI;AACf,QAAM,OAAO,yBAAI;AACjB,MAAI,CAAC,MAAM;AACP;AAAA,EACJ;AACA,QAAM,MAAM,QAAQ,IAAI,kBAAkB;AAC1C,MAAI,QAAQ,QAAW;AACnB;AAAA,EACJ;AACA,QAAM,IAAI,MAAM;AAChB,OAAK,CAAC,IAAI,KAAK,aAAa;AAC5B,QAAM,MAAM,KAAK,qBAAqB;AACtC,QAAM,QAAQ,GAAI;AAClB,OAAK,IAAI,CAAC,IAAI,KAAO,KAAK,wBAAuB,+BAAO,OAAM,MAAM;AACpE,OAAK,IAAI,CAAC,IAAI,KAAK,uBAAuB,+BAAO,QAAO,IAAO;AAC/D,OAAK,IAAI,CAAC,IAAI,IAAM;AAEpB,QAAM,OAAO,QAAQ,IAAI,cAAc;AACvC,MAAI,SAAS,QAAW;AACpB,UAAM,KAAK,OAAO;AAClB,UAAM,SAAO,QAAI,SAAJ,mBAAU,UAAS,CAAC,GAAG,GAAG,CAAC;AACxC,UAAM,OAAO,KAAK,MAAI,QAAI,SAAJ,mBAAU,eAAc,GAAG,IAAM;AACvD,SAAK,EAAE,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,GAAI,IAAI,CAAC,IAAI;AAChD,SAAK,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,GAAI,IAAI,CAAC,IAAI;AACpD,SAAK,KAAK,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,GAAI,IAAI,CAAC,IAAI;AAEpD,SAAK,KAAK,CAAC,IAAI,KAAK,cAAc;AAAA,EACtC;AAEA,QAAM,OAAO,QAAQ,IAAI,iBAAiB;AAC1C,MAAI,SAAS,QAAW;AACpB,UAAM,KAAK,OAAO;AAClB,UAAM,OAAM,+BAAO,QAAO;AAC1B,UAAM,OAAM,+BAAO,QAAO;AAC1B,SAAK,EAAE,IAAI;AACX,SAAK,KAAK,CAAC,IAAI,MAAM;AAAA,EACzB;AACJ;AAMO,SAAS,qBAAqB,sBAAuC;AACxE,SAAO;AAAA,IACH,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,KAAK;;AACR,YAAM,IAAI;AACV,YAAM,KAAK,EAAE;AACb,YAAM,OAAO,yBAAI;AACjB,YAAM,wBAAwB,EAAE,yBAAyB,+BAA+B;AACxF,YAAM,YAAY,EAAE,gBAAgB,6BAAM,cAAa,IAAK;AAC5D,UAAI,aAAa,GAAG;AAChB,eAAO,EAAE,GAAG,GAAG,IAAI,sBAAA;AAAA,MACvB;AACA,UAAI,IAAI;AACR,UAAI,KAAK,wBAAwB;AACjC,UAAI,6BAAM,SAAS;AACf,cAAM;AAAA,MACV;AACA,WAAI,8BAAI,cAAJ,mBAAe,SAAS;AACxB,aAAK;AAAA,MACT;AACA,WAAI,8BAAI,cAAJ,mBAAe,gBAAgB;AAC/B,cAAM;AAAA,MACV;AACA,YAAI,8BAAI,SAAJ,mBAAU,gBAAe,QAAW;AACpC,cAAM;AAEN,YAAI,6BAAM,YAAY;AAClB,gBAAM;AAAA,QACV;AAAA,MACJ;AACA,aAAO,EAAE,GAAG,GAAA;AAAA,IAChB;AAAA,IACA,KAAK,KAAK;AACN,YAAM,yBAAyB,IAAI,aAAa,kCAAkC;AAClF,UAAI,EAAE,IAAI,aAAa,sBAAsB;AACzC,eAAO,wBAAwB,EAAE,KAAK,UAAU,gBAAgB,kCAAkC;AAAA,MACtG;AACA,aAAO;AAAA,SACF,IAAI,aAAa,qBAAqB;AAAA,SACtC,IAAI,aAAa,6BAA6B;AAAA,SAC9C,IAAI,YAAY,2BAA2B;AAAA,SAC3C,IAAI,aAAa,qCAAqC;AAAA,QACvD;AAAA,SACC,IAAI,aAAa,yBAAyB;AAAA,QAC3C;AAAA,MAAA;AAAA,IAER;AAAA,IACA,SAAS,MAAM,KAAK,SAAS;AACzB,yBAAmB,MAAM,KAAyB,OAAO;AAAA,IAC7D;AAAA,IACA,KAAK,KAAK,SAAS,GAAG;;AAClB,UAAI,EAAE,IAAI,aAAa,sBAAsB;AACzC,eAAO;AAAA,MACX;AACA,YAAM,UAAU,IAAI;AACpB,UAAI,CAAC,SAAS;AACV,cAAM,IAAI,MAAM,6DAA6D;AAAA,MACjF;AACA,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,QAAQ,MAAM;AACrD,cAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,QAAQ,SAAS;AACxD,WAAK,IAAI,aAAa,6BAA6B,GAAG;AAClD,cAAM,OAAQ,eAAI,UAA+B,eAAnC,mBAA+C,eAA/C,mBAAyG;AACvH,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,IAAI,MAAM;AACjD,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,+BAA+B,IAAI,OAAO,GAAG;AAAA,MACxF;AACA,WAAK,IAAI,YAAY,2BAA2B,GAAG;AAC/C,cAAM,aAAa,eAAI,UAA+B,eAAnC,mBAA+C,cAA/C,mBAA0D;AAC7E,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,UAAU,MAAM;AACvD,gBAAQ,KAAK,EAAE,SAAS,KAAK,UAAU,UAAU,SAAS;AAAA,MAC9D;AACA,aAAO;AAAA,IACX;AAAA,IACA,SAAS,KAAK,KAAK;;AACf,YAAM,OAAO,eAAyB,eAAzB,mBAAqC,eAArC,mBAAiD;AAC9D,UAAI,KAAK;AACL,YAAI,KAAK,GAAG;AAAA,MAChB;AACA,YAAM,aAAa,eAAyB,eAAzB,mBAAqC,cAArC,mBAAgD;AACnE,UAAI,WAAW;AACX,YAAI,KAAK,SAAS;AAAA,MACtB;AAAA,IACJ;AAAA,EAAA;AAER;ACrOO,SAAS,wBAAwB,OAAqB,QAAuB,UAAiC,sBAAqC;AACtJ,0BAAwB,OAAO,MAAM;AACrC,WAAS,qBAAqB,oBAAoB,CAAC;AACvD;"}
@@ -0,0 +1,39 @@
1
+ const HELPER_KEY = "nme_perturbNormal";
2
+ const HELPER_WGSL = `
3
+ fn nme_perturbNormal(worldPos: vec3<f32>, worldNormal: vec3<f32>, uv: vec2<f32>, sampled: vec3<f32>, strength: f32) -> vec3<f32> {
4
+ // Construct ad-hoc TBN from screen-space derivatives. WebGPU's UV.y goes top-down
5
+ // (BJS GLSL UV is bottom-up), so dpdy and duv2 both end up with opposite sign vs BJS.
6
+ // Negating BOTH dp2 AND duv2 cancels the framebuffer Y-flip without flipping the
7
+ // tangent orientation. This produces the same TBN as BJS does at the same fragment.
8
+ let dp1 = dpdx(worldPos);
9
+ let dp2 = -dpdy(worldPos);
10
+ let duv1 = dpdx(uv);
11
+ let duv2 = -dpdy(uv);
12
+ let dp2perp = cross(dp2, worldNormal);
13
+ let dp1perp = cross(worldNormal, dp1);
14
+ let T = dp2perp * duv1.x + dp1perp * duv2.x;
15
+ let B = dp2perp * duv1.y + dp1perp * duv2.y;
16
+ let invmax = inverseSqrt(max(dot(T, T), dot(B, B)));
17
+ let n = sampled * 2.0 - vec3<f32>(1.0);
18
+ let scaled = vec3<f32>(n.xy * strength, n.z);
19
+ return normalize(T * scaled.x * invmax + B * scaled.y * invmax + worldNormal * scaled.z);
20
+ }
21
+ `;
22
+ const emitter = {
23
+ className: "PerturbNormalBlock",
24
+ stage: "fragment",
25
+ emit(block, _outputName, stage, state, ctx) {
26
+ state.fragment.helpers.set(HELPER_KEY, HELPER_WGSL);
27
+ const wp = ctx.cast(ctx.resolve(block, "worldPosition", stage, state), "vec3f").expr;
28
+ const wn = ctx.cast(ctx.resolve(block, "worldNormal", stage, state), "vec3f").expr;
29
+ const uv = ctx.cast(ctx.resolve(block, "uv", stage, state), "vec2f").expr;
30
+ const nm = ctx.cast(ctx.resolve(block, "normalMapColor", stage, state), "vec3f").expr;
31
+ const strInput = block.inputs.get("strength");
32
+ const strength = (strInput == null ? void 0 : strInput.source) ? ctx.cast(ctx.resolve(block, "strength", stage, state), "f32").expr : "1.0";
33
+ return { expr: `nme_perturbNormal(${wp}, ${wn}, ${uv}, ${nm}, ${strength})`, type: "vec3f" };
34
+ }
35
+ };
36
+ export {
37
+ emitter
38
+ };
39
+ //# sourceMappingURL=perturb-normal-0Q8EM9ig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perturb-normal-0Q8EM9ig.js","sources":["../src/material/node/blocks/perturb-normal.ts"],"sourcesContent":["/** PerturbNormalBlock — tangent-space normal-map perturbation.\n *\n * Inputs: worldPosition, worldNormal, worldTangent (optional), uv, normalMapColor, strength.\n * Output: output (vec3 world-space normal).\n *\n * If worldTangent is supplied we use the true TBN; otherwise we derive an\n * ad-hoc TBN from screen-space derivatives (matches BJS `useParallax`-off\n * fallback).\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nconst HELPER_KEY = \"nme_perturbNormal\";\nconst HELPER_WGSL = `\nfn nme_perturbNormal(worldPos: vec3<f32>, worldNormal: vec3<f32>, uv: vec2<f32>, sampled: vec3<f32>, strength: f32) -> vec3<f32> {\n // Construct ad-hoc TBN from screen-space derivatives. WebGPU's UV.y goes top-down\n // (BJS GLSL UV is bottom-up), so dpdy and duv2 both end up with opposite sign vs BJS.\n // Negating BOTH dp2 AND duv2 cancels the framebuffer Y-flip without flipping the\n // tangent orientation. This produces the same TBN as BJS does at the same fragment.\n let dp1 = dpdx(worldPos);\n let dp2 = -dpdy(worldPos);\n let duv1 = dpdx(uv);\n let duv2 = -dpdy(uv);\n let dp2perp = cross(dp2, worldNormal);\n let dp1perp = cross(worldNormal, dp1);\n let T = dp2perp * duv1.x + dp1perp * duv2.x;\n let B = dp2perp * duv1.y + dp1perp * duv2.y;\n let invmax = inverseSqrt(max(dot(T, T), dot(B, B)));\n let n = sampled * 2.0 - vec3<f32>(1.0);\n let scaled = vec3<f32>(n.xy * strength, n.z);\n return normalize(T * scaled.x * invmax + B * scaled.y * invmax + worldNormal * scaled.z);\n}\n`;\n\nexport const emitter: BlockEmitter = {\n className: \"PerturbNormalBlock\",\n stage: \"fragment\",\n emit(block, _outputName, stage, state, ctx) {\n state.fragment.helpers.set(HELPER_KEY, HELPER_WGSL);\n const wp = ctx.cast(ctx.resolve(block, \"worldPosition\", stage, state), \"vec3f\").expr;\n const wn = ctx.cast(ctx.resolve(block, \"worldNormal\", stage, state), \"vec3f\").expr;\n const uv = ctx.cast(ctx.resolve(block, \"uv\", stage, state), \"vec2f\").expr;\n const nm = ctx.cast(ctx.resolve(block, \"normalMapColor\", stage, state), \"vec3f\").expr;\n const strInput = block.inputs.get(\"strength\");\n const strength = strInput?.source ? ctx.cast(ctx.resolve(block, \"strength\", stage, state), \"f32\").expr : \"1.0\";\n return { expr: `nme_perturbNormal(${wp}, ${wn}, ${uv}, ${nm}, ${strength})`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAYA,MAAM,aAAa;AACnB,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBb,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,SAAS,QAAQ,IAAI,YAAY,WAAW;AAClD,UAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,OAAO,iBAAiB,OAAO,KAAK,GAAG,OAAO,EAAE;AAChF,UAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,OAAO,eAAe,OAAO,KAAK,GAAG,OAAO,EAAE;AAC9E,UAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,OAAO,MAAM,OAAO,KAAK,GAAG,OAAO,EAAE;AACrE,UAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,OAAO,kBAAkB,OAAO,KAAK,GAAG,OAAO,EAAE;AACjF,UAAM,WAAW,MAAM,OAAO,IAAI,UAAU;AAC5C,UAAM,YAAW,qCAAU,UAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,YAAY,OAAO,KAAK,GAAG,KAAK,EAAE,OAAO;AACzG,WAAO,EAAE,MAAM,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,QAAQ,KAAK,MAAM,QAAA;AAAA,EACvF;AACJ;"}
@@ -0,0 +1,28 @@
1
+ function one(type) {
2
+ if (type === "f32") {
3
+ return "1.0";
4
+ }
5
+ if (type === "vec2f") {
6
+ return "vec2<f32>(1.0)";
7
+ }
8
+ if (type === "vec3f") {
9
+ return "vec3<f32>(1.0)";
10
+ }
11
+ if (type === "vec4f") {
12
+ return "vec4<f32>(1.0)";
13
+ }
14
+ throw new Error(`NodeMaterial: PosterizeBlock does not support ${type}`);
15
+ }
16
+ const emitter = {
17
+ className: "PosterizeBlock",
18
+ emit(block, _outputName, stage, state, ctx) {
19
+ const value = ctx.resolve(block, "value", stage, state);
20
+ const steps = ctx.cast(ctx.resolve(block, "steps", stage, state), value.type).expr;
21
+ const interval = `(${one(value.type)} / ${steps})`;
22
+ return { expr: `(floor(${value.expr} / ${interval}) * ${interval})`, type: value.type };
23
+ }
24
+ };
25
+ export {
26
+ emitter
27
+ };
28
+ //# sourceMappingURL=posterize-block-DfdKsbEf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posterize-block-DfdKsbEf.js","sources":["../src/material/node/blocks/posterize-block.ts"],"sourcesContent":["import type { BlockEmitter, NodeValueType } from \"../node-types.js\";\n\nfunction one(type: NodeValueType): string {\n if (type === \"f32\") {\n return \"1.0\";\n }\n if (type === \"vec2f\") {\n return \"vec2<f32>(1.0)\";\n }\n if (type === \"vec3f\") {\n return \"vec3<f32>(1.0)\";\n }\n if (type === \"vec4f\") {\n return \"vec4<f32>(1.0)\";\n }\n throw new Error(`NodeMaterial: PosterizeBlock does not support ${type}`);\n}\n\nexport const emitter: BlockEmitter = {\n className: \"PosterizeBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const value = ctx.resolve(block, \"value\", stage, state);\n const steps = ctx.cast(ctx.resolve(block, \"steps\", stage, state), value.type).expr;\n const interval = `(${one(value.type)} / ${steps})`;\n return { expr: `(floor(${value.expr} / ${interval}) * ${interval})`, type: value.type };\n },\n};\n"],"names":[],"mappings":"AAEA,SAAS,IAAI,MAA6B;AACtC,MAAI,SAAS,OAAO;AAChB,WAAO;AAAA,EACX;AACA,MAAI,SAAS,SAAS;AAClB,WAAO;AAAA,EACX;AACA,MAAI,SAAS,SAAS;AAClB,WAAO;AAAA,EACX;AACA,MAAI,SAAS,SAAS;AAClB,WAAO;AAAA,EACX;AACA,QAAM,IAAI,MAAM,iDAAiD,IAAI,EAAE;AAC3E;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,UAAM,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK,GAAG,MAAM,IAAI,EAAE;AAC9E,UAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK;AAC/C,WAAO,EAAE,MAAM,UAAU,MAAM,IAAI,MAAM,QAAQ,OAAO,QAAQ,KAAK,MAAM,MAAM,KAAA;AAAA,EACrF;AACJ;"}
@@ -0,0 +1,13 @@
1
+ const emitter = {
2
+ className: "PowBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const v = ctx.resolve(block, "value", stage, state);
5
+ const p = ctx.resolve(block, "power", stage, state);
6
+ const pc = ctx.cast(p, v.type).expr;
7
+ return { expr: `pow(${v.expr}, ${pc})`, type: v.type };
8
+ }
9
+ };
10
+ export {
11
+ emitter
12
+ };
13
+ //# sourceMappingURL=pow-block-DI5ICzhc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pow-block-DI5ICzhc.js","sources":["../src/material/node/blocks/pow-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"PowBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const v = ctx.resolve(block, \"value\", stage, state);\n const p = ctx.resolve(block, \"power\", stage, state);\n const pc = ctx.cast(p, v.type).expr;\n return { expr: `pow(${v.expr}, ${pc})`, type: v.type };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,IAAI,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AAClD,UAAM,IAAI,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AAClD,UAAM,KAAK,IAAI,KAAK,GAAG,EAAE,IAAI,EAAE;AAC/B,WAAO,EAAE,MAAM,OAAO,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,EAAE,KAAA;AAAA,EACpD;AACJ;"}
@@ -0,0 +1,15 @@
1
+ const emitter = {
2
+ className: "RandomNumberBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const seed = ctx.resolve(block, "seed", stage, state);
5
+ if (seed.type === "f32" || seed.type === "mat4f" || seed.type === "texture2d" || seed.type === "textureCube") {
6
+ throw new Error(`NodeMaterial: RandomNumberBlock requires a vector seed so Babylon.js getRand(seed.xy) can be emitted; got ${seed.type}`);
7
+ }
8
+ state[stage].helpers.set("nme_getRand", "fn nme_getRand(seed: vec2<f32>) -> f32 { return fract(sin(dot(seed.xy, vec2<f32>(12.9898, 78.233))) * 43758.5453); }");
9
+ return { expr: `nme_getRand((${seed.expr}).xy)`, type: "f32" };
10
+ }
11
+ };
12
+ export {
13
+ emitter
14
+ };
15
+ //# sourceMappingURL=random-number-block-2OyRYljF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random-number-block-2OyRYljF.js","sources":["../src/material/node/blocks/random-number-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"RandomNumberBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const seed = ctx.resolve(block, \"seed\", stage, state);\n if (seed.type === \"f32\" || seed.type === \"mat4f\" || seed.type === \"texture2d\" || seed.type === \"textureCube\") {\n throw new Error(`NodeMaterial: RandomNumberBlock requires a vector seed so Babylon.js getRand(seed.xy) can be emitted; got ${seed.type}`);\n }\n state[stage].helpers.set(\"nme_getRand\", \"fn nme_getRand(seed: vec2<f32>) -> f32 { return fract(sin(dot(seed.xy, vec2<f32>(12.9898, 78.233))) * 43758.5453); }\");\n return { expr: `nme_getRand((${seed.expr}).xy)`, type: \"f32\" };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,OAAO,IAAI,QAAQ,OAAO,QAAQ,OAAO,KAAK;AACpD,QAAI,KAAK,SAAS,SAAS,KAAK,SAAS,WAAW,KAAK,SAAS,eAAe,KAAK,SAAS,eAAe;AAC1G,YAAM,IAAI,MAAM,6GAA6G,KAAK,IAAI,EAAE;AAAA,IAC5I;AACA,UAAM,KAAK,EAAE,QAAQ,IAAI,eAAe,sHAAsH;AAC9J,WAAO,EAAE,MAAM,gBAAgB,KAAK,IAAI,SAAS,MAAM,MAAA;AAAA,EAC3D;AACJ;"}
@@ -0,0 +1,14 @@
1
+ const emitter = {
2
+ className: "ReciprocalBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const input = ctx.resolve(block, "input", stage, state);
5
+ if (input.type === "mat4f") {
6
+ return { expr: `inverse(${input.expr})`, type: "mat4f" };
7
+ }
8
+ return { expr: `(1.0 / ${input.expr})`, type: input.type };
9
+ }
10
+ };
11
+ export {
12
+ emitter
13
+ };
14
+ //# sourceMappingURL=reciprocal-block-Ck3CW-j-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reciprocal-block-Ck3CW-j-.js","sources":["../src/material/node/blocks/reciprocal-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ReciprocalBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const input = ctx.resolve(block, \"input\", stage, state);\n if (input.type === \"mat4f\") {\n return { expr: `inverse(${input.expr})`, type: \"mat4f\" };\n }\n return { expr: `(1.0 / ${input.expr})`, type: input.type };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,QAAI,MAAM,SAAS,SAAS;AACxB,aAAO,EAAE,MAAM,WAAW,MAAM,IAAI,KAAK,MAAM,QAAA;AAAA,IACnD;AACA,WAAO,EAAE,MAAM,UAAU,MAAM,IAAI,KAAK,MAAM,MAAM,KAAA;AAAA,EACxD;AACJ;"}
@@ -0,0 +1,12 @@
1
+ const emitter = {
2
+ className: "ReflectBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const incident = ctx.cast(ctx.resolve(block, "incident", stage, state), "vec3f").expr;
5
+ const normal = ctx.cast(ctx.resolve(block, "normal", stage, state), "vec3f").expr;
6
+ return { expr: `reflect(${incident}, ${normal})`, type: "vec3f" };
7
+ }
8
+ };
9
+ export {
10
+ emitter
11
+ };
12
+ //# sourceMappingURL=reflect-block-CizpzrX4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflect-block-CizpzrX4.js","sources":["../src/material/node/blocks/reflect-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ReflectBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const incident = ctx.cast(ctx.resolve(block, \"incident\", stage, state), \"vec3f\").expr;\n const normal = ctx.cast(ctx.resolve(block, \"normal\", stage, state), \"vec3f\").expr;\n return { expr: `reflect(${incident}, ${normal})`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,WAAW,IAAI,KAAK,IAAI,QAAQ,OAAO,YAAY,OAAO,KAAK,GAAG,OAAO,EAAE;AACjF,UAAM,SAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,UAAU,OAAO,KAAK,GAAG,OAAO,EAAE;AAC7E,WAAO,EAAE,MAAM,WAAW,QAAQ,KAAK,MAAM,KAAK,MAAM,QAAA;AAAA,EAC5D;AACJ;"}
@@ -0,0 +1,143 @@
1
+ import { aq as PBR_HAS_METALLIC_REFLECTANCE_MAP, ar as PBR_HAS_REFLECTANCE_MAP, as as PBR2_HAS_REFLECTANCE_FACTORS, at as PBR2_HAS_UV2, au as PBR_HAS_USE_ALPHA_ONLY_MR } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ function writeReflectanceUBO(data, material, offsets) {
4
+ if (!offsets.has("occlusionStrength")) {
5
+ return;
6
+ }
7
+ const off = offsets.get("occlusionStrength") / 4;
8
+ data[off] = material.occlusionStrength ?? 1;
9
+ data[off + 1] = material.metallicF0Factor ?? 1;
10
+ data[off + 2] = material.specularWeight ?? material.metallicF0Factor ?? 1;
11
+ const mrc = material.metallicReflectanceColor;
12
+ data[off + 4] = mrc ? mrc[0] : 1;
13
+ data[off + 5] = mrc ? mrc[1] : 1;
14
+ data[off + 6] = mrc ? mrc[2] : 1;
15
+ }
16
+ function createReflectanceFragment(hasMetallicReflectanceMap, hasReflectanceMap, useAlphaOnlyMR, hasOcclusionUv2 = false) {
17
+ const bindings = [];
18
+ if (hasMetallicReflectanceMap) {
19
+ bindings.push(
20
+ { _name: "metallicReflectanceMap", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
21
+ { _name: "metallicReflectanceMapSampler", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
22
+ );
23
+ }
24
+ if (hasReflectanceMap) {
25
+ bindings.push(
26
+ { _name: "reflectanceMap", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
27
+ { _name: "reflectanceMapSampler", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
28
+ );
29
+ }
30
+ let f0Code = `var mrFactors = vec4<f32>(material.metallicReflectanceColor, material.metallicF0Factor);
31
+ var specularWeight = material.specularWeight;`;
32
+ if (hasReflectanceMap) {
33
+ f0Code += `
34
+ { let rSample = textureSample(reflectanceMap, reflectanceMapSampler, input.uv);
35
+ let rLinear = pow(rSample.rgb, vec3<f32>(2.2));
36
+ mrFactors = vec4<f32>(mrFactors.rgb * rLinear, mrFactors.a); }`;
37
+ }
38
+ if (hasMetallicReflectanceMap) {
39
+ if (!useAlphaOnlyMR) {
40
+ f0Code += `
41
+ { let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);
42
+ let mrLinear = pow(mrSample.rgb, vec3<f32>(2.2));
43
+ mrFactors = vec4<f32>(mrFactors.rgb * mrLinear, mrFactors.a * mrSample.a);
44
+ specularWeight *= mrSample.a; }`;
45
+ } else {
46
+ f0Code += `
47
+ { let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);
48
+ mrFactors = vec4<f32>(mrFactors.rgb, mrFactors.a * mrSample.a);
49
+ specularWeight *= mrSample.a; }`;
50
+ }
51
+ }
52
+ f0Code += `
53
+ let dielectricF0 = material.reflectance * mrFactors.a;
54
+ let surfaceReflectivityColor = mrFactors.rgb;
55
+ let dielectricColorF0 = vec3<f32>(dielectricF0) * surfaceReflectivityColor;
56
+ let metallicColorF0 = baseColor;
57
+ var colorF0 = mix(dielectricColorF0, metallicColorF0, metallic);
58
+ let colorF90 = vec3<f32>(mix(specularWeight, 1.0, metallic));
59
+ let surfaceAlbedo = baseColor * (vec3<f32>(1.0) - vec3<f32>(dielectricF0) * surfaceReflectivityColor) * (1.0 - metallic);`;
60
+ return {
61
+ _id: "reflectance",
62
+ _uboFields: [
63
+ { _name: "occlusionStrength", _type: "f32" },
64
+ { _name: "metallicF0Factor", _type: "f32" },
65
+ { _name: "specularWeight", _type: "f32" },
66
+ { _name: "_mrPad1", _type: "f32" },
67
+ { _name: "metallicReflectanceColor", _type: "vec3<f32>" },
68
+ { _name: "_mrPad2", _type: "f32" }
69
+ ],
70
+ _bindings: bindings,
71
+ _fragmentSlots: {
72
+ MF: f0Code,
73
+ AT: hasOcclusionUv2 ? `let occlusion = mix(1.0, textureSample(occlusionTexture, occlusionSampler_, input.uv2).r, material.occlusionStrength);` : `let occlusion = mix(1.0, orm.r, material.occlusionStrength);`
74
+ }
75
+ };
76
+ }
77
+ const pbrExt = {
78
+ id: "reflectance",
79
+ phase: "fragment",
80
+ detect(mat) {
81
+ const m = mat;
82
+ let f = 0;
83
+ let f2 = 0;
84
+ if (m.metallicReflectanceTexture) {
85
+ f |= PBR_HAS_METALLIC_REFLECTANCE_MAP;
86
+ }
87
+ if (m.reflectanceTexture) {
88
+ f |= PBR_HAS_REFLECTANCE_MAP;
89
+ }
90
+ if (f === 0) {
91
+ const hasNonDefaultF0 = m.metallicF0Factor != null && Math.abs(m.metallicF0Factor - 1) > 1e-6;
92
+ const mrc = m.metallicReflectanceColor;
93
+ const hasNonDefaultColor = mrc != null && (mrc[0] !== 1 || mrc[1] !== 1 || mrc[2] !== 1);
94
+ if (hasNonDefaultF0 || hasNonDefaultColor) {
95
+ f2 |= PBR2_HAS_REFLECTANCE_FACTORS;
96
+ }
97
+ }
98
+ if ((f !== 0 || f2 & PBR2_HAS_REFLECTANCE_FACTORS) && m.useOnlyMetallicFromMetallicReflectanceTexture) {
99
+ f |= PBR_HAS_USE_ALPHA_ONLY_MR;
100
+ }
101
+ return { f, f2 };
102
+ },
103
+ frag(ctx) {
104
+ const hasMR = (ctx._features & PBR_HAS_METALLIC_REFLECTANCE_MAP) !== 0;
105
+ const hasR = (ctx._features & PBR_HAS_REFLECTANCE_MAP) !== 0;
106
+ const hasFactors = (ctx._features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;
107
+ if (!hasMR && !hasR && !hasFactors) {
108
+ return null;
109
+ }
110
+ return createReflectanceFragment(hasMR, hasR, (ctx._features & PBR_HAS_USE_ALPHA_ONLY_MR) !== 0, (ctx._features2 & PBR2_HAS_UV2) !== 0);
111
+ },
112
+ writeUbo: writeReflectanceUBO,
113
+ bind(ctx, entries, b) {
114
+ if ((ctx._features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) === 0) {
115
+ return b;
116
+ }
117
+ const m = ctx._material;
118
+ if (m.metallicReflectanceTexture) {
119
+ entries.push({ binding: b++, resource: m.metallicReflectanceTexture.view });
120
+ entries.push({ binding: b++, resource: m.metallicReflectanceTexture.sampler });
121
+ }
122
+ if (m.reflectanceTexture) {
123
+ entries.push({ binding: b++, resource: m.reflectanceTexture.view });
124
+ entries.push({ binding: b++, resource: m.reflectanceTexture.sampler });
125
+ }
126
+ return b;
127
+ },
128
+ textures(mat, t) {
129
+ const m = mat;
130
+ if (m.metallicReflectanceTexture) {
131
+ t.push(m.metallicReflectanceTexture);
132
+ }
133
+ if (m.reflectanceTexture) {
134
+ t.push(m.reflectanceTexture);
135
+ }
136
+ }
137
+ };
138
+ export {
139
+ createReflectanceFragment,
140
+ pbrExt,
141
+ writeReflectanceUBO
142
+ };
143
+ //# sourceMappingURL=reflectance-fragment-BCrgPmrt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflectance-fragment-BCrgPmrt.js","sources":["../src/material/pbr/fragments/reflectance-fragment.ts"],"sourcesContent":["/**\n * Metallic Reflectance Fragment\n *\n * Advanced F0 computation with metallicReflectanceTexture and/or reflectanceTexture.\n * Only bundled when a scene uses these textures.\n *\n * Provides: UBO fields (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor),\n * conditional texture bindings, F0 computation, and occlusion handling.\n */\n\nimport type { ShaderFragment, BindingDecl } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport { PBR_HAS_METALLIC_REFLECTANCE_MAP, PBR_HAS_REFLECTANCE_MAP, PBR_HAS_USE_ALPHA_ONLY_MR, PBR2_HAS_REFLECTANCE_FACTORS, PBR2_HAS_UV2 } from \"../pbr-flag-bits.js\";\n\n// WebGPU shader stage constants\nconst STAGE_FRAGMENT = 0x2;\n\n/** Write the reflectance-extension material-UBO slice\n * (occlusionStrength, metallicF0Factor, specularWeight, metallicReflectanceColor).\n * Gated by the presence of the `occlusionStrength` field in the UBO spec,\n * which is added only when a metallic-reflectance or reflectance texture\n * is in use. */\nexport function writeReflectanceUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n if (!offsets.has(\"occlusionStrength\")) {\n return;\n }\n const off = offsets.get(\"occlusionStrength\")! / 4;\n data[off] = material.occlusionStrength ?? 1.0;\n data[off + 1] = material.metallicF0Factor ?? 1.0;\n data[off + 2] = material.specularWeight ?? material.metallicF0Factor ?? 1.0;\n const mrc = material.metallicReflectanceColor;\n data[off + 4] = mrc ? mrc[0]! : 1.0;\n data[off + 5] = mrc ? mrc[1]! : 1.0;\n data[off + 6] = mrc ? mrc[2]! : 1.0;\n}\n\n/**\n * Create a metallic reflectance fragment.\n * @param hasMetallicReflectanceMap - Whether the material has a metallicReflectanceTexture.\n * @param hasReflectanceMap - Whether the material has a reflectanceTexture.\n * @param useAlphaOnlyMR - Whether to use only the alpha channel from the metallic reflectance map.\n */\nexport function createReflectanceFragment(\n hasMetallicReflectanceMap: boolean,\n hasReflectanceMap: boolean,\n useAlphaOnlyMR: boolean,\n hasOcclusionUv2: boolean = false\n): ShaderFragment {\n const bindings: BindingDecl[] = [];\n if (hasMetallicReflectanceMap) {\n bindings.push(\n { _name: \"metallicReflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"metallicReflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasReflectanceMap) {\n bindings.push(\n { _name: \"reflectanceMap\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"reflectanceMapSampler\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n // Build F0 computation code\n let f0Code = `var mrFactors = vec4<f32>(material.metallicReflectanceColor, material.metallicF0Factor);\nvar specularWeight = material.specularWeight;`;\n if (hasReflectanceMap) {\n f0Code += `\n{ let rSample = textureSample(reflectanceMap, reflectanceMapSampler, input.uv);\n let rLinear = pow(rSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * rLinear, mrFactors.a); }`;\n }\n if (hasMetallicReflectanceMap) {\n if (!useAlphaOnlyMR) {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n let mrLinear = pow(mrSample.rgb, vec3<f32>(2.2));\n mrFactors = vec4<f32>(mrFactors.rgb * mrLinear, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n } else {\n f0Code += `\n{ let mrSample = textureSample(metallicReflectanceMap, metallicReflectanceMapSampler, input.uv);\n mrFactors = vec4<f32>(mrFactors.rgb, mrFactors.a * mrSample.a);\n specularWeight *= mrSample.a; }`;\n }\n }\n f0Code += `\nlet dielectricF0 = material.reflectance * mrFactors.a;\nlet surfaceReflectivityColor = mrFactors.rgb;\nlet dielectricColorF0 = vec3<f32>(dielectricF0) * surfaceReflectivityColor;\nlet metallicColorF0 = baseColor;\nvar colorF0 = mix(dielectricColorF0, metallicColorF0, metallic);\nlet colorF90 = vec3<f32>(mix(specularWeight, 1.0, metallic));\nlet surfaceAlbedo = baseColor * (vec3<f32>(1.0) - vec3<f32>(dielectricF0) * surfaceReflectivityColor) * (1.0 - metallic);`;\n\n return {\n _id: \"reflectance\",\n\n _uboFields: [\n { _name: \"occlusionStrength\", _type: \"f32\" },\n { _name: \"metallicF0Factor\", _type: \"f32\" },\n { _name: \"specularWeight\", _type: \"f32\" },\n { _name: \"_mrPad1\", _type: \"f32\" },\n { _name: \"metallicReflectanceColor\", _type: \"vec3<f32>\" },\n { _name: \"_mrPad2\", _type: \"f32\" },\n ],\n\n _bindings: bindings,\n\n _fragmentSlots: {\n MF: f0Code,\n AT: hasOcclusionUv2\n ? `let occlusion = mix(1.0, textureSample(occlusionTexture, occlusionSampler_, input.uv2).r, material.occlusionStrength);`\n : `let occlusion = mix(1.0, orm.r, material.occlusionStrength);`,\n },\n };\n}\n\n/** Create the reflectance PBR extension (group 1, fragment phase). */\nexport const pbrExt: PbrExt = {\n id: \"reflectance\",\n phase: \"fragment\",\n detect(mat) {\n const m = mat as PbrMaterialProps;\n let f = 0;\n let f2 = 0;\n if (m.metallicReflectanceTexture) {\n f |= PBR_HAS_METALLIC_REFLECTANCE_MAP;\n }\n if (m.reflectanceTexture) {\n f |= PBR_HAS_REFLECTANCE_MAP;\n }\n if (f === 0) {\n const hasNonDefaultF0 = m.metallicF0Factor != null && Math.abs(m.metallicF0Factor - 1) > 1e-6;\n const mrc = m.metallicReflectanceColor;\n const hasNonDefaultColor = mrc != null && (mrc[0] !== 1 || mrc[1] !== 1 || mrc[2] !== 1);\n if (hasNonDefaultF0 || hasNonDefaultColor) {\n f2 |= PBR2_HAS_REFLECTANCE_FACTORS;\n }\n }\n if ((f !== 0 || f2 & PBR2_HAS_REFLECTANCE_FACTORS) && m.useOnlyMetallicFromMetallicReflectanceTexture) {\n f |= PBR_HAS_USE_ALPHA_ONLY_MR;\n }\n return { f, f2 };\n },\n frag(ctx) {\n const hasMR = (ctx._features & PBR_HAS_METALLIC_REFLECTANCE_MAP) !== 0;\n const hasR = (ctx._features & PBR_HAS_REFLECTANCE_MAP) !== 0;\n const hasFactors = (ctx._features2 & PBR2_HAS_REFLECTANCE_FACTORS) !== 0;\n if (!hasMR && !hasR && !hasFactors) {\n return null;\n }\n return createReflectanceFragment(hasMR, hasR, (ctx._features & PBR_HAS_USE_ALPHA_ONLY_MR) !== 0, (ctx._features2 & PBR2_HAS_UV2) !== 0);\n },\n writeUbo: writeReflectanceUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n if ((ctx._features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) === 0) {\n return b;\n }\n const m = ctx._material as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.view });\n entries.push({ binding: b++, resource: m.metallicReflectanceTexture.sampler });\n }\n if (m.reflectanceTexture) {\n entries.push({ binding: b++, resource: m.reflectanceTexture.view });\n entries.push({ binding: b++, resource: m.reflectanceTexture.sampler });\n }\n return b;\n },\n textures(mat, t) {\n const m = mat as PbrMaterialProps;\n if (m.metallicReflectanceTexture) {\n t.push(m.metallicReflectanceTexture);\n }\n if (m.reflectanceTexture) {\n t.push(m.reflectanceTexture);\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ const emitter = {
2
+ className: "ReflectionBlock",
3
+ stage: "fragment",
4
+ emit(_block, _outputName, _stage, state, _ctx) {
5
+ state.usesEnv = true;
6
+ return { expr: `vec3<f32>(0.0)`, type: "vec3f" };
7
+ }
8
+ };
9
+ export {
10
+ emitter
11
+ };
12
+ //# sourceMappingURL=reflection-block-DqcwyYqr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflection-block-DqcwyYqr.js","sources":["../src/material/node/blocks/reflection-block.ts"],"sourcesContent":["/** ReflectionBlock — marker that activates env IBL plumbing.\n *\n * In the current Lite NME implementation the actual reflection sampling is\n * performed inside `PBRMetallicRoughnessBlock` (which can address the env\n * bindings directly). ReflectionBlock therefore plays a dual role:\n * 1. Sets `state.usesEnv = true` so the pipeline allocates env bindings\n * and the scene UBO is extended.\n * 2. Provides a placeholder vec3 output (always zero) so any consumer\n * wiring still compiles. PBR-MR ignores the actual value — it only\n * checks whether the input is connected.\n *\n * Future scenes that introduce non-PBR reflection paths (e.g. custom\n * reflection passed to ColorSplitter for visualisation) will extend this\n * emitter to actually sample the cubemap and emit a real RGB value.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ReflectionBlock\",\n stage: \"fragment\",\n emit(_block, _outputName, _stage, state, _ctx) {\n state.usesEnv = true;\n return { expr: `vec3<f32>(0.0)`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAkBO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,QAAQ,aAAa,QAAQ,OAAO,MAAM;AAC3C,UAAM,UAAU;AAChB,WAAO,EAAE,MAAM,kBAAkB,MAAM,QAAA;AAAA,EAC3C;AACJ;"}
@@ -0,0 +1,10 @@
1
+ const emitter = {
2
+ className: "ReflectionTextureBaseBlock",
3
+ emit(block) {
4
+ throw new Error(`ReflectionTextureBaseBlock "${block.name}" is an abstract compatibility block and cannot be emitted directly.`);
5
+ }
6
+ };
7
+ export {
8
+ emitter
9
+ };
10
+ //# sourceMappingURL=reflection-texture-base-block-1xmJ0HDj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflection-texture-base-block-1xmJ0HDj.js","sources":["../src/material/node/blocks/reflection-texture-base-block.ts"],"sourcesContent":["/** ReflectionTextureBaseBlock compatibility registration.\n *\n * In Babylon.js this is a shared base class for concrete reflection blocks. It\n * has no usable standalone outputs in serialized editor graphs. Lite registers\n * it so snippets containing an unconnected compatibility/base block deserialize\n * cleanly, but surfaces a loud error if a graph attempts to emit it directly.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ReflectionTextureBaseBlock\",\n emit(block): never {\n throw new Error(`ReflectionTextureBaseBlock \"${block.name}\" is an abstract compatibility block and cannot be emitted directly.`);\n },\n};\n"],"names":[],"mappings":"AAUO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAc;AACf,UAAM,IAAI,MAAM,+BAA+B,MAAM,IAAI,sEAAsE;AAAA,EACnI;AACJ;"}
@@ -0,0 +1,60 @@
1
+ const EQUIRECTANGULAR_MODE = 7;
2
+ const RECIPROCAL_PI2 = "0.15915494309189535";
3
+ const RECIPROCAL_PI = "0.3183098861837907";
4
+ function sanitize(name) {
5
+ return name.replace(/[^A-Za-z0-9_]/g, "_");
6
+ }
7
+ const OUTPUTS = {
8
+ rgb: { swizzle: "", type: "vec3f" },
9
+ r: { swizzle: ".x", type: "f32" },
10
+ g: { swizzle: ".y", type: "f32" },
11
+ b: { swizzle: ".z", type: "f32" }
12
+ };
13
+ const emitter = {
14
+ className: "ReflectionTextureBlock",
15
+ stage: "fragment",
16
+ emit(block, outputName, stage, state, ctx) {
17
+ var _a, _b, _c;
18
+ const mode = block.serialized["coordinatesMode"] ?? EQUIRECTANGULAR_MODE;
19
+ if (mode !== EQUIRECTANGULAR_MODE) {
20
+ throw new Error(`ReflectionTextureBlock: coordinatesMode ${mode} not supported (only EQUIRECTANGULAR_MODE=7)`);
21
+ }
22
+ const bindingName = sanitize(block.name || `reflection${block.id}`);
23
+ if (!state.textures.find((t) => t.name === bindingName)) {
24
+ state.textures.push({ name: bindingName, kind: "texture2d", texture: null });
25
+ }
26
+ const memoKey = `_refl_${block.id}_rgb`;
27
+ let sample = state.fragment.memo.get(memoKey);
28
+ if (!sample) {
29
+ const wp = ((_a = block.inputs.get("worldPosition")) == null ? void 0 : _a.source) ? ctx.cast(ctx.resolve(block, "worldPosition", stage, state), "vec3f").expr : `vec3<f32>(0.0)`;
30
+ const wn = ((_b = block.inputs.get("worldNormal")) == null ? void 0 : _b.source) ? ctx.cast(ctx.resolve(block, "worldNormal", stage, state), "vec3f").expr : `vec3<f32>(0.0, 1.0, 0.0)`;
31
+ const cp = ((_c = block.inputs.get("cameraPosition")) == null ? void 0 : _c.source) ? ctx.cast(ctx.resolve(block, "cameraPosition", stage, state), "vec3f").expr : `_NME_CAMERA_POS_`;
32
+ const t = ctx.temp(state, "refl");
33
+ const body = [
34
+ `let _v${t} = normalize(${cp} - ${wp});`,
35
+ `let _r${t} = reflect(-_v${t}, normalize(${wn}));`,
36
+ // BJS flips the V coordinate after computing equirectangular UVs.
37
+ `let _uv${t} = vec2<f32>(atan2(_r${t}.z, _r${t}.x) * ${RECIPROCAL_PI2} + 0.5, 1.0 - acos(clamp(_r${t}.y, -1.0, 1.0)) * ${RECIPROCAL_PI});`,
38
+ `let _s${t} = textureSample(nodeTex_${bindingName}, nodeSamp_${bindingName}, _uv${t});`
39
+ ];
40
+ state.fragment.body.push(body.join("\n"));
41
+ sample = { expr: `_s${t}.xyz`, type: "vec3f" };
42
+ state.fragment.memo.set(memoKey, sample);
43
+ }
44
+ if (outputName === "a") {
45
+ return { expr: "1.0", type: "f32" };
46
+ }
47
+ if (outputName === "reflectionCoords") {
48
+ return { expr: sample.expr, type: "vec3f" };
49
+ }
50
+ const out = OUTPUTS[outputName] ?? OUTPUTS.rgb;
51
+ if (out.swizzle === "") {
52
+ return sample;
53
+ }
54
+ return { expr: `${sample.expr}${out.swizzle}`, type: out.type };
55
+ }
56
+ };
57
+ export {
58
+ emitter
59
+ };
60
+ //# sourceMappingURL=reflection-texture-block-C3QtzoV8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflection-texture-block-C3QtzoV8.js","sources":["../src/material/node/blocks/reflection-texture-block.ts"],"sourcesContent":["/** ReflectionTextureBlock — environment reflection sampling.\n *\n * Inputs: `position` (local-space), `worldPosition`, `worldNormal`, `world`\n * (mat4), `cameraPosition`, `view` (mat4).\n * Outputs: `rgb` (vec3), `r`/`g`/`b`/`a` (f32), `reflectionCoords` (vec3).\n *\n * Current support: coordinatesMode = EQUIRECTANGULAR_MODE (7) with a 2D input\n * texture. Other modes (CUBIC, SPHERICAL, PLANAR, PROJECTION, SKYBOX,\n * EQUIRECTANGULAR_FIXED) throw at parse-time so the failure is loud.\n *\n * The embedded texture data (base64 PNG in the snippet) is decoded by the\n * scene side and supplied via `parseNodeMaterialFromSnippet(..., { textures })`\n * using the block's sanitized name as the key — same pattern as TextureBlock.\n *\n * Gamma handling: when `gammaSpace: true` (typical for PNG environments stored\n * in sRGB), the sampled colour is linearized via `pow(rgb, 2.2)` before being\n * exposed on the `rgb`/`r`/`g`/`b` outputs.\n */\n\nimport type { BlockEmitter, NodeExpr } from \"../node-types.js\";\n\nconst EQUIRECTANGULAR_MODE = 7;\n\nconst RECIPROCAL_PI2 = \"0.15915494309189535\";\nconst RECIPROCAL_PI = \"0.3183098861837907\";\n\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, \"_\");\n}\n\nconst OUTPUTS: Record<string, { swizzle: string; type: \"vec3f\" | \"f32\" }> = {\n rgb: { swizzle: \"\", type: \"vec3f\" },\n r: { swizzle: \".x\", type: \"f32\" },\n g: { swizzle: \".y\", type: \"f32\" },\n b: { swizzle: \".z\", type: \"f32\" },\n};\n\nexport const emitter: BlockEmitter = {\n className: \"ReflectionTextureBlock\",\n stage: \"fragment\",\n emit(block, outputName, stage, state, ctx) {\n const mode = (block.serialized[\"coordinatesMode\"] as number | undefined) ?? EQUIRECTANGULAR_MODE;\n if (mode !== EQUIRECTANGULAR_MODE) {\n throw new Error(`ReflectionTextureBlock: coordinatesMode ${mode} not supported (only EQUIRECTANGULAR_MODE=7)`);\n }\n\n const bindingName = sanitize(block.name || `reflection${block.id}`);\n if (!state.textures.find((t) => t.name === bindingName)) {\n state.textures.push({ name: bindingName, kind: \"texture2d\", texture: null });\n }\n\n const memoKey = `_refl_${block.id}_rgb`;\n let sample = state.fragment.memo.get(memoKey);\n if (!sample) {\n const wp = block.inputs.get(\"worldPosition\")?.source ? ctx.cast(ctx.resolve(block, \"worldPosition\", stage, state), \"vec3f\").expr : `vec3<f32>(0.0)`;\n const wn = block.inputs.get(\"worldNormal\")?.source ? ctx.cast(ctx.resolve(block, \"worldNormal\", stage, state), \"vec3f\").expr : `vec3<f32>(0.0, 1.0, 0.0)`;\n const cp = block.inputs.get(\"cameraPosition\")?.source ? ctx.cast(ctx.resolve(block, \"cameraPosition\", stage, state), \"vec3f\").expr : `_NME_CAMERA_POS_`;\n\n const t = ctx.temp(state, \"refl\");\n const body: string[] = [\n `let _v${t} = normalize(${cp} - ${wp});`,\n `let _r${t} = reflect(-_v${t}, normalize(${wn}));`,\n // BJS flips the V coordinate after computing equirectangular UVs.\n `let _uv${t} = vec2<f32>(atan2(_r${t}.z, _r${t}.x) * ${RECIPROCAL_PI2} + 0.5, 1.0 - acos(clamp(_r${t}.y, -1.0, 1.0)) * ${RECIPROCAL_PI});`,\n `let _s${t} = textureSample(nodeTex_${bindingName}, nodeSamp_${bindingName}, _uv${t});`,\n ];\n // BJS's NME ReflectionTextureBlock does NOT apply gamma conversion\n // in the shader — it samples and uses raw values regardless of gammaSpace.\n // The NME expression graph operates in gamma space (textures are non-sRGB),\n // so the reflection must stay in gamma space too.\n state.fragment.body.push(body.join(\"\\n\"));\n sample = { expr: `_s${t}.xyz`, type: \"vec3f\" };\n state.fragment.memo.set(memoKey, sample);\n }\n\n if (outputName === \"a\") {\n return { expr: \"1.0\", type: \"f32\" };\n }\n if (outputName === \"reflectionCoords\") {\n // Seldom used by graphs; return the reflection vector as a placeholder.\n return { expr: sample.expr, type: \"vec3f\" };\n }\n const out = OUTPUTS[outputName] ?? OUTPUTS.rgb!;\n if (out.swizzle === \"\") {\n return sample as NodeExpr;\n }\n return { expr: `${sample.expr}${out.swizzle}`, type: out.type };\n },\n};\n"],"names":[],"mappings":"AAqBA,MAAM,uBAAuB;AAE7B,MAAM,iBAAiB;AACvB,MAAM,gBAAgB;AAEtB,SAAS,SAAS,MAAsB;AACpC,SAAO,KAAK,QAAQ,kBAAkB,GAAG;AAC7C;AAEA,MAAM,UAAsE;AAAA,EACxE,KAAK,EAAE,SAAS,IAAI,MAAM,QAAA;AAAA,EAC1B,GAAG,EAAE,SAAS,MAAM,MAAM,MAAA;AAAA,EAC1B,GAAG,EAAE,SAAS,MAAM,MAAM,MAAA;AAAA,EAC1B,GAAG,EAAE,SAAS,MAAM,MAAM,MAAA;AAC9B;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,YAAY,OAAO,OAAO,KAAK;AAnB/C;AAoBQ,UAAM,OAAQ,MAAM,WAAW,iBAAiB,KAA4B;AAC5E,QAAI,SAAS,sBAAsB;AAC/B,YAAM,IAAI,MAAM,2CAA2C,IAAI,8CAA8C;AAAA,IACjH;AAEA,UAAM,cAAc,SAAS,MAAM,QAAQ,aAAa,MAAM,EAAE,EAAE;AAClE,QAAI,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,GAAG;AACrD,YAAM,SAAS,KAAK,EAAE,MAAM,aAAa,MAAM,aAAa,SAAS,MAAM;AAAA,IAC/E;AAEA,UAAM,UAAU,SAAS,MAAM,EAAE;AACjC,QAAI,SAAS,MAAM,SAAS,KAAK,IAAI,OAAO;AAC5C,QAAI,CAAC,QAAQ;AACT,YAAM,OAAK,WAAM,OAAO,IAAI,eAAe,MAAhC,mBAAmC,UAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,iBAAiB,OAAO,KAAK,GAAG,OAAO,EAAE,OAAO;AACnI,YAAM,OAAK,WAAM,OAAO,IAAI,aAAa,MAA9B,mBAAiC,UAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,eAAe,OAAO,KAAK,GAAG,OAAO,EAAE,OAAO;AAC/H,YAAM,OAAK,WAAM,OAAO,IAAI,gBAAgB,MAAjC,mBAAoC,UAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,kBAAkB,OAAO,KAAK,GAAG,OAAO,EAAE,OAAO;AAErI,YAAM,IAAI,IAAI,KAAK,OAAO,MAAM;AAChC,YAAM,OAAiB;AAAA,QACnB,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE;AAAA,QACpC,SAAS,CAAC,iBAAiB,CAAC,eAAe,EAAE;AAAA;AAAA,QAE7C,UAAU,CAAC,wBAAwB,CAAC,SAAS,CAAC,SAAS,cAAc,8BAA8B,CAAC,qBAAqB,aAAa;AAAA,QACtI,SAAS,CAAC,4BAA4B,WAAW,cAAc,WAAW,QAAQ,CAAC;AAAA,MAAA;AAMvF,YAAM,SAAS,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AACxC,eAAS,EAAE,MAAM,KAAK,CAAC,QAAQ,MAAM,QAAA;AACrC,YAAM,SAAS,KAAK,IAAI,SAAS,MAAM;AAAA,IAC3C;AAEA,QAAI,eAAe,KAAK;AACpB,aAAO,EAAE,MAAM,OAAO,MAAM,MAAA;AAAA,IAChC;AACA,QAAI,eAAe,oBAAoB;AAEnC,aAAO,EAAE,MAAM,OAAO,MAAM,MAAM,QAAA;AAAA,IACtC;AACA,UAAM,MAAM,QAAQ,UAAU,KAAK,QAAQ;AAC3C,QAAI,IAAI,YAAY,IAAI;AACpB,aAAO;AAAA,IACX;AACA,WAAO,EAAE,MAAM,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,MAAM,IAAI,KAAA;AAAA,EAC7D;AACJ;"}
@@ -0,0 +1,13 @@
1
+ const emitter = {
2
+ className: "RefractBlock",
3
+ emit(block, _outputName, stage, state, ctx) {
4
+ const incident = ctx.cast(ctx.resolve(block, "incident", stage, state), "vec3f").expr;
5
+ const normal = ctx.cast(ctx.resolve(block, "normal", stage, state), "vec3f").expr;
6
+ const ior = ctx.cast(ctx.resolve(block, "ior", stage, state), "f32").expr;
7
+ return { expr: `refract(${incident}, ${normal}, ${ior})`, type: "vec3f" };
8
+ }
9
+ };
10
+ export {
11
+ emitter
12
+ };
13
+ //# sourceMappingURL=refract-block-HHiAk-7U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refract-block-HHiAk-7U.js","sources":["../src/material/node/blocks/refract-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"RefractBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const incident = ctx.cast(ctx.resolve(block, \"incident\", stage, state), \"vec3f\").expr;\n const normal = ctx.cast(ctx.resolve(block, \"normal\", stage, state), \"vec3f\").expr;\n const ior = ctx.cast(ctx.resolve(block, \"ior\", stage, state), \"f32\").expr;\n return { expr: `refract(${incident}, ${normal}, ${ior})`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,WAAW,IAAI,KAAK,IAAI,QAAQ,OAAO,YAAY,OAAO,KAAK,GAAG,OAAO,EAAE;AACjF,UAAM,SAAS,IAAI,KAAK,IAAI,QAAQ,OAAO,UAAU,OAAO,KAAK,GAAG,OAAO,EAAE;AAC7E,UAAM,MAAM,IAAI,KAAK,IAAI,QAAQ,OAAO,OAAO,OAAO,KAAK,GAAG,KAAK,EAAE;AACrE,WAAO,EAAE,MAAM,WAAW,QAAQ,KAAK,MAAM,KAAK,GAAG,KAAK,MAAM,QAAA;AAAA,EACpE;AACJ;"}
@@ -0,0 +1,11 @@
1
+ const emitter = {
2
+ className: "RefractionBlock",
3
+ stage: "fragment",
4
+ emit(_block, _outputName, _stage, _state, _ctx) {
5
+ return { expr: `vec3<f32>(0.0)`, type: "vec3f" };
6
+ }
7
+ };
8
+ export {
9
+ emitter
10
+ };
11
+ //# sourceMappingURL=refraction-block-U8y6XiXs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refraction-block-U8y6XiXs.js","sources":["../src/material/node/blocks/refraction-block.ts"],"sourcesContent":["/** RefractionBlock — passthrough marker.\n * Refraction math (refract(V,N,eta), env LOD sampling, Beer-Lambert tint)\n * is implemented inside PBRMetallicRoughnessBlock, which walks down through\n * SubSurfaceBlock.refraction to read this block's intensity / tintAtDistance.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"RefractionBlock\",\n stage: \"fragment\",\n emit(_block, _outputName, _stage, _state, _ctx) {\n return { expr: `vec3<f32>(0.0)`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAQO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,QAAQ,aAAa,QAAQ,QAAQ,MAAM;AAC5C,WAAO,EAAE,MAAM,kBAAkB,MAAM,QAAA;AAAA,EAC3C;AACJ;"}
@@ -0,0 +1,16 @@
1
+ const DISPERSION_SAMPLE_WGSL = `let eta=material.refractionParams.y;
2
+ let realIOR=1.0/eta;
3
+ let spread=0.04*material.volumeParams.w*(realIOR-1.0);
4
+ let etaR=1.0/(realIOR-spread);
5
+ let etaB=1.0/(realIOR+spread);
6
+ let cpR=scene.viewProjection*vec4<f32>(input.worldPos+refract(-V,N,etaR)*th,1.0);
7
+ let cpG=scene.viewProjection*vec4<f32>(input.worldPos+refract(-V,N,eta)*th,1.0);
8
+ let cpB=scene.viewProjection*vec4<f32>(input.worldPos+refract(-V,N,etaB)*th,1.0);
9
+ let uvR=(cpR.xy/cpR.w)*vec2<f32>(0.5,-0.5)+vec2<f32>(0.5,0.5);
10
+ let uvG=(cpG.xy/cpG.w)*vec2<f32>(0.5,-0.5)+vec2<f32>(0.5,0.5);
11
+ let uvB=(cpB.xy/cpB.w)*vec2<f32>(0.5,-0.5)+vec2<f32>(0.5,0.5);
12
+ let er=vec3<f32>(textureSampleLevel(refractionTexture,refractionSampler_,uvR,lv).r,textureSampleLevel(refractionTexture,refractionSampler_,uvG,lv).g,textureSampleLevel(refractionTexture,refractionSampler_,uvB,lv).b)*material.environmentIntensity;`;
13
+ export {
14
+ DISPERSION_SAMPLE_WGSL
15
+ };
16
+ //# sourceMappingURL=refraction-dispersion-wgsl-DdQCyyO1.js.map