@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":"gltf-feature-xmp-BUfq_IVG.js","sources":["../src/loader-gltf/gltf-feature-xmp.ts"],"sourcesContent":["/**\n * KHR_xmp_json_ld feature.\n *\n * XMP JSON-LD is pure metadata — it has no effect on rendering. This feature\n * simply surfaces the document-level metadata packets (and the asset-referenced\n * packet) on the returned AssetContainer so applications can read provenance,\n * licensing, authorship, etc. It is dynamic-imported only when `extensionsUsed`\n * lists KHR_xmp_json_ld, so non-XMP scenes pay nothing.\n */\n\nimport type { GltfFeature } from \"./gltf-feature.js\";\n\nconst feature: GltfFeature = {\n id: \"KHR_xmp_json_ld\",\n async applyAsset(_meshes, _root, ctx) {\n const json = ctx._json;\n const packets: unknown[] = json.extensions?.KHR_xmp_json_ld?.packets ?? [];\n const assetPacketIndex: number | undefined = json.asset?.extensions?.KHR_xmp_json_ld?.packet;\n const assetPacket = assetPacketIndex !== undefined ? packets[assetPacketIndex] : undefined;\n return { xmpMetadata: { packets, assetPacket } };\n },\n};\n\nexport default feature;\n"],"names":[],"mappings":"AAYA,MAAM,UAAuB;AAAA,EACzB,IAAI;AAAA,EACJ,MAAM,WAAW,SAAS,OAAO,KAAK;AAF1C;AAGQ,UAAM,OAAO,IAAI;AACjB,UAAM,YAAqB,gBAAK,eAAL,mBAAiB,oBAAjB,mBAAkC,YAAW,CAAA;AACxE,UAAM,oBAAuC,sBAAK,UAAL,mBAAY,eAAZ,mBAAwB,oBAAxB,mBAAyC;AACtF,UAAM,cAAc,qBAAqB,SAAY,QAAQ,gBAAgB,IAAI;AACjF,WAAO,EAAE,aAAa,EAAE,SAAS,cAAY;AAAA,EACjD;AACJ;"}
@@ -0,0 +1,27 @@
1
+ function parseGlbContainer(buffer) {
2
+ const view = new DataView(buffer);
3
+ const magic = view.getUint32(0, true);
4
+ if (magic !== 1179937895) {
5
+ throw new Error("Not a valid GLB file");
6
+ }
7
+ let offset = 12;
8
+ const jsonLength = view.getUint32(offset, true);
9
+ const jsonType = view.getUint32(offset + 4, true);
10
+ if (jsonType !== 1313821514) {
11
+ throw new Error("First GLB chunk is not JSON");
12
+ }
13
+ const jsonStr = new TextDecoder().decode(new Uint8Array(buffer, offset + 8, jsonLength));
14
+ const json = JSON.parse(jsonStr);
15
+ offset += 8 + jsonLength;
16
+ const binLength = view.getUint32(offset, true);
17
+ const binType = view.getUint32(offset + 4, true);
18
+ if (binType !== 5130562) {
19
+ throw new Error("Second GLB chunk is not BIN");
20
+ }
21
+ const binChunk = new DataView(buffer, offset + 8, binLength);
22
+ return { json, binChunk };
23
+ }
24
+ export {
25
+ parseGlbContainer
26
+ };
27
+ //# sourceMappingURL=gltf-glb-parser-D6UZWFuC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-glb-parser-D6UZWFuC.js","sources":["../src/loader-gltf/gltf-glb-parser.ts"],"sourcesContent":["/** GLB binary container parsing. Kept separate so .gltf-only scenes do not ship it. */\n\nexport function parseGlbContainer(buffer: ArrayBuffer): { json: any; binChunk: DataView } {\n const view = new DataView(buffer);\n\n // Header (12 bytes)\n const magic = view.getUint32(0, true);\n if (magic !== 0x46546c67) {\n throw new Error(\"Not a valid GLB file\");\n }\n // const version = view.getUint32(4, true);\n // const totalLength = view.getUint32(8, true);\n\n // JSON chunk\n let offset = 12;\n const jsonLength = view.getUint32(offset, true);\n const jsonType = view.getUint32(offset + 4, true);\n if (jsonType !== 0x4e4f534a) {\n throw new Error(\"First GLB chunk is not JSON\");\n }\n const jsonStr = new TextDecoder().decode(new Uint8Array(buffer, offset + 8, jsonLength));\n const json = JSON.parse(jsonStr);\n offset += 8 + jsonLength;\n\n // BIN chunk\n const binLength = view.getUint32(offset, true);\n const binType = view.getUint32(offset + 4, true);\n if (binType !== 0x004e4942) {\n throw new Error(\"Second GLB chunk is not BIN\");\n }\n const binChunk = new DataView(buffer, offset + 8, binLength);\n\n return { json, binChunk };\n}\n"],"names":[],"mappings":"AAEO,SAAS,kBAAkB,QAAwD;AACtF,QAAM,OAAO,IAAI,SAAS,MAAM;AAGhC,QAAM,QAAQ,KAAK,UAAU,GAAG,IAAI;AACpC,MAAI,UAAU,YAAY;AACtB,UAAM,IAAI,MAAM,sBAAsB;AAAA,EAC1C;AAKA,MAAI,SAAS;AACb,QAAM,aAAa,KAAK,UAAU,QAAQ,IAAI;AAC9C,QAAM,WAAW,KAAK,UAAU,SAAS,GAAG,IAAI;AAChD,MAAI,aAAa,YAAY;AACzB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EACjD;AACA,QAAM,UAAU,IAAI,YAAA,EAAc,OAAO,IAAI,WAAW,QAAQ,SAAS,GAAG,UAAU,CAAC;AACvF,QAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,YAAU,IAAI;AAGd,QAAM,YAAY,KAAK,UAAU,QAAQ,IAAI;AAC7C,QAAM,UAAU,KAAK,UAAU,SAAS,GAAG,IAAI;AAC/C,MAAI,YAAY,SAAY;AACxB,UAAM,IAAI,MAAM,6BAA6B;AAAA,EACjD;AACA,QAAM,WAAW,IAAI,SAAS,QAAQ,SAAS,GAAG,SAAS;AAE3D,SAAO,EAAE,MAAM,SAAA;AACnB;"}
@@ -0,0 +1,241 @@
1
+ import { T as TYPE_SIZES, d as computeAabb, i as initMeshTransform, r as resolveAccessor, e as createMappedBuffer } from "./index-C8HOR2sB.js";
2
+ const FLOAT = 5126;
3
+ const UNSIGNED_SHORT = 5123;
4
+ const UNSIGNED_INT = 5125;
5
+ const UNSIGNED_BYTE = 5121;
6
+ const COMP_BYTES = { [UNSIGNED_BYTE]: 1, [UNSIGNED_SHORT]: 2, [UNSIGNED_INT]: 4, [FLOAT]: 4 };
7
+ function accessorIsStrided(json, idx) {
8
+ const a = json.accessors[idx];
9
+ const bv = json.bufferViews[a.bufferView];
10
+ const stride = bv.byteStride;
11
+ if (stride === void 0) {
12
+ return false;
13
+ }
14
+ const elemBytes = (TYPE_SIZES[a.type] ?? 1) * (COMP_BYTES[a.componentType] ?? 4);
15
+ return stride !== elemBytes;
16
+ }
17
+ function resolveStrided(json, binChunk, accessorIdx) {
18
+ const accessor = json.accessors[accessorIdx];
19
+ const bufferView = json.bufferViews[accessor.bufferView];
20
+ const ab = binChunk.buffer;
21
+ return {
22
+ _bufferView: accessor.bufferView,
23
+ _stride: bufferView.byteStride,
24
+ _offset: accessor.byteOffset ?? 0,
25
+ _componentType: accessor.componentType,
26
+ _componentCount: TYPE_SIZES[accessor.type] ?? 1,
27
+ _count: accessor.count,
28
+ _slice: new Uint8Array(ab, binChunk.byteOffset + (bufferView.byteOffset ?? 0), bufferView.byteLength)
29
+ };
30
+ }
31
+ function destrideToTight(il) {
32
+ const dv = new DataView(il._slice.buffer, il._slice.byteOffset, il._slice.byteLength);
33
+ const cb = COMP_BYTES[il._componentType] ?? 4;
34
+ const ct = il._componentType;
35
+ const cc = il._componentCount;
36
+ const out = new Float32Array(il._count * cc);
37
+ for (let v = 0; v < il._count; v++) {
38
+ const rowBase = il._offset + v * il._stride;
39
+ for (let c = 0; c < cc; c++) {
40
+ const off = rowBase + c * cb;
41
+ out[v * cc + c] = ct === FLOAT ? dv.getFloat32(off, true) : ct === UNSIGNED_SHORT ? dv.getUint16(off, true) : ct === UNSIGNED_INT ? dv.getUint32(off, true) : dv.getUint8(off);
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+ function buildInterleavedPartial(json, binChunk, primitive, worldMatrix, nodeIdx) {
47
+ const attrs = primitive.attributes;
48
+ let anyStrided = false;
49
+ for (const name in attrs) {
50
+ if (accessorIsStrided(json, attrs[name])) {
51
+ anyStrided = true;
52
+ break;
53
+ }
54
+ }
55
+ if (!anyStrided) {
56
+ return void 0;
57
+ }
58
+ const vb = {};
59
+ let vertexCount = 0;
60
+ const resolveOne = (name, eager) => {
61
+ const idx = attrs[name];
62
+ if (idx === void 0) {
63
+ return { _tight: null, _count: 0 };
64
+ }
65
+ if (accessorIsStrided(json, idx)) {
66
+ const il = resolveStrided(json, binChunk, idx);
67
+ return { _tight: eager ? destrideToTight(il) : null, _il: il, _count: il._count };
68
+ }
69
+ const av = resolveAccessor(json, binChunk, idx);
70
+ return { _tight: av._data, _count: av._count };
71
+ };
72
+ const pos = resolveOne("POSITION", false);
73
+ vb._p = pos._il;
74
+ vertexCount = pos._count;
75
+ const nrm = resolveOne("NORMAL", false);
76
+ vb._n = nrm._il;
77
+ const uv = resolveOne("TEXCOORD_0", false);
78
+ vb._u = uv._il;
79
+ const tan = resolveOne("TANGENT", true);
80
+ vb._t = tan._il;
81
+ const uv2 = resolveOne("TEXCOORD_1", true);
82
+ vb._u2 = uv2._il;
83
+ const col = resolveOne("COLOR_0", true);
84
+ vb._c = col._il;
85
+ const positions = pos._tight;
86
+ let normals = nrm._tight;
87
+ let uvs = uv._tight;
88
+ const tangents = tan._tight;
89
+ const uv2s = uv2._tight;
90
+ const colors = col._tight;
91
+ if (!normals && !vb._n) {
92
+ normals = new Float32Array(vertexCount * 3);
93
+ }
94
+ if (!uvs && !vb._u) {
95
+ uvs = new Float32Array(vertexCount * 2);
96
+ }
97
+ const idxData = primitive.indices !== void 0 ? resolveAccessor(json, binChunk, primitive.indices) : null;
98
+ const indices = idxData ? idxData._data instanceof Uint32Array ? new Uint32Array(idxData._data) : idxData._data instanceof Uint8Array ? Uint16Array.from(idxData._data) : new Uint16Array(idxData._data.buffer, idxData._data.byteOffset, idxData._count) : new Uint16Array(0);
99
+ return {
100
+ _positions: positions,
101
+ _normals: normals,
102
+ _tangents: tangents,
103
+ _uvs: uvs,
104
+ _uv2s: uv2s,
105
+ _colors: colors,
106
+ _indices: indices,
107
+ _vertexCount: vertexCount,
108
+ _indexCount: (idxData == null ? void 0 : idxData._count) ?? 0,
109
+ _worldMatrix: worldMatrix,
110
+ _vb: vb,
111
+ _nodeIndex: nodeIdx,
112
+ _primitive: primitive
113
+ };
114
+ }
115
+ function buildInterleavedGpu(engine, m) {
116
+ var _a, _b, _c, _d;
117
+ const vbsrc = m._vb;
118
+ const shared = /* @__PURE__ */ new Map();
119
+ const vbuf = (a, tight) => {
120
+ if (!a) {
121
+ return tight ? createMappedBuffer(engine, tight, GPUBufferUsage.VERTEX) : null;
122
+ }
123
+ let b = shared.get(a._bufferView);
124
+ if (!b) {
125
+ shared.set(a._bufferView, b = createMappedBuffer(engine, a._slice, GPUBufferUsage.VERTEX));
126
+ }
127
+ return b;
128
+ };
129
+ return {
130
+ positionBuffer: vbuf(vbsrc._p, m._positions),
131
+ normalBuffer: vbuf(vbsrc._n, m._normals),
132
+ tangentBuffer: m._tangents ? vbuf(vbsrc._t, m._tangents) : null,
133
+ uvBuffer: vbuf(vbsrc._u, m._uvs),
134
+ uv2Buffer: m._uv2s ? vbuf(vbsrc._u2, m._uv2s) : null,
135
+ colorBuffer: m._colors ? vbuf(vbsrc._c, m._colors) : null,
136
+ indexBuffer: createMappedBuffer(engine, m._indices, GPUBufferUsage.INDEX),
137
+ indexCount: m._indexCount,
138
+ indexFormat: m._indices instanceof Uint32Array ? "uint32" : "uint16",
139
+ _vbLayout: vbsrc,
140
+ _vbKey: `vb${((_a = vbsrc._p) == null ? void 0 : _a._stride) ?? 0}.${((_b = vbsrc._n) == null ? void 0 : _b._stride) ?? 0}.${((_c = vbsrc._t) == null ? void 0 : _c._stride) ?? 0}.${((_d = vbsrc._u) == null ? void 0 : _d._stride) ?? 0}`
141
+ };
142
+ }
143
+ function buildInterleavedMesh(engine, m, index, material) {
144
+ var _a;
145
+ const gpu = buildInterleavedGpu(engine, m);
146
+ const [boundMin, boundMax] = m._vb._p ? computeAabbStrided(m._vb._p, m._worldMatrix) : computeAabb(m._positions, m._worldMatrix);
147
+ const mesh = {
148
+ name: `gltf_mesh_${index}`,
149
+ material,
150
+ receiveShadows: false,
151
+ boundMin,
152
+ boundMax,
153
+ skeleton: null,
154
+ morphTargets: null,
155
+ _materialDirty: false,
156
+ _gpu: gpu
157
+ };
158
+ initMeshTransform(mesh);
159
+ installLazyCpu(mesh, m);
160
+ mesh._cpuIndices = m._indices instanceof Uint32Array ? m._indices : new Uint32Array(m._indices);
161
+ (_a = engine._dlr) == null ? void 0 : _a.m(mesh, m._uv2s, m._tangents, m._colors, m._indices, gpu.indexFormat);
162
+ return mesh;
163
+ }
164
+ function computeAabbStrided(il, world) {
165
+ const dv = new DataView(il._slice.buffer, il._slice.byteOffset, il._slice.byteLength);
166
+ let minX = Infinity, minY = Infinity, minZ = Infinity;
167
+ let maxX = -Infinity, maxY = -Infinity, maxZ = -Infinity;
168
+ for (let v = 0; v < il._count; v++) {
169
+ const base = il._offset + v * il._stride;
170
+ const lx = dv.getFloat32(base, true);
171
+ const ly = dv.getFloat32(base + 4, true);
172
+ const lz = dv.getFloat32(base + 8, true);
173
+ let x = lx, y = ly, z = lz;
174
+ if (world) {
175
+ x = world[0] * lx + world[4] * ly + world[8] * lz + world[12];
176
+ y = world[1] * lx + world[5] * ly + world[9] * lz + world[13];
177
+ z = world[2] * lx + world[6] * ly + world[10] * lz + world[14];
178
+ }
179
+ if (x < minX) {
180
+ minX = x;
181
+ }
182
+ if (x > maxX) {
183
+ maxX = x;
184
+ }
185
+ if (y < minY) {
186
+ minY = y;
187
+ }
188
+ if (y > maxY) {
189
+ maxY = y;
190
+ }
191
+ if (z < minZ) {
192
+ minZ = z;
193
+ }
194
+ if (z > maxZ) {
195
+ maxZ = z;
196
+ }
197
+ }
198
+ return [
199
+ [minX, minY, minZ],
200
+ [maxX, maxY, maxZ]
201
+ ];
202
+ }
203
+ function installLazyCpu(mesh, m) {
204
+ const vb = m._vb;
205
+ if (vb._p) {
206
+ Object.defineProperty(mesh, "_cpuPositions", lazyCpuDesc(vb._p));
207
+ } else if (m._positions) {
208
+ mesh._cpuPositions = m._positions;
209
+ }
210
+ if (vb._n) {
211
+ Object.defineProperty(mesh, "_cpuNormals", lazyCpuDesc(vb._n));
212
+ } else if (m._normals) {
213
+ mesh._cpuNormals = m._normals;
214
+ }
215
+ if (vb._u) {
216
+ Object.defineProperty(mesh, "_cpuUvs", lazyCpuDesc(vb._u));
217
+ } else if (m._uvs) {
218
+ mesh._cpuUvs = m._uvs;
219
+ }
220
+ }
221
+ function lazyCpuDesc(il) {
222
+ let cached;
223
+ return {
224
+ configurable: true,
225
+ enumerable: true,
226
+ get() {
227
+ return cached ?? (cached = destrideToTight(il));
228
+ },
229
+ set(v) {
230
+ cached = v;
231
+ }
232
+ };
233
+ }
234
+ export {
235
+ accessorIsStrided,
236
+ buildInterleavedMesh,
237
+ buildInterleavedPartial,
238
+ computeAabbStrided,
239
+ installLazyCpu
240
+ };
241
+ //# sourceMappingURL=gltf-interleave-DGnUlz28.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-interleave-DGnUlz28.js","sources":["../src/loader-gltf/gltf-interleave.ts"],"sourcesContent":["/**\n * Interleaved (strided) glTF vertex-buffer support — dynamically imported.\n *\n * The engine renders interleaved attributes genuinely: the raw strided\n * bufferView slice is uploaded ONCE as a shared GPU buffer and bound to each\n * attribute at its byte offset with the pipeline's vertex `arrayStride` set to\n * the bufferView byteStride. The loader never rewrites the asset.\n *\n * This whole module is loaded via `await import()` only when an asset actually\n * contains an interleaved bufferView, so non-interleaved scenes pay ZERO bundle\n * cost. The tight CPU copy of position/normal/uv (for AABB, picking, CSG, …) is\n * de-strided LAZILY — only on first CPU read via `installLazyCpu` — so scenes\n * that only render never materialize it.\n */\n\nimport type { Mat4 } from \"../math/types.js\";\nimport type { Aabb } from \"../math/aabb.js\";\nimport { computeAabb } from \"../math/compute-aabb.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\nimport type { Mesh, MeshGPU } from \"../mesh/mesh.js\";\nimport { initMeshTransform } from \"../mesh/mesh.js\";\nimport type { PbrMaterialProps } from \"../material/pbr/pbr-material.js\";\nimport { createMappedBuffer } from \"../resource/gpu-buffers.js\";\nimport { resolveAccessor, TYPE_SIZES } from \"./gltf-parser.js\";\nimport type { GltfMeshData } from \"./load-gltf.js\";\n\nconst FLOAT = 5126;\nconst UNSIGNED_SHORT = 5123;\nconst UNSIGNED_INT = 5125;\nconst UNSIGNED_BYTE = 5121;\n\nconst COMP_BYTES: Record<number, number> = { [UNSIGNED_BYTE]: 1, [UNSIGNED_SHORT]: 2, [UNSIGNED_INT]: 4, [FLOAT]: 4 };\n\n/** Interleave descriptor for one attribute sourced from a strided bufferView.\n * The raw slice is shared across attributes of the same bufferView; the\n * pipeline uses `_stride` as arrayStride and binds at `_offset`. */\nexport interface AccessorInterleave {\n /** @internal glTF bufferView index — shared-buffer key (same view → one GPU buffer). */\n _bufferView: number;\n /** @internal Interleave byte stride (bufferView.byteStride) → pipeline arrayStride. */\n _stride: number;\n /** @internal Attribute byte offset within the bufferView → setVertexBuffer bind offset. */\n _offset: number;\n /** @internal glTF component type (FLOAT, UNSIGNED_SHORT, …). */\n _componentType: number;\n /** @internal Components per vertex. */\n _componentCount: number;\n /** @internal Vertex count. */\n _count: number;\n /** @internal Raw bufferView bytes (shared across attributes). Retained after GPU upload\n * so the CPU copy can be de-strided lazily on demand. */\n _slice?: Uint8Array;\n}\n\n/** Per-attribute interleave sources for a primitive (keys mirror MeshVbLayout). */\nexport interface GltfVb {\n /** @internal */\n _p?: AccessorInterleave;\n /** @internal */\n _n?: AccessorInterleave;\n /** @internal */\n _t?: AccessorInterleave;\n /** @internal */\n _u?: AccessorInterleave;\n /** @internal */\n _u2?: AccessorInterleave;\n /** @internal */\n _c?: AccessorInterleave;\n}\n\n/** True if accessor `idx`'s bufferView is interleaved (byteStride present and\n * larger than the attribute's tightly-packed element size). */\nexport function accessorIsStrided(json: any, idx: number): boolean {\n const a = json.accessors[idx];\n const bv = json.bufferViews[a.bufferView];\n const stride: number | undefined = bv.byteStride;\n if (stride === undefined) {\n return false;\n }\n const elemBytes = (TYPE_SIZES[a.type] ?? 1) * (COMP_BYTES[a.componentType] ?? 4);\n return stride !== elemBytes;\n}\n\n/** Resolve a strided accessor into an {@link AccessorInterleave} descriptor. */\nfunction resolveStrided(json: any, binChunk: DataView, accessorIdx: number): AccessorInterleave {\n const accessor = json.accessors[accessorIdx];\n const bufferView = json.bufferViews[accessor.bufferView];\n const ab = binChunk.buffer as ArrayBuffer;\n return {\n _bufferView: accessor.bufferView,\n _stride: bufferView.byteStride,\n _offset: accessor.byteOffset ?? 0,\n _componentType: accessor.componentType,\n _componentCount: TYPE_SIZES[accessor.type] ?? 1,\n _count: accessor.count,\n _slice: new Uint8Array(ab, binChunk.byteOffset + (bufferView.byteOffset ?? 0), bufferView.byteLength),\n };\n}\n\n/** De-stride an interleaved attribute into a tight Float32Array, reading raw\n * component values (no normalization) so the result matches what a tight\n * accessor view would have produced. */\nfunction destrideToTight(il: AccessorInterleave): Float32Array {\n const dv = new DataView(il._slice!.buffer, il._slice!.byteOffset, il._slice!.byteLength);\n const cb = COMP_BYTES[il._componentType] ?? 4;\n const ct = il._componentType;\n const cc = il._componentCount;\n const out = new Float32Array(il._count * cc);\n for (let v = 0; v < il._count; v++) {\n const rowBase = il._offset + v * il._stride;\n for (let c = 0; c < cc; c++) {\n const off = rowBase + c * cb;\n out[v * cc + c] =\n ct === FLOAT ? dv.getFloat32(off, true) : ct === UNSIGNED_SHORT ? dv.getUint16(off, true) : ct === UNSIGNED_INT ? dv.getUint32(off, true) : dv.getUint8(off);\n }\n }\n return out;\n}\n\n/** Build a mesh-data partial for a primitive, but ONLY if it actually sources\n * ≥1 attribute from an interleaved (strided) bufferView. Returns `undefined`\n * for fully-tight primitives so the caller falls back to its tight path.\n *\n * Strided POSITION/NORMAL/TEXCOORD_0 attributes keep their raw slice in `_vb`\n * (for genuine GPU interleaving) and leave the tight CPU field `null` — the\n * de-strided copy is materialized lazily on first CPU read (see\n * {@link installLazyCpu}). Strided TANGENT/TEXCOORD_1/COLOR are eagerly\n * de-strided (they feed device-lost recovery), but no current asset interleaves\n * them. Tight attributes resolve exactly like the core loader. */\nexport function buildInterleavedPartial(json: any, binChunk: DataView, primitive: any, worldMatrix: Mat4, nodeIdx: number): Omit<GltfMeshData, \"_material\"> | undefined {\n const attrs = primitive.attributes;\n\n // Per-primitive gate: bail (→ tight path) unless a vertex attribute is strided.\n let anyStrided = false;\n for (const name in attrs) {\n if (accessorIsStrided(json, attrs[name])) {\n anyStrided = true;\n break;\n }\n }\n if (!anyStrided) {\n return undefined;\n }\n\n const vb: GltfVb = {};\n let vertexCount = 0;\n\n // Resolve one attribute. Returns the interleave descriptor (when the source is\n // strided) and/or a tight CPU array. `eager` de-strides strided sources up-front\n // (TANGENT/UV2/COLOR feed device-lost recovery); lazy ones leave `_tight` null and\n // are de-strided on demand. The caller assigns `vb.<attr>` with a STATIC property\n // name (never a computed `vb[key]`) — a computed write would stay an unmangled\n // literal while every reader uses the mangled static name, corrupting the object\n // across the dynamic-import chunk boundary.\n const resolveOne = (name: string, eager: boolean): { _tight: Float32Array | null; _il?: AccessorInterleave; _count: number } => {\n const idx = attrs[name];\n if (idx === undefined) {\n return { _tight: null, _count: 0 };\n }\n if (accessorIsStrided(json, idx)) {\n const il = resolveStrided(json, binChunk, idx);\n return { _tight: eager ? destrideToTight(il) : null, _il: il, _count: il._count };\n }\n const av = resolveAccessor(json, binChunk, idx);\n return { _tight: av._data as Float32Array, _count: av._count };\n };\n\n const pos = resolveOne(\"POSITION\", false);\n vb._p = pos._il;\n vertexCount = pos._count;\n const nrm = resolveOne(\"NORMAL\", false);\n vb._n = nrm._il;\n const uv = resolveOne(\"TEXCOORD_0\", false);\n vb._u = uv._il;\n const tan = resolveOne(\"TANGENT\", true);\n vb._t = tan._il;\n const uv2 = resolveOne(\"TEXCOORD_1\", true);\n vb._u2 = uv2._il;\n const col = resolveOne(\"COLOR_0\", true);\n vb._c = col._il;\n\n const positions = pos._tight;\n let normals = nrm._tight;\n let uvs = uv._tight;\n const tangents = tan._tight;\n const uv2s = uv2._tight;\n const colors = col._tight;\n\n // Absent (not merely strided) NORMAL/UV need a tight zero-filled buffer so the\n // GPU has a bindable vertex buffer — matches the core loader's tight path.\n if (!normals && !vb._n) {\n normals = new Float32Array(vertexCount * 3);\n }\n if (!uvs && !vb._u) {\n uvs = new Float32Array(vertexCount * 2);\n }\n\n const idxData = primitive.indices !== undefined ? resolveAccessor(json, binChunk, primitive.indices) : null;\n const indices = idxData\n ? idxData._data instanceof Uint32Array\n ? new Uint32Array(idxData._data)\n : idxData._data instanceof Uint8Array\n ? Uint16Array.from(idxData._data)\n : new Uint16Array(idxData._data.buffer, idxData._data.byteOffset, idxData._count)\n : new Uint16Array(0);\n\n return {\n _positions: positions,\n _normals: normals,\n _tangents: tangents,\n _uvs: uvs,\n _uv2s: uv2s,\n _colors: colors,\n _indices: indices,\n _vertexCount: vertexCount,\n _indexCount: idxData?._count ?? 0,\n _worldMatrix: worldMatrix,\n _vb: vb,\n _nodeIndex: nodeIdx,\n _primitive: primitive,\n };\n}\n\n/** Build the GPU geometry for an interleaved mesh: one shared buffer per\n * bufferView for strided attributes (bound at offset with arrayStride), tight\n * attributes get their own buffer — byte-identical to non-interleaved meshes.\n * The raw `_slice` is intentionally retained on `_vb` so the CPU copy can be\n * de-strided lazily later (see {@link installLazyCpu}). */\nfunction buildInterleavedGpu(engine: EngineContext, m: GltfMeshData): MeshGPU {\n const vbsrc = m._vb!;\n const shared = new Map<number, GPUBuffer>();\n const vbuf = (a: AccessorInterleave | undefined, tight: Float32Array | null): GPUBuffer | null => {\n if (!a) {\n return tight ? createMappedBuffer(engine, tight, GPUBufferUsage.VERTEX) : null;\n }\n let b = shared.get(a._bufferView);\n if (!b) {\n shared.set(a._bufferView, (b = createMappedBuffer(engine, a._slice!, GPUBufferUsage.VERTEX)));\n }\n return b;\n };\n return {\n positionBuffer: vbuf(vbsrc._p, m._positions)!,\n normalBuffer: vbuf(vbsrc._n, m._normals)!,\n tangentBuffer: m._tangents ? vbuf(vbsrc._t, m._tangents) : null,\n uvBuffer: vbuf(vbsrc._u, m._uvs)!,\n uv2Buffer: m._uv2s ? vbuf(vbsrc._u2, m._uv2s) : null,\n colorBuffer: m._colors ? vbuf(vbsrc._c, m._colors) : null,\n indexBuffer: createMappedBuffer(engine, m._indices, GPUBufferUsage.INDEX),\n indexCount: m._indexCount,\n indexFormat: (m._indices instanceof Uint32Array ? \"uint32\" : \"uint16\") as GPUIndexFormat,\n _vbLayout: vbsrc,\n _vbKey: `vb${vbsrc._p?._stride ?? 0}.${vbsrc._n?._stride ?? 0}.${vbsrc._t?._stride ?? 0}.${vbsrc._u?._stride ?? 0}`,\n };\n}\n\n/** Build a complete engine mesh from interleaved glTF mesh-data. Owns ALL\n * interleave-specific work (GPU upload, AABB fold, lazy CPU install, device-lost\n * retention) so the core loader's tight path stays byte-identical to the\n * non-interleaved engine — keeping interleave bytes out of every glTF scene that\n * doesn't use it. */\nexport function buildInterleavedMesh(engine: EngineContext, m: GltfMeshData, index: number, material: PbrMaterialProps): Mesh {\n const gpu = buildInterleavedGpu(engine, m);\n\n // AABB: fold strided positions straight from the slice; tight positions normally.\n const [boundMin, boundMax] = m._vb!._p ? computeAabbStrided(m._vb!._p, m._worldMatrix) : computeAabb(m._positions!, m._worldMatrix);\n\n const mesh = {\n name: `gltf_mesh_${index}`,\n material,\n receiveShadows: false,\n boundMin,\n boundMax,\n skeleton: null,\n morphTargets: null,\n _materialDirty: false,\n _gpu: gpu,\n } as unknown as Mesh;\n initMeshTransform(mesh);\n\n // Lazy CPU geometry: the de-strided tight copy is built only on first read.\n installLazyCpu(mesh, m);\n mesh._cpuIndices = m._indices instanceof Uint32Array ? m._indices : new Uint32Array(m._indices);\n engine._dlr?.m(mesh, m._uv2s, m._tangents, m._colors, m._indices, gpu.indexFormat);\n\n return mesh as Mesh;\n}\n\n/** Fold an AABB directly over an interleaved (strided) FLOAT vec3 position\n * source — no tight copy is materialized. Mirrors {@link computeAabb}'s\n * world-transform handling. All current interleaved assets use FLOAT positions. */\nexport function computeAabbStrided(il: AccessorInterleave, world?: Mat4): Aabb {\n const dv = new DataView(il._slice!.buffer, il._slice!.byteOffset, il._slice!.byteLength);\n let minX = Infinity,\n minY = Infinity,\n minZ = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity,\n maxZ = -Infinity;\n for (let v = 0; v < il._count; v++) {\n const base = il._offset + v * il._stride;\n const lx = dv.getFloat32(base, true);\n const ly = dv.getFloat32(base + 4, true);\n const lz = dv.getFloat32(base + 8, true);\n let x = lx,\n y = ly,\n z = lz;\n if (world) {\n x = world[0]! * lx + world[4]! * ly + world[8]! * lz + world[12]!;\n y = world[1]! * lx + world[5]! * ly + world[9]! * lz + world[13]!;\n z = world[2]! * lx + world[6]! * ly + world[10]! * lz + world[14]!;\n }\n if (x < minX) {\n minX = x;\n }\n if (x > maxX) {\n maxX = x;\n }\n if (y < minY) {\n minY = y;\n }\n if (y > maxY) {\n maxY = y;\n }\n if (z < minZ) {\n minZ = z;\n }\n if (z > maxZ) {\n maxZ = z;\n }\n }\n return [\n [minX, minY, minZ],\n [maxX, maxY, maxZ],\n ];\n}\n\n/** Install lazy CPU-geometry accessors on an interleaved mesh. Each of\n * `_cpuPositions/_cpuNormals/_cpuUvs` that comes from a strided source is\n * defined as a getter that de-strides a tight copy on first access and caches\n * it; tight attributes are assigned directly. A mesh that is never picked /\n * CSG'd / navigated never materializes the de-strided arrays.\n *\n * The property names are written as STATIC literals (not a computed key) so the\n * minifier mangles them identically to the static reads in the picking /\n * device-lost code — a computed `defineProperty(mesh, key)` would leave the name\n * an unmangled literal and mismatch those reads across the chunk boundary. */\nexport function installLazyCpu(mesh: any, m: GltfMeshData): void {\n const vb = m._vb!;\n if (vb._p) {\n Object.defineProperty(mesh, \"_cpuPositions\", lazyCpuDesc(vb._p));\n } else if (m._positions) {\n mesh._cpuPositions = m._positions;\n }\n if (vb._n) {\n Object.defineProperty(mesh, \"_cpuNormals\", lazyCpuDesc(vb._n));\n } else if (m._normals) {\n mesh._cpuNormals = m._normals;\n }\n if (vb._u) {\n Object.defineProperty(mesh, \"_cpuUvs\", lazyCpuDesc(vb._u));\n } else if (m._uvs) {\n mesh._cpuUvs = m._uvs;\n }\n}\n\n/** Build a caching lazy-getter descriptor that de-strides `il` on first read. */\nfunction lazyCpuDesc(il: AccessorInterleave): PropertyDescriptor {\n let cached: Float32Array | undefined;\n return {\n configurable: true,\n enumerable: true,\n get(): Float32Array {\n return (cached ??= destrideToTight(il));\n },\n set(v: Float32Array): void {\n cached = v;\n },\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { z as pbrGroupBuilder, A as uploadTex, B as linearToSrgbByte, f as cloneTexture2D } from "./index-C8HOR2sB.js";
2
+ function wrapTexCoord(tex, texInfo) {
3
+ var _a, _b;
4
+ if (!texInfo) {
5
+ return tex;
6
+ }
7
+ if (tex._texCoord === 1) {
8
+ return tex;
9
+ }
10
+ const ti = texInfo;
11
+ const tc = ((_b = (_a = ti.extensions) == null ? void 0 : _a.KHR_texture_transform) == null ? void 0 : _b.texCoord) ?? ti.texCoord;
12
+ return tc === 1 ? cloneTexture2D(tex, { _texCoord: 1 }) : tex;
13
+ }
14
+ function buildDefaultPbrTexturesExt(engine, mat, sampler, generateMipmaps, getCachedTex, wrapTex) {
15
+ const wrap = (tex, ti) => wrapTexCoord(wrapTex(tex, ti), ti);
16
+ const raw = mat._rawMatDef ?? {};
17
+ const pbr = raw.pbrMetallicRoughness ?? {};
18
+ const baseColorTexture = mat._baseColorImage ? wrap(getCachedTex(mat._baseColorImage, true), pbr.baseColorTexture) : (() => {
19
+ const f = mat._baseColorFactor;
20
+ return uploadTex(
21
+ engine,
22
+ null,
23
+ true,
24
+ sampler,
25
+ generateMipmaps,
26
+ new Uint8Array([linearToSrgbByte(f[0]), linearToSrgbByte(f[1]), linearToSrgbByte(f[2]), Math.round(Math.max(0, Math.min(1, f[3])) * 255)])
27
+ );
28
+ })();
29
+ const normalTexture = mat._normalImage ? wrap(getCachedTex(mat._normalImage, false), raw.normalTexture) : void 0;
30
+ const emissiveTexture = mat._emissiveImage ? wrap(getCachedTex(mat._emissiveImage, true), raw.emissiveTexture) : void 0;
31
+ const occlusionOnUv2 = mat._occlusionTexCoord !== 0 && mat._occlusionImage && !mat._metallicRoughnessImage;
32
+ let occlusionTexture;
33
+ const single = mat._metallicRoughnessImage ?? (occlusionOnUv2 ? null : mat._occlusionImage);
34
+ let ormTexture;
35
+ if (occlusionOnUv2) {
36
+ const clamp = (v) => Math.round(Math.max(0, Math.min(1, v)) * 255);
37
+ ormTexture = uploadTex(engine, null, false, sampler, generateMipmaps, new Uint8Array([255, clamp(mat._roughnessFactor), clamp(mat._metallicFactor), 255]));
38
+ occlusionTexture = wrap(getCachedTex(mat._occlusionImage, false), raw.occlusionTexture);
39
+ } else if (single && (!mat._metallicRoughnessImage || !mat._occlusionImage || mat._metallicRoughnessImage === mat._occlusionImage)) {
40
+ const ormTi = mat._metallicRoughnessImage ? pbr.metallicRoughnessTexture : raw.occlusionTexture;
41
+ ormTexture = wrap(getCachedTex(single, false), ormTi);
42
+ } else if (!single) {
43
+ const clamp = (v) => Math.round(Math.max(0, Math.min(1, v)) * 255);
44
+ ormTexture = uploadTex(engine, null, false, sampler, generateMipmaps, new Uint8Array([255, clamp(mat._roughnessFactor), clamp(mat._metallicFactor), 255]));
45
+ } else {
46
+ ormTexture = wrap(getCachedTex(mat._metallicRoughnessImage, false), pbr.metallicRoughnessTexture);
47
+ }
48
+ return { baseColorTexture, ormTexture, normalTexture, emissiveTexture, occlusionTexture };
49
+ }
50
+ function assemblePbrPropsExt(mat, tex, extLayers) {
51
+ var _a, _b, _c, _d;
52
+ const ef = mat._emissiveFactor;
53
+ const defaultFactor = ef[0] === 1 && ef[1] === 1 && ef[2] === 1 || ef[0] === 0 && ef[1] === 0 && ef[2] === 0;
54
+ const hasAnyUvTx = !!tex.baseColorTexture._hasTx || !!((_a = tex.normalTexture) == null ? void 0 : _a._hasTx) || !!tex.ormTexture._hasTx || !!((_b = tex.emissiveTexture) == null ? void 0 : _b._hasTx) || !!((_c = tex.occlusionTexture) == null ? void 0 : _c._hasTx);
55
+ return {
56
+ baseColorTexture: tex.baseColorTexture,
57
+ normalTexture: tex.normalTexture,
58
+ ormTexture: tex.ormTexture,
59
+ emissiveTexture: tex.emissiveTexture,
60
+ ...mat._baseColorImage && !isDefaultBaseColorFactor(mat._baseColorFactor) ? { baseColorFactor: mat._baseColorFactor } : void 0,
61
+ doubleSided: mat._doubleSided,
62
+ occlusionStrength: mat._occlusionImage ? 1 : 0,
63
+ ...mat._occlusionTexCoord ? { occlusionTexCoord: mat._occlusionTexCoord } : void 0,
64
+ ...tex.occlusionTexture ? { occlusionTexture: tex.occlusionTexture } : void 0,
65
+ ...mat._normalScale !== 1 ? { normalTextureScale: mat._normalScale } : void 0,
66
+ ...mat._metallicRoughnessImage ? { metallicFactor: mat._metallicFactor, roughnessFactor: mat._roughnessFactor } : void 0,
67
+ ...!defaultFactor ? { emissiveColor: [ef[0], ef[1], ef[2]] } : void 0,
68
+ enableSpecularAA: true,
69
+ ...mat._alphaMode === "BLEND" ? { alphaBlend: true, alpha: mat._baseColorFactor[3] } : void 0,
70
+ ...mat._alphaMode === "MASK" ? { alpha: mat._baseColorFactor[3], alphaCutOff: mat._alphaCutoff } : void 0,
71
+ ...hasAnyUvTx ? { _hasUvTx: true } : void 0,
72
+ ...((_d = mat._rawMatDef) == null ? void 0 : _d.name) ? { name: mat._rawMatDef.name } : void 0,
73
+ ...extLayers,
74
+ _buildGroup: pbrGroupBuilder,
75
+ _uboVersion: 0
76
+ };
77
+ }
78
+ function isDefaultBaseColorFactor(f) {
79
+ return f[0] === 1 && f[1] === 1 && f[2] === 1 && f[3] === 1;
80
+ }
81
+ export {
82
+ assemblePbrPropsExt,
83
+ buildDefaultPbrTexturesExt
84
+ };
85
+ //# sourceMappingURL=gltf-pbr-builder-ext-BFOxOCnQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-pbr-builder-ext-BFOxOCnQ.js","sources":["../src/loader-gltf/gltf-pbr-builder-ext.ts"],"sourcesContent":["/** Lazy-loaded slow path for PBR material assembly.\n * Only pulled into bundles whose glTF uses features that require per-texture\n * wrapping (e.g. KHR_texture_transform) or occlusion on UV2 (texCoord=1 with\n * no shared MR image). Scene1 (BoomBox) and any vanilla-PBR glTF skip this\n * module entirely. */\n\nimport type { EngineContext } from \"../engine/engine.js\";\nimport type { Texture2D } from \"../texture/texture-2d.js\";\nimport { cloneTexture2D } from \"../texture/texture-2d.js\";\nimport type { PbrMaterialProps } from \"../material/pbr/pbr-material.js\";\nimport { pbrGroupBuilder } from \"../material/pbr/pbr-material.js\";\nimport type { GltfMaterialData } from \"./gltf-material.js\";\nimport { linearToSrgbByte } from \"../math/color.js\";\nimport type { TextureWrapFn, GenerateMipmapsFn } from \"./gltf-pbr-builder.js\";\nimport { uploadTex } from \"./gltf-pbr-builder.js\";\n\nexport interface PbrTexturesExt {\n baseColorTexture: Texture2D;\n ormTexture: Texture2D;\n normalTexture: Texture2D | undefined;\n emissiveTexture: Texture2D | undefined;\n occlusionTexture: Texture2D | undefined;\n}\n\n/** Stamp `_texCoord=1` on a clone when textureInfo selects UV1 and the\n * wrapTex layer didn't already set it (i.e. scene has no KHR_texture_transform). */\nfunction wrapTexCoord(tex: Texture2D, texInfo: unknown): Texture2D {\n if (!texInfo) {\n return tex;\n }\n if ((tex as { _texCoord?: 0 | 1 })._texCoord === 1) {\n return tex;\n }\n const ti = texInfo as { texCoord?: number; extensions?: { KHR_texture_transform?: { texCoord?: number } } };\n const tc = ti.extensions?.KHR_texture_transform?.texCoord ?? ti.texCoord;\n return tc === 1 ? cloneTexture2D(tex, { _texCoord: 1 }) : tex;\n}\n\n/** Build textures with wrapTex + occlusionOnUv2 support. Mirrors master's\n * default texture building but honors per-textureInfo wrapping so\n * KHR_texture_transform can attach per-texture UV state. */\nexport function buildDefaultPbrTexturesExt(\n engine: EngineContext,\n mat: GltfMaterialData,\n sampler: GPUSampler,\n generateMipmaps: GenerateMipmapsFn,\n getCachedTex: (bitmap: ImageBitmap, srgb: boolean) => Texture2D,\n wrapTex: TextureWrapFn\n): PbrTexturesExt {\n const wrap: TextureWrapFn = (tex, ti) => wrapTexCoord(wrapTex(tex, ti), ti);\n const raw = mat._rawMatDef ?? {};\n const pbr = raw.pbrMetallicRoughness ?? {};\n const baseColorTexture = mat._baseColorImage\n ? wrap(getCachedTex(mat._baseColorImage, true), pbr.baseColorTexture)\n : (() => {\n const f = mat._baseColorFactor;\n return uploadTex(\n engine,\n null,\n true,\n sampler,\n generateMipmaps,\n new Uint8Array([linearToSrgbByte(f[0]), linearToSrgbByte(f[1]), linearToSrgbByte(f[2]), Math.round(Math.max(0, Math.min(1, f[3])) * 255)])\n );\n })();\n const normalTexture = mat._normalImage ? wrap(getCachedTex(mat._normalImage, false), raw.normalTexture) : undefined;\n const emissiveTexture = mat._emissiveImage ? wrap(getCachedTex(mat._emissiveImage, true), raw.emissiveTexture) : undefined;\n\n const occlusionOnUv2 = mat._occlusionTexCoord !== 0 && mat._occlusionImage && !mat._metallicRoughnessImage;\n let occlusionTexture: Texture2D | undefined;\n const single = mat._metallicRoughnessImage ?? (occlusionOnUv2 ? null : mat._occlusionImage);\n let ormTexture: Texture2D;\n if (occlusionOnUv2) {\n const clamp = (v: number) => Math.round(Math.max(0, Math.min(1, v)) * 255);\n ormTexture = uploadTex(engine, null, false, sampler, generateMipmaps, new Uint8Array([255, clamp(mat._roughnessFactor), clamp(mat._metallicFactor), 255]));\n occlusionTexture = wrap(getCachedTex(mat._occlusionImage!, false), raw.occlusionTexture);\n } else if (single && (!mat._metallicRoughnessImage || !mat._occlusionImage || mat._metallicRoughnessImage === mat._occlusionImage)) {\n const ormTi = mat._metallicRoughnessImage ? pbr.metallicRoughnessTexture : raw.occlusionTexture;\n ormTexture = wrap(getCachedTex(single, false), ormTi);\n } else if (!single) {\n const clamp = (v: number) => Math.round(Math.max(0, Math.min(1, v)) * 255);\n ormTexture = uploadTex(engine, null, false, sampler, generateMipmaps, new Uint8Array([255, clamp(mat._roughnessFactor), clamp(mat._metallicFactor), 255]));\n } else {\n ormTexture = wrap(getCachedTex(mat._metallicRoughnessImage!, false), pbr.metallicRoughnessTexture);\n }\n return { baseColorTexture, ormTexture, normalTexture, emissiveTexture, occlusionTexture };\n}\n\n/** Slow-path assembly: adds occlusionTexCoord and occlusionTexture props. */\nexport function assemblePbrPropsExt(mat: GltfMaterialData, tex: PbrTexturesExt, extLayers: Partial<PbrMaterialProps> | undefined): PbrMaterialProps {\n const ef = mat._emissiveFactor;\n const defaultFactor = (ef[0] === 1 && ef[1] === 1 && ef[2] === 1) || (ef[0] === 0 && ef[1] === 0 && ef[2] === 0);\n // Precompute UV-transform presence so the renderer doesn't scan 5 textures\n // per mesh. Any wrapped texture with `_hasTx=true` (set by gltf-ext-uv-transform)\n // flips this once at build time; omitted entirely on fast path.\n const hasAnyUvTx =\n !!(tex.baseColorTexture as { _hasTx?: true })._hasTx ||\n !!(tex.normalTexture as { _hasTx?: true } | undefined)?._hasTx ||\n !!(tex.ormTexture as { _hasTx?: true })._hasTx ||\n !!(tex.emissiveTexture as { _hasTx?: true } | undefined)?._hasTx ||\n !!(tex.occlusionTexture as { _hasTx?: true } | undefined)?._hasTx;\n return {\n baseColorTexture: tex.baseColorTexture,\n normalTexture: tex.normalTexture,\n ormTexture: tex.ormTexture,\n emissiveTexture: tex.emissiveTexture,\n ...(mat._baseColorImage && !isDefaultBaseColorFactor(mat._baseColorFactor) ? { baseColorFactor: mat._baseColorFactor } : undefined),\n doubleSided: mat._doubleSided,\n occlusionStrength: mat._occlusionImage ? 1.0 : 0,\n ...(mat._occlusionTexCoord ? { occlusionTexCoord: mat._occlusionTexCoord } : undefined),\n ...(tex.occlusionTexture ? { occlusionTexture: tex.occlusionTexture } : undefined),\n ...(mat._normalScale !== 1 ? { normalTextureScale: mat._normalScale } : undefined),\n ...(mat._metallicRoughnessImage ? { metallicFactor: mat._metallicFactor, roughnessFactor: mat._roughnessFactor } : undefined),\n ...(!defaultFactor ? { emissiveColor: [ef[0], ef[1], ef[2]] as [number, number, number] } : undefined),\n enableSpecularAA: true,\n ...(mat._alphaMode === \"BLEND\" ? { alphaBlend: true, alpha: mat._baseColorFactor[3] } : undefined),\n ...(mat._alphaMode === \"MASK\" ? { alpha: mat._baseColorFactor[3], alphaCutOff: mat._alphaCutoff } : undefined),\n ...(hasAnyUvTx ? { _hasUvTx: true } : undefined),\n ...(mat._rawMatDef?.name ? { name: mat._rawMatDef.name as string } : undefined),\n ...extLayers,\n _buildGroup: pbrGroupBuilder,\n _uboVersion: 0,\n } as PbrMaterialProps;\n}\n\nfunction isDefaultBaseColorFactor(f: readonly number[]): boolean {\n return f[0] === 1 && f[1] === 1 && f[2] === 1 && f[3] === 1;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { aN as identityTexWrap, aO as getOrCreateSampler, aP as assembleMaterial, aQ as runMatExts, A as uploadTex, aR as makeImageFetcher } from "./index-C8HOR2sB.js";
2
+ import { buildDefaultPbrTexturesExt, assemblePbrPropsExt } from "./gltf-pbr-builder-ext-BFOxOCnQ.js";
3
+ async function loadVariantMaterials(json, binChunk, baseUrl, variantNames, meshes, engine, exts, wrapTex = identityTexWrap) {
4
+ var _a;
5
+ const generateMipmaps = (await import("./index-C8HOR2sB.js").then((n) => n.gg)).generateMipmaps;
6
+ const sampler = getOrCreateSampler(engine, {
7
+ magFilter: "linear",
8
+ minFilter: "linear",
9
+ mipmapFilter: "linear",
10
+ addressModeU: "repeat",
11
+ addressModeV: "repeat",
12
+ maxAnisotropy: 4
13
+ });
14
+ const matCache = /* @__PURE__ */ new Map();
15
+ const imageCache = /* @__PURE__ */ new Map();
16
+ const fetchImg = makeImageFetcher(json, binChunk, baseUrl, imageCache);
17
+ const getCachedTex = (bitmap, srgb) => uploadTex(engine, bitmap, srgb, sampler, generateMipmaps);
18
+ const extCtx = {
19
+ _engine: engine,
20
+ async _texture(texInfo, sRGB) {
21
+ if (!texInfo) {
22
+ return void 0;
23
+ }
24
+ const img = await fetchImg(texInfo);
25
+ return img ? wrapTex(uploadTex(engine, img, sRGB, sampler, generateMipmaps), texInfo) : void 0;
26
+ },
27
+ _uploadImage(bitmap, sRGB) {
28
+ return uploadTex(engine, bitmap, sRGB, sampler, generateMipmaps);
29
+ }
30
+ };
31
+ const getMat = (matIdx) => {
32
+ let p = matCache.get(matIdx);
33
+ if (!p) {
34
+ p = assembleMaterial(json, binChunk, matIdx, baseUrl, imageCache);
35
+ matCache.set(matIdx, p);
36
+ }
37
+ return p;
38
+ };
39
+ const pbrCache = /* @__PURE__ */ new Map();
40
+ const getPbr = (gltfMat) => {
41
+ let p = pbrCache.get(gltfMat);
42
+ if (!p) {
43
+ p = (async () => {
44
+ const tex = buildDefaultPbrTexturesExt(engine, gltfMat, sampler, generateMipmaps, getCachedTex, wrapTex);
45
+ const layers = await runMatExts(gltfMat, exts, extCtx);
46
+ return assemblePbrPropsExt(gltfMat, tex, layers);
47
+ })();
48
+ pbrCache.set(gltfMat, p);
49
+ }
50
+ return p;
51
+ };
52
+ const originals = [];
53
+ const variants = {};
54
+ for (const name of variantNames) {
55
+ variants[name] = [];
56
+ }
57
+ let meshIdx = 0;
58
+ for (let nodeIdx = 0; nodeIdx < json.nodes.length; nodeIdx++) {
59
+ const node = json.nodes[nodeIdx];
60
+ if (node.mesh === void 0) {
61
+ continue;
62
+ }
63
+ const gltfMesh = json.meshes[node.mesh];
64
+ for (const primitive of gltfMesh.primitives) {
65
+ const mesh = meshes[meshIdx];
66
+ const variantExt = (_a = primitive.extensions) == null ? void 0 : _a.KHR_materials_variants;
67
+ if (variantExt == null ? void 0 : variantExt.mappings) {
68
+ originals.push({ mesh, material: mesh.material });
69
+ for (const mapping of variantExt.mappings) {
70
+ const gltfMat = await getMat(mapping.material);
71
+ const pbrMat = await getPbr(gltfMat);
72
+ for (const vi of mapping.variants) {
73
+ const name = variantNames[vi];
74
+ if (name) {
75
+ variants[name].push({ mesh, material: pbrMat });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ meshIdx++;
81
+ }
82
+ }
83
+ return { names: variantNames, variants, originals };
84
+ }
85
+ export {
86
+ loadVariantMaterials
87
+ };
88
+ //# sourceMappingURL=gltf-variants-DFbr8EES.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gltf-variants-DFbr8EES.js","sources":["../src/loader-gltf/gltf-variants.ts"],"sourcesContent":["/**\n * KHR_materials_variants — glTF parsing + GPU upload for variant materials.\n *\n * Dynamically imported by load-gltf.ts ONLY when the extension is present.\n * This keeps variant code fully tree-shaken from bundles that don't use it.\n */\n\nimport type { Mesh } from \"../mesh/mesh.js\";\nimport type { PbrMaterialProps } from \"../material/pbr/pbr-material.js\";\nimport type { GltfMaterialData, GltfMatExtCtx } from \"./gltf-material.js\";\nimport { assembleMaterial, makeImageFetcher } from \"./gltf-material.js\";\nimport type { GltfFeature } from \"./gltf-feature.js\";\nimport type { MaterialVariantData, VariantMeshEntry } from \"./material-variants.js\";\nimport type { EngineContext } from \"../engine/engine.js\";\nimport { getOrCreateSampler } from \"../resource/gpu-pool.js\";\nimport { runMatExts, uploadTex, type GenerateMipmapsFn, type TextureWrapFn, identityTexWrap } from \"./gltf-pbr-builder.js\";\nimport { buildDefaultPbrTexturesExt, assemblePbrPropsExt } from \"./gltf-pbr-builder-ext.js\";\n\n/**\n * Self-contained variant material loader.\n * Parses variant mappings from glTF JSON primitives, assembles + uploads variant materials,\n * and builds MaterialVariantData. Called only when KHR_materials_variants is present.\n */\nexport async function loadVariantMaterials(\n json: any,\n binChunk: DataView,\n baseUrl: string,\n variantNames: string[],\n meshes: Mesh[],\n engine: EngineContext,\n exts: GltfFeature[],\n wrapTex: TextureWrapFn = identityTexWrap\n): Promise<MaterialVariantData> {\n const generateMipmaps: GenerateMipmapsFn = (await import(\"../texture/generate-mipmaps.js\")).generateMipmaps;\n\n const sampler = getOrCreateSampler(engine, {\n magFilter: \"linear\",\n minFilter: \"linear\",\n mipmapFilter: \"linear\",\n addressModeU: \"repeat\",\n addressModeV: \"repeat\",\n maxAnisotropy: 4,\n });\n\n const matCache = new Map<number, Promise<GltfMaterialData>>();\n const imageCache = new Map<number, Promise<ImageBitmap>>();\n const fetchImg = makeImageFetcher(json, binChunk, baseUrl, imageCache);\n const getCachedTex = (bitmap: ImageBitmap, srgb: boolean) => uploadTex(engine, bitmap, srgb, sampler, generateMipmaps);\n const extCtx: GltfMatExtCtx = {\n _engine: engine,\n async _texture(texInfo, sRGB) {\n if (!texInfo) {\n return undefined;\n }\n const img = await fetchImg(texInfo);\n return img ? wrapTex(uploadTex(engine, img, sRGB, sampler, generateMipmaps), texInfo) : undefined;\n },\n _uploadImage(bitmap, sRGB) {\n return uploadTex(engine, bitmap, sRGB, sampler, generateMipmaps);\n },\n };\n const getMat = (matIdx: number): Promise<GltfMaterialData> => {\n let p = matCache.get(matIdx);\n if (!p) {\n p = assembleMaterial(json, binChunk, matIdx, baseUrl, imageCache);\n matCache.set(matIdx, p);\n }\n return p;\n };\n\n const pbrCache = new Map<GltfMaterialData, Promise<PbrMaterialProps>>();\n const getPbr = (gltfMat: GltfMaterialData): Promise<PbrMaterialProps> => {\n let p = pbrCache.get(gltfMat);\n if (!p) {\n p = (async () => {\n const tex = buildDefaultPbrTexturesExt(engine, gltfMat, sampler, generateMipmaps, getCachedTex, wrapTex);\n const layers = await runMatExts(gltfMat, exts, extCtx);\n return assemblePbrPropsExt(gltfMat, tex, layers);\n })();\n pbrCache.set(gltfMat, p);\n }\n return p;\n };\n\n const originals: VariantMeshEntry[] = [];\n const variants: Record<string, VariantMeshEntry[]> = {};\n for (const name of variantNames) {\n variants[name] = [];\n }\n\n let meshIdx = 0;\n for (let nodeIdx = 0; nodeIdx < json.nodes.length; nodeIdx++) {\n const node = json.nodes[nodeIdx];\n if (node.mesh === undefined) {\n continue;\n }\n const gltfMesh = json.meshes[node.mesh];\n for (const primitive of gltfMesh.primitives) {\n const mesh = meshes[meshIdx]!;\n const variantExt = primitive.extensions?.KHR_materials_variants;\n if (variantExt?.mappings) {\n originals.push({ mesh, material: mesh.material });\n for (const mapping of variantExt.mappings as { material: number; variants: number[] }[]) {\n const gltfMat = await getMat(mapping.material);\n const pbrMat = await getPbr(gltfMat);\n for (const vi of mapping.variants) {\n const name = variantNames[vi];\n if (name) {\n variants[name]!.push({ mesh, material: pbrMat });\n }\n }\n }\n }\n meshIdx++;\n }\n }\n\n return { names: variantNames, variants, originals };\n}\n"],"names":[],"mappings":";;AAuBA,eAAsB,qBAClB,MACA,UACA,SACA,cACA,QACA,QACA,MACA,UAAyB,iBACG;;AAC5B,QAAM,mBAAsC,MAAM,OAAO,qBAAgC,EAAA,KAAA,OAAA,EAAA,EAAA,GAAG;AAE5F,QAAM,UAAU,mBAAmB,QAAQ;AAAA,IACvC,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,IACd,eAAe;AAAA,EAAA,CAClB;AAED,QAAM,+BAAe,IAAA;AACrB,QAAM,iCAAiB,IAAA;AACvB,QAAM,WAAW,iBAAiB,MAAM,UAAU,SAAS,UAAU;AACrE,QAAM,eAAe,CAAC,QAAqB,SAAkB,UAAU,QAAQ,QAAQ,MAAM,SAAS,eAAe;AACrH,QAAM,SAAwB;AAAA,IAC1B,SAAS;AAAA,IACT,MAAM,SAAS,SAAS,MAAM;AAC1B,UAAI,CAAC,SAAS;AACV,eAAO;AAAA,MACX;AACA,YAAM,MAAM,MAAM,SAAS,OAAO;AAClC,aAAO,MAAM,QAAQ,UAAU,QAAQ,KAAK,MAAM,SAAS,eAAe,GAAG,OAAO,IAAI;AAAA,IAC5F;AAAA,IACA,aAAa,QAAQ,MAAM;AACvB,aAAO,UAAU,QAAQ,QAAQ,MAAM,SAAS,eAAe;AAAA,IACnE;AAAA,EAAA;AAEJ,QAAM,SAAS,CAAC,WAA8C;AAC1D,QAAI,IAAI,SAAS,IAAI,MAAM;AAC3B,QAAI,CAAC,GAAG;AACJ,UAAI,iBAAiB,MAAM,UAAU,QAAQ,SAAS,UAAU;AAChE,eAAS,IAAI,QAAQ,CAAC;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,+BAAe,IAAA;AACrB,QAAM,SAAS,CAAC,YAAyD;AACrE,QAAI,IAAI,SAAS,IAAI,OAAO;AAC5B,QAAI,CAAC,GAAG;AACJ,WAAK,YAAY;AACb,cAAM,MAAM,2BAA2B,QAAQ,SAAS,SAAS,iBAAiB,cAAc,OAAO;AACvG,cAAM,SAAS,MAAM,WAAW,SAAS,MAAM,MAAM;AACrD,eAAO,oBAAoB,SAAS,KAAK,MAAM;AAAA,MACnD,GAAA;AACA,eAAS,IAAI,SAAS,CAAC;AAAA,IAC3B;AACA,WAAO;AAAA,EACX;AAEA,QAAM,YAAgC,CAAA;AACtC,QAAM,WAA+C,CAAA;AACrD,aAAW,QAAQ,cAAc;AAC7B,aAAS,IAAI,IAAI,CAAA;AAAA,EACrB;AAEA,MAAI,UAAU;AACd,WAAS,UAAU,GAAG,UAAU,KAAK,MAAM,QAAQ,WAAW;AAC1D,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,QAAI,KAAK,SAAS,QAAW;AACzB;AAAA,IACJ;AACA,UAAM,WAAW,KAAK,OAAO,KAAK,IAAI;AACtC,eAAW,aAAa,SAAS,YAAY;AACzC,YAAM,OAAO,OAAO,OAAO;AAC3B,YAAM,cAAa,eAAU,eAAV,mBAAsB;AACzC,UAAI,yCAAY,UAAU;AACtB,kBAAU,KAAK,EAAE,MAAM,UAAU,KAAK,UAAU;AAChD,mBAAW,WAAW,WAAW,UAAwD;AACrF,gBAAM,UAAU,MAAM,OAAO,QAAQ,QAAQ;AAC7C,gBAAM,SAAS,MAAM,OAAO,OAAO;AACnC,qBAAW,MAAM,QAAQ,UAAU;AAC/B,kBAAM,OAAO,aAAa,EAAE;AAC5B,gBAAI,MAAM;AACN,uBAAS,IAAI,EAAG,KAAK,EAAE,MAAM,UAAU,QAAQ;AAAA,YACnD;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,EAAE,OAAO,cAAc,UAAU,UAAA;AAC5C;"}
@@ -0,0 +1,50 @@
1
+ import { f as formatFloat } from "./_math-factory-C-QqW-Wi.js";
2
+ function readSteps(raw) {
3
+ if (!Array.isArray(raw)) {
4
+ return [
5
+ { step: 0, color: { r: 0, g: 0, b: 0 } },
6
+ { step: 1, color: { r: 1, g: 1, b: 1 } }
7
+ ];
8
+ }
9
+ return raw.map((entry) => {
10
+ if (!entry || typeof entry !== "object") {
11
+ return null;
12
+ }
13
+ const e = entry;
14
+ const c = e.color;
15
+ if (typeof e.step !== "number" || !c || typeof c.r !== "number" || typeof c.g !== "number" || typeof c.b !== "number") {
16
+ return null;
17
+ }
18
+ return { step: e.step, color: { r: c.r, g: c.g, b: c.b } };
19
+ }).filter((entry) => entry !== null);
20
+ }
21
+ function colorLiteral(step) {
22
+ return `vec3<f32>(${formatFloat(step.color.r)}, ${formatFloat(step.color.g)}, ${formatFloat(step.color.b)})`;
23
+ }
24
+ const emitter = {
25
+ className: "GradientBlock",
26
+ emit(block, _outputName, stage, state, ctx) {
27
+ const input = block.inputs.get("gradient");
28
+ const steps = readSteps(block.serialized.colorSteps);
29
+ if (!(input == null ? void 0 : input.source) || steps.length === 0) {
30
+ return { expr: "vec3<f32>(0.0, 0.0, 0.0)", type: "vec3f" };
31
+ }
32
+ const gradient = ctx.resolve(block, "gradient", stage, state);
33
+ const g = gradient.type === "f32" ? gradient.expr : `((${gradient.expr}).x)`;
34
+ const tempColor = ctx.temp(state, "gradientColor");
35
+ const tempPosition = ctx.temp(state, "gradientPosition");
36
+ state[stage].body.push(`var ${tempColor}: vec3<f32> = ${colorLiteral(steps[0])};`);
37
+ state[stage].body.push(`var ${tempPosition}: f32;`);
38
+ for (let i = 1; i < steps.length; i++) {
39
+ const previous = steps[i - 1];
40
+ const current = steps[i];
41
+ state[stage].body.push(`${tempPosition} = clamp((${g} - ${formatFloat(previous.step)}) / (${formatFloat(current.step)} - ${formatFloat(previous.step)}), 0.0, 1.0);`);
42
+ state[stage].body.push(`${tempColor} = mix(${tempColor}, ${colorLiteral(current)}, ${tempPosition});`);
43
+ }
44
+ return { expr: tempColor, type: "vec3f" };
45
+ }
46
+ };
47
+ export {
48
+ emitter
49
+ };
50
+ //# sourceMappingURL=gradient-block-DL_60sDc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradient-block-DL_60sDc.js","sources":["../src/material/node/blocks/gradient-block.ts"],"sourcesContent":["import type { BlockEmitter } from \"../node-types.js\";\nimport { formatFloat } from \"./_math-factory.js\";\n\ninterface ColorStep {\n readonly step: number;\n readonly color: { readonly r: number; readonly g: number; readonly b: number };\n}\n\nfunction readSteps(raw: unknown): ColorStep[] {\n if (!Array.isArray(raw)) {\n return [\n { step: 0, color: { r: 0, g: 0, b: 0 } },\n { step: 1, color: { r: 1, g: 1, b: 1 } },\n ];\n }\n return raw\n .map((entry): ColorStep | null => {\n if (!entry || typeof entry !== \"object\") {\n return null;\n }\n const e = entry as Record<string, unknown>;\n const c = e.color as Record<string, unknown> | undefined;\n if (typeof e.step !== \"number\" || !c || typeof c.r !== \"number\" || typeof c.g !== \"number\" || typeof c.b !== \"number\") {\n return null;\n }\n return { step: e.step, color: { r: c.r, g: c.g, b: c.b } };\n })\n .filter((entry): entry is ColorStep => entry !== null);\n}\n\nfunction colorLiteral(step: ColorStep): string {\n return `vec3<f32>(${formatFloat(step.color.r)}, ${formatFloat(step.color.g)}, ${formatFloat(step.color.b)})`;\n}\n\nexport const emitter: BlockEmitter = {\n className: \"GradientBlock\",\n emit(block, _outputName, stage, state, ctx) {\n const input = block.inputs.get(\"gradient\");\n const steps = readSteps(block.serialized.colorSteps);\n if (!input?.source || steps.length === 0) {\n return { expr: \"vec3<f32>(0.0, 0.0, 0.0)\", type: \"vec3f\" };\n }\n const gradient = ctx.resolve(block, \"gradient\", stage, state);\n const g = gradient.type === \"f32\" ? gradient.expr : `((${gradient.expr}).x)`;\n const tempColor = ctx.temp(state, \"gradientColor\");\n const tempPosition = ctx.temp(state, \"gradientPosition\");\n state[stage].body.push(`var ${tempColor}: vec3<f32> = ${colorLiteral(steps[0]!)};`);\n state[stage].body.push(`var ${tempPosition}: f32;`);\n for (let i = 1; i < steps.length; i++) {\n const previous = steps[i - 1]!;\n const current = steps[i]!;\n state[stage].body.push(`${tempPosition} = clamp((${g} - ${formatFloat(previous.step)}) / (${formatFloat(current.step)} - ${formatFloat(previous.step)}), 0.0, 1.0);`);\n state[stage].body.push(`${tempColor} = mix(${tempColor}, ${colorLiteral(current)}, ${tempPosition});`);\n }\n return { expr: tempColor, type: \"vec3f\" };\n },\n};\n"],"names":[],"mappings":";AAQA,SAAS,UAAU,KAA2B;AAC1C,MAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACrB,WAAO;AAAA,MACH,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAE;AAAA,MACrC,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAA,EAAE;AAAA,IAAE;AAAA,EAE/C;AACA,SAAO,IACF,IAAI,CAAC,UAA4B;AAC9B,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACrC,aAAO;AAAA,IACX;AACA,UAAM,IAAI;AACV,UAAM,IAAI,EAAE;AACZ,QAAI,OAAO,EAAE,SAAS,YAAY,CAAC,KAAK,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,UAAU;AACnH,aAAO;AAAA,IACX;AACA,WAAO,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,IAAE;AAAA,EAC3D,CAAC,EACA,OAAO,CAAC,UAA8B,UAAU,IAAI;AAC7D;AAEA,SAAS,aAAa,MAAyB;AAC3C,SAAO,aAAa,YAAY,KAAK,MAAM,CAAC,CAAC,KAAK,YAAY,KAAK,MAAM,CAAC,CAAC,KAAK,YAAY,KAAK,MAAM,CAAC,CAAC;AAC7G;AAEO,MAAM,UAAwB;AAAA,EACjC,WAAW;AAAA,EACX,KAAK,OAAO,aAAa,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,MAAM,OAAO,IAAI,UAAU;AACzC,UAAM,QAAQ,UAAU,MAAM,WAAW,UAAU;AACnD,QAAI,EAAC,+BAAO,WAAU,MAAM,WAAW,GAAG;AACtC,aAAO,EAAE,MAAM,4BAA4B,MAAM,QAAA;AAAA,IACrD;AACA,UAAM,WAAW,IAAI,QAAQ,OAAO,YAAY,OAAO,KAAK;AAC5D,UAAM,IAAI,SAAS,SAAS,QAAQ,SAAS,OAAO,KAAK,SAAS,IAAI;AACtE,UAAM,YAAY,IAAI,KAAK,OAAO,eAAe;AACjD,UAAM,eAAe,IAAI,KAAK,OAAO,kBAAkB;AACvD,UAAM,KAAK,EAAE,KAAK,KAAK,OAAO,SAAS,iBAAiB,aAAa,MAAM,CAAC,CAAE,CAAC,GAAG;AAClF,UAAM,KAAK,EAAE,KAAK,KAAK,OAAO,YAAY,QAAQ;AAClD,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,YAAM,WAAW,MAAM,IAAI,CAAC;AAC5B,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,KAAK,EAAE,KAAK,KAAK,GAAG,YAAY,aAAa,CAAC,MAAM,YAAY,SAAS,IAAI,CAAC,QAAQ,YAAY,QAAQ,IAAI,CAAC,MAAM,YAAY,SAAS,IAAI,CAAC,eAAe;AACpK,YAAM,KAAK,EAAE,KAAK,KAAK,GAAG,SAAS,UAAU,SAAS,KAAK,aAAa,OAAO,CAAC,KAAK,YAAY,IAAI;AAAA,IACzG;AACA,WAAO,EAAE,MAAM,WAAW,MAAM,QAAA;AAAA,EACpC;AACJ;"}