@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,115 @@
1
+ const OUTPUT = {
2
+ rgba: { swizzle: "", type: "vec4f" },
3
+ rgb: { swizzle: ".xyz", type: "vec3f" },
4
+ r: { swizzle: ".x", type: "f32" },
5
+ g: { swizzle: ".y", type: "f32" },
6
+ b: { swizzle: ".z", type: "f32" },
7
+ a: { swizzle: ".w", type: "f32" }
8
+ };
9
+ function sanitize(name) {
10
+ return name.replace(/[^A-Za-z0-9_]/g, "_");
11
+ }
12
+ function bindingName(block, inputName, ctx, fallback) {
13
+ const input = block.inputs.get(inputName);
14
+ if (input == null ? void 0 : input.source) {
15
+ const producer = ctx.graph.blocks.get(input.source.blockId);
16
+ return sanitize((producer == null ? void 0 : producer.name) || fallback);
17
+ }
18
+ return sanitize(fallback);
19
+ }
20
+ function ensureBinding(state, name) {
21
+ if (!state.textures.find((t) => t.name === name)) {
22
+ state.textures.push({ name, kind: "texture2d", texture: null });
23
+ }
24
+ }
25
+ function applyColorSpace(expr, outputName, convertToLinear, convertToGamma) {
26
+ if (!convertToLinear && !convertToGamma) {
27
+ return expr;
28
+ }
29
+ const power = convertToLinear ? "2.2" : "0.45454545";
30
+ if (outputName === "rgba") {
31
+ return `vec4<f32>(pow(max(${expr}.xyz, vec3<f32>(0.0)), vec3<f32>(${power})), ${expr}.w)`;
32
+ }
33
+ if (outputName === "rgb") {
34
+ return `pow(max(${expr}.xyz, vec3<f32>(0.0)), vec3<f32>(${power}))`;
35
+ }
36
+ if (outputName === "r" || outputName === "g" || outputName === "b") {
37
+ return `pow(max(${expr}${OUTPUT[outputName].swizzle}, 0.0), ${power})`;
38
+ }
39
+ return expr;
40
+ }
41
+ function emitBiPlanarSample(block, stage, state, ctx) {
42
+ var _a;
43
+ if (stage !== "fragment") {
44
+ throw new Error("BiPlanarBlock: texture projection is supported only in the fragment stage");
45
+ }
46
+ const stageState = state.fragment;
47
+ const memoKey = `_biplanar_${block.id}_sample`;
48
+ const memo = stageState.memo.get(memoKey);
49
+ if (memo) {
50
+ return memo;
51
+ }
52
+ const baseName = sanitize(block.name || `biPlanar${block.id}`);
53
+ const texX = bindingName(block, "source", ctx, baseName);
54
+ const texY = bindingName(block, "sourceY", ctx, texX);
55
+ ensureBinding(state, texX);
56
+ ensureBinding(state, texY);
57
+ const position = ctx.cast(ctx.resolve(block, "position", stage, state), "vec3f");
58
+ const normal = ctx.cast(ctx.resolve(block, "normal", stage, state), "vec3f");
59
+ const sharpness = ((_a = block.inputs.get("sharpness")) == null ? void 0 : _a.source) ? ctx.cast(ctx.resolve(block, "sharpness", stage, state), "f32").expr : "1.0";
60
+ const temp = ctx.temp(state, "bi");
61
+ const p = `_p${temp}`;
62
+ const dx = `_dx${temp}`;
63
+ const dy = `_dy${temp}`;
64
+ const n = `_n${temp}`;
65
+ const ma = `_ma${temp}`;
66
+ const mi = `_mi${temp}`;
67
+ const me = `_me${temp}`;
68
+ const x = `_x${temp}`;
69
+ const y = `_y${temp}`;
70
+ const w = `_w${temp}`;
71
+ const sample = `_sample${temp}`;
72
+ stageState.body.push(`let ${p} = ${position.expr};`);
73
+ stageState.body.push(`let ${dx} = dpdx(${p});`);
74
+ stageState.body.push(`let ${dy} = dpdy(${p});`);
75
+ stageState.body.push(`let ${n} = abs(${normal.expr});`);
76
+ stageState.body.push(`var ${ma}: vec3<i32>;`);
77
+ stageState.body.push(
78
+ `if (${n}.x > ${n}.y && ${n}.x > ${n}.z) { ${ma} = vec3<i32>(0, 1, 2); } else if (${n}.y > ${n}.z) { ${ma} = vec3<i32>(1, 2, 0); } else { ${ma} = vec3<i32>(2, 0, 1); }`
79
+ );
80
+ stageState.body.push(`var ${mi}: vec3<i32>;`);
81
+ stageState.body.push(
82
+ `if (${n}.x < ${n}.y && ${n}.x < ${n}.z) { ${mi} = vec3<i32>(0, 1, 2); } else if (${n}.y < ${n}.z) { ${mi} = vec3<i32>(1, 2, 0); } else { ${mi} = vec3<i32>(2, 0, 1); }`
83
+ );
84
+ stageState.body.push(`let ${me} = vec3<i32>(3, 3, 3) - ${mi} - ${ma};`);
85
+ stageState.body.push(
86
+ `let ${x} = textureSampleGrad(nodeTex_${texX}, nodeSamp_${texX}, vec2<f32>(${p}[${ma}.y], ${p}[${ma}.z]), vec2<f32>(${dx}[${ma}.y], ${dx}[${ma}.z]), vec2<f32>(${dy}[${ma}.y], ${dy}[${ma}.z]));`
87
+ );
88
+ stageState.body.push(
89
+ `let ${y} = textureSampleGrad(nodeTex_${texY}, nodeSamp_${texY}, vec2<f32>(${p}[${me}.y], ${p}[${me}.z]), vec2<f32>(${dx}[${me}.y], ${dx}[${me}.z]), vec2<f32>(${dy}[${me}.y], ${dy}[${me}.z]));`
90
+ );
91
+ stageState.body.push(`var ${w} = vec2<f32>(${n}[${ma}.x], ${n}[${me}.x]);`);
92
+ stageState.body.push(`${w} = clamp((${w} - vec2<f32>(0.5773)) / vec2<f32>(1.0 - 0.5773), vec2<f32>(0.0), vec2<f32>(1.0));`);
93
+ stageState.body.push(`${w} = pow(${w}, vec2<f32>(${sharpness} / 8.0));`);
94
+ stageState.body.push(`let ${sample} = (${x} * ${w}.x + ${y} * ${w}.y) / (${w}.x + ${w}.y);`);
95
+ const result = { expr: sample, type: "vec4f" };
96
+ stageState.memo.set(memoKey, result);
97
+ return result;
98
+ }
99
+ const emitter = {
100
+ className: "BiPlanarBlock",
101
+ emit(block, outputName, stage, state, ctx) {
102
+ if (outputName === "level") {
103
+ return { expr: "1.0", type: "f32" };
104
+ }
105
+ const sample = emitBiPlanarSample(block, stage, state, ctx);
106
+ const out = OUTPUT[outputName] ?? OUTPUT.rgba;
107
+ const serialized = block.serialized;
108
+ const converted = applyColorSpace(sample.expr, outputName, serialized.convertToLinearSpace === true, serialized.convertToGammaSpace === true);
109
+ return { expr: converted === sample.expr ? `${sample.expr}${out.swizzle}` : converted, type: out.type };
110
+ }
111
+ };
112
+ export {
113
+ emitter
114
+ };
115
+ //# sourceMappingURL=biplanar-block-DZnKuV81.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"biplanar-block-DZnKuV81.js","sources":["../src/material/node/blocks/biplanar-block.ts"],"sourcesContent":["/** BiPlanarBlock — two-axis variant of triplanar texture projection.\n *\n * Uses the Babylon.js/Iñigo Quilez biplanar method: choose major/median axes\n * from abs(normal), sample those projections with explicit position\n * derivatives, and blend with the shaped two-component weights.\n */\n\nimport type { BlockEmitter, NodeBlock, NodeBuildState, NodeEmitContext, NodeExpr, NodeValueType, Stage } from \"../node-types.js\";\n\nconst OUTPUT: Record<string, { swizzle: string; type: NodeValueType }> = {\n rgba: { swizzle: \"\", type: \"vec4f\" },\n rgb: { swizzle: \".xyz\", type: \"vec3f\" },\n r: { swizzle: \".x\", type: \"f32\" },\n g: { swizzle: \".y\", type: \"f32\" },\n b: { swizzle: \".z\", type: \"f32\" },\n a: { swizzle: \".w\", type: \"f32\" },\n};\n\nfunction sanitize(name: string): string {\n return name.replace(/[^A-Za-z0-9_]/g, \"_\");\n}\n\nfunction bindingName(block: NodeBlock, inputName: string, ctx: NodeEmitContext, fallback: string): string {\n const input = block.inputs.get(inputName);\n if (input?.source) {\n const producer = ctx.graph.blocks.get(input.source.blockId);\n return sanitize(producer?.name || fallback);\n }\n return sanitize(fallback);\n}\n\nfunction ensureBinding(state: NodeBuildState, name: string): void {\n if (!state.textures.find((t) => t.name === name)) {\n state.textures.push({ name, kind: \"texture2d\", texture: null });\n }\n}\n\nfunction applyColorSpace(expr: string, outputName: string, convertToLinear: boolean, convertToGamma: boolean): string {\n if (!convertToLinear && !convertToGamma) {\n return expr;\n }\n const power = convertToLinear ? \"2.2\" : \"0.45454545\";\n if (outputName === \"rgba\") {\n return `vec4<f32>(pow(max(${expr}.xyz, vec3<f32>(0.0)), vec3<f32>(${power})), ${expr}.w)`;\n }\n if (outputName === \"rgb\") {\n return `pow(max(${expr}.xyz, vec3<f32>(0.0)), vec3<f32>(${power}))`;\n }\n if (outputName === \"r\" || outputName === \"g\" || outputName === \"b\") {\n return `pow(max(${expr}${OUTPUT[outputName]!.swizzle}, 0.0), ${power})`;\n }\n return expr;\n}\n\nfunction emitBiPlanarSample(block: NodeBlock, stage: Stage, state: NodeBuildState, ctx: NodeEmitContext): NodeExpr {\n if (stage !== \"fragment\") {\n throw new Error(\"BiPlanarBlock: texture projection is supported only in the fragment stage\");\n }\n\n const stageState = state.fragment;\n const memoKey = `_biplanar_${block.id}_sample`;\n const memo = stageState.memo.get(memoKey);\n if (memo) {\n return memo;\n }\n\n const baseName = sanitize(block.name || `biPlanar${block.id}`);\n const texX = bindingName(block, \"source\", ctx, baseName);\n const texY = bindingName(block, \"sourceY\", ctx, texX);\n ensureBinding(state, texX);\n ensureBinding(state, texY);\n\n const position = ctx.cast(ctx.resolve(block, \"position\", stage, state), \"vec3f\");\n const normal = ctx.cast(ctx.resolve(block, \"normal\", stage, state), \"vec3f\");\n const sharpness = block.inputs.get(\"sharpness\")?.source ? ctx.cast(ctx.resolve(block, \"sharpness\", stage, state), \"f32\").expr : \"1.0\";\n\n const temp = ctx.temp(state, \"bi\");\n const p = `_p${temp}`;\n const dx = `_dx${temp}`;\n const dy = `_dy${temp}`;\n const n = `_n${temp}`;\n const ma = `_ma${temp}`;\n const mi = `_mi${temp}`;\n const me = `_me${temp}`;\n const x = `_x${temp}`;\n const y = `_y${temp}`;\n const w = `_w${temp}`;\n const sample = `_sample${temp}`;\n\n stageState.body.push(`let ${p} = ${position.expr};`);\n stageState.body.push(`let ${dx} = dpdx(${p});`);\n stageState.body.push(`let ${dy} = dpdy(${p});`);\n stageState.body.push(`let ${n} = abs(${normal.expr});`);\n stageState.body.push(`var ${ma}: vec3<i32>;`);\n stageState.body.push(\n `if (${n}.x > ${n}.y && ${n}.x > ${n}.z) { ${ma} = vec3<i32>(0, 1, 2); } else if (${n}.y > ${n}.z) { ${ma} = vec3<i32>(1, 2, 0); } else { ${ma} = vec3<i32>(2, 0, 1); }`\n );\n stageState.body.push(`var ${mi}: vec3<i32>;`);\n stageState.body.push(\n `if (${n}.x < ${n}.y && ${n}.x < ${n}.z) { ${mi} = vec3<i32>(0, 1, 2); } else if (${n}.y < ${n}.z) { ${mi} = vec3<i32>(1, 2, 0); } else { ${mi} = vec3<i32>(2, 0, 1); }`\n );\n stageState.body.push(`let ${me} = vec3<i32>(3, 3, 3) - ${mi} - ${ma};`);\n stageState.body.push(\n `let ${x} = textureSampleGrad(nodeTex_${texX}, nodeSamp_${texX}, vec2<f32>(${p}[${ma}.y], ${p}[${ma}.z]), vec2<f32>(${dx}[${ma}.y], ${dx}[${ma}.z]), vec2<f32>(${dy}[${ma}.y], ${dy}[${ma}.z]));`\n );\n stageState.body.push(\n `let ${y} = textureSampleGrad(nodeTex_${texY}, nodeSamp_${texY}, vec2<f32>(${p}[${me}.y], ${p}[${me}.z]), vec2<f32>(${dx}[${me}.y], ${dx}[${me}.z]), vec2<f32>(${dy}[${me}.y], ${dy}[${me}.z]));`\n );\n stageState.body.push(`var ${w} = vec2<f32>(${n}[${ma}.x], ${n}[${me}.x]);`);\n stageState.body.push(`${w} = clamp((${w} - vec2<f32>(0.5773)) / vec2<f32>(1.0 - 0.5773), vec2<f32>(0.0), vec2<f32>(1.0));`);\n stageState.body.push(`${w} = pow(${w}, vec2<f32>(${sharpness} / 8.0));`);\n stageState.body.push(`let ${sample} = (${x} * ${w}.x + ${y} * ${w}.y) / (${w}.x + ${w}.y);`);\n\n const result = { expr: sample, type: \"vec4f\" } as const;\n stageState.memo.set(memoKey, result);\n return result;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"BiPlanarBlock\",\n emit(block, outputName, stage, state, ctx) {\n if (outputName === \"level\") {\n return { expr: \"1.0\", type: \"f32\" };\n }\n const sample = emitBiPlanarSample(block, stage, state, ctx);\n const out = OUTPUT[outputName] ?? OUTPUT.rgba!;\n const serialized = block.serialized as { convertToLinearSpace?: boolean; convertToGammaSpace?: boolean };\n const converted = applyColorSpace(sample.expr, outputName, serialized.convertToLinearSpace === true, serialized.convertToGammaSpace === true);\n return { expr: converted === sample.expr ? `${sample.expr}${out.swizzle}` : converted, type: out.type };\n },\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ const HELPER_KEY = "nme_skinning";
2
+ const HELPER_WGSL = `
3
+ fn nme_skinningMatrix(indices: vec4<f32>, weights: vec4<f32>) -> mat4x4<f32> {
4
+ let i0 = u32(indices.x);
5
+ let i1 = u32(indices.y);
6
+ let i2 = u32(indices.z);
7
+ let i3 = u32(indices.w);
8
+ return nmeBones[i0] * weights.x
9
+ + nmeBones[i1] * weights.y
10
+ + nmeBones[i2] * weights.z
11
+ + nmeBones[i3] * weights.w;
12
+ }
13
+ `;
14
+ const emitter = {
15
+ className: "BonesBlock",
16
+ stage: "vertex",
17
+ emit(block, _outputName, stage, state, ctx) {
18
+ const world = ctx.resolve(block, "world", stage, state);
19
+ if (!state.hasSkeleton) {
20
+ return world;
21
+ }
22
+ state.vertex.helpers.set(HELPER_KEY, HELPER_WGSL);
23
+ const indices = ctx.cast(ctx.resolve(block, "matricesIndices", stage, state), "vec4f").expr;
24
+ const weights = ctx.cast(ctx.resolve(block, "matricesWeights", stage, state), "vec4f").expr;
25
+ return { expr: `(${world.expr} * nme_skinningMatrix(${indices}, ${weights}))`, type: "mat4f" };
26
+ }
27
+ };
28
+ export {
29
+ emitter
30
+ };
31
+ //# sourceMappingURL=bones-block-D6IhqUVV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bones-block-D6IhqUVV.js","sources":["../src/material/node/blocks/bones-block.ts"],"sourcesContent":["/** BonesBlock — hardware skinning.\n *\n * Inputs: matricesIndices, matricesWeights (+ optional extras for up to 8 bones\n * per vertex), world (the model world matrix).\n * Output: output (bone-skinned world matrix).\n *\n * Scene sentinel: `nmeBones : array<mat4x4<f32>, N>` — provided by the skeleton\n * bind group; the pipeline builder wires this when a BonesBlock is present.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nconst HELPER_KEY = \"nme_skinning\";\nconst HELPER_WGSL = `\nfn nme_skinningMatrix(indices: vec4<f32>, weights: vec4<f32>) -> mat4x4<f32> {\n let i0 = u32(indices.x);\n let i1 = u32(indices.y);\n let i2 = u32(indices.z);\n let i3 = u32(indices.w);\n return nmeBones[i0] * weights.x\n + nmeBones[i1] * weights.y\n + nmeBones[i2] * weights.z\n + nmeBones[i3] * weights.w;\n}\n`;\n\nexport const emitter: BlockEmitter = {\n className: \"BonesBlock\",\n stage: \"vertex\",\n emit(block, _outputName, stage, state, ctx) {\n const world = ctx.resolve(block, \"world\", stage, state);\n if (!state.hasSkeleton) {\n // No skeleton on any bound mesh — pass-through the world matrix.\n return world;\n }\n state.vertex.helpers.set(HELPER_KEY, HELPER_WGSL);\n const indices = ctx.cast(ctx.resolve(block, \"matricesIndices\", stage, state), \"vec4f\").expr;\n const weights = ctx.cast(ctx.resolve(block, \"matricesWeights\", stage, state), \"vec4f\").expr;\n return { expr: `(${world.expr} * nme_skinningMatrix(${indices}, ${weights}))`, type: \"mat4f\" };\n },\n};\n"],"names":[],"mappings":"AAYA,MAAM,aAAa;AACnB,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAab,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,QAAI,CAAC,MAAM,aAAa;AAEpB,aAAO;AAAA,IACX;AACA,UAAM,OAAO,QAAQ,IAAI,YAAY,WAAW;AAChD,UAAM,UAAU,IAAI,KAAK,IAAI,QAAQ,OAAO,mBAAmB,OAAO,KAAK,GAAG,OAAO,EAAE;AACvF,UAAM,UAAU,IAAI,KAAK,IAAI,QAAQ,OAAO,mBAAmB,OAAO,KAAK,GAAG,OAAO,EAAE;AACvF,WAAO,EAAE,MAAM,IAAI,MAAM,IAAI,yBAAyB,OAAO,KAAK,OAAO,MAAM,MAAM,QAAA;AAAA,EACzF;AACJ;"}
@@ -0,0 +1,21 @@
1
+ import { f as formatFloat } from "./_math-factory-C-QqW-Wi.js";
2
+ import { aS as WGSL } from "./index-C8HOR2sB.js";
3
+ const emitter = {
4
+ className: "ClampBlock",
5
+ emit(block, _outputName, stage, state, ctx) {
6
+ const value = ctx.resolve(block, "value", stage, state);
7
+ const minRaw = block.serialized.minimum;
8
+ const maxRaw = block.serialized.maximum;
9
+ const minScalar = typeof minRaw === "number" ? formatFloat(minRaw) : "0.0";
10
+ const maxScalar = typeof maxRaw === "number" ? formatFloat(maxRaw) : "1.0";
11
+ if (value.type === "f32") {
12
+ return { expr: `clamp(${value.expr}, ${minScalar}, ${maxScalar})`, type: value.type };
13
+ }
14
+ const t = WGSL[value.type];
15
+ return { expr: `clamp(${value.expr}, ${t}(${minScalar}), ${t}(${maxScalar}))`, type: value.type };
16
+ }
17
+ };
18
+ export {
19
+ emitter
20
+ };
21
+ //# sourceMappingURL=clamp-block-BdII67hT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clamp-block-BdII67hT.js","sources":["../src/material/node/blocks/clamp-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\nimport { formatFloat } from \"./_math-factory.js\";\nimport { WGSL } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ClampBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const value = ctx.resolve(block, \"value\", stage, state);\n const minRaw = block.serialized.minimum;\n const maxRaw = block.serialized.maximum;\n const minScalar = typeof minRaw === \"number\" ? formatFloat(minRaw) : \"0.0\";\n const maxScalar = typeof maxRaw === \"number\" ? formatFloat(maxRaw) : \"1.0\";\n // WGSL clamp requires all three args to have matching types. Promote\n // scalar bounds to the value's vector type when needed.\n if (value.type === \"f32\") {\n return { expr: `clamp(${value.expr}, ${minScalar}, ${maxScalar})`, type: value.type };\n }\n const t = WGSL[value.type];\n return { expr: `clamp(${value.expr}, ${t}(${minScalar}), ${t}(${maxScalar}))`, type: value.type };\n },\n};\n"],"names":[],"mappings":";;AAIO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,IAAI,QAAQ,OAAO,SAAS,OAAO,KAAK;AACtD,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,SAAS,MAAM,WAAW;AAChC,UAAM,YAAY,OAAO,WAAW,WAAW,YAAY,MAAM,IAAI;AACrE,UAAM,YAAY,OAAO,WAAW,WAAW,YAAY,MAAM,IAAI;AAGrE,QAAI,MAAM,SAAS,OAAO;AACtB,aAAO,EAAE,MAAM,SAAS,MAAM,IAAI,KAAK,SAAS,KAAK,SAAS,KAAK,MAAM,MAAM,KAAA;AAAA,IACnF;AACA,UAAM,IAAI,KAAK,MAAM,IAAI;AACzB,WAAO,EAAE,MAAM,SAAS,MAAM,IAAI,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,IAAI,SAAS,MAAM,MAAM,MAAM,KAAA;AAAA,EAC/F;AACJ;"}
@@ -0,0 +1,12 @@
1
+ const emitter = {
2
+ className: "ClearCoatBlock",
3
+ stage: "fragment",
4
+ emit(_block, _outputName, _stage, state, _ctx) {
5
+ state.usesClearcoat = true;
6
+ return { expr: `vec3<f32>(0.0)`, type: "vec3f" };
7
+ }
8
+ };
9
+ export {
10
+ emitter
11
+ };
12
+ //# sourceMappingURL=clearcoat-block-BGML4npi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearcoat-block-BGML4npi.js","sources":["../src/material/node/blocks/clearcoat-block.ts"],"sourcesContent":["/** ClearCoatBlock — clear-coat layer marker for PBR-MR.\n *\n * In the current Lite NME implementation the actual clear-coat math is\n * performed inside `PBRMetallicRoughnessBlock` (which can address every\n * ClearCoatBlock input directly via ctx.resolve). ClearCoatBlock therefore\n * plays a marker role: it flips `state.usesClearcoat` so PBR-MR knows to\n * emit the clear-coat code path, and exposes a vec3 placeholder output so\n * any consumer wiring still type-checks. PBR-MR ignores the actual value;\n * it only checks input connectivity and walks into this block to gather\n * intensity / roughness / indexOfRefraction.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ClearCoatBlock\",\n stage: \"fragment\",\n emit(_block, _outputName, _stage, state, _ctx) {\n state.usesClearcoat = true;\n return { expr: `vec3<f32>(0.0)`, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":"AAcO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,KAAK,QAAQ,aAAa,QAAQ,OAAO,MAAM;AAC3C,UAAM,gBAAgB;AACtB,WAAO,EAAE,MAAM,kBAAkB,MAAM,QAAA;AAAA,EAC3C;AACJ;"}
@@ -0,0 +1,256 @@
1
+ import { av as PBR_HAS_CLEARCOAT, aw as PBR2_CC_INT_MAP, ax as PBR2_CC_ROUGH_MAP, ay as PBR2_CC_NORMAL_MAP, aq as PBR_HAS_METALLIC_REFLECTANCE_MAP, ar as PBR_HAS_REFLECTANCE_MAP, az as PBR2_CC_F0_REMAP_OFF } from "./index-C8HOR2sB.js";
2
+ const STAGE_FRAGMENT = 2;
3
+ const CC_HELPERS = `
4
+ fn visibility_Kelemen(VdotH_kl: f32) -> f32 {
5
+ return 0.25 / (VdotH_kl * VdotH_kl + 0.0000001);
6
+ }
7
+ fn getR0RemappedForClearCoat(f0_rc: vec3<f32>, ccA: f32, ccB: f32) -> vec3<f32> {
8
+ let sf0 = sqrt(f0_rc);
9
+ let num = ccA + ccB * sf0;
10
+ let den = ccB + ccA * sf0;
11
+ return saturate((num / den) * (num / den));
12
+ }
13
+ fn ccSchlick(f0: f32, cosTheta: f32) -> f32 {
14
+ let t = 1.0 - cosTheta;
15
+ let t2 = t * t;
16
+ return f0 + (1.0 - f0) * (t2 * t2 * t);
17
+ }
18
+ `;
19
+ const CC_INT_TEX = `material.ccParams.x * textureSample(ccIntensityTexture, ccIntensitySampler_, input.uv).r`;
20
+ const CC_INT_PLAIN = `material.ccParams.x`;
21
+ const CC_ROUGH_TEX = `clamp(material.ccParams.y * textureSample(ccRoughnessTexture, ccRoughnessSampler_, input.uv).g, 0.0, 1.0)`;
22
+ const CC_ROUGH_PLAIN = `material.ccParams.y`;
23
+ const CC_NORMAL_COMPUTE = `
24
+ let cc_dp1 = dpdx(input.worldPos);
25
+ let cc_dp2 = dpdy(input.worldPos);
26
+ let cc_duv1 = dpdx(input.uv);
27
+ let cc_duv2 = dpdy(input.uv);
28
+ let cc_dp2perp = cross(cc_dp2, N_geom);
29
+ let cc_dp1perp = cross(N_geom, cc_dp1);
30
+ let cc_tFrame = cc_dp2perp * cc_duv1.x + cc_dp1perp * cc_duv2.x;
31
+ let cc_bFrame = -(cc_dp2perp * cc_duv1.y + cc_dp1perp * cc_duv2.y);
32
+ let cc_det = max(dot(cc_tFrame, cc_tFrame), dot(cc_bFrame, cc_bFrame));
33
+ let cc_invmax = select(inverseSqrt(cc_det), 0.0, cc_det == 0.0);
34
+ let cc_frame = mat3x3<f32>(cc_tFrame * cc_invmax, cc_bFrame * cc_invmax, N_geom);
35
+ let ccNormSampleRaw = textureSample(ccNormalTexture, ccNormalSampler_, input.uv).rgb * 2.0 - 1.0;
36
+ let ccNormScale = material.ccParams.z;
37
+ var ccN = normalize(cc_frame * normalize(ccNormSampleRaw * vec3<f32>(ccNormScale, ccNormScale, 1.0)));
38
+ `;
39
+ function makeF0Remap(intensityExpr) {
40
+ return `
41
+ {
42
+ let ccInt_r = ${intensityExpr};
43
+ let remappedF0 = getR0RemappedForClearCoat(colorF0, material.ccRefractionParams.z, material.ccRefractionParams.w);
44
+ colorF0 = mix(colorF0, remappedF0, ccInt_r);
45
+ }
46
+ `;
47
+ }
48
+ function makeDirectMod(intensityExpr, roughnessExpr, hasNormalMap) {
49
+ const N = hasNormalMap ? "ccN" : "N_geom";
50
+ return `
51
+ var ccDirectAttenuation = 1.0;
52
+ var ccDirectSpecularTerm = vec3<f32>(0.0);
53
+ {
54
+ let ccInt_dl = ${intensityExpr};
55
+ let ccRough_dl = ${roughnessExpr};
56
+ let ccF0_dl = material.ccRefractionParams.x;
57
+ let ccAlphaG_dl = ccRough_dl * ccRough_dl + 0.0005;
58
+ let ccNdotL_dl = saturate(dot(${N}, L));
59
+ let ccH_dl = normalize(V + L);
60
+ let ccNdotH_dl = clamp(dot(${N}, ccH_dl), 0.0000001, 1.0);
61
+ let ccVdotH_dl = saturate(dot(V, ccH_dl));
62
+ let ccD_dl = distributionGGX(ccNdotH_dl, ccAlphaG_dl);
63
+ let ccVis_dl = visibility_Kelemen(ccVdotH_dl);
64
+ let ccFresnel_dl = ccSchlick(ccF0_dl, ccVdotH_dl);
65
+ let ccTerm = ccFresnel_dl * ccD_dl * ccVis_dl * ccNdotL_dl;
66
+ ccDirectSpecularTerm = vec3<f32>(ccTerm) * lightColor * lightAtten * material.directIntensity * ccInt_dl;
67
+ ccDirectAttenuation = 1.0 - ccFresnel_dl * ccInt_dl;
68
+ }
69
+ `;
70
+ }
71
+ function makeIblMod(intensityExpr, roughnessExpr, hasNormalMap, hasSpecularAA, hasBaseNormalMap) {
72
+ const N = hasNormalMap ? "ccN" : "N_geom";
73
+ const alphaG = hasSpecularAA ? `let ccAlphaG_ibl_base = ccRough_ibl * ccRough_ibl + 0.0005;
74
+ let cc_nDfdx_AA = dpdx(${N});
75
+ let cc_nDfdy_AA = dpdy(${N});
76
+ let cc_slopeSquare_AA = max(dot(cc_nDfdx_AA, cc_nDfdx_AA), dot(cc_nDfdy_AA, cc_nDfdy_AA));
77
+ let ccAlphaG_ibl = ccAlphaG_ibl_base + sqrt(cc_slopeSquare_AA) * 0.75;` : `let ccAlphaG_ibl = ccRough_ibl * ccRough_ibl + 0.0005;`;
78
+ const ehoLine = hasBaseNormalMap ? `let ccEho_ibl = environmentHorizonOcclusion(-V, ${N}, N_geom);` : `let ccEho_ibl = 1.0;`;
79
+ return `
80
+ {
81
+ let ccInt_ibl = ${intensityExpr};
82
+ let ccRough_ibl = ${roughnessExpr};
83
+ let ccF0_ibl = material.ccRefractionParams.x;
84
+ let ccR_raw = reflect(-V, ${N});
85
+ let ccR_ibl = rotateY(ccR_raw, scene.envRotationY);
86
+ let ccNdotV_ibl = abs(dot(${N}, V)) + 0.0000001;
87
+ ${alphaG}
88
+ var ccSpecLod_ibl = log2(cubemapDim * ccAlphaG_ibl) * scene.vImageInfos.z;
89
+ let ccEnvRadiance_ibl = textureSampleLevel(iblTexture, iblSampler, ccR_ibl, clamp(ccSpecLod_ibl, 0.0, maxLod)).rgb * material.environmentIntensity;
90
+ let ccBrdf_ibl = textureSample(brdfLUT, brdfSampler_, vec2<f32>(ccNdotV_ibl, ccRough_ibl)).rgb;
91
+ ${ehoLine}
92
+ let ccSpecEnvRefl = (vec3<f32>(ccF0_ibl) * ccBrdf_ibl.y + (vec3<f32>(1.0) - vec3<f32>(ccF0_ibl)) * ccBrdf_ibl.x) * ccInt_ibl * ccEho_ibl;
93
+ let ccFresnelIBL = ccSchlick(ccF0_ibl, ccNdotV_ibl);
94
+ let ccConservation_ibl = 1.0 - ccFresnelIBL * ccInt_ibl;
95
+ let ccFinalRadiance_ibl = ccEnvRadiance_ibl * ccSpecEnvRefl;
96
+ color = finalIrradiance * ccConservation_ibl
97
+ + finalRadianceScaled * ccConservation_ibl
98
+ + finalSpecularScaled * ccDirectAttenuation
99
+ + directDiffuse * ccDirectAttenuation
100
+ + ccDirectSpecularTerm
101
+ + ccFinalRadiance_ibl
102
+ + emissive;
103
+ }
104
+ `;
105
+ }
106
+ function makeNonIblMod(intensityExpr) {
107
+ return `
108
+ {
109
+ let ccF0_noIbl = material.ccRefractionParams.x;
110
+ let ccInt_noIbl = ${intensityExpr};
111
+ let ccFresnelNoIbl = ccSchlick(ccF0_noIbl, NdotV);
112
+ let ccCons_noIbl = 1.0 - ccFresnelNoIbl * ccInt_noIbl;
113
+ color = (color - emissive) * ccCons_noIbl + emissive + ccDirectSpecularTerm;
114
+ }
115
+ `;
116
+ }
117
+ function createClearcoatFragment(features, features2, hasIbl, hasBaseNormalMap, hasSpecularAA) {
118
+ if ((features & PBR_HAS_CLEARCOAT) === 0) {
119
+ return null;
120
+ }
121
+ const hasReflectance = (features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) !== 0;
122
+ const hasIntensityMap = (features2 & PBR2_CC_INT_MAP) !== 0;
123
+ const hasRoughnessMap = (features2 & PBR2_CC_ROUGH_MAP) !== 0;
124
+ const hasNormalMap = (features2 & PBR2_CC_NORMAL_MAP) !== 0;
125
+ const disableF0Remap = (features2 & PBR2_CC_F0_REMAP_OFF) !== 0;
126
+ const intensityExpr = hasIntensityMap ? CC_INT_TEX : CC_INT_PLAIN;
127
+ const roughnessExpr = hasRoughnessMap ? CC_ROUGH_TEX : CC_ROUGH_PLAIN;
128
+ const slots = {
129
+ MF: disableF0Remap ? "" : makeF0Remap(intensityExpr),
130
+ AD: makeDirectMod(intensityExpr, roughnessExpr, hasNormalMap),
131
+ BL: `var ccDirectAttenuation = 1.0;
132
+ var ccDirectSpecularTerm = vec3<f32>(0.0);`
133
+ };
134
+ if (hasNormalMap) {
135
+ slots.AC = CC_NORMAL_COMPUTE;
136
+ }
137
+ if (hasIbl) {
138
+ slots.AI = makeIblMod(intensityExpr, roughnessExpr, hasNormalMap, hasSpecularAA, hasBaseNormalMap);
139
+ } else {
140
+ slots.NI = makeNonIblMod(intensityExpr);
141
+ }
142
+ const deps = [];
143
+ if (hasIbl) {
144
+ deps.push("ibl");
145
+ }
146
+ if (hasReflectance) {
147
+ deps.push("reflectance");
148
+ }
149
+ const suffix = (hasIntensityMap ? "I" : "") + (hasRoughnessMap ? "R" : "") + (hasNormalMap ? "N" : "") + (disableF0Remap ? "X" : "") + (hasSpecularAA ? "A" : "") + (hasBaseNormalMap ? "B" : "");
150
+ const bindings = [];
151
+ if (hasIntensityMap) {
152
+ bindings.push(
153
+ { _name: "ccIntensityTexture", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
154
+ { _name: "ccIntensitySampler_", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
155
+ );
156
+ }
157
+ if (hasRoughnessMap) {
158
+ bindings.push(
159
+ { _name: "ccRoughnessTexture", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
160
+ { _name: "ccRoughnessSampler_", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
161
+ );
162
+ }
163
+ if (hasNormalMap) {
164
+ bindings.push(
165
+ { _name: "ccNormalTexture", _type: { _kind: "texture", _textureType: "texture_2d<f32>" }, _visibility: STAGE_FRAGMENT },
166
+ { _name: "ccNormalSampler_", _type: { _kind: "sampler", _samplerType: "sampler" }, _visibility: STAGE_FRAGMENT }
167
+ );
168
+ }
169
+ return {
170
+ _id: suffix ? `clearcoat-${suffix}` : "clearcoat",
171
+ _dependencies: deps.length > 0 ? deps : void 0,
172
+ _uboFields: [
173
+ { _name: "ccParams", _type: "vec4<f32>" },
174
+ { _name: "ccRefractionParams", _type: "vec4<f32>" }
175
+ ],
176
+ _bindings: bindings,
177
+ _helperFunctions: CC_HELPERS,
178
+ _fragmentSlots: slots
179
+ };
180
+ }
181
+ function writeClearcoatUBO(data, material, offsets) {
182
+ const cc = material.clearCoat;
183
+ if (!(cc == null ? void 0 : cc.isEnabled) || !offsets.has("ccParams")) {
184
+ return;
185
+ }
186
+ const off = offsets.get("ccParams") / 4;
187
+ const ior = cc.indexOfRefraction ?? 1.5;
188
+ const a = 1 - ior;
189
+ const b = 1 + ior;
190
+ data[off] = cc.intensity ?? 1;
191
+ data[off + 1] = cc.roughness ?? 0;
192
+ data[off + 2] = cc.bumpTextureScale ?? 1;
193
+ data[off + 4] = Math.pow(-a / b, 2);
194
+ data[off + 5] = 1 / ior;
195
+ data[off + 6] = a;
196
+ data[off + 7] = b;
197
+ }
198
+ const CC_TEX = [
199
+ [PBR2_CC_INT_MAP, "texture"],
200
+ [PBR2_CC_ROUGH_MAP, "roughnessTexture"],
201
+ [PBR2_CC_NORMAL_MAP, "bumpTexture"]
202
+ ];
203
+ const pbrExt = {
204
+ id: "clearcoat",
205
+ phase: "base-tex",
206
+ detect(mat) {
207
+ const cc = mat.clearCoat;
208
+ if (!(cc == null ? void 0 : cc.isEnabled)) {
209
+ return { f: 0, f2: 0 };
210
+ }
211
+ let f2 = 0;
212
+ for (const [flag, key] of CC_TEX) {
213
+ if (cc[key]) {
214
+ f2 |= flag;
215
+ }
216
+ }
217
+ if (cc.useF0Remap === false) {
218
+ f2 |= PBR2_CC_F0_REMAP_OFF;
219
+ }
220
+ return { f: PBR_HAS_CLEARCOAT, f2 };
221
+ },
222
+ frag: (ctx) => createClearcoatFragment(ctx._features, ctx._features2, ctx._hasIbl, ctx._hasAnyNormal, ctx._hasSpecularAA),
223
+ writeUbo: writeClearcoatUBO,
224
+ bind(ctx, entries, b) {
225
+ const cc = ctx._material.clearCoat;
226
+ if (!cc) {
227
+ return b;
228
+ }
229
+ for (const [flag, key] of CC_TEX) {
230
+ const tex = cc[key];
231
+ if ((ctx._features2 & flag) !== 0 && tex) {
232
+ entries.push({ binding: b++, resource: tex.view });
233
+ entries.push({ binding: b++, resource: tex.sampler });
234
+ }
235
+ }
236
+ return b;
237
+ },
238
+ textures(mat, t) {
239
+ const cc = mat.clearCoat;
240
+ if (!cc) {
241
+ return;
242
+ }
243
+ for (const [, key] of CC_TEX) {
244
+ const tex = cc[key];
245
+ if (tex) {
246
+ t.push(tex);
247
+ }
248
+ }
249
+ }
250
+ };
251
+ export {
252
+ createClearcoatFragment,
253
+ pbrExt,
254
+ writeClearcoatUBO
255
+ };
256
+ //# sourceMappingURL=clearcoat-fragment-LCiG98Rf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearcoat-fragment-LCiG98Rf.js","sources":["../src/material/pbr/fragments/clearcoat-fragment.ts"],"sourcesContent":["/**\n * Clearcoat Fragment\n *\n * Adds a glossy transparent top layer (like car paint or lacquered surfaces).\n * Only bundled when a scene uses PbrMaterialProps.clearCoat.\n *\n * Math follows BJS PBRClearCoatConfiguration:\n * - F0 from IOR: ((1-ior)/(1+ior))^2\n * - F0 remap: base F0 adjusted for coat/base interface\n * - Direct: GGX + Kelemen visibility + Schlick fresnel\n * - IBL: Jones analytical BRDF (not BRDF LUT)\n * - Conservation: base layer attenuated by (1 - fresnel * intensity)\n *\n * Supports glTF KHR_materials_clearcoat textures:\n * - clearcoatTexture (R channel multiplies intensity)\n * - clearcoatRoughnessTexture (G channel multiplies roughness)\n * - clearcoatNormalTexture (tangent-space normal, perturbs coat normal)\n */\n\nimport type { ShaderFragment, BindingDecl } from \"../../../shader/fragment-types.js\";\nimport type { PbrMaterialProps, ClearCoatProps } from \"../pbr-material.js\";\nimport type { PbrExt } from \"../pbr-flags.js\";\nimport {\n PBR_HAS_CLEARCOAT,\n PBR_HAS_METALLIC_REFLECTANCE_MAP,\n PBR_HAS_REFLECTANCE_MAP,\n PBR2_CC_INT_MAP,\n PBR2_CC_ROUGH_MAP,\n PBR2_CC_NORMAL_MAP,\n PBR2_CC_F0_REMAP_OFF,\n} from \"../pbr-flag-bits.js\";\n\nconst STAGE_FRAGMENT = 0x2;\n\nconst CC_HELPERS = `\nfn visibility_Kelemen(VdotH_kl: f32) -> f32 {\nreturn 0.25 / (VdotH_kl * VdotH_kl + 0.0000001);\n}\nfn getR0RemappedForClearCoat(f0_rc: vec3<f32>, ccA: f32, ccB: f32) -> vec3<f32> {\nlet sf0 = sqrt(f0_rc);\nlet num = ccA + ccB * sf0;\nlet den = ccB + ccA * sf0;\nreturn saturate((num / den) * (num / den));\n}\nfn ccSchlick(f0: f32, cosTheta: f32) -> f32 {\nlet t = 1.0 - cosTheta;\nlet t2 = t * t;\nreturn f0 + (1.0 - f0) * (t2 * t2 * t);\n}\n`;\n\nconst CC_INT_TEX = `material.ccParams.x * textureSample(ccIntensityTexture, ccIntensitySampler_, input.uv).r`;\nconst CC_INT_PLAIN = `material.ccParams.x`;\nconst CC_ROUGH_TEX = `clamp(material.ccParams.y * textureSample(ccRoughnessTexture, ccRoughnessSampler_, input.uv).g, 0.0, 1.0)`;\nconst CC_ROUGH_PLAIN = `material.ccParams.y`;\n\n// WGSL fragment: coat-layer normal. Computes ccN (coat world-space normal)\n// using a locally-derived cotangent frame from world-position and UV derivatives.\n// Emitted in /*AC*/ so ccN is in scope for direct + IBL blocks.\nconst CC_NORMAL_COMPUTE = `\nlet cc_dp1 = dpdx(input.worldPos);\nlet cc_dp2 = dpdy(input.worldPos);\nlet cc_duv1 = dpdx(input.uv);\nlet cc_duv2 = dpdy(input.uv);\nlet cc_dp2perp = cross(cc_dp2, N_geom);\nlet cc_dp1perp = cross(N_geom, cc_dp1);\nlet cc_tFrame = cc_dp2perp * cc_duv1.x + cc_dp1perp * cc_duv2.x;\nlet cc_bFrame = -(cc_dp2perp * cc_duv1.y + cc_dp1perp * cc_duv2.y);\nlet cc_det = max(dot(cc_tFrame, cc_tFrame), dot(cc_bFrame, cc_bFrame));\nlet cc_invmax = select(inverseSqrt(cc_det), 0.0, cc_det == 0.0);\nlet cc_frame = mat3x3<f32>(cc_tFrame * cc_invmax, cc_bFrame * cc_invmax, N_geom);\nlet ccNormSampleRaw = textureSample(ccNormalTexture, ccNormalSampler_, input.uv).rgb * 2.0 - 1.0;\nlet ccNormScale = material.ccParams.z;\nvar ccN = normalize(cc_frame * normalize(ccNormSampleRaw * vec3<f32>(ccNormScale, ccNormScale, 1.0)));\n`;\n\nfunction makeF0Remap(intensityExpr: string): string {\n return `\n{\nlet ccInt_r = ${intensityExpr};\nlet remappedF0 = getR0RemappedForClearCoat(colorF0, material.ccRefractionParams.z, material.ccRefractionParams.w);\ncolorF0 = mix(colorF0, remappedF0, ccInt_r);\n}\n`;\n}\n\nfunction makeDirectMod(intensityExpr: string, roughnessExpr: string, hasNormalMap: boolean): string {\n const N = hasNormalMap ? \"ccN\" : \"N_geom\";\n return `\nvar ccDirectAttenuation = 1.0;\nvar ccDirectSpecularTerm = vec3<f32>(0.0);\n{\nlet ccInt_dl = ${intensityExpr};\nlet ccRough_dl = ${roughnessExpr};\nlet ccF0_dl = material.ccRefractionParams.x;\nlet ccAlphaG_dl = ccRough_dl * ccRough_dl + 0.0005;\nlet ccNdotL_dl = saturate(dot(${N}, L));\nlet ccH_dl = normalize(V + L);\nlet ccNdotH_dl = clamp(dot(${N}, ccH_dl), 0.0000001, 1.0);\nlet ccVdotH_dl = saturate(dot(V, ccH_dl));\nlet ccD_dl = distributionGGX(ccNdotH_dl, ccAlphaG_dl);\nlet ccVis_dl = visibility_Kelemen(ccVdotH_dl);\nlet ccFresnel_dl = ccSchlick(ccF0_dl, ccVdotH_dl);\nlet ccTerm = ccFresnel_dl * ccD_dl * ccVis_dl * ccNdotL_dl;\nccDirectSpecularTerm = vec3<f32>(ccTerm) * lightColor * lightAtten * material.directIntensity * ccInt_dl;\nccDirectAttenuation = 1.0 - ccFresnel_dl * ccInt_dl;\n}\n`;\n}\n\nfunction makeIblMod(intensityExpr: string, roughnessExpr: string, hasNormalMap: boolean, hasSpecularAA: boolean, hasBaseNormalMap: boolean): string {\n const N = hasNormalMap ? \"ccN\" : \"N_geom\";\n const alphaG = hasSpecularAA\n ? `let ccAlphaG_ibl_base = ccRough_ibl * ccRough_ibl + 0.0005;\nlet cc_nDfdx_AA = dpdx(${N});\nlet cc_nDfdy_AA = dpdy(${N});\nlet cc_slopeSquare_AA = max(dot(cc_nDfdx_AA, cc_nDfdx_AA), dot(cc_nDfdy_AA, cc_nDfdy_AA));\nlet ccAlphaG_ibl = ccAlphaG_ibl_base + sqrt(cc_slopeSquare_AA) * 0.75;`\n : `let ccAlphaG_ibl = ccRough_ibl * ccRough_ibl + 0.0005;`;\n const ehoLine = hasBaseNormalMap ? `let ccEho_ibl = environmentHorizonOcclusion(-V, ${N}, N_geom);` : `let ccEho_ibl = 1.0;`;\n return `\n{\nlet ccInt_ibl = ${intensityExpr};\nlet ccRough_ibl = ${roughnessExpr};\nlet ccF0_ibl = material.ccRefractionParams.x;\nlet ccR_raw = reflect(-V, ${N});\nlet ccR_ibl = rotateY(ccR_raw, scene.envRotationY);\nlet ccNdotV_ibl = abs(dot(${N}, V)) + 0.0000001;\n${alphaG}\nvar ccSpecLod_ibl = log2(cubemapDim * ccAlphaG_ibl) * scene.vImageInfos.z;\nlet ccEnvRadiance_ibl = textureSampleLevel(iblTexture, iblSampler, ccR_ibl, clamp(ccSpecLod_ibl, 0.0, maxLod)).rgb * material.environmentIntensity;\nlet ccBrdf_ibl = textureSample(brdfLUT, brdfSampler_, vec2<f32>(ccNdotV_ibl, ccRough_ibl)).rgb;\n${ehoLine}\nlet ccSpecEnvRefl = (vec3<f32>(ccF0_ibl) * ccBrdf_ibl.y + (vec3<f32>(1.0) - vec3<f32>(ccF0_ibl)) * ccBrdf_ibl.x) * ccInt_ibl * ccEho_ibl;\nlet ccFresnelIBL = ccSchlick(ccF0_ibl, ccNdotV_ibl);\nlet ccConservation_ibl = 1.0 - ccFresnelIBL * ccInt_ibl;\nlet ccFinalRadiance_ibl = ccEnvRadiance_ibl * ccSpecEnvRefl;\ncolor = finalIrradiance * ccConservation_ibl\n + finalRadianceScaled * ccConservation_ibl\n + finalSpecularScaled * ccDirectAttenuation\n + directDiffuse * ccDirectAttenuation\n + ccDirectSpecularTerm\n + ccFinalRadiance_ibl\n + emissive;\n}\n`;\n}\n\nfunction makeNonIblMod(intensityExpr: string): string {\n return `\n{\nlet ccF0_noIbl = material.ccRefractionParams.x;\nlet ccInt_noIbl = ${intensityExpr};\nlet ccFresnelNoIbl = ccSchlick(ccF0_noIbl, NdotV);\nlet ccCons_noIbl = 1.0 - ccFresnelNoIbl * ccInt_noIbl;\ncolor = (color - emissive) * ccCons_noIbl + emissive + ccDirectSpecularTerm;\n}\n`;\n}\n\nexport function createClearcoatFragment(features: number, features2: number, hasIbl: boolean, hasBaseNormalMap: boolean, hasSpecularAA: boolean): ShaderFragment | null {\n if ((features & PBR_HAS_CLEARCOAT) === 0) {\n return null;\n }\n const hasReflectance = (features & (PBR_HAS_METALLIC_REFLECTANCE_MAP | PBR_HAS_REFLECTANCE_MAP)) !== 0;\n const hasIntensityMap = (features2 & PBR2_CC_INT_MAP) !== 0;\n const hasRoughnessMap = (features2 & PBR2_CC_ROUGH_MAP) !== 0;\n const hasNormalMap = (features2 & PBR2_CC_NORMAL_MAP) !== 0;\n const disableF0Remap = (features2 & PBR2_CC_F0_REMAP_OFF) !== 0;\n const intensityExpr = hasIntensityMap ? CC_INT_TEX : CC_INT_PLAIN;\n const roughnessExpr = hasRoughnessMap ? CC_ROUGH_TEX : CC_ROUGH_PLAIN;\n const slots: Partial<Record<string, string>> = {\n MF: disableF0Remap ? \"\" : makeF0Remap(intensityExpr),\n AD: makeDirectMod(intensityExpr, roughnessExpr, hasNormalMap),\n BL: `var ccDirectAttenuation = 1.0;\\nvar ccDirectSpecularTerm = vec3<f32>(0.0);`,\n };\n if (hasNormalMap) {\n slots.AC = CC_NORMAL_COMPUTE;\n }\n // AI and NI are mutually exclusive — only one path runs\n if (hasIbl) {\n slots.AI = makeIblMod(intensityExpr, roughnessExpr, hasNormalMap, hasSpecularAA, hasBaseNormalMap);\n } else {\n slots.NI = makeNonIblMod(intensityExpr);\n }\n const deps: string[] = [];\n if (hasIbl) {\n deps.push(\"ibl\");\n }\n if (hasReflectance) {\n deps.push(\"reflectance\");\n }\n // Fragment id varies with texture config so shader-composer's fragmentKey\n // (and downstream pipeline cache) distinguishes variants.\n const suffix =\n (hasIntensityMap ? \"I\" : \"\") +\n (hasRoughnessMap ? \"R\" : \"\") +\n (hasNormalMap ? \"N\" : \"\") +\n (disableF0Remap ? \"X\" : \"\") +\n (hasSpecularAA ? \"A\" : \"\") +\n (hasBaseNormalMap ? \"B\" : \"\");\n const bindings: BindingDecl[] = [];\n if (hasIntensityMap) {\n bindings.push(\n { _name: \"ccIntensityTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"ccIntensitySampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasRoughnessMap) {\n bindings.push(\n { _name: \"ccRoughnessTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"ccRoughnessSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n if (hasNormalMap) {\n bindings.push(\n { _name: \"ccNormalTexture\", _type: { _kind: \"texture\", _textureType: \"texture_2d<f32>\" }, _visibility: STAGE_FRAGMENT },\n { _name: \"ccNormalSampler_\", _type: { _kind: \"sampler\", _samplerType: \"sampler\" }, _visibility: STAGE_FRAGMENT }\n );\n }\n\n return {\n _id: suffix ? `clearcoat-${suffix}` : \"clearcoat\",\n _dependencies: deps.length > 0 ? deps : undefined,\n\n _uboFields: [\n { _name: \"ccParams\", _type: \"vec4<f32>\" },\n { _name: \"ccRefractionParams\", _type: \"vec4<f32>\" },\n ],\n\n _bindings: bindings,\n\n _helperFunctions: CC_HELPERS,\n\n _fragmentSlots: slots,\n };\n}\n\n/** Write the clearcoat material-UBO slice (ccParams + ccParams2). */\nexport function writeClearcoatUBO(data: Float32Array, material: PbrMaterialProps, offsets: ReadonlyMap<string, number>): void {\n const cc = material.clearCoat as ClearCoatProps | undefined;\n if (!cc?.isEnabled || !offsets.has(\"ccParams\")) {\n return;\n }\n const off = offsets.get(\"ccParams\")! / 4;\n const ior = cc.indexOfRefraction ?? 1.5;\n const a = 1 - ior;\n const b = 1 + ior;\n data[off] = cc.intensity ?? 1.0;\n data[off + 1] = cc.roughness ?? 0.0;\n data[off + 2] = cc.bumpTextureScale ?? 1.0;\n data[off + 4] = Math.pow(-a / b, 2);\n data[off + 5] = 1 / ior;\n data[off + 6] = a;\n data[off + 7] = b;\n}\n\nconst CC_TEX: ReadonlyArray<readonly [number, \"texture\" | \"roughnessTexture\" | \"bumpTexture\"]> = [\n [PBR2_CC_INT_MAP, \"texture\"],\n [PBR2_CC_ROUGH_MAP, \"roughnessTexture\"],\n [PBR2_CC_NORMAL_MAP, \"bumpTexture\"],\n];\n\n/** Clearcoat PBR extension (group 1, base-tex phase). */\nexport const pbrExt: PbrExt = {\n id: \"clearcoat\",\n phase: \"base-tex\",\n detect(mat) {\n const cc = (mat as PbrMaterialProps).clearCoat as ClearCoatProps | undefined;\n if (!cc?.isEnabled) {\n return { f: 0, f2: 0 };\n }\n let f2 = 0;\n for (const [flag, key] of CC_TEX) {\n if (cc[key]) {\n f2 |= flag;\n }\n }\n if (cc.useF0Remap === false) {\n f2 |= PBR2_CC_F0_REMAP_OFF;\n }\n return { f: PBR_HAS_CLEARCOAT, f2 };\n },\n frag: (ctx) => createClearcoatFragment(ctx._features, ctx._features2, ctx._hasIbl, ctx._hasAnyNormal, ctx._hasSpecularAA),\n writeUbo: writeClearcoatUBO as PbrExt[\"writeUbo\"],\n bind(ctx, entries, b) {\n const cc = (ctx._material as PbrMaterialProps).clearCoat as ClearCoatProps | undefined;\n if (!cc) {\n return b;\n }\n for (const [flag, key] of CC_TEX) {\n const tex = cc[key];\n if ((ctx._features2 & flag) !== 0 && tex) {\n entries.push({ binding: b++, resource: tex.view });\n entries.push({ binding: b++, resource: tex.sampler });\n }\n }\n return b;\n },\n textures(mat, t) {\n const cc = (mat as PbrMaterialProps).clearCoat;\n if (!cc) {\n return;\n }\n for (const [, key] of CC_TEX) {\n const tex = cc[key];\n if (tex) {\n t.push(tex);\n }\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ const emitter = {
2
+ className: "ClipPlanesBlock",
3
+ stage: "vertex",
4
+ sideEffect: true,
5
+ emit(block, _outputName, _stage, state, ctx) {
6
+ state.usesClipPlanes = true;
7
+ const memoKey = `_clip_${block.id}`;
8
+ if (!state.vertex.memo.has(memoKey)) {
9
+ const worldPosition = ctx.cast(ctx.resolve(block, "worldPosition", "vertex", state), "vec4f");
10
+ if (!state.varyings.find((v) => v._name === "vClipDistance")) {
11
+ state.varyings.push({ _name: "vClipDistance", _type: "f32" });
12
+ }
13
+ state.vertex.body.push(`out.vClipDistance = dot(${worldPosition.expr}, sceneU.clipPlane);`);
14
+ state.vertex.memo.set(memoKey, { expr: "out.vClipDistance", type: "f32" });
15
+ }
16
+ if (!state.fragment.memo.has(memoKey)) {
17
+ state.fragment.body.push(`if (in.vClipDistance > 0.0) { discard; }`);
18
+ state.fragment.memo.set(memoKey, { expr: "in.vClipDistance", type: "f32" });
19
+ }
20
+ return { expr: "0.0", type: "f32" };
21
+ }
22
+ };
23
+ export {
24
+ emitter
25
+ };
26
+ //# sourceMappingURL=clip-planes-block-BPfFJrbf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clip-planes-block-BPfFJrbf.js","sources":["../src/material/node/blocks/clip-planes-block.ts"],"sourcesContent":["/** ClipPlanesBlock — scene clip-plane discard.\n *\n * Supports Babylon.js' first scene/material clip plane. The block consumes a\n * world-space position, writes the signed clip distance in the vertex stage, and\n * discards fragments with a positive distance, matching BJS' WGSL include.\n */\n\nimport type { BlockEmitter } from \"../node-types.js\";\n\nexport const emitter: BlockEmitter = {\n className: \"ClipPlanesBlock\",\n stage: \"vertex\",\n sideEffect: true,\n emit(block, _outputName, _stage, state, ctx) {\n state.usesClipPlanes = true;\n const memoKey = `_clip_${block.id}`;\n if (!state.vertex.memo.has(memoKey)) {\n const worldPosition = ctx.cast(ctx.resolve(block, \"worldPosition\", \"vertex\", state), \"vec4f\");\n if (!state.varyings.find((v) => v._name === \"vClipDistance\")) {\n state.varyings.push({ _name: \"vClipDistance\", _type: \"f32\" });\n }\n state.vertex.body.push(`out.vClipDistance = dot(${worldPosition.expr}, sceneU.clipPlane);`);\n state.vertex.memo.set(memoKey, { expr: \"out.vClipDistance\", type: \"f32\" });\n }\n if (!state.fragment.memo.has(memoKey)) {\n state.fragment.body.push(`if (in.vClipDistance > 0.0) { discard; }`);\n state.fragment.memo.set(memoKey, { expr: \"in.vClipDistance\", type: \"f32\" });\n }\n return { expr: \"0.0\", type: \"f32\" };\n },\n};\n"],"names":[],"mappings":"AASO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,KAAK,OAAO,aAAa,QAAQ,OAAO,KAAK;AACzC,UAAM,iBAAiB;AACvB,UAAM,UAAU,SAAS,MAAM,EAAE;AACjC,QAAI,CAAC,MAAM,OAAO,KAAK,IAAI,OAAO,GAAG;AACjC,YAAM,gBAAgB,IAAI,KAAK,IAAI,QAAQ,OAAO,iBAAiB,UAAU,KAAK,GAAG,OAAO;AAC5F,UAAI,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,eAAe,GAAG;AAC1D,cAAM,SAAS,KAAK,EAAE,OAAO,iBAAiB,OAAO,OAAO;AAAA,MAChE;AACA,YAAM,OAAO,KAAK,KAAK,2BAA2B,cAAc,IAAI,sBAAsB;AAC1F,YAAM,OAAO,KAAK,IAAI,SAAS,EAAE,MAAM,qBAAqB,MAAM,OAAO;AAAA,IAC7E;AACA,QAAI,CAAC,MAAM,SAAS,KAAK,IAAI,OAAO,GAAG;AACnC,YAAM,SAAS,KAAK,KAAK,0CAA0C;AACnE,YAAM,SAAS,KAAK,IAAI,SAAS,EAAE,MAAM,oBAAoB,MAAM,OAAO;AAAA,IAC9E;AACA,WAAO,EAAE,MAAM,OAAO,MAAM,MAAA;AAAA,EAChC;AACJ;"}
@@ -0,0 +1,90 @@
1
+ function optional(block, inputName, stage, state, ctx) {
2
+ const input = block.inputs.get(inputName);
3
+ return (input == null ? void 0 : input.source) ? ctx.resolve(block, inputName, stage, state) : null;
4
+ }
5
+ function scalarOffset(block, inputName, stage, state, ctx) {
6
+ const value = optional(block, inputName, stage, state, ctx);
7
+ return value ? ctx.cast(value, "f32").expr : null;
8
+ }
9
+ const emitter = {
10
+ className: "CloudBlock",
11
+ emit(block, _outputName, stage, state, ctx) {
12
+ const seed = ctx.resolve(block, "seed", stage, state);
13
+ if (seed.type !== "vec2f" && seed.type !== "vec3f") {
14
+ throw new Error(`NodeMaterial: CloudBlock requires vec2 or vec3 seed; got ${seed.type}`);
15
+ }
16
+ state[stage].helpers.set(
17
+ "nme_cloudNoise",
18
+ `fn nme_cloudRandom(p: f32) -> f32 {
19
+ var temp = fract(p * 0.011);
20
+ temp *= temp + 7.5;
21
+ temp *= temp + temp;
22
+ return fract(temp);
23
+ }
24
+ fn nme_cloudNoise2(x: vec2<f32>, chaos: vec2<f32>) -> f32 {
25
+ let stepv = chaos * vec2<f32>(75.0, 120.0) + vec2<f32>(75.0, 120.0);
26
+ let i = floor(x);
27
+ let f = fract(x);
28
+ let n = dot(i, stepv);
29
+ let u = f * f * (vec2<f32>(3.0) - 2.0 * f);
30
+ return mix(mix(nme_cloudRandom(n + dot(stepv, vec2<f32>(0.0, 0.0))), nme_cloudRandom(n + dot(stepv, vec2<f32>(1.0, 0.0))), u.x), mix(nme_cloudRandom(n + dot(stepv, vec2<f32>(0.0, 1.0))), nme_cloudRandom(n + dot(stepv, vec2<f32>(1.0, 1.0))), u.x), u.y);
31
+ }
32
+ fn nme_cloudNoise3(x: vec3<f32>, chaos: vec3<f32>) -> f32 {
33
+ let stepv = chaos * vec3<f32>(60.0, 120.0, 75.0) + vec3<f32>(60.0, 120.0, 75.0);
34
+ let i = floor(x);
35
+ let f = fract(x);
36
+ let n = dot(i, stepv);
37
+ let u = f * f * (vec3<f32>(3.0) - 2.0 * f);
38
+ return mix(mix(mix(nme_cloudRandom(n + dot(stepv, vec3<f32>(0.0, 0.0, 0.0))), nme_cloudRandom(n + dot(stepv, vec3<f32>(1.0, 0.0, 0.0))), u.x), mix(nme_cloudRandom(n + dot(stepv, vec3<f32>(0.0, 1.0, 0.0))), nme_cloudRandom(n + dot(stepv, vec3<f32>(1.0, 1.0, 0.0))), u.x), u.y), mix(mix(nme_cloudRandom(n + dot(stepv, vec3<f32>(0.0, 0.0, 1.0))), nme_cloudRandom(n + dot(stepv, vec3<f32>(1.0, 0.0, 1.0))), u.x), mix(nme_cloudRandom(n + dot(stepv, vec3<f32>(0.0, 1.0, 1.0))), nme_cloudRandom(n + dot(stepv, vec3<f32>(1.0, 1.0, 1.0))), u.x), u.y), u.z);
39
+ }`
40
+ );
41
+ const octaves = Math.max(0, Math.trunc(typeof block.serialized.octaves === "number" ? block.serialized.octaves : 6));
42
+ const helperKey = `nme_cloudFbm_${octaves}`;
43
+ state[stage].helpers.set(
44
+ helperKey,
45
+ `fn nme_cloudFbm2_${octaves}(st: vec2<f32>, chaos: vec2<f32>) -> f32 {
46
+ var value = 0.0;
47
+ var amplitude = 0.5;
48
+ var tempST = st;
49
+ for (var i = 0; i < ${octaves}; i = i + 1) {
50
+ value += amplitude * nme_cloudNoise2(tempST, chaos);
51
+ tempST *= 2.0;
52
+ amplitude *= 0.5;
53
+ }
54
+ return value;
55
+ }
56
+ fn nme_cloudFbm3_${octaves}(x: vec3<f32>, chaos: vec3<f32>) -> f32 {
57
+ var value = 0.0;
58
+ var amplitude = 0.5;
59
+ var tempX = x;
60
+ for (var i = 0; i < ${octaves}; i = i + 1) {
61
+ value += amplitude * nme_cloudNoise3(tempX, chaos);
62
+ tempX *= 2.0;
63
+ amplitude *= 0.5;
64
+ }
65
+ return value;
66
+ }`
67
+ );
68
+ const st = ctx.temp(state, "cloudSeed");
69
+ state[stage].body.push(`var ${st}: ${seed.type === "vec2f" ? "vec2<f32>" : "vec3<f32>"} = ${seed.expr};`);
70
+ const offsetX = scalarOffset(block, "offsetX", stage, state, ctx);
71
+ const offsetY = scalarOffset(block, "offsetY", stage, state, ctx);
72
+ const offsetZ = scalarOffset(block, "offsetZ", stage, state, ctx);
73
+ if (offsetX) {
74
+ state[stage].body.push(`${st}.x += 0.1 * ${offsetX};`);
75
+ }
76
+ if (offsetY) {
77
+ state[stage].body.push(`${st}.y += 0.1 * ${offsetY};`);
78
+ }
79
+ if (offsetZ && seed.type === "vec3f") {
80
+ state[stage].body.push(`${st}.z += 0.1 * ${offsetZ};`);
81
+ }
82
+ const chaos = optional(block, "chaos", stage, state, ctx);
83
+ const chaosExpr = chaos ? ctx.cast(chaos, seed.type).expr : seed.type === "vec2f" ? "vec2<f32>(0.0, 0.0)" : "vec3<f32>(0.0, 0.0, 0.0)";
84
+ return { expr: seed.type === "vec2f" ? `nme_cloudFbm2_${octaves}(${st}, ${chaosExpr})` : `nme_cloudFbm3_${octaves}(${st}, ${chaosExpr})`, type: "f32" };
85
+ }
86
+ };
87
+ export {
88
+ emitter
89
+ };
90
+ //# sourceMappingURL=cloud-block-BeVrangc.js.map