@splinetool/runtime 1.12.98 → 2.0.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 (365) hide show
  1. package/README.md +195 -22
  2. package/build/boolean.js +406 -2
  3. package/build/boolean.js.br +0 -0
  4. package/build/boolean.js.gz +0 -0
  5. package/build/boolean.wasm +0 -0
  6. package/build/boolean.wasm.br +0 -0
  7. package/build/boolean.wasm.gz +0 -0
  8. package/build/gaussian-splat-compression.js.br +0 -0
  9. package/build/gaussian-splat-compression.js.gz +0 -0
  10. package/build/hana-ui.js +4299 -0
  11. package/build/hana-ui.js.br +0 -0
  12. package/build/hana-ui.js.gz +0 -0
  13. package/build/hana-ui.wasm +0 -0
  14. package/build/hana-ui.wasm.br +0 -0
  15. package/build/hana-ui.wasm.gz +0 -0
  16. package/build/howler.js.br +0 -0
  17. package/build/howler.js.gz +0 -0
  18. package/build/navmesh.js.br +0 -0
  19. package/build/navmesh.js.gz +0 -0
  20. package/build/navmesh.wasm +0 -0
  21. package/build/navmesh.wasm.br +0 -0
  22. package/build/navmesh.wasm.gz +0 -0
  23. package/build/opentype.js.br +0 -0
  24. package/build/opentype.js.gz +0 -0
  25. package/build/physics.js +1 -1
  26. package/build/physics.js.br +0 -0
  27. package/build/physics.js.gz +0 -0
  28. package/build/physics.wasm +0 -0
  29. package/build/physics.wasm.br +0 -0
  30. package/build/physics.wasm.gz +0 -0
  31. package/build/process.js +2 -2
  32. package/build/process.js.br +0 -0
  33. package/build/process.js.gz +0 -0
  34. package/build/process.wasm +0 -0
  35. package/build/process.wasm.br +0 -0
  36. package/build/process.wasm.gz +0 -0
  37. package/build/runtime-DRACOLoader-TQHJ6SJB.js +1 -0
  38. package/build/runtime-DRACOLoader-TQHJ6SJB.js.br +0 -0
  39. package/build/runtime-DRACOLoader-TQHJ6SJB.js.gz +0 -0
  40. package/build/runtime-Perfs-KMJFDYHU.js +1 -0
  41. package/build/runtime-Perfs-KMJFDYHU.js.br +0 -0
  42. package/build/runtime-Perfs-KMJFDYHU.js.gz +0 -0
  43. package/build/runtime-aiAssistant-XJVJ7TQB.js +1 -0
  44. package/build/runtime-aiAssistant-XJVJ7TQB.js.br +0 -0
  45. package/build/runtime-aiAssistant-XJVJ7TQB.js.gz +0 -0
  46. package/build/runtime-apiServices-KAO5SQJZ.js +1 -0
  47. package/build/runtime-apiServices-KAO5SQJZ.js.br +0 -0
  48. package/build/runtime-apiServices-KAO5SQJZ.js.gz +0 -0
  49. package/build/runtime-audio-Y3GYW4YQ.js +1 -0
  50. package/build/runtime-audio-Y3GYW4YQ.js.br +0 -0
  51. package/build/runtime-audio-Y3GYW4YQ.js.gz +0 -0
  52. package/build/runtime-bloom-XRHHZNNT.js +1 -0
  53. package/build/runtime-bloom-XRHHZNNT.js.br +0 -0
  54. package/build/runtime-bloom-XRHHZNNT.js.gz +0 -0
  55. package/build/runtime-brightnessContrast-RHV6X2Z4.js +1 -0
  56. package/build/runtime-brightnessContrast-RHV6X2Z4.js.br +0 -0
  57. package/build/runtime-brightnessContrast-RHV6X2Z4.js.gz +0 -0
  58. package/build/runtime-chromaticAberration-LSGAMQAK.js +1 -0
  59. package/build/runtime-chromaticAberration-LSGAMQAK.js.br +0 -0
  60. package/build/runtime-chromaticAberration-LSGAMQAK.js.gz +0 -0
  61. package/build/runtime-chunk-23QOKH2J.js +1 -0
  62. package/build/runtime-chunk-23QOKH2J.js.br +0 -0
  63. package/build/runtime-chunk-23QOKH2J.js.gz +0 -0
  64. package/build/runtime-chunk-2VFLTNIU.js +1 -0
  65. package/build/runtime-chunk-2VFLTNIU.js.br +0 -0
  66. package/build/runtime-chunk-2VFLTNIU.js.gz +0 -0
  67. package/build/runtime-chunk-44SAPZDZ.js +1 -0
  68. package/build/runtime-chunk-44SAPZDZ.js.br +0 -0
  69. package/build/runtime-chunk-44SAPZDZ.js.gz +0 -0
  70. package/build/runtime-chunk-4KZXQGUQ.js +1 -0
  71. package/build/runtime-chunk-4KZXQGUQ.js.br +0 -0
  72. package/build/runtime-chunk-4KZXQGUQ.js.gz +0 -0
  73. package/build/runtime-chunk-4YV3EXSU.js +1 -0
  74. package/build/runtime-chunk-4YV3EXSU.js.br +0 -0
  75. package/build/runtime-chunk-4YV3EXSU.js.gz +0 -0
  76. package/build/runtime-chunk-5CH7XRKY.js +1 -0
  77. package/build/runtime-chunk-5CH7XRKY.js.br +0 -0
  78. package/build/runtime-chunk-5CH7XRKY.js.gz +0 -0
  79. package/build/runtime-chunk-5VJGAC3M.js +1 -0
  80. package/build/runtime-chunk-5VJGAC3M.js.br +0 -0
  81. package/build/runtime-chunk-5VJGAC3M.js.gz +0 -0
  82. package/build/runtime-chunk-7NBWIU4W.js +1 -0
  83. package/build/runtime-chunk-7NBWIU4W.js.br +0 -0
  84. package/build/runtime-chunk-7NBWIU4W.js.gz +0 -0
  85. package/build/runtime-chunk-ARTGMJ7O.js +1 -0
  86. package/build/runtime-chunk-ARTGMJ7O.js.br +0 -0
  87. package/build/runtime-chunk-ARTGMJ7O.js.gz +0 -0
  88. package/build/runtime-chunk-BXPWRF47.js +1 -0
  89. package/build/runtime-chunk-BXPWRF47.js.br +0 -0
  90. package/build/runtime-chunk-BXPWRF47.js.gz +0 -0
  91. package/build/runtime-chunk-CRYQVRO6.js +1 -0
  92. package/build/runtime-chunk-CRYQVRO6.js.br +0 -0
  93. package/build/runtime-chunk-CRYQVRO6.js.gz +0 -0
  94. package/build/runtime-chunk-CVUJ3GMH.js +1 -0
  95. package/build/runtime-chunk-CVUJ3GMH.js.br +0 -0
  96. package/build/runtime-chunk-CVUJ3GMH.js.gz +0 -0
  97. package/build/runtime-chunk-DJJZN367.js +1 -0
  98. package/build/runtime-chunk-DJJZN367.js.br +0 -0
  99. package/build/runtime-chunk-DJJZN367.js.gz +0 -0
  100. package/build/runtime-chunk-DZNU62CT.js +1 -0
  101. package/build/runtime-chunk-DZNU62CT.js.br +0 -0
  102. package/build/runtime-chunk-DZNU62CT.js.gz +0 -0
  103. package/build/runtime-chunk-EAXCCTR5.js +1 -0
  104. package/build/runtime-chunk-EAXCCTR5.js.br +0 -0
  105. package/build/runtime-chunk-EAXCCTR5.js.gz +0 -0
  106. package/build/runtime-chunk-EOV2DL2V.js +1 -0
  107. package/build/runtime-chunk-EOV2DL2V.js.br +0 -0
  108. package/build/runtime-chunk-EOV2DL2V.js.gz +0 -0
  109. package/build/runtime-chunk-FDRTCOJ5.js +1 -0
  110. package/build/runtime-chunk-FDRTCOJ5.js.br +0 -0
  111. package/build/runtime-chunk-FDRTCOJ5.js.gz +0 -0
  112. package/build/runtime-chunk-FQNSP44B.js +1 -0
  113. package/build/runtime-chunk-FQNSP44B.js.br +0 -0
  114. package/build/runtime-chunk-FQNSP44B.js.gz +0 -0
  115. package/build/runtime-chunk-FTVQTRM7.js +1 -0
  116. package/build/runtime-chunk-FTVQTRM7.js.br +0 -0
  117. package/build/runtime-chunk-FTVQTRM7.js.gz +0 -0
  118. package/build/runtime-chunk-GFTBNL2W.js +1 -0
  119. package/build/runtime-chunk-GFTBNL2W.js.br +0 -0
  120. package/build/runtime-chunk-GFTBNL2W.js.gz +0 -0
  121. package/build/runtime-chunk-H6BPTR74.js +1 -0
  122. package/build/runtime-chunk-H6BPTR74.js.br +0 -0
  123. package/build/runtime-chunk-H6BPTR74.js.gz +0 -0
  124. package/build/runtime-chunk-H6T5LPRN.js +1 -0
  125. package/build/runtime-chunk-H6T5LPRN.js.br +0 -0
  126. package/build/runtime-chunk-H6T5LPRN.js.gz +0 -0
  127. package/build/runtime-chunk-HER7UVU3.js +1 -0
  128. package/build/runtime-chunk-HER7UVU3.js.br +0 -0
  129. package/build/runtime-chunk-HER7UVU3.js.gz +0 -0
  130. package/build/runtime-chunk-J2I4VBHR.js +1 -0
  131. package/build/runtime-chunk-J2I4VBHR.js.br +0 -0
  132. package/build/runtime-chunk-J2I4VBHR.js.gz +0 -0
  133. package/build/runtime-chunk-JFAQQYSH.js +1 -0
  134. package/build/runtime-chunk-JFAQQYSH.js.br +0 -0
  135. package/build/runtime-chunk-JFAQQYSH.js.gz +0 -0
  136. package/build/runtime-chunk-KGZNRID6.js +1 -0
  137. package/build/runtime-chunk-KGZNRID6.js.br +1 -0
  138. package/build/runtime-chunk-KGZNRID6.js.gz +0 -0
  139. package/build/runtime-chunk-LATYCOUS.js +1 -0
  140. package/build/runtime-chunk-LATYCOUS.js.br +0 -0
  141. package/build/runtime-chunk-LATYCOUS.js.gz +0 -0
  142. package/build/runtime-chunk-MBBODDV7.js +1 -0
  143. package/build/runtime-chunk-MBBODDV7.js.br +0 -0
  144. package/build/runtime-chunk-MBBODDV7.js.gz +0 -0
  145. package/build/runtime-chunk-ML3Z74BL.js +1 -0
  146. package/build/runtime-chunk-ML3Z74BL.js.br +0 -0
  147. package/build/runtime-chunk-ML3Z74BL.js.gz +0 -0
  148. package/build/runtime-chunk-MM75L5X4.js +1 -0
  149. package/build/runtime-chunk-MM75L5X4.js.br +0 -0
  150. package/build/runtime-chunk-MM75L5X4.js.gz +0 -0
  151. package/build/runtime-chunk-N2ZRGNPR.js +1 -0
  152. package/build/runtime-chunk-N2ZRGNPR.js.br +0 -0
  153. package/build/runtime-chunk-N2ZRGNPR.js.gz +0 -0
  154. package/build/runtime-chunk-NBYTQLIB.js +1 -0
  155. package/build/runtime-chunk-NBYTQLIB.js.br +0 -0
  156. package/build/runtime-chunk-NBYTQLIB.js.gz +0 -0
  157. package/build/runtime-chunk-NSD7DU3P.js +1 -0
  158. package/build/runtime-chunk-NSD7DU3P.js.br +0 -0
  159. package/build/runtime-chunk-NSD7DU3P.js.gz +0 -0
  160. package/build/runtime-chunk-NTUTXO7Q.js +1 -0
  161. package/build/runtime-chunk-NTUTXO7Q.js.br +0 -0
  162. package/build/runtime-chunk-NTUTXO7Q.js.gz +0 -0
  163. package/build/runtime-chunk-O5NBGIBR.js +1 -0
  164. package/build/runtime-chunk-O5NBGIBR.js.br +0 -0
  165. package/build/runtime-chunk-O5NBGIBR.js.gz +0 -0
  166. package/build/runtime-chunk-OFPUAZKY.js +1 -0
  167. package/build/runtime-chunk-OFPUAZKY.js.br +0 -0
  168. package/build/runtime-chunk-OFPUAZKY.js.gz +0 -0
  169. package/build/runtime-chunk-OW6T4XFV.js +1 -0
  170. package/build/runtime-chunk-OW6T4XFV.js.br +0 -0
  171. package/build/runtime-chunk-OW6T4XFV.js.gz +0 -0
  172. package/build/runtime-chunk-QZ35BPGB.js +1 -0
  173. package/build/runtime-chunk-QZ35BPGB.js.br +0 -0
  174. package/build/runtime-chunk-QZ35BPGB.js.gz +0 -0
  175. package/build/runtime-chunk-R43XZP65.js +1 -0
  176. package/build/runtime-chunk-R43XZP65.js.br +0 -0
  177. package/build/runtime-chunk-R43XZP65.js.gz +0 -0
  178. package/build/runtime-chunk-T53JMQSH.js +1 -0
  179. package/build/runtime-chunk-T53JMQSH.js.br +0 -0
  180. package/build/runtime-chunk-T53JMQSH.js.gz +0 -0
  181. package/build/runtime-chunk-T6CHRQ6N.js +1 -0
  182. package/build/runtime-chunk-T6CHRQ6N.js.br +0 -0
  183. package/build/runtime-chunk-T6CHRQ6N.js.gz +0 -0
  184. package/build/runtime-chunk-TU4KDRKR.js +1 -0
  185. package/build/runtime-chunk-TU4KDRKR.js.br +0 -0
  186. package/build/runtime-chunk-TU4KDRKR.js.gz +0 -0
  187. package/build/runtime-chunk-TZCHGFVF.js +1 -0
  188. package/build/runtime-chunk-TZCHGFVF.js.br +3 -0
  189. package/build/runtime-chunk-TZCHGFVF.js.gz +0 -0
  190. package/build/runtime-chunk-UK4GQHMO.js +1 -0
  191. package/build/runtime-chunk-UK4GQHMO.js.br +0 -0
  192. package/build/runtime-chunk-UK4GQHMO.js.gz +0 -0
  193. package/build/runtime-chunk-USXMESRF.js +1 -0
  194. package/build/runtime-chunk-USXMESRF.js.br +0 -0
  195. package/build/runtime-chunk-USXMESRF.js.gz +0 -0
  196. package/build/runtime-chunk-VAVYZ35B.js +1 -0
  197. package/build/runtime-chunk-VAVYZ35B.js.br +0 -0
  198. package/build/runtime-chunk-VAVYZ35B.js.gz +0 -0
  199. package/build/runtime-chunk-VGN7YHB7.js +1 -0
  200. package/build/runtime-chunk-VGN7YHB7.js.br +0 -0
  201. package/build/runtime-chunk-VGN7YHB7.js.gz +0 -0
  202. package/build/runtime-chunk-W7QPV37Y.js +1 -0
  203. package/build/runtime-chunk-W7QPV37Y.js.br +1 -0
  204. package/build/runtime-chunk-W7QPV37Y.js.gz +0 -0
  205. package/build/runtime-chunk-WQXDDUFV.js +1 -0
  206. package/build/runtime-chunk-WQXDDUFV.js.br +0 -0
  207. package/build/runtime-chunk-WQXDDUFV.js.gz +0 -0
  208. package/build/runtime-chunk-XLOQIQSS.js +1 -0
  209. package/build/runtime-chunk-XLOQIQSS.js.br +0 -0
  210. package/build/runtime-chunk-XLOQIQSS.js.gz +0 -0
  211. package/build/runtime-chunk-Y3BMDVJ7.js +1 -0
  212. package/build/runtime-chunk-Y3BMDVJ7.js.br +0 -0
  213. package/build/runtime-chunk-Y3BMDVJ7.js.gz +0 -0
  214. package/build/runtime-chunk-YUK55LCN.js +1 -0
  215. package/build/runtime-chunk-YUK55LCN.js.br +0 -0
  216. package/build/runtime-chunk-YUK55LCN.js.gz +0 -0
  217. package/build/runtime-chunk-YVNDW5TV.js +1 -0
  218. package/build/runtime-chunk-YVNDW5TV.js.br +0 -0
  219. package/build/runtime-chunk-YVNDW5TV.js.gz +0 -0
  220. package/build/runtime-chunk-YXATXASV.js +1 -0
  221. package/build/runtime-chunk-YXATXASV.js.br +1 -0
  222. package/build/runtime-chunk-YXATXASV.js.gz +0 -0
  223. package/build/runtime-chunk-Z5OH244S.js +1 -0
  224. package/build/runtime-chunk-Z5OH244S.js.br +0 -0
  225. package/build/runtime-chunk-Z5OH244S.js.gz +0 -0
  226. package/build/runtime-classicRuntime-F5CEZRNL.js +1 -0
  227. package/build/runtime-classicRuntime-F5CEZRNL.js.br +0 -0
  228. package/build/runtime-classicRuntime-F5CEZRNL.js.gz +0 -0
  229. package/build/runtime-cloners-BLAFVALM.js +1 -0
  230. package/build/runtime-cloners-BLAFVALM.js.br +0 -0
  231. package/build/runtime-cloners-BLAFVALM.js.gz +0 -0
  232. package/build/runtime-collisionBVH-KXZNWTEK.js +1 -0
  233. package/build/runtime-collisionBVH-KXZNWTEK.js.br +0 -0
  234. package/build/runtime-collisionBVH-KXZNWTEK.js.gz +0 -0
  235. package/build/runtime-components-DYNXEVOC.js +1 -0
  236. package/build/runtime-components-DYNXEVOC.js.br +0 -0
  237. package/build/runtime-components-DYNXEVOC.js.gz +0 -0
  238. package/build/runtime-conditional-3A423CXW.js +1 -0
  239. package/build/runtime-conditional-3A423CXW.js.br +0 -0
  240. package/build/runtime-conditional-3A423CXW.js.gz +0 -0
  241. package/build/runtime-createDestroy-FUUG7UAK.js +1 -0
  242. package/build/runtime-createDestroy-FUUG7UAK.js.br +0 -0
  243. package/build/runtime-createDestroy-FUUG7UAK.js.gz +0 -0
  244. package/build/runtime-depthOfField-BBWDHJYP.js +1 -0
  245. package/build/runtime-depthOfField-BBWDHJYP.js.br +0 -0
  246. package/build/runtime-depthOfField-BBWDHJYP.js.gz +0 -0
  247. package/build/runtime-dragDrop-GPFMU3ZB.js +1 -0
  248. package/build/runtime-dragDrop-GPFMU3ZB.js.br +0 -0
  249. package/build/runtime-dragDrop-GPFMU3ZB.js.gz +0 -0
  250. package/build/runtime-fxBloom-IGFV4KJD.js +1 -0
  251. package/build/runtime-fxBloom-IGFV4KJD.js.br +0 -0
  252. package/build/runtime-fxBloom-IGFV4KJD.js.gz +0 -0
  253. package/build/runtime-fxDepthOfField-WX7WD3K4.js +1 -0
  254. package/build/runtime-fxDepthOfField-WX7WD3K4.js.br +0 -0
  255. package/build/runtime-fxDepthOfField-WX7WD3K4.js.gz +0 -0
  256. package/build/runtime-gameControls-TGEINRCX.js +1 -0
  257. package/build/runtime-gameControls-TGEINRCX.js.br +0 -0
  258. package/build/runtime-gameControls-TGEINRCX.js.gz +0 -0
  259. package/build/runtime-hair-YOTI2EFL.js +1 -0
  260. package/build/runtime-hair-YOTI2EFL.js.br +0 -0
  261. package/build/runtime-hair-YOTI2EFL.js.gz +0 -0
  262. package/build/runtime-hueSaturation-X3HAZK2G.js +1 -0
  263. package/build/runtime-hueSaturation-X3HAZK2G.js.br +0 -0
  264. package/build/runtime-hueSaturation-X3HAZK2G.js.gz +0 -0
  265. package/build/runtime-mergeStaticGeometries-JI7YWYGH.js +1 -0
  266. package/build/runtime-mergeStaticGeometries-JI7YWYGH.js.br +3 -0
  267. package/build/runtime-mergeStaticGeometries-JI7YWYGH.js.gz +0 -0
  268. package/build/runtime-miscActions-INSZA2CP.js +1 -0
  269. package/build/runtime-miscActions-INSZA2CP.js.br +0 -0
  270. package/build/runtime-miscActions-INSZA2CP.js.gz +0 -0
  271. package/build/runtime-mouseHover-GZW7KW6H.js +1 -0
  272. package/build/runtime-mouseHover-GZW7KW6H.js.br +0 -0
  273. package/build/runtime-mouseHover-GZW7KW6H.js.gz +0 -0
  274. package/build/runtime-navmesh-UJTUAHXM.js +1 -0
  275. package/build/runtime-navmesh-UJTUAHXM.js.br +0 -0
  276. package/build/runtime-navmesh-UJTUAHXM.js.gz +0 -0
  277. package/build/runtime-noise-UF5CMIO3.js +1 -0
  278. package/build/runtime-noise-UF5CMIO3.js.br +0 -0
  279. package/build/runtime-noise-UF5CMIO3.js.gz +0 -0
  280. package/build/runtime-particles-T2CREK6M.js +1 -0
  281. package/build/runtime-particles-T2CREK6M.js.br +0 -0
  282. package/build/runtime-particles-T2CREK6M.js.gz +0 -0
  283. package/build/runtime-paths-PRHQFJ3X.js +1 -0
  284. package/build/runtime-paths-PRHQFJ3X.js.br +0 -0
  285. package/build/runtime-paths-PRHQFJ3X.js.gz +0 -0
  286. package/build/runtime-pixelation-QFSF4L6X.js +1 -0
  287. package/build/runtime-pixelation-QFSF4L6X.js.br +0 -0
  288. package/build/runtime-pixelation-QFSF4L6X.js.gz +0 -0
  289. package/build/runtime-resize-SM6PZWJY.js +1 -0
  290. package/build/runtime-resize-SM6PZWJY.js.br +0 -0
  291. package/build/runtime-resize-SM6PZWJY.js.gz +0 -0
  292. package/build/runtime-sceneTransition-JUZVB2S3.js +1 -0
  293. package/build/runtime-sceneTransition-JUZVB2S3.js.br +0 -0
  294. package/build/runtime-sceneTransition-JUZVB2S3.js.gz +0 -0
  295. package/build/runtime-scroll-Q6NRRL4F.js +1 -0
  296. package/build/runtime-scroll-Q6NRRL4F.js.br +0 -0
  297. package/build/runtime-scroll-Q6NRRL4F.js.gz +0 -0
  298. package/build/runtime-shapeBlends-CPHLT3XC.js +1 -0
  299. package/build/runtime-shapeBlends-CPHLT3XC.js.br +0 -0
  300. package/build/runtime-shapeBlends-CPHLT3XC.js.gz +0 -0
  301. package/build/runtime-text-TBHPCNPL.js +1 -0
  302. package/build/runtime-text-TBHPCNPL.js.br +0 -0
  303. package/build/runtime-text-TBHPCNPL.js.gz +0 -0
  304. package/build/runtime-textInputs-4HQER44D.js +1 -0
  305. package/build/runtime-textInputs-4HQER44D.js.br +0 -0
  306. package/build/runtime-textInputs-4HQER44D.js.gz +0 -0
  307. package/build/runtime-timeline-UKR4DEQS.js +1 -0
  308. package/build/runtime-timeline-UKR4DEQS.js.br +0 -0
  309. package/build/runtime-timeline-UKR4DEQS.js.gz +0 -0
  310. package/build/runtime-tracking-5HISHPEY.js +1 -0
  311. package/build/runtime-tracking-5HISHPEY.js.br +0 -0
  312. package/build/runtime-tracking-5HISHPEY.js.gz +0 -0
  313. package/build/runtime-transitions-FBNOSFXY.js +1 -0
  314. package/build/runtime-transitions-FBNOSFXY.js.br +0 -0
  315. package/build/runtime-transitions-FBNOSFXY.js.gz +0 -0
  316. package/build/runtime-ui2d-3AMS3CSG.js +1 -0
  317. package/build/runtime-ui2d-3AMS3CSG.js.br +0 -0
  318. package/build/runtime-ui2d-3AMS3CSG.js.gz +0 -0
  319. package/build/runtime-updater-3ELP7WMM.js +1 -0
  320. package/build/runtime-updater-3ELP7WMM.js.br +1 -0
  321. package/build/runtime-updater-3ELP7WMM.js.gz +0 -0
  322. package/build/runtime-variables-U36KPJ5V.js +1 -0
  323. package/build/runtime-variables-U36KPJ5V.js.br +0 -0
  324. package/build/runtime-variables-U36KPJ5V.js.gz +0 -0
  325. package/build/runtime-vectorShapes-GIS26ELU.js +1 -0
  326. package/build/runtime-vectorShapes-GIS26ELU.js.br +0 -0
  327. package/build/runtime-vectorShapes-GIS26ELU.js.gz +0 -0
  328. package/build/runtime-video-TZNR7MEM.js +1 -0
  329. package/build/runtime-video-TZNR7MEM.js.br +0 -0
  330. package/build/runtime-video-TZNR7MEM.js.gz +0 -0
  331. package/build/runtime-vignette-3KJD4P5D.js +1 -0
  332. package/build/runtime-vignette-3KJD4P5D.js.br +0 -0
  333. package/build/runtime-vignette-3KJD4P5D.js.gz +0 -0
  334. package/build/runtime-webgpu-LYDFJW3X.js +1 -0
  335. package/build/runtime-webgpu-LYDFJW3X.js.br +0 -0
  336. package/build/runtime-webgpu-LYDFJW3X.js.gz +0 -0
  337. package/build/runtime.cjs +6283 -4577
  338. package/build/runtime.js +1 -8186
  339. package/build/runtime.js.br +0 -0
  340. package/build/runtime.js.gz +0 -0
  341. package/build/runtime.standalone.js +1 -0
  342. package/build/runtime.standalone.js.br +0 -0
  343. package/build/runtime.standalone.js.gz +0 -0
  344. package/build/runtime.standalone.webgl.js +1 -0
  345. package/build/runtime.standalone.webgl.js.br +0 -0
  346. package/build/runtime.standalone.webgl.js.gz +0 -0
  347. package/build/runtime.standalone.webgpu.js +1 -0
  348. package/build/runtime.standalone.webgpu.js.br +0 -0
  349. package/build/runtime.standalone.webgpu.js.gz +0 -0
  350. package/build/runtime.standalone.webgpu.micro.js +1 -0
  351. package/build/runtime.standalone.webgpu.micro.js.br +0 -0
  352. package/build/runtime.standalone.webgpu.micro.js.gz +0 -0
  353. package/build/runtime.standalone.webgpu.min.js +1 -0
  354. package/build/runtime.standalone.webgpu.min.js.br +0 -0
  355. package/build/runtime.standalone.webgpu.min.js.gz +0 -0
  356. package/build/sky-alto.png +0 -0
  357. package/build/sky-cirrus.png +0 -0
  358. package/build/smaa-area.png +0 -0
  359. package/build/smaa-node-area.png +0 -0
  360. package/build/smaa-node-search.png +0 -0
  361. package/build/smaa-search.png +0 -0
  362. package/build/snippets/hana-82e9eb82a79dead4/js-imports.js +93 -0
  363. package/package.json +104 -89
  364. package/runtime.d.ts +301 -2
  365. package/build/ui.js +0 -3
@@ -0,0 +1 @@
1
+ import{a as e,b as t,c as a,d as r}from"./runtime-chunk-H6BPTR74.js";import{a as s,b as i,c as n,d as l,e as o,f as u,g as d,h,i as m,j as c,l as p}from"./runtime-chunk-XLOQIQSS.js";import{b as g}from"./runtime-chunk-CVUJ3GMH.js";import"./runtime-chunk-WQXDDUFV.js";import"./runtime-chunk-44SAPZDZ.js";import{a as f,b as _,c as y,d as x,e as v,f as b,g as T,h as w}from"./runtime-chunk-USXMESRF.js";import{$ as S,$a as V,$b as M,A as R,Aa as C,Ab as z,Ac as k,B as A,Ba as P,Bb as E,Bc as N,C as B,Ca as L,D as I,Da as D,Db as F,Dc as U,E as O,Ea as G,Eb as q,Ec as W,F as H,Fa as j,Fb as K,Fc as $,G as X,Ga as Q,Gb as Z,Gc as Y,H as J,Ha as ee,Hb as te,Hc as ae,I as re,Ia as se,Ib as ie,Ic as ne,J as le,Ja as oe,Jb as ue,Jc as de,K as he,Ka as me,Kb as ce,Kc as pe,L as ge,La as fe,Lb as _e,Lc as ye,M as xe,Ma as ve,Mb as be,Mc as Te,N as we,Na as Se,Nb as Ve,Nc as Me,O as Re,Oa as Ce,Ob as ze,Oc as ke,P as Ae,Pa as Pe,Pb as Ee,Pc as Ne,Q as Be,Qa as Le,Qb as Ie,Qc as De,R as Fe,Ra as Ue,Rc as Oe,S as Ge,Sa as qe,Sc as We,T as He,Ta as je,Tb as Ke,U as $e,Ua as Xe,Ub as Qe,V as Ze,Va as Ye,Vb as Je,W as et,Wa as tt,Wb as at,X as rt,Xa as st,Xb as it,Y as nt,Ya as lt,Yb as ot,Z as ut,Za as dt,Zb as ht,_ as mt,_a as ct,_b as pt,aa as gt,ab as ft,ac as _t,b as yt,ba as xt,bb as vt,bc as bt,c as Tt,ca as wt,cb as St,cc as Vt,d as Mt,da as Rt,db as Ct,dc as zt,e as kt,ea as At,eb as Pt,ec as Et,f as Nt,fa as Bt,fb as Lt,fc as It,g as Dt,ga as Ft,gb as Ut,gc as Ot,h as Gt,ha as qt,hb as Wt,hc as Ht,i as jt,ia as Kt,ib as $t,ic as Xt,j as Qt,ja as Zt,jb as Yt,jc as Jt,k as ea,ka as ta,kb as aa,kc as ra,l as sa,la as ia,lb as na,lc as la,m as oa,ma as ua,mb as da,mc as ha,n as ma,na as ca,nb as pa,nc as ga,o as fa,oa as _a,ob as ya,oc as xa,p as va,pa as ba,pb as Ta,pc as wa,q as Sa,qa as Va,qb as Ma,qc as Ra,r as Ca,ra as za,rb as ka,rc as Aa,s as Pa,sa as Ea,sc as Na,t as Ba,ta as La,tb as Ia,tc as Da,u as Fa,ua as Ua,ub as Oa,uc as Ga,v as qa,va as Wa,vb as Ha,vc as ja,w as Ka,wa as $a,wb as Xa,wc as Qa,x as Za,xa as Ya,xb as Ja,xc as er,y as tr,ya as ar,yb as rr,yc as sr,z as ir,za as nr,zb as lr,zc as or}from"./runtime-chunk-MBBODDV7.js";import{a as ur}from"./runtime-chunk-GFTBNL2W.js";import{a as dr,b as hr,c as mr,d as cr,e as pr,f as gr,g as fr,h as _r,i as yr,j as xr}from"./runtime-chunk-2VFLTNIU.js";import{a as vr,b as br,e as Tr,f as wr}from"./runtime-chunk-JFAQQYSH.js";import{a as Sr}from"./runtime-chunk-5VJGAC3M.js";import"./runtime-chunk-5CH7XRKY.js";import{a as Vr,b as Mr,c as Rr}from"./runtime-chunk-BXPWRF47.js";import{a as Cr,b as zr}from"./runtime-chunk-O5NBGIBR.js";import"./runtime-chunk-23QOKH2J.js";import"./runtime-chunk-TU4KDRKR.js";import"./runtime-chunk-H6T5LPRN.js";import{a as kr}from"./runtime-chunk-HER7UVU3.js";import"./runtime-chunk-W7QPV37Y.js";import"./runtime-chunk-J2I4VBHR.js";import"./runtime-chunk-ARTGMJ7O.js";import"./runtime-chunk-LATYCOUS.js";import"./runtime-chunk-FDRTCOJ5.js";import{L as Ar,O as Pr,Q as Er,U as Nr,V as Br,W as Lr,Y as Ir,Z as Dr,_ as Fr,h as Ur,k as Or,l as Gr,m as qr}from"./runtime-chunk-YUK55LCN.js";import"./runtime-chunk-4YV3EXSU.js";import"./runtime-chunk-NSD7DU3P.js";import"./runtime-chunk-DJJZN367.js";import"./runtime-chunk-QZ35BPGB.js";import"./runtime-chunk-4KZXQGUQ.js";import"./runtime-chunk-Z5OH244S.js";import"./runtime-chunk-TZCHGFVF.js";import{W as Wr,ea as Hr,fa as jr,qa as Kr,ra as $r,sa as Xr,ta as Qr,x as Zr}from"./runtime-chunk-OW6T4XFV.js";import{e as Yr,f as Jr}from"./runtime-chunk-EOV2DL2V.js";import{b as es}from"./runtime-chunk-Y3BMDVJ7.js";import{Aa as ts,Ba as as,Bc as rs,Bd as ss,Be as is,Cc as ns,Cd as ls,D as os,Dc as us,Ec as ds,Fc as hs,Gc as ms,Hc as cs,Ib as ps,Ic as gs,Ja as fs,Jb as _s,Jc as ys,Kc as xs,Ma as vs,Me as bs,Oa as Ts,Oc as ws,Pc as Ss,Tc as Vs,Y as Ms,Yc as Rs,Zc as Cs,aa as zs,ca as ks,da as As,dd as Ps,g as Es,id as Ns,j as Bs,k as Ls,ka as Is,l as Ds,la as Fs,ld as Us,m as Os,ma as Gs,mc as qs,n as Ws,na as Hs,nd as js,o as Ks,p as $s,pd as Xs,q as Qs,qa as Zs,r as Ys,rd as Js,sa as ei,t as ti,ua as ai,ve as ri,yd as si,ye as ii,z as ni,ze as li}from"./runtime-chunk-VGN7YHB7.js";import"./runtime-chunk-ML3Z74BL.js";var oi=[[.478712,.875764],[-.337956,-.793959],[-.955259,-.028164],[.864527,.325689],[.209342,-.395657],[-.106779,.672585],[.156213,.235113],[-.413644,-.082856],[-.415667,.323909],[.141896,-.93998],[.954932,-.182516],[-.766184,.410799],[-.434912,-.458845],[.415242,-.078724],[.728335,-.491777],[-.058086,-.066401],[.20299,.686837],[-.808362,-.556402],[.507386,-.640839],[-.723494,-.22924],[.48974,.317826],[-.622663,.765301],[-.01064,.929347],[.663146,.647618],[-.096674,-.413835],[.525945,-.321063],[-.122533,.366019],[.195235,-.687983],[-.563203,.098748],[.418563,.561335],[-.378595,.800367],[.826922,.001024],[-.085372,-.766651],[-.92192,.183673],[-.590008,-.721799],[.167751,-.164393],[.032961,-.56253],[.6329,-.107059],[-.46408,.569669],[-.173676,-.958758],[-.242648,-.234303],[-.275362,.157163],[.382295,-.795131],[.562955,.115562],[.190586,.470121],[.770764,-.297576],[.237281,.93105],[-.666642,-.455871],[-.905649,-.298379],[.33952,.157829],[.701438,-.7041],[-.062758,.160346],[-.220674,.957141],[.642692,.432706],[-.77339,-.015272],[-.671467,.24688],[.158051,.062859],[.806009,.527232],[-.05762,-.247071],[.333436,-.51671],[-.550658,-.315773],[-.652078,.589846],[.008818,.530556],[-.210004,.519896]],ui=k(new Vs(1,1,1)).setGroup(it),di=k(.1).setGroup(it),hi=k(2e3).setGroup(it),mi=k(0).setGroup(it),ci=k(new hs(.005,.01,0)).setGroup(it),pi=re(([e,t,a,r])=>{let s=r.x,i=r.y,n=a.y.sub(r.z),l=s.mul(i.mul(n).negate().clamp(-60,60).exp()),o=i.mul(e.y).clamp(-60,60).toVar(),u=zt(o.greaterThanEqual(0),nr(1),nr(-1)).mul(o.abs().max(1e-4));return l.mul(t).mul(nr(1).sub(u.negate().exp())).div(u).max(0).negate().exp().oneMinus()}),gi=re(()=>{let e=Ve.sub(xt).toVar(),t=e.length().max(1e-6);return pi(e,t,xt,ci)}),fi=(()=>{let e=nr(1).sub(ga(.5,mi)).add(ga(1.5,mi)),t=ga(.5,mi),a=nr(1).sub(nr(1).sub(Qe(di,hi).mul(e)).mul(nr(1).sub(gi().mul(t))));return P(ui,a)})();function _i(e){let{fog:t,backupFog:a}=e,r=[e,e.scene!==e?e.scene:void 0];if(null!=t&&void 0!==a){for(let e of r)e&&(e.fogNode=fi);ui.value.copy(a.color),di.value=a.near,hi.value=a.far,mi.value=Kr.getModeIndex({mode:e.fogMode}),ci.value.set(e.fogDensity??Kr.getDensity({}),e.fogHeightFalloff??Kr.getHeightFalloff({}),e.fogHeightBase??Kr.getHeightBase({}))}else if(null===t)for(let e of r)e?.fogNode&&(e.fogNode=null)}var yi=e=>e,xi=e=>e,vi=e=>e,bi=(e,t,a)=>C(e.add(.5).mul(t)).add(.5).div(a),Ti=new qa,wi=new Vs,Si=class{constructor(){this._gBuffer=null,this._aoBuffer=null,this._hbaoMaterial=null,this._resolveMaterial=null,this._boundBlueNoise=null,this._frameIndex=0,this._projectionMatrixInverse=k(new ws),this._isOrtho=k(0),this._resolution=k(new us(1,1)),this._fullResolution=k(new us(1,1)),this._radiusOfInfluence=k(128),this._radiusInScreenSpace=k(1),this._exponent=k(1),this._aoColor=k(new Vs(0,0,0)),this._bias=k(.5),this._frame=k(0),this._fogEnabled=k(0),this._fogNear=k(1),this._fogFar=k(1e3),this._fogMode=k(0),this._fogHeightParams=k(new hs(.005,.01,0)),this._cameraWorldMatrix=k(new ws);let e=new Tt;e.name="SplineHBAO.gbuffer",e.side=Ds,e.fragmentNode=de(Ha.mul(ar),1),e.lights=!1,e.blending=Os,e.needsUpdate=!0,this._normalMaterial=e}_ensureTarget(e,t,a,r){return e&&e.width===t&&e.height===a?{target:e,changed:!1}:(e?.dispose(),{target:r(),changed:!0})}_buildHBAOMaterial(e,t){let a=Da(this._gBuffer.depthTexture),r=Da(this._gBuffer.texture),s=Da(t),i=this._projectionMatrixInverse,n=this._isOrtho,l=this._resolution,o=this._fullResolution,u=this._radiusOfInfluence,d=this._radiusInScreenSpace,h=this._exponent,m=this._aoColor,c=this._bias,p=this._frame,g=this._fogEnabled,f=this._fogNear,_=this._fogFar,y=this._fogMode,x=this._fogHeightParams,v=this._cameraWorldMatrix,b=!0===e.reversedDepthBuffer,T=e=>a.sample(e),w=(e,t)=>ee(e,t,i),S=e=>w(e,T(e)),V=re(()=>{let e=W().toVar(),t=l,a=o,i=C(e.mul(t)).toVar(),V=a.div(t).toVar(),M=bi(i,V,a).toVar(),R=T(M).toVar(),z=w(M,R).toVar(),k=Ja(r.sample(M).xyz).toVar(),A=Pt(d.div(Wt(z.z.negate(),nr(1),n)),nr(5)).toVar(),P=Xe(Ce(bt.xy.x).bitAnd(Ce(127)),Ce(bt.xy.y).bitAnd(Ce(127))),E=s.load(P).xyz.x,N=L(E.add(nr(.61803398875).mul(p))).mul(6.283),B=ua(N).toVar(),I=Xt(N).toVar(),D=A.div(5).toVar(),F=nr(0).toVar();for(let e=0;e<4;e++){let t=D.add(1).toVar();for(let r=0;r<4;r++){let[s,n]=oi[4*e+r],l=ae(B.mul(s).sub(I.mul(n)),I.mul(s).add(B.mul(n))),o=xi(i.add(ht(l.mul(t)))).toVar(),d=vi(S(bi(o,V,a))).toVar();t.addAssign(D);let h=vi(d.sub(z)).toVar(),m=yi(h.dot(h)).toVar(),p=ha(m),g=yi(k.dot(h)).div(Pt(p,nr(1e-4))),f=m.mul(nr(-1).div(u.mul(u))).add(1);F.addAssign(Ft(g.sub(c),0,1).mul(Ft(f,0,1)))}}let U=nr(1).div(nr(1).sub(c));F.mulAssign(U.div(16));let O=Ft(nr(1).sub(F.mul(2)),0,1),G=ze(O,h).toVar(),q=b?R.lessThanEqual(0):R.greaterThanEqual(1);G.assign(q.select(nr(1),G));let H=ne(Wt(m,ne(1),G)).toVar(),j=Jt(f,_,z.z.negate()),K=v.mul(de(z,1)).xyz,$=v.mul(de(0,0,0,1)).xyz,X=K.sub($).toVar(),Q=pi(X,X.length().max(1e-6),$,x),Z=y,Y=nr(1).sub(ga(.5,Z)).add(ga(1.5,Z)),J=ga(.5,Z),ee=nr(1).sub(nr(1).sub(j.mul(Y)).mul(nr(1).sub(Q.mul(J)))).mul(g);return H.assign(Wt(H,ne(1),ee)),de(H,1)}),M=new Tt;return M.name="SplineHBAO.hbao",M.colorNode=V(),M.depthTest=!1,M.depthWrite=!1,M.blending=Os,M.needsUpdate=!0,M}_buildResolveMaterial(){let e=Da(this._aoBuffer.texture),t=Da(this._gBuffer.depthTexture),a=this._resolution,r=this._fullResolution,s=re(()=>{let s=W().toVar(),i=a,n=r,l=ae(nr(1).div(i.x),nr(1).div(i.y)).toVar(),o=s.sub(l.mul(.5)).toVar(),u=o.add(ae(l.x,0)).toVar(),d=o.add(ae(0,l.y)).toVar(),h=o.add(l).toVar(),m=t.sample(s).toVar(),c=n.div(i).toVar(),p=e=>t.sample(bi(e,c,n)),g=C(o.mul(i)).toVar(),f=m.sub(p(g)).abs().toVar(),_=m.sub(p(g.add(ae(1,0)))).abs().toVar(),y=m.sub(p(g.add(ae(0,1)))).abs().toVar(),x=m.sub(p(g.add(ae(1,1)))).abs().toVar(),v=f.min(_).min(y).min(x).toVar(),b=h.toVar();return b.assign(v.equal(y).select(d,b)),b.assign(v.equal(_).select(u,b)),b.assign(v.equal(f).select(o,b)),e.sample(b)}),i=new Tt;return i.name="SplineHBAO.resolve",i.colorNode=s(),i.depthTest=!1,i.depthWrite=!1,i.blending=Os,i.needsUpdate=!0,i}render(e,t,a,r,s,i){let n=i.width,l=i.height,o=!0!==r.aoFullRes,u=o?.5:1,d=Math.max(1,Math.round(n*u)),h=Math.max(1,Math.round(l*u)),m=null===this._hbaoMaterial,c=this._ensureTarget(this._gBuffer,n,l,()=>new xs(n,l,{type:as,depthTexture:new ls(n,l),minFilter:Zs,magFilter:Zs}));if(this._gBuffer=c.target,m=m||c.changed,o){let e=this._ensureTarget(this._aoBuffer,d,h,()=>new xs(d,h,{minFilter:Zs,magFilter:Zs,depthBuffer:!1}));this._aoBuffer=e.target,m=m||e.changed}m=m||this._boundBlueNoise!==s;let p=o;(m||p&&null===this._resolveMaterial)&&(this._hbaoMaterial?.dispose(),this._resolveMaterial?.dispose(),this._hbaoMaterial=this._buildHBAOMaterial(e,s),this._resolveMaterial=p?this._buildResolveMaterial():null,this._boundBlueNoise=s);let g=a,f=g.projectionMatrix.elements,_=0===f[11];if(this._projectionMatrixInverse.value.copy(g.projectionMatrixInverse),this._isOrtho.value=_?1:0,this._resolution.value.set(d,h),this._fullResolution.value.set(n,l),this._radiusOfInfluence.value=r.radius,_){let e=2/f[5];this._radiusInScreenSpace.value=r.radius*(h/e*.5)}else{let e=h*f[5]/2;this._radiusInScreenSpace.value=.5*r.radius*e}this._bias.value=r.bias,this._aoColor.value.setRGB(r.aoColor.r,r.aoColor.g,r.aoColor.b),this._fogEnabled.value=r.fogEnabled?1:0,this._fogNear.value=r.fogNear,this._fogFar.value=r.fogFar,this._fogMode.value=r.fogMode,this._fogHeightParams.value.set(r.fogDensity,r.fogHeightFalloff,r.fogHeightBase),this._cameraWorldMatrix.value.copy(a.matrixWorld),this._frame.value=this._frameIndex,this._frameIndex++;let y=e,x=t,v=x.overrideMaterial,b=y.getRenderTarget(),T=y.getMRT(),w=y.getClearColor(wi),S=y.getClearAlpha(),V=a.layers.mask;a.layers.set(5),x.overrideMaterial=this._normalMaterial,y.setMRT(null),y.setClearColor(0,0),y.setRenderTarget(this._gBuffer),y.render(t,a),x.overrideMaterial=v,a.layers.mask=V,Ti.material=this._hbaoMaterial,Ti.name="SplineHBAO.hbao",y.setRenderTarget(o?this._aoBuffer:i),Ti.render(e),o&&(Ti.material=this._resolveMaterial,Ti.name="SplineHBAO.resolve",y.setRenderTarget(i),Ti.render(e)),y.setRenderTarget(b),y.setMRT(T),y.setClearColor(w,S)}dispose(){this._gBuffer?.dispose(),this._gBuffer=null,this._aoBuffer?.dispose(),this._aoBuffer=null,this._normalMaterial.dispose(),this._hbaoMaterial?.dispose(),this._hbaoMaterial=null,this._resolveMaterial?.dispose(),this._resolveMaterial=null,this._boundBlueNoise=null}},Vi={texture:null,version:0,rotation:new Ss,quality:"full"},Mi=new Set;function Ri(e){let t=Vi.texture,a=e.lights&&"physical"===e.category&&null!==t&&("full"===Vi.quality||!1!==e.envReflectiveInLow?.()),r=e.envNode instanceof ki;a?(!r||e.envNode.sourceTexture!==t)&&(e.envNode=new ki(t),e.needsUpdate=!0):r&&(e.envNode=null,e.needsUpdate=!0)}var Ci=new WeakMap;function zi(e,t){let a=null;return{getUV:()=>{if(null===a){let r=be.negate().reflect(t);r=Ie(e).mix(r,t),r=r.normalize(),a=r.transformDirection(Bt)}return a},getTextureLevel:()=>e}}var ki=class extends ma{constructor(e){super(null),this.sourceTexture=e}static get type(){return"SplineEnvironmentNode"}setup(e){let t=function(e){let t=Ci.get(e);return void 0===t&&(t=te(e),Ci.set(e,t)),t}(this.sourceTexture),a=e.context,r=t.context(zi(ot,Ha)).mul(Ct);a.radiance.addAssign(r);let s=t.context({getUV:()=>Xa,getTextureLevel:()=>nr(1)}).mul(Math.PI).mul(Ct);a.iblIrradiance.addAssign(s);let i=a.lightingModel?.clearcoatRadiance;if(i){let e=t.context(zi(Zt,Kt)).mul(Ct);i.addAssign(e)}return null}},Ai=class extends ri{},Pi=class extends R{static get type(){return"SplineSkyHemisphereLightNode"}setup(e){return e.material?.envNode instanceof ki?null:super.setup(e)}},Ei=e=>e,Ni=e=>e,Bi=e=>e,Li=e=>e,Ii=.25,Di=256/(2*Math.PI),Fi=(e,t,a,r,s)=>{let i=ne(0).toVar();return le(r.lessThan(.5),()=>{i.assign(e.sample(t).level(s).rgb)}).Else(()=>{let r=ne(0).toVar(),n=nr(0).toVar();for(let i=0;i<12;i++){let l=Math.sqrt((i+.5)/12),o=2.399963229728653*i,u=l*Math.cos(o),d=l*Math.sin(o),h=Math.exp(-2.5*l*l),m=Bi(Li(e.sample(ae(Ei(t.x).add(a.mul(u)),Ei(t.y).add(a.mul(d)))).level(s)).rgb);r.addAssign(m.mul(h)),n.addAssign(nr(h))}i.assign(r.div(n))}),i},Ui=(e,t,a,r)=>{let s=de(t.mul(2).sub(1),nr(1).sub(a).mul(2).sub(1),r,1),i=e.mul(s).toVar();return i.xyz.div(i.w)},Oi=(e,t,a,r)=>{let s=w.reflectionEnvEnabled,i=w.reflectionMissColor,n=a.greaterThan(.05),l=r??zt(n,nr(.6),nr(1)),o=He(t.z,t.x).div(2*Math.PI).add(.5),u=Ge(Ft(t.y,nr(-1),nr(1))).div(Math.PI).add(.5),d=Ut(ct(a.mul(l).mul(Ii*Di).add(1)),nr(8)),h=e.sample(ae(o,u)).level(d).rgb;return zt(s.greaterThan(.5),h,i)},Gi=e=>{let{dials:t,surface:a,camera:r,resources:s}=e,{blur:i,thickness:n,steps:l,stepSize:o,tracingMode:u}=t,{colorMap:d,depthPyramid:h,depthPyramidNode:m,envMap:c}=s,p=e.usePlanar,g=w.reflectionDepthSize,f=w.reflectionDepthLevels,_=(e,t)=>h.load(e).level(t).r.add(1e-6),y=w.orthographicUniform.greaterThan(.5),x=zt(y,ne(0,0,-1),Ja(a.originView)).toVar(),v=a.normalV.toVar(),b=Je(x,v).toVar(),T=Ft(i.mul(.1),nr(0),nr(1)).toVar(),S=w.resolution,V=T.greaterThan(.05),M=e.singleRay?nr(1):zt(V,nr(.6),nr(1)),R=(e,t,s,i)=>{let l=Ja(er(e,r.worldMatrix)).toVar(),h=nr(1).sub(Jt(nr(.85),nr(.99),e.z)).toVar(),x=a.originView.toVar(),b=x.z.negate().max(r.near).toVar(),w=nr(b.mul(10)).toVar();le(e.z.greaterThan(1e-5),()=>{let t=r.near.negate().sub(x.z).div(e.z);w.assign(Ut(w,t.mul(.95).max(1e-4)))});let V,R=x.add(e.mul(w)).toVar(),C=ne(a.screenUv,a.fragWindowZ).toVar(),z=(e=>{let t=r.projectionMatrix.mul(de(e,1)).toVar(),a=t.xyz.div(t.w);return ne(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5),a.z)})(R).toVar(),k=T.mul(S.y).mul(.075).toVar();if(i){let e=k.mul(g.y.div(S.y)).toVar(),t=Ut(nr(.8),nr(12).div(e.max(.001))).toVar();i.assign(e.mul(t)),V=nr(1).sub(t.mul(t)).max(0).sqrt().toVar()}let A=z.sub(C).toVar(),P=Pt(A.xy.length(),nr(1e-5)).toVar(),E=nr(0).toVar(),N=ne(0).toVar(),B=()=>{let e=f.sub(1).toVar(),a=Ce(1).toVar(),r=Ce(0).toVar(),s=(e,t)=>Ut(e,t),i=A,l=i.div(i.z).toVar(),o=ne(C).toVar(),u=ae(zt(i.x.greaterThanEqual(0),nr(1),nr(-1)),zt(i.y.greaterThanEqual(0),nr(1),nr(-1))).toVar(),d=u.mul(1e-5).toVar();u.assign(Ft(u,ae(0),ae(1)));let h=e=>ae(ja(m,e)),c=(e,t)=>e.mul(t).floor(),p=(e,t,a)=>{let r=ae(1).div(a),s=t.div(a).add(r.mul(u)).sub(e.xy).div(i.xy).toVar(),n=e.add(i.mul(Ut(s.x,s.y))).toVar();return n.xy.addAssign(zt(s.x.lessThan(s.y),ae(d.x,0),ae(0,d.y))),n},y=h(a),x=c(o.xy,y);o.assign(p(o,x,y)),he(256,()=>{le(a.lessThan(Ce(0)).or(r.greaterThanEqual(t)),()=>{X()});let u=h(a).toVar(),d=c(o.xy,u).toVar(),m=_(Xe(Ce(d.x),Ce(d.y)),a).toVar(),g=ne(o).toVar();le(i.z.greaterThan(0),()=>{let t=m.sub(o.z).toVar();le(t.greaterThan(0),()=>{g.assign(o.add(l.mul(t)))});let r=c(g.xy,u).toVar();le(((e,t)=>Ce(e.x).notEqual(Ce(t.x)).or(Ce(e.y).notEqual(Ce(t.y))))(d,r),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Ce(2))))}).Else(()=>{le(a.equal(Ce(1)).and(t.abs().greaterThan(n)),()=>{g.assign(p(o,d,u)),a.assign(Ce(2))})})}).Else(()=>{le(o.z.lessThan(m),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Ce(2))))})}),o.assign(g),a.subAssign(Ce(1)),r.addAssign(Ce(1))});let v=o.x.greaterThan(0).and(o.x.lessThan(1)).and(o.y.greaterThan(0)).and(o.y.lessThan(1)).and(o.z.greaterThan(0)).and(o.z.lessThan(1));le(a.lessThan(Ce(0)).and(r.lessThan(t)).and(v),()=>{E.assign(1),N.assign(o);let e=o.xy.sub(C.xy).length().div(P).clamp(0,1),t=e.sub(nr(2).div(g.y).div(P)).max(0),a=ne(C.add(A.mul(t))).toVar(),r=ne(C.add(A.mul(e))).toVar(),s=ne(r).toVar();for(let e=0;e<4;e++){s.assign(Wt(a,r,.5));let e=Ei(_(Xe(Ni(s.xy).mul(g)),Ce(0)));le(s.z.sub(e).greaterThan(0),()=>{r.assign(s)}).Else(()=>{a.assign(s)})}N.assign(s)})},L=()=>{let e=Pt(o,nr(1e-4)),a=nr(e).toVar(),r=ne(C).toVar(),s=ne(C).toVar(),i=nr(-1).toVar();he(256,({i:l})=>{le(l.greaterThanEqual(t),()=>{X()});let o=nr(l).mul(a).div(P).toVar();le(o.greaterThan(1),()=>{X()}),s.assign(A.mul(o).add(C));let u=s.x.lessThan(0).or(s.x.greaterThan(1)).or(s.y.lessThan(0)).or(s.y.greaterThan(1)).or(s.z.lessThan(0)).or(s.z.greaterThan(1));le(u,()=>{X()});let d=_(Xe(s.xy.mul(g)),Ce(0)).toVar(),h=s.z.sub(d).toVar();le(i.lessThanEqual(0).and(h.greaterThan(0)),()=>{let e=ne(r).toVar(),t=ne(s).toVar(),a=ne(s).toVar(),i=nr(h).toVar();for(let r=0;r<4;r++){a.assign(Wt(e,t,.5));let r=Ei(_(Xe(Ni(a.xy).mul(g)),Ce(0)));i.assign(a.z.sub(r)),le(i.greaterThan(0),()=>{t.assign(a)}).Else(()=>{e.assign(a)})}le(i.abs().lessThan(n),()=>{E.assign(1),N.assign(a),X()})}),i.assign(h),r.assign(s),a.addAssign(e.div(2))})};le(h.greaterThan(0).and(p.not()),()=>{"number"==typeof u?1===u?B():L():le(u.greaterThan(.5),()=>{B()}).Else(()=>{L()})});let I=Oi(c,l,T,V).toVar(),D=ne(I).toVar();return le(E.greaterThan(.5),()=>{let t=N.xy.sub(C.xy).length().div(P).clamp(0,1).toVar(),a=x.z.negate().max(1e-4).toVar(),n=R.z.negate().max(1e-4).toVar(),l=Wt(nr(1).div(a),nr(1).div(n),t).toVar(),o=Wt(x.div(a),R.div(n),t).div(l),u=Wt(x,R,t),m=zt(y,u,o).toVar(),c=m.sub(x).length().toVar(),p=r.projectionMatrix.element(1).y.mul(S.y).mul(.5),w=zt(y,nr(1),m.z.abs().max(1e-4)),V=T.mul(M).mul(Ii).mul(c).mul(p).div(w),z=Pt(V,k).toVar(),A=z.mul(g.y.div(S.y)).toVar(),E=A.toVar(),B=z.toVar();if(i){let e=Ut(nr(.8),nr(12).div(A.max(.001))).toVar();i.assign(A.mul(e)),E.assign(A.mul(nr(1).sub(e.mul(e)).max(0).sqrt())),B.assign(E.mul(S.y.div(g.y)))}let L=nr(f.sub(1)),F=Ut(ct(E.add(1)),L),U=s?Fi(d,N.xy,B.mul(.75).div(S.y),E.mul(.75),F.sub(1).max(0).floor()).toVar():d.sample(N.xy).level(F).rgb.toVar(),O=e=>Jt(nr(0),nr(.07),e).mul(Jt(nr(0),nr(.07),nr(1).sub(e))),G=O(N.x).mul(O(N.y)),q=N.xy.mul(g),W=_(Xe(q),Ce(0)),H=Ui(r.projectionMatrixInverse,N.x,N.y,W).toVar(),j=Ua(H.sub(x),v),K=Jt(b.mul(-.05),b.mul(-.005),j),$=nr(1).div(g.x),X=nr(1).div(g.y),Q=_(Xe(q.sub(ae(1,0))),Ce(0)),Z=_(Xe(q.add(ae(1,0))),Ce(0)),Y=_(Xe(q.sub(ae(0,1))),Ce(0)),J=_(Xe(q.add(ae(0,1))),Ce(0)),ee=Ui(r.projectionMatrixInverse,N.x.sub($),N.y,Q),te=Ui(r.projectionMatrixInverse,N.x.add($),N.y,Z),re=Ui(r.projectionMatrixInverse,N.x,N.y.sub(X),Y),se=Ui(r.projectionMatrixInverse,N.x,N.y.add(X),J),ie=Ja(ca(te.sub(ee),se.sub(re))).toVar(),ne=zt(ie.z.lessThan(0),ie.negate(),ie),le=Jt(nr(.02),nr(.12),Ua(ne,e).negate()),oe=h.mul(G).mul(K).mul(le);D.assign(Wt(I,U,oe))}),D};if(e.singleRay)return R(b,l,!0,e.singleRay.footprintOut).toVar();let C=e.noisePixel,z=L(nr(52.9829189).mul(L(C.x.mul(.06711056).add(C.y.mul(.00583715))))).mul(2*Math.PI).toVar(),k=zt(b.y.abs().greaterThan(.99),ne(1,0,0),ne(0,1,0)),A=Ja(ca(k,b)).toVar(),P=ca(b,A).toVar(),E=(e,t=4)=>{let a=T.mul(Ii*Math.sqrt((e+.5)/t)),r=z.add(2.399963229728653*e);return Ja(b.mul(ua(a)).add(A.mul(ua(r)).add(P.mul(Xt(r))).mul(Xt(a)))).toVar()},N=V.and(p.not()),B=zt(N,E(0),b).toVar(),I=ne(0).toVar();I.addAssign(R(B,l,!0));let D=nr(1).toVar();return le(N,()=>{I.addAssign(R(E(2),l,!1)),D.assign(2),le(T.greaterThan(.35),()=>{I.addAssign(R(E(1),l,!1)),I.addAssign(R(E(3),l,!1)),D.assign(4)})}),I.div(D).toVar()},qi=new us,Wi=class extends rs{constructor(e){super(),this.postprocessingState=Xr.defaultData,this.sceneTransitionPass={uniforms:{mixRatio:k(0),uDPR:{value:1},uResolution:{value:new us}}},this.sceneTransitionFromTexture=null,this.watermarkTexture=null,this.uiCanvasTexture=null,this.uiOverlayEnabled=!1,this._isUIOverlayEnabled=!1,this._helpersEnabled=!0,this._renderToScreen=!0,this._rt=null,this._effectChain=null,this._effectChainDirty=!1,this.blueNoiseTexture=new js,this._rebuildCount=0,this._rebuildLogAt=0,this._chainUiTexture=null,this._chainWatermark=null,this._chainTransitionTexture=null,this._chainCamera=null,this._chainHdr=!1,this.lastOutputTarget=null,this._renderer=e}get renderToScreen(){return this._renderToScreen}set renderToScreen(e){this._renderToScreen=e}get texture(){return this._rt&&this._rt.texture}get renderTarget(){return this._rt}get isUIOverlayEnabled(){return this._isUIOverlayEnabled}enableUIOverlay(){this._isUIOverlayEnabled=!0}disableUIOverlay(){this._isUIOverlayEnabled=!1}enableHelpers(){this._helpersEnabled=!0}disableHelpers(){this._helpersEnabled=!1}get helpersEnabled(){return this._helpersEnabled}setWatermark(e){this.watermarkTexture=e,this._effectChainDirty=!0}updateBlueNoiseTexture(e){this.blueNoiseTexture.dispose();let t=new js(e,128,128);t.wrapS=Is,t.wrapT=Is,t.minFilter=Hs,t.magFilter=Hs,t.needsUpdate=!0,this.blueNoiseTexture=t}static _topologyJSON(e){let t=e,a={};for(let e of Object.keys(t)){let r=t[e],s=Wi.UNIFORM_BACKED_FIELDS[e];if(s&&r&&"object"==typeof r){let t={...r};for(let e of s)delete t[e];a[e]=t}else a[e]=r}return JSON.stringify(a)}updatePostprocessing(e){this.postprocessingState=e;let t=Wi._topologyJSON(e);this._postprocessingJSON!==t&&(this._postprocessingJSON=t,this._effectChainDirty=!0)}_needsEffectChain(){if(this._renderer.temporalAAEnabled||this.uiOverlayEnabled&&this.uiCanvasTexture||this.watermarkTexture||this.sceneTransitionFromTexture)return!0;if(!0!==this.postprocessingState.enabled)return!1;let e=this.postprocessingState;for(let t of Object.keys(e)){let a=e[t];if(a&&"object"==typeof a&&!0===a.enabled)return!0}return!1}render(){let{scene:e,camera:t}=this;if(!e||!t)return;let a=this._renderer;if(a.warmupInFlight)return;let r=!1;if(!this._renderToScreen&&null===a.getRenderTarget()){a.getDrawingBufferSize(qi);let e=Math.max(1,Math.round(qi.x)),t=Math.max(1,Math.round(qi.y));null===this._rt?this._rt=new xs(e,t,{depthBuffer:!0}):(this._rt.width!==e||this._rt.height!==t)&&(this._rt.dispose(),this._rt=new xs(e,t,{depthBuffer:!0})),a.setRenderTarget(this._rt),r=!0}this.lastOutputTarget=r?this._rt:a.getRenderTarget();try{this._renderFrame(e,t)}finally{r&&a.setRenderTarget(null)}}_renderFrame(e,t){let a=this._renderer;a.renderStarted=!0,a.normalizeCameraCoordinateSystem(t);let r=this._needsEffectChain(),s=null;this._effectChainDirty?s="postprocessing/watermark":r!==(null!==this._effectChain)?s="chain presence":null!==this._effectChain&&(this._chainUiTexture!==(this.uiOverlayEnabled?this.uiCanvasTexture:null)?s="ui overlay texture":this._chainWatermark!==this.watermarkTexture?s="watermark texture":this._chainTransitionTexture!==this.sceneTransitionFromTexture?s="transition texture":this._chainCamera!==t?s="camera identity":this._chainHdr!==a.hdrChainActive&&(s="grading pipeline"));let i=null!==s;if(i&&null!==this._effectChain){this._rebuildCount++;let e=Date.now();e-this._rebuildLogAt>1e3&&(this._rebuildLogAt=e,this._rebuildCount=0)}if(i&&(this._effectChain,this._effectChain?.dispose(),this._effectChain=null,this._effectChainDirty=!1,r&&(this._effectChain=a.createEffectChain(),T.chainBuilds++,T.lastChainBuildReason=s??"initial",this._chainUiTexture=this.uiOverlayEnabled?this.uiCanvasTexture:null,this._chainWatermark=this.watermarkTexture,this._chainTransitionTexture=this.sceneTransitionFromTexture,this._chainCamera=t,this._chainHdr=a.hdrChainActive)),this._effectChain){this._effectChain.syncValues(this.postprocessingState,a);let e=a.temporalAAEnabled?a.taaHistory:null;e&&(a.getDrawingBufferSize(qi),e.beginJitter(t,qi.x,qi.y)),this._effectChain.renderTAAResolve?.(a),this._effectChain.renderBloomPasses?.(a),this._effectChain.render(),e?.endJitter()}else a.renderScenePass(e,t);this._helpersEnabled&&(this.sceneHelpers||this.sceneHelpersOnTop)&&a.renderHelperOverlay(this.sceneHelpers,this.sceneHelpersOnTop,t,this._effectChain?this._effectChain.sceneDepthTexture():null)}resize(e,t,a){this._effectChain?.resize()}setViewport(e,t,a,r){e instanceof ys?this._renderer.setViewport(e.x,e.y,e.z,e.w):this._renderer.setViewport(e,t,a,r)}setScissor(e,t,a,r){e instanceof ys?this._renderer.setScissor(e.x,e.y,e.z,e.w):this._renderer.setScissor(e,t,a,r)}setScissorTest(e){this._renderer.setScissorTest(e)}dispose(){this._effectChain?.dispose(),this._effectChain=null,this._rt?.dispose(),this._rt=null,this.blueNoiseTexture.dispose()}},Hi=Wi;Hi.UNIFORM_BACKED_FIELDS={bloom:["intensity","opacity"],chromaticAberration:["offset","opacity"],vignette:["offset","darkness","opacity"],noise:["opacity"],hueSaturation:["hue","saturation","opacity"],brightnessContrast:["brightness","contrast","opacity"],depthOfField:["focusDistance","focalLength","bokehScale","opacity"],pixelation:["granularity","opacity"]};var ji=(()=>{try{return"1"===new URLSearchParams(window.location.search).get("dbgdestroys")}catch{return!1}})(),Ki=[],$i=6,Xi=()=>-1,Qi=!1,Zi=null;function Yi(e,t,a){Ki.push({t:Math.round(performance.now()),frame:Xi(),kind:e,label:t||"(unlabeled)",size:a,stack:((new Error).stack??"").split("\n").slice(2,9).join("\n")}),Ki.length>32&&Ki.shift()}var Ji=(e,t)=>({start:Ce(0),end:Ce(t),type:"int",condition:"<",name:e}),en=Ft;function tn(e,t){let a=new xs(e,t,{depthBuffer:!1,type:ts,format:Ts});return a.texture.generateMipmaps=!1,a.texture.minFilter=Hs,a.texture.magFilter=Hs,a}var an=null;function rn(){return null===an&&((an=tn(64,8)).texture.name="SplinePCSSPyramidAtlas"),an.texture}function sn(e,t,a,r,s,i){let n=new Tt,l=Da(t),o=re(()=>{let e=bt,t=0!==i?e.x.sub(i):e.x,n=Ce(t).mul(a).toVar(),o=Ce(e.y).mul(a).toVar(),u=nr(1e9).toVar(),d=nr(-1e9).toVar();return he(Ji("ly",a),Ji("lx",a),e=>{let{lx:t,ly:a}=e,i=en(n.add(t),Ce(0),Ce(r)),h=en(o.add(a),Ce(0),Ce(r)),m=l.load(Xe(i,h));u.assign(Ut(u,m.x)),d.assign(Pt(d,s?m.y:m.x))}),de(u,d,0,1)})();return n.fragmentNode=o,n.name=e,n.lights=!1,n.blending=Os,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,n}var nn=new Set;function ln(e){let t=e;return t.__spePcssPyramid||(t.__spePcssPyramid={fresh:!1,slot:-1,passKey:"",mid:null,small:null,toMid:null,toSmall:null},nn.add(new WeakRef(t.__spePcssPyramid))),t.__spePcssPyramid}var on=new Array(8).fill(null);function un(e){return!0===e.__spePcssPyramid?.fresh}function dn(e){return e.__spePcssPyramid?.slot??-1}var hn=!1;var mn=new hs,cn=e=>e,pn=e=>e,gn=e=>e,fn=!0,_n=!0,yn=!0,xn=!0;try{let e=new URLSearchParams(window.location.search),t=e.get("dbgpcss");"classic"===t||"0"===t?(fn=!1,_n=!1,yn=!1,xn=!1):(fn="0"!==e.get("dbgpcsssplit"),_n="0"!==e.get("dbgpcsshw"),yn="0"!==e.get("dbgpcsshiz"),xn="0"!==e.get("dbgshadowmask"))}catch{}var vn=!1,bn=()=>_n&&vn,Tn=()=>yn&&vn,wn=()=>xn&&vn,Sn=()=>Tn(),Vn=()=>wn(),Mn=[[0,-.333334],[-.5,.333334],[.5,-.777778],[-.75,-.111112],[.25,.555556],[-.25,-.555556],[.75,.111112],[-.875,.777778],[.125,-.925926],[-.375,-.25926],[.625,.407408],[-.625,-.703704],[.375,-.037038],[-.125,.62963],[.875,-.481482],[-.9375,.185186]],Rn=16;function Cn(e){let t=e;return t.__spePcssKnobs||(t.__spePcssKnobs={mapSize:k(2048),radius:k(1),penumbraSize:k(.5),depthEps:k(1e-4),penumbraFrameScale:k(1),penumbraFrameOffset:k(0),pyramidEnabled:k(0),pyramidSlot:k(0),maskChannel:k(new ys(0,0,0,0)),planeNormalMat:k((new ms).set(0,0,0,0,0,0,0,0,0))}),t.__spePcssKnobs}function zn(e,t){Cn(e).maskChannel.value.set(0===t?1:0,1===t?1:0,2===t?1:0,3===t?1:0)}function kn(e,t,a){let r=e,s=Cn(e);s.mapSize.value=r.mapSize?.x??2048,s.radius.value=r.radius??1,s.penumbraSize.value=t??r.penumbraSize??.5,r.camera?.isOrthographicCamera&&r.matrix?s.planeNormalMat.value.getNormalMatrix(r.matrix):s.planeNormalMat.value.set(0,0,0,0,0,0,0,0,0);let i="number"==typeof r.camera?.far&&"number"==typeof r.camera?.near?r.camera.far-r.camera.near:0;s.depthEps.value=i>.001?1.25/i:1e-4;let n=e.__speRangeEnvelope,l=n?n.far-n.near:0;n&&l>.001&&i>.001&&r.camera?(s.penumbraFrameScale.value=i/l,s.penumbraFrameOffset.value=(r.camera.near-n.near)/l):(s.penumbraFrameScale.value=1,s.penumbraFrameOffset.value=0);let o=0;if(a&&a.fresh&&a.slot>=0&&Tn()){let e=s.mapSize.value;80/1024+(2*s.radius.value+2)/Math.max(1,e)<=1/8&&(o=1)}return s.pyramidEnabled.value=o,s.pyramidSlot.value=Math.max(0,a?.slot??0),1===s.pyramidEnabled.value}function An(e,t){let a=e.planeNormalMat.mul(t).toVar(),r=a.z,s=Ht(r).add(ga(Ae(r),nr(0))).mul(Pt(Ae(r),nr(1e-4)));return ae(a.x.negate().div(s),a.y.div(s)).toVar()}var Pn=(e,t)=>Ft(Ua(e,t),nr(-.05),nr(.05));function En(e,t,a,r,s,i,n){let l=bn()?Math.max(4,Rn>>1):Rn,o=fn?Math.max(4,Rn>>1):Rn,u=bn(),d=Cn(t),h=d.mapSize,m=ae(h,h),c=d.radius,p=d.penumbraSize,g=Da(e),f=e=>g.load(Xe(Ft(e,ae(0),ae(1)).mul(m))).x,_=nr(1).div(m.x).toVar(),y=nr(80).div(_.mul(1024)).toVar(),x=d.depthEps,v=An(d,n),b=()=>{let t=nr(0).toVar(),n=nr(0).toVar();for(let e=0;e<o;e++){let i=pn(Q(Ce(e),Ce(o),s)).mul(_).mul(y),l=f(pn(a.add(i))).toVar();le(l.lessThan(r.add(Pn(v,i)).add(x)),()=>{t.addAssign(l),n.addAssign(1)})}let h=nr(0).toVar();le(n.greaterThan(0),()=>{let e=t.div(n).toVar(),a=d.penumbraFrameScale,s=d.penumbraFrameOffset,i=r.sub(e).mul(a).div(e.mul(a).add(s)).toVar();h.assign(Ft(i.mul(i).mul(200).mul(p),nr(0),nr(1)))});let m=nr(0).toVar();for(let t=0;t<l;t++){let i=pn(Q(Ce(t),Ce(l),s)).mul(_),n=pn(i.mul(c.mul(2)).add(i.mul(h.mul(y)))),o=cn(r.add(Pn(v,n)));u?m.addAssign(cn(Da(e,pn(a.add(n))).compare(o))):m.addAssign(ga(o,f(pn(a.add(n)))))}i.assign(m.div(l))};if(Tn()){let e=Da(rn()),t=d.pyramidEnabled,s=d.pyramidSlot,n=nr(8),l=nr(0).toVar();le(t.greaterThan(.5),()=>{let t=Ft(a,ae(0),ae(1)),i=t.x.mul(n).toVar(),o=t.y.mul(n).toVar(),u=s.mul(n),d=nr(1e9).toVar(),h=nr(-1e9).toVar();for(let t=-1;t<=1;t++)for(let a=-1;a<=1;a++){let r=Ft(i.add(nr(a)),nr(0),n.sub(1)),s=Ft(o.add(nr(t)),nr(0),n.sub(1)),l=pn(ae(r.add(u),s)),m=e.load(Xe(l));d.assign(Ut(d,cn(m.x))),h.assign(Pt(h,cn(m.y)))}let m=_.mul(c.mul(2).add(y)),p=Ut(tt(v).mul(m),nr(.05)).toVar();le(d.greaterThanEqual(r.add(x).add(p)),()=>{l.assign(1)}).ElseIf(h.lessThan(r.sub(p)),()=>{l.assign(2)})}),le(l.equal(1),()=>{i.assign(1)}).ElseIf(l.equal(2),()=>{i.assign(0)}).Else(b)}else b()}var Nn=re(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=Cn(r),i=a.xy.toVar(),n=a.z.toVar(),l=Xa.toVar(),o=w.pcssHalton,u=j(bt.xy.add(o)).mul(6.28318530718).toVar(),d=nr(1).toVar();if(wn()){let e=s.maskChannel,a=w.shadowMaskEnabled,o=w.shadowMaskGBuffer,h=w.shadowMaskTexture,m=nr(0).toVar(),c=nr(1).toVar();le(a.greaterThan(.5).and(Ua(e,de(1,1,1,1)).greaterThan(.5)),()=>{let t=Vt,a=w.shadowMaskResolution,r=w.shadowMaskFullResolution,s=_e.z,i=t.mul(a).sub(ae(.5,.5)).toVar(),n=C(i).toVar(),l=i.sub(n).toVar(),u=Pt(Ae(s).mul(.02),nr(.05)),d=nr(0).toVar(),p=nr(0).toVar();for(let t=0;t<=1;t++)for(let i=0;i<=1;i++){let m=pn(Ft(n.add(ae(i,t)),ae(0,0),a.sub(ae(1,1)))),c=pn(m.add(ae(.5,.5)).div(a)),g=pn(C(c.mul(r)).add(ae(.5,.5)).div(r)),f=cn(o.sample(g).w),_=cn(Ua(h.sample(c),e)),y=cn(0===i?nr(1).sub(l.x):cn(l.x)),x=cn(0===t?nr(1).sub(l.y):cn(l.y)),v=cn(ga(Ae(f.sub(s)),u)),b=cn(y.mul(x).mul(v)).toVar();d.addAssign(b),p.addAssign(_.mul(b))}le(d.greaterThan(.001),()=>{m.assign(1),c.assign(p.div(d))})}),le(m.greaterThan(.5),()=>{d.assign(c)}).Else(()=>{En(t,r,i,n,u,d,l)})}else En(t,r,i,n,u,d,l);return d}),Bn=re(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=Cn(r),i=a.xy.toVar(),n=a.z.toVar(),l=An(s,Xa.toVar()),o=s.mapSize,u=s.radius.mul(nr(1).div(o)).toVar(),d=j(bt.xy).mul(6.28318530718).toVar(),h=nr(0).toVar();for(let e=0;e<5;e++){let a=pn(Q(Ce(e),Ce(5),d)).mul(u).toVar();h.addAssign(cn(Da(t,pn(i.add(a))).compare(n.add(Pn(l,a)))))}return h.mul(.2)}),Ln=re(e=>{let{depthTexture:t,bd3D:a,dp:r,shadow:s}=e,i=Rn,n=Cn(s),l=n.mapSize,o=n.radius,u=nr(1).div(l).toVar(),d=w.pcssHalton,h=j(bt.xy.add(d)).mul(6.28318530718).toVar(),m=o.add(5).toVar(),c=nr(0).toVar();for(let e=0;e<i;e++){let s=pn(Q(Ce(e),Ce(i),h)).mul(u).toVar(),n=gn(ne(s.x,s.y,cn(s.x).negate()).mul(m)),l=gn(a.add(n));c.addAssign(cn(_a(t,l).compare(r)))}return c.div(i)});function In(e,t){let a=t;return a.isPointLight?(T.pcssHookServes++,Wn):a.isSpotLight||a.isDirectionalLight?(T.pcssHookServes++,qn):null}var Dn=k(1);function Fn(e){Dn.value=e?1:0}var Un=(e,t)=>e(t),On=["depthTexture","shadowCoord","shadow","depthLayer","bd3D","dp"];function Gn(e,t){return a=>{let r=function(e){let t=e,a={};if(null==t)return a;for(let e of On){let r=t[e];void 0!==r&&(a[e]=r)}return a}(a),s=Un(e,r),i=Un(t,r);return re(()=>{let e=nr(1).toVar();return le(Dn.greaterThan(.5),()=>{e.assign(s)}).Else(()=>{e.assign(i)}),e})()}}var qn=Gn(Nn,Bn),Wn=Gn(Ln,we),Hn=new qa,jn=new Vs,Kn=new us,$n=class{constructor(){this._gBuffer=null,this._maskTarget=null,this._resolveMaterial=null,this._resolveKey="",this._cameraWorld=k(new ws),this._projInv=k(new ws),this._lightRows=[];let e=new Tt;e.name="SplineShadowMask.gbuffer",e.fragmentNode=de(Ha,_e.z),e.lights=!1,e.blending=Os,e.needsUpdate=!0,this._gBufferMaterial=e}_ensureTarget(e,t,a,r){return e&&e.width===t&&e.height===a?{target:e,changed:!1}:(e?.dispose(),{target:r(),changed:!0})}_buildResolveMaterial(e){let t=new Tt;t.name="SplineShadowMask.resolve";let a=Da(this._gBuffer.depthTexture),r=Da(this._gBuffer.texture),s=this._cameraWorld,i=this._projInv,n=this._gBuffer.width,l=this._gBuffer.height;this._lightRows=e.map(()=>({matrix:k(new ws),bias:k(0),normalBias:k(0)}));let o=this._lightRows,u=re(()=>{let t=W(),u=C(t.mul(ae(n,l))).add(ae(.5,.5)).div(ae(n,l)).toVar(),d=a.sample(u),h=ee(u,d,i).toVar(),m=r.sample(u).toVar(),c=s,p=c.mul(de(h,1)).xyz.toVar(),g=Ja(c.mul(de(m.xyz,0)).xyz).toVar(),f=w.pcssHalton,_=j(bt.xy.add(f)).mul(6.28318530718).toVar(),y=[nr(1).toVar(),nr(1).toVar(),nr(1).toVar(),nr(1).toVar()];return e.forEach((e,t)=>{let a=o[t],r=p.add(g.mul(a.normalBias)),s=a.matrix.mul(de(r,1)).toVar(),i=s.xyz.div(s.w),n=ne(i.x,nr(1).sub(i.y),i.z).toVar(),l=n.z.add(a.bias).toVar(),u=n.x.greaterThanEqual(0).and(n.x.lessThanEqual(1)).and(n.y.greaterThanEqual(0)).and(n.y.lessThanEqual(1)).and(l.lessThanEqual(1));le(u,()=>{En(e.shadow.map.depthTexture,e.shadow,n.xy,l,_,y[t],g)})}),de(y[0],y[1],y[2],y[3])})();return t.fragmentNode=u,t.lights=!1,t.blending=Os,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,t}render(e,t,a,r,s){let i=s??e.getDrawingBufferSize(Kn),n=Math.max(1,Math.round(i.x)),l=Math.max(1,Math.round(i.y)),o=Math.max(1,Math.round(n/2)),u=Math.max(1,Math.round(l/2)),d=!1,h=this._ensureTarget(this._gBuffer,n,l,()=>{let e=new xs(n,l,{type:as,depthTexture:new ls(n,l),minFilter:Zs,magFilter:Zs});return e.texture.name="SplineShadowMask.gbuffer",e});this._gBuffer=h.target,d=d||h.changed;let m=this._ensureTarget(this._maskTarget,o,u,()=>{let e=new xs(o,u,{depthBuffer:!1,minFilter:Zs,magFilter:Zs});return e.texture.name="SplineShadowMask.mask",e});this._maskTarget=m.target,d=d||m.changed;let c=`${this._gBuffer.texture.uuid}:${r.map(e=>e.shadow.map?.depthTexture?.uuid??"none").join(",")}`;(null===this._resolveMaterial||this._resolveKey!==c)&&(this._resolveMaterial?.dispose(),this._resolveMaterial=this._buildResolveMaterial(r),this._resolveKey=c),this._cameraWorld.value.copy(a.matrixWorld),this._projInv.value.copy(a.projectionMatrix).invert(),r.forEach((e,t)=>{e.shadow.updateMatrices?.(e.light);let a=this._lightRows[t];e.shadow.matrix&&a.matrix.value.copy(e.shadow.matrix),a.bias.value=e.shadow.bias??0,a.normalBias.value=e.shadow.normalBias??0});let p=t,g=!0===p.isScene,f=[],_=[];p.traverse(e=>{let t=e;if(!0===t.isMesh&&!1!==t.visible)if((Array.isArray(t.material)?t.material:[t.material]).some(e=>!0===e?.transparent))f.push(t),t.visible=!1;else if(!g){let e=t;_.push({obj:e,material:e.material}),e.material=this._gBufferMaterial}});let y=p.overrideMaterial,x=e.getRenderTarget(),v=e.getMRT(),b=e.getClearColor(jn),S=e.getClearAlpha(),V=a.layers,M=V.mask;V.disable(3),p.overrideMaterial=this._gBufferMaterial,e.setMRT(null),e.setClearColor(0,0),e.setRenderTarget(this._gBuffer),e.render(t,a),p.overrideMaterial=y,V.mask=M;for(let e of f)e.visible=!0;for(let e of _)e.obj.material=e.material;return Hn.material=this._resolveMaterial,Hn.name="SplineShadowMask.resolve",e.setRenderTarget(this._maskTarget),Hn.render(e),e.setRenderTarget(x),e.setMRT(v),e.setClearColor(b,S),w.shadowMaskTexture.value=this._maskTarget.texture,w.shadowMaskGBuffer.value=this._gBuffer.texture,w.shadowMaskResolution.value.set(o,u),w.shadowMaskFullResolution.value.set(n,l),r.forEach((e,t)=>{zn(e.shadow,t)}),T.shadowMaskResolves++,{targetsChanged:d}}dispose(){this._gBuffer?.dispose(),this._gBuffer=null,this._maskTarget?.dispose(),this._maskTarget=null,this._gBufferMaterial.dispose(),this._resolveMaterial?.dispose(),this._resolveMaterial=null,this._resolveKey=""}},Xn=e=>e,Qn=e=>e,Zn=new qa,Yn=class{constructor(e){this.cam=e,this._savedSkewX=0,this._savedSkewY=0,this._savedShiftX=0,this._savedShiftY=0,this._jitterActive=!1}setViewOffset(e,t,a,r){this.clearViewOffset();let s=this.cam.projectionMatrix.elements,i=-2*a/e,n=2*r/t;this._savedSkewX=s[8],this._savedSkewY=s[9],this._savedShiftX=s[12],this._savedShiftY=s[13],s[8]+=i*s[11],s[9]+=n*s[11],s[12]+=i*s[15],s[13]+=n*s[15],this.cam.projectionMatrixInverse.copy(this.cam.projectionMatrix).invert(),this._jitterActive=!0}clearViewOffset(){if(!this._jitterActive)return;let e=this.cam.projectionMatrix.elements;e[8]=this._savedSkewX,e[9]=this._savedSkewY,e[12]=this._savedShiftX,e[13]=this._savedShiftY,this.cam.projectionMatrixInverse.copy(this.cam.projectionMatrix).invert(),this._jitterActive=!1}};function Jn(e,t){let a=0,r=1,s=e;for(;s>0;)r/=t,a+=r*(s%t),s=Math.floor(s/t);return a}var el=Array.from({length:16},(e,t)=>[Jn(t+1,2),Jn(t+1,3)]),tl="h16";try{let e=new URLSearchParams(window.location.search).get("dbgjitseq");("r2"===e||"h64"===e||"white"===e||"half"===e)&&(tl=e)}catch{}function al(e){return ne(e.x.div(4).add(e.y.div(2)).add(e.z.div(4)),e.x.div(2).sub(e.z.div(2)),e.x.div(-4).add(e.y.div(2)).sub(e.z.div(4)))}function rl(e,t=!0){let a=ne(e.x.add(e.y).sub(e.z),e.x.add(e.z),e.x.sub(e.y).sub(e.z));return t?Ft(a,ne(0),ne(1)):Pt(a,ne(0))}var sl=class extends yt{constructor(e,t,a,r,s=!1){super("vec4"),this._resolution=k(new us(1,1)),this._historyValid=k(0),this._jitterUV=k(new us(0,0)),this._resolveMaterials=null,this._rebuildResolveMaterials=null,this.beautyNode=e,this.depthNode=t,this.velocityNode=a,this._hdr=s,this._history=r??il(),this._ownsHistory=void 0===r,this._outputTexNode=Da(this._history.rtA.texture)}static get type(){return"SplineTAANode"}get outputTextureNode(){return this._outputTexNode}renderResolve(e){pe.setProjectionMatrix(this._history.unjitteredProjection);let t=this.beautyNode.passNode.renderTarget,a=t.texture.width,r=t.texture.height,s=this._history;(s.rtA.width!==a||s.rtA.height!==r)&&(s.resize(a,r),this._rebuildResolveMaterials?.()),this._resolution.value.set(a,r),this._historyValid.value=s.valid?1:0,this._jitterUV.value.copy(s.jitterOffsetUV);let i=s.flip?s.rtB:s.rtA,n=this._resolveMaterials?this._resolveMaterials[s.flip?1:0]:null,l=e.getRenderTarget(),o=e.getMRT();e.setMRT(null),s.valid||(e.setRenderTarget(s.rtA),e.clear(!0,!1,!1),e.setRenderTarget(s.rtB),e.clear(!0,!1,!1)),e.setRenderTarget(i),n&&(Zn.material=n,Zn.name="SplineTAA.resolve",Zn.render(e)),e.setRenderTarget(l),e.setMRT(o),this._outputTexNode.value=i.texture,s.valid=!0,s.flip=!s.flip,T.taaResolves++,T.taaJitterIndex=s.jitterIndex,T.taaHistoryValid=!0,T.taaResolveSize=`${a}x${r}`}setup(e){let t=!0===e.renderer.reversedDepthBuffer,a=!0===e.renderer.backend?.isWebGLBackend,r=!1,s=!1,i=!1,n=!1,l=!1,o=!1,u=!1,d=!1,h=!1,m=!1;try{let e=new URLSearchParams(window.location.search).get("dbgtaa");r="1"===e,s="zv"===e,i="nc"===e,n="err"===e,l="hist"===e,o="red"===e,u="ns"===e,d="fb90"===e,h="mark"===new URLSearchParams(window.location.search).get("dbgjit"),m="hold"===e}catch{}let c=this.beautyNode,p=this.velocityNode,g=this.depthNode,f=this._resolution,_=this._historyValid,y=this._jitterUV,x=e=>{let t=c.sample(e);return de(al(t.rgb),t.a)},v=e=>{let c=re(()=>{let c=W().toVar();if(h)return de(y.x.mul(400).add(.5),y.y.mul(400).add(.5),nr(.5),nr(1));let v=c,b=ae(nr(1).div(f.x),nr(1).div(f.y)).toVar(),T=[[-1,1],[0,1],[1,1],[-1,0],[0,0],[1,0],[-1,-1],[0,-1],[1,-1]].map(([e,t])=>c.add(ae(b.x.mul(e),b.y.mul(t))).toVar()),S=T,V=nr(t?-1e3:1e3).toVar(),M=ae(T[4]).toVar();for(let e=0;e<9;e++){let a=Xn(g.load(Xe(T[e].mul(Qn(f)))).r).toVar(),r=t?a.greaterThan(V):a.lessThan(V);V.assign(r.select(a,V)),M.assign(r.select(T[e],M))}let R=p.load(Xe(M.mul(f))).xy.mul(ae(.5,-.5)).toVar();s&&R.assign(ae(0,0));let z=c.sub(R).toVar(),k=a?ae(z.x,nr(1).sub(z.y)).toVar():z,A=x(v).toVar();if(r)return de(R.x.mul(20).add(.5),R.y.mul(20).add(.5),_,nr(1));if(o){let e=new js(new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]),2,2);return e.needsUpdate=!0,Da(e).sample(c)}if(l){let t=a?ae(c.x,nr(1).sub(c.y)):c;return e.sample(t)}if(n){let t=a?ae(c.x,nr(1).sub(c.y)):c,r=e.sample(k),s=e.sample(t),i=A.x,n=e=>al(e.rgb).x;return de(n(r).sub(i).abs().mul(8),n(s).sub(i).abs().mul(8),nr(0),nr(1))}let P=k.mul(f).toVar(),E=C(P.sub(.5)).add(.5).toVar(),N=P.sub(E).toVar(),B=N.mul(N.mul(N.mul(-.5).add(1)).add(-.5)).toVar(),L=N.mul(N).mul(N.mul(1.5).add(-2.5)).add(1).toVar(),I=N.mul(N.mul(N.mul(-1.5).add(2)).add(.5)).toVar(),D=N.mul(N).mul(N.mul(.5).add(-.5)).toVar(),F=L.add(I).toVar(),U=I.div(F).toVar(),O=E.sub(1).div(f).toVar(),G=E.add(2).div(f).toVar(),q=E.add(U).div(f).toVar(),H=de(0).toVar();H.addAssign(e.sample(ae(q.x,O.y)).mul(F.x.mul(B.y))),H.addAssign(e.sample(ae(O.x,q.y)).mul(B.x.mul(F.y))),H.addAssign(e.sample(ae(q.x,q.y)).mul(F.x.mul(F.y))),H.addAssign(e.sample(ae(G.x,q.y)).mul(D.x.mul(F.y))),H.addAssign(e.sample(ae(q.x,G.y)).mul(F.x.mul(D.y)));let j=de(al(H.rgb),H.a).toVar();if(m)return de(rl(j.rgb).mul(ne(1,.55,.55)),H.a);let K=x(S[0]).toVar(),$=x(S[1]).toVar(),X=x(S[2]).toVar(),Q=x(S[3]).toVar(),Z=x(S[4]).toVar(),Y=x(S[5]).toVar(),J=x(S[6]).toVar(),ee=x(S[7]).toVar(),te=x(S[8]).toVar(),re=de(Ut(K,Ut($,Ut(X,Ut(Q,Ut(Z,Ut(Y,Ut(J,Ut(ee,te))))))))).toVar(),se=de(Pt(K,Pt($,Pt(X,Pt(Q,Pt(Z,Pt(Y,Pt(J,Pt(ee,te))))))))).toVar(),ie=de(Ut($,Ut(Q,Ut(Z,Ut(Y,ee))))).toVar(),le=de(Pt($,Pt(Q,Pt(Z,Pt(Y,ee))))).toVar();re.assign(re.add(ie).mul(.5)),se.assign(se.add(le).mul(.5));let oe=se.r.sub(re.r).mul(.25).mul(.5).toVar(),ue=A.gb.toVar();u||(re.y.assign(ue.x.sub(oe)),re.z.assign(ue.y.sub(oe)),se.y.assign(ue.x.add(oe)),se.z.assign(ue.y.add(oe)));let he=de(i?j:Ft(j,re,se)).toVar(),me=d||i?nr(.9):nr(.9).mul(_),ce=de(Wt(A,he,me)).toVar(),pe=w.tapAngle,ge=Ke(c.mul(f).add(ae(pe.mul(127.1),pe.mul(311.7)))).sub(.5).mul(1/255);return de(rl(ce.rgb,!this._hdr).add(ne(ge)),ce.a)}),v=new Tt;return v.name="SplineTAA.resolve",v.colorNode=c(),v.depthTest=!1,v.depthWrite=!1,v.blending=Os,v.needsUpdate=!0,v};return this._rebuildResolveMaterials=()=>{this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose()),this._resolveMaterials=[v(Da(this._history.rtB.texture)),v(Da(this._history.rtA.texture))]},this._rebuildResolveMaterials(),this._outputTexNode}dispose(){this._ownsHistory&&this._history.dispose(),this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose(),this._resolveMaterials=null),pe.setProjectionMatrix(null)}};function il(){let e=!1;try{let t=new URLSearchParams(window.location.search).get("dbgfp16");e="1"===t||"hist"===t||"st"===t}catch{}let t=!1,a=()=>e||t,r=(e,t,r)=>{let s=new xs(e,t,{minFilter:Zs,magFilter:Zs,depthBuffer:!1});return a()?s.texture.type=as:v()&&(s.texture.internalFormat="rgba8unorm-srgb"),s.texture.name=r,s},s=r(1,1,"SplineTAA.A"),i=r(1,1,"SplineTAA.B"),n=null,l=!1,o=0,u=0,d=0,h=0;return{rtA:s,rtB:i,flip:!1,valid:!1,jitterIndex:0,unjitteredProjection:new ws,jitterOffsetUV:new us(0,0),beginJitter(e,t,a){if(l)return;let r,s;if(l=!0,(null===n||n.cam!==e)&&(n?.clearViewOffset(),n=new Yn(e)),this.unjitteredProjection.copy(e.projectionMatrix),w.unjitteredProjection.value.copy(e.projectionMatrix),"r2"===tl){let e=++this.jitterIndex;r=(.5+.7548776662466927*e)%1,s=(.5+.5698402909980532*e)%1}else if("white"===tl)this.jitterIndex++,r=Math.random(),s=Math.random();else if("h64"===tl)r=Jn(this.jitterIndex%64+1,2),s=Jn(this.jitterIndex%64+1,3),this.jitterIndex=(this.jitterIndex+1)%64;else if("half"===tl){let[e,t]=el[this.jitterIndex];r=.5+.5*(e-.5),s=.5+.5*(t-.5),this.jitterIndex=(this.jitterIndex+1)%el.length}else[r,s]=el[this.jitterIndex],this.jitterIndex=(this.jitterIndex+1)%el.length;o=t,u=a,d=r-.5,h=s-.5,w.cameraJitterPx.value.set(2*d,2*h),n.setViewOffset(t,a,d,h),this.jitterOffsetUV.set(-(r-.5)/t,-(s-.5)/a),T.taaJitterIndex=this.jitterIndex,T.taaJitterApplies++},suspendJitter(){l&&n?.clearViewOffset()},resumeJitter(){l&&null!==n&&n.setViewOffset(o,u,d,h)},endJitter(){l=!1,this.jitterOffsetUV.set(0,0),n?.clearViewOffset()},resize(e,t){this.rtA.dispose(),this.rtB.dispose(),this.rtA=r(e,t,"SplineTAA.A"),this.rtB=r(e,t,"SplineTAA.B"),this.valid=!1},setHdr(e){if(t===e)return;let r=a();t=e,a()!==r&&this.resize(this.rtA.width,this.rtA.height)},dispose(){this.rtA.dispose(),this.rtB.dispose(),this.valid=!1,l=!1,n?.clearViewOffset(),n=null}}}var nl,ll=class{constructor(){this._frames=0}get frames(){return this._frames}get stalled(){return this._frames>=3}update(e,t){this._frames=e>0&&!t?this._frames+1:0}},ol=new qa,ul=new us,dl=class extends yt{static get type(){return"SMAANode"}constructor(e){super("vec4"),this.textureNode=e,this.updateBeforeType=ge.FRAME,this._renderTargetEdges=new xs(1,1,{depthBuffer:!1,type:as}),this._renderTargetEdges.texture.name="SMAANode.edges",this._renderTargetWeights=new xs(1,1,{depthBuffer:!1,type:as}),this._renderTargetWeights.texture.name="SMAANode.weights",this._renderTargetBlend=new xs(1,1,{depthBuffer:!1,type:as}),this._renderTargetBlend.texture.name="SMAANode.blend";let t=this,a=new Image;a.crossOrigin="anonymous",a.src=es("smaa-node-area.png"),a.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new gs,this._areaTexture.name="SMAANode.area",this._areaTexture.image=a,this._areaTexture.minFilter=Zs,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;let r=new Image;r.crossOrigin="anonymous",r.src=es("smaa-node-search.png"),r.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new gs,this._searchTexture.name="SMAANode.search",this._searchTexture.image=r,this._searchTexture.magFilter=Hs,this._searchTexture.minFilter=Hs,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._invSize=k(new us),this._areaTextureUniform=Da(this._areaTexture),this._searchTextureUniform=Da(this._searchTexture),this._edgesTextureUniform=Da(this._renderTargetEdges.texture),this._weightsTextureUniform=Da(this._renderTargetWeights.texture),this._materialEdges=new Tt,this._materialEdges.name="SMAANode.edges",this._materialWeights=new Tt,this._materialWeights.name="SMAANode.weights",this._materialBlend=new Tt,this._materialBlend.name="SMAANode.blend",this._textureNode=K(this,this._renderTargetBlend.texture)}getTextureNode(){return this._textureNode}setSize(e,t){this._invSize.value.set(1/e,1/t),this._renderTargetEdges.setSize(e,t),this._renderTargetWeights.setSize(e,t),this._renderTargetBlend.setSize(e,t)}updateBefore(e){let{renderer:t}=e;nl=Ka.resetRendererState(t,nl);let a=t.getDrawingBufferSize(ul);this.setSize(a.width,a.height),t.setRenderTarget(this._renderTargetEdges),ol.material=this._materialEdges,ol.render(t),t.setRenderTarget(this._renderTargetWeights),ol.material=this._materialWeights,ol.render(t),t.setRenderTarget(this._renderTargetBlend),ol.material=this._materialBlend,ol.render(t),Ka.restoreRendererState(t,nl)}setup(e){let t=ae(.00625,.0017857142857142857),a=1/7,r=this.textureNode.uvNode||W(),s=re(()=>{let e=de(r.xy,r.xy).add(de(this._invSize.xy,this._invSize.xy).mul(de(-1,0,0,-1))),t=de(r.xy,r.xy).add(de(this._invSize.xy,this._invSize.xy).mul(de(1,0,0,1))),a=de(r.xy,r.xy).add(de(this._invSize.xy,this._invSize.xy).mul(de(-2,0,0,-2)));return Y("vec4","vOffset0").assign(e),Y("vec4","vOffset1").assign(t),Y("vec4","vOffset2").assign(a),da}),i=re(()=>{let e=Y("vec4","vOffset0"),t=Y("vec4","vOffset1"),a=Y("vec4","vOffset2"),s=ae(.1,.1),i=de().toVar(),n=this.textureNode.sample(r).rgb.toVar(),l=this.textureNode.sample(e.xy).rgb.toVar(),o=Ae(n.sub(l));i.x=Pt(o.r,o.g,o.b);let u=this.textureNode.sample(e.zw).rgb.toVar();o=Ae(n.sub(u)),i.y=Pt(o.r,o.g,o.b);let d=ga(s,i.xy).toVar();Ua(d,ae(1,1)).equal(0).discard();let h=this.textureNode.sample(t.xy).rgb.toVar();o=Ae(n.sub(h)),i.z=Pt(o.r,o.g,o.b);let m=this.textureNode.sample(t.zw).rgb.toVar();o=Ae(n.sub(m)),i.w=Pt(o.r,o.g,o.b);let c=Pt(i.x,i.y,i.z,i.w).toVar(),p=this.textureNode.sample(a.xy).rgb.toVar();o=Ae(n.sub(p)),i.z=Pt(o.r,o.g,o.b);let g=this.textureNode.sample(a.zw).rgb.toVar();return o=Ae(n.sub(g)),i.w=Pt(o.r,o.g,o.b),c=Pt(c,i.z,i.w),d.xy.mulAssign(ae(ga(nr(.5).mul(c),i.xy))),de(d,0,0)}),n=re(([e,t,a,r])=>{let s=ae(t).toVar();return s.r=a.add(s.r.mul(r)),nr(255).mul(e.sample(s)).r}),l=re(([e,r,s,i,n])=>{let l=nr(16).mul(nr(4).mul(ae(s,i)).round()).add(r);return l=t.mul(l).add(nr(.5).mul(t)),l.y.addAssign(nr(a).mul(n)),e.sample(l).rg}),o=re(([e,t,a,r])=>{let s=ae(0,1).toVar(),i=ae(a).toVar();return he({start:Ce(0),end:Ce(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(ae(2,0).mul(this._invSize)),le(i.x.lessThanEqual(r).or(s.g.lessThanEqual(nr(.8281)).or(s.r.notEqual(nr(0)))),()=>{X()})}),i.x.addAssign(nr(.25).mul(this._invSize.x)),i.x.addAssign(this._invSize.x),i.x.addAssign(nr(2).mul(this._invSize.x)),i.x.subAssign(this._invSize.x.mul(n(t,s,0,.5))),i.x}),u=re(([e,t,a,r])=>{let s=ae(0,1).toVar(),i=ae(a).toVar();return he({start:Ce(0),end:Ce(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(ae(2,0).mul(this._invSize)),le(i.x.greaterThanEqual(r).or(s.g.lessThanEqual(nr(.8281)).or(s.r.notEqual(nr(0)))),()=>{X()})}),i.x.subAssign(nr(.25).mul(this._invSize.x)),i.x.subAssign(this._invSize.x),i.x.subAssign(nr(2).mul(this._invSize.x)),i.x.addAssign(this._invSize.x.mul(n(t,s,.5,.5))),i.x}),d=re(([e,t,a,r])=>{let s=ae(1,0).toVar(),i=ae(a).toVar();return he({start:Ce(0),end:Ce(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(ae(0,-2).mul(this._invSize)),le(i.y.lessThanEqual(r).or(s.r.lessThanEqual(nr(.8281)).or(s.g.notEqual(nr(0)))),()=>{X()})}),i.y.addAssign(nr(.25).mul(this._invSize.y)),i.y.addAssign(this._invSize.y),i.y.addAssign(nr(2).mul(this._invSize.y)),i.y.subAssign(this._invSize.y.mul(n(t,s.gr,0,.5))),i.y}),h=re(([e,t,a,r])=>{let s=ae(1,0).toVar(),i=ae(a).toVar();return he({start:Ce(0),end:Ce(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(ae(0,-2).mul(this._invSize)),le(i.y.greaterThanEqual(r).or(s.r.lessThanEqual(nr(.8281)).or(s.g.notEqual(nr(0)))),()=>{X()})}),i.y.subAssign(nr(.25).mul(this._invSize.y)),i.y.subAssign(this._invSize.y),i.y.subAssign(nr(2).mul(this._invSize.y)),i.y.addAssign(this._invSize.y.mul(n(t,s.gr,.5,.5))),i.y}),m=re(()=>{let e=r.xy.div(this._invSize),t=de(r.xy,r.xy).add(de(this._invSize.xy,this._invSize.xy).mul(de(-.25,-.125,1.25,-.125))).toVar(),a=de(r.xy,r.xy).add(de(this._invSize.xy,this._invSize.xy).mul(de(-.125,-.25,-.125,1.25))).toVar(),s=de(t.xz,a.yw).add(de(-2,2,-2,2).mul(de(this._invSize.xx,this._invSize.yy)).mul(nr(8))).toVar();return Y("vec2","vPixcoord").assign(e),Y("vec4","vOffset0").assign(t),Y("vec4","vOffset1").assign(a),Y("vec4","vOffset2").assign(s),da}),c=re(()=>{let e=Y("vec2","vPixcoord"),t=Y("vec4","vOffset0"),a=Y("vec4","vOffset1"),s=Y("vec4","vOffset2"),i=de(0,0,0,0).toVar(),n=de(0,0,0,0).toVar(),m=this._edgesTextureUniform.sample(r).rg.toVar();return le(m.g.greaterThan(nr(0)),()=>{let r=ae().toVar(),d=ae().toVar();d.x=o(this._edgesTextureUniform,this._searchTextureUniform,t.xy,s.x),d.y=a.y,r.x=d.x;let h=this._edgesTextureUniform.sample(d).r.toVar(),m=ae().toVar();m.x=u(this._edgesTextureUniform,this._searchTextureUniform,t.zw,s.y),m.y=a.y,r.y=m.x,r=r.div(this._invSize.x).sub(e.x);let c=ha(Ae(r)),p=this._edgesTextureUniform.sample(m.add(ae(1,0).mul(this._invSize))).r.toVar();i.r=p,i.rg=l(this._areaTextureUniform,c,h,p,nr(n.y))}),le(m.r.greaterThan(nr(0)),()=>{let r=ae().toVar(),o=ae().toVar();o.y=d(this._edgesTextureUniform,this._searchTextureUniform,a.xy,s.z),o.x=t.x,r.x=o.y;let u=this._edgesTextureUniform.sample(o).g.toVar(),m=ae().toVar();m.y=h(this._edgesTextureUniform,this._searchTextureUniform,a.zw,s.w),m.x=t.x,r.y=m.y,r=r.div(this._invSize.y).sub(e.y);let c=ha(Ae(r)),p=this._edgesTextureUniform.sample(m.add(ae(0,1).mul(this._invSize))).g.toVar();i.ba=l(this._areaTextureUniform,c,u,p,nr(n.x))}),i}),p=re(()=>{let e=de(r.xy,r.xy).add(de(this._invSize.xy,this._invSize.xy).mul(de(1,0,0,1)));return Y("vec4","vOffset1").assign(e),da}),g=re(()=>{let e=Y("vec4","vOffset1"),t=de().toVar(),a=de().toVar();return a.xz=this._weightsTextureUniform.sample(r).xz,a.y=this._weightsTextureUniform.sample(e.zw).g,a.w=this._weightsTextureUniform.sample(e.xy).a,le(Ua(a,de(1)).lessThan(1e-5),()=>{t.assign(this.textureNode.sample(r))}).Else(()=>{let e=ae().toVar();e.x=a.a.greaterThan(a.b).select(a.a,a.b.negate()),e.y=a.g.greaterThan(a.r).select(a.g,a.r.negate()),le(Ae(e.x).greaterThan(Ae(e.y)),()=>{e.y.assign(0)}).Else(()=>{e.x.assign(0)});let s=this.textureNode.sample(r).toVar(),i=ae(r).toVar();i.addAssign(Ht(e).mul(this._invSize));let n=this.textureNode.sample(i).toVar(),l=Ae(e.x).greaterThan(Ae(e.y)).select(Ae(e.x),Ae(e.y)).toVar(),o=Wt(s,n,l);t.assign(o)}),t});return this._materialEdges.vertexNode=s().context(e.getSharedContext()),this._materialEdges.fragmentNode=i().context(e.getSharedContext()),this._materialEdges.needsUpdate=!0,this._materialWeights.vertexNode=m().context(e.getSharedContext()),this._materialWeights.fragmentNode=c().context(e.getSharedContext()),this._materialWeights.needsUpdate=!0,this._materialBlend.vertexNode=p().context(e.getSharedContext()),this._materialBlend.fragmentNode=g().context(e.getSharedContext()),this._materialBlend.needsUpdate=!0,this._textureNode}dispose(){this._renderTargetEdges.dispose(),this._renderTargetWeights.dispose(),this._renderTargetBlend.dispose(),this._areaTexture.dispose(),this._searchTexture.dispose(),this._materialEdges.dispose(),this._materialWeights.dispose(),this._materialBlend.dispose()}_getAreaTexture(){return""}_getSearchTexture(){return""}},hl=new us,ml=new Vs,cl=class{constructor(){this._rt=null,this._texNode=null,this._smaaNode=null,this._material=null,this._quad=null,this._depthTexNode=null,this._seedMaterial=null,this._seedQuad=null}_ensureTarget(e,t,a){if(null===this._rt||this._rt.width!==e||this._rt.height!==t){this._rt?.dispose();let a=new xs(e,t,{depthBuffer:!0,stencilBuffer:!1,samples:0});a.texture.name="SplineHelperOverlay.color",this._rt=a}if(null===this._texNode){this._texNode=Da(this._rt.texture),this._smaaNode=(r=this._texNode,new dl(ia(r)));let e=new Tt;e.name="SplineHelperOverlayComposite",e.fragmentNode=this._smaaNode,e.transparent=!0,e.blending=Ys,e.blendEquation=ti,e.blendSrc=ni,e.blendDst=os,e.blendSrcAlpha=ni,e.blendDstAlpha=os,e.depthTest=!1,e.depthWrite=!1,this._material=e,this._quad=new qa(e);let t=new Tt;t.name="SplineHelperOverlayDepthSeed",this._depthTexNode=Da(a),t.depthNode=this._depthTexNode.x,t.fragmentNode=de(0),t.colorWrite=!1,t.depthTest=!1,t.depthWrite=!0,this._seedMaterial=t,this._seedQuad=new qa(t)}else this._texNode.value!==this._rt.texture&&(this._texNode.value=this._rt.texture),this._depthTexNode.value!==a&&(this._depthTexNode.value=a);var r;return this._rt}render(e,t,a,r,s){e.getDrawingBufferSize(hl);let i=this._ensureTarget(hl.x,hl.y,s),n=e.getRenderTarget(),l=e.autoClear;e.getClearColor(ml);let o=e.getClearAlpha();if(e.autoClear=!1,e.setRenderTarget(i),e.setClearColor(0,0),e.clear(!0,!0,!1),this._seedQuad.render(e),t&&e.render(t,r),e.clear(!1,!0,!1),a&&e.render(a,r),e.setRenderTarget(n),e.setClearColor(ml,o),b()){let t=e.toneMapping,a=e.outputColorSpace;e.toneMapping=Ms,e.outputColorSpace=cs.workingColorSpace,this._quad.render(e),e.toneMapping=t,e.outputColorSpace=a}else this._quad.render(e);e.autoClear=l}dispose(){this._rt?.dispose(),this._rt=null,this._smaaNode?.dispose(),this._material?.dispose(),this._seedMaterial?.dispose()}},pl=new WeakMap,gl=new Set,fl=0;var _l=new WeakMap,yl=new Set,xl=0;function vl(e){let t=e.parent?.selectedTexture;return t&&!0===t.isTexture?t:null}function bl(e){let t=e.src.array,a=e.attr.array;for(let e=0,r=Math.min(t.length,a.length);e<r;e++)a[e]=t[e];e.attr.needsUpdate=!0}var Tl=new WeakMap;function wl(e,t,a,r){let s=r;switch(a){case 0:return e;case 1:return e.add(t.mul(s));case 16:{let a=nr(1).sub(nr(1).sub(e).mul(nr(1).sub(t))).toVec3();return Wt(e,a,s)}case 10:return Wt(e,e.mul(t),s);default:return Wt(e,t,s)}}var Sl=null;function Vl(){return null===Sl&&(Sl=Ta({output:E,velocity:pe})),Sl}var Ml=re(e=>{let t=e.lightDistance,a=e.cutoffDistance,r=e.decayExponent,s=a.greaterThan(0).and(r.greaterThan(0));return zt(s,t.div(a).oneMinus().clamp().pow(r),nr(1))}),Rl=class extends Za{static get type(){return"SplinePointLightNode"}setupDirect(e){let t=this.getLightVector(e),a=t.normalize(),r=Ml({lightDistance:t.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode});return{lightColor:this.colorNode.mul(r),lightDirection:a}}},Cl=class extends A{static get type(){return"SplineSpotLightNode"}setupDirect(e){let t,a,r=this.light,s=this.getLightVector(e),i=s.normalize(),n=i.dot(st(r)),l=this.getSpotAttenuation(e,n),o=Ml({lightDistance:s.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode}),u=this.colorNode.mul(l).mul(o),d=r;if(d.colorNode?(a=this.getLightCoord(e),t=d.colorNode(a)):d.map&&(a=this.getLightCoord(e),t=Da(d.map,a.xy).onRenderUpdate(()=>d.map)),t&&a){let e=a.mul(2).sub(1).abs().lessThan(1).all();u=zt(e,u.mul(t),u)}return{lightColor:u,lightDirection:i}}},zl=null,kl=new hs,Al=new hs,Pl=new Vs,El=new Vs,Nl=new Vs,Bl=new hs,Ll=new hs,Il=new us,Dl=new hs(1,0,0),Fl=new hs(0,1,0),Ul=new hs(0,0,1),Ol=new hs,Gl=new hs,ql=new hs,Wl=new hs,Hl=new ws,jl=new hs,Kl=new hs,$l=new Js,Xl=new ys,Ql=new ys,Zl=new us,Yl=new us,Jl=new hs,eo=new hs,to=new hs,ao=new hs,ro=new hs,so=[],io=!1,no=!1,lo=!1,oo="full",uo="g16",ho=!1,mo=!1,co=!1,po="default",go=!1,fo=!0,_o=!0,yo=!0,xo=!0,vo=!0,bo=vr;try{let e=new URLSearchParams(window.location.search),t=e.get("instancing");if(null!==t)if("off"===t||"0"===t||"false"===t||"no"===t)vo=!1;else{let e=Number.parseInt(t,10);Number.isFinite(e)&&e>1&&(bo=e)}io="0"===e.get("dbgao"),no="0"===e.get("dbgshadow"),lo="1"===e.get("dbgfp16"),ho="0"===e.get("dbgsky"),mo="0"===e.get("dbgssr"),co="0"===e.get("dbgibl");let a=e.get("pbrcolor");"0"===a?po="off":("linear"===a||"aces"===a||"agx"===a||"neutral"===a)&&(po=a),go="0"===e.get("dbgplanar"),fo="0"!==e.get("dbgplanarpyr"),_o="0"!==e.get("dbgssrpyr"),yo="0"!==e.get("dbgssrhalf"),xo="0"!==e.get("dbgssrresolve");let r=e.get("dbgprefilter");"0"===r?oo="off":"base"===r?oo="base":"k4"===r&&(uo="k4")}catch{}var To=class extends B{constructor(e={}){var t;super({canvas:e.canvas,alpha:e.alpha??!0,antialias:e.antialias??!1,forceWebGL:e.forceWebGL??!1,powerPreference:e.powerPreference,trackTimestamp:e.trackTimestamp??!0===globalThis.__SPLINE_TRACK_TIMESTAMP__,stencil:!1,requiredLimits:e.requiredLimits,canvasColorSpace:"display-p3",outputBufferType:lo?as:ai,asyncCompilation:!0===e.asyncCompilation||"load"===e.asyncCompilation}),this.viewportWidth=1,this.viewportHeight=1,this.resolution=new us,this.dummyCamera=new kr,this.sceneTransitionDuration=0,this.sceneTransitionTimeRemaining=-1,this.manageShadowUpdates=!1,this.forceShadowUpdates=!1,this._shadowMapMissingAtSync=!1,this.temporalAAEnabled=!0,this.hdrChainActive=!1,this.isWebGPUSplineRenderer=!0,this.shadowFilterHook=In,this._gaugeSnapshot="",this._gaugeChangedAt=0,this._gaugeStallWarned=!1,this._skipStalls=new ll,this._stallWarned=!1,this._asyncCompilationMode=!1,this._asyncLoadWarmupsInFlight=0,this.sceneBundlesEnabled=!1,this.sceneBundlesForceRerecord=!1,this._appliedWidth=-1,this._appliedHeight=-1,this._appliedRatio=-1,this._bundleStates=new WeakMap,this._skySystem=null,this._skyFeatureWarned=!1,this.skyAnimationAllowed=!1,this.skyEnvironmentNeeded=!0,this._bundledPages=new Set,this._bundleValveArmed=!1,this._destroyedSubmitErrors=0,this._destroyedSubmitLastFrame=-10,this._warmupTarget=null,this.renderStarted=!1,this._warmupInFlight=!1,this._warmupPendingTarget=null,this._warmupPendingMRT=null,this._grabWarmupTarget=null,this._warnedHelperIncompat=new WeakSet,this._maskLights=[],this._maskBlocked=!1,this._grabTargetEpoch=0,this._retiredGrabTargets=[],this._retiredGpuBuffers=[],this._bundleEpochDirty=!1,this._encodeMaterials={},this._transmissionChain=[],this._reflectionColorChain=[],this._reflectionDepthChain=[],this._reflectionPassesKey="",this._reflectionResolveMarchKey="",this._planarChain=[],this._frameSerial=0,this._asyncCompilationMode=e.asyncCompilation??!1,this._updateCompilationBurst(),ji&&function(){if(!Qi){if(Qi=!0,Xi=()=>w.frameIndex.value,typeof GPUBuffer<"u"){let e=GPUBuffer.prototype.destroy;GPUBuffer.prototype.destroy=function(){return Yi("buffer",this.label,this.size),e.call(this)}}if(typeof GPUTexture<"u"){let e=GPUTexture.prototype.destroy;GPUTexture.prototype.destroy=function(){return Yi("texture",this.label,`${this.width}x${this.height}`),e.call(this)}}console.info("[spline/webgpu] ?dbgdestroys=1 — GPU resource destroy logging armed; reproduce the error and read the [dbgdestroys] dumps")}}(),this.pipeline=new Hi(this),this.library.addLight(Pi,Ai),this.shadowMap.enabled=!0,this.shadowMap.type=Es,t=!0===this.backend?.isWebGPUBackend,vn=t,this._deferGpuBufferDestruction(),this.outputColorSpace=_s,this.toneMapping=Ms,function(e){let t=e.library;t.addLight(Rl,Sr),t.addLight(Cl,zr),t.addLight(ir,Cr),t.lightNodes.delete(li),t.lightNodes.delete(ii),t.addLight(Rl,li),t.addLight(Cl,ii)}(this),this.sceneBundlesEnabled=!0===e.sceneBundles||"rerecord"===e.sceneBundles,this.sceneBundlesForceRerecord="rerecord"===e.sceneBundles,this.domElement.removeAttribute?.("data-engine")}get lastFrameIncomplete(){return!!(this._warmupInFlight||this._compilationHasWork&&!this._gaugesStalled)||0!==(this._skippedAsyncDraws??0)&&!this._skipStalls.stalled}get _gaugesStalled(){return this._gaugeChangedAt>0&&performance.now()-this._gaugeChangedAt>To._GAUGE_STALL_MS}_trackGaugeStall(){let e=this._asyncCompilationGauges,t=void 0!==e&&(e.queued>0||e.pipelines>0),a=t?`${e.queued}/${e.pipelines}`:"";return t?a!==this._gaugeSnapshot?(this._gaugeSnapshot=a,void(this._gaugeChangedAt=performance.now())):void(this._gaugesStalled&&!this._gaugeStallWarned&&(this._gaugeStallWarned=!0,console.warn(`[spline/webgpu] async pipeline driver stalled (${a} in flight, no movement for ${To._GAUGE_STALL_MS}ms) — treating frames as final so screenshots, thumbnails and the on-demand render loop keep working.`))):(this._gaugeSnapshot="",void(this._gaugeChangedAt=0))}_trackStalledSkips(e){let t=this._compilationHasWork&&!this._gaugesStalled;this._skipStalls.update(e,t),T.stalledSkipFrames=this._skipStalls.frames,this._skipStalls.stalled&&!this._stallWarned&&(this._stallWarned=!0,console.warn(`[spline/webgpu] ${e} draw(s) are permanently skipped — their render pipelines never became ready (look for "pipeline creation failed" above). Those objects will not appear; the frame is treated as final so screenshots, thumbnails and the on-demand render loop keep working.`))}get _asyncCompilationGauges(){return this.info.asyncCompilation}get _compilationHasWork(){let e=this._asyncCompilationGauges;return void 0!==e&&(e.queued>0||e.pipelines>0)}get asyncCompilationEnabled(){return!0===this._asyncCompilation}get taaHistory(){return this._taaHistory||(this._taaHistory=il()),this._taaHistory}async init(){await super.init();let e=this.backend.gl;if(e&&"drawingBufferColorSpace"in e)try{e.drawingBufferColorSpace="display-p3"}catch(e){console.warn(e)}return this.backend.device?.lost?.then(e=>{T.deviceLost=`${e?.reason??"unknown"}: ${e?.message??""}`.trim()}),this}setSize(e,t,a=!0){if(this._appliedWidth!==e||this._appliedHeight!==t||this._appliedRatio!==this.getPixelRatio()){this._appliedWidth=e,this._appliedHeight=t,this._appliedRatio=this.getPixelRatio();let r=this.viewportWidth!==e||this.viewportHeight!==t;this.viewportWidth=e,this.viewportHeight=t,super.setSize(e,t,a),r&&this.pipeline.resize(e,t,a)}return this}setPixelRatio(e=1){return this.getPixelRatio()!==e&&super.setPixelRatio(e),this}get hdTransmission(){return 1===w.transmissionLod.value}set hdTransmission(e){w.transmissionLod.value=!0===e?1:2}renderScenePass(e,t){this.render(e,t)}get skySystem(){return this._skySystem}get skyAnimationActive(){return!0===this._skySystem?.animationActive}*_liveBundledPages(){for(let e of this._bundledPages){let t=e.deref();void 0===t?this._bundledPages.delete(e):yield t}}_armBundleValve(){if(this._bundleValveArmed)return;let e=this.backend.device;"function"==typeof e?.addEventListener&&(this._bundleValveArmed=!0,e.addEventListener("uncapturederror",e=>{if(!this.sceneBundlesEnabled||!(e?.error?.message??"").toLowerCase().includes("destroyed"))return;let t=w.frameIndex.value,a=(t-this._destroyedSubmitLastFrame+16)%16;if(this._destroyedSubmitErrors=a<=2?this._destroyedSubmitErrors+1:1,this._destroyedSubmitLastFrame=t,!(this._destroyedSubmitErrors<4)){this.sceneBundlesEnabled=!1,T.bundleDisabled=!0;for(let e of this._liveBundledPages()){let t=this._bundleStates.get(e);t&&(t.disabled=!0),e.isBundleGroup=!1}this._bundledPages.clear()}}))}_updateSceneBundle(e,t){if(void 0===this.backend.beginBundle)return;let a=this._bundleStates.get(e);if(void 0===a){let t={signature:-1,rebuilds:0,resourceRebuilds:0,checks:0,disabled:!1,camHash:0,prevCamHash:0,epoch:0,lastEpoch:0,bufferIds:new WeakMap,bufferIdSeq:0,watched:new WeakSet,onResourceDispose:()=>{t.epoch++}};a=t,this._bundleStates.set(e,a),this._bundledPages.add(new WeakRef(e)),this._armBundleValve()}let r=e;if(a.disabled)return;{let e=t.matrixWorld.elements,r=t.projectionMatrix.elements,s=-2128831035;for(let t=0;t<16;t++)s^=1e4*e[t]|0,s=Math.imul(s,16777619),s^=1e4*r[t]|0,s=Math.imul(s,16777619);a.camHash=s}let s=-2128831035,i=e=>{s^=0|e,s=Math.imul(s,16777619)};i(this._grabTargetEpoch),i(null!==e.fog?1:0);let n=a,l=e=>{let t=e;!t||"function"!=typeof t.addEventListener||n.watched.has(t)||(n.watched.add(t),t.addEventListener("dispose",n.onResourceDispose))},o=e=>{if(!e)return 0;let t=n.bufferIds.get(e);return void 0===t&&(t=++n.bufferIdSeq,n.bufferIds.set(e,t)),t},u=e=>{l(e),i(e.id),i(e.version),i(!0===e.transparent?1:0),"function"==typeof e.assetsLoaded&&i(e.assetsLoaded()?1:0)},d=!1;if(e.traverse(e=>{let t=e;if(!0===t.isMesh||!0===t.isLine||!0===t.isPoints||!0===t.isSprite){let e=t;!0===e.isDecalObject&&"function"==typeof e.updateDecal&&e.updateDecal()&&(d=!0),t.frustumCulled&&(t.frustumCulled=!1),i(t.id),i(t.visible?1:0),i(t.layers.mask),i(t.renderOrder);let a=t.geometry;l(a),i(a.id),i(a.drawRange.start),i(a.drawRange.count===1/0?-1:a.drawRange.count),i(o(a.index)),i(o(a.attributes.position)),i(a.instanceCount??-1),i(void 0===t.count?-1:t.count);let r=t.material;if(Array.isArray(r))for(let e of r)u(e);else r&&u(r)}else!0===e.isLight?(i(e.id),i(e.visible?1:0),i(e.castShadow?1:0)):(i(e.id),i(e.visible?1:0))}),i(a.epoch),a.checks++,T.bundleChecks=a.checks,a.checks%600==0){let e=this._bundleDebug;T.bundleIncompleteRecords=e?.incompleteRecords??0,T.bundleRecords=e?.records??0,T.bundleReplays=e?.replays??0,a.prevCamHash=a.camHash}if(!0!==r.isBundleGroup)return r.isBundleGroup=!0,r.static=!0,"number"!=typeof r.version&&(r.version=0),void(a.signature=s);if(this.sceneBundlesForceRerecord)return r.version=(r.version??0)+1,void(a.signature=s);if(s!==a.signature){if(a.signature=s,r.version=(r.version??0)+1,a.epoch!==a.lastEpoch)return a.lastEpoch=a.epoch,a.resourceRebuilds++,void(T.bundleResourceRebuilds=a.resourceRebuilds);if(d)return a.lastEpoch=a.epoch,a.resourceRebuilds++,void(T.bundleResourceRebuilds=a.resourceRebuilds);a.rebuilds++,T.bundleRebuilds=a.rebuilds,a.checks>30&&a.rebuilds/a.checks>.1&&(a.disabled=!0,r.isBundleGroup=!1,T.bundleDisabled=!0)}}_ensureWarmupTarget(){if(null===this._warmupTarget){let e=new xs(2,2,{count:2});e.textures[0].name="output",e.textures[0].type=ai,e.textures[1].name="velocity",e.textures[1].type=as;let t=new ls(2,2);t.isRenderTargetTexture=!0,e.depthTexture=t,this._warmupTarget=e}return this._warmupTarget}get warmupInFlight(){return this._warmupInFlight}setRenderTarget(e,t=0,a=0){this._warmupInFlight?this._warmupPendingTarget=[e,t,a]:super.setRenderTarget(e,t,a)}setMRT(e){return this._warmupInFlight?(this._warmupPendingMRT=[e],this):(super.setMRT(e),this)}async compileSceneAsync(e,t){if(!t)return;{let t=e instanceof wr?e.activePage:e;Fn(Qr.isSoft(t?.data?.shadow)),t&&_i(t)}if(!1!==this._asyncCompilationMode)return"load"===this._asyncCompilationMode&&(this._setThreeAsyncCompilation(!0),this._updateCompilationBurst()),this._compileSceneAsyncBackground(e,t);if(this.renderStarted||this._warmupInFlight)return;let a=this.getRenderTarget(),r=this.getMRT();this._warmupInFlight=!0,this._warmupPendingTarget=null,this._warmupPendingMRT=null,this._updateCompilationBurst();try{this.normalizeCameraCoordinateSystem(t),this.temporalAAEnabled&&(super.setRenderTarget(this._ensureWarmupTarget()),super.setMRT(Vl())),await this.compileAsync(e,t)}catch(e){console.warn("[spline/webgpu] pipeline warm-up failed:",e)}finally{let e=this._warmupPendingTarget,t=this._warmupPendingMRT;this._warmupInFlight=!1,this._warmupPendingTarget=null,this._warmupPendingMRT=null,this._updateCompilationBurst(),null!==e?super.setRenderTarget(e[0],e[1],e[2]):super.setRenderTarget(a),null!==t?super.setMRT(t[0]):super.setMRT(r)}}async _compileSceneAsyncBackground(e,t){this._asyncLoadWarmupsInFlight++,this._updateCompilationBurst();try{await this.init(),this.normalizeCameraCoordinateSystem(t);let a,r=this.getRenderTarget(),s=this.getMRT();try{this.temporalAAEnabled&&(super.setRenderTarget(this._ensureWarmupTarget()),super.setMRT(Vl())),a=this.compileAsync(e,t)}finally{super.setRenderTarget(r),super.setMRT(s)}let i=this._warmupGrabContext(e,t);await a,await i}catch(e){console.warn("[spline/webgpu] pipeline warm-up failed:",e)}finally{this._asyncLoadWarmupsInFlight--,this._updateCompilationBurst(),this._maybeCloseAsyncLoadWindow()}}_disposeWarmupTargets(){this._warmupTarget?.depthTexture?.dispose(),this._warmupTarget?.dispose(),this._warmupTarget=null,this._grabWarmupTarget?.depthTexture?.dispose(),this._grabWarmupTarget?.dispose(),this._grabWarmupTarget=null}_warmupGrabContext(e,t){let a=e instanceof wr?e:e.scene;if(!0!==a.needsTransmission?.()&&!0!==a.needsReflection?.())return null;if(null===this._grabWarmupTarget){let e=new xs(2,2);e.texture.type=ai;let t=new ls(2,2);t.isRenderTargetTexture=!0,e.depthTexture=t,this._grabWarmupTarget=e}let r=this.getRenderTarget(),s=this.getMRT();try{return super.setRenderTarget(this._grabWarmupTarget),super.setMRT(null),this.compileAsync(e,t)}finally{super.setRenderTarget(r),super.setMRT(s)}}_setThreeAsyncCompilation(e){this.setAsyncCompilation(e)}_updateCompilationBurst(){let e=this._warmupInFlight||this._asyncLoadWarmupsInFlight>0||"load"===this._asyncCompilationMode&&this.asyncCompilationEnabled;this.setCompilationBurst(e),T.compilationBurst=e}_maybeCloseAsyncLoadWindow(){"load"===this._asyncCompilationMode&&(!this.asyncCompilationEnabled||this._asyncLoadWarmupsInFlight>0||0!==this._frameSerial&&((this._skippedAsyncDraws??0)>0&&!this._skipStalls.stalled||this._compilationHasWork||(this._setThreeAsyncCompilation(!1),this._updateCompilationBurst())))}normalizeCameraCoordinateSystem(e){let t=e;(t.coordinateSystem!==this.coordinateSystem||void 0!==t.perspCamera&&t.perspCamera.coordinateSystem!==this.coordinateSystem||void 0!==t.orthoCamera&&t.orthoCamera.coordinateSystem!==this.coordinateSystem)&&(t.coordinateSystem=this.coordinateSystem,void 0!==t.perspCamera&&(t.perspCamera.coordinateSystem=this.coordinateSystem),void 0!==t.orthoCamera&&(t.orthoCamera.coordinateSystem=this.coordinateSystem),e.updateProjectionMatrix?.())}_prepareHelpers(e,t,a){e.traverse(e=>{let r=e;if(!0===e.isPoints){let a=function(e){if(Array.isArray(e.material)||null===e.parent||void 0===e.geometry.getAttribute("position"))return null;let t=e.material;return!0===t.isNodeMaterial?null:!0===t.isPointsMaterial?function(e,t){if(t.size<=1)return null;let a=_l.get(e);return a&&(a.epoch!==xl||a.srcMaterial!==t||a.geometry!==e.geometry||a.position.src!==e.geometry.getAttribute("position")||a.map!==t.map||a.selectedMap!==vl(e))&&(a.sprite.removeFromParent(),a.material.dispose(),a=void 0),a||(a=function(e,t){let a=e.geometry,r=a.getAttribute("position"),s=a.getAttribute("aSelection"),i=a.getAttribute("aVisibility"),n=t.map,l=vl(e),o=new Xs(r.array,3);o.setUsage(qs);let u={src:r,attr:o,version:r.version},d=[],h=e=>{let t=new Xs(new Float32Array(e.count),1);t.setUsage(qs);let a={src:e,attr:t,version:e.version};return bl(a),d.push(a),a},m=s?h(s):null,c=i?h(i):null,p=new Ba;p.name=`SplinePointsTwin(${t.name||t.type})`,p.positionNode=ve(u.attr,"vec3"),p.size=t.size,p.sizeAttenuation=t.sizeAttenuation,p.transparent=t.transparent,p.depthTest=t.depthTest,p.depthWrite=t.depthWrite,p.blending=t.blending,p.fog=!1;let g=m?ve(m.attr,"float"):null,f=c?ve(c.attr,"float"):null;p.colorNode=re(()=>{null!==f?J(f.lessThan(.5)):null!==g&&J(g.greaterThan(.5));let e=null!==n?Da(n,W()):de(1);return(null!==g&&null!==n&&null!==l?Wt(e,Da(l,W()),g):e).mul(de(St,1))})();let _=new Ns(p);_.name=`SplinePointsTwin(${e.name||e.type})`,_.frustumCulled=!1,_.raycast=()=>{};let y={sprite:_,material:p,srcMaterial:t,geometry:a,map:n,selectedMap:l,position:u,mirrors:d,epoch:xl};return yl.add(new WeakRef(y)),y}(e,t),_l.set(e,a)),a.sprite.parent!==e.parent&&e.parent.add(a.sprite),function(e,t){let{sprite:a,position:r,srcMaterial:s}=t;r.version!==r.src.version&&(t.position.attr.needsUpdate=!0,r.version=r.src.version);for(let e of t.mirrors)e.version!==e.src.version&&(bl(e),e.version=e.src.version);let i=Math.max(0,Math.min(t.geometry.drawRange.count,r.src.count));a.count=i,t.material.size=s.size,t.material.opacity=s.opacity,t.material.color.copy(s.color),a.layers.mask=e.layers.mask,a.renderOrder=e.renderOrder}(e,a),a.sprite}(e,t):function(e,t){if(!0!==t.isShaderMaterial)return!1;let a=t.uniforms,r=a?.pointSize?.value,s=a?.color?.value;return"number"==typeof r&&r>1&&Array.isArray(s)&&s.length>=3&&void 0!==e.geometry.getAttribute("hover")&&void 0!==e.geometry.getAttribute("selected")}(e,t)?function(e,t){let a=Tl.get(e);return a&&(a.epoch!==xl||a.srcMaterial!==t||a.geometry!==e.geometry||!function(e,t){let a=[[e.position,"position"],[e.hover,"hover"],[e.selected,"selected"]];for(let[e,r]of a){let a=t.getAttribute(r);if(void 0===a)return!1;if(e.src!==a){if(a.count!==e.attr.count)return!1;e.src=a,e.version=-1}}return!0}(a,e.geometry))&&(a.sprite.removeFromParent(),a.material.dispose(),a=void 0),a||(a=function(e,t){let a=e.geometry,r=t.uniforms,s=(e,t)=>{let a=new Xs(new Float32Array(e.count*t),t);a.setUsage(qs);let r={src:e,attr:a,version:e.version};return bl(r),r},i=s(a.getAttribute("position"),3),n=s(a.getAttribute("hover"),1),l=s(a.getAttribute("selected"),1),o=k(r.pointSize.value),u=k((new Vs).fromArray(r.color.value)),d=new Ba;d.name=`SplinePointsTwin(${t.name||t.type})`,d.positionNode=ve(i.attr,"vec3");let h=ve(n.attr,"float"),m=ve(l.attr,"float");d.sizeNode=o.add(h.mul(4)),d.sizeAttenuation=!1,d.transparent=t.transparent,d.depthTest=t.depthTest,d.depthWrite=t.depthWrite,d.blending=t.blending,d.fog=!1,d.colorNode=re(()=>{let e=tt(W().mul(2).sub(1)).toVar();J(e.greaterThan(1));let t=zt(m.equal(1),ne(.22,.9,.7),u.add(h.mul(.25)));return de(zt(e.greaterThan(.75),ne(1),t),1)})();let c=new Ns(d);c.name=`SplinePointsTwin(${e.name||e.type})`,c.frustumCulled=!1,c.raycast=()=>{};let p={sprite:c,material:d,srcMaterial:t,geometry:a,pointSize:o,color:u,position:i,hover:n,selected:l,epoch:xl};return yl.add(new WeakRef(p)),p}(e,t),Tl.set(e,a)),a.sprite.parent!==e.parent&&e.parent.add(a.sprite),function(e,t){for(let e of[t.position,t.hover,t.selected])e.version!==e.src.version&&(bl(e),e.version=e.src.version);let a=t.srcMaterial.uniforms;t.pointSize.value=a.pointSize.value,t.color.value.fromArray(a.color.value);let r=Math.max(0,Math.min(t.geometry.drawRange.count,t.position.src.count));t.sprite.count=r,t.material.opacity=t.srcMaterial.opacity,t.sprite.layers.mask=e.layers.mask,t.sprite.renderOrder=e.renderOrder}(e,a),a.sprite}(e,t):null}(e);if(null!==a)return a.visible=r.visible,void(r.visible&&(t.push(r),r.visible=!1))}let s=!1,i="",n=Array.isArray(r.material)?r.material:r.material?[r.material]:[];for(let e of n){let t=e;if(!0===t.isShaderMaterial&&!0!==t.isNodeMaterial){s=!0,i=`WebGL-only material "${t.type}"`;break}}if(s&&!Array.isArray(r.material)){let e=function(e){return!0===e.isLineMaterial?function(e){let t=pl.get(e);if(!t||t.epoch!==fl){let a=new Nt;a.name=`SplineHelperTwin(${e.name||e.type})`,a.worldUnits=!1,t={twin:a,epoch:fl},pl.set(e,t),gl.add(new WeakRef(a))}let a=t.twin,r=e;a.color.copy(r.color),a.linewidth=r.linewidth,a.opacity=r.opacity,a.transparent=r.transparent,a.depthTest=r.depthTest,a.depthWrite=r.depthWrite,a.side=r.side;let s=!0===r.dashed;if(a.dashed!==s&&(a.dashed=s,a.needsUpdate=!0),s){let e=a;e.dashScale=r.dashScale??1,e.dashSize=r.dashSize??1,e.gapSize=r.gapSize??1}let i=!0===r.vertexColors||2===r.vertexColors;return a.vertexColors!==i&&(a.vertexColors=i,a.needsUpdate=!0),a}(e):null}(r.material);if(e)return a.push({object:r,original:r.material}),void(r.material=e)}!s&&!0===r.geometry?.isInstancedBufferGeometry&&!Number.isFinite(r.geometry.instanceCount??0)&&(s=!0,i="infinite instanceCount geometry"),s&&r.visible&&(this._warnedHelperIncompat.has(e)||this._warnedHelperIncompat.add(e),t.push(r),r.visible=!1)})}renderHelperOverlay(e,t,a,r){let s=[],i=[];if(e&&this._prepareHelpers(e,s,i),t&&this._prepareHelpers(t,s,i),r)this._helperOverlay??(this._helperOverlay=new cl),this._helperOverlay.render(this,e,t,a,r),T.helperOverlayMode="smaa";else{let r=this.autoClear;this.autoClear=!1,e&&this.render(e,a),t&&(this.clearDepth(),this.render(t,a)),this.autoClear=r,T.helperOverlayMode="direct"}for(let e of i)e.object.material=e.original;for(let e of s)e.visible=!0}createEffectChain(){return function(e){let t=e.pipeline,a=t.postprocessingState,r=!0===a.enabled,s=q(t.scene,t.camera),i=e.hdrChainActive;try{let e=new URLSearchParams(window.location.search).get("dbgfp16");("scene"===e||"st"===e)&&(i=!0)}catch{}let n=s.getTextureNode(),l=n,o=null;if(e.temporalAAEnabled){s.setMRT(Vl()),o=function(e,t,a,r,s=!1){return new sl(e,t,a,r,s)}(n,s.getTextureNode("depth"),s.getTextureNode("velocity"),e.taaHistory,i),l=o,s.getTexture("velocity").type=as;try{if("1"===new URLSearchParams(window.location.search).get("dbgvel")){let e=s.getTextureNode("velocity");l=de(e.x.mul(20).add(.5),e.y.mul(20).add(.5),nr(.5),nr(1))}}catch{}}i?s.getTexture("output").type=as:v()&&(s.getTexture("output").internalFormat="rgba8unorm-srgb");let u=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,d={bloomIntensity:k(1),caOffset:k(new us(0,0)),vignetteOffset:k(0),vignetteDarkness:k(0),hue:k(0),saturationPlus1:k(1),brightness:k(0),contrast:k(0),dofFocusDistance:k(0),dofFocalLength:k(0),dofBokehScale:k(1),dofCameraNear:k(50),dofCameraFar:k(1e4),dofOrtho:k(0),pixelCells:k(new us(1,1)),bloomOpacity:k(1),caOpacity:k(1),vignetteOpacity:k(1),noiseOpacity:k(1),hueSaturationOpacity:k(1),brightnessContrastOpacity:k(1),dofOpacity:k(1)},h=(e,a)=>{d.bloomIntensity.value=u(e.bloom.intensity,1),d.bloomOpacity.value=u(e.bloom.opacity,1),d.caOffset.value.set(u(e.chromaticAberration.offset?.[0],0),u(e.chromaticAberration.offset?.[1],0)),d.caOpacity.value=u(e.chromaticAberration.opacity,1),d.vignetteOffset.value=u(e.vignette.offset,.5),d.vignetteDarkness.value=u(e.vignette.darkness,.5),d.vignetteOpacity.value=u(e.vignette.opacity,1),d.noiseOpacity.value=u(e.noise.opacity,1),d.hue.value=u(e.hueSaturation.hue,0),d.saturationPlus1.value=u(e.hueSaturation.saturation,0)+1,d.hueSaturationOpacity.value=u(e.hueSaturation.opacity,1),d.brightness.value=u(e.brightnessContrast.brightness,0),d.contrast.value=u(e.brightnessContrast.contrast,0),d.brightnessContrastOpacity.value=u(e.brightnessContrast.opacity,1);let r=t.camera,s=!0===r?.isPerspectiveCamera,i=u(r?.near,50),n=u(r?.far,1e4),l=n-i,o=u(e.depthOfField.focusDistance,0),h=s?o/2e3:(o+992)/2e3;d.dofFocusDistance.value=i+h*l,d.dofFocalLength.value=u(e.depthOfField.focalLength,0)/2e3*l,d.dofBokehScale.value=u(e.depthOfField.bokehScale,1),d.dofOpacity.value=u(e.depthOfField.opacity,1),d.dofCameraNear.value=i,d.dofCameraFar.value=n,d.dofOrtho.value=s?0:1;let m=a.resolution.x?a.resolution:new us(a.viewportWidth*a.getPixelRatio(),a.viewportHeight*a.getPixelRatio()),c=Math.floor(u(e.pixelation.granularity,30));c%2>0&&(c+=1);let p=c>0;d.pixelCells.value.set(p?m.x/c:m.x,p?m.y/c:m.y)};h(a,e);let m=l,c=m.rgb,p=m.a,g=r&&a.pixelation.enabled,f=d.pixelCells,_=e=>e.mul(f).floor().add(.5).div(f),y=o?o.outputTextureNode:n;if(g){let e=y.sample(_(W()));c=Wt(c,e.rgb,1),p=Wt(p,e.a,1)}let x=null;if(r&&a.bloom.enabled){let e=Yr("bloom");if(e){let t=a.bloom;x=e(o?o.outputTextureNode:n,{kernelSize:$r(t.kernelSize),blurScale:u(t.blurScale,1),luminanceThreshold:u(t.luminanceThreshold,.9),luminanceSmoothing:u(t.luminanceSmoothing,.025)});let r=Ft(x.mul(d.bloomIntensity),0,1);c=wl(c,r.rgb,t.blendFunction,d.bloomOpacity),p=function(e,t,a,r){let s=r;switch(a){case 0:return e;case 1:return e.add(t.mul(s));case 16:{let a=nr(1).sub(nr(1).sub(e).mul(nr(1).sub(t)));return Wt(e,a,s)}case 10:return Wt(e,e.mul(t),s);default:return Wt(e,t,s)}}(p,r.a,t.blendFunction,d.bloomOpacity)}else Jr("bloom","webgpu")}if(r&&a.chromaticAberration.enabled){let e=a.chromaticAberration,t=d.caOffset.mul(.001),r=g?y:n,s=e=>g?_(e):e,i=W().sub(.5),l=r.sample(s(W().add(i.mul(t)))).r,o=r.sample(s(W())).g,u=r.sample(s(W().sub(i.mul(t)))).b;c=wl(c,ne(l,o,u),e.blendFunction,d.caOpacity)}if(r&&a.vignette.enabled){let e=a.vignette,t=tt(W().sub(.5)),r=Jt(nr(.8).mul(d.vignetteOffset),d.vignetteOffset.add(.799),t.mul(d.vignetteDarkness));c=wl(c,c.mul(r.oneMinus()),e.blendFunction,d.vignetteOpacity)}if(r&&a.noise.enabled){let e=a.noise,t=L(Xt(Ua(W().add(L(Qa)),ae(12.9898,78.233))).mul(43758.5453));c=wl(c,ne(t),e.blendFunction,d.noiseOpacity)}if(r&&a.hueSaturation.enabled){let e=a.hueSaturation,t=oe(c,d.hue);t=_t(t,d.saturationPlus1),c=wl(c,t,e.blendFunction,d.hueSaturationOpacity)}if(r&&a.brightnessContrast.enabled){let e=a.brightnessContrast,t=c.add(ne(d.brightness));t=t.sub(.5).mul(d.contrast.add(1)).add(.5),c=wl(c,M(t),e.blendFunction,d.brightnessContrastOpacity)}if(r&&a.depthOfField.enabled){let e=Yr("depthOfField");if(e){let t=a.depthOfField,r=s.getTextureNode("depth"),i=Wt(Z(r,d.dofCameraNear,d.dofCameraFar),z(r,d.dofCameraNear,d.dofCameraFar),d.dofOrtho);c=wl(c,e(de(c,p),i,d.dofFocusDistance,d.dofFocalLength,d.dofBokehScale).rgb,t.blendFunction,d.dofOpacity)}else Jr("depthOfField","webgpu")}let b=de(c,p);if(t.uiOverlayEnabled&&t.uiCanvasTexture){let e=Da(t.uiCanvasTexture,W()),a=Wt(b.rgb,e.rgb.div(Ft(e.a,1e-4,1)),e.a),r=Ft(b.a.add(e.a),0,1);b=de(a,r)}let T=t.sceneTransitionFromTexture;if(T){let e=Da(T,W()),a=t.sceneTransitionPass.uniforms.mixRatio;b=Wt(e,b,a)}let w=t.watermarkTexture;if(w){let t=w.image,a=t?.width||128,r=t?.height||32,s=new us(e.viewportWidth*e.getPixelRatio(),e.viewportHeight*e.getPixelRatio()),i=12*e.getPixelRatio(),n=.5*a*e.getPixelRatio(),l=.5*r*e.getPixelRatio(),o=ae((s.x-n-i)/s.x,i/s.y),u=ae(n/s.x,l/s.y),d=W().sub(o).div(u),h=d.x.greaterThanEqual(0).and(d.x.lessThanEqual(1)).and(d.y.greaterThanEqual(0)).and(d.y.lessThanEqual(1)),m=Ft(d,0,1),c=Da(w,m),p=c.a.mul(h.select(nr(1),nr(0)));b=de(Wt(b.rgb,c.rgb,p),Ft(b.a.add(p),0,1))}let S=new I(e,b);return{syncValues:h,render(){s.scene=t.scene,s.camera=t.camera,S.render()},renderTAAResolve:o?e=>{s.scene=t.scene,s.camera=t.camera,o.renderResolve(e)}:null,renderBloomPasses:x?e=>{s.scene=t.scene,s.camera=t.camera,x.renderBloom(e)}:null,resize(){},sceneDepthTexture:()=>s.renderTarget?.depthTexture??null,dispose(){o?.dispose(),x?.dispose(),s.dispose(),S.dispose()}}}(this)}renderSplineSceneWithDummyCamera(e,t,a=1){this.dummyCamera.updateCameraState(t.dataPatched),this.dummyCamera.matrix.copy(t.matrixWorld);let r=t.height,s=t.width,i=this.viewportWidth/this.viewportHeight;s<r?s=r*i:r=s/i,this.dummyCamera.setViewplaneSize(s,r);for(let t=0;t<a;t++)this.renderSplineScene(e,this.dummyCamera)}renderSplineScene(a,r,{sceneHelpers:s=this.sceneHelpers,sceneHelpersOnTop:i=this.sceneHelpersOnTop}={}){if(this._warmupInFlight)return;this._maybeCloseAsyncLoadWindow(),this._frameSerial++,this._disposeRetiredGrabTargets(),(cr()?.drainRetired()??0)+(d()?.drainRetired()??0)>0&&this._retireBundleRecords(),ji&&function(e){if(null==e||e===Zi)return;let t=e;"function"==typeof t.addEventListener&&(Zi=e,t.addEventListener("uncapturederror",e=>{let t=e?.error?.message??"";!t.toLowerCase().includes("destroyed")||$i<=0||($i--,console.warn(`[spline/webgpu][dbgdestroys] submit rejected at frame ${Xi()} (t=${Math.round(performance.now())}ms):\n${t.slice(0,400)}\n— last ${Ki.length} destroy() calls, newest last (a stack WITHOUT _disposeRetiredGrabTargets bypassed the deferral):`,Ki.map(e=>({...e}))))}))}(this.backend.device);let n=this._skippedAsyncDraws??0;T.skippedAsyncDraws=n,this._skippedAsyncDraws=0,this._trackStalledSkips(n),this._trackGaugeStall(),g(this);let l=a instanceof wr?a.activePage:a,u=l.visible;l.visible=!0;let h=l.scene;if(_i(l),this.renderStarted=!0,vo&&a instanceof wr){let e=a.updateInstanceGroups(l,bo);T.instancingGroups=e.instancingGroups,T.instancedDrawsSaved=e.instancedDrawsSaved,T.instancingRegroups=e.instancingRegroups,T.instancingParks=e.instancingParks,T.instancingIneligible=e.instancingIneligible}this.sceneBundlesEnabled&&this._bundleEpochDirty&&(this._bundleEpochDirty=!1,this._updateSceneBundle(l,r)),this.normalizeCameraCoordinateSystem(r),this._applyCIOffscreenTargetIfRequested(),this.setClearColor(l.bgColor,l.bgColor.a),void 0!==this.clearAlphaOverride&&this.setClearAlpha(this.clearAlphaOverride);let m=ho?null:l.skyState;if(!0===m?.enabled){if(this.skyEnvironmentNeeded=!mo&&(h.needsReflectionDirty||h.needsReflection())||!co&&!0===m.lighting,null===this._skySystem){let e=zl;null===e?this._skyFeatureWarned||(this._skyFeatureWarned=!0,console.warn("[spline] scene uses the atmospheric sky, but the sky feature is compiled out of this build")):this._skySystem=e(this)}this._skySystem?.update(l,r)}else this._skySystem?.attached&&this._skySystem.detach();let c=null,p=0;!co&&!0===m?.enabled&&this._skySystem&&(c=this._skySystem.iblTexture??null,p=this._skySystem.iblRotationY??0),function(e){if(Vi.quality===e)return!1;Vi.quality=e;for(let e of Mi)Ri(e)}("low"===m?.lightingQuality?"low":"full"),function(e){if(Vi.texture===e)return!1;Vi.texture=e,Vi.version++;for(let e of Mi)Ri(e)}(c),Vi.rotation.set(0,-p,0),l.environmentIntensity=!0===m?.enabled?m.lightingIntensity??1:1;{let e="off"===po?null:l.gradingState,t="default"!==po&&"off"!==po,a=t||"linear"===e?.pipeline,r=t?"linear"===po?"none":po:e?.toneMapping??"aces";this.toneMapping=a?"aces"===r?zs:"agx"===r?ks:"neutral"===r?As:Ms:Ms,this.toneMappingExposure=a?e?.exposure??1:1,this.outputColorSpace=a?ps:_s,this.hdrChainActive=a,this.temporalAAEnabled&&this.taaHistory.setHdr(a)}w.pixelRatio.value=this.getPixelRatio(),0!==this.resolution.x&&0!==this.resolution.y?w.resolution.value.set(this.resolution.x,this.resolution.y):w.resolution.value.set(this.viewportWidth*this.getPixelRatio(),this.viewportHeight*this.getPixelRatio());let f=(w.frameIndex.value+1)%16;w.frameIndex.value=f;let _=Mn[f];w.pcssHalton.value.set(_[0],_[1]),w.tapAngle.value=Math.random()*Math.PI*2,w.tapAngle2.value=Math.random()*Math.PI*2,this._syncLightState(l),w.unjitteredProjection.value.copy(r.projectionMatrix);let y=this.temporalAAEnabled?this.taaHistory:null;if(y){let e=this.getDrawingBufferSize(Yl);y.beginJitter(r,e.x,e.y)}this._renderShadowMaskPass(l,r),w.orthographicUniform.value=0===r.projectionMatrix.elements[11]?1:0;let x=h.shapeBlendIntances.length>0?o():null;if(null!==x)for(let e of h.shapeBlendIntances)x(e).update(e,this,r);let v=h.hairInstances.length>0?hr():null;if(null!==v)for(let e of h.hairInstances)v(e).update(e,this);h.needsTransmission()&&this._renderTransmissionPass(l,r),h.needsNormal()&&this._renderNormalPass(l,r,h.normalPassNeeds()),l.overrideMaterial=h.wireframeState?Tr:null,r.layers.enable(3),r.layers.enable(8),r.layers.enable(4);let b=l.data.ao,S=b.occlusion&&!io&&!e.enabled;if(w.aoEnabled.value=S,w.aoEnabledUniform.value=S?1:0,S){let e=this,t=e._skippedAsyncDraws??0;this._renderAOPass(l,r,b),(e._skippedAsyncDraws??0)>t&&(w.aoEnabledUniform.value=0)}if(!mo&&h.needsReflection()?(this._renderReflectionPass(l,r),go?w.reflectionPlanarEnabled.value=0:this._renderPlanarReflectionPass(l,r),this._renderReflectionResolvePass(l,r)):w.reflectionResolveEnabled.value=0,this.sceneBundlesEnabled&&this._updateSceneBundle(l,r),this.pipeline.isUIOverlayEnabled&&l.uiCanvas?.enabled&&l.uiCanvas.texture&&l.uiCanvas.texture.image.width>0){let e=this.getPixelRatio();(l.uiCanvas.width!==this.viewportWidth||l.uiCanvas.height!==this.viewportHeight||l.uiCanvas.dpr!==e)&&l.uiCanvas.applySize({width:this.viewportWidth,height:this.viewportHeight},e),l.uiCanvas.render(this),this.pipeline.uiCanvasTexture=l.uiCanvas.texture,this.pipeline.uiOverlayEnabled=!0}else this.pipeline.uiOverlayEnabled=!1;this.pipeline.sceneHelpers=s,this.pipeline.sceneHelpersOnTop=i,this.pipeline.scene=l,this.pipeline.camera=r;let V=t(l.postprocessing);this.pipeline.postprocessingState!==V&&this.pipeline.updatePostprocessing(V),this.pipeline.render(),y?.endJitter(),T.outputInterpositions=this._frameBufferTargets?.size??0,this.manageShadowUpdates&&(h.shadowsDirty=this._shadowMapMissingAtSync||this.lastFrameIncomplete),r instanceof kr&&r.copyHistory(),l.visible=u}_fitDirectionalShadowRange(e,t,a){if(0===a)return;let r=e.shadow.camera,s=e.shadow;s.__speRangeEnvelope||(s.__speRangeEnvelope={near:r.near,far:r.far});let i=s.__speRangeEnvelope.near,n=e.data?.depth??s.__speRangeEnvelope.far;if(s.__speRangeEnvelope.far=n,to.setFromMatrixPosition(e.matrixWorld),e.target?(e.target.updateMatrixWorld(),ao.setFromMatrixPosition(e.target.matrixWorld)):ao.set(0,0,0),ro.subVectors(ao,to),ro.lengthSq()<1e-10)return;ro.normalize();let l=1/0,o=-1/0;for(let e=0;e<a;e++){let a=4*e,r=(t[a]-to.x)*ro.x+(t[a+1]-to.y)*ro.y+(t[a+2]-to.z)*ro.z,s=t[a+3];r-s<l&&(l=r-s),r+s>o&&(o=r+s)}let u=Math.max(10,.05*(o-l)),d=25*Math.floor((l-u)/25),h=25*Math.ceil((o+u)/25);d=Math.max(d,i),h=Math.min(h,n),h-d>=1&&(r.near!==d||r.far!==h)&&(r.near=d,r.far=h,r.updateProjectionMatrix())}_gatherShadowBounds(e){let t=0;return e.traverseVisible(e=>{let a=e;if(!0!==a.castShadow&&!0!==a.receiveShadow)return;if(!0===a.isHairSystem){let e=a.shadowBoundsRadius??0;if(e>0){Jl.setFromMatrixPosition(a.matrixWorld);let r=4*t;so[r]=Jl.x,so[r+1]=Jl.y,so[r+2]=Jl.z,so[r+3]=e,t++}return}if(!0!==a.isMesh||!a.geometry||!0===a.isInstanceGroup)return;let r=a.geometry.boundingSphere;null===r&&(a.geometry.computeBoundingSphere(),r=a.geometry.boundingSphere);let s=a;if(!0===s.isInstancedMesh&&(null===s.boundingSphere&&s.computeBoundingSphere(),r=s.boundingSphere??r),!r||!Number.isFinite(r.radius)||r.radius<=0)return;Jl.copy(r.center).applyMatrix4(a.matrixWorld),eo.setFromMatrixScale(a.matrixWorld);let i=r.radius*Math.max(Math.abs(eo.x),Math.abs(eo.y),Math.abs(eo.z)),n=4*t;so[n]=Jl.x,so[n+1]=Jl.y,so[n+2]=Jl.z,so[n+3]=i,t++}),t}_syncLightState(e){let t=Qr.isSoft(e.data.shadow);Fn(t),T.shadowTypeSoft=t,function(e){switch(e){case"low":Rn=8;break;case"high":Rn=32;break;default:Rn=16}}(e.data.shadow?.softShadowQuality),t&&Sn()&&(hn||(this.initTexture?.(rn()),hn=!0));let r=-1;T.pcssLights=0,T.pcssPyramidActive=0,this._maskLights.length=0,this._maskBlocked=!1,T.nodeResurrections=this._nodes?._spResurrections??0;let s=!1,i=w.toonLightData.array,n=0,l=this.manageShadowUpdates,o=e.scene.shadowsDirty||this.forceShadowUpdates;this._shadowMapMissingAtSync=!1,e.traverseVisible(u=>{let d=u;if(a(d)&&(e.scene.shadowsDirty=!0),l&&(d.isPointLight||d.isSpotLight||d.isDirectionalLight)&&d.shadow&&(d.shadow.autoUpdate=o,o&&!0===d.castShadow&&null==d.shadow.map&&(this._shadowMapMissingAtSync=!0)),no&&(d.isPointLight||d.isSpotLight||d.isDirectionalLight)&&d.castShadow&&(d.castShadow=!1),d.isPointLight&&d.castShadow&&d.shadow&&(function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Wn&&T.pcssForeignFilter++:(e.filterNode=Wn,T.pcssInstalled++)}(d.shadow),kn(d.shadow),T.pcssLights++),(d.isSpotLight||d.isDirectionalLight)&&d.castShadow&&d.shadow){d.isDirectionalLight&&(r<0&&(r=this._gatherShadowBounds(e)),this._fitDirectionalShadowRange(d,so,r)),function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==qn&&T.pcssForeignFilter++:(Object.defineProperty(e,"penumbraSize",{get:()=>d.data?.penumbraSize??.5,configurable:!0}),e.filterNode=qn,T.pcssInstalled++)}(d.shadow);let a,i=!l||o||!0===d.shadow.needsUpdate;if(t&&Sn()&&(i?function(e){let t=e;t.__spePcssPyramid&&(t.__spePcssPyramid.fresh=!1)}(d.shadow):un(d.shadow)||function(e,t){let a=t,r=a.map?.depthTexture??null;if(null==r)return!1;let s=ln(t);if(function(e){let t=ln(e);if(t.slot>=0)return t.slot;for(let a=0;a<8;a++){let r=on[a];if(null===r||void 0===r.deref())return on[a]=new WeakRef(e),t.slot=a,a}return-1}(t)<0)return!1;let i=Math.max(1,Math.round(a.mapSize?.x??2048)),n=8*s.slot,l=`${r.uuid}:${i}`;s.passKey!==l&&(s.toMid?.material?.dispose(),s.toSmall?.material?.dispose(),null===s.mid&&(s.mid=tn(64,64),s.mid.texture.name="SplinePCSSPyramidMid"),null===s.small&&(s.small=tn(8,8),s.small.texture.name="SplinePCSSPyramidSmall"),s.toMid=new qa(sn(`SplinePCSSPyramidToMid${i}`,r,Math.ceil(i/64),i-1,!1,0)),s.toSmall=new qa(sn("SplinePCSSPyramidToSmall",s.mid.texture,8,63,!0,0)),s.passKey=l),rn();let o=e.getRenderTarget();e.setRenderTarget(s.mid),s.toMid.render(e),e.setRenderTarget(s.small),s.toSmall.render(e),e.setRenderTarget(o),mn.set(n,0,0),e.copyTextureToTexture(s.small.texture,an.texture,null,mn),s.fresh=!0,T.pcssPyramidBuilds++}(this,d.shadow),a={slot:dn(d.shadow),fresh:un(d.shadow)}),t&&Vn()&&(zn(d.shadow,-1),this._maskLights.push({light:d,shadow:d.shadow}),(i||null==d.shadow.map)&&(this._maskBlocked=!0)),kn(d.shadow,d.data?.penumbraSize??.5,a)&&T.pcssPyramidActive++,!s){s=!0;let e=d.shadow;T.pcssRadius0=e.radius??-1,T.pcssPenumbra0=e.penumbraSize??-1}T.pcssLights++}if(!(n>=f))if(d.isPointLight||d.isSpotLight)Al.setFromMatrixPosition(d.matrixWorld),i[n].set(Al.x,Al.y,Al.z,0),n++;else if(d.isDirectionalLight&&d.target){d.target.updateMatrixWorld();let e=Al;e.setFromMatrixPosition(d.matrixWorld),e.sub(kl.setFromMatrixPosition(d.target.matrixWorld)).normalize(),i[n].set(e.x,e.y,e.z,1),n++}}),w.toonLightCount.value=n}_renderShadowMaskPass(e,t){let a=0;if(Vn()&&this.manageShadowUpdates&&!this._maskBlocked&&this._maskLights.length>=1&&this._maskLights.length<=4&&this._maskLights.every(e=>null!=e.shadow.map?.depthTexture)){this._shadowMask??(this._shadowMask=new $n);let{targetsChanged:r}=this._shadowMask.render(this,e,t,this._maskLights);r&&this._grabTargetEpoch++,a=this._maskLights.length}w.shadowMaskEnabled.value=a>0?1:0,T.shadowMaskActive=a}retireRenderTarget(e){e&&this._retiredGrabTargets.push(e),this._grabTargetEpoch++}_disposeRetiredGrabTargets(){if(this._retiredGrabTargets.length>0){for(let e of this._retiredGrabTargets)e.dispose();this._retiredGrabTargets.length=0}if(this._retiredGpuBuffers.length>0){for(let e of this._retiredGpuBuffers)try{e.destroy()}catch{}this._retiredGpuBuffers.length=0}}_retireBundleRecords(){for(let e of this._liveBundledPages())this._bundleStates.get(e)?.onResourceDispose();this._bundleEpochDirty=!0}_deferGpuBufferDestruction(){let e=this.backend,t=this._retiredGpuBuffers;e.destroyUniformBuffer=a=>{let r=e.get(a);r?.buffer&&t.push(r.buffer),e.delete(a),this._retireBundleRecords()};let a=e.attributeUtils;if(a){let r=a._getBufferAttribute.bind(a);a.destroyAttribute=a=>{let s=e.get(r(a));s?.buffer&&t.push(s.buffer),e.delete(a),this._retireBundleRecords()}}}_reallocGrabTarget(e,t,a,r){return e&&e.width===t&&e.height===a?e:(this.retireRenderTarget(e),r())}_withShadowUpdatesSuspended(e,t){let a=[];e.traverse(e=>{let t=e;if(t.isLight&&t.shadow){if(null==t.shadow.map)return;a.push({shadow:t.shadow,auto:t.shadow.autoUpdate,needs:t.shadow.needsUpdate}),t.shadow.autoUpdate=!1,t.shadow.needsUpdate=!1}});try{t()}finally{for(let e of a)e.shadow.autoUpdate=e.auto,e.shadow.needsUpdate=e.needs}}_renderPrepass(e,t){this._withShadowUpdatesSuspended(e,()=>{this.render(e,t)})}_renderAOPass(e,t,a){let r=this.getDrawingBufferSize(Yl),s=Math.max(1,Math.round(r.x)),i=Math.max(1,Math.round(r.y));this._aoRenderTarget=this._reallocGrabTarget(this._aoRenderTarget,s,i,()=>new xs(s,i,{depthBuffer:!1})),w.aoRenderTarget.value=this._aoRenderTarget.texture,this._hbao||(this._hbao=new Si);let n=e;this._hbao.render(this,e,t,{radius:a.radius,bias:a.bias??.5,aoFullRes:!0===a.aoFullRes,aoColor:n.aoColor??{r:0,g:0,b:0},fogEnabled:null!==(n.fog??null),fogNear:n.backupFog?.near??1,fogFar:n.backupFog?.far??1e3,fogMode:Kr.getModeIndex({mode:e.fogMode}),fogDensity:e.fogDensity??Kr.getDensity({}),fogHeightFalloff:e.fogHeightFalloff??Kr.getHeightFalloff({}),fogHeightBase:e.fogHeightBase??Kr.getHeightBase({})},this.pipeline.blueNoiseTexture,this._aoRenderTarget)}_renderNormalPass(e,t,a){let r=a.outline&&a.cavity?"both":a.cavity?"normals":"hash",s=this.getDrawingBufferSize(Yl),i=Math.max(1,Math.round(s.x)),n=Math.max(1,Math.round(s.y));void 0!==this._normalTarget&&this._normalTargetFlavor!==r&&(this.retireRenderTarget(this._normalTarget),this._normalTarget=void 0),this._normalTargetFlavor=r,this._normalTarget=this._reallocGrabTarget(this._normalTarget,i,n,()=>{let e=new xs(i,n,{count:"both"===r?2:1,type:"normals"===r?as:ts,depthTexture:new ls(i,n)});"both"===r&&(e.textures[0].name="g0",e.textures[1].name="g1",e.textures[1].type=as);for(let t of e.textures)t.minFilter=Hs,t.magFilter=Hs;return e});let l=this._encodeMaterials[r];if(void 0===l){this._depthContrastUniform??(this._depthContrastUniform=k(1));let e=new Tt;e.name=`SplineNormalPassEncode_${r}`;let t=nt("randomColor","vec3"),a=()=>{let e=Ja(Xa),a=za.sub(.5).mul(this._depthContrastUniform).add(.5),r=Wt(Wt(t,e,.2),ne(a),.4);return de(r,t.x)},s=()=>{let e=Ja(Ha),a=zt(D,e,e.negate());return de(a,t.x)};e.fragmentNode="both"===r?Ta({g0:a(),g1:s()}):"normals"===r?s():a(),e.lights=!1,e.blending=Os,e.needsUpdate=!0,this._encodeMaterials[r]=e,l=e}this._depthContrastUniform.value=t instanceof kr?(t.far-t.near)/1e4:1;let o=e.overrideMaterial,u=this.getRenderTarget(),d=this.getClearColor(Pl),h=this.getClearAlpha();t.layers.enable(8),t.layers.disable(0),t.layers.disable(3),e.overrideMaterial=l,this.setClearColor(0,0),this.setRenderTarget(this._normalTarget),this._renderPrepass(e,t),this.setRenderTarget(u),this.setClearColor(d,h),e.overrideMaterial=o,t.layers.enable(0),t.layers.enable(3);let m=this._normalTarget.textures;w.normalRenderTarget.value="normals"===r?_:m[0],w.normalRenderTargetDepth.value=this._normalTarget.depthTexture,w.normalViewRenderTarget.value="both"===r?m[1]:"normals"===r?m[0]:_}blitTextureToTarget(e,t){let a=this._uiBlitPass;if(!a){let e=Da(_),t=new Tt;t.name="SplineUICanvasBlit",t.fragmentNode=e.sample(W()),t.lights=!1,t.blending=Os,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,a={quad:new qa(t),input:e},this._uiBlitPass=a}let r=this.getRenderTarget(),s=this.getMRT();a.input.value=e,this.setMRT(null),this.setRenderTarget(t),this.clear(),a.quad.render(this),this.setRenderTarget(r),this.setMRT(s)}_getPrefilterPass(e){this._prefilterPasses||(this._prefilterPasses=[]);let t=this._prefilterPasses[e];if(t)return t;let a=Da(_),r=k(new us(1,0)),s=new Tt;s.name="SplineTransmissionPrefilter";let i=W(),n=r,l=e=>a.sample(i.add(n.mul(e))).rgb,o=l(0).mul(.40262).add(l(1.182408).mul(.29869)).add(l(-1.182408).mul(.29869));return s.fragmentNode=de(o,1),s.lights=!1,s.blending=Os,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,t={quad:new qa(s),input:a,step:r},this._prefilterPasses[e]=t,t}_getDownsamplePass(e){this._downsamplePasses||(this._downsamplePasses=[]);let t=this._downsamplePasses[e];return t||(t=this._buildDownsamplePassEntry(uo,"SplineTransmissionDownsample"),this._downsamplePasses[e]=t,t)}_buildDownsamplePassEntry(e,t){let a=Da(_),r=k(new us(1,1)),s=new Tt;s.name=t;let i=W(),n=r,l=(e,t)=>a.sample(i.add(ae(e,t).mul(n))).rgb,o=null;if("k4"===e)for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let a=(0===t?2:1)*(0===e?2:1)/16,r=l(t,e).mul(a);o=o?o.add(r):r}else{let e=[-1.5,-.5,.5,1.5],t=[.1665,.3335,.3335,.1665];for(let a=0;a<4;a++)for(let r=0;r<4;r++){let s=t[r]*t[a],i=l(e[r],e[a]).mul(s);o=o?o.add(i):i}}return s.fragmentNode=de(o,1),s.lights=!1,s.blending=Os,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,{quad:new qa(s),input:a,step:r}}_getPlanarDownsamplePass(e){this._planarDownsamplePasses||(this._planarDownsamplePasses=[]);let t=this._planarDownsamplePasses[e];return t||(t=this._buildDownsamplePassEntry("g16","SplinePlanarDownsample"),this._planarDownsamplePasses[e]=t,t)}_batchedMipCopies(e){let t=this.backend,a=t?.device;if(!a||"function"!=typeof t?.get){for(let t of e)this.copyTextureToTexture(t.src,t.dst,null,null,0,t.dstLevel);return}let r=a.createCommandEncoder({label:"SplineCascadeMipCopies"}),s=0;for(let a of e){let e=t.get(a.src)?.texture,i=t.get(a.dst)?.texture;e&&i?(r.copyTextureToTexture({texture:e,mipLevel:0,origin:{x:0,y:0,z:0}},{texture:i,mipLevel:a.dstLevel,origin:{x:0,y:0,z:0}},{width:a.width,height:a.height,depthOrArrayLayers:1}),s++):this.copyTextureToTexture(a.src,a.dst,null,null,0,a.dstLevel)}s>0&&a.queue.submit([r.finish()])}_getReflectionDownsamplePass(e){this._reflectionDownsamplePasses||(this._reflectionDownsamplePasses=[]);let t=this._reflectionDownsamplePasses[e];return t||(t=this._buildDownsamplePassEntry("g16","SplineReflectionDownsample"),this._reflectionDownsamplePasses[e]=t,t)}_renderTransmissionPass(e,t){let a=this.getDrawingBufferSize(Yl),r=this.hdTransmission?1:2,s=Math.max(1,Math.round(a.x/r)),i=Math.max(1,Math.round(a.y/r)),n=!0===this.backend?.isWebGPUBackend?oo:"off";this._transmissionTarget=this._reallocGrabTarget(this._transmissionTarget,s,i,()=>{let e=new xs(s,i,{depthBuffer:!0}),t=e.texture;return"off"===n?(t.generateMipmaps=!0,t.minFilter=ei):(t.generateMipmaps=!1,t.minFilter=Zs),t.magFilter=Zs,e});let l=[];e.traverse(e=>{let t=e;if(!(t.isMesh||t.isLine||t.isPoints||t.isSprite))return;let a=t.layers;a&&8&a.mask&&8!==a.mask&&(l.push({layers:a,mask:a.mask}),a.mask=8)});let o=this.getRenderTarget();t.layers.disable(3),this.setRenderTarget(this._transmissionTarget),this._renderPrepass(e,t),this.setRenderTarget(o),t.layers.enable(3);for(let e of l)e.layers.mask=e.mask;let u=this._transmissionTarget.texture;if("off"!==n){let e=(e,t)=>{let a=new xs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Zs,a.texture.magFilter=Zs,a};this._transmissionBlurTmp=this._reallocGrabTarget(this._transmissionBlurTmp,s,i,()=>e(s,i));let t=Math.floor(Math.log2(Math.max(s,i)))+1,a=this._transmissionBlurTarget;this._transmissionBlurTarget=this._reallocGrabTarget(this._transmissionBlurTarget,s,i,()=>{let e=new xs(s,i,{depthBuffer:!1}),a=e.texture;return a.minFilter=ei,a.magFilter=Zs,"base"===n?a.generateMipmaps=!0:(a.generateMipmaps=!1,a.mipmaps=Array.from({length:t},(e,t)=>({width:Math.max(1,s>>t),height:Math.max(1,i>>t)}))),e}),"full"===n&&this._transmissionBlurTarget!==a&&this.initTexture(this._transmissionBlurTarget.texture);let r=this._getPrefilterPass(0);r.input.value=this._transmissionTarget.texture,r.step.value.set(1/s,0),this.setRenderTarget(this._transmissionBlurTmp),r.quad.render(this);let l=this._getPrefilterPass(1);if(l.input.value=this._transmissionBlurTmp.texture,l.step.value.set(0,1/i),"base"===n)this.setRenderTarget(this._transmissionBlurTarget),l.quad.render(this);else{for(let a=0;a<t;a++)this._transmissionChain[a]=this._reallocGrabTarget(this._transmissionChain[a],Math.max(1,s>>a),Math.max(1,i>>a),()=>e(Math.max(1,s>>a),Math.max(1,i>>a)));for(let e=t;e<this._transmissionChain.length;e++)this._transmissionChain[e]?.dispose(),this._transmissionChain[e]=void 0;this._transmissionChain.length=t,this.setRenderTarget(this._transmissionChain[0]),l.quad.render(this);for(let e=1;e<t;e++){let t=this._transmissionChain[e-1],a=this._getDownsamplePass(e-1);a.input.value=t.texture,a.step.value.set(1/t.width,1/t.height),this.setRenderTarget(this._transmissionChain[e]),a.quad.render(this)}for(let e=0;e<t;e++)this.copyTextureToTexture(this._transmissionChain[e].texture,this._transmissionBlurTarget.texture,null,null,0,e)}this.setRenderTarget(o),u=this._transmissionBlurTarget.texture}w.transmissionRenderTarget.value=u,w.transmissionActualSize.value.set(s,i),w.aspectRatio.value=a.x>=a.y?w.aspectRatio.value.set(a.y/a.x,1):w.aspectRatio.value.set(1,a.x/a.y)}_buildReflectionDepthPasses(e,t,a){if(this._reflectionDepthPasses)for(let e of this._reflectionDepthPasses)e?.quad.material?.dispose();let r=[];{let e=new Tt;e.name="SplineReflectionDepthBlit";let t=Da(this._reflectionTarget.depthTexture);e.fragmentNode=de(ne(t.sample(W())),1),e.lights=!1,e.blending=Os,e.depthTest=!1,e.depthWrite=!1,e.needsUpdate=!0,r.push({quad:new qa(e)})}for(let s=1;s<a;s++){let a=Math.max(1,e>>s-1),i=Math.max(1,t>>s-1),n=new Tt;n.name=`SplineReflectionDepthMin${s}`;let l=Da(this._reflectionDepthChain[s-1].texture),o=bt,u=Ce(o.x).mul(2),d=Ce(o.y).mul(2),h=(e,t)=>l.load(Xe(u.add(e),d.add(t))).x,m=(e,t)=>Ut(e,t),c=m(m(h(0,0),h(1,0)),m(h(1,1),h(0,1))),p=!!(1&a),g=!!(1&i);p&&(c=m(c,m(h(2,0),h(2,1)))),g&&(c=m(c,m(h(0,2),h(1,2)))),p&&g&&(c=m(c,h(2,2))),n.fragmentNode=de(ne(c),1),n.lights=!1,n.blending=Os,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,r.push({quad:new qa(n)})}this._reflectionDepthPasses=r}_renderReflectionPass(e,t){let a=this.getDrawingBufferSize(Yl),r=1/0,s=0,i=0;e.traverse(e=>{let n=e;if(!(n.isMesh&&16&n.layers.mask))return;let l=this._reflectiveMeshCoverage(n,t,a.y),o=Array.isArray(n.material)?n.material:[n.material];for(let e of o){if(!e?.layers)continue;let t=Mr(e);!t||(r=Math.min(r,t.min*l.scale),s=Math.max(s,t.max*l.scale),t.max*l.scale>.45&&(i=Math.max(i,l.diameterPx)))}});let n=1;if(yo&&r!==1/0)for(r>=6?n=4:r>=2&&(n=2);n>1&&i>0&&i/n<128;)n>>=1;let l=Math.max(1,Math.round(a.x/n)),o=Math.max(1,Math.round(a.y/n)),u=Math.floor(Math.log2(Math.max(l,o)))+1,d=!0===this.backend?.isWebGPUBackend&&_o;this._reflectionTarget=this._reallocGrabTarget(this._reflectionTarget,l,o,()=>{let e=new xs(l,o,{depthTexture:new ls(l,o)});return d?(e.texture.generateMipmaps=!1,e.texture.minFilter=Zs):(e.texture.generateMipmaps=!0,e.texture.minFilter=ei),e.texture.magFilter=Zs,e});let h=(e,t)=>{let a=new xs(e,t,{depthBuffer:!1,type:ts,format:vs});return a.texture.generateMipmaps=!1,a.texture.minFilter=Hs,a.texture.magFilter=Hs,a},m=this._reflectionDepthPyramid;this._reflectionDepthPyramid=this._reallocGrabTarget(this._reflectionDepthPyramid,l,o,()=>{let e=h(l,o);return e.texture.mipmaps=Array.from({length:u},(e,t)=>({width:Math.max(1,l>>t),height:Math.max(1,o>>t)})),e}),this._reflectionDepthPyramid!==m&&this.initTexture(this._reflectionDepthPyramid.texture);for(let e=0;e<u;e++)this._reflectionDepthChain[e]=this._reallocGrabTarget(this._reflectionDepthChain[e],Math.max(1,l>>e),Math.max(1,o>>e),()=>h(Math.max(1,l>>e),Math.max(1,o>>e)));for(let e=u;e<this._reflectionDepthChain.length;e++)this._reflectionDepthChain[e]?.dispose(),this._reflectionDepthChain[e]=void 0;this._reflectionDepthChain.length=u;let c=!0===this._skySystem?.attached?this._skySystem.environmentTexture??null:null,p=w.reflectionEnvMap,g=c??y;p.value!==g&&(p.value=g,this._grabTargetEpoch++),w.reflectionEnvEnabled.value=null!==c?1:0;let f=this.getClearColor(El);w.reflectionMissColor.value.set(f.r,f.g,f.b);let _=[];e.traverse(e=>{let t=e;if(!(t.isMesh||t.isLine||t.isPoints||t.isSprite))return;let a=t.layers;a&&16&a.mask&&16!==a.mask&&(_.push({layers:a,mask:a.mask}),a.mask=16)});let x=this.getRenderTarget();t.layers.disable(4),this.setRenderTarget(this._reflectionTarget),this._renderPrepass(e,t),t.layers.enable(4);for(let e of _)e.layers.mask=e.mask;this._reflectionPassesKey!==`${l}x${o}`&&(this._buildReflectionDepthPasses(l,o,u),this._reflectionPassesKey=`${l}x${o}`);let v=this._reflectionDepthPasses;for(let e=0;e<u;e++)this.setRenderTarget(this._reflectionDepthChain[e]),v[e].quad.render(this);this._batchedMipCopies(Array.from({length:u},(e,t)=>({src:this._reflectionDepthChain[t].texture,dst:this._reflectionDepthPyramid.texture,dstLevel:t,width:Math.max(1,l>>t),height:Math.max(1,o>>t)})));let b=this._reflectionTarget.texture;if(d){let e=this._reflectionColorPyramid;this._reflectionColorPyramid=this._reallocGrabTarget(this._reflectionColorPyramid,l,o,()=>{let e=new xs(l,o,{depthBuffer:!1}),t=e.texture;return t.minFilter=ei,t.magFilter=Zs,t.generateMipmaps=!1,t.mipmaps=Array.from({length:u},(e,t)=>({width:Math.max(1,l>>t),height:Math.max(1,o>>t)})),e}),this._reflectionColorPyramid!==e&&this.initTexture(this._reflectionColorPyramid.texture);let t=s>0?u:1,a=(e,t)=>{let a=new xs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Zs,a.texture.magFilter=Zs,a};for(let e=1;e<t;e++)this._reflectionColorChain[e]=this._reallocGrabTarget(this._reflectionColorChain[e],Math.max(1,l>>e),Math.max(1,o>>e),()=>a(Math.max(1,l>>e),Math.max(1,o>>e)));for(let e=t;e<this._reflectionColorChain.length;e++)this._reflectionColorChain[e]?.dispose(),this._reflectionColorChain[e]=void 0;this._reflectionColorChain.length=t;for(let e=1;e<t;e++){let t=1===e?this._reflectionTarget:this._reflectionColorChain[e-1],a=this._getReflectionDownsamplePass(e-1);a.input.value=t.texture,a.step.value.set(1/t.width,1/t.height),this.setRenderTarget(this._reflectionColorChain[e]),a.quad.render(this)}this._batchedMipCopies([{src:this._reflectionTarget.texture,dst:this._reflectionColorPyramid.texture,dstLevel:0,width:l,height:o},...Array.from({length:t-1},(e,t)=>({src:this._reflectionColorChain[t+1].texture,dst:this._reflectionColorPyramid.texture,dstLevel:t+1,width:Math.max(1,l>>t+1),height:Math.max(1,o>>t+1)}))]),b=this._reflectionColorPyramid.texture}this.setRenderTarget(x),w.reflectionRenderTarget.value=b,w.reflectionDepthPyramid.value=this._reflectionDepthPyramid.texture,w.reflectionDepthSize.value.set(l,o),w.reflectionDepthLevels.value=u,this._reflectionGrabInfo={div:n,w:l,h:o,minBlur:r,maxBlur:s}}_reflectiveMeshCoverage(e,t,a){let r=e.geometry;if(!r)return{diameterPx:a,scale:1};null===r.boundingSphere&&r.computeBoundingSphere();let s=r.boundingSphere;if(!s)return{diameterPx:a,scale:1};let i=e.matrixWorld.elements,n=Math.sqrt(Math.max(i[0]*i[0]+i[1]*i[1]+i[2]*i[2],i[4]*i[4]+i[5]*i[5]+i[6]*i[6],i[8]*i[8]+i[9]*i[9]+i[10]*i[10])),l=s.radius*n;Bl.copy(s.center).applyMatrix4(e.matrixWorld);let o=t.projectionMatrix.elements[5]*a/2,u=1;!0===t.isPerspectiveCamera&&(Ll.setFromMatrixPosition(t.matrixWorld),u=Math.max(Bl.distanceTo(Ll),t.near??.1));let d=2*l*o/u;return{diameterPx:d,scale:Math.min(1,d/(.66*a))}}_renderReflectionResolvePass(e,t){let a=this._reflectionGrabInfo,r=!0===this.backend?.isWebGPUBackend&&xo&&void 0!==a&&a.maxBlur>.45;if(r){let a=!0;e.traverse(e=>{let r=e;if(!(r.isMesh&&16&r.layers.mask))return;let s=Array.isArray(r.material)?r.material:[r.material],i=null;for(let e of s)if(e?.layers&&(i=Rr(e),null!==i))break;"variable"!==i?null!==i?(r.userData.__srMode=i.blur>.45?1+i.tracingMode:0,r.userData.__srBlur=i.blur*this._reflectiveMeshCoverage(r,t,this.getDrawingBufferSize(Il).y).scale,r.userData.__srThickness=i.thickness,r.userData.__srStepSize=i.stepSize,r.userData.__srSteps=i.steps):r.userData.__srMode=0:a=!1}),r=a}let s=r?a.w:4,i=r?a.h:4,n=(e,t)=>()=>{let a=new xs(e,t,{type:as,depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Zs,a.texture.magFilter=Zs,a};if(this._reflectionResolveTarget=this._reallocGrabTarget(this._reflectionResolveTarget,s,i,n(s,i)),w.reflectionResolveTarget.value=this._reflectionResolveTarget.texture,!r)return void(w.reflectionResolveEnabled.value=0);let{w:l,h:o}=a;if(this._reflectionGBufferTarget=this._reallocGrabTarget(this._reflectionGBufferTarget,l,o,()=>{let e=new xs(l,o,{count:2,type:as,depthTexture:new ls(l,o)});for(let t of e.textures)t.generateMipmaps=!1,t.minFilter=Hs,t.magFilter=Hs;return e.textures[0].name="g0",e.textures[1].name="g1",e}),this._reflectionResolveMarchTarget=this._reallocGrabTarget(this._reflectionResolveMarchTarget,l,o,n(l,o)),this._reflectionResolveBlurTmp=this._reallocGrabTarget(this._reflectionResolveBlurTmp,l,o,n(l,o)),!this._reflectionGBufferMaterial){let e=new Tt;e.name="SplineReflectionGBuffer";let t=U("__splinePlanarMirror","float"),a=w.reflectionPlanarEnabled.greaterThan(.5),r=U("__srMode","float"),s=zt(t.greaterThan(.5).and(a),nr(0),r);e.fragmentNode=Ta({g0:de(Ja(Ha),s),g1:de(U("__srBlur","float"),U("__srThickness","float"),U("__srStepSize","float"),U("__srSteps","float"))}),e.lights=!1,e.blending=Os,e.needsUpdate=!0,this._reflectionGBufferMaterial=e}let u=this._skippedAsyncDraws??0,d=e.overrideMaterial,h=this.getRenderTarget(),m=this.getClearColor(Nl),c=this.getClearAlpha(),p=t.layers.mask;e.overrideMaterial=this._reflectionGBufferMaterial,t.layers.mask=16,this.setClearColor(0,0),this.setRenderTarget(this._reflectionGBufferTarget),this._renderPrepass(e,t),e.overrideMaterial=d,t.layers.mask=p,this.setClearColor(m,c);let g=w.reflectionRenderTarget.value,f=w.reflectionEnvMap.value,_=this._reflectionGBufferTarget,y=`${l}x${o}|${_.textures[0].uuid}|${g.uuid}|${this._reflectionDepthPyramid.texture.uuid}|${f.uuid}|${this._reflectionResolveMarchTarget.texture.uuid}|${this._reflectionResolveBlurTmp.texture.uuid}`;y!==this._reflectionResolveMarchKey&&(this._buildReflectionResolveMarch(g,f,l,o),this._reflectionResolveMarchKey=y);let x=this._reflectionResolveMarch;x.proj.value.copy(t.projectionMatrix),x.projInv.value.copy(t.projectionMatrix).invert(),x.camWorld.value.copy(t.matrixWorld),x.near.value=t.near??.1,this.setRenderTarget(this._reflectionResolveMarchTarget),x.quad.render(this),this.setRenderTarget(this._reflectionResolveBlurTmp),this._reflectionResolveBlur.h.render(this),this.setRenderTarget(this._reflectionResolveTarget),this._reflectionResolveBlur.v.render(this),this.setRenderTarget(h),w.reflectionResolveEnabled.value=1,(this._skippedAsyncDraws??0)>u&&(w.reflectionResolveEnabled.value=0)}_buildReflectionResolveMarch(e,t,a,r){this._reflectionResolveMarch&&this._reflectionResolveMarch.quad.material.dispose(),this._reflectionResolveBlur&&(this._reflectionResolveBlur.h.material.dispose(),this._reflectionResolveBlur.v.material.dispose());let s=k(new ws),i=k(new ws),n=k(new ws),l=k(.1),o=this._reflectionGBufferTarget,u=Da(o.textures[0]),d=Da(o.textures[1]),h=Da(o.depthTexture),m=Da(e),c=Da(this._reflectionDepthPyramid.texture),p=Da(t),g=new Tt;g.name="SplineReflectionResolve";let f=re(()=>{let e=bt,t=Xe(Ce(e.x),Ce(e.y)),a=W(),r=u.load(t).toVar(),o=h.sample(a).toVar(),g=de(0).toVar(),f=nr(0).toVar();return le(r.w.greaterThan(.5),()=>{let e=d.load(t).toVar(),u=Ui(i,a.x,a.y,o),h=Gi({dials:{blur:e.x,thickness:e.y,stepSize:e.z,steps:Ce(e.w),tracingMode:r.w.sub(1)},surface:{originView:u,normalV:Ja(r.xyz),screenUv:a,fragWindowZ:o},camera:{projectionMatrix:s,projectionMatrixInverse:i,worldMatrix:n,near:l},resources:{colorMap:m,depthPyramid:c,depthPyramidNode:c,envMap:p},usePlanar:mt(!1),noisePixel:ae(t),singleRay:{footprintOut:f}});g.assign(de(h,f.add(1)))}),g});g.fragmentNode=f(),g.lights=!1,g.blending=Os,g.depthTest=!1,g.depthWrite=!1,g.needsUpdate=!0,this._reflectionResolveMarch={quad:new qa(g),proj:s,projInv:i,camWorld:n,near:l};let _=Da(this._reflectionResolveMarchTarget.texture),y=Da(this._reflectionResolveBlurTmp.texture),x=e=>{let t=new Tt;t.name=`SplineReflectionResolveBlur${e.toUpperCase()}`;let s="x"===e?_:y,i="x"===e?1/a:1/r,n=re(()=>{let t=W(),a=_.sample(t).toVar().w.sub(1).max(0).clamp(.5,12).toVar(),r=de(0).toVar(),n=0;for(let l=-6;l<=6;l++){let o=Math.exp(l/3*-.5*(l/3));n+=o;let u="x"===e?ae(a.mul(l/6*i),0):ae(0,a.mul(l/6*i)),d=s.sample(t.add(u)).toVar(),h="x"===e?d.w.min(1):d.w;r.addAssign(de(d.rgb,h).mul(o))}return r.div(n)});return t.fragmentNode=n(),t.lights=!1,t.blending=Os,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,new qa(t)};this._reflectionResolveBlur={h:x("x"),v:x("y")}}_renderPlanarReflectionPass(e,t){let a=null;if(e.traverse(e=>{let t=e;if(!(t.isMesh&&16&t.layers.mask&&(t.userData.__splinePlanarMirror=0,(Array.isArray(t.material)?t.material:[t.material]).some(e=>e?.layers&&Vr(e)))))return;let r=t.geometry;if(!r)return;null===r.boundingBox&&r.computeBoundingBox();let s,i,n=r.boundingBox,l=n.max.x-n.min.x,o=n.max.y-n.min.y,u=n.max.z-n.min.z,d=t.matrixWorld.elements,h=Math.hypot(d[0],d[1],d[2]),m=Math.hypot(d[4],d[5],d[6]),c=Math.hypot(d[8],d[9],d[10]);l<=o&&l<=u?(s=Dl,i=o*m*(u*c)):o<=l&&o<=u?(s=Fl,i=l*h*(u*c)):(s=Ul,i=l*h*(o*m)),(!a||i>a.area)&&(a={mesh:t,normalAxis:s,area:i})}),!a)return void(w.reflectionPlanarEnabled.value=0);let r=a.mesh,s=a.mesh.matrixWorld;if(Ol.copy(a.normalAxis).transformDirection(s),Gl.setFromMatrixPosition(s),ql.setFromMatrixPosition(t.matrixWorld),Wl.subVectors(Gl,ql),Wl.dot(Ol)>0&&Ol.negate(),Wl.dot(Ol)>0)return void(w.reflectionPlanarEnabled.value=0);r.userData.__splinePlanarMirror=1,(!this._planarVirtualCamera||this._planarVirtualCamera.type!==t.type)&&(this._planarVirtualCamera=t.clone());let i=this._planarVirtualCamera;if(Wl.subVectors(Gl,ql),Wl.reflect(Ol).negate(),Wl.add(Gl),Hl.extractRotation(t.matrixWorld),jl.set(0,0,-1).applyMatrix4(Hl).add(ql),Kl.subVectors(Gl,jl),Kl.reflect(Ol).negate(),Kl.add(Gl),i.position.copy(Wl),i.up.set(0,1,0).applyMatrix4(Hl),i.up.reflect(Ol),i.lookAt(Kl),i.updateMatrixWorld(),i.projectionMatrix.copy(t.projectionMatrix),i.projectionMatrixInverse.copy(i.projectionMatrix).invert(),!0===t.isPerspectiveCamera){$l.setFromNormalAndCoplanarPoint(Ol,Gl),$l.applyMatrix4(i.matrixWorldInverse),Xl.set($l.normal.x,$l.normal.y,$l.normal.z,$l.constant);let e=i.projectionMatrix.elements;Ql.x=(Math.sign(Xl.x)+e[8])/e[0],Ql.y=(Math.sign(Xl.y)+e[9])/e[5],Ql.z=-1,Ql.w=(1+e[10])/e[14],Xl.multiplyScalar(1/Xl.dot(Ql)),e[2]=Xl.x,e[6]=Xl.y,e[10]=Xl.z,e[14]=Xl.w}let n=this.getDrawingBufferSize(Zl),l=Math.max(1,Math.round(n.x)),o=Math.max(1,Math.round(n.y)),u=!0===this.backend?.isWebGPUBackend&&fo;this._planarTarget=this._reallocGrabTarget(this._planarTarget,l,o,()=>{let e=new xs(l,o);return u?(e.texture.generateMipmaps=!1,e.texture.minFilter=Zs):(e.texture.generateMipmaps=!0,e.texture.minFilter=ei),e.texture.magFilter=Zs,e});let d=[];e.traverse(e=>{let t=e;if(!(t.isMesh||t.isLine||t.isPoints||t.isSprite))return;let a=t.layers;a&&16&a.mask&&16!==a.mask&&(d.push({layers:a,mask:a.mask}),a.mask=16)}),i.layers.mask=-17&t.layers.mask;let h=this.getRenderTarget();this.setRenderTarget(this._planarTarget),this._renderPrepass(e,i),this.setRenderTarget(h);for(let e of d)e.layers.mask=e.mask;let m=this._planarTarget.texture;if(u){let e=Math.floor(Math.log2(Math.max(l,o)))+1,t=this._planarPyramid;this._planarPyramid=this._reallocGrabTarget(this._planarPyramid,l,o,()=>{let t=new xs(l,o,{depthBuffer:!1}),a=t.texture;return a.minFilter=ei,a.magFilter=Zs,a.generateMipmaps=!1,a.mipmaps=Array.from({length:e},(e,t)=>({width:Math.max(1,l>>t),height:Math.max(1,o>>t)})),t}),this._planarPyramid!==t&&this.initTexture(this._planarPyramid.texture);let a=(e,t)=>{let a=new xs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Zs,a.texture.magFilter=Zs,a};for(let t=1;t<e;t++)this._planarChain[t]=this._reallocGrabTarget(this._planarChain[t],Math.max(1,l>>t),Math.max(1,o>>t),()=>a(Math.max(1,l>>t),Math.max(1,o>>t)));for(let t=e;t<this._planarChain.length;t++)this._planarChain[t]?.dispose(),this._planarChain[t]=void 0;this._planarChain.length=e;for(let t=1;t<e;t++){let e=1===t?this._planarTarget:this._planarChain[t-1],a=this._getPlanarDownsamplePass(t-1);a.input.value=e.texture,a.step.value.set(1/e.width,1/e.height),this.setRenderTarget(this._planarChain[t]),a.quad.render(this)}this.setRenderTarget(h),this._batchedMipCopies([{src:this._planarTarget.texture,dst:this._planarPyramid.texture,dstLevel:0,width:l,height:o},...Array.from({length:e-1},(e,t)=>({src:this._planarChain[t+1].texture,dst:this._planarPyramid.texture,dstLevel:t+1,width:Math.max(1,l>>t+1),height:Math.max(1,o>>t+1)}))]),m=this._planarPyramid.texture}let c=w.reflectionPlanarTarget;c.value!==m&&(c.value=m,this._grabTargetEpoch++),w.reflectionPlanarEnabled.value=1}renderFromSceneForSceneTransitionPass(e,t,a){let r=this.getDrawingBufferSize(Yl),s=Math.max(1,Math.round(r.x)),i=Math.max(1,Math.round(r.y));this._transitionCaptureTarget=this._reallocGrabTarget(this._transitionCaptureTarget,s,i,()=>new xs(s,i,{depthBuffer:!0}));let n=this.getRenderTarget();this.setRenderTarget(this._transitionCaptureTarget),this.renderSplineScene(e,t),this.setRenderTarget(n),this.pipeline.sceneTransitionFromTexture=this._transitionCaptureTarget.texture,this.sceneTransitionDuration=a,this.sceneTransitionTimeRemaining=a;let l=this.pipeline.sceneTransitionPass.uniforms;l.uDPR.value=this.getPixelRatio(),l.uResolution.value.set(r.x,r.y).divideScalar(this.getPixelRatio())}async captureFrame(e,{includeHelpers:t=!1}={}){if(!0===this.xr?.isPresenting)return null;let a=this._frameSerial,r=this.getRenderTarget(),s=this.pipeline.renderToScreen,i=this.pipeline.helpersEnabled;t||this.pipeline.disableHelpers(),this.pipeline.renderToScreen=!1,this.setRenderTarget(null);try{e()}finally{this.pipeline.renderToScreen=s,this.setRenderTarget(r),i&&this.pipeline.enableHelpers()}if(this._frameSerial===a||this.lastFrameIncomplete)return null;let n=this.pipeline.lastOutputTarget;if(!n||!this.backend.get(n.textures[0])?.textureDescriptorGPU)return null;let l=n.width,o=n.height,u=this,d=new Uint8Array(l*o*4),h=4*l,m=256*Math.ceil(h/256),c=Math.max(1,Math.min(o,Math.floor((1<<20)/m)));for(let e=0;e<o;e+=c){let t=Math.min(c,o-e),a=await u.readRenderTargetPixelsAsync(n,0,e,l,t);if(m===h)d.set(a.subarray(0,t*h),e*h);else for(let r=0;r<t;r++){let t=r*m;d.set(a.subarray(t,t+h),(e+r)*h)}}return{pixels:d,width:l,height:o}}_applyCIOffscreenTargetIfRequested(){if(!0!==globalThis.__SPLINE_RENDER_OFFSCREEN__)return;let e=Math.max(1,Math.round(this.viewportWidth*this.getPixelRatio())),t=Math.max(1,Math.round(this.viewportHeight*this.getPixelRatio()));this._ciOffscreenTarget?(this._ciOffscreenTarget.width!==e||this._ciOffscreenTarget.height!==t)&&(this._ciOffscreenTarget.dispose(),this._ciOffscreenTarget=new xs(e,t,{depthBuffer:!0})):(this._ciOffscreenTarget=new xs(e,t,{depthBuffer:!0}),globalThis.__splineReadOffscreenPixels=async()=>{let e=this._ciOffscreenTarget,t=await this.readRenderTargetPixelsAsync(e,0,0,e.width,e.height);return{width:e.width,height:e.height,pixels:Array.from(t)}}),null===this.getRenderTarget()&&this.setRenderTarget(this._ciOffscreenTarget)}dispose(){this._disposeRetiredGrabTargets(),this._disposeWarmupTargets(),cr()?.drainRetired(),d()?.drainRetired(),this._skySystem?.dispose(),this._skySystem=null,this._hbao?.dispose(),this._hbao=void 0,this._shadowMask?.dispose(),this._shadowMask=void 0,function(){for(let e of nn){let t=e.deref();void 0!==t&&(t.mid?.dispose(),t.mid=null,t.small?.dispose(),t.small=null,t.toMid?.material?.dispose(),t.toSmall?.material?.dispose(),t.toMid=null,t.toSmall=null,t.passKey="",t.fresh=!1,t.slot=-1)}nn.clear(),on.fill(null),an?.dispose(),an=null,hn=!1}(),this._aoRenderTarget?.dispose(),this._aoRenderTarget=void 0,this._normalTarget?.dispose(),this._normalTarget=void 0,this._ciOffscreenTarget?.dispose(),this._ciOffscreenTarget=void 0,this._transitionCaptureTarget?.dispose(),this._transitionCaptureTarget=void 0,this._transmissionTarget?.dispose(),this._transmissionTarget=void 0,this._transmissionBlurTmp?.dispose(),this._transmissionBlurTmp=void 0,this._transmissionBlurTarget?.dispose(),this._transmissionBlurTarget=void 0;for(let e of this._transmissionChain)e?.dispose();this._transmissionChain.length=0,this._reflectionTarget?.depthTexture?.dispose(),this._reflectionTarget?.dispose(),this._reflectionTarget=void 0,this._reflectionColorPyramid?.dispose(),this._reflectionColorPyramid=void 0;for(let e of this._reflectionColorChain)e?.dispose();if(this._reflectionColorChain.length=0,this._reflectionDownsamplePasses){for(let e of this._reflectionDownsamplePasses)e?.quad.material?.dispose();this._reflectionDownsamplePasses=void 0}this._planarTarget?.dispose(),this._planarTarget=void 0,this._planarPyramid?.dispose(),this._planarPyramid=void 0;for(let e of this._planarChain)e?.dispose();if(this._planarChain.length=0,this._planarDownsamplePasses){for(let e of this._planarDownsamplePasses)e?.quad.material?.dispose();this._planarDownsamplePasses=void 0}this._reflectionDepthPyramid?.dispose(),this._reflectionDepthPyramid=void 0;for(let e of this._reflectionDepthChain)e?.dispose();if(this._reflectionDepthChain.length=0,this._reflectionDepthPasses){for(let e of this._reflectionDepthPasses)e?.quad.material?.dispose();this._reflectionDepthPasses=void 0}if(this._reflectionPassesKey="",this._reflectionGBufferTarget?.depthTexture?.dispose(),this._reflectionGBufferTarget?.dispose(),this._reflectionGBufferTarget=void 0,this._reflectionResolveMarchTarget?.dispose(),this._reflectionResolveMarchTarget=void 0,this._reflectionResolveBlurTmp?.dispose(),this._reflectionResolveBlurTmp=void 0,this._reflectionResolveTarget?.dispose(),this._reflectionResolveTarget=void 0,this._reflectionGBufferMaterial?.dispose(),this._reflectionGBufferMaterial=void 0,this._reflectionResolveMarch&&(this._reflectionResolveMarch.quad.material.dispose(),this._reflectionResolveMarch=void 0),this._reflectionResolveBlur&&(this._reflectionResolveBlur.h.material.dispose(),this._reflectionResolveBlur.v.material.dispose(),this._reflectionResolveBlur=void 0),this._reflectionResolveMarchKey="",this._reflectionGrabInfo=void 0,this._prefilterPasses){for(let e of this._prefilterPasses)e?.quad.material?.dispose();this._prefilterPasses=void 0}if(this._downsamplePasses){for(let e of this._downsamplePasses)e?.quad.material?.dispose();this._downsamplePasses=void 0}this._uiBlitPass&&(this._uiBlitPass.quad.material.dispose(),this._uiBlitPass=void 0),this._helperOverlay?.dispose(),this._helperOverlay=void 0,function(){for(let e of gl)e.deref()?.dispose();gl.clear(),fl++}(),function(){for(let e of yl){let t=e.deref();void 0!==t&&(t.sprite.removeFromParent(),t.material.dispose())}yl.clear(),xl++}(),this._taaHistory?.dispose(),this._taaHistory=void 0;for(let e of Object.values(this._encodeMaterials))e?.dispose();this._encodeMaterials={},this._bundledPages.clear(),this.pipeline.dispose(),this.dummyCamera.dispose(),super.dispose(),this._disposeRetiredGrabTargets(),w.transmissionRenderTarget.value=_,w.normalRenderTarget.value=_,w.aoRenderTarget.value=_,w.reflectionRenderTarget.value=y,w.reflectionDepthPyramid.value=y,w.reflectionEnvMap.value=y,w.reflectionPlanarTarget.value=y,w.reflectionPlanarEnabled.value=0,w.reflectionResolveTarget.value=x,w.reflectionResolveEnabled.value=0}},wo=To;wo._GAUGE_STALL_MS=3e3;var So=(e,t)=>e.element(t);function Vo(e){let t=e;return null!=t&&!0===t.isInstancedMesh&&null!=t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute}var Mo=new WeakMap;function Ro(e){return pa.mul(function(e){let t=e.spInstanceMatrixNode;if(void 0!==t)return t;let a=e.object,r=a.instanceMatrix,s=Math.max(a.count??1,1);if(!0===r.isStorageInstancedBufferAttribute)return So(xa(r,"mat4",s),me);if(16*s*4<=e.getUniformBufferLimit())return So(S(r.array,"mat4",s),me);let i=Mo.get(r);void 0===i&&(i=new bs(r.array,16,1),Mo.set(r,i));let n=r.usage===qs?Se:ve;return vt(n(i,"vec4",16,0),n(i,"vec4",16,4),n(i,"vec4",16,8),n(i,"vec4",16,12))}(e))}var Co=re(e=>Vo(e.object)?ie:ue).once()().toVar("speObjectPosition"),zo=re(e=>{let t=e.material?.shapeBlendObjectNormal;return t||(Vo(e.object)?e.geometry.hasAttribute("normal")?Ia:ne(0,1,0):Oa)}).once()().toVar("speObjectNormal"),ko=(re(e=>Vo(e.object)?Ro(e):pa).once()(),re(e=>{if(!Vo(e.object))return aa;let t=Ro(e),a=e=>So(t,e).xyz;return ne(a(0).length(),a(1).length(),a(2).length()).toVarying("v_speModelScale")}).once()().toVar("speModelScale")),Ao=(re(e=>Vo(e.object)?ft(Ro(e)).inverse().transpose():Yt).once()(),re(e=>Vo(e.object)?Ro(e).inverse():ya).once()(),new WeakMap);function Po(e){if(Ao.has(e))return;let t={own:e.value,render:e.value};Ao.set(e,t),Object.defineProperty(e,"value",{configurable:!0,enumerable:!0,get:()=>t.render,set:e=>{t.render=e,t.own=e}})}function Eo(e){let t=Ao.get(e);return void 0!==t?t.own:e.value}function No(e,t){let a=Ao.get(e);void 0!==a?a.render=t:e.value=t}var Bo=class{constructor(e){this.layerId=e,this.uniforms={},this.byName=new Map,this.liveValues=new Map}set(e,t,a){return this.byName.set(e,t),this.uniforms[`f${this.layerId}_${e}`]=t,void 0!==a&&this.liveValues.set(e,a),this}has(e){return this.byName.has(e)}names(){return[...this.byName.keys()]}get(e){let t=this.byName.get(e);if(void 0===t)throw new Error(`TSLLayerParams: unknown param "${e}" (layer f${this.layerId})`);return t}getFloat(e){return this.get(e)}getInt(e){return this.get(e)}getBool(e){return this.get(e)}getVec2(e){return this.get(e)}getVec3(e){return this.get(e)}getVec4(e){return this.get(e)}getColor(e){return this.get(e)}getValue(e){if(this.liveValues.has(e))return this.liveValues.get(e);let t=this.byName.get(e);return void 0===t?void 0:Eo(t)}getLiveValue(e){return this.liveValues.get(e)}getNodeValue(e){let t=this.byName.get(e);return void 0===t?void 0:Eo(t)}setValue(e,t){let a=this.byName.get(e);void 0===a||void 0===t||(this.liveValues.has(e)&&this.liveValues.set(e,t),a.value=t)}};function Lo(e,t,a){let r=nr(e).toVar(),s=nr(Wt(r.div(Ft(r.add(t.accumAlpha),nr(1e-5),nr(1))),r,a)).toVar();return t.accumAlpha.addAssign(lr(t.accumAlpha).mul(r).mul(lr(a))),s}function Io(e,t){let a=nr(e).toVar(),r=nr(a.div(Ft(a.add(t.accumAlpha),nr(1e-5),nr(1)))).toVar();return t.accumAlpha.addAssign(lr(t.accumAlpha).mul(a)),r}var Do=0,Fo=1,Uo=2,Oo=3,Go=re(e=>{let t=e.a.toVar(),a=e.b.toVar(),r=e.alpha.toVar(),s=e.mode,i=ne(1).toVar();return le(s.equal(Ce(0)),()=>{i.assign(Wt(t,a,r))}).ElseIf(s.equal(Ce(1)),()=>{i.assign(Wt(t,t.mul(a),r))}).ElseIf(s.equal(Ce(2)),()=>{i.assign(Wt(t,lr(lr(t).mul(lr(a))),r))}).ElseIf(s.equal(Ce(3)),()=>{let e=ga(t,ne(.5)),s=Wt(lr(lr(t).mul(lr(a)).mul(2)),t.mul(a).mul(2),e);i.assign(Wt(t,s,r).clamp(0,1))}),i});function qo(e,t,a,r){return Go({a:e,b:t,alpha:a,mode:r})}var Wo=new Map,Ho=new Set,jo=(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:ne(1,0,0),calpha:Io(r,a)}};function Ko(e,t){Wo.set(e,t)}function $o(e){let t=Wo.get(e);return void 0!==t?t:(Ho.has(e)||(Ho.add(e),console.warn(`[spe] Material layer type "${e}" is not available in this runtime build (no WebGPU port, or compiled out) — rendering flat red.`)),jo)}function Xo(e){return Wo.has(e)}var{diffuseContribution:Qo,specularColorBlended:Zo}=tr,Yo=re(e=>{let t=Ha.dot(e.lightDirection),a=ae(t.mul(.5).add(.5),0),r=a.fwidth().mul(.5);return Wt(ne(.7),ne(1),Jt(nr(.7).sub(r.x),nr(.7).add(r.x),a.x))}),Jo=re(e=>{let t=e.lightDirection.add(be).normalize(),a=Ha.dot(t).clamp(),r=be.dot(t).clamp(),s=r.mul(-5.55473).sub(6.98316).mul(r).exp2(),i=ra.mul(s.oneMinus()).add(s),n=nr(.25),l=Ot.mul(.5).add(1).mul(1/Math.PI).mul(a.pow(Ot));return i.mul(n).mul(l)});function eu(e){let t=w.aoRenderTarget.sample(Vt).rgb,a=w.aoEnabledUniform;return null!==e&&(a=a.mul(zt(e,nr(1),nr(0)))),Wt(ne(1),t,a)}var tu,au=(tu=class extends Qt{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=Yo({lightDirection:t}).mul(a);r.directDiffuse.addAssign(s.mul(Ea.rgb.mul(1/Math.PI))),r.directSpecular.addAssign(s.mul(Jo({lightDirection:t})))}},class extends tu{constructor(){super(...arguments),this.aoOcclusionGate=null}finish(e,...t){super.finish?.call(this,e,...t);let{reflectedLight:a,outgoingLight:r}=e.context,s=eu(this.aoOcclusionGate),i=a.directDiffuse.add(a.indirectDiffuse);r.subAssign(i.mul(lr(s)))}}),ru=class extends oa{constructor(){super(...arguments),this.envIrradianceActive=!1}direct(e,t){let a=e;if(!0===a.lightNode?.light?.userData?.splineDiffuseOnly){if(this.envIrradianceActive)return;let e=Ha.dot(a.lightDirection).clamp().mul(a.lightColor),t=tr.BRDF_Lambert({diffuseColor:Qo});return void a.reflectedLight.directDiffuse.addAssign(e.mul(t))}super.direct(e,t)}},su=e=>e,iu=[{a:"y",b:"z",pole:"x"},{a:"z",b:"x",pole:"y"},{a:"x",b:"y",pole:"z"}];function nu(e,t){return"x"===t?e.x:"y"===t?e.y:e.z}function lu(e,t){return Ma(e,ne(t,1)).div(2).add(.5).xy}function ou(e,t,a){let r=nr(e.div(Ft(e.add(t.accumAlpha),nr(1e-5),nr(1)))).toVar();return t.accumAlpha.addAssign(lr(t.accumAlpha).mul(e).mul(lr(a))),r}function uu(e){let t=e.getValue("projection")??0,a=e.getValue("axis")??0,r=a>=0&&a<=2?a:0,s=e.getValue("projectionAxis")??-1,i=s>=0&&s<=2?s:1,n=e.get("mat"),l=e.getVec2("size");if(1===t){let e=Co,t=0===r?e.zy:1===r?e.xz:e.xy,a=ae(t.add(1).div(2)).toVar();return{uvs:[ae(lu(n,a.mul(2).sub(1).div(l.mul(.5)))).toVar()],weights:null}}if(2===t){let e=ne(Ja(Co)).toVar(),{a:t,b:a,pole:r}=iu[i],s=nr(He(nu(e,t),nu(e,a)).div(6.283).add(.5)).toVar(),l=nr(Ge(nu(e,r)).div(3.1415).add(.5)).toVar(),o=ae(s,l).toVar();return{uvs:[ae(lu(n,o.mul(2).sub(1))).toVar()],weights:null}}if(3===t){let e=ne(Ja(Co)).toVar(),{a:t,b:a,pole:r}=iu[i],s=nr(He(nu(e,t),nu(e,a)).div(6.283).add(.5)).toVar(),o=nr(nu(Co,r).div(l.y.mul(.5))).toVar(),u=nr(o.div(2).add(.5)).toVar(),d=ae(s,u).toVar();return{uvs:[ae(lu(n,d.mul(2).sub(1))).toVar()],weights:null}}if(4===t){let t=e.getFloat("blending"),a=ne(Co).toVar(),r=ae(a.xy.add(1).div(2)).toVar(),s=ae(a.zy.add(1).div(2)).toVar(),i=ae(a.xz.add(1).div(2)).toVar();for(let e of[r,s,i])e.assign(lu(n,su(e.mul(2).sub(1).div(l.mul(.5)))));let o=nr(lr(t).mul(125).add(3)).toVar(),u=ne(zo).toVar(),d=ne(Ae(Ja(u))).toVar();return d.assign(ze(d,ne(o))),d.divAssign(Ua(d,ne(1))),{uvs:[r,s,i],weights:d}}return{uvs:[ae(lu(n,W().mul(2).sub(1))).toVar()],weights:null}}var du=(e,t,a)=>{let r,s=e.getValue("projection")??0,i=e.getValue("axis")??0,n=i>=0&&i<=2?i:0,l=e.getValue("side")??0,o=e.get("texture"),u=e.getFloat("crop"),{uvs:d,weights:h}=uu(e),m=[...d],c=null;if(1===s){if(r=o.sample(d[0]),2!==l){let e=0===n?ne(1,0,0):1===n?ne(0,1,0):ne(0,0,1),t=Ua(zo,e);c=ga(nr(0),1===l?t.mul(-1):t)}}else if(2===s||3===s)r=function(e,t){let a=ae(ba(t)).toVar(),r=ae(Va(t)).toVar();return a.x.subAssign(C(a.x.add(.5))),r.x.subAssign(C(r.x.add(.5))),e.sample(t).grad(a,r)}(o,d[0]);else if(4===s){let e=h,t=o.sample(d[0]),a=o.sample(d[1]),s=o.sample(d[2]);r=t.mul(e.z).add(a.mul(e.x)).add(s.mul(e.y))}else r=o.sample(d[0]);let p=e.has("loaded")?e.getFloat("loaded"):nr(1),g=de(Wt(de(0,0,0,1),r,p)).toVar(),f=ne(g.rgb).toVar(),_=nr(t.alpha.mul(g.a)).toVar();return null!==c&&_.mulAssign(c),function(e,t,a){le(e.greaterThan(.5),()=>{for(let e of a)le(e.x.lessThan(0).or(e.x.greaterThan(1)).or(e.y.lessThan(0)).or(e.y.greaterThan(1)),()=>{t.assign(0)})})}(u,_,m),_.mulAssign(t.mask),{color:f,calpha:ou(_,a,t.isMask)}};function hu(e,t,a){let r=ae(t).toVar(),s=ae(ba(r)).toVar(),i=ae(Va(r)).toVar(),n=t=>a.mul(V(e.sample(t).rgb)),l=nr(n(r)).toVar(),o=nr(n(r.add(s)).sub(l)).toVar(),u=nr(n(r.add(i)).sub(l)).toVar();return ae(o,u)}function mu(e,t,a){let r=ne(ba(e)).toVar(),s=ne(Va(e)).toVar(),i=ne(Ja(t)).toVar(),n=ne(Ja(ca(s,i))).toVar(),l=ne(Ja(ca(i,r))).toVar(),o=nr(Ua(r,n).mul(ar)).toVar(),u=ne(Ht(o).mul(a.x.mul(n).add(a.y.mul(l)))).toVar();return Ja(Ae(o).mul(i).sub(u))}function cu(e,t){let a,r=e.get("texture"),s=e.has("loaded")?e.getFloat("loaded"):nr(1),i=e=>{let a=r.sample(e),s="luminance"===t?V(a.rgb):a[t];return nr(s).toVar()},{uvs:n,weights:l}=uu(e);if(null!==l){let e=i(n[0]),t=i(n[1]),r=i(n[2]);a=e.mul(l.z).add(t.mul(l.x)).add(r.mul(l.y))}else a=i(n[0]);return Wt(nr(1),a,s)}Ko("texture",du),Ko("video",du);var pu=rr,gu=he,fu=.1666667,_u=re(e=>{let t=e.c,a=Xt(Ua(t,ne(17,59.4,15))).mul(4096),r=L(a.mul(512)),s=a.mul(.125),i=L(s.mul(512)),n=s.mul(.125),l=L(n.mul(512));return ne(i,l,r).sub(.5)}).setLayout({name:"spe_random3",type:"vec3",inputs:[{name:"c",type:"vec3"}]});function yu(e){return _u({c:e})}var xu=re(e=>{let t=e.p,a=C(t.add(Ua(t,ne(.3333333)))).toVar(),r=t.sub(a).add(Ua(a,ne(fu))).toVar(),s=ga(ne(0),r.sub(r.yzx)).toVar(),i=s.mul(lr(s.zxy)).toVar(),n=lr(s.zxy.mul(lr(s))).toVar(),l=r.sub(i).add(fu).toVar(),o=r.sub(n).add(2*fu).toVar(),u=r.sub(1).add(3*fu).toVar(),d=de(Ua(r,r),Ua(l,l),Ua(o,o),Ua(u,u)).toVar();d.assign(de(.6).sub(d).max(0));let h=de(Ua(yu(a),r),Ua(yu(a.add(i)),l),Ua(yu(a.add(n)),o),Ua(yu(a.add(1)),u)).toVar();return d.mulAssign(d),d.mulAssign(d),h.mulAssign(d),Ua(h,de(52))}).setLayout({name:"spe_simplexFast",type:"float",inputs:[{name:"p",type:"vec3"}]});function vu(e){return xu({p:e})}var bu=re(e=>{let t=e.m,a=ft(ne(-.37,.36,.85),ne(-.14,-.93,.34),ne(.92,.01,.4)),r=ft(ne(-.55,-.39,.74),ne(.33,-.91,-.24),ne(.77,.12,.63)),s=ft(ne(-.71,.52,-.47),ne(-.08,-.72,-.68),ne(-.7,-.45,.56));return vu(t.mul(a)).mul(.5333333).add(vu(t.mul(2).mul(r)).mul(.2666667)).add(vu(t.mul(4).mul(s)).mul(.1333333)).add(vu(t.mul(8)).mul(.0666667))}).setLayout({name:"spe_simplexFractal",type:"float",inputs:[{name:"m",type:"vec3"}]}),Tu=re(e=>{let t=e.x;return $t(t.mul(34).add(1).mul(t),289)}).setLayout({name:"spe_permute",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function wu(e){return Tu({x:e})}var Su=re(e=>Ra(1.79284291400159,e.r.mul(.85373472095314))).setLayout({name:"spe_taylorInvSqrt",type:"vec4",inputs:[{name:"r",type:"vec4"}]});function Vu(e){return Su({r:e})}var Mu=re(e=>{let t=e.v,a=ae(1/6,1/3),r=de(0,.5,1,2),s=C(t.add(Ua(t,a.yyy))).toVar(),i=t.sub(s).add(Ua(s,a.xxx)).toVar(),n=ga(i.yzx,i.xyz).toVar(),l=lr(n).toVar(),o=Ut(n.xyz,l.zxy).toVar(),u=Pt(n.xyz,l.zxy).toVar(),d=i.sub(o).add(a.xxx.mul(1)).toVar(),h=i.sub(u).add(a.xxx.mul(2)).toVar(),m=i.sub(1).add(a.xxx.mul(3)).toVar();s.assign($t(s,289));let c=wu(wu(wu(s.z.add(de(0,o.z,u.z,1))).add(s.y).add(de(0,o.y,u.y,1))).add(s.x).add(de(0,o.x,u.x,1))).toVar(),p=r.wyz.mul(1/7).sub(r.xzx).toVar(),g=c.sub(C(c.mul(p.z).mul(p.z)).mul(49)).toVar(),f=C(g.mul(p.z)).toVar(),_=C(g.sub(f.mul(7))).toVar(),y=f.mul(p.x).add(p.yyyy).toVar(),x=_.mul(p.x).add(p.yyyy).toVar(),v=Ra(1,Ae(y)).sub(Ae(x)).toVar(),b=de(y.xy,x.xy).toVar(),T=de(y.zw,x.zw).toVar(),w=C(b).mul(2).add(1).toVar(),S=C(T).mul(2).add(1).toVar(),V=ga(v,de(0)).negate().toVar(),M=b.xzyw.add(w.xzyw.mul(V.xxyy)).toVar(),R=T.xzyw.add(S.xzyw.mul(V.zzww)).toVar(),z=ne(M.xy,v.x).toVar(),k=ne(M.zw,v.y).toVar(),A=ne(R.xy,v.z).toVar(),P=ne(R.zw,v.w).toVar(),E=Vu(de(Ua(z,z),Ua(k,k),Ua(A,A),Ua(P,P))).toVar();z.mulAssign(E.x),k.mulAssign(E.y),A.mulAssign(E.z),P.mulAssign(E.w);let N=Pt(Ra(.6,de(Ua(i,i),Ua(d,d),Ua(h,h),Ua(m,m))),0).toVar();return N.mulAssign(N),Ua(N.mul(N),de(Ua(z,i),Ua(k,d),Ua(A,h),Ua(P,m))).mul(42)}).setLayout({name:"spe_simplexAshima",type:"float",inputs:[{name:"v",type:"vec3"}]});function Ru(e){return Mu({v:e})}var Cu=re(e=>{let t=e.x;return t.sub(C(t.mul(1/289)).mul(289))}).setLayout({name:"spe_mod289",type:"vec4",inputs:[{name:"x",type:"vec4"}]}),zu=re(e=>{let t=e.x;return Cu({x:t.mul(34).add(1).mul(t)})}).setLayout({name:"spe_perm",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function ku(e){return zu({x:e})}var Au=re(e=>{let t=e.p,a=C(t).toVar(),r=t.sub(a).toVar();r.assign(r.mul(r).mul(Ra(3,r.mul(2))));let s=a.xxyy.add(de(0,1,0,1)).toVar(),i=ku(s.xyxy).toVar(),n=ku(i.xyxy.add(s.zzww)).toVar().add(a.zzzz).toVar(),l=ku(n).toVar(),o=ku(n.add(1)).toVar(),u=L(l.mul(1/41)).toVar(),d=L(o.mul(1/41)).toVar().mul(r.z).add(u.mul(lr(r.z))).toVar(),h=d.yw.mul(r.x).add(d.xz.mul(lr(r.x))).toVar();return h.y.mul(r.y).add(h.x.mul(lr(r.y)))}).setLayout({name:"spe_valueNoise",type:"float",inputs:[{name:"p",type:"vec3"}]}),Pu=re(e=>{let t=ne(e.x).toVar(),a=nr(0).toVar(),r=nr(.5).toVar(),s=ne(100).toVar();return he(5,()=>{a.addAssign(r.mul(function(e){return Au({p:e})}(t))),t.assign(t.mul(2).add(s)),r.mulAssign(.5)}),a}).setLayout({name:"spe_fbm",type:"float",inputs:[{name:"x",type:"vec3"}]}),Eu=re(e=>{let t=e.t;return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"spe_fade",type:"vec3",inputs:[{name:"t",type:"vec3"}]}),Nu=re(e=>{let t=e.P,a=C(t).toVar(),r=a.add(ne(1)).toVar();a.assign($t(a,289)),r.assign($t(r,289));let s=L(t).toVar(),i=s.sub(ne(1)).toVar(),n=de(a.x,r.x,a.x,r.x).toVar(),l=de(a.yy,r.yy).toVar(),o=de(a.zzzz).toVar(),u=de(r.zzzz).toVar(),d=wu(wu(n).add(l)).toVar(),h=wu(d.add(o)).toVar(),m=wu(d.add(u)).toVar(),c=h.div(7).toVar(),p=L(C(c).div(7)).sub(.5).toVar();c.assign(L(c));let g=de(.5).sub(Ae(c)).sub(Ae(p)).toVar(),f=ga(g,de(0)).toVar();c.subAssign(f.mul(ga(0,c).sub(.5))),p.subAssign(f.mul(ga(0,p).sub(.5)));let _=m.div(7).toVar(),y=L(C(_).div(7)).sub(.5).toVar();_.assign(L(_));let x=de(.5).sub(Ae(_)).sub(Ae(y)).toVar(),v=ga(x,de(0)).toVar();_.subAssign(v.mul(ga(0,_).sub(.5))),y.subAssign(v.mul(ga(0,y).sub(.5)));let b=ne(c.x,p.x,g.x).toVar(),T=ne(c.y,p.y,g.y).toVar(),w=ne(c.z,p.z,g.z).toVar(),S=ne(c.w,p.w,g.w).toVar(),V=ne(_.x,y.x,x.x).toVar(),M=ne(_.y,y.y,x.y).toVar(),R=ne(_.z,y.z,x.z).toVar(),z=ne(_.w,y.w,x.w).toVar(),k=Vu(de(Ua(b,b),Ua(w,w),Ua(T,T),Ua(S,S))).toVar();b.mulAssign(k.x),w.mulAssign(k.y),T.mulAssign(k.z),S.mulAssign(k.w);let A=Vu(de(Ua(V,V),Ua(R,R),Ua(M,M),Ua(z,z))).toVar();V.mulAssign(A.x),R.mulAssign(A.y),M.mulAssign(A.z),z.mulAssign(A.w);let P=Ua(b,s).toVar(),E=Ua(T,ne(i.x,s.yz)).toVar(),N=Ua(w,ne(s.x,i.y,s.z)).toVar(),B=Ua(S,ne(i.xy,s.z)).toVar(),I=Ua(V,ne(s.xy,i.z)).toVar(),D=Ua(M,ne(i.x,s.y,i.z)).toVar(),F=Ua(R,ne(s.x,i.yz)).toVar(),U=Ua(z,i).toVar(),O=function(e){return Eu({t:e})}(s).toVar(),G=Wt(de(P,E,N,B),de(I,D,F,U),O.z).toVar(),q=Wt(G.xy,G.zw,O.y).toVar();return Wt(q.x,q.y,O.x).toVar().mul(2.2)}).setLayout({name:"spe_perlin",type:"float",inputs:[{name:"P",type:"vec3"}]});function Bu(e){return Nu({P:e})}var Lu=re(e=>{let t=L(e.p3.mul(.1031)).toVar();return t.addAssign(Ua(t,t.yzx.add(33.33))),L(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_hashwithoutsine13",type:"float",inputs:[{name:"p3",type:"vec3"}]}),Iu=re(e=>{let t=L(e.p3.mul(ne(.1031,.103,.0973))).toVar();return t.addAssign(Ua(t,t.yxz.add(33.33))),L(t.xxy.add(t.yxx).mul(t.zyx))}).setLayout({name:"spe_hashwithoutsine33",type:"vec3",inputs:[{name:"p3",type:"vec3"}]});function Du(e){return Iu({p3:e})}var Fu=re(e=>{let{a:t,b:a,k:r}=e,s=Jt(0,1,a.sub(t).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(lr(s)).toVar();return Wt(a,t,s).sub(i)}).setLayout({name:"spe_smin",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Uu(e,t,a){return Fu({a:e,b:t,k:a})}var Ou=re(e=>{let{a:t,b:a,k:r}=e,s=Jt(1,0,t.sub(a).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(lr(s)).toVar();return Wt(t,a,s).add(i)}).setLayout({name:"spe_smax",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Gu(e,t,a){return Ou({a:e,b:t,k:a})}var qu=re(e=>{let{value:t,input_min:a,input_max:r,output_min:s,output_max:i}=e,n=r.sub(a).toVar(),l=i.sub(s).toVar(),o=t.sub(a).div(n).toVar();return s.add(o.mul(l))}).setLayout({name:"spe_remap",type:"float",inputs:[{name:"value",type:"float"},{name:"input_min",type:"float"},{name:"input_max",type:"float"},{name:"output_min",type:"float"},{name:"output_max",type:"float"}]});function Wu(e,t,a,r,s){return qu({value:e,input_min:t,input_max:a,output_min:r,output_max:s})}var Hu=re(e=>{let{x:t,style:a,smoothness:r,seed:s,quality:i}=e,n=Ye(C(t)).toVar(),l=L(t).toVar(),o=nr(8).toVar(),u=nr(8).toVar(),d=nr(8).toVar(),h=nr(8).toVar(),m=nr(8).toVar(),c=nr(8).toVar(),p=Ye(0).toVar(),g=ne(0).toVar(),f=Ce(i).toVar(),_=()=>({start:f.negate(),end:f,condition:"<=",type:"int"});gu(_(),_(),_(),({i:e,j:t,k:a})=>{let i=Ye(e,t,a).toVar(),d=ne(i).add(Du(ne(n.add(i)).add(s))).sub(l).toVar(),m=tt(d).toVar();o.assign(Uu(m,o,r)),le(m.lessThan(u),()=>{h.assign(u),u.assign(m),p.assign(Ye(e,t,a)),g.assign(d)}).ElseIf(m.lessThan(h),()=>{h.assign(m)})}),le(a.notEqual(Ce(0)).and(a.notEqual(Ce(5))).and(a.notEqual(Ce(7))),()=>{gu(_(),_(),_(),({i:e,j:t,k:a})=>{let i=p.add(Ye(e,t,a)).toVar(),o=ne(i).add(Du(ne(n.add(i)).add(s))).sub(l).toVar(),u=Ua(g.add(o).mul(.5),o.sub(g)).toVar(),h=Ua(g.add(o).mul(.5),Ja(o.sub(g))).toVar();m.assign(Uu(u,m,r)),c.assign(Ut(c,h));let f=Ye(e,t,a).toVar();le(Fe(pu(f,p)),()=>{let e=ne(f).add(Du(ne(n.add(f)).add(s))).sub(l).toVar(),t=tt(e).toVar();d.assign(Uu(t,d,r))})})});let y=nr(0).toVar();return le(a.equal(Ce(0)),()=>{y.assign(o)}).ElseIf(a.equal(Ce(1)),()=>{y.assign(d)}).ElseIf(a.equal(Ce(2)),()=>{y.assign(d.sub(o))}).ElseIf(a.equal(Ce(3)),()=>{let e=nr(3).toVar(),t=Pt(e.sub(Ae(u.sub(h))),0).div(e).toVar();y.assign(Ut(u,h).sub(t.mul(t).mul(e).mul(1/4)))}).ElseIf(a.equal(Ce(4)),()=>{y.assign($a(m.mul(5)))}).ElseIf(a.equal(Ce(5)),()=>{y.assign(ze(o,3))}).ElseIf(a.equal(Ce(6)),()=>{let e=r.mul(.25).add(.0125).toVar(),t=ze(r,3).mul(.25).add(.0125).toVar();y.assign(Jt(e.sub(e.mul(t)),e.add(e.mul(t)),c))}).ElseIf(a.equal(Ce(7)),()=>{y.assign(function(e){return Lu({p3:e})}(ne(n.add(p)).add(s)))}),y}).setLayout({name:"spe_voronoi",type:"float",inputs:[{name:"x",type:"vec3"},{name:"style",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"quality",type:"int"}]});function ju(e,t,a,r,s){return Hu({x:e,style:t,smoothness:a,seed:r,quality:s})}var Ku=[vu,function(e){return bu({m:e})},Ru,function(e){return Pu({x:e})},Bu],$u=e=>e,Xu=re(e=>{let t=e.v;return Ja(zt(Ae(t.x).greaterThan(Ae(t.z)),ne(t.y.negate(),t.x,0),ne(0,t.z.negate(),t.y)))}).setLayout({name:"spe_displaceOrthogonal",type:"vec3",inputs:[{name:"v",type:"vec3"}]});function Qu(e,t,a,r){return e.add(t).mul(a).mul(.001).add(1e-4).add(r.mul(.1))}var Zu=new Map,Yu=re(e=>{let{n:t,scale:a,intensity:r,offset:s,movement:i,smoothness:n}=e,l=e.p,o=nr(ju(Qu(l,s,a,i),e.voronoiStyle,n,e.seed,e.quality)).toVar();return o.assign(Wu(o,e.lowCut,e.highCut,nr(0),nr(1))),o.assign(Gu(o,nr(0),n.mul(.25))),o.assign(Uu(o,nr(1),n.mul(.25))),l.add(t.mul(o).mul(r))}).setLayout({name:"spe_displaceVoronoi",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"},{name:"voronoiStyle",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"highCut",type:"float"},{name:"lowCut",type:"float"},{name:"quality",type:"int"}]});function Ju(e,t,a){let r=function(e,t){let a=Math.trunc(e.getValue("noiseType")??0),r={n:t,scale:e.getFloat("scale"),intensity:e.getFloat("intensity"),offset:e.getVec3("offset"),movement:e.getFloat("movement")};if(5===a)return t=>Yu({...r,p:t,voronoiStyle:e.getInt("voronoiStyle"),smoothness:e.getFloat("smoothness"),seed:e.getFloat("seed"),highCut:e.getFloat("highCut"),lowCut:e.getFloat("lowCut"),quality:e.getInt("quality")});let s=function(e){let t=Zu.get(e);if(void 0===t){let a=Ku[e]??Ku[0];t=re(e=>{let{n:t,scale:r,intensity:s,offset:i,movement:n}=e,l=e.p;return l.add(t.mul(a(Qu(l,i,r,n))).mul(s))}).setLayout({name:`spe_displaceScalar${e}`,type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"}]}),Zu.set(e,t)}return t}(a);return e=>s({...r,p:e})}(e,a),s=ne(r(t)).toVar(),i=ne(function(e){return Xu({v:e})}(a)).toVar(),n=Ja(ca(a,i)).toVar(),l=ne(r(t.add(i))).toVar(),o=ne(r(t.add(n))).toVar();return{position:s,normal:Ja(ca(l.sub(s),o.sub(s)))}}Ko("color",(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:e.getColor("color"),calpha:Io(r,a)}});var ed=e=>e,td=e=>e;Ko("depth",(e,t,a)=>{let r,s=e.get("colors"),i=e.get("steps"),n=(e.getValue("colors")??s.array).length,l=!0===e.getValue("smooth"),o=(e.getValue("isVector")??1)>.5,u=0===(e.getValue("gradientType")??0),d=(e.getValue("isWorldSpace")??0)>.5,h=e.getFloat("near"),m=e.getFloat("far");if(o){let t=e.getVec3("origin"),a=d?Ve:Co;if(u){let s=Ja(e.getVec3("direction"));r=Ua(s,a.sub(t))}else r=tt(a.sub(t))}else r=tt(Ve.sub(xt));let c=r.sub(h).div(m.sub(h)).toVar(),p=de(s.element(0)).toVar();for(let e=1;e<n;e++){let t=ed(i.element(e-1)),a=ed(i.element(e)),r=Ft(c.sub(t).div(a.sub(t)),nr(0),nr(1)),n=l?Jt(nr(0),nr(1),r):r;p.assign(Wt(p,td(s.element(e)),n))}let g=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Lo(g,a,t.isMask)}}),Ko("cavity",(e,t,a)=>{let r=Ft(e.getFloat("ridge"),0,2),s=Ft(e.getFloat("valley"),0,2),i=w.normalViewRenderTarget,n=w.resolution,l=nt("randomColor","vec3").x.toVar(),o=Vt.toVar(),u=ae(nr(1).div(n.x),nr(1).div(n.y)).toVar(),d=(e,t)=>i.sample(o.add(ae(e,t)).toVar()).toVar(),h=d(nr(0),u.y.negate()),m=d(nr(0),u.y),c=d(u.x.negate(),nr(0)),p=d(u.x,nr(0)),g=e=>e.a.equal(l).and(Ua(e.xyz,e.xyz).greaterThan(.5)),f=g(h).and(g(m)).and(g(c)).and(g(p)),_=h.y.sub(m.y).add(p.x.sub(c.x)).toVar(),y=nr(.5).div(Pt(r.mul(r),nr(1e-4))).toVar(),x=nr(.7).div(Pt(s.mul(s),nr(1e-4))).toVar(),v=(e,t)=>zt(e.lessThan(nr(.5).div(t)),e.mul(nr(1).sub(e.mul(t))),nr(.25).div(t)),b=zt(f,zt(_.greaterThan(0),v(_,y).mul(2),v(_.negate(),x).mul(-2)),nr(0)).toVar(),T=zt(b.abs().lessThan(.001),nr(0),b).toVar(),S=ne(Ft(T.mul(.5).add(.5),0,1)),V=zt(T.notEqual(0),nr(1),nr(0)),M=zt(t.isMask,nr(1),V);return{color:S,calpha:Lo(t.alpha.mul(t.mask).mul(M),a,t.isMask)}}),Ko("dust",(e,t,a)=>{let r=e.getFloat("coverage"),s=e.getFloat("softness"),i=e.getFloat("noiseStrength"),n=e.getFloat("noiseScale"),l=Ua(Ja(Xa),ne(0,1,0)),o=nr(0).toVar();le(i.notEqual(0),()=>{let e=vu(Co.div(n).toVar().add(ne(1.7,9.2,1)));o.assign(e.mul(i))});let u=Pt(s,1e-4).toVar(),d=Wt(u.add(1),u.add(1).negate(),Ft(r,0,1)).toVar(),h=Jt(d.sub(u),d.add(u),l.add(o)).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Lo(h,a,t.isMask)}});var ad=(e,t)=>e.element(t);Ko("fresnel",(e,t,a)=>{let r=ad(wt,2).w.equal(-1),s=ne(ad(At,0).z,ad(At,1).z,ad(At,2).z).negate(),i=Ve.sub(xt),n=zt(r,i,s),l=e.getFloat("bias").add(e.getFloat("scale").mul(ze(Ae(e.getFloat("factor").add(Ua(Ja(n),Ja(Xa)))),e.getFloat("intensity")))),o=Ft(l,0,1).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Lo(o,a,t.isMask)}});var rd=e=>e,sd=e=>e;Ko("gradient",(e,t,a)=>{let r=e.get("colors"),s=e.get("steps"),i=(e.getValue("colors")??r.array).length,n=(e.getValue("steps")??s.array).length,l=Math.min(10,i,n),o=e.getInt("gradientType"),u=e.getBool("smooth"),d=e.getVec2("offset"),h=e.getVec2("morph"),m=e.getFloat("angle"),c=W(),p=de(r.element(0)).toVar(),g=ae(h.div(c)).toVar(),f=ae(nr(.5).add(g.x),g.y).toVar(),_=ae(ua(m).mul(f.x).sub(Xt(m).mul(f.y)),Xt(m).mul(f.x).add(ua(m).mul(f.y))).toVar(),y=ae(c.sub(.5).add(d).div(2).add(_.div(2))),x=nr(Ua(y,_).div(Ua(_,_))).toVar();le(o.equal(Ce(1)),()=>{x.assign(La(c.add(h).mul(3),c.add(d).add(1)).add(m))}).ElseIf(o.equal(Ce(2)),()=>{let e=He(c.x.add(h.x).sub(.5).add(d.x),c.y.add(h.y).sub(.5).add(d.y)).mul(-1);x.assign(L(m.div(xe).div(-2).add(e.div(xe).mul(.5))))});for(let e=1;e<l;e++){let t=rd(s.element(e-1)),a=rd(s.element(e)),i=Ft(x.sub(t).div(a.sub(t)),nr(0),nr(1)),n=rd(zt(u,Jt(nr(0),nr(1),i),i));p.assign(Wt(p,sd(r.element(e)),n))}let v=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Lo(v,a,t.isMask)}}),Ko("matcap",(e,t,a)=>{let r=e.getFloat("rotation"),s=Ja(_e.negate()),i=Ja(ne(s.z,0,s.x.negate())),n=ca(s,i),l=ae(Ua(i,Ha),Ua(n,Ha)),o=ua(r),u=Xt(r),d=ae(o.mul(l.x).sub(u.mul(l.y)),u.mul(l.x).add(o.mul(l.y))).mul(.495).add(.5),h=e.get("texture").sample(d),m=t.alpha.mul(t.mask);return{color:h.rgb,calpha:Lo(m,a,t.isMask)}}),Ko("noise",(e,t,a)=>{try{if("0"===new URLSearchParams(window.location.search).get("dbgnoise"))return{color:ne(0),calpha:nr(0)}}catch{}let r=Math.trunc(e.getValue("noiseType")??0),s=nr(Pt(Ae(e.getFloat("scale")),.001)).toVar(),i=ne(Co.div(e.getVec3("size"))).toVar();i.divAssign(s);let n=e.getFloat("move"),l=e.getVec4("colorA"),o=e.getVec4("colorC"),u=de(0).toVar();if(5===r){let t=e.getFloat("smoothness"),a=nr(ju(i.add(n),e.getInt("voronoiStyle"),t,e.getFloat("seed"),e.getInt("quality"))).toVar();a.assign(Wu(a,e.getFloat("lowCut"),e.getFloat("highCut"),nr(0),nr(1))),a.assign(Gu(a,nr(0),t.mul(.25))),a.assign(Uu(a,nr(1),t.mul(.25))),u.assign(Wt(l,o,a))}else{let t=Ku[r]??Ku[0],a=e.getVec4("colorB"),s=e.getVec4("colorD"),d=ne(e.getVec2("distortion"),1).toVar(),h=ne(e.getVec2("fA"),1).toVar(),m=ne(e.getVec2("fB"),1).toVar(),c=ne(t(i),t(i.add(ne(1))),t(i.add(ne(1)))).toVar(),p=ne(t(i.add(d.mul(c)).add(h).add(n)),t(i.add(d.mul(c)).add(m).add(n)),t(i.mul(c))).toVar(),g=nr(t(i.add(p))).toVar();u.assign(Wt(l,a,Ft(g.mul(g).mul(4),nr(0),nr(1)))),u.assign(Wt(u,o,Ft(tt(c),nr(0),nr(1)))),u.assign(Wt(u,s,Ft(tt(p.x),nr(0),nr(1))))}let d=t.alpha.mul(u.a).mul(t.mask);return{color:Ft(u,nr(0),nr(1)).rgb,calpha:Lo(d,a,t.isMask)}}),Ko("normal",(e,t,a)=>({color:F(Ja(Ha)).mul(ga(ne(.5),e.getVec3("cnormal"))),calpha:Io(t.alpha.mul(t.mask),a)}));var id=2*Math.PI,nd=Math.PI/180,ld=re(e=>{let t=L(e.p.xyx.mul(.1031)).toVar();return t.addAssign(Ua(t,t.yzx.add(33.33))),L(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_pattern_hash12",type:"float",inputs:[{name:"p",type:"vec2"}]});function od(e){return ld({p:e})}var ud=re(e=>{let t=e.uv,a=.5,r=nr(e.a.mul(nd)).toVar(),s=ae(ua(r).mul(t.x.sub(a)).add(Xt(r).mul(t.y.sub(a))).add(a),ua(r).mul(t.y.sub(a)).sub(Xt(r).mul(t.x.sub(a))).add(a));return L(s)}).setLayout({name:"spe_pattern_rotate_uv",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"a",type:"float"}]});function dd(e,t){return ud({uv:e,a:t})}var hd=re(e=>{let t=ae(e.uv.mul(e.frequency)).toVar(),a=ae(C(t)).toVar(),r=nr($t(a.y,2)).toVar();t.x.addAssign(r.mul(e.zigzag));let s=ae(L(t)).toVar();s.assign(s.mul(2).sub(1)),a.assign(C(t));let i=nr(od(a).mul(5).add(1)).toVar(),n=nr(Wt(nr(1),i,e.variation)).toVar();return s.mulAssign(n),s}).setLayout({name:"spe_pattern_tile_and_center",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"variation",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function md(e,t,a,r,s){return hd({uv:e,frequency:t,variation:a,zigzag:r,rotation:s})}var cd=re(e=>{let t=ae(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Jt(e.smoothness.negate(),e.smoothness,tt(t).sub(e.size))}).setLayout({name:"spe_pattern_circle",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),pd=re(e=>{let t=ae(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar(),a=nr(tt(t)).toVar(),r=nr(Jt(e.smoothness.negate(),e.smoothness,a.sub(e.size))).toVar(),s=nr(Jt(e.smoothness.negate(),e.smoothness,a.sub(e.size.mul(.5)))).toVar();return r.add(lr(s))}).setLayout({name:"spe_pattern_ring",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),gd=re(e=>{let t=nr(nr(id).div(nr(e.n))).toVar(),a=nr(e.r.mul(Na(t.mul(.5)))).toVar(),r=ae(e.p.yx.negate()).toVar(),s=nr(t.mul(C(He(r.y,r.x).add(t.mul(.5)).div(t)))).toVar(),i=ae(ua(s),Xt(s)).toVar();return r.assign(ae(i.x.mul(r.x).add(i.y.mul(r.y)),i.y.negate().mul(r.x).add(i.x.mul(r.y)))),tt(r.sub(ae(e.r,Ft(r.y,a.negate(),a)))).mul(Ht(r.x.sub(e.r)))}).setLayout({name:"spe_pattern_sdf_ngon",type:"float",inputs:[{name:"p",type:"vec2"},{name:"r",type:"float"},{name:"n",type:"int"}]}),fd=re(e=>{let t=ae(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Jt(e.smoothness.negate(),e.smoothness,gd({p:t,r:e.size,n:e.sides}))}).setLayout({name:"spe_pattern_polygon",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"},{name:"sides",type:"int"}]}),_d=re(e=>{let t=e.b,a=ae(Ae(e.p)).toVar();a.assign(zt(a.y.greaterThan(a.x),a.yx,a.xy));let r=ae(a.sub(t)).toVar(),s=nr(Pt(r.y,r.x)).toVar(),i=ae(zt(s.greaterThan(0),r,ae(t.y.sub(a.x),s.negate()))).toVar();return Ht(s).mul(tt(Pt(i,ae(0)))).add(e.r)}).setLayout({name:"spe_pattern_sdf_cross",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"},{name:"r",type:"float"}]}),yd=re(e=>{let t=ae(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Jt(e.smoothness.negate(),e.smoothness,_d({p:t,b:ae(e.size,e.size.mul(.25)),r:e.smoothness}))}).setLayout({name:"spe_pattern_xcross",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),xd=re(e=>{let t=e.b,a=ae(Ae(e.p)).toVar(),r=ae(t.sub(a.mul(2))).toVar(),s=r.x.mul(t.x).sub(r.y.mul(t.y)),i=nr(Ft(s.div(Ua(t,t)),nr(-1),nr(1))).toVar();return nr(tt(a.sub(t.mul(.5).mul(ae(lr(i),i.add(1)))))).toVar().mul(Ht(a.x.mul(t.y).add(a.y.mul(t.x)).sub(t.x.mul(t.y))))}).setLayout({name:"spe_pattern_sdf_diamond",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"}]}),vd=re(e=>{let t=ae(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return Jt(e.smoothness.negate(),e.smoothness,xd({p:t,b:ae(e.size)}))}).setLayout({name:"spe_pattern_diamond",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),bd=re(e=>{let t=ae(e.uv.mul(e.frequency)).toVar(),a=ae(C(t)).toVar(),r=nr($t(a.y,2)).toVar();t.x.addAssign(r.add(e.zigzag.mul(r)));let s=nr(C(t.x)).toVar();return $t(s,2)}).setLayout({name:"spe_pattern_checkerboard",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Td=re(e=>{let t=ae(md(e.uv,e.frequency,nr(0),e.zigzag,e.rotation)).toVar(),a=nr(C(e.uv.mul(e.frequency)).y).toVar(),r=nr(od(ae(a))).toVar(),s=nr(Wt(e.size,e.size.mul(r),e.variation)).toVar();return Jt(s.sub(e.smoothness),s.add(e.smoothness),Ae(t.y))}).setLayout({name:"spe_pattern_line",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),wd=re(e=>{let{a:t,b:a,c:r,d:s}=e,i=ae(e.p.sub(ae(s,t)).mul(r)).toVar();i.x.assign($t(i.x,id)),le(i.x.greaterThan(Math.PI),()=>{i.x.assign(nr(id).sub(i.x))});let n=nr(0).toVar(),l=nr(id).toVar();he(24,()=>{let e=nr(n.add(l).mul(.5)).toVar(),t=nr(e.sub(i.x).add(a.mul(r).mul(Xt(e)).mul(i.y.sub(a.mul(r).mul(ua(e)))))).toVar();le(t.lessThan(0),()=>{n.assign(e)}).Else(()=>{l.assign(e)})});let o=nr(n.add(l).mul(.5)).toVar(),u=ae(o,a.mul(r).mul(ua(o))).toVar();return tt(i.sub(u)).div(r)}).setLayout({name:"spe_pattern_udf_cos",type:"float",inputs:[{name:"p",type:"vec2"},{name:"a",type:"float"},{name:"b",type:"float"},{name:"c",type:"float"},{name:"d",type:"float"}]}),Sd=re(e=>{let t=nr(e.frequency.x).toVar(),a=ae(e.uv.mul(t)).toVar(),r=ae(C(a)).toVar(),s=nr($t(r.y,2)).toVar();a.x.addAssign(s.mul(e.zigzag));let i=ae(a.x,L(a.y)).toVar(),n=nr(e.frequency.y.mul(.1)).toVar(),l=nr(wd({p:i,a:nr(.5),b:nr(.125),c:n.mul(id),d:nr(0)})).toVar(),o=nr(od(ae(r.y))).toVar(),u=nr(Wt(e.size,e.size.mul(o),e.variation)).toVar();return Jt(e.smoothness.negate(),e.smoothness,l.sub(u.mul(.5)))}).setLayout({name:"spe_pattern_wave",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function Vd(e,t){let a={uv:t.uv,frequency:t.frequency,size:t.size,variation:t.variation,smoothness:t.smoothness,zigzag:t.zigzag,rotation:t.rotation};switch(e){case 1:return pd(a);case 2:return fd({...a,sides:t.sides});case 3:return yd(a);case 4:return vd(a);case 5:return bd(a);case 6:return Td(a);case 7:return Sd(a);default:return cd(a)}}Ko("pattern",(e,t,a)=>{let r,s,i=e.getValue("style")??0,n=e.getValue("projection")??0,l=e.getValue("axis")??0,o=e.getFloat("blending"),u=e.getVec2("offset"),d=e.getVec4("colorA"),h=e.getVec4("colorB"),m=e.getVec2("frequency"),c=e.getFloat("size"),p=e.getFloat("variation"),g=e.getFloat("smoothness"),f=e.getFloat("zigzag"),_=e.getFloat("rotation"),y=e.getVec2("vertical"),x=e.getVec2("horizontal"),v=e.getInt("sides"),b={frequency:m,size:c,variation:p,smoothness:nr(ze(g,5)).toVar(),zigzag:f,rotation:_,sides:v};if(4===n){let e=ne(Co).toVar(),t=nr(.0125).toVar(),a=ae(L(e.xy.mul(t))).toVar(),n=ae(L(e.zy.mul(t))).toVar(),l=ae(L(e.xz.mul(t))).toVar();a.assign(dd(a.add(u),_)),n.assign(dd(n.add(u),_)),l.assign(dd(l.add(u),_));let d=nr(Vd(i,{uv:a,...b})).toVar(),h=nr(Vd(i,{uv:n,...b})).toVar(),m=nr(Vd(i,{uv:l,...b})).toVar(),c=nr(lr(o).mul(125).add(3)).toVar(),p=ne(zo).toVar(),g=ne(Ae(Ja(p))).toVar();g.assign(ze(g,ne(c))),g.divAssign(Ua(g,ne(1))),d.mulAssign(g.z),h.mulAssign(g.x),m.mulAssign(g.y),r=nr(d.add(h).add(m)).toVar(),s=ae(a.mul(g.z).add(n.mul(g.x)).add(l.mul(g.y))).toVar()}else{let e=ae(0).toVar();if(0===n)e.assign(W());else if(2===n){let t,a,r=ne(Co).toVar(),s=nr(tt(r)).toVar();0===l?(t=nr(He(r.y,r.z)).toVar(),a=nr(Be(r.x.div(s))).toVar()):1===l?(t=nr(He(r.x,r.z)).toVar(),a=nr(Be(r.y.div(s))).toVar()):(t=nr(He(r.y,r.x)).toVar(),a=nr(Be(r.z.div(s))).toVar()),e.assign(ae(t,a).div(Math.PI))}e.addAssign(u),e.assign(L(e)),e.assign(dd(e,_)),r=Vd(i,{uv:e,...b}),s=e}let T=de(Wt(d,h,r)).toVar();T.a.assign(Ft(T.a,nr(0),nr(1))),T.a.mulAssign(ga(y.x,s.y).mul(ga(s.y,y.y))),T.a.mulAssign(ga(x.x,Ae(s.x)).mul(ga(Ae(s.x),x.y)));let w=t.alpha.mul(Ft(T.a,nr(0),nr(1))).mul(t.mask);return{color:Ft(T,de(0),de(1)).rgb,calpha:Lo(w,a,t.isMask)}});var Md=(e,t)=>e.element(t);Ko("rainbow",(e,t,a)=>{let r=e.getFloat("filmThickness"),s=e.getFloat("movement"),i=e.getVec3("wavelengths"),n=e.getFloat("noiseStrength"),l=e.getFloat("noiseScale"),o=e.getVec3("offset"),u=nr(0).toVar();!1!==t.noiseCompiledIn&&le(n.notEqual(0),()=>{let e=Co.div(l).toVar(),t=vu(e.mul(1.6).add(ne(1.8,1.5,1.9).mul(vu(e))).add(ne(1.7,9.2,1)));u.assign(t.mul(n))});let d=i.mul(ne(1,.8,.6)).add(1),h=Md(wt,2).w.equal(-1),m=ne(Md(At,0).z,Md(At,1).z,Md(At,2).z).negate(),c=Ve.sub(xt),p=zt(h,c,m),g=Ua(Ja(p.add(o.mul(-.001))),Ja(Xa)),f=ua(r.add(u).div(d).mul(g).add(s)).mul(.5).add(.5),_=ne(Ft(f,0,2)).toVar(),y=Ft(_.r.add(_.g).add(_.b),0,1);return{color:_,calpha:Lo(t.alpha.mul(y).mul(t.mask),a,t.isMask)}});var Rd=e=>e,Cd=e=>e,zd=he,kd=he,Ad=re(e=>{let t=e.x,a=ne(Ua(t,ne(127.1,311.7,74.7)),Ua(t,ne(269.5,183.3,246.1)),Ua(t,ne(113.5,271.9,124.6)));return L(Xt(a).mul(43758.5453123))}).setLayout({name:"spe_toonHash3",type:"vec3",inputs:[{name:"x",type:"vec3"}]}),Pd=re(e=>{let t=e.x,a=C(t).toVar(),r=L(t).toVar(),s=nr(100).toVar(),i=()=>({start:Ce(-1),end:Ce(1),condition:"<=",type:"int"});return kd(i(),i(),i(),({i:e,j:t,k:i})=>{let n=ne(e,t,i).toVar(),l=n.sub(r).add(function(e){return Ad({x:e})}(a.add(n))).toVar(),o=Ua(l,l).toVar();le(o.lessThan(s),()=>{s.assign(o)})}),s.sqrt()}).setLayout({name:"spe_toonVoronoiF1",type:"float",inputs:[{name:"x",type:"vec3"}]});Ko("toon",(e,t,a)=>{let r=e.getInt("positioning"),s=e.get("colors"),i=e.get("steps"),n=e.getVec3("source"),l=e.getBool("isWorldSpace"),o=e.getFloat("noiseStrength"),u=e.getFloat("noiseScale"),d=e.getVec4("shadowColor"),h=e.getVec3("offset"),m=Ja(Xa),c=nr(0).toVar();!0===a.lightsAvailable&&le(r.equal(Ce(0)),()=>{zd({start:Ce(0),end:w.toonLightCount,condition:"<",type:"int"},({i:e})=>{let t=w.toonLightData.element(e).toVar(),a=t.xyz,r=t.w,s=zt(r.greaterThan(.5),Ja(a),Ja(a.sub(Ve))),i=Ua(s,m).mul(.5).add(.5);c.assign(Pt(c,i))}),c.assign(Ft(c,0,1))}),le(r.equal(Ce(1)),()=>{let e=Wt(Co,Ve,zt(l,nr(1),nr(0))),t=Ja(n.sub(e));c.assign(Ua(t,m).mul(.5).add(.5))}).ElseIf(r.equal(Ce(2)),()=>{let e=xt.sub(h),t=Ja(e.sub(Ve));c.assign(Ua(t,m).mul(.5).add(.5))}),le(o.greaterThan(0),()=>{let e=Co.div(u),t=nr(1).sub(Pd({x:e}));c.addAssign(t.mul(o))}),c.assign(Ft(c,0,1));let p=(e.getValue("colors")??s.array).length,g=(e.getValue("steps")??i.array).length,f=Math.min(10,p,g),_=de(s.element(0)).toVar();for(let e=1;e<f;e++){let t=Rd(i.element(e-1)),a=Rd(i.element(e)),r=Ft(c.sub(t).div(a.sub(t)),nr(0),nr(1));_.assign(Wt(_,Cd(s.element(e)),Jt(0,1,r)))}!0===a.lightsAvailable&&le(r.equal(Ce(0)),()=>{let e=nr(1),t=Wt(_.rgb,d.rgb,d.a);_.rgb.assign(Wt(t,_.rgb,e))});let y=t.alpha.mul(_.a).mul(t.mask);return{color:_.rgb,calpha:Io(y,a)}});var Ed=e=>e,Nd=e=>e,Bd=e=>e,Ld=e=>e;Ko("transmission",(e,t,a)=>{let r=e.getFloat("thickness"),s=e.getFloat("ior"),i=e.getFloat("roughness"),n=w.transmissionRenderTarget,l=w.transmissionSamplerSize,o=e=>((e,t)=>At.element(t))(0,e),u=Ja(ne(o(0).z.negate(),o(1).z.negate(),o(2).z.negate())),d=Ja(Ve.sub(xt)),h=w.orthographicUniform,m=zt(h.greaterThan(.5),u,d).toVar(),c=Ja(Xa).toVar(),p=at(m,c,nr(1).div(s)).toVar(),g=Ja(p).mul(r).mul(ko).toVar(),f=e=>{let t=w.unjitteredProjection.mul(At).mul(de(e,1)),a=t.xy.div(t.w);return ae(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5))},_=f(Ve.add(g).toVar()).toVar(),y=(f(Ve).toVar(),i.mul(Ft(s.mul(2).sub(2),nr(0),nr(1))).toVar()),x=ct(l.x).mul(y).toVar(),v=y,b=Ut(x.div(5.5),nr(8.5)).toVar(),T=null,S="fit",V=!0,M=!1,R=12,z="white",k=1;try{let e=new URLSearchParams(window.location.search),t=e.get("dbglod");null!==t&&(T=Number(t));let a=e.get("dbgtap");"ring"===a&&(S="ring"),("single"===a||"1"===a)&&(S="single"),("r50"===a||"r75"===a||"full"===a)&&(S=a),"singlewide"===a&&(S="singlewide"),("fit"===a||"singlefit"===a)&&(S="fit");let r=e.get("dbgwidth");null!==r&&Number.isFinite(Number(r))&&(k=Math.max(0,Number(r))),"6"===a&&(S="ring",R=6),"0"===e.get("dbgwarp")&&(V=!1),"1"===e.get("dbgdither")&&(M=!0);let s=e.get("dbgangle");("classic"===s||"0"===s)&&(z=s)}catch{}null!==T&&Number.isFinite(T)&&b.assign(nr(T));let A,P=(()=>{if("singlewide"===S)return Ut(b.add(1),nr(8.5)).toVar();if("fit"!==S)return b;let e=w.transmissionActualSize.x.div(w.resolution.x),t=v.mul(b).mul(5*k).mul(e).toVar();return Ut(ct(Ya(b.mul(2)).add(t.mul(t).mul(3))).mul(.5),nr(8.5)).toVar()})(),E=e=>n.sample(V?(e=>{let t=w.transmissionActualSize.div(Ya(C(P))),a=e.mul(t).sub(.5),r=C(a),s=a.sub(r),i=s.mul(s).mul(ae(3,3).sub(s.mul(2)));return r.add(.5).add(i).div(t)})(e):e).level(P).rgb,N="r50"===S?.5:"r75"===S?.75:1;if("single"===S||"singlewide"===S||"fit"===S)if("fit"===S){let e=C(P).toVar(),t=P.sub(e).toVar(),a=ha(Ya(t.mul(2)).sub(1)).mul(1.1547).toVar(),r=ae(Ya(e)).div(w.transmissionActualSize).mul(a).toVar(),s=ne(0).toVar(),i=12;for(let t=0;t<i;t++){let a=Nd(Q(t,i,nr(0))),l=Nd(_.add(a.mul(r)));s.addAssign(Bd(Ld(n.sample(l).level(e)).rgb))}A=s.div(i).toVar()}else A=E(_).toVar();else{let e=ae(nr(1).div(w.resolution.x),nr(1).div(w.resolution.y)).toVar(),t=j("classic"===z?bt.xy.add(w.cameraJitterPx):bt.xy).mul(6.28318530718);"white"===z&&(t=t.add(w.tapAngle));let a=t.toVar(),r=w.tapAngle.mul(13.7).toVar(),s=w.tapAngle2.mul(5.3).toVar(),i=ae(Ya(C(P).add(1))).div(w.transmissionActualSize).toVar(),n=j(bt.xy.add(ae(r,s))).toVar(),l=j(bt.xy.add(ae(s.mul(1.71),r.mul(2.39)))).toVar(),o=ne(0).toVar();for(let t=0;t<R;t++){let r=Nd(Q(t,R,a)).mul(e).mul(v).mul(b.mul(10)).mul(N),s=Nd(_.add(r));if(M){let e=Ed(L(n.add(.7548776662*t))),a=Ed(L(l.add(.5698402911*t))),r=Nd(ae(e.sub(.5),a.sub(.5)).mul(i));s=Nd(s.add(r))}o.addAssign(E(s))}A=o.div(R).toVar()}if(e.has("attenuationDistance")){let t=e.getFloat("attenuationDistance"),a=ne(e.getColor("attenuationColor")).toVar();le(t.greaterThan(0),()=>{let e=ze(Pt(a,ne(1e-4)),ne(r.div(t)));A.mulAssign(e)})}let B=t.alpha.mul(t.mask).toVar(),I=B.div(Ft(B.add(a.accumAlpha),nr(1e-5),nr(1))).toVar();return a.accumAlpha.addAssign(nr(1).sub(a.accumAlpha).mul(t.alpha)),{color:A,calpha:I}}),Ko("reflection",(e,t,a)=>{let r=e.getFloat("blur"),s=e.getFloat("thickness"),i=e.getInt("steps"),n=e.getFloat("stepSize"),l=e.getValue("tracingMode")??0,o=w.reflectionRenderTarget,u=w.reflectionDepthPyramid,d=w.reflectionDepthPyramid,h=w.reflectionDepthLevels,m=w.reflectionEnvMap,c=w.reflectionPlanarTarget,p=w.reflectionPlanarEnabled,g=U("__splinePlanarMirror","float"),f=p.greaterThan(.5).and(g.greaterThan(.5)),_=w.reflectionResolveTarget,y=w.reflectionResolveEnabled,x=w.orthographicUniform.greaterThan(.5),v=zt(x,ne(0,0,-1),Ja(_e)).toVar(),b=Ja(Ha).toVar(),T=Je(v,b).toVar(),S=Ft(r.mul(.1),nr(0),nr(1)).toVar(),V=w.resolution,M=ne(0).toVar(),R=y.greaterThan(.5).and(S.greaterThan(.05)).and(f.not()),C=Ja(er(T,Bt)).toVar(),z=Oi(m,C,S).toVar(),k=_.sample(Vt).level(nr(0)).toVar();le(R,()=>{let e=k.a.toVar();M.assign(Wt(z,k.rgb.div(e.max(1e-4)),Ft(e.mul(2),nr(0),nr(1))))}).Else(()=>{M.assign(Gi({dials:{blur:r,thickness:s,steps:i,stepSize:n,tracingMode:l},surface:{originView:_e,normalV:b,screenUv:Vt,fragWindowZ:za},camera:{projectionMatrix:wt,projectionMatrixInverse:Rt,worldMatrix:Bt,near:gt},resources:{colorMap:o,depthPyramid:u,depthPyramidNode:d,envMap:m},usePlanar:f,noisePixel:Vt.mul(V).floor()}))}),le(f,()=>{let e=ae(nr(1).sub(Vt.x),Vt.y).toVar(),t=nr(h.sub(1)),a=Ut(ct(S.mul(V.y).mul(.075).add(1)),t).toVar(),r=a.sub(1).max(0).floor().toVar(),s=nr(2).pow(a).sub(1).max(0).toVar(),i=s.mul(.75).div(V.y).toVar();M.assign(Fi(c,e,i,s.mul(.75),r))});let A=t.alpha.mul(t.mask).toVar(),P=A.div(Ft(A.add(a.accumAlpha),nr(1e-5),nr(1))).toVar();return a.accumAlpha.addAssign(nr(1).sub(a.accumAlpha).mul(A)),{color:M,calpha:P}});var Id=e=>e,Dd=e=>e;function Fd(e){let t=e.data,a=[e.kind,e.type,`v=${!!t.visible}`,`m=${!!t.isMask}`,`p=${e.params.names().join(",")}`];if("light"!==e.type){let r=Dr[e.type];if(void 0!==r)for(let e of r)a.push(`${e}=${String(t[e])}`)}for(let[t,r]of e.uniformKinds)("vec4array"===r||"floatArray"===r)&&a.push(`${t}#${(e.params.getValue(t)??[]).length}`);if("rainbow"===e.type&&a.push(`noise=${!1!==e.noiseCompiledIn}`,`forced=${!0===e.noiseForced}`),"displace"===e.type&&a.push(`dt=${String(t.displacementType)}`),"texture"===e.type||"video"===e.type||"matcap"===e.type){if(0===e.holders.length)throw new Error(`structuralKey: ${e.type} layer has no holder`);let r=t.texture??{};a.push(`holder=${e.holders.map(e=>e.instanceId).join(",")}`,`wrap=${String(r.wrapping)}`,`min=${String(r.minFilter)}`,`mag=${String(r.magFilter)}`)}return a.join(";")}Ko("outline",(e,t,a)=>{let r=e.getColor("outlineColor"),s=e.getColor("contourColor"),i=e.getFloat("outlineWidth"),n=e.getFloat("contourWidth"),l=e.getFloat("outlineThreshold"),o=e.getFloat("contourThreshold"),u=e.getFloat("outlineSmoothing"),d=e.getFloat("contourFrequency"),h=e.getVec3("contourDirection"),m=e.getBool("positionalLines"),c=e.getBool("compensation"),p=w.normalRenderTarget,g=w.normalRenderTargetDepth,f=w.resolution,_=w.pixelRatio,y=nt("randomColor","vec3").x.toVar(),x=za.toVar(),v=Vt.toVar(),b=ae(nr(1).div(f.x),nr(1).div(f.y)).toVar(),T=w.pcssHalton,S=j(bt.xy.add(T)).mul(6.28318530718).toVar(),V=c.select(i.div(2),i),M=b.mul(V).mul(_).toVar(),R=[[-1,-1],[0,-1],[1,-1],[-1,0],[0,0],[1,0],[-1,1],[0,1],[1,1]],C=e=>Q(e,9,S).mul(b),z=[],k=nr(0).toVar();for(let e=0;e<9;e++){let[t,a]=R[e],r=4===e?v:Id(v.add(ae(M.x.mul(t),M.y.mul(a))).add(C(e))),s=Id(r).toVar(),i=Dd(p.sample(s)).toVar();z.push(i),le(i.a.notEqual(y).and(i.a.notEqual(0)),()=>{let e=g.sample(s).r.add(1e-4);le(x.greaterThan(e),()=>{k.assign(1)})})}let A=z[2].rgb.add(z[5].rgb.mul(2)).add(z[8].rgb).sub(z[0].rgb.add(z[3].rgb.mul(2)).add(z[6].rgb)),P=z[0].rgb.add(z[1].rgb.mul(2)).add(z[2].rgb).sub(z[6].rgb.add(z[7].rgb.mul(2)).add(z[8].rgb)),E=ha(Ua(A,A).add(Ua(P,P))).mul(k.oneMinus()).toVar(),N=ne(r).toVar(),B=Jt(l.sub(u),l.add(u),E).toVar(),I=Ja(Xa).toVar(),D=nr(1).sub(o).toVar();le(m,()=>{let e=Co.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=L(t.mul(d).mul(.01)),r=G(t.mul(d)),i=Jt(r.mul(n.mul(.01)),r.mul(n.mul(.02)),a).toVar();le(i.lessThan(1).and(B.equal(0)),()=>{N.assign(s),B.assign(1)})}).Else(()=>{let e=I.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=G(t.mul(o)).toVar(),r=Xt(t.mul(d)).toVar(),i=Jt(nr(0),a.mul(n),nr(1).sub(r)).toVar();le(a.greaterThan(D.mul(.5)).and(i.lessThan(1)).and(B.equal(0)),()=>{N.assign(s),B.assign(nr(1).sub(i))})});let F=t.alpha.mul(B).mul(t.mask).toVar(),U=F.div(Ft(F.add(a.accumAlpha),nr(1e-5),nr(1))).toVar();return a.accumAlpha.addAssign(nr(1).sub(a.accumAlpha).mul(F)),{color:N,calpha:U}}),Ko("vertexColor",(e,t,a)=>{let r=ye(),s=t.alpha.mul(t.mask).mul(r.a);return{color:r.rgb,calpha:Io(s,a)}});var Ud=e=>e,Od=e=>e;function Gd(e,t=1){let a=new Vs(e);return new Ur(a.r,a.g,a.b,t)}function qd(e,t){if(e instanceof Ur)return e;if(e instanceof Vs)return new Ur(e.r,e.g,e.b,1);if("number"==typeof e)return Gd(e);if("object"==typeof e&&null!==e&&"r"in e&&"g"in e&&"b"in e){let t=e;return new Ur(t.r,t.g,t.b,t.a??1)}return t()}function Wd(){let e=new Array(10).fill(new ys(0,0,0,1)).map(e=>e.clone());return e[1]=new ys(1,1,1,1),e}function Hd(){let e=new Array(10).fill(1);return e[0]=0,e}var jd={color:{color:{kind:"color",def:()=>Gd(Zr)}},vertexColor:{},cavity:{ridge:{kind:"float",def:()=>1},valley:{kind:"float",def:()=>1}},fresnel:{color:{kind:"color",def:()=>Gd(16777215)},bias:{kind:"float",def:()=>.1},scale:{kind:"float",def:()=>1},intensity:{kind:"float",def:()=>2},factor:{kind:"float",def:()=>1}},dust:{color:{kind:"color",def:()=>Gd(10323813)},coverage:{kind:"float",def:()=>.2},softness:{kind:"float",def:()=>.2},noiseStrength:{kind:"float",def:()=>.2},noiseScale:{kind:"float",def:()=>1}},rainbow:{filmThickness:{kind:"float",def:()=>30},movement:{kind:"float",def:()=>0},wavelengths:{kind:"vec3",def:()=>new hs},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},offset:{kind:"vec3",def:()=>new hs}},transmission:{thickness:{kind:"float",def:()=>10},ior:{kind:"float",def:()=>1.5},roughness:{kind:"float",def:()=>.5},attenuationColor:{kind:"color",def:()=>Gd(16777215)},attenuationDistance:{kind:"float",def:()=>0}},reflection:{blur:{kind:"float",def:()=>0},thickness:{kind:"float",def:()=>.001},steps:{kind:"int",def:()=>60},stepSize:{kind:"float",def:()=>.005},tracingMode:{kind:"int",def:()=>1}},toon:{positioning:{kind:"int",def:()=>0},colors:{kind:"vec4array",def:Wd},steps:{kind:"floatArray",def:Hd},source:{kind:"vec3",def:()=>new hs},isWorldSpace:{kind:"bool",def:()=>!0},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},shadowColor:{kind:"colorVec4",def:()=>new Ur(0,0,0,0)},offset:{kind:"vec3",def:()=>new hs}},outline:{outlineColor:{kind:"color",def:()=>Gd(16777215)},contourColor:{kind:"color",def:()=>Gd(16777215)},outlineWidth:{kind:"float",def:()=>.1},contourWidth:{kind:"float",def:()=>.1},outlineThreshold:{kind:"float",def:()=>.1},contourThreshold:{kind:"float",def:()=>.1},outlineSmoothing:{kind:"float",def:()=>.1},contourFrequency:{kind:"float",def:()=>.1},contourDirection:{kind:"vec3",def:()=>new hs(0,1,0)},positionalLines:{kind:"bool",def:()=>!1},compensation:{kind:"bool",def:()=>!0}},depth:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},near:{kind:"float",def:()=>50},far:{kind:"float",def:()=>200},isVector:{kind:"float",def:()=>1},isWorldSpace:{kind:"float",def:()=>0},origin:{kind:"vec3",def:()=>new hs},direction:{kind:"vec3",def:()=>new hs(1,0,0)},colors:{kind:"vec4array",def:()=>[new ys(0,0,0,1),new ys(1,1,1,1)]},steps:{kind:"floatArray",def:()=>[0,1]}},noise:{scale:{kind:"float",def:()=>1},size:{kind:"vec3",def:()=>new hs(100,100,100)},move:{kind:"float",def:()=>1},fA:{kind:"vec2",def:()=>new us(1.7,9.2)},fB:{kind:"vec2",def:()=>new us(8.3,2.8)},distortion:{kind:"vec2",def:()=>new us(1,1)},colorA:{kind:"colorVec4",def:()=>new Ur(.4,.4,.4,1)},colorB:{kind:"colorVec4",def:()=>new Ur(.4,.4,.4,1)},colorC:{kind:"colorVec4",def:()=>new Ur(1,1,1,1)},colorD:{kind:"colorVec4",def:()=>new Ur(1,1,1,1)},noiseType:{kind:"int",def:()=>0},voronoiStyle:{kind:"int",def:()=>0},highCut:{kind:"float",def:()=>1},lowCut:{kind:"float",def:()=>0},smoothness:{kind:"float",def:()=>.5},seed:{kind:"float",def:()=>.5},quality:{kind:"int",def:()=>1}},normal:{cnormal:{kind:"vec3",def:()=>new hs(1,1,1)}},gradient:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},colors:{kind:"vec4array",def:Wd},steps:{kind:"floatArray",def:Hd},offset:{kind:"vec2",def:()=>new us},morph:{kind:"vec2",def:()=>new us},angle:{kind:"float",def:()=>0}},pattern:{style:{kind:"int",def:()=>0},projection:{kind:"int",def:()=>0},axis:{kind:"axis",def:()=>"x"},blending:{kind:"float",def:()=>0},offset:{kind:"vec2",def:()=>new us},colorA:{kind:"colorVec4",def:()=>new Ur(0,0,0,1)},colorB:{kind:"colorVec4",def:()=>new Ur(1,1,1,1)},frequency:{kind:"vec2",def:()=>new us(10,10)},size:{kind:"float",def:()=>.5},variation:{kind:"float",def:()=>0},smoothness:{kind:"float",def:()=>.5},zigzag:{kind:"float",def:()=>0},rotation:{kind:"float",def:()=>0},vertical:{kind:"vec2",def:()=>new us(0,1)},horizontal:{kind:"vec2",def:()=>new us(0,1)},sides:{kind:"int",def:()=>6}}},Kd=new ys;function $d(e,t){let a=e.material;if((null==a||!0!==a.isTSLNodeMaterial)&&(a=e.object?.material,null==a||!0!==a.isTSLNodeMaterial))return t;if("light"===t.kind){let e=a.lightLayer;if(null==e)return t;let r=e.data?.category,s=t.data?.category;return r===s?e:t}let r=a.layers?.[t.structIndex];return void 0!==r&&r.type===t.type?r:t}function Xd(e,t){if("number"!=typeof t||!Number.isInteger(t)||t<0)throw new Error(`[spe] ${e}.element() needs a build-time constant index (got ${String(t)}). Array params are inlined as per-slot uniforms; a dynamic index needs a real uniformArray.`);return t}function Qd(e,t,a,r){let s,i,n=e.params;switch(a){case"float":s=k(Number(r??0));break;case"int":s=k(Number(r??0),"int");break;case"axis":s=k(["x","y","z"].indexOf(String(r)),"int");break;case"bool":s=k(!!r);break;case"vec2":s=k(r instanceof us?r:new us);break;case"vec3":s=k(r instanceof hs?r:new hs);break;case"vec4":s=k(r instanceof ys?r:new ys);break;case"color":{let e=qd(r,()=>Gd(16777215));s=k(e),i=e;break}case"colorVec4":{let a=qd(r,()=>new Ur(1,1,1,1)),n=new ys(a.r,a.g,a.b,a.a),l=k(n);l.onObjectUpdate(r=>{let s=$d(r,e).params.getLiveValue(t)??a;n.set(s.r,s.g,s.b,s.a)}),s=l,i=a;break}case"vec4array":{let a=Array.isArray(r)?r:[];s=function(e,t,a){let r=new Map;return{element(s){let i=Xd(t,s),n=r.get(i);if(void 0===n){let s=k(a[i]??new ys);s.onObjectUpdate(r=>($d(r,e).params.getValue(t)??a)[i]??Kd),n=s,r.set(i,n)}return n},array:a,get value(){return a},set value(e){if(Array.isArray(e))for(let t=0;t<Math.min(a.length,e.length);t++){let r=e[t];Array.isArray(r)?a[t].set(r[0]??0,r[1]??0,r[2]??0,r[3]??1):r&&"object"==typeof r&&a[t].set(r.x??0,r.y??0,r.z??0,r.w??1)}}}}(e,t,a.length>0?a:[new ys]),i=a;break}case"floatArray":{let a=Array.isArray(r)?r:[0];s=function(e,t,a){let r=new Map;return{element(s){let i=Xd(t,s),n=r.get(i);if(void 0===n){let s=k(a[i]??0);s.onObjectUpdate(r=>{let s=$d(r,e).params.getValue(t);return Number((s??a)[i]??0)}),n=s,r.set(i,n)}return n},array:a,get value(){return a},set value(e){if(Array.isArray(e))for(let t=0;t<Math.min(a.length,e.length);t++)a[t]=Number(e[t])}}}(e,t,a.length>0?a:[0]),i=a;break}}"vec4array"!==a&&"floatArray"!==a&&"colorVec4"!==a&&(Po(s),s.onObjectUpdate(a=>{let r=$d(a,e).params.getValue(t);void 0!==r&&No(s,r)})),n.set(t,s,i),e.uniformKinds.set(t,a)}var Zd=class{constructor(e,t,a,r){this.repeat=e,this.offset=t,this.rotation=a,this.target=r,this.updateMatrix()}updateMatrix(){this.target.setUvTransform(this.offset[0],this.offset[1],this.repeat[0],this.repeat[1],0,0,0).premultiply((new ms).makeRotation(this.rotation*ns.DEG2RAD))}},Yd=class{constructor(e,t,a,r){this.kind=e,this.id=t,this.uuid=a,this.data=r,this.uniformKinds=new Map,this.holders=[],this.structIndex=-1,this.params=new Bo(t)}get type(){return this.data.type}get uniforms(){return this.params.uniforms}get alphaNode(){return this.params.getFloat("alpha")}get modeNode(){return this.params.getInt("mode")}get isMaskNode(){return this.params.getFloat("isMask")}get isMaskEnabled(){return"isMask"in this.data&&!!this.data.isMask}hasValue(e){return this.params.has(e)}setValue(e,t){if("noiseStrength"===e&&!1===this.noiseCompiledIn&&"number"==typeof t&&0!==t&&void 0!==this.onNoiseMismatch){let a=this.onNoiseMismatch;return this.onNoiseMismatch=void 0,this.params.setValue(e,t),void(a(t)&&(this.noiseCompiledIn=!0))}this.params.setValue(e,t)}getNode(e){return this.params.has(e)?this.params.get(e):void 0}getValue(e){return this.params.getValue(e)}getName(e){let t=/f\d+_(.*)/.exec(e);if(t&&t.length>1)return t[1];console.log(`Layer.getName: error ${e}`)}getNames(){return this.params.names()}get assetsLoaded(){return this.holders.every(e=>e.loaded)}dispose(){for(let e of this.holders)e instanceof qr||e.deref();this.holders.length=0}},Jd=class extends Yd{constructor(e,t,a){super("light",e,t,a),this.node={alphaOverride:void 0,alpha:{value:1}}}get lightData(){return this.data}get category(){return this.lightData.category??"phong"}};function eh(e,t){let a=e.data;"displace"!==a.type?("alpha"in a&&e.params.has("alpha")&&e.params.setValue("alpha",Br(a.alpha,t)*(a.visible?1:0)),"outline"===a.type&&e.params.has("compensation")&&e.params.setValue("compensation",!!a.compensation&&!!a.visible)):e.params.has("intensity")&&e.params.setValue("intensity",(Lr(a.intensity,t)??1)*(a.visible?1:0))}function th(e,t){Qd(e,"alpha","float",t.alpha??1),Qd(e,"mode","int",t.mode??0),Qd(e,"isMask","float",t.isMask?1:0)}function ah(e,t,a,r){let s=new Jd(e,t,a),i=a;if(Qd(s,"alpha","float",Br(i.alpha,r)),Qd(s,"mode","int",i.mode??0),Qd(s,"bumpMapIntensity","float",i.bumpMapIntensity??5),Qd(s,"alphaOverride","float",Br(i.alphaOverride,r)),a.visible)if("lambert"===i.category)Qd(s,"emissive","color",r.color(i.emissive)??Gd(0)),Qd(s,"occlusion","bool",i.occlusion??!0);else if("toon"===i.category)Qd(s,"shininess","float",i.shininess??30),Qd(s,"specular","color",r.color(i.specular)??Gd(1118481));else if("physical"===i.category){Qd(s,"roughness","float",i.roughness??.3),Qd(s,"metalness","float",i.metalness??0),Qd(s,"reflectivity","float",i.reflectivity??.5),Qd(s,"occlusion","bool",i.occlusion??!0),Qd(s,"normalScale","float",i.normalScale??1),Qd(s,"aoMapIntensity","float",i.aoMapIntensity??1),Qd(s,"emissive","color",void 0!==i.emissive?r.color(i.emissive)??Gd(0):Gd(0)),Qd(s,"emissiveIntensity","float",i.emissiveIntensity??1);let e=i;void 0!==e.clearcoat&&(Qd(s,"clearcoat","float",e.clearcoat),Qd(s,"clearcoatRoughness","float",e.clearcoatRoughness??.1)),void 0!==e.sheen&&(Qd(s,"sheen","float",e.sheen),Qd(s,"sheenColor","color",void 0!==e.sheenColor?r.color(e.sheenColor)??Gd(16777215):Gd(16777215)),Qd(s,"sheenRoughness","float",e.sheenRoughness??.5)),void 0!==e.ior&&(Qd(s,"ior","float",e.ior),Qd(s,"specularIntensity","float",e.specularIntensity??1),Qd(s,"specularColor","color",void 0!==e.specularColor?r.color(e.specularColor)??Gd(16777215):Gd(16777215))),void 0!==e.iridescence&&(Qd(s,"iridescence","float",e.iridescence),Qd(s,"iridescenceIOR","float",e.iridescenceIOR??1.3),Qd(s,"iridescenceThickness","float",e.iridescenceThickness??400))}else Qd(s,"shininess","float",i.shininess??30),Qd(s,"specular","color",void 0!==i.specular?r.color(i.specular)??Gd(1118481):Gd(1118481)),Qd(s,"occlusion","bool",i.occlusion??!0);return s.node.alphaOverride=s.params.get("alphaOverride"),eh(s,r),s}function rh(e,t,a,r){let s=new Yd("fragment",e,t,a),i="texture"===a.type?null!=a.texture.image?r.uiBuffer(a.texture.image)??r.image(a.texture.image):r.getImage(""):"video"===a.type?r.video(a.texture.video):null!=a.texture.image?r.image(a.texture.image):r.getImage("");s.holders.push(i);let n=a.texture.wrapping??("texture"===a.type?1e3:1001),l=function(e,t,a,r){let s=Da(e.getTexture(t,a,r));return s.onRenderUpdate(()=>e.getTexture(t,a,r)),s}(i,n,a.texture.minFilter??1008,a.texture.magFilter??1006);s.params.set("texture",l);let o=Lr(a.texture.rotation??0,r)??0;if("matcap"===a.type)Qd(s,"rotation","float",o*ns.DEG2RAD);else{let e=k(new us(1,1));e.onRenderUpdate(()=>{let t=i.getTexture(n,a.texture.minFilter??1008,a.texture.magFilter??1006).image;e.value.set(t?.width??1,t?.height??1)}),s.params.set("textureSize",e),s.uniformKinds.set("textureSize","vec2");let t=k(i.loaded||i.isBuffer?1:0);t.onRenderUpdate(()=>i.loaded||i.isBuffer?1:0),s.params.set("loaded",t),s.uniformKinds.set("loaded","float"),Qd(s,"crop","float",a.crop?1:0),Qd(s,"projection","int",a.projection??0),Qd(s,"axis","axis",a.axis),Qd(s,"projectionAxis","axis",a.projectionAxis),Qd(s,"side","int",a.side??0);let l=a.size?new us(Lr(a.size[0],r)??0,Lr(a.size[1],r)??0):new us(100,100);Qd(s,"size","vec2",l),Qd(s,"blending","float",a.blending??0);let u=new ms,d=new Zd([Lr(a.texture.repeat?.[0]??1,r)??1,Lr(a.texture.repeat?.[1]??1,r)??1],[Lr(a.texture.offset?.[0]??0,r)??0,Lr(a.texture.offset?.[1]??0,r)??0],o,u),h=k(u);Po(h),h.onObjectUpdate(e=>{let t=$d(e,s).params.getNodeValue("mat");void 0!==t&&No(h,t)}),s.params.set("mat",h,d)}return th(s,{alpha:Br(a.alpha,r),mode:a.mode??0,isMask:a.isMask??!1}),eh(s,r),s}function sh(e,t,a,s){if("light"===a.type)return ah(e,t,a,s);if("texture"===a.type||"video"===a.type||"matcap"===a.type)return rh(e,t,a,s);if("displace"===a.type)return function(e,t,a,r){if("noise"!==a.displacementType)throw new Error;let s=new Yd("vertex",e,t,a),i=(e,t)=>Lr(e,r)??t;return Qd(s,"offset","vec3",new hs(...a.offset.map(e=>i(e,0)))),Qd(s,"scale","float",i(a.scale,10)),Qd(s,"intensity","float",i(a.intensity,8)),Qd(s,"movement","float",i(a.movement,1)),Qd(s,"noiseType","int",a.noiseType??0),Qd(s,"voronoiStyle","int",a.voronoiStyle??0),Qd(s,"smoothness","float",i(a.smoothness,.5)),Qd(s,"seed","float",i(a.seed,0)),Qd(s,"highCut","float",i(a.highCut,1)),Qd(s,"lowCut","float",i(a.lowCut,0)),Qd(s,"quality","int",Lr(a.quality,r)??1),eh(s,r),s}(e,t,a,s);let i=new Yd("fragment",e,t,a),n=r(a,s),l=jd[a.type]??jd.color;for(let[e,t]of Object.entries(l))Qd(i,e,t.kind,n[e]??t.def());if("transmission"===a.type){let e=typeof window<"u"?window.innerWidth:1,t=typeof window<"u"?window.innerHeight:1;Qd(i,"aspectRatio","vec2",e>=t?new us(t/e,1):new us(1,e/t))}return th(i,n),eh(i,s),i}var ih={displace_noise:[{nums:["intensity","scale","movement","smoothness","seed","highCut","lowCut"],vecs:["offset"]}],displace_map:[{nums:["intensity"],vecs:[]}],depth:[{nums:["near","far"],vecs:["origin","direction"]}],cavity:[{nums:["ridge","valley"],vecs:[]}],fresnel:[{nums:["bias","scale","intensity","factor"],vecs:[]}],dust:[{nums:["coverage","softness","noiseStrength","noiseScale"],vecs:[]}],rainbow:[{nums:["filmThickness","movement","noiseStrength","noiseScale"],vecs:["offset","wavelengths"]}],noise:[{nums:["scale","move","seed","highCut","lowCut","smoothness"],vecs:["size","distortion","fA","fB"]}],pattern:[{nums:["blending","size","variation","smoothness","zigzag","rotation"],vecs:["offset","frequency","vertical","horizontal"]}],outline:[{nums:["outlineWidth","contourWidth","outlineThreshold","contourThreshold","outlineSmoothing","contourFrequency"],vecs:["contourDirection"]}],toon:[{nums:["noiseStrength","noiseScale"],vecs:["offset","source"]}],transmission:[{nums:["roughness","thickness","ior"],vecs:[]}],reflection:[{nums:["blur","thickness","steps","stepSize"],vecs:[]}],texture:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],video:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],gradient:[{nums:["angle"],vecs:["offset","morph"]}],matcap:[{nums:["rotation"],vecs:[],path:["texture"]}]},nh=class extends Tt{constructor(e,t,a=!0,r){super(),this.allowVariableSaves=a,this.isTSLNodeMaterial=!0,this.layerIdGen=0,this.layers=[],this.flavors=[],this.flatShading=!1,this.wireframe=!1,this.emissiveNode=null,this.shapeBlendOptions=null,this.envMapRotation=Vi.rotation,this._shapeBlendResources=null,this._shapeBlendColorNode=null,this.shapeBlendObjectNormal=null,this.displacedObjectNormal=null,this.syntheticMapLayers=new Map,this._structuralKey=null,this._structuralKeyVersion=-1,this.forceRainbowNoise=new Set,this.root=r??this,this.fog=!0,this.dithering=!0,this.vertexColors=!1,this.transparent=!0,r?(this.lastContext=r.lastContext,this.syncFromRoot()):this.reset0(e,t),function(e){Mi.add(e)}(this),this.addEventListener("dispose",()=>function(e){Mi.delete(e)}(this))}_invalidateStructuralKey(){this._structuralKey=null,this._structuralKeyVersion=-1}customProgramCacheKey(){let e=this._structuralKey;if(null===e||this._structuralKeyVersion!==this.version){try{e=function(e){let t=e.lightLayer,a=t.data,r=t=>{if(!t)return-1;if("string"!=typeof t){let a=e.syntheticMapLayers?.get(t);return void 0!==a?`img(${Fd(a)};o=${JSON.stringify(t.offset??null)};r=${JSON.stringify(t.repeat??null)})`:"img"}let a=e.layers.findIndex(e=>e.uuid===t);if(-1===a||"fragment"!==e.layers[a].kind)return-1;let r=e.layers[a].type;return"texture"===r||"video"===r?a:-1},s="physical"===e.category,i=["spe-tsl-v1",`lights=${e.lights}`,`cat=${e.category}`,`lvis=${!0===a.visible}`,`lidx=${e.layers.indexOf(t)}`,`bump=${r(a.bumpMap)}`,`rough=${s?r(a.roughnessMap):-1}`,`metal=${s?r(a.metalnessMap):-1}`,`nrm=${s?r(a.normalMap):-1}`,`ao=${s?r(a.aoMap):-1}`,`emis=${s?r(a.emissiveMap):-1}`,`rch=${s?a.roughnessMapChannel??"luminance":""}`,`mch=${s?a.metalnessMapChannel??"b":""}`,`ach=${s?a.aoMapChannel??"r":""}`];for(let t of e.layers)i.push(Fd(t));return i.join("|")}(this),null!==this.shapeBlendOptions&&(e+=`|sb:${this.uuid}:${null!==this._shapeBlendResources?1:0}`)}catch{e=super.customProgramCacheKey()}this._structuralKey=e,this._structuralKeyVersion=this.version}let t=this.envNode instanceof ki?Vi.version:0,a=this.physicalLobes();return`${e}|env${t}|lobes${(a.clearcoat?1:0)|(a.sheen?2:0)|(a.iridescence?4:0)}`}get isRoot(){return this.root===this}get category(){return this.lightLayer.category}envReflectiveInLow(){let e=!1;for(let t of this.layers){let a=t.data;if("physical"===a?.category&&(e=!0,void 0!==a.roughnessMap||void 0!==a.metalnessMap||"number"!=typeof a.roughness||"number"!=typeof a.metalness||void 0!==a.clearcoat||void 0!==a.sheen||void 0!==a.iridescence||void 0!==a.ior||a.metalness>.3||a.roughness<.4))return!0}return!e}get hasAO(){return this.lightLayer.getValue("occlusion")??!1}get fragment(){}reset(e,t,a=!1){(this.data!==e||a)&&this.reset0(e,t)}reset0(e,t){this.lastContext=t,this.data=e;let a=e.layers??jr.defaultTwoLayerData("phong").layers;for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear();let r=[];for(let e of a)try{let a=sh(this.layerIdGen++,e.id,e.data,t.shared);"rainbow"===a.type&&this.armRainbowNoiseSpecialization(a),r.push(a)}catch(t){console.warn(`[spe] material layer '${e.data.type}' (${e.id}) failed to build — skipping this layer`,t)}this.layers=r,this.layers.reverse();for(let e=0;e<this.layers.length;e++)this.layers[e].structIndex=e;this.name=e.name??"Untitled Material";let s=this.layers.find(e=>e instanceof Jd);if(void 0===s&&(s=ah(0,"",{...Hr.defaultData("light","phong"),visible:!1},t.shared)),this.lightLayer=s,this.lights=!!this.lightLayer.data.visible,this.ctx={accumAlpha:nr(0).toVar("accumAlpha"),lightsAvailable:this.lights&&("phong"===this.category||"lambert"===this.category||"physical"===this.category)},this.colorNode=re(()=>this.buildColorStack())(),this.buildVertexStack(),this.normalNode=this.buildNormalNode(this.displacedNormalView()),this.emissiveNode=this.lights&&"lambert"===this.category&&this.lightLayer.params.has("emissive")?this.lightLayer.params.get("emissive"):null,this.aoNode=null,this.lights&&"physical"===this.category){let e=this.lightLayer.params,t=this.lightLayer.lightData;if(e.has("emissive")){let a=this.findTextureMapLayer(t.emissiveMap);this.emissiveNode=re(()=>{let t=ne(e.getColor("emissive")).mul(e.getFloat("emissiveIntensity"));return null!==a&&(t=t.mul(function(e){let t,a=e.get("texture"),r=e.has("loaded")?e.getFloat("loaded"):nr(1),{uvs:s,weights:i}=uu(e);if(null!==i){let e=ne(a.sample(s[0]).rgb).toVar(),r=ne(a.sample(s[1]).rgb).toVar(),n=ne(a.sample(s[2]).rgb).toVar();t=e.mul(i.z).add(r.mul(i.x)).add(n.mul(i.y))}else t=ne(a.sample(s[0]).rgb);return Wt(ne(0),t,r)}(a.params))),t})()}let a=this.findTextureMapLayer(t.aoMap);null!==a&&(this.aoNode=re(()=>Wt(nr(1),cu(a.params,t.aoMapChannel??"r"),e.getFloat("aoMapIntensity")))())}this.transparent=Nr(e,t.shared),Ri(this),this.needsUpdate=!0;for(let e of this.flavors)e?.syncFromRoot();this.saveVariableLocations(t)}setTransparent(e,t){if(this.isRoot){if(this.transparent!==e){this.transparent=e,this.needsUpdate=!0;for(let t of this.flavors)void 0!==t&&(t.transparent=e,t.needsUpdate=!0);t?.markNeedsUpdateRendererDirty()}}else this.root.setTransparent(e,t)}syncFromRoot(){let e=this.root;this.data=e.data,this.layers=e.layers,this.lightLayer=e.lightLayer,this.ctx=e.ctx,this.name=e.name,this.lights=e.lights,this.colorNode=e.colorNode,this.positionNode=e.positionNode,this.normalNode=this.buildNormalNode(this.displacedNormalView()),this.emissiveNode=e.emissiveNode,this.aoNode=e.aoNode,this.transparent=e.transparent,this._applyShapeBlendGraph(),Ri(this),this.needsUpdate=!0}getFlavor(e,t,a,r){if(!this.isRoot)return this.root.getFlavor(e,t,a,r);let s=a?6:(e?3:0)+t;if(s+=7*((r?.resolutionLevel??0)-(r?.useChildrenColors?4:0)),0===s)return this;s-=1;let i=this.flavors[s];return void 0===i&&(i=new nh(this.data,this.lastContext,this.allowVariableSaves,this),i.flatShading=e,i.side=t,i.wireframe=a,r&&(i.shapeBlendOptions={...r},i.defines={SHAPEBLEND:r.resolutionLevel,SHAPEBLEND_C:r.useChildrenColors?1:0},i._invalidateStructuralKey()),this.flavors[s]=i),i}getShapeBlendBaseColor(){let e=this.layers.find(e=>"fragment"===e.kind&&"color"===e.type),t=e?.getValue("color"),a=e?.getValue("alpha");return{r:t?.r??1,g:t?.g??1,b:t?.b??1,a:a??1}}setShapeBlendResources(e){this._shapeBlendResources=e,this._applyShapeBlendGraph()}_applyShapeBlendGraph(){if(!this.shapeBlendOptions||!this._shapeBlendResources)return;let e=n();if(null===e)return;let t=e(this._shapeBlendResources);this.positionNode=t.position,this.shapeBlendObjectNormal=t.normal,this.normalNode=this.buildNormalNode(ka(sr(t.normal))),this.castShadowPositionNode=t.position,this.shapeBlendOptions.useChildrenColors&&(this._shapeBlendColorNode=t.color,this.colorNode=re(()=>this.buildColorStack())()),this.needsUpdate=!0}lightLayerIndex(){return this.layers.findIndex(e=>e instanceof Jd)}findTextureMapLayer(e){if(!e)return null;if("string"!=typeof e)return Wr.is(e)?this.syntheticMapLayer(e):null;let t=this.layers.find(t=>t.uuid===e);return void 0===t||"fragment"!==t.kind?null:"texture"===t.type||"video"===t.type?t:null}syntheticMapLayer(e){if(!this.isRoot)return this.root.syntheticMapLayer(e);let t=this.syntheticMapLayers.get(e);if(void 0!==t)return t;try{let t=Hr.defaultData("texture"),a={...t,visible:!1,texture:{...t.texture,image:e.image,wrapping:e.wrapping??1e3,offset:e.offset??[0,0],repeat:e.repeat??[1,1],minFilter:e.minFilter??1008,magFilter:e.magFilter??1006}},r=rh(this.layerIdGen++,`mapImage${this.layerIdGen}`,a,this.lastContext.shared);return this.syntheticMapLayers.set(e,r),r}catch(e){return console.warn("[spe] light-layer map image failed to build — skipped",e),null}}buildNormalNode(e){if(this.lights&&"physical"===this.category&&!this.wireframe){let t=this.lightLayer.lightData,a=this.findTextureMapLayer(t.normalMap);if(null!==a){let t=this.lightLayer.params.getFloat("normalScale");return re(()=>function(e,t,a){let r=ne(a??Ha).toVar(),s=_e,i=e.get("texture"),n=e.has("loaded")?e.getFloat("loaded"):nr(1),l=e=>{let a=ae(e).toVar(),l=ne(i.sample(a).rgb.mul(2).sub(1)).toVar(),o=ne(Wt(ne(0,0,1),l,n)).toVar();o.xy.mulAssign(t);let u=ne(ba(s)).toVar(),d=ne(Va(s)).toVar(),h=ae(ba(a)).toVar(),m=ae(Va(a)).toVar(),c=ne(Ja(r)).toVar(),p=ne(ca(d,c)).toVar(),g=ne(ca(c,u)).toVar(),f=ne(p.mul(h.x).add(g.mul(m.x))).toVar(),_=ne(p.mul(h.y).add(g.mul(m.y))).toVar(),y=nr(Pt(Ua(f,f),Ua(_,_))).toVar(),x=nr(zt(y.equal(0),nr(0),ar.mul(Pe(y)))).toVar();return Ja(f.mul(o.x.mul(x)).add(_.mul(o.y.mul(x))).add(c.mul(o.z)))},{uvs:o,weights:u}=uu(e);if(null!==u){let e=l(o[0]),t=l(o[1]),a=l(o[2]);return Ja(e.mul(u.z).add(t.mul(u.x)).add(a.mul(u.y)))}return l(o[0])}(a.params,t,e))()}}let t=this.findTextureMapLayer(this.lightLayer.lightData.bumpMap),a=this.lights&&"lambert"!==this.category;if(null===t||!a||this.wireframe)return e;let r=this.lightLayer.params.getFloat("bumpMapIntensity");return re(()=>function(e,t,a){let r=ne(a??Ha).toVar(),s=_e,i=e.get("texture"),{uvs:n,weights:l}=uu(e);if(null!==l){let e=mu(s,r,hu(i,n[0],t)),a=mu(s,r,hu(i,n[1],t)),o=mu(s,r,hu(i,n[2],t));return Ja(e.mul(l.z).add(a.mul(l.x)).add(o.mul(l.y)))}return mu(s,r,hu(i,n[0],t))}(t.params,r,e))()}buildVertexStack(){let e=this.layers.filter(e=>"vertex"===e.kind);if(0===e.length)return this.positionNode=null,void(this.displacedObjectNormal=null);let t=function(e){let t=Y("vec3","vDisplacedNormal");return{position:re(a=>{let r=ue,s=Oa;for(let t=0;t<e.length;t++){let a=Ju(e[t],$u(ue),s);r=0===t?a.position:$u(r.add(a.position).mul(.5)),s=a.normal}let i=ne(r).toVar();return t.assign(s),!0===a.needsPreviousData?.()&&ce.assign(i),i})(),normal:t}}(e.map(e=>e.params));this.positionNode=t.position,this.displacedObjectNormal=t.normal}displacedNormalView(){let e=this.root.displacedObjectNormal;return null===e?null:ka(sr(e))}maskSourceFor(e){let t=this.layers[e];if("fragment"===t.kind&&t.isMaskEnabled)return null;let a=this.layers[e+1];return void 0!==a&&"fragment"===a.kind&&a.isMaskEnabled&&a.data.visible?a:null}runLayerBuilder(e,t,a){let r=nr(1);null!==t&&(r=this.evaluateMask(t));let s={alpha:a?.alpha??e.alphaNode,isMask:e.isMaskNode,mask:r,mode:e.modeNode,noiseCompiledIn:e.noiseCompiledIn},i=$o(e.type)(e.params,s,this.ctx);return a?.color?{...i,color:a.color}:i}evaluateMask(e){let t=this.runLayerBuilder(e,null);return V(t.color.mul(t.calpha))}buildColorStack(){let e=this.lightLayerIndex(),t=-1===e?0:e,a=null;for(let e=0;e<t;e++){let t=this.layers[e];if("fragment"!==t.kind)continue;if(null===a){let r=this._shapeBlendColorNode;a=Od(this.runLayerBuilder(t,this.maskSourceFor(e),r?{color:Od(r.rgb),alpha:Ud(r.w)}:void 0).color);continue}if(t.isMaskEnabled)continue;let r=this.runLayerBuilder(t,this.maskSourceFor(e));a=qo(a,r.color,r.calpha,t.modeNode)}return a??ta(Zr)}setup(e){e.context.setupClearcoatNormal=()=>Aa(Ha,"NORMAL","vec3"),super.setup(e)}setupLightingModel(){let e=this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null;return function(e,t=null,a=null,r=!1){switch(e){case"physical":{let e=new ru(!0===a?.clearcoat,!0===a?.sheen,!0===a?.iridescence,!1,!1,!1);return e.envIrradianceActive=r,e}case"lambert":return new Qt(!1);case"toon":{let e=new au;return e.aoOcclusionGate=t,e}default:return new Qt}}(this.category,e,this.physicalLobes(),this.envNode instanceof ki)}physicalLobes(){let e=this.lightLayer.params;return{clearcoat:e.has("clearcoat"),sheen:e.has("sheen"),iridescence:e.has("iridescence")}}setupVariants(e){if(!this.lights)return;let t=null,a=null;if("physical"===this.category){let e=this.lightLayer.lightData,r=this.findTextureMapLayer(e.roughnessMap);null!==r&&(t=re(()=>cu(r.params,e.roughnessMapChannel??"luminance"))());let s=this.findTextureMapLayer(e.metalnessMap);null!==s&&(a=re(()=>cu(s.params,e.metalnessMapChannel??"b"))())}!function(e,t,a=null,r=null){if("phong"===e||"toon"===e)Ot.assign(t.getFloat("shininess").max(1e-4)),ra.assign(t.getColor("specular"));else if("physical"===e){let e=t.getFloat("metalness"),s=t.getFloat("roughness"),i=t.getFloat("reflectivity");if(null!==a&&(s=a.mul(s)),null!==r&&(e=Ft(r.mul(e),nr(0),nr(1))),Lt.assign(e),ot.assign(Ft(s,nr(.0525),nr(1))),t.has("ior")){let a=t.getFloat("ior"),r=t.has("specularColor")?ne(t.getColor("specularColor")):ne(1),s=t.has("specularIntensity")?t.getFloat("specularIntensity"):nr(1);Le.assign(a),ra.assign(Ut(Ee(Le.sub(1).div(Le.add(1))).mul(r),ne(1)).mul(s)),Zo.assign(Wt(ra,Ea.rgb,e)),la.assign(Wt(s,nr(1),e))}else{let t=ne(i.pow(2).mul(.16));ra.assign(t),Zo.assign(Wt(t,Ea.rgb,e)),la.assign(nr(1))}if(Qo.assign(Ea.rgb.mul(lr(e))),t.has("clearcoat")&&(qt.assign(t.getFloat("clearcoat")),Zt.assign(Ft(t.getFloat("clearcoatRoughness"),nr(.0525),nr(1)))),t.has("sheen")){let e=t.has("sheenColor")?ne(t.getColor("sheenColor")):ne(1);Et.assign(e.mul(t.getFloat("sheen"))),It.assign(Ft(t.getFloat("sheenRoughness"),nr(.07),nr(1)))}t.has("iridescence")&&(Ue.assign(t.getFloat("iridescence")),qe.assign(t.getFloat("iridescenceIOR")),je.assign(t.getFloat("iridescenceThickness")))}}(this.category,this.lightLayer.params,t,a)}setupLighting(e){let t=!0===this.lights||null!==this.lightsNode,a=!0===this.lights?this.setupMaterialLightings(e):[],r=t?this.lightsNode??e.lightsNode:null,s=!0===this.lights?ne(0):Ea.rgb,i=ne(0),n=ne(0);if(r&&(a.length>0||r.getScope().hasLights)){let e=this.setupLightingModel()||null,t=lt(r,e,a,this.backdropNode,this.backdropAlphaNode),l=t,o=l._value??(l._value=l.getContext());i=o.reflectedLight.directSpecular,n=o.reflectedLight.indirectSpecular,s=t}return null!==this.emissiveNode&&void 0!==this.emissiveNode&&(Wa.assign(ne(this.emissiveNode)),s=s.add(Wa)),re(()=>this.applyPostLighting(s,i,n))()}applyPostLighting(e,t,a){let r,s=this.ctx.accumAlpha,i=!0===this.lights,n=this.lightLayerIndex(),l=-1===n?0:n+1,o=nr(1);if(i){let s=-1===n?null:this.maskSourceFor(n);null!==s&&(o=this.evaluateMask(s)),r=function(e){let{outgoing:t,directSpecular:a,indirectSpecular:r,shadingAlpha:s,shadingBlend:i,mask:n,occlusion:l=null,ctx:o}=e,u=ne(t).toVar();return le(Fe(rr(u,Ea.rgb)),()=>{let e=Ft(tt(a.add(r)),nr(0),nr(1));o.accumAlpha.addAssign(lr(o.accumAlpha).mul(s).mul(n).mul(e)),u.assign(qo(Ea.rgb,u,s.mul(n),i)),u.mulAssign(eu(l))}),u}({outgoing:e,directSpecular:t,indirectSpecular:a,shadingAlpha:this.lightLayer.alphaNode,shadingBlend:this.lightLayer.modeNode,mask:o,occlusion:this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null,ctx:this.ctx})}else r=ne(e).toVar();let u=r,d=!1;for(let e=l;e<this.layers.length;e++){let t=this.layers[e];if("fragment"!==t.kind||t.isMaskEnabled)continue;let a=this.runLayerBuilder(t,this.maskSourceFor(e));u=qo(u,a.color,a.calpha,t.modeNode),d=!0}if(d&&r.assign(u),!i){let e=-1===n?null:this.maskSourceFor(n);null!==e&&(o=this.evaluateMask(e))}let h=this.lightLayer.params.has("alphaOverride")?this.lightLayer.params.getFloat("alphaOverride"):nr(1),m=i?s:s.mul(o);if(Ea.a.assign(m.mul(h)),Ea.a.lessThanEqual(nr(0)).discard(),this.dithering){let e=Ke(bt.xy),t=ne(.25/255,-.25/255,.25/255),a=Wt(t.mul(2),t.mul(-2),e);r.assign(r.add(a))}return r}getLayersOfType(e){return this.layers.filter(t=>t.type===e)}getLayerByUuid(e){return this.layers.find(t=>t.uuid===e)}armRainbowNoiseSpecialization(e){let t=this.root.forceRainbowNoise.has(e.uuid),a=e.data;if(e.noiseForced=t,e.noiseCompiledIn=t||Ir(a.noiseStrength),!1===e.noiseCompiledIn){let t=e.uuid;e.onNoiseMismatch=e=>this.root.ensureRainbowNoiseCompiled(t,e)}}ensureRainbowNoiseCompiled(e,t){if(!this.isRoot)return this.root.ensureRainbowNoiseCompiled(e,t);let a=this.data.layers?.data(e);return void 0!==a&&"rainbow"===a.type&&(!this.forceRainbowNoise.has(e)&&!Ir(a.noiseStrength)||!1===this.getLayerByUuid(e)?.noiseCompiledIn)&&(this.forceRainbowNoise.add(e),this.reset0(this.data,this.lastContext),void 0!==t&&this.getLayerByUuid(e)?.setValue("noiseStrength",t),!0)}updateByOp(e,t,a){if(this.isRoot)if(void 0!==t?this.data=t:t=this.data,this.setTransparent(Nr(t,a.shared),a.scene),"layers"===e.path[0]){let r=e.path[1];if(void 0===r)return a.scene.markNeedsUpdateRendererDirty(),void this.reset0(t,a);0===e.type&&void 0!==e.props.occlusion&&a.scene.markNeedsUpdateRendererDirty();let s=this.layers.find(e=>e.uuid===r);if(!s)return;let i=t.layers.data(r);if(!i)return;this.updateLayerByOp(s,{...e,path:e.path.slice(2)},i,a)?this.reset0(t,a):Ri(this)}else this.reset0(t,a);else this.root.updateByOp(e,t,a)}static hasVariableString(e){return"string"==typeof e||Array.isArray(e)&&e.some(e=>"string"==typeof e)}updateLayerTextureByOp(e,t,a){if(1!==t.path.length||0!==t.type)return!0;let r=t.props,s=a.texture;if(!s)return!0;let i=e.data.texture;for(let e of Object.keys(r))if("repeat"!==e&&"offset"!==e&&"rotation"!==e||nh.hasVariableString(s[e])||nh.hasVariableString(i?.[e]))return!0;if("matcap"===e.type)return"repeat"in r||"offset"in r||(e.data=a,e.setValue("rotation",(s.rotation??0)*ns.DEG2RAD),!1);let n=e.getValue("mat");if(!n)return!0;if(e.data=a,"repeat"in r){let e=s.repeat;n.repeat=[e?.[0]??1,e?.[1]??1]}if("offset"in r){let e=s.offset;n.offset=[e?.[0]??0,e?.[1]??0]}return"rotation"in r&&(n.rotation=s.rotation??0),n.updateMatrix(),!1}updateLayerByOp(e,t,a,r){if("texture"===t.path[0])return this.updateLayerTextureByOp(e,t,a);if(void 0!==t.path[0]||0!==t.type)return!0;let s=t.props;if("type"in s||"category"in s||"visible"in s||"noiseType"in s)return r.scene.markNeedsUpdateRendererDirty(),!0;for(let t of Object.keys(s)){if("isMask"===t)return!0;if("rainbow"===e.type&&"noiseStrength"===t&&void 0!==e.noiseCompiledIn){let r=a[t];if((!0===e.noiseForced||Ir(r))!==e.noiseCompiledIn)return!0}let r=Dr[e.type];if(void 0!==r&&r.includes(t))return!0;let i=Fr[e.type];if(void 0!==i&&i.includes(t)){let a=e.getValue(t),r=s[t];if(Array.isArray(a)&&Array.isArray(r)&&a.length!==r.length)return!0}let n=a[t],l=e.data[t];if("axis"!==t&&("string"==typeof n||"string"==typeof l)||Array.isArray(n)&&n.some(e=>"string"==typeof e)||Array.isArray(l)&&l.some(e=>"string"==typeof e))return!0}e.data=a;for(let t of Object.keys(s))this.applyLayerValue(e,t,a,r.shared);return!1}applyLayerValue(e,t,a,r){let s=a;if(("alpha"===t||"visible"===t||"intensity"===t)&&(eh(e,r),"intensity"!==t||"displace"===e.type))return;if("alphaOverride"===t&&e instanceof Jd)return void e.setValue("alphaOverride",Br(s[t],r));if(!e.hasValue(t))return;let i=e.uniformKinds.get(t),n=s[t];switch(i){case"color":case"colorVec4":{let a=e.getValue(t),s="string"==typeof n?r.color(n):qd(n,()=>a??new Ur(1,1,1,1));a&&s&&a.setRGBA(s.r,s.g,s.b,"a"in s?s.a:1);break}case"vec2":{let a=e.getValue(t);a&&Array.isArray(n)&&a.set(Number(n[0]??a.x),Number(n[1]??a.y));break}case"vec3":{let a=e.getValue(t);a&&Array.isArray(n)&&a.set(Number(n[0]??a.x),Number(n[1]??a.y),Number(n[2]??a.z));break}case"vec4array":{let a=e.getValue(t);if(a&&Array.isArray(n))for(let e=0;e<Math.min(a.length,n.length);e++){let t=n[e];a[e].set(t[0],t[1],t[2],t[3])}break}case"floatArray":{let a=e.getValue(t);if(a&&Array.isArray(n))for(let e=0;e<Math.min(a.length,n.length);e++)a[e]=Number(n[e]);break}case"axis":e.setValue(t,["x","y","z"].indexOf(String(n)));break;case"bool":e.setValue(t,!!n);break;default:("number"==typeof n||"boolean"==typeof n)&&e.setValue(t,n)}}onVariableUpdate(e,t,a){if("alphaOverride"===e[0])return this.setTransparent(Nr(this.data,a.shared),a.scene),void this.lightLayer.setValue("alphaOverride",Math.max(0,Math.min(Number(t)/100,1)));if("layer"!==e[0])return;let r=e[1],s=e[2];if(!r||!s)return;let i=this.layers.find(e=>e.uuid===r);if(!i?.hasValue(s))return;if("alpha"===s)return this.setTransparent(Nr(this.data,a.shared),a.scene),void i.setValue(s,Math.max(0,Math.min(Number(t)/100,1)));let n=i.getValue(s),l=e[3];("x"===l||"y"===l||"z"===l)&&n?.isVector3||("x"===l||"y"===l)&&n?.isVector2?n[l]=Number(t):n instanceof gs||i.setValue(s,t)}saveVariableLocations(e){if(!this.allowVariableSaves)return;let t=this.data.layers?.find(e=>"light"===e.data.type);t&&e.shared.getVariable(t.data.alphaOverride,["material",this.uuid,"alphaOverride"]),this.data.layers?.forEach(t=>{let a=t.data;"alpha"in a&&"string"==typeof a.alpha&&e.shared.getVariable(a.alpha,["material",this.uuid,"layer",t.id,"alpha"]);let r="displace"===t.data.type?"noise"===a.displacementType?"displace_noise":"displace_map":t.data.type,s=ih[r];if(s)for(let r of s){let s=a;for(let e of r.path??[])e in s&&(s=s[e]);for(let a of r.nums)a in s&&e.shared.getVariable(s[a],["material",this.uuid,"layer",t.id,...r.path??[],a]);for(let a of r.vecs)a in s&&s[a].forEach((s,i)=>{e.shared.getVariable(s,["material",this.uuid,"layer",t.id,...r.path??[],a,0===i?"x":1===i?"y":"z"])})}})}clampUniformsForPreview(e,t){let a=(e,t,a)=>Math.min(Math.max(e,t),a);for(let r of this.layers)if("displace"===r.type){let s=r.uniforms[`f${r.id}_intensity`];s.value=a(s.value,e,t)}}updateFrame(){}assetsLoaded(){if(!this.layers.every(e=>e.assetsLoaded))return!1;for(let e of this.root.syntheticMapLayers.values())if(!e.assetsLoaded)return!1;return!0}nodeMaterialDispose(){if(this.isRoot){for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear()}this.dispose();for(let e of this.flavors)e?.dispose()}},lh=class extends nh{constructor(e,t,a){super(e,t,!1),this.isTSLSharedMaterial=!0,this.uuid=a,this.allowVariableSaves=!0,this.saveVariableLocations(t)}};function oh(e,t){let a=e.xyz;return t.add(ca(a,ca(a,t).add(t.mul(e.w))).mul(2))}function uh(e){let t=Ru(e),a=Ru(ne(e.y.sub(19.1),e.z.add(33.4),e.x.add(47.2))),r=Ru(ne(e.z.add(74.2),e.x.sub(124.5),e.y.add(99.4)));return ne(t,a,r)}var dh=re(e=>{let t=e.p.add(e.seed).toVar(),a=ne(.1,0,0),r=ne(0,.1,0),s=ne(0,0,.1),i=uh(t.sub(a)).toVar(),n=uh(t.add(a)).toVar(),l=uh(t.sub(r)).toVar(),o=uh(t.add(r)).toVar(),u=uh(t.sub(s)).toVar(),d=uh(t.add(s)).toVar(),h=o.z.sub(l.z).sub(d.y).add(u.y),m=d.x.sub(u.x).sub(n.z).add(i.z),c=n.y.sub(i.y).sub(o.x).add(l.x);return Ja(ne(h,m,c).mul(5))});function hh(e,t){return dh({p:e,seed:t})}function mh(e,t,a){return ne(Bu(e.add(ne(a)).mul(t)),Bu(e.add(ne(a.add(20))).mul(t)),Bu(e.add(ne(a.sub(30))).mul(t)))}function ch(e){return{f:(t,a=0)=>e.node(t)??e.getUniform(t,a),v3:t=>e.node(t)??e.getUniform(t,null),v4:t=>e.node(t)??e.getUniform(t,null),tex:t=>e.node(t)??e.getTexture(t,null)}}function ph(e,t){switch(e){case"position":return function(e){let t=ch(e.registry);return re(()=>{let a=W(),r=e.depTexture("uCurrentPosition"),s=e.depTexture("uCurrentVelocity"),i=e.depTexture("uCurrentEmissionRate"),n=r.sample(a).toVar().xyz.toVar(),l=i.sample(a).toVar(),o=l.x.toVar(),u=l.y.toVar(),d=l.z.toVar(),h=t.tex("uOriginalPosition").sample(a).xyz.mul(t.v3("uEmitterSize")).toVar(),m=s.sample(a).toVar(),c=m.xyz.toVar(),p=m.w.toVar(),g=t.f("uMaxLifeTime",1),f=ga(.5,p),_=nr(3).mul(f),y=c.mul(nr(1).add(_)),x=c.mul(Ut(t.f("uFPSRatio",1),nr(5)));n.addAssign(Wt(x,y,f));let v=oh(t.v4("uWorldQuaternion"),h).add(t.v3("uWorldOffset"));n.assign(Wt(n,v,o)),d.assign(Wt(d,t.f("uTime"),o));let b=Pt(g.sub(t.f("uTime").sub(d)),nr(0)).div(g);return Wt(de(0),de(n,b),u)})()}(t);case"velocity":return function(e){let t=ch(e.registry),a=e.features;return re(()=>{let r=W(),s=e.depTexture("uCurrentPosition"),i=e.depTexture("uCurrentVelocity"),n=e.depTexture("uCurrentEmissionRate"),l=s.sample(r).xyz.toVar(),o=t.tex("uOriginalPosition").sample(r).xyz.toVar(),u=t.tex("uDirections").sample(r).xyz.toVar(),d=i.sample(r).xyz.toVar(),h=n.sample(r).toVar(),m=h.x.toVar(),c=h.y.toVar(),p=i.sample(r).w.toVar(),g=nr(1).sub(t.f("uRandomMassFactor").mul(function(e){return e.dot(ae(12.9898,78.233)).sin().mul(43758.5453).fract()}(function(e){return e.xy}(o)).mul(.5).add(.5))).toVar(),f=t.f("uSpeed",1),_=t.f("uNoiseStrength"),y=t.f("uNoiseScale"),x=t.f("uNoiseSeed");le(c.equal(1),()=>{a.USE_CURL_NOISE&&(le(y.greaterThan(0),()=>{d.assign(hh(l.mul(y).mul(.002),x).mul(_.add(1)).mul(.05).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(hh(l,x).mul(_).mul(.05).mul(f))})),a.USE_SIMPLEX_NOISE&&(le(y.greaterThan(0),()=>{d.assign(ne(Ru(l.mul(y).mul(.001)).mul(_.add(1)).mul(.1)).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(ne(Ru(l.mul(_).mul(.001)).mul(.05)).mul(f))})),a.USE_FBM_NOISE&&(le(y.greaterThan(0),()=>{d.assign(mh(l.mul(y).mul(.001),_.add(1),x).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(mh(l.mul(_).mul(.001),_.add(1),x).mul(.1).mul(f))})),function(e,t,a,r,s){if(!e.features.USE_COLLIDER)return;let i=Pt(t.f("uBounce").mul(2),nr(.01)).toVar(),n=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),l=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar().div(e).toVar(),o=tt(l).toVar();le(o.lessThanEqual(nr(1).add(n.div(tt(e)))).and(s.equal(0)),()=>{let a=l.mul(nr(1).add(n.div(tt(e)))),o=Ja(a.div(e.mul(e)));o=oh(t.v4("uColliderQuaternion"),o),r.assign(Je(r,o).mul(i)),s.assign(1)}).Else(()=>{s.assign(0)})}if(e.features.USE_BOX_COLLIDER){let e=t.v3("uColliderSize").div(2),l=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),o=Ae(l).sub(e).toVar(),u=Pt(o.x,Pt(o.y,o.z)).toVar();le(u.lessThanEqual(n.mul(.5)).and(s.equal(0)),()=>{let e=ne(0).toVar();le(o.x.greaterThan(o.y).and(o.x.greaterThan(o.z)),()=>{e.assign(ne(Ht(l.x),0,0))}).ElseIf(o.y.greaterThan(o.z),()=>{e.assign(ne(0,Ht(l.y),0))}).Else(()=>{e.assign(ne(0,0,Ht(l.z)))});let a=oh(t.v4("uColliderQuaternion"),e);r.assign(Je(r,a).mul(i)),s.assign(1)}).Else(()=>{s.assign(0)})}}(e,t,l,d,p),function(e,t,a,r){if(!e.features.USE_ATTRACTOR)return;let s=t.f("uForceIntensity"),i=t.f("uForceDamping");if(e.features.USE_FORCE_LOCAL_SPACE){let n,l,o=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),r=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos")));n=tt(r.div(e)).toVar(),l=nr(1)}else{let e=t.v3("uColliderSize").div(2),r=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))),s=Ae(r).sub(e);n=Pt(s.x,Pt(s.y,s.z)).toVar(),l=o}le(n.lessThanEqual(l),()=>{let o=e.features.USE_SPHERE_COLLIDER?nr(1).sub(n).mul(s):Pt(nr(1).sub(l.div(n)),nr(0)).mul(s),u=a.sub(t.v3("uColliderPos")),d=Ja(u).mul(o);r.subAssign(d),r.mulAssign(i)})}else{let e=a.sub(t.v3("uColliderPos")),n=Ja(e).mul(s);r.subAssign(n),r.mulAssign(i)}}(e,t,l,d),function(e,t,a,r,s,i,n){if(!e.features.USE_VORTEX)return;let l=t.f("particleSize"),o=t.v3("uColliderSize").div(2),u=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),d=Ae(u).sub(o).toVar(),h=Pt(d.x,Pt(d.y,d.z)).toVar();le(h.lessThanEqual(l),()=>{let e=t.f("uForceIntensity"),l=t.v3("uColliderPos").add(oh(t.v4("uColliderQuaternion"),ne(0))).sub(a).toVar(),o=ne(0,1,.01),u=Ja(ca(o,oh(t.v4("uColliderQuaternion"),l))).toVar(),d=tt(l.mul(e).mul(3)).toVar();r.assign(u.mul(d).mul(.005));let h=oh(t.v4("uWorldQuaternion"),s);r.addAssign(h.mul(n).mul(nr(1).sub(t.f("uForceDamping"))).div(i.mul(.5)))})}(e,t,l,d,u,g,f)});let v=a.USE_NORMALS?u:t.v3("uDirectionsAxis");return d.assign(Wt(d,oh(t.v4("uWorldQuaternion"),v).mul(f),m)),d.addAssign(t.v3("uGravity").div(g.mul(.5)).mul(nr(1).sub(p))),de(d,p)})()}(t);case"emissionRate":return function(e){let t=ch(e.registry);return re(()=>{let a=W(),r=e.depTexture("uCurrentEmissionRate"),s=t.tex("uIndex").sample(a).x.toVar(),i=r.sample(a).toVar(),n=i.y.toVar(),l=i.z.toVar(),o=t.f("uLastIndexEmitted"),u=t.f("uParticlesToEmit"),d=ga(o,s),h=ga(s,o.add(u).sub(1)),m=d.mul(h);return l.assign(Wt(l,t.f("uTime"),m)),de(m,Wt(n,nr(1),m),l,1)})()}(t)}}var gh=class{constructor(){this.nodes=new Map,this.textureNodes=new Map}getUniform(e,t){let a=this.nodes.get(e);return a||(a=k(t),this.nodes.set(e,a)),a}getTexture(e,t){let a=this.textureNodes.get(e);return a||(a=Da(t??new gs),this.textureNodes.set(e,a)),a}node(e){return this.nodes.get(e)??this.textureNodes.get(e)}adopt(e){for(let t of Object.keys(e)){let a=e[t].value;if(a instanceof gs||a&&"object"==typeof a&&a.isTexture){let r=this.getTexture(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(e){r.value=e}}})}else{let r=this.getUniform(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(e){r.value=e}}})}}}},fh=class{constructor(e,t,a,r){this.name=e,this.kind=t,this.initialTexture=a,this.currentIndex=0,this.registry=new gh,this.depTextureNodes=new Map,this.dependencies=[],this.nodeMaterial=null,this._uniformsStore={};let s=()=>new xs(r,r,{type:ts,minFilter:Hs,magFilter:Hs,wrapS:Fs,wrapT:Fs,depthBuffer:!1});this.renderTargets=[s(),s()],this.material=Object.defineProperty({},"uniforms",{get:()=>this._uniformsStore,set:e=>{this.registry.adopt(e),this._uniformsStore=e}})}get currentRenderTarget(){return this.renderTargets[this.currentIndex]}get nextRenderTarget(){return this.renderTargets[1-this.currentIndex]}advance(){this.currentIndex=1-this.currentIndex}dispose(){this.renderTargets[0].dispose(),this.renderTargets[1].dispose(),this.nodeMaterial?.dispose()}},_h=new qa,yh=class{constructor(e,t,a,r){this.sizeX=e,this.sizeY=t,this.renderer=a,this.features=r,this.variables=[],this._copyMaterial=null,this._copyTextureNode=Da(new gs)}addVariable(e,t,a){let r=new fh(e,"uCurrentPosition"===e?"position":"uCurrentVelocity"===e?"velocity":"emissionRate",a,this.sizeX);return this.variables.push(r),r}setVariableDependencies(e,t){e.dependencies=t;for(let a of t)e.depTextureNodes.has(a.name)||e.depTextureNodes.set(a.name,Da(a.currentRenderTarget.texture))}init(){if(!this._copyMaterial){let e=new Tt;e.name="WebGPUComputation.copy",e.fragmentNode=de(this._copyTextureNode),e.depthTest=!1,e.depthWrite=!1,e.blending=Os,this._copyMaterial=e}for(let e of this.variables){this._copyTextureNode.value=e.initialTexture;for(let t of e.renderTargets)this._renderQuad(this._copyMaterial,t);let t=new Tt;t.name=`WebGPUComputation.${e.kind}`,t.fragmentNode=ph(e.kind,{features:this.features,registry:e.registry,depTexture:t=>{let a=e.depTextureNodes.get(t);if(!a)throw new Error(`WebGPUComputationRenderer: variable "${e.name}" reads undeclared dependency "${t}"`);return a},resolution:new us(this.sizeX,this.sizeY)}),t.depthTest=!1,t.depthWrite=!1,t.blending=Os,t.needsUpdate=!0,e.nodeMaterial=t}}compute(){for(let e of this.variables)if(e.nodeMaterial){for(let t of e.dependencies)e.depTextureNodes.get(t.name).value=t.currentRenderTarget.texture;this._renderQuad(e.nodeMaterial,e.nextRenderTarget)}for(let e of this.variables)e.advance()}getCurrentRenderTarget(e){return e.currentRenderTarget}_renderQuad(e,t){let a=this.renderer,r=a.getRenderTarget(),s=a.getMRT();a.setMRT(null),a.setRenderTarget(t),_h.material=e,_h.render(a),a.setRenderTarget(r),a.setMRT(s)}dispose(){for(let e of this.variables)e.dispose();this._copyMaterial?.dispose()}};function xh(e,t){switch(e){case"linearFadeOut":return nr(1).sub(t);case"linearInOut":return t.lessThan(.5).select(t,nr(1).sub(t));case"exponentialInOut":return t.lessThan(.4).select(t.div(.4),t.greaterThan(.6).select(nr(1).sub(t.sub(.6).div(.4)),nr(1)));case"constant":return nr(1);default:return t}}function vh(e){return e.dot(ae(12.9898,78.233)).sin().mul(43758.5453).fract()}var bh=class extends Tt{constructor(e,t){super(),this.easeOpacity="linearFadeIn",this.easeSize="linearFadeIn",this.useSizeEnd=!1,this.isColoringRandom=!1,this._uniformsStore={},this._uPosition=Da(new gs),this._uTexture=Da(new gs),this._uColor=k(new ys(1,1,1,1)),this._uColor2=k(new ys(1,1,1,1)),this._uSize=k(1),this._uSizeEnd=k(1),this._uWorldOffset=k(new hs),this._uWorldQuaternion=k(new ys(0,0,0,1)),this._uRotation=k(0),this._uRotationEnd=k(0),this._center=k(new us(.5,.5)),this._uRandScaleFactor=k(0),this._uRandRotationFactor=k(0),this.context=t,this.name="WebGPUParticleMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.lights=!1;let a=e=>({get value(){return e.value},set value(t){e.value=t}}),r=e=>({get value(){return e.value},set value(t){((e,t)=>{if(Array.isArray(e))t.set(Number(e[0]??1),Number(e[1]??1),Number(e[2]??1),Number(e[3]??1));else if(e&&"object"==typeof e&&"r"in e){let a=e;t.set(a.r,a.g,a.b,a.a??1)}})(t,e.value)}}),s=e=>({get value(){return e.value},set value(t){t&&t.isTexture&&(e.value=t)}});this._binders={uPosition:s(this._uPosition),uTexture:s(this._uTexture),uColor:r(this._uColor),uColor2:r(this._uColor2),uSize:a(this._uSize),uSizeEnd:a(this._uSizeEnd),uWorldOffset:a(this._uWorldOffset),uWorldQuaternion:a(this._uWorldQuaternion),uRotation:a(this._uRotation),uRotationEnd:a(this._uRotationEnd),center:a(this._center),uRandScaleFactor:a(this._uRandScaleFactor),uRandRotationFactor:a(this._uRandRotationFactor)},this._uniformsStore={...this._binders},this.updateState(e),this._rebuildGraph()}get uniforms(){return this._uniformsStore}set uniforms(e){for(let t of Object.keys(e)){let a=this._binders[t];if(!a)continue;let r=e[t]?.value;Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:a}),void 0!==r&&(a.value=r)}this._uniformsStore=e}updateState(e){let t=!1;if(void 0!==e.coloring){let a="random"===e.coloring;t||(t=a!==this.isColoringRandom),this.isColoringRandom=a}if(void 0!==e.color&&(this.uniforms.uColor.value=Array.isArray(e.color)?e.color:this.context.shared.color(e.color)),void 0!==e.color2&&(this.uniforms.uColor2.value=Array.isArray(e.color2)?e.color2:this.context.shared.color(e.color2)),void 0!==e.size){this.uniforms.uSize.value=e.size[0],this.uniforms.uSizeEnd.value=e.size[1];let a=e.size[0]!==e.size[1];t||(t=a!==this.useSizeEnd),this.useSizeEnd=a}void 0!==e.ease&&e.ease!==this.easeOpacity&&(this.easeOpacity=e.ease,t=!0),void 0!==e.easeSize&&e.easeSize!==this.easeSize&&(this.easeSize=e.easeSize,t=!0),t&&this._rebuildGraph(),this.needsUpdate=!0}_rebuildGraph(){let e=nt("particleRef","vec2"),t=this._uPosition,a=re(()=>{let a=t.sample(e).toVar(),r=a.w.toVar(),s=a.xyz.sub(this._uWorldOffset);s=function(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}(this._uWorldQuaternion,s);let i=nt("position","vec3"),n=nr(1).sub(r),l=this.useSizeEnd?i.mul(ne(Wt(this._uSize,this._uSizeEnd,n))):i.mul(ne(this._uSize.mul(xh(this.easeSize,n)))),o=pa,u=o.element(0).xyz.length(),d=o.element(1).xyz.length(),h=vh(e).toVar(),m=nr(1).sub(this._uRandScaleFactor.mul(h)),c=ae(u,d).mul(m).toVar(),p=2*Math.PI,g=h.mul(this._uRandRotationFactor).mul(p),f=nr(1).sub(this._uRotation).mul(p),_=nr(1).sub(this._uRotationEnd).mul(p),y=Wt(f.add(g),_.add(g),r).toVar(),x=this._center,v=l.xy.sub(x.sub(ae(.5))).mul(c).toVar(),b=ae(ua(y).mul(v.x).sub(Xt(y).mul(v.y)),Xt(y).mul(v.x).add(ua(y).mul(v.y))).toVar(),T=na.mul(de(s,1)).toVar();return T.xy.addAssign(b),wt.mul(T)}),r=re(()=>{let a=t.sample(e).w.toVar();a.lessThanEqual(.005).discard();let r=nr(1).sub(a),s=this.isColoringRandom?vh(e):r,i=Wt(this._uColor,this._uColor2,s).toVar(),n=xh(this.easeOpacity,r).toVar(),l=this._uTexture.sample(W()).toVar();return de(l.rgb.mul(i.rgb),i.a.mul(l.a).mul(n))});this.vertexNode=a(),this.colorNode=r(),this.needsUpdate=!0}nodeMaterialDispose(){this.dispose()}};function Th(e,t){return(a,r,s,i)=>{let n=s.mod(t).add(a.add(.5).div(e)).div(t),l=C(s.div(t)).add(r.add(.5).div(e)).div(t);return i.sample(ae(n,l))}}ur({createComputation:(e,t,a,r)=>new yh(e,t,a,r),createMaterial:(e,t)=>new bh(e,t)});var wh=[[0,0,0],[1,0,0],[1,0,0],[1,1,0],[0,1,0],[1,1,0],[0,0,0],[0,1,0],[0,0,1],[1,0,1],[1,0,1],[1,1,1],[0,1,1],[1,1,1],[0,0,1],[0,1,1],[0,0,0],[0,0,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1],[0,1,0],[0,1,1]];function Sh(e){let t=or(e.x.mul(65535).add(.5)),a=t.bitAnd(or(255)).toFloat().mul(.00392156862),r=t.shiftRight(or(8)).bitAnd(or(255)).toFloat().mul(.00392156862);return de(r,a,e.y,e.z)}function Vh(e){let{levelShiftX:t,scale:a,originOffset:r}=function(e){switch(e){case 5:return{levelShiftX:[4,6,12,24,48,96,192],scale:16,originOffset:16};case 7:return{levelShiftX:[4,6,12,24,48,96,192,384,768,1536],scale:4,originOffset:64};case 8:return{levelShiftX:[4,8,16,32,64,128,256,512,1024,2048,4096],scale:2,originOffset:128};default:return{levelShiftX:[4,8,16,32,64,128,256,512],scale:8,originOffset:32}}}(e.resolutionLevel),s=e.pyramidLevelSizes.length,i=s%2==0?s-3:s-2,n=s%2==0,l=Math.pow(2,e.resolutionLevel),o=e.pyramidLevelSizes[s-1]/l,u=Th(l,o),d=e.pyramid1Size.width,h=e.pyramid1Size.height,m=e.pyramid2Size.width,c=e.pyramid2Size.height,p=N(wh.map(([e,t,a])=>new hs(e,t,a)));return s=>{let g=ne(0).toVar(),f=ne(0,0,1).toVar(),_=de(0).toVar(),y=s.toVar(),x=C(y.div(3)).toVar(),v=(e,t)=>ae(e.x.add(t).add(.5).div(d),e.y.add(.5).div(h)),b=(e,t)=>ae(e.x.add(t).add(.5).div(m),e.y.add(.5).div(c)),T=d-2,w=m-1,S=ae(0,0).toVar(),V=e.pyramid2.sample(b(S,w)).toVar();return le(x.lessThan(V.x),()=>{let s=nr(0).toVar(),d=e=>{let t=V.add(de(s)).toVar(),a=de(t.yzw,s),r=de(de(x).greaterThanEqual(a)).mul(de(de(x).lessThan(t))).toVar();S.mulAssign(2),S.addAssign(ae(0,1).mul(r.x).add(ae(1,1).mul(r.y)).add(ae(1,0).mul(r.z))),s.assign(r.dot(a)),e?.()};for(let a=0;a<i;){let r=t[a];d(()=>{w-=r,V.assign(e.pyramid1.sample(v(S,T)))}),a++;let s=t[a];d(()=>{T-=s,V.assign(e.pyramid2.sample(b(S,w)))}),a++}n&&d(null);let h=S.x.mod(l).toVar(),m=S.y.mod(l).toVar(),c=C(S.x.div(l)).add(C(S.y.div(l)).mul(o)).toVar(),M=y.sub(s.mul(3)).mul(.0625).add(.03125),R=u(h,m,c,e.voxel).toVar().w.add(.5).mul(.00390625),z=e.triTable.sample(ae(M,R)).x.mul(2).toInt().toVar(),k=ne(h,m,c).add(p.element(z)).toVar(),A=ne(h,m,c).add(p.element(z.add(1))).toVar(),P=u(k.x,k.y,k.z,e.potential).toVar(),E=u(A.x,A.y,A.z,e.potential).toVar(),N=P.x.div(P.x.sub(E.x));_.assign(Wt(Sh(P.yzw),Sh(E.yzw),N)),g.assign(k.add(A.sub(k).mul(N)).sub(ne(r)).mul(a));let B=u(k.x,k.y,k.z,e.voxel),L=u(A.x,A.y,A.z,e.voxel);f.assign(Ja(Wt(B.xyz,L.xyz,N)))}),{position:g,normal:f,color:_}}}function Mh(e,t){!0===e.needsPreviousData?.()&&ce.assign(t)}var Rh=e=>e,Ch=e=>e,zh=h,kh=m;function Ah(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}function Ph(e,t,a,r){let s=Ft(e,-1,1),i=e.sub(s).mul(2).add(1),n=Ft(nr(.5).add(s.mul(.5).mul(t.sub(s.mul(i).mul(a))).div(r)),0,1);return Wt(t,s.mul(i).mul(a),n).sub(s.mul(r).mul(n).mul(nr(1).sub(n)))}function Eh(e,t,a,r,s){let i=nr(0).toVar(),n=a.y,l=a.z,o=a.w,u=le(e.lessThan(.5),()=>{i.assign(tt(t).sub(n))}).ElseIf(e.lessThan(1.5),()=>{let e=ne(n,l,o),a=tt(t.div(e)),r=tt(t.div(e.mul(e)));i.assign(a.mul(a.sub(1)).div(r))}).ElseIf(e.lessThan(2.5),()=>{let e=ne(n,l,o),a=Ae(t).sub(e).toVar();i.assign(tt(Pt(a,ne(0))).add(Ut(Pt(a.x,Pt(a.y,a.z)),0)))}).ElseIf(e.lessThan(3.5),()=>{let e=Ae(ae(tt(t.xz),t.y)).sub(ae(l,n)).toVar();i.assign(Ut(Pt(e.x,e.y),0).add(tt(Pt(e,ae(0)))))}).ElseIf(e.lessThan(4.5),()=>{let e=n,a=l,r=o,s=ae(tt(t.xz),t.y).toVar(),u=ae(r,e),d=ae(r.sub(a),e.mul(2)),h=ae(s.x.sub(Ut(s.x,s.y.lessThan(0).select(a,r))),Ae(s.y).sub(e)).toVar(),m=s.sub(u).add(d.mul(Ft(Ua(u.sub(s),d).div(Ua(d,d)),0,1))).toVar(),c=m.x.lessThan(0).and(h.y.lessThan(0)).select(nr(-1),nr(1));i.assign(c.mul(ha(Ut(Ua(h,h),Ua(m,m)))))}).ElseIf(e.lessThan(5.5),()=>{let e=ae(tt(t.xy).sub(n),t.z);i.assign(tt(e).sub(l))}),d=()=>{let e=Ae(t.x).toVar(),a=ae(n,l),s=o,u=r.w,d=a.y.mul(e).greaterThan(a.x.mul(t.y)).select(Ua(ae(e,t.y),a),tt(ae(e,t.y))),h=ne(e,t.y,t.z);i.assign(ha(Ua(h,h).add(s.mul(s)).sub(s.mul(d).mul(2))).sub(u))};return s?u.ElseIf(e.lessThan(6.5),d).Else(()=>{i.assign(s(t,a,r))}):u.Else(d),i}function Nh(e,t=!0){let a=e.spatialDivisions,r=e.spatialn;return(s,i)=>{let n=t?de(0).toVar():de(0),l=nr(1e3).toVar(),o=t?nr(0).toVar():nr(0),u=t?nr(0).toVar():nr(0),d=i.y.add(i.z.mul(a)).add(.5).div(a*a),h=(a,r)=>{let i=r.toVar();he(zh,({i:r})=>{le(i.lessThan(1),()=>{X()}),i.mulAssign(.5),le(L(i).greaterThanEqual(.5),()=>{let i=nr(r).add(a).add(.5).mul(1/kh),d=e.shapeRow(i,0).toVar(),h=e.shapeRow(i,1).toVar(),m=e.shapeRow(i,2).toVar(),c=e.shapeRow(i,3).toVar(),p=Ah(h,s.sub(d.xyz)).div(c.z).toVar(),g=Eh(m.x,p,m,c,e.meshSdf).sub(c.y).mul(c.z).toVar(),f=c.x.toVar(),_=d.w;if(l.assign(Ph(_,l,g,f)),t){let t=ga(-1.5,_).mul(ga(_,-.5)),a=Jt(u,0,g.negate()),r=Wt(nr(1),a,t);n.mulAssign(r),o.mulAssign(r),u.assign(Pt(u,f)),f.addAssign(e.colorKBump);let s=e.shapeRow(i,4).toVar(),l=Jt(f,0,g).mul(s.a.greaterThanEqual(0).toFloat()).toVar();o.addAssign(l),n.addAssign(s.mul(l))}})})},m=t=>{let s=t.mul(4*zh).toVar(),n=e.spatialTex.sample(ae(i.x.mul(r).add(t).add(.5).div(r*a),d)).toVar();h(s,n.x),h(s.add(zh),n.y),h(s.add(2*zh),n.z),h(s.add(3*zh),n.w)};return 1===r?m(nr(0)):he(r,({i:e})=>{m(nr(e).toVar())}),t&&n.divAssign(o),{sdf:Wt(l,nr(0),ga(1e20,l)).toVar(),color:n,colorDivisor:o}}}var Bh=[4,4,4],Lh=(e,t)=>De(e,t);function Ih(e){let t=e.resolution,a=t-1,r=e.colorResolution,s=e.capacity,i=t/4,n=i-1,l=k(e.bboxHalf),o=k(e.bboxOffset),u=k(1e30),d=k(new hs(0,0,0)),h=k(new hs(i,i,i)),m=e.env.spatialDivisions,c=nr(e.buildSeq).mul(0),p=e.sparseStorage??null,g=p?p.poolBricks:0,f=p?Math.ceil(g/4096):0,_=p?.meshlet??null,y=_?_.drawIndex:null,x=_?Math.floor(s/24):0,v=_?_.vertexBlocks:0,b=(e,t,a,r)=>{let s=new H(e,t,a);return s.format=vs,s.type=ts,s.minFilter=Hs,s.magFilter=Hs,s.name=r,s},T=p?b(256,256,4*Math.max(f,1),"SplineShapeBlend.ultraSdfPool"):e.reuseTextures?.sdfTexture??b(t,t,t,"SplineShapeBlend.ultraSdf");T.format=vs,T.type=ts,T.minFilter=Hs,T.magFilter=Hs;let w=e.reuseTextures?.colorTexture??new H(r,r,r);w.name="SplineShapeBlend.ultraColor";let S=e.reuseTextures?.coarseTexture??new H(i,i,i);S.format=vs,S.type=ts,S.minFilter=Hs,S.magFilter=Hs,S.name="SplineShapeBlend.ultraCoarse";let V=fe(8,"uint").toAtomic(),M=(e=0)=>V.element(e),R=p?fe(_?12:4,"int").toAtomic():null,z=e=>R.element(e),A=p?fe(Math.max(g,1),"float"):null,P=i*i*i,E=p?fe(P*(_?4:1),"float"):null,B=e=>Ce(e.x.add(e.y.mul(i)).add(e.z.mul(i*i))),L=e=>E.element(B(e)),I=e=>E.element(B(e).add(Ce(P))),D=e=>E.element(B(e).add(Ce(2*P))),F=e=>E.element(B(e).add(Ce(3*P))),U=e=>E.element(e.add(Ce(3*P))),O=p?fe(Math.max(g,1),"float"):null,G=_?fe(3*Math.max(x,1),"float"):null,q=e=>G.element(e),W=e=>q(Ce(e)),j=e=>q(Ce(e.add(x))),K=e=>q(e.add(Ce(2*x))),$=_?fe(Math.max(v,1),"float"):null,Q=e=>$.element(e),Z=_?fe(24*Math.max(x,1),"uint"):null,Y=e=>Z.element(e),J=_?k(0):null,ee=_?k(new ws):null,te=_?k(2):null,ie=N(Array.from(e.numTrisTable)),oe=N(wh.map(([e,t,a])=>new hs(e,t,a))),ue=Nh(e.env,!1),ce=Nh(e.env),pe=(e,t)=>e.div(t).mul(2).sub(1),ge=(e,t)=>e.div(t).mul(m-1).floor(),_e=re(()=>{for(let e=0;e<8;e++)et(M(e),or(0))})(),ye=re(()=>{le(Ce(me).greaterThanEqual(Ce(s)),()=>{Re()}),e.buffers.positions.element(Ce(me)).assign(de(0))})(),xe=_?re(()=>{le(Ce(me).greaterThanEqual(Ce(s)),()=>{Re()}),y.element(Ce(me)).assign(or(c))})():null,ve=Ga(S),be=e=>ve.load(Ye(Ft(e,ne(0),ne(n)))).x,Te=e=>L(Ft(e,ne(0),ne(n))),we=(e,t)=>{let a=Pt(e,0),r=C(a.div(4096)),s=a.sub(r.mul(4096)),i=C(s.div(64)),n=s.sub(i.mul(64));return ne(n,i,r).mul(4).add(t)},Se=re(()=>{let t=ne(se).add(d).toVar();le(t.x.greaterThan(n).or(t.y.greaterThan(n)).or(t.z.greaterThan(n)),()=>{Re()});let r=t.mul(4).add(ne(1.5)),s=(t=>{let a=nr(1e3).toVar();return he(kh,({i:r})=>{le(nr(r).greaterThanEqual(e.npart),()=>{X()});let s=nr(r).add(.5).mul(1/kh),i=e.env.shapeRow(s,0).toVar(),n=e.env.shapeRow(s,1).toVar(),l=e.env.shapeRow(s,2).toVar(),o=e.env.shapeRow(s,3).toVar(),u=Ah(n,t.sub(i.xyz)).div(o.z).toVar(),d=Eh(l.x,u,l,o,e.env.meshSdf).sub(o.y).mul(o.z).toVar();a.assign(Ph(i.w,a,d,o.x))}),a})(pe(r,a));wa(S,Ye(t),de(s.add(c),0,0,0)).toStack()})(),Ve=e=>{le(e.x.greaterThan(n).or(e.y.greaterThan(n)).or(e.z.greaterThan(n)),()=>{Re()})},Me=p?re(()=>{let e=ne(se).toVar();Ve(e),L(e).assign(nr(-1).add(c)),_&&(I(e).assign(nr(-1).add(c)),D(e).assign(nr(-1).add(c)))})():null,ze=p?re(()=>{let e=ne(se).add(d).toVar();Ve(e);let t=be(e).toVar(),a=Te(e).toVar();le(Ae(t).greaterThan(u).and(a.greaterThan(-.5)),()=>{let t=$e(z(1),Ce(1)).toVar();A.element(t).assign(a),L(e).assign(nr(-1).add(c))})})():null,ke=p?re(()=>{let e=ne(se).add(d).toVar();Ve(e);let t=be(e).toVar(),a=Te(e).toVar();le(Ae(t).lessThanEqual(u).and(a.lessThan(-.5)),()=>{let t=nr(-1).toVar(),a=rt(z(1),Ce(1)).toVar();le(a.greaterThanEqual(1),()=>{t.assign(A.element(a.sub(1)))}).Else(()=>{$e(z(1),Ce(1));let e=$e(z(0),Ce(1)).toVar();le(e.lessThan(Ce(g)),()=>{t.assign(e.toFloat())}).Else(()=>{et(z(2),Ce(1))})}),le(t.greaterThan(-.5),()=>{O.element(Ce(t)).assign((e=>e.x.add(e.y.mul(256)).add(e.z.mul(65536)))(e)),L(e).assign(t.add(c))})})})():null,Pe=p?re(()=>{let e=Ze(z(0)).toVar(),t=Ze(z(2)).toVar();if(et(M(1),or(e)),et(M(2),or(t)),et(z(2),Ce(0)),_){let e=Ze(z(3)).toVar(),t=Ze(z(5)).toVar();et(M(4),or(e)),et(M(5),or(t)),et(z(5),Ce(0));let a=Ze(z(6)).toVar(),r=Ze(z(8)).toVar();et(M(6),or(a)),et(M(7),or(r)),et(z(8),Ce(0))}})():null,Ee=_?re(()=>{let e=ne(se).toVar();le(e.x.greaterThanEqual(h.x).or(e.y.greaterThanEqual(h.y)).or(e.z.greaterThanEqual(h.z)),()=>{Re()});let t=e.add(d).toVar();Ve(t);let a=D(t).toVar();le(a.greaterThan(-.5),()=>{let e=$e(z(7),Ce(1)).toVar();Q(e).assign(a),D(t).assign(nr(-1).add(c))});let r=I(t).toVar();le(r.lessThan(-.5),()=>{Re()}),I(t).assign(nr(-1).add(c)),he(48,()=>{le(r.lessThan(-.5),()=>{X()});let e=$e(z(4),Ce(1)).toVar();K(e).assign(r),r.assign(W(r))})})():null,Ne=_?re(()=>{let e=ne(se).add(d).toVar();Ve(e);let t=nr(0).toVar();le(Te(e).greaterThan(-.5),()=>{let a=e.mul(4).toVar(),r=Je.map(([e,t,r])=>He(ne(a.x.add(4*e),a.y.add(4*t),a.z.add(4*r))).toVar()),s=r[0];for(let e=1;e<8;e++)s=s.add(r[e]);let i=Ja(s).toVar(),n=Ua(r[0],i);for(let e=1;e<8;e++)n=Ut(n,Ua(r[e],i));le(n.greaterThan(te),()=>{t.assign(nr(1))})}),F(e).assign(t.add(c))})():null,Be=Math.min(4096,Math.max(g,1)),Le=()=>{let e=ne(se).toVar(),t=C(e.x.mul(.25)).toVar(),a=C(e.y.mul(.25)).toVar();return{slot:a.mul(Be).add(t).toVar(),local:ne(e.x.sub(t.mul(4)),e.y.sub(a.mul(4)),e.z).toVar()}},Ie=e=>(e=>{let t=C(e.div(65536)),a=e.sub(t.mul(65536)),r=C(a.div(256)),s=a.sub(r.mul(256));return ne(s,r,t)})(O.element(Ce(e))),De=p?re(()=>{let e=ne(se).add(d.mul(4)).toVar(),t=e.mul(.25).floor().toVar(),r=Te(t).toVar();le(r.lessThan(-.5),()=>{Re()});let{sdf:s}=ue(pe(e,a),ge(e,a));wa(T,Ye(we(r,e.sub(t.mul(4)))),de(s.add(c),0,0,0)).toStack()})():null,Fe=p?re(()=>{let{slot:e,local:t}=Le();le(e.greaterThanEqual(g),()=>{Re()});let r=Ie(e).toVar();le(Te(r).notEqual(e),()=>{Re()});let s=r.mul(4).add(t).toVar(),{sdf:i}=ue(pe(s,a),ge(s,a));wa(T,Ye(we(e,t)),de(i.add(c),0,0,0)).toStack()})():re(()=>{let e=ne(se).add(d.mul(4)).toVar(),t=be(e.mul(.25).floor()).toVar();le(Ae(t).greaterThan(u),()=>{wa(T,Ye(e),de(t.add(c),0,0,0)).toStack(),Re()});let{sdf:r}=ue(pe(e,a),ge(e,a));wa(T,Ye(e),de(r.add(c),0,0,0)).toStack()})(),Ue=re(()=>{let e=ne(se).add(d.mul(2)).toVar();le(e.x.greaterThan(r-1).or(e.y.greaterThan(r-1)).or(e.z.greaterThan(r-1)),()=>{Re()}),le(Ae(be(e.mul(.5).floor())).greaterThan(u),()=>{Re()});let{color:t,colorDivisor:a}=ce(pe(e,r-1),ge(e,r-1)),s=a.greaterThan(0).select(t,de(0));wa(w,Ye(e),Ft(s.add(c),de(0),de(1))).toStack()})(),Ge=Ga(T),qe=p?(e,t,r)=>{let s=Ft(ne(e,t,r),ne(0),ne(a)),i=s.mul(.25).floor(),n=Te(i),l=Ge.load(Ye(we(n,s.sub(i.mul(4))))).x;return n.lessThan(-.5).select(be(i),l)}:(e,t,r)=>Ge.load(Ye(Ft(ne(e,t,r),ne(0),ne(a)))).x,He=e=>{let t=e.x,a=e.y,r=e.z,s=qe(t.add(1),a,r).sub(qe(t.sub(1),a,r)),i=qe(t,a.add(1),r).sub(qe(t,a.sub(1),r)),n=qe(t,a,r.add(1)).sub(qe(t,a,r.sub(1)));return s.equal(0).and(i.equal(0)).and(n.equal(0)).select(ne(.199,.299,.399),Ja(ne(s,i,n)))},je=(t,r,i)=>{let n=((e,t,a)=>{let r=(r,s,i,n)=>qe(e.add(r),t.add(s),a.add(i)).lessThan(0).toFloat().mul(n);return r(0,0,0,1).add(r(1,0,0,2)).add(r(0,1,0,8)).add(r(1,1,0,4)).add(r(0,0,1,16)).add(r(1,0,1,32)).add(r(0,1,1,128)).add(r(1,1,1,64))})(t,r,i).toVar(),u=ie.element(Ce(n)).toVar();le(u.lessThan(.5),()=>{Re()});let d=$e(M(),or(u)).toVar();le(nr(d).add(u).mul(3).lessThanEqual(s),()=>{let s=n.add(.5).mul(.00390625);he(5,({i:n})=>{le(nr(n).greaterThanEqual(u),()=>{X()});let h=nr(n).toVar();he(3,({i:n})=>{let u=nr(n).toVar();((t,r,s,i,n,u)=>{let d=n.mul(.0625).add(.03125),h=e.triTable.sample(ae(d,i)).x.mul(2).toInt().toVar(),m=ne(t,r,s).add(oe.element(h)).toVar(),c=ne(t,r,s).add(oe.element(h.add(1))).toVar(),p=qe(m.x,m.y,m.z).toVar(),g=qe(c.x,c.y,c.z).toVar(),f=p.div(p.sub(g)).toVar(),_=m.add(c.sub(m).mul(f)).toVar().div(a).mul(2).sub(1).toVar(),y=_.mul(l).add(ne(o)),x=Ja(Wt(He(m),He(c),f)),v=_.add(1).mul(.5),b=Ga(w,v,Ce(0)),T=u.toVar();e.buffers.positions.element(T).assign(de(y,1)),e.buffers.normals.element(T).assign(de(x,0)),e.buffers.colors.element(T).assign(b)})(t,r,i,s,h.mul(3).add(u),Ce(d).add(Ce(h)).mul(3).add(Ce(u)))})})})},Ke=p?re(()=>{let{slot:e,local:t}=Le();le(e.greaterThanEqual(g),()=>{Re()});let r=Ie(e).toVar();le(Te(r).notEqual(e),()=>{Re()});let s=r.x.mul(4).add(t.x).toVar(),i=r.y.mul(4).add(t.y).toVar(),n=r.z.mul(4).add(t.z).toVar();le(s.greaterThanEqual(a).or(i.greaterThanEqual(a)).or(n.greaterThanEqual(a)),()=>{Re()}),je(s,i,n)})():re(()=>{let e=ne(se).x.toVar(),t=ne(se).y.toVar(),r=ne(se).z.toVar();le(e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a)),()=>{Re()}),le(Ae(be(ne(e,t,r).mul(.25).floor())).greaterThan(u),()=>{Re()}),je(e,t,r)})(),Xe=()=>{let e=ne(We).toVar(),t=e.y.mul(Be).add(e.x).toVar(),a=ne(0).toVar(),r=nr(0).toVar();return le(t.lessThan(g),()=>{a.assign(Ie(t)),le(Te(a).equal(t),()=>{r.assign(nr(1))})}),{brick:a,valid:r}},Qe=()=>{let e=ne(We).add(d).toVar(),t=nr(0).toVar();return le(e.x.lessThanEqual(n).and(e.y.lessThanEqual(n)).and(e.z.lessThanEqual(n)),()=>{le(Te(e).greaterThan(-.5),()=>{t.assign(nr(1))})}),{brick:e,valid:t}},Je=[[0,0,0],[1,0,0],[0,1,0],[1,1,0],[0,0,1],[1,0,1],[0,1,1],[1,1,1]],tt=[[0,1],[2,3],[4,5],[6,7],[0,2],[1,3],[4,6],[5,7],[0,4],[1,5],[2,6],[3,7]],at=t=>re(()=>{let r=Lh("float",64),s=Lh("float",1),i=ne(dt).toVar(),n=Ce(i.x.add(i.y.mul(4)).add(i.z.mul(16))).toVar(),{brick:u,valid:d}=t(),h=F(u).toVar(),m=nr(1).add(h).toVar(),p=h.greaterThan(.5),g=p.and(i.x.lessThan(2).and(i.y.lessThan(2)).and(i.z.lessThan(2))).or(p.not()),f=u.x.mul(4).add(i.x.mul(m)).toVar(),_=u.y.mul(4).add(i.y.mul(m)).toVar(),y=u.z.mul(4).add(i.z.mul(m)).toVar(),x=Je.map(([e,t,a])=>qe(f.add(m.mul(e)),_.add(m.mul(t)),y.add(m.mul(a))).toVar()),b=x[0].lessThan(0).toFloat();for(let e=1;e<8;e++)b=b.add(x[e].lessThan(0).toFloat());let T=b.toVar(),S=nr(0).toVar();le(d.greaterThan(.5).and(g).and(f.add(m).lessThanEqual(a)).and(_.add(m).lessThanEqual(a)).and(y.add(m).lessThanEqual(a)).and(T.greaterThan(.5)).and(T.lessThan(7.5)),()=>{S.assign(nr(1))}),r.element(n).assign(S.add(c)),Oe(),le(n.equal(Ce(0)).and(d.greaterThan(.5)),()=>{let e=nr(0).toVar();he(64,({i:t})=>{e.addAssign(r.element(t))});let t=nr(-1).toVar();le(e.greaterThan(.5),()=>{let e=rt(z(7),Ce(1)).toVar();le(e.greaterThanEqual(1),()=>{t.assign(Q(e.sub(1)))}).Else(()=>{$e(z(7),Ce(1));let e=$e(z(6),Ce(1)).toVar();le(e.lessThan(Ce(v)),()=>{t.assign(e.toFloat())}).Else(()=>{et(z(8),Ce(1))})}),le(t.greaterThan(-.5),()=>{D(u).assign(t.add(c))})}),s.element(Ce(0)).assign(t)}),Oe();let V=s.element(Ce(0)).toVar(),M=S.greaterThan(.5).or(p.and(g).and(d.greaterThan(.5)).and(f.add(m).lessThanEqual(a)).and(_.add(m).lessThanEqual(a)).and(y.add(m).lessThanEqual(a)));le(M.and(V.greaterThan(-.5)),()=>{let t=ne(0).toVar(),r=nr(0).toVar();for(let[e,a]of tt)le(x[e].lessThan(0).toFloat().notEqual(x[a].lessThan(0).toFloat()),()=>{let s=x[e].div(x[e].sub(x[a])),[i,n,l]=Je[e],[o,u,d]=Je[a];t.addAssign(ne(i,n,l).add(ne(o-i,u-n,d-l).mul(s)).mul(m)),r.addAssign(1)});let s=t.div(Pt(r,1)).toVar();le(r.lessThan(.5),()=>{s.assign(ne(m.mul(.5)))});let u=ne(f,_,y).add(s).toVar().div(a).mul(2).sub(1).toVar(),d=u.mul(l).add(ne(o)),h=ne(0).toVar(),c=s.div(m).toVar();for(let e=0;e<8;e++){let[t,a,r]=Je[e],s=t?Rh(c.x):nr(1).sub(Rh(c.x)),i=a?Rh(c.y):nr(1).sub(Rh(c.y)),n=r?Rh(c.z):nr(1).sub(Rh(c.z));h.addAssign(He(Ch(ne(f.add(m.mul(t)),_.add(m.mul(a)),y.add(m.mul(r))))).mul(s.mul(i).mul(n)))}let g=Ja(h),v=u.add(1).mul(.5),b=Ga(w,v,Ce(0)),T=Ce(p.select(i.x.add(i.y.mul(2)).add(i.z.mul(4)),nr(n))).toVar(),S=Ce(V.mul(64)).add(T).toVar();e.buffers.positions.element(S).assign(de(d,1)),e.buffers.normals.element(S).assign(de(g,0)),e.buffers.colors.element(S).assign(b)})})(),st=_?at(Xe):null,it=_?at(Qe):null,nt=e=>re(()=>{let t=Lh("float",64),r=Lh("float",64),s=Lh("float",48),n=ne(dt).toVar(),l=Ce(n.x.add(n.y.mul(4)).add(n.z.mul(16))).toVar(),{brick:o,valid:u}=e(),d=o.x.mul(4).add(n.x).toVar(),h=o.y.mul(4).add(n.y).toVar(),m=o.z.mul(4).add(n.z).toVar(),p=qe(d,h,m).lessThan(0).toFloat().toVar(),g=(e,t,a)=>U(Ce(C(e.mul(.25))).add(Ce(C(t.mul(.25))).mul(i)).add(Ce(C(a.mul(.25))).mul(i*i))),f=e=>e.mul(.5).fract().lessThan(.25),_=(e,t)=>e.greaterThanEqual(t).and(e.add(t).lessThanEqual(a)),y=nr(0).toVar(),v=nr(0).toVar(),b=nr(0).toVar(),T=nr(1).toVar(),w=nr(1).toVar(),S=nr(1).toVar(),V=(e,t,r,s,i,n,l,o,c)=>{let y=g(...c[0]).add(g(...c[1])).add(g(...c[2])).add(g(...c[3])).greaterThan(3.5).toVar(),x=qe(d.add(r),h.add(s),m.add(i)).lessThan(0).toFloat(),v=qe(d.add(2*r),h.add(2*s),m.add(2*i)).lessThan(0).toFloat();le(u.greaterThan(.5).and(y.not()).and(o.add(1).lessThanEqual(a)).and(_(n,nr(1))).and(_(l,nr(1))).and(p.notEqual(x)),()=>{e.assign(nr(1)),t.assign(nr(1))}),le(u.greaterThan(.5).and(y).and(f(d)).and(f(h)).and(f(m)).and(o.add(2).lessThanEqual(a)).and(_(n,nr(2))).and(_(l,nr(2))).and(p.notEqual(v)),()=>{e.assign(nr(1)),t.assign(nr(2))})};V(y,T,1,0,0,h,m,d,[[d,h.sub(1),m.sub(1)],[d,h,m.sub(1)],[d,h,m],[d,h.sub(1),m]]),V(v,w,0,1,0,m,d,h,[[d.sub(1),h,m.sub(1)],[d.sub(1),h,m],[d,h,m],[d,h,m.sub(1)]]),V(b,S,0,0,1,d,h,m,[[d.sub(1),h.sub(1),m],[d,h.sub(1),m],[d,h,m],[d.sub(1),h,m]]);let R=y.add(v).add(b).mul(2).toVar();t.element(l).assign(R.add(c)),Oe(),le(l.equal(Ce(0)).and(u.greaterThan(.5)),()=>{let e=nr(0).toVar();he(64,({i:a})=>{r.element(a).assign(e),e.addAssign(t.element(a))}),$e(M(0),or(e));let a=C(e.add(7).mul(1/8)).toVar(),i=nr(-1).toVar(),n=nr(-1).toVar();he(48,({i:t})=>{le(nr(t).greaterThanEqual(a),()=>{X()});let r=nr(t).toVar(),l=nr(-1).toVar(),o=rt(z(4),Ce(1)).toVar();le(o.greaterThanEqual(1),()=>{l.assign(K(o.sub(1)))}).Else(()=>{$e(z(4),Ce(1));let e=$e(z(3),Ce(1)).toVar();le(e.lessThan(Ce(x)),()=>{l.assign(e.toFloat())}).Else(()=>{et(z(5),Ce(1))})}),s.element(Ce(r)).assign(l),le(l.greaterThan(-.5),()=>{j(l).assign(Ut(e.sub(r.mul(8)),8)),W(l).assign(nr(-1)),le(n.greaterThan(-.5),()=>{W(n).assign(l)}).Else(()=>{i.assign(l)}),n.assign(l)})}),I(o).assign(i)}),Oe(),le(R.greaterThan(.5),()=>{let e=(e,t,a)=>{let r=C(e.mul(.25)),s=C(t.mul(.25)),n=C(a.mul(.25)),l=Ce(r).add(Ce(s).mul(i)).add(Ce(n).mul(i*i)),o=Ce(e.sub(r.mul(4))).add(Ce(t.sub(s.mul(4))).mul(4)).add(Ce(a.sub(n.mul(4))).mul(16));return or(l.mul(64).add(o))},t=r.element(l).toVar(),a=(e,a,r)=>{let i=s.element(Ce(C(t.mul(1/8)))).toVar();le(i.greaterThan(-.5),()=>{let s=t.sub(C(t.mul(1/8)).mul(8)),n=Ce(i.mul(24).add(s.mul(3))).toVar();Y(n).assign(e),Y(n.add(Ce(1))).assign(a),Y(n.add(Ce(2))).assign(r)}),t.addAssign(1)},n=(t,r)=>{le(t.greaterThan(.5),()=>{let t=e(...r[0]).toVar(),s=e(...r[1]).toVar(),i=e(...r[2]).toVar(),n=e(...r[3]).toVar();le(p.greaterThan(.5),()=>{a(t,s,i),a(t,i,n)}).Else(()=>{a(t,n,i),a(t,i,s)})})};n(y,[[d,h.sub(T),m.sub(T)],[d,h,m.sub(T)],[d,h,m],[d,h.sub(T),m]]),n(v,[[d.sub(w),h,m.sub(w)],[d.sub(w),h,m],[d,h,m],[d,h,m.sub(w)]]),n(b,[[d.sub(S),h.sub(S),m],[d,h.sub(S),m],[d,h,m],[d.sub(S),h,m]])})})(),lt=_?nt(Xe):null,ot=_?nt(Qe):null,ut=_?re(()=>{let e=Lh("float",48),t=Lh("float",2),r=ne(dt).toVar(),s=Ce(r.x.add(r.y.mul(4)).add(r.z.mul(16))).toVar(),i=ne(We).toVar(),n=i.y.mul(Be).add(i.x).toVar();le(s.equal(Ce(0)),()=>{let r=nr(0).toVar();le(n.lessThan(g),()=>{let t=Ie(n).toVar();le(Te(t).equal(n),()=>{let s=nr(0).toVar();le(J.greaterThan(.5),()=>{let e=ne(0).toVar(),r=ne(0).toVar();for(let s=0;s<8;s++){let i=Ch(t.mul(4).add(ne(4*(1&s),4*(s>>1&1),4*(s>>2&1)))),n=Ch(i.div(a).mul(2).sub(1)).mul(l).add(ne(o)),u=ee.mul(de(n,1)).toVar(),d=Rh(u.w);e.addAssign(ne(Rh(u.x).lessThan(d.negate()).toFloat(),Rh(u.y).lessThan(d.negate()).toFloat(),Rh(u.z).lessThan(0).toFloat())),r.addAssign(ne(Rh(u.x).greaterThan(d).toFloat(),Rh(u.y).greaterThan(d).toFloat(),Rh(u.z).greaterThan(d).toFloat()))}le(Pt(Pt(e.x,Pt(e.y,e.z)),Pt(r.x,Pt(r.y,r.z))).greaterThan(7.5),()=>{s.assign(nr(1))})}),le(s.lessThan(.5),()=>{let a=I(t).toVar();he(48,({i:t})=>{le(a.lessThan(-.5),()=>{X()}),e.element(t).assign(a),r.addAssign(j(a)),a.assign(W(a))})})})});let s=nr(0).toVar();le(r.greaterThan(.5),()=>{let e=$e(M(3),or(r.mul(3))).toVar();s.assign(nr(e))}),t.element(Ce(0)).assign(s.add(c)),t.element(Ce(1)).assign(r)}),Oe();let u=t.element(Ce(1)).toVar(),d=t.element(Ce(0)).toVar(),h=nr(s).toVar();he(6,()=>{le(h.greaterThanEqual(u),()=>{X()});let t=e.element(Ce(C(h.mul(1/8)))).toVar(),a=h.sub(C(h.mul(1/8)).mul(8)),r=Ce(t.mul(24).add(a.mul(3))).toVar(),s=Ce(d.add(h.mul(3))).toVar(),i=e=>{let t=Y(0===e?r:r.add(Ce(e))).toVar(),a=Ce(t.shiftRight(or(6))).toVar(),s=Ce(t.bitAnd(or(63))).toVar(),i=(e=>E.element(e.add(Ce(2*P))))(a).toVar(),n=U(a),l=s.bitAnd(Ce(3)),o=s.shiftRight(Ce(2)).bitAnd(Ce(3)),u=s.shiftRight(Ce(4)).bitAnd(Ce(3)),d=l.shiftRight(Ce(1)).add(o.shiftRight(Ce(1)).mul(Ce(2))).add(u.shiftRight(Ce(1)).mul(Ce(4)));return{blockF:i,li:Ce(n.greaterThan(.5).select(d,s)).toVar()}},n=i(0),l=i(1),o=i(2);le(n.blockF.greaterThan(-.5).and(l.blockF.greaterThan(-.5)).and(o.blockF.greaterThan(-.5)),()=>{let e=e=>or(Ce(e.blockF.mul(64)).add(e.li));y.element(s).assign(e(n)),y.element(s.add(Ce(1))).assign(e(l)),y.element(s.add(Ce(2))).assign(e(o))}).Else(()=>{y.element(s).assign(or(0)),y.element(s.add(Ce(1))).assign(or(0)),y.element(s.add(Ce(2))).assign(or(0))}),h.addAssign(64)})})():null,ht=Math.ceil(t/Bh[0]),mt=Math.ceil(r/Bh[0]),ct=Math.ceil(i/Bh[0]),pt=(e,t)=>e.compute(t,Array.isArray(t)?Bh:void 0),gt=[Be,Math.max(1,Math.ceil(g/Be)),1];return{resolution:t,sparse:null!==p,poolBricks:g,meshlet:null!==_,vertexBlocks:v,needsInit:null!==p,sdfTexture:T,colorTexture:w,coarseTexture:S,counterAttribute:V.value,storageAttributes:[V,R,A,E,O,G,$,Z].filter(e=>null!==e).map(e=>e.value),uniforms:{bboxHalf:l,bboxOffset:o,activeThreshold:u,windowOrigin:d,..._?{windowSize:h,cullEnabled:J,cullMVP:ee,adaptCos:te}:{}},kernels:{zero:pt(_e,1),clear:ye.compute([Math.ceil(s/256),1,1],[256,1,1]),coarse:pt(Se,[ct,ct,ct]),...Me?{init:pt(Me,[ct,ct,ct])}:{},...ze?{release:pt(ze,[ct,ct,ct])}:{},...ke?{alloc:pt(ke,[ct,ct,ct])}:{},...Pe?{stats:pt(Pe,1)}:{},sdf:pt(Fe,p?gt:[ht,ht,ht]),...De?{sdfWindow:pt(De,[ht,ht,ht])}:{},color:pt(Ue,[mt,mt,mt]),extract:_?pt(lt,gt):pt(Ke,p?gt:[ht,ht,ht]),..._?{clearDraw:xe.compute([Math.ceil(s/256),1,1],[256,1,1]),meshRelease:pt(Ee,[ct,ct,ct]),verts:pt(st,gt),vertsWindow:pt(it,[i,i,i]),extractWindow:pt(ot,[i,i,i]),classify:pt(Ne,[ct,ct,ct]),gather:pt(ut,gt)}:{}}}}var Dh=24576;function Fh(e){let t=e.getAttribute("position");if(!t||t.count<3)return null;let a=e.getIndex(),r=Math.floor((a?a.count:t.count)/3);if(0===r)return null;let s=Math.max(1,Math.ceil(r/Dh));s>1&&console.warn(`Spline shape blend: mesh child has ${r} triangles — baking every ${s}th (SDF detail reduced).`);let i=Math.floor(r/s),n=new Float32Array(12*i),l=new hs(0,0,0),o=new hs,u=0;for(let e=0;e<i;e++){let r=e*s*3;for(let e=0;e<3;e++){let s=a?a.getX(r+e):r+e;o.fromBufferAttribute(t,s),n[u++]=o.x,n[u++]=o.y,n[u++]=o.z,n[u++]=0,l.x=Math.max(l.x,Math.abs(o.x)),l.y=Math.max(l.y,Math.abs(o.y)),l.z=Math.max(l.z,Math.abs(o.z))}}if(0===l.x&&0===l.y&&0===l.z)return null;let d=Math.max(l.x,l.y,l.z);return l.x=1.08*Math.max(l.x,.05*d),l.y=1.08*Math.max(l.y,.05*d),l.z=1.08*Math.max(l.z,.05*d),{data:n,triCount:i,boxHalf:l}}function Uh(e){let t=Ga(e);return(e,a,r)=>{let s=Pt(ne(a.z,a.w,r.w),ne(1e-5)).toVar(),i=a.y,n=ne(i.mod(4).mul(48),C(i.div(4)).mul(48),0).toVar(),l=Ft(e.div(s).mul(.5).add(.5),ne(0),ne(1)).mul(47).toVar(),o=Ut(C(l),ne(46)).toVar(),u=l.sub(o).toVar(),d=n.add(o).toVar(),h=(e,a,r)=>t.load(Ye(d.add(ne(e,a,r)))).x,m=u.x,c=u.y,p=u.z,g=Wt(h(0,0,0),h(1,0,0),m),f=Wt(h(0,1,0),h(1,1,0),m),_=Wt(h(0,0,1),h(1,0,1),m),y=Wt(h(0,1,1),h(1,1,1),m),x=Wt(Wt(g,f,c),Wt(_,y,c),p),v=Pt(s.x,Pt(s.y,s.z)),b=Ae(e).sub(s),T=tt(Pt(b,ne(0)));return x.mul(v).add(T)}}function Oh(e){return new hs(e%4*48,48*Math.floor(e/4),0)}var Gh=e=>e,qh=e=>e,Wh=new qa,Hh=Da(new gs),jh=k(1),Kh=k(1),$h=k(0),Xh=k(0),Qh=k(1),Zh=null;function Yh(){if(null!==Zh)return Zh;let e=re(()=>{let e=ae(jh,Kh),t=ae(1).div(e),a=W().mul(Qh).sub(ae(.5)).mul(2).add(ae(.5)).toVar();a.x.addAssign($h);let r=a.div(e).toVar(),s=Hh.sample(r).x.toVar();r.x.addAssign(t.x);let i=Hh.sample(r).x.toVar();r.y.addAssign(t.y);let n=Hh.sample(r).x.toVar();r.x.subAssign(t.x);let l=Hh.sample(r).x.toVar(),o=s,u=o.add(i),d=u.add(n),h=d.add(l);return de(h,d,u,o)})(),t=new Tt;return t.name="SplineShapeBlend.pyramid",t.fragmentNode=e,t.depthTest=!1,t.depthWrite=!1,t.blending=Os,t.needsUpdate=!0,Zh=t,t}var Jh=!1,em=!1,tm="",am=!1,rm=!1,sm=!1,im=!1,nm=!1,lm=!1,om=!1,um=!1,dm=!1;try{let e=new URLSearchParams(window.location.search);Jh="vertex"===e.get("dbgsbmarch"),em="0"===e.get("dbgsbultra"),tm=e.get("dbgsbchain")??"",am="1"===e.get("dbgsbnoclear"),rm="0"===e.get("dbgsbsparse"),sm="0"===e.get("dbgsbincr"),im="1"===e.get("dbgsblod"),nm="1"===e.get("dbgsbpool"),lm="0"===e.get("dbgsbpool"),om="0"===e.get("dbgsbmesh"),um="0"===e.get("dbgsbadapt"),dm="1"===e.get("dbgsbcull")}catch{}var hm={updates:0,skips:0,computes:0,readbacksResolved:0,readbackErrors:0,fieldsFull:0,fieldsWindowed:0,lastWindowBricks:0,refines:0,lastDispatchRes:0,regathers:0,readbackPending:!1,lastTotal:-1,lastPass:"",staleConfigSkips:0,marchPositions:null},mm=24576,cm=Math.cos(8*Math.PI/180);function pm(e,t,a=1){return new xs(e,t,{count:a,format:fs,type:ts,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:Hs,magFilter:Hs,wrapS:Fs,wrapT:Fs})}var gm=class{constructor(e=0,t=0,a=0){this.wantsReplacement=!1,this.capacityHint=0,this._builtOnce=!1,this.level=-1,this.spatialnAtBuild=-1,this._passesRenderer=null,this._marchCapacity=0,this._marchBuffers=null,this._computeNode=null,this._computeNodeKey="",this._legacyMaterialsLevel=-1,this._computeDirty=!1,this._cachedAtBuild=!1,this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,this._lastFieldChangeMs=0,this._ultraResAtBuild=0,this._ultraReadbackPending=!1,this._ultraReadbackQueued=!1,this._ultraWantedCapacity=0,this._poolAtBuild=0,this._ultraWantedPoolBricks=0,this.poolHint=0,this._drawIndex=null,this._vertexBuffers=null,this._vertBlocksAtBuild=0,this._ultraWantedVertexBlocks=0,this.vertHint=0,this._cullCamera=null,this._lastGatherMVP=new ws,this._hasGatherMVP=!1,this._ultraRetired=[],this._retiredStorage=[],this._ultraBuildSeq=0,this._lastRenderer=null,this._meshBaker=null,this._meshAtBuild=!1,this._meshSlots=new Map,this._meshBakeFailed=new Map,this._meshWarnedFull=!1,this.shapesTex=Da(new gs),this.spatialTexNode=Da(new gs),this.potentialTexNode=Da(new gs),this.voxelTexNode=Da(new gs),this.pyramid1TexNode=Da(new gs),this.pyramid2TexNode=Da(new gs),this.npartUniform=k(0),this.spatialnUniform=k(1),this.spanUniform=k(0),this.spatialMaterial=null,this.potentialMaterial=null,this.voxelMaterial=null,this.spatialTargets=[],this.potentialTargets=[],this.voxelTargets=[],this.pyramidTargets=[],this.retired=!1,this._onSettled=[],this.capacityHint=e,this.poolHint=t,this.vertHint=a;let r=s(),i=new js(r.triTable,16,256,vs,ts);i.needsUpdate=!0;let n=new js(r.numTrisTable,256,1,vs,ts);n.needsUpdate=!0,this.triTableTexNode=Da(i),this.numTrisTableTexNode=Da(n)}shapeRow(e,t){return this.shapesTex.sample(ae(e,(t+.5)/5))}_quadMaterial(e,t){let a=new Tt;return a.name=e,a.fragmentNode=t,a.depthTest=!1,a.depthWrite=!1,a.blending=Os,a.needsUpdate=!0,a}_buildSpatialMaterial(e){let t=e.spatialDivisions,a=h,r=m,s=this.npartUniform,i=this.spatialnUniform,n=this.spanUniform,l=e.spatialn,o=re(()=>{let e=ae(t*l,t**2),o=C(W().mul(e)).toVar(),u=o.y.toVar(),d=u.sub(C(u.div(t)).mul(t)).toVar();u.assign(C(u.div(t)));let h=u,m=o.x.toVar(),c=m.sub(C(m.div(i)).mul(i)).toVar().mul(4*a).toVar();m.assign(C(m.div(i)));let p=ne(m,d,h),g=p.div(t).mul(2).sub(1).sub(n).toVar(),f=p.add(1).div(t).mul(2).sub(1).add(n).toVar(),_=e=>{let t=nr(0).toVar();for(let i=a-1;i>=0;i--){let a=e.add(i),n=a.add(.5).div(r),l=this.shapeRow(n,0),o=qh(l.xyz),u=Gh(l.w);t.mulAssign(2);let d=Gh(g.x).lessThan(Gh(o.x)).and(Gh(o.x).lessThan(Gh(f.x))).and(Gh(g.y).lessThan(Gh(o.y))).and(Gh(o.y).lessThan(Gh(f.y))).and(Gh(g.z).lessThan(Gh(o.z))).and(Gh(o.z).lessThan(Gh(f.z))).and(a.lessThan(Gh(s))).or(u.equal(-2));t.addAssign(d.select(nr(1),nr(0)))}return t};return de(_(c),_(c.add(a)),_(c.add(2*a)),_(c.add(3*a)))})();return this._quadMaterial("SplineShapeBlend.spatial",o)}_fieldEnv(e,t){return{shapeRow:(e,t)=>this.shapeRow(e,t),spatialTex:this.spatialTexNode,spatialDivisions:e.spatialDivisions,spatialn:e.spatialn,colorKBump:t,meshSdf:this._meshBaker?Uh(this._meshBaker.atlas):void 0}}_buildPotentialMaterial(e){let t=e.spatialDivisions,a=e.resolution,r=a-1,s=1/a,i=e.zLayersPerRow,n=e.basePyramidSize,l=Nh(this._fieldEnv(e,2*s)),o=re(()=>{let e=C(W().mul(ae(n,n))).toVar(),o=e.x.mod(a),u=e.y.mod(a),d=C(e.x.mul(s)).add(C(e.y.mul(s)).mul(i)),h=ne(o,u,d),m=h.div(r).mul(2).sub(1).toVar(),c=C(h.div(r).mul(t-1)).toVar(),{sdf:p,color:g}=l(m,c),f=or(g.x.mul(255)),_=or(g.y.mul(255)),y=f.shiftLeft(or(8)).bitOr(_);return de(p,y.toFloat().mul(1525902e-11),g.z,g.w)})();return this._quadMaterial("SplineShapeBlend.potential",o)}_buildVoxelMaterial(e){let t=e.resolution,a=t-1,r=1/t,s=e.zLayersPerRow,i=e.basePyramidSize,n=Th(t,s),l=this.potentialTexNode,o=()=>{let e=C(W().mul(ae(i,i))).toVar();return{xi:e.x.mod(t).toVar(),yi:e.y.mod(t).toVar(),zi:C(e.x.mul(r)).add(C(e.y.mul(r)).mul(s)).toVar()}},u=(e,t,a)=>{let r=(r,s,i,o)=>n(e.add(r),t.add(s),a.add(i),l).x.lessThan(0).toFloat().mul(o);return r(0,0,0,1).add(r(1,0,0,2)).add(r(0,1,0,8)).add(r(1,1,0,4)).add(r(0,0,1,16)).add(r(1,0,1,32)).add(r(0,1,1,128)).add(r(1,1,1,64))},d=re(()=>{let{xi:e,yi:t,zi:r}=o(),s=((e,t,a)=>{let r=n(e.add(1),t,a,l).x.sub(n(e.sub(1),t,a,l).x),s=n(e,t.add(1),a,l).x.sub(n(e,t.sub(1),a,l).x),i=n(e,t,a.add(1),l).x.sub(n(e,t,a.sub(1),l).x);return r.equal(0).and(s.equal(0)).and(i.equal(0)).select(ne(.199,.299,.399),Ja(ne(r,s,i)))})(e,t,r).toVar(),i=de(s,0).toVar(),d=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return le(d.not(),()=>{i.assign(de(s,u(e,t,r)))}),i})(),h=re(()=>{let{xi:e,yi:t,zi:r}=o(),s=de(0).toVar(),i=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return le(i.not(),()=>{let a=u(e,t,r);s.assign(this.numTrisTableTexNode.sample(ae(a.add(.5).div(256),.5)))}),s})();return this._quadMaterial("SplineShapeBlend.voxel",Ta({output:d,numTris:h}))}_spatialTargetFor(e){let t=e.resolutionLevel,a=this.spatialTargets[t];return a||(a=pm(e.spatialDivisions*e.spatialn,e.spatialDivisions**2),this.spatialTargets[t]=a),a}_targetsFor(e){let t=e.resolutionLevel,a=this._spatialTargetFor(e),r=this.potentialTargets[t];r||(r=pm(e.basePyramidSize,e.basePyramidSize),this.potentialTargets[t]=r);let s=this.voxelTargets[t];s||(s=pm(e.basePyramidSize,e.basePyramidSize,2),s.textures[0].name="output",s.textures[1].name="numTris",s.textures[1].format=vs,this.voxelTargets[t]=s);let i=this.pyramidTargets[t];return i||(i=[pm(e.pyramidTexture1Width,e.pyramidTexture1Height),pm(e.pyramidTexture2Width,e.pyramidTexture2Height)],this.pyramidTargets[t]=i),{spatial:a,potential:r,voxel:s,pyramid:i}}_marchResources(e){let t=this._targetsFor(e),a=e.pyramidLevelSizes.length%2==0?0:1,r=1-a;return{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:t.pyramid[r].width,height:t.pyramid[r].height},pyramid2Size:{width:t.pyramid[a].width,height:t.pyramid[a].height}}}_maxMarchSlots(e){let t=e.backend?.device?.limits,a=Math.min(t?.maxStorageBufferBindingSize??134217728,t?.maxBufferSize??268435456);return 192*Math.floor(a/16/192)}_ensureMarchCapacity(e,t){if(null!==this._marchBuffers&&e<=this._marchCapacity)return!1;let a=Math.min(Math.max(t,mm),192*Math.ceil(1.5*e/192));if(null!==this._marchBuffers&&a<=this._marchCapacity)return!1;if(null!==this._marchBuffers)for(let e of[this._marchBuffers.positions,this._marchBuffers.normals,this._marchBuffers.colors]){let t=e.value;t&&this._retiredStorage.push(t)}return this._marchBuffers={positions:fe(a,"vec4"),normals:fe(a,"vec4"),colors:fe(a,"vec4")},this._marchCapacity=a,this._computeNode=null,!0}update(e,t,a){if(hm.updates++,this._lastRenderer=t,void 0!==a&&(this._cullCamera=a),e._meshSdfBaked.size>0)for(let[t,a]of e._meshSdfBaked)a.owner!==this&&e._meshSdfBaked.delete(t);let r=p(e),i=!0===t.backend?.isWebGPUBackend;if(i&&e._meshSdfWanted.size>0&&null===this._meshBaker&&(this._meshBaker=function(e,t){let a=new H(192,48*Math.ceil(4),48);a.format=vs,a.type=ts,a.minFilter=Hs,a.magFilter=Hs,a.name="SplineShapeBlend.meshSdfAtlas";let r=nr(t).mul(0),s=k(new hs(0,0,0)),i=k(0),n=k(new hs(1,1,1)),l=fe(3*Dh,"vec4"),o=e=>l.element(e),u=re(()=>{let e=ne(se).toVar();le(e.x.greaterThanEqual(48).or(e.y.greaterThanEqual(48)).or(e.z.greaterThanEqual(48)),()=>{Re()});let t=e.div(47).mul(2).sub(1).mul(n).toVar(),l=nr(1e30).toVar(),u=nr(1e15).toVar();he(Dh,({i:e})=>{le(nr(e).greaterThanEqual(i),()=>{X()});let a=Ce(nr(e).toVar()).mul(3).toVar(),r=o(a).xyz.toVar(),s=o(a.add(Ce(1))).xyz.toVar(),n=o(a.add(Ce(2))).xyz.toVar(),d=s.sub(r).toVar(),h=n.sub(r).toVar(),m=t.sub(r).toVar(),c=Ua(d,m).toVar(),p=Ua(h,m).toVar(),g=t.sub(s).toVar(),f=Ua(d,g).toVar(),_=Ua(h,g).toVar(),y=t.sub(n).toVar(),x=Ua(d,y).toVar(),v=Ua(h,y).toVar(),b=ne(0).toVar(),T=f.mul(v).sub(x.mul(_)).toVar(),w=x.mul(p).sub(c.mul(v)).toVar(),S=c.mul(_).sub(f.mul(p)).toVar();le(c.lessThanEqual(0).and(p.lessThanEqual(0)),()=>{b.assign(r)}).ElseIf(f.greaterThanEqual(0).and(_.lessThanEqual(f)),()=>{b.assign(s)}).ElseIf(v.greaterThanEqual(0).and(x.lessThanEqual(v)),()=>{b.assign(n)}).ElseIf(S.lessThanEqual(0).and(c.greaterThanEqual(0)).and(f.lessThanEqual(0)),()=>{let e=c.div(c.sub(f));b.assign(r.add(d.mul(e)))}).ElseIf(w.lessThanEqual(0).and(p.greaterThanEqual(0)).and(v.lessThanEqual(0)),()=>{let e=p.div(p.sub(v));b.assign(r.add(h.mul(e)))}).ElseIf(T.lessThanEqual(0).and(_.sub(f).greaterThanEqual(0)).and(x.sub(v).greaterThanEqual(0)),()=>{let e=_.sub(f).div(_.sub(f).add(x.sub(v)));b.assign(s.add(n.sub(s).mul(e)))}).Else(()=>{let e=nr(1).div(T.add(w).add(S)),t=w.mul(e),a=S.mul(e);b.assign(r.add(d.mul(t)).add(h.mul(a)))});let V=t.sub(b).toVar(),M=Ua(V,V).toVar();le(M.lessThan(l),()=>{l.assign(M);let e=ca(d,h),t=Ua(V,e).greaterThanEqual(0).select(nr(1),nr(-1));u.assign(ha(M).mul(t))})});let d=Pt(n.x,Pt(n.y,n.z));wa(a,Ye(e.add(s)),de(u.div(d).add(r),0,0,0)).toStack()})(),d=Math.ceil(12),h=u.compute([d,d,d],[4,4,4]);return{atlas:a,slots:16,kernel:h,uniforms:{slotOrigin:s,triCount:i,boxHalf:n},setTriangles(e,t){let a=l.value;a.array.set(e.subarray(0,12*t)),a.needsUpdate=!0}}}(0,++this._ultraBuildSeq)),0===e.npart)return null!==this._meshBaker&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t),void(e.geometry.drawRange.count=0);this.npartUniform.value=e.npart,this.spatialnUniform.value=e.spatialn,this.spanUniform.value=e.spatialPassUniforms.span.value,e.shapesDataTexture.value&&(this.shapesTex.value=e.shapesDataTexture.value);let n=!Jh&&i,l=n&&!em&&e.ultraFieldResolution>0,o=l&&!lm&&(nm||e.ultraFieldResolution>=512)?Math.min(Math.pow(e.ultraFieldResolution/4,3),Math.max(function(e){let t=e/4;return Math.min(t*t*t,Math.max(8192,16*t*t))}(e.ultraFieldResolution),this._ultraWantedPoolBricks,this.poolHint)):0,u=o>0&&!om,d=this._maxMarchSlots(t),h=u?Math.min(Math.floor(d/64),Math.max(function(e){let t=e/4;return Math.min(262144,Math.max(2048,2*t*t))}(e.ultraFieldResolution),this._ultraWantedVertexBlocks,this.vertHint)):0,m=null!==this._meshBaker,c=e.needsRebuild||this.level!==e.resolutionLevel||this.spatialnAtBuild!==e.spatialn||this._cachedAtBuild!==n||this._ultraResAtBuild!==(l?e.ultraFieldResolution:0)||this._poolAtBuild!==o||this._vertBlocksAtBuild!==h||this._meshAtBuild!==m;if(c&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let g=n&&this._ensureMarchCapacity(Math.min(Math.max(d,mm),Math.max(e.geometry.drawRange.count,this.capacityHint,l?Math.max(function(e){return Math.max(mm,192*Math.ceil(16*e*e/192))}(e.ultraFieldResolution),this._ultraWantedCapacity):mm)),d);if(g&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let f=this._spatialTargetFor(e),_=l?null:this._targetsFor(e),y=c||g,x=l&&null!==this._ultra&&this._ultraResAtBuild===e.ultraFieldResolution&&!g&&this.level===e.resolutionLevel&&this.spatialnAtBuild===e.spatialn&&this._cachedAtBuild===n;if(y&&x)e.needsRebuild=!1,this._ultra.uniforms.bboxHalf.value=e.bboxSize/2,this._ultra.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag&&(this._ultraDrag.uniforms.bboxHalf.value=e.bboxSize/2,this._ultraDrag.uniforms.bboxOffset.value=e.bboxOffset);else if(y){e.needsRebuild=!1;let t=this.spatialnAtBuild!==e.spatialn;this.level=e.resolutionLevel,this.spatialnAtBuild=e.spatialn,this._meshAtBuild=m,(t||null===this.spatialMaterial)&&(this.spatialMaterial?.dispose(),this.spatialMaterial=this._buildSpatialMaterial(e)),this.spatialTexNode.value=f.texture;let a=this._ultra,r=this._ultraDrag;if(this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,l){let t=e.ultraFieldResolution,i=null!==a&&this._ultraResAtBuild===t;if(i&&!g)this._ultra=a,a.uniforms.bboxHalf.value=e.bboxSize/2,a.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag=r,r&&(r.uniforms.bboxHalf.value=e.bboxSize/2,r.uniforms.bboxOffset.value=e.bboxOffset);else{let n=i&&0===o&&!a.sparse;a&&!n&&this._ultraRetired.push(a.sdfTexture,a.colorTexture,a.coarseTexture),u&&null===this._drawIndex&&(this._drawIndex=fe(this._marchCapacity,"uint")),u&&null===this._vertexBuffers&&(this._vertexBuffers={positions:fe(64*h,"vec4"),normals:fe(64*h,"vec4"),colors:fe(64*h,"vec4")}),this._ultra=Ih({resolution:t,colorResolution:t/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(t/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:s().numTrisTable,buffers:u?this._vertexBuffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,sparseStorage:o>0?{poolBricks:o,meshlet:u?{drawIndex:this._drawIndex,vertexBlocks:h}:void 0}:void 0,reuseTextures:n?{sdfTexture:a.sdfTexture,colorTexture:a.colorTexture,coarseTexture:a.coarseTexture}:void 0}),this._poolAtBuild=o,this._vertBlocksAtBuild=h;let l=im&&t>=128&&!u?t/2:0;r&&(!i||0===l)&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),l>0&&(this._ultraDrag=Ih({resolution:l,colorResolution:l/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(l/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:s().numTrisTable,buffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,reuseTextures:i&&r?{sdfTexture:r.sdfTexture,colorTexture:r.colorTexture,coarseTexture:r.coarseTexture}:void 0}))}this._ultraResAtBuild=t}else{a&&this._ultraRetired.push(a.sdfTexture,a.colorTexture,a.coarseTexture),r&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),(this._legacyMaterialsLevel!==e.resolutionLevel||t||null===this.potentialMaterial||null===this.voxelMaterial)&&(this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose(),this.potentialMaterial=this._buildPotentialMaterial(e),this.voxelMaterial=this._buildVoxelMaterial(e),this._legacyMaterialsLevel=e.resolutionLevel),this.potentialTexNode.value=_.potential.texture,this.voxelTexNode.value=_.voxel.textures[0];let s=e.pyramidLevelSizes.length%2==0?0:1,i=1-s;this.pyramid1TexNode.value=_.pyramid[i].texture,this.pyramid2TexNode.value=_.pyramid[s].texture,this._ultraResAtBuild=0}let i=e.material;void 0===i.defines&&(i.defines={}),tm.includes("nomat")||(i.defines.SHAPEBLEND=e.resolutionLevel),tm.includes("nomat")||i.setShapeBlendResources?.(l?{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:1,height:1},pyramid2Size:{width:1,height:1},cached:u?{...this._vertexBuffers,drawIndex:this._drawIndex}:this._marchBuffers}:{...this._marchResources(e),cached:n?this._marchBuffers:void 0}),this._cachedAtBuild=n;let d=`${e.resolutionLevel}:${this._marchCapacity}`;this._computeNodeKey!==d&&(this._computeNode=null,this._computeNodeKey=d)}if(y)return this._builtOnce=!0,void(this._computeDirty=!0);null!==this._meshBaker&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t);let v=this._passesRenderer!==t,b=r&&!sm&&!this._computeDirty&&!v&&!e._fieldDirtyFull;if(!(r||this._computeDirty||v)){if(l&&this._refinePending&&null!==this._ultra&&performance.now()-this._lastFieldChangeMs>250)return this._refinePending=!1,this._passesRenderer=t,hm.refines++,void this._runUltra(e,t,!1,this._ultra);if(l&&dm&&null!==this._ultra&&this._ultra.meshlet&&this._lastDispatched===this._ultra&&!this._ultraReadbackPending&&this._updateCullUniforms(e,this._ultra)&&(!this._hasGatherMVP||!this._lastGatherMVP.equals(this._ultra.uniforms.cullMVP.value))){this._lastGatherMVP.copy(this._ultra.uniforms.cullMVP.value),this._hasGatherMVP=!0,hm.regathers++;let a=t;return a.compute(this._ultra.kernels.zero),am||a.compute(this._ultra.kernels.clearDraw),a.compute(this._ultra.kernels.gather),this._ultra.kernels.stats&&a.compute(this._ultra.kernels.stats),void this._runUltraReadback(e,t)}if(!e.drawRangeNeedsForceUpdate)return void hm.skips++;if(l)return void(this._ultraReadbackPending||this._runUltraReadback(e,t))}if(this._passesRenderer=t,tm.includes("none")&&hm.readbacksResolved>0)return void(this._computeDirty=!1);let T=t.getRenderTarget(),w=t.getMRT(),S=t.autoClear;if(t.setMRT(null),t.autoClear=!1,hm.lastPass="spatial",t.setRenderTarget(f),Wh.material=this.spatialMaterial,Wh.render(t),l){t.autoClear=S,t.setRenderTarget(T),t.setMRT(w);let a=null!==this._ultraDrag&&r&&!this._computeDirty;return this._refinePending=a,this._lastFieldChangeMs=performance.now(),this._runUltra(e,t,b,a?this._ultraDrag:this._ultra),void(this._computeDirty=!1)}return"spatial"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="potential",t.setRenderTarget(_.potential),Wh.material=this.potentialMaterial,Wh.render(t),"potential"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="voxel",t.setRenderTarget(_.voxel),Wh.material=this.voxelMaterial,Wh.render(t),"voxel"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="pyramid",this._renderPyramid(e,t,_.voxel,_.pyramid),t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),hm.lastPass="march",n&&(null===this._computeNode&&(this._computeNode=function(e,t,a){let r=Vh(e);return re(()=>{let{position:e,normal:a,color:s}=r(me.toFloat());t.positions.element(me).assign(de(e,1)),t.normals.element(me).assign(de(a,0)),t.colors.element(me).assign(s)})().compute(a)}(this._marchResources(e),this._marchBuffers,this._marchCapacity)),t.compute(this._computeNode),hm.computes++),void(this._computeDirty=!1))))}_bakeNextMeshChild(e,t){let a=this._meshBaker;for(let[r,s]of e._meshSdfWanted){let i=c(s);if(this._meshBakeFailed.get(r)===i)continue;let n=this._meshSlots.get(r);if(void 0===n){if(this._meshSlots.size>=a.slots)for(let t of this._meshSlots.keys())!e._meshSdfBaked.has(t)&&!e._meshSdfWanted.has(t)&&(this._meshSlots.delete(t),this._meshBakeFailed.delete(t));if(this._meshSlots.size>=a.slots){this._meshWarnedFull||(this._meshWarnedFull=!0,console.warn(`Spline shape blend: more than ${a.slots} distinct mesh children — the extra meshes are left out of the blend.`));continue}let t=new Set(this._meshSlots.values());for(n=0;t.has(n);)n++;this._meshSlots.set(r,n)}let l=Fh(s);if(null!==l)return a.setTriangles(l.data,l.triCount),a.uniforms.slotOrigin.value.copy(Oh(n)),a.uniforms.triCount.value=l.triCount,a.uniforms.boxHalf.value.copy(l.boxHalf),t.compute(a.kernel),e._meshSdfBaked.set(r,{slot:n,boxHalf:l.boxHalf.clone(),posVersion:i,owner:this}),void e._meshSdfWanted.delete(r);this._meshBakeFailed.set(r,i)}}_updateCullUniforms(e,t){if(!t.meshlet)return!1;let a=this._cullCamera;return dm&&a&&void 0!==a.projectionMatrix&&void 0!==a.matrixWorldInverse?(t.uniforms.cullMVP.value.multiplyMatrices(w.unjitteredProjection.value,a.matrixWorldInverse).multiply(e.matrixWorld),t.uniforms.cullEnabled.value=1,!0):(t.uniforms.cullEnabled.value=0,!1)}_runUltra(e,t,a,r){let s=t;hm.lastPass="ultra-kernels",hm.lastDispatchRes=r.resolution,hm.marchPositions=(r.meshlet?this._vertexBuffers:this._marchBuffers).positions.value,this._lastDispatched=r;let i=r.resolution,n=i/4,l=2/(i-1);r.uniforms.activeThreshold.value=rm?1e30:(3*Math.sqrt(3)+4)*l+.25*e._maxBlendK;let o=r.meshlet&&!um;r.meshlet&&(r.uniforms.adaptCos.value=o?cm:2);let u=0,d=0,h=0,m=n,c=n,p=n;if(a){let t=r.uniforms.activeThreshold.value+2/(e.spatialDivisions-1)+4/(i-1),a=e=>Math.floor(.5*(e+1)*(i-1)/4),s=e=>Math.min(n-1,Math.max(0,a(e))),l=e=>Math.min(n,Math.max(1,a(e)+1));if(u=s(e._fieldDirtyMin.x-t),d=s(e._fieldDirtyMin.y-t),h=s(e._fieldDirtyMin.z-t),m=l(e._fieldDirtyMax.x+t)-u,c=l(e._fieldDirtyMax.y+t)-d,p=l(e._fieldDirtyMax.z+t)-h,hm.fieldsWindowed++,o){let e=Math.min(n,u+m+1),t=Math.min(n,d+c+1),a=Math.min(n,h+p+1);u=Math.max(0,u-1),d=Math.max(0,d-1),h=Math.max(0,h-1),m=e-u,c=t-d,p=a-h}}else hm.fieldsFull++;hm.lastWindowBricks=m*c*p,r.uniforms.windowOrigin.value.set(u,d,h),r.uniforms.windowSize?.value.set(m,c,p);let g=0===u&&0===d&&0===h&&m===n&&c===n&&p===n,f=[Math.ceil(m/4),Math.ceil(c/4),Math.ceil(p/4)];r.meshlet&&this._updateCullUniforms(e,r)&&(this._lastGatherMVP.copy(r.uniforms.cullMVP.value),this._hasGatherMVP=!0),s.compute(r.kernels.zero),am||s.compute(r.meshlet?r.kernels.clearDraw:r.kernels.clear),r.needsInit&&r.kernels.init&&(s.compute(r.kernels.init),r.needsInit=!1),s.compute(r.kernels.coarse,f),r.kernels.release&&s.compute(r.kernels.release,f),r.kernels.alloc&&s.compute(r.kernels.alloc,f),r.kernels.meshRelease&&s.compute(r.kernels.meshRelease,f),r.sparse?g?s.compute(r.kernels.sdf):s.compute(r.kernels.sdfWindow,[m,c,p]):s.compute(r.kernels.sdf,[m,c,p]),r.kernels.classify&&s.compute(r.kernels.classify,f),s.compute(r.kernels.color,[Math.ceil(m/2),Math.ceil(c/2),Math.ceil(p/2)]),r.meshlet?(g?(s.compute(r.kernels.verts),s.compute(r.kernels.extract)):(s.compute(r.kernels.vertsWindow,[m,c,p]),s.compute(r.kernels.extractWindow,[m,c,p])),s.compute(r.kernels.gather)):s.compute(r.kernels.extract),r.kernels.stats&&s.compute(r.kernels.stats),hm.computes++,this._ultraReadbackPending?this._ultraReadbackQueued=!0:this._runUltraReadback(e,t)}_disposeRetired(){for(let e of this._ultraRetired)e.dispose();if(this._ultraRetired.length=0,this._retiredStorage.length>0){let e=this._lastRenderer?.backend?.attributeUtils;if(e)for(let t of this._retiredStorage)e.destroyAttribute(t);this._retiredStorage.length=0}for(let e of this._onSettled)e();this._onSettled.length=0}runWhenSettled(e){this._onSettled.push(e)}transferSettleQueue(e){e._onSettled.push(...this._onSettled),this._onSettled.length=0}_runUltraReadback(e,t){let a=this._lastDispatched??this._ultra,r=t;this._ultraReadbackPending=!0,hm.readbackPending=!0,r.getArrayBufferAsync(a.counterAttribute).then(r=>{if(this._ultraReadbackPending=!1,hm.readbackPending=!1,this.retired)return;this._disposeRetired();let s=new Uint32Array(r),i=a.meshlet?Math.floor(s[3]/3):s[0];if(hm.readbacksResolved++,hm.lastTotal=i,a.sparse&&s.length>2&&s[2]>0&&(this._ultraWantedPoolBricks=Math.ceil(1.5*Math.max(s[1],a.poolBricks)),this._computeDirty=!0),a.meshlet&&s.length>5&&s[5]>0){let e=Math.min(24*s[4],this._maxMarchSlots(t));e>this._marchCapacity&&(this._ultraWantedCapacity=Math.max(this._ultraWantedCapacity,e),this._computeDirty=!0)}if(a.meshlet&&s.length>7&&s[7]>0){let e=Math.min(Math.ceil(1.5*s[6]),Math.floor(this._maxMarchSlots(t)/64));e>a.vertexBlocks&&(this._ultraWantedVertexBlocks=Math.max(this._ultraWantedVertexBlocks,e),this._computeDirty=!0)}let n=Math.floor(this._marchCapacity/3);if(e.geometry.drawRange.count=3*Math.min(Math.ceil(1.25*i),n),e.markSceneShadowsDirty(),e.drawRangeNeedsForceUpdate=!1,this._ultraReadbackQueued&&(this._ultraReadbackQueued=!1,this._runUltraReadback(e,t)),i>n){let e=Math.min(3*i,this._maxMarchSlots(t));e>this._marchCapacity&&(this._ultraWantedCapacity=e,this._computeDirty=!0)}}).catch(()=>{hm.readbackErrors++,this._ultraReadbackPending=!1,hm.readbackPending=!1})}_renderPyramid(e,t,a,r){let s=e.pyramidLevelSizes,i=s.length-1-1;$h.value=0,Xh.value=0;for(let n=i;n>=0;n--){let l=n%2==i%2?r[0]:r[1],o=n===i?a:n%2==i%2?r[1]:r[0];Hh.value=o.textures.length>1?o.textures[1]:o.texture,jh.value=o.width,Kh.value=o.height;let u=s[n];2===n&&e.resolutionLevel%2!=0&&(u=3),Qh.value=u,l.viewport.set(Xh.value,0,u,u),t.setRenderTarget(l),Wh.material=Yh(),Wh.render(t),l.viewport.set(0,0,l.width,l.height);let d=$h.value;$h.value=Xh.value,Xh.value=d,n<i&&(Xh.value+=s[n+1])}hm.lastPass="pyramid-readback";let n=s.length%2==0?0:1;t.readRenderTargetPixelsAsync(r[n],r[n].width-1,0,1,1).then(t=>{let a=t[0];hm.readbacksResolved++,hm.lastTotal=a,!this.retired&&(this._disposeRetired(),(3*a>e.geometry.drawRange.count||e.drawRangeNeedsForceUpdate)&&(e.geometry.drawRange.count=3*Math.floor(1.2*a)),e.drawRangeNeedsForceUpdate=!1,null!==this._marchBuffers&&e.geometry.drawRange.count>this._marchCapacity&&(this._computeDirty=!0))}).catch(()=>{})}dispose(){for(let e of[...this.spatialTargets,...this.potentialTargets,...this.voxelTargets,...this.pyramidTargets.flat()])e?.dispose();this.spatialMaterial?.dispose(),this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose();let e=this._lastRenderer?.backend?.attributeUtils,t=t=>{if(e&&null!==t)for(let a of[t.positions,t.normals,t.colors]){let t=a.value;t&&e.destroyAttribute(t)}},a=t=>{if(null!==t){for(let e of Object.values(t.kernels))e?.dispose?.();if(e)for(let a of t.storageAttributes)e.destroyAttribute(a)}};t(this._marchBuffers),t(this._vertexBuffers);let r=this._drawIndex?.value;e&&r&&e.destroyAttribute(r),this._drawIndex=null,this._computeNode?.dispose?.(),this._marchBuffers=null,this._vertexBuffers=null,this._computeNode=null,this._computeNodeKey="",this._marchCapacity=0,a(this._ultra),this._ultra?.sdfTexture.dispose(),this._ultra?.colorTexture.dispose(),this._ultra?.coarseTexture.dispose(),this._ultra=null,a(this._ultraDrag),this._ultraDrag?.sdfTexture.dispose(),this._ultraDrag?.colorTexture.dispose(),this._ultraDrag?.coarseTexture.dispose(),this._ultraDrag=null,this._meshBaker?.atlas.dispose(),this._meshBaker=null,this._lastDispatched=null,this._disposeRetired(),this._lastRenderer=null}},fm=new WeakMap,_m=new WeakMap,ym=[];i(function(e){if(e.cached)return function(e){let t=()=>e.drawIndex?e.drawIndex.element(Te):Te;return{position:re(a=>{let r=e.positions.element(t()).xyz.toVar();return Mh(a,r),r})(),normal:Me(e.normals.element(t()).xyz),color:Me(e.colors.element(t()))}}(e.cached);let t=Vh(e),a=Y("vec3","vShapeBlendNormal"),r=Y("vec4","vShapeBlendColor");return{position:re(e=>{let{position:s,normal:i,color:n}=t(Te.toFloat());return a.assign(i),r.assign(n),Mh(e,s),s})(),normal:a,color:r}}),l(e=>function(e){let t=fm.get(e);if(t?.wantsReplacement){let a=_m.get(e);_m.set(e,t),t.retired=!0;let r=new gm(t.capacityHint,t.poolHint,t.vertHint);t.transferSettleQueue(r),a&&r.runWhenSettled(()=>a.dispose()),t=r,fm.set(e,t)}return t||(t=new gm,fm.set(e,t)),t}(e)),u({release:e=>function(e){let t=fm.get(e),a=_m.get(e);fm.delete(e),_m.delete(e),a&&ym.push(a),t&&(t.retired=!0,ym.push(t))}(e),drainRetired:function(){let e=ym.length;if(e>0){for(let e of ym)e.dispose();ym.length=0}return e}});var xm=[64,1,1],vm=pr,bm=vm-1,Tm=(e,t)=>void 0!==t?k(e,t):k(e),wm=(e,t)=>{let a=e.xyz,r=ca(a,t),s=ca(a,r);return t.add(r.mul(e.w).mul(2)).add(s.mul(2))},Sm=re(([e,t])=>{let a=e,r=t,s=Ua(a,r).add(1).toVar(),i=ne(0).toVar();return le(s.lessThan(1e-7),()=>{s.assign(0),le(Ae(a.x).greaterThan(Ae(a.z)),()=>{i.assign(ne(a.y.negate(),a.x,0))}).Else(()=>{i.assign(ne(0,a.z.negate(),a.y))})}).Else(()=>{i.assign(ca(a,r))}),(e=>{let t=Ua(e,e);return t.lessThan(1e-10).select(de(0,0,0,1),e.mul(Pe(Pt(t,1e-20))))})(de(i,s))}),Vm=e=>(e=>e.sub(C(e.mul(1/289)).mul(289)))(e.mul(34).add(10).mul(e)),Mm=re(([e])=>{let t=e,a=1/6,r=1/3,s=C(t.add(Ua(t,ne(r)))).toVar(),i=t.sub(s).add(Ua(s,ne(a))).toVar(),n=ga(i.yzx,i.xyz).toVar(),l=ne(1).sub(n).toVar(),o=Ut(n,l.zxy).toVar(),u=Pt(n,l.zxy).toVar(),d=i.sub(o).add(a).toVar(),h=i.sub(u).add(r).toVar(),m=i.sub(.5).toVar();s.assign((e=>e.sub(C(e.mul(1/289)).mul(289)))(s));let c=Vm(Vm(Vm(de(0,o.z,u.z,1).add(s.z)).add(s.y).add(de(0,o.y,u.y,1))).add(s.x).add(de(0,o.x,u.x,1))).toVar(),p=.142857142857,g=2*p,f=.5*p-1,_=p,y=c.sub(C(c.mul(_*_)).mul(49)).toVar(),x=C(y.mul(_)).toVar(),v=C(y.sub(x.mul(7))).toVar(),b=x.mul(g).add(f).toVar(),T=v.mul(g).add(f).toVar(),w=de(1).sub(Ae(b)).sub(Ae(T)).toVar(),S=de(b.xy,T.xy).toVar(),V=de(b.zw,T.zw).toVar(),M=C(S).mul(2).add(1).toVar(),R=C(V).mul(2).add(1).toVar(),z=ga(w,de(0)).negate().toVar(),k=S.xzyw.add(M.xzyw.mul(z.xxyy)).toVar(),A=V.xzyw.add(R.xzyw.mul(z.zzww)).toVar(),P=ne(k.xy,w.x).toVar(),E=ne(k.zw,w.y).toVar(),N=ne(A.xy,w.z).toVar(),B=ne(A.zw,w.w).toVar(),L=(e=>de(1.79284291400159).sub(e.mul(.85373472095314)))(de(Ua(P,P),Ua(E,E),Ua(N,N),Ua(B,B))).toVar();P.assign(P.mul(L.x)),E.assign(E.mul(L.y)),N.assign(N.mul(L.z)),B.assign(B.mul(L.w));let I=Pt(de(.5).sub(de(Ua(i,i),Ua(d,d),Ua(h,h),Ua(m,m))),de(0)).toVar();return I.assign(I.mul(I)),Ua(I.mul(I),de(Ua(P,i),Ua(E,d),Ua(N,h),Ua(B,m))).mul(105)}),Rm=class extends Gt{constructor(e,t,a,r,s){super(),this.tangentWorld=e,this.specularPower=t,this.specularIntensity=a,this.diffuseIntensity=r,this.ambientFloor=s}direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=Ja(At.mul(de(this.tangentWorld,0)).xyz),i=t,n=be,l=Ja(i.add(n)),o=Pt(tt(ca(s,i)),0),u=Pt(tt(ca(s,l)),0);r.directDiffuse.addAssign(a.mul(o).mul(this.diffuseIntensity).mul(Ea.rgb)),r.directSpecular.addAssign(a.mul(ze(u,this.specularPower)).mul(this.specularIntensity).mul(ne(1,.95,.9)))}indirect(e){let{irradiance:t,ambientOcclusion:a,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(1/Math.PI).add(this.ambientFloor).mul(Ea.rgb)),r.indirectDiffuse.mulAssign(a)}},Cm=class extends Gt{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=t,i=Ha,n=be,l=Ja(s.add(n)),o=Ua(i,s).clamp(),u=Ua(i,l).clamp();r.directDiffuse.addAssign(a.mul(o).mul(.85).mul(Ea.rgb)),r.directSpecular.addAssign(a.mul(ze(u,60)).mul(.3).mul(ne(.3,.28,.25)))}indirect(e){let{irradiance:t,ambientOcclusion:a,reflectedLight:r}=e.context;r.indirectDiffuse.addAssign(t.mul(1/Math.PI).add(.15).mul(Ea.rgb)),r.indirectDiffuse.mulAssign(a)}},zm=class extends Tt{constructor(e){super(),this.model=e,this.lights=!0}setupLightingModel(){return this.model}},km=new ds,Am=new ds,Pm=new hs,Em=class{constructor(){this.uNumStrands=Tm(0,"int"),this.uNumVerts=Tm(0,"int"),this.uDamping=Tm(.03),this.uLocalStiffness=Tm(.67),this.uGlobalStiffness=Tm(.5),this.uGlobalRange=Tm(.15),this.uStiffnessFalloff=Tm(.1),this.uGravity=Tm(0),this.uVspCoeff=Tm(.01),this.uVspThreshold=Tm(50),this.uKink=Tm(0),this.uKinkFreq=Tm(0),this.uUnitScale=Tm(100),this.uClumpStrength=Tm(0),this.uClumpSize=Tm(32,"int"),this.uClumpTipScale=Tm(1.5),this.uReset=Tm(1),this.uHasWind=Tm(0),this.uWind0=Tm(new hs),this.uWind1=Tm(new hs),this.uWind2=Tm(new hs),this.uWind3=Tm(new hs),this.uBoneQuat=Tm(new ys(0,0,0,1)),this.uBoneTrans=Tm(new hs),this.uDeltaQuat=Tm(new ys(0,0,0,1)),this.uPrevBoneTrans=Tm(new hs),this.uHairRoot=Tm(new Vs),this.uHairMid=Tm(new Vs),this.uHairTip=Tm(new Vs),this.uHeadColor=Tm(new Vs),this.uNoiseA=Tm(new Vs),this.uNoiseB=Tm(new Vs),this.uNoiseC=Tm(new Vs),this.uNoiseD=Tm(new Vs),this.uNoiseScale=Tm(.018),this.uNoiseMixHair=Tm(0),this.uNoiseMixHead=Tm(0),this.uWidth=Tm(.525),this.uSpecPow=Tm(40),this.uSpecInt=Tm(.4),this.uDiffInt=Tm(.6),this.uAmbInt=Tm(.25),this.uOpacity=Tm(1),this.uTipFade=Tm(.4),this.uColorSource=Tm(0),this.uShadeRoot=Tm(.6),this.uShadeTip=Tm(1.15),this.uShadowTexelWorld=Tm(0),this._armed=!1,this._uploadedGeneration=-1,this._prevBoneQuat=new ds,this._prevBonePos=new hs,this._hasPrevBone=!1,this._renderer=null,this.initialPos=fe(fr,"vec4"),this.rootColors=fe(gr,"vec4"),this.positions=fe(fr,"vec4"),this.positionsPrev=fe(fr,"vec4"),this.positionsPrevPrev=fe(fr,"vec4"),this.tangents=fe(fr,"vec4"),this.restLengths=fe(fr,"float"),this.vspQuats=fe(gr,"vec4"),this.vspTrans=fe(gr,"vec4"),this.kIntegrate=this._buildIntegrate(),this.kStrandLevel=this._buildStrandLevel(),this.kVsp=this._buildVsp(),this.kLocalShape=this._buildLocalShape(),this.kLengthWind=this._buildLengthWind(),this.kClump=this._buildClump(),this.kRigidFollow=this._buildRigidFollow(),this.ribbonMaterial=this._buildRibbonMaterial(),this.scalpMaterial=this._buildScalpMaterial()}boneQuatNode(){return this.uBoneQuat}boneTransNode(){return this.uBoneTrans}_buildIntegrate(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Re()});let t=e.div(vm).toVar(),a=e.sub(t.mul(vm)).toVar(),r=this.boneQuatNode(),s=this.boneTransNode(),i=this.initialPos.element(e).toVar(),n=de(wm(r,i.xyz).add(s),i.w).toVar(),l=this.positions.element(e).toVar(),o=this.positionsPrev.element(e).toVar(),u=o.toVar();le(this.uReset.greaterThan(.5),()=>{l.assign(n),u.assign(n)});let d=n.toVar();le(l.w.greaterThan(0),()=>{let e=nr(yr),t=$a(this.uDamping.negate().mul(e).mul(60)),a=l.xyz.add(l.xyz.sub(u.xyz).mul(t)).add(ne(0,-1,0).mul(this.uGravity).mul(e).mul(e));d.assign(de(a,l.w))}),le(this.uGlobalStiffness.greaterThan(0).and(this.uGlobalRange.greaterThan(0)).and(d.w.greaterThan(0)).and(a.toFloat().lessThan(this.uGlobalRange.mul(vm))),()=>{let t=e.sub(a),s=this.initialPos.element(t),i=Ja(wm(r,s.xyz)).y.mul(.5).add(.5),l=this.uGlobalStiffness.mul(ze(Pt(i,0),this.uStiffnessFalloff)),o=n.xyz.sub(d.xyz).mul(l);d.assign(de(d.xyz.add(o),d.w))}),le(this.uKink.greaterThan(0).and(d.w.greaterThan(0)),()=>{let e=a.toFloat().div(vm),r=t.sub(t.div(256).mul(256)).toFloat().mul(.0245),i=e.mul(this.uKinkFreq).mul(6.2831853).add(r),l=this.uKink.mul(e).mul(.15).mul(this.uUnitScale),o=Ja(n.xyz.sub(s)).toVar(),u=ne(0).toVar();le(Ae(o.y).lessThan(.99),()=>{u.assign(Ja(ca(o,ne(0,1,0))))}).Else(()=>{u.assign(Ja(ca(o,ne(1,0,0))))});let h=Ja(ca(o,u)),m=u.mul(Xt(i)).mul(l).add(h.mul(ua(i.mul(1.3).add(r))).mul(l).mul(.7));d.assign(de(d.xyz.add(m),d.w))}),this.positionsPrevPrev.element(e).assign(o),this.positionsPrev.element(e).assign(l),this.positions.element(e).assign(d)})().compute(xm[0],xm)}_buildStrandLevel(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Re()});let t=e.mul(vm).toVar(),a=this.positionsPrevPrev.element(t.add(1)),r=this.positionsPrev.element(t),s=this.positionsPrev.element(t.add(1)),i=this.positions.element(t),n=this.positions.element(t.add(1)),l=s.xyz.sub(r.xyz),o=n.xyz.sub(i.xyz),u=l.div(Pt(tt(l),1e-7)),d=o.div(Pt(tt(o),1e-7)),h=Sm(u,d).toVar(),m=i.xyz.sub(wm(h,r.xyz)),c=this.uVspCoeff.toVar(),p=tt(n.xyz.sub(s.xyz.mul(2)).add(a.xyz));le(p.greaterThan(this.uVspThreshold),()=>{c.assign(1)}),this.vspQuats.element(e).assign(h),this.vspTrans.element(e).assign(de(m,c))})().compute(xm[0],xm)}_buildVsp(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Re()});let t=e.div(vm).toVar(),a=e.sub(t.mul(vm)).toVar();le(a.lessThan(2),()=>{Re()});let r=this.vspQuats.element(t),s=this.vspTrans.element(t),i=s.w,n=this.positions.element(e).toVar(),l=this.positionsPrev.element(e).toVar(),o=e=>de(e.xyz.mul(nr(1).sub(i)).add(wm(r,e.xyz).add(s.xyz).mul(i)),e.w);this.positions.element(e).assign(o(n)),this.positionsPrev.element(e).assign(o(l))})().compute(xm[0],xm)}_buildLocalShape(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Re()});let t=e.mul(vm).toVar(),a=Ut(this.uLocalStiffness,.95).mul(.5),r=this.boneQuatNode();he(bm-1,({i:e})=>{let s=t.add(e).add(1).toVar(),i=this.positions.element(s).toVar(),n=this.positions.element(s.add(1)).toVar(),l=this.positions.element(s.sub(1)),o=wm(r,this.initialPos.element(s).xyz),u=wm(r,this.initialPos.element(s.add(1)).xyz),d=wm(r,this.initialPos.element(s.sub(1)).xyz),h=i.xyz.sub(l.xyz),m=u.sub(o),c=o.sub(d),p=Sm(c.div(Pt(tt(c),1e-7)),h.div(Pt(tt(h),1e-7))),g=wm(p,m).add(i.xyz).sub(n.xyz).mul(a);le(i.w.greaterThan(0),()=>{i.assign(de(i.xyz.sub(g),i.w))}),le(n.w.greaterThan(0),()=>{n.assign(de(n.xyz.add(g),n.w))}),this.positions.element(s).assign(i),this.positions.element(s.add(1)).assign(n)})})().compute(xm[0],xm)}_buildLengthWind(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Re()});let t=e.mul(vm).toVar();le(this.uHasWind.greaterThan(.5),()=>{let a=e.sub(e.div(20).mul(20)).toFloat().div(20),r=this.uWind0.mul(a).add(this.uWind1.mul(nr(1).sub(a))).add(this.uWind2.mul(a)).add(this.uWind3.mul(nr(1).sub(a))).toVar();he(bm-2,({i:e})=>{let a=t.add(e).add(2).toVar(),s=this.positions.element(a).toVar(),i=this.positions.element(a.add(1)),n=s.xyz.sub(i.xyz),l=ca(ca(n,r),n).negate();s.assign(de(s.xyz.add(l.mul(yr).mul(.1)),s.w)),this.positions.element(a).assign(s)})}),he(5,()=>{he(bm,({i:e})=>{let a=t.add(e).toVar(),r=this.positions.element(a).toVar(),s=this.positions.element(a.add(1)).toVar(),i=this.restLengths.element(a),n=s.xyz.sub(r.xyz),l=Pt(tt(n),1e-7),o=nr(1).sub(i.div(l)),u=n.mul(o),d=r.w.greaterThan(0),h=s.w.greaterThan(0),m=d.select(h.select(nr(.5),nr(1)),nr(0)),c=h.select(d.select(nr(.5),nr(1)),nr(0));r.assign(de(r.xyz.add(u.mul(m)),r.w)),s.assign(de(s.xyz.sub(u.mul(c)),s.w)),this.positions.element(a).assign(r),this.positions.element(a.add(1)).assign(s)})}),he(bm,({i:e})=>{let a=t.add(e).add(1).toVar(),r=this.positions.element(a.sub(1)),s=this.positions.element(a).toVar(),i=s.xyz.sub(r.xyz),n=Pt(tt(i),1e-7),l=this.restLengths.element(a.sub(1));le(n.greaterThan(l),()=>{s.assign(de(r.xyz.add(i.div(n).mul(l)),s.w)),this.positions.element(a).assign(s)})}),he(vm,({i:e})=>{let a=t.add(e).toVar(),r=e.equal(vm-1).select(a.sub(1),a).toVar(),s=Ja(this.positions.element(r.add(1)).xyz.sub(this.positions.element(r).xyz));this.tangents.element(a).assign(de(s,0))})})().compute(xm[0],xm)}_buildClump(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Re()});let t=this.uClumpSize.toVar(),a=e.div(t).mul(t).toVar();le(e.equal(a),()=>{Re()}),le(a.greaterThanEqual(this.uNumStrands),()=>{Re()});let r=e.mul(vm).toVar(),s=a.mul(vm).toVar();he(bm,({i:e})=>{let t=e.add(1).toVar(),a=t.toFloat().div(bm),i=this.uClumpStrength.mul(ze(a,nr(1).div(Pt(this.uClumpTipScale,.5)))),n=r.add(t).toVar(),l=this.positions.element(n).toVar(),o=this.positions.element(s.add(t));l.assign(de(Wt(l.xyz,o.xyz,i),l.w)),this.positions.element(n).assign(l)})})().compute(xm[0],xm)}_buildRigidFollow(){return re(()=>{let e=Ce(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Re()});let t=this.uDeltaQuat,a=this.uPrevBoneTrans,r=this.boneTransNode(),s=s=>{let i=s.element(e).toVar();i.assign(de(wm(t,i.xyz.sub(a)).add(r),i.w)),s.element(e).assign(i)};s(this.positions),s(this.positionsPrev),s(this.positionsPrevPrev);let i=this.tangents.element(e).toVar();i.assign(de(wm(t,i.xyz),0)),this.tangents.element(e).assign(i)})().compute(xm[0],xm)}pastelNoise(e){let t=e.sub(this.boneTransNode()).mul(this.uNoiseScale),a=Mm(t).mul(.5).add(.5),r=Mm(t.add(ne(31.7,17.3,53.1))).mul(.5).add(.5),s=Mm(t.mul(.7).add(ne(71.9,11.2,43.8))).mul(.5).add(.5),i=Wt(this.uNoiseA,this.uNoiseB,a);return i=Wt(i,this.uNoiseC,r.mul(.6)),i=Wt(i,this.uNoiseD,s.mul(.25)),i}_buildRibbonMaterial(){let e=Y("vec3","vHairTangent"),t=Y("vec3","vHairNormal"),a=Y("vec2","vHairUv"),r=Y("float","vHairRand"),s=Y("vec3","vHairInherit"),i=new zm(new Rm(e,this.uSpecPow,this.uSpecInt,this.uDiffInt,this.uAmbInt));i.name="SplineHairRibbons",i.userData.hairShadowVariant="texel-floor-v6",i.transparent=!1,i.depthTest=!0,i.depthWrite=!0,i.side=Ds;let n=i=>re(()=>{let n=Ce(me).toVar(),l=n.div(bm).toVar(),o=n.sub(l.mul(bm)).toVar(),u=l.mul(vm).add(o).toVar(),d=Ce(Te).toVar(),h=d.bitAnd(1).toFloat().toVar(),m=d.shiftRight(1).bitAnd(1).toFloat().toVar(),c=this.positions.element(u).xyz.toVar(),p=this.positions.element(u.add(1)).xyz.toVar(),g=this.tangents.element(u).xyz,f=this.tangents.element(u.add(1)).xyz,_=Wt(c,p,m).toVar(),y=Wt(g,f,m).toVar(),x=Ja(xt.sub(_)),v=ca(y,x).toVar(),b=tt(v).toVar();v.assign(b.greaterThan(1e-7).select(v.div(b),ne(1,0,0)));let T=o.toFloat().div(bm),w=o.add(1).toFloat().div(bm),S=Wt(T,w,m).toVar(),V=this.uWidth.mul(nr(1).sub(S.mul(this.uTipFade))).toVar(),M=i?(()=>{let e=this.uShadowTexelWorld,t=e.greaterThan(0).select(e.mul(1.5).clamp(nr(2),nr(8)),nr(0));return Pt(t.sub(V),0).toVar()})():null;M&&V.addAssign(M);let R=h.mul(2).sub(1),C=_.add(v.mul(V).mul(R)).toVar();M&&C.assign(C.sub(x.mul(M)));let z=this.positionsPrev.element(u).xyz,k=this.positionsPrev.element(u.add(1)).xyz;ce.assign(Wt(z,k,m).add(v.mul(V).mul(R)));let A=L(Xt(l.toFloat().mul(12.9898)).mul(43758.5453));return r.assign(A),s.assign(this.rootColors.element(l).xyz),e.assign(y),t.assign(Ja(x.sub(y.mul(Ua(y,x))))),a.assign(ae(h,S)),C}),l=re(()=>{let e=a.y,t=Wt(this.uHairRoot,this.uHairMid,Ut(e.mul(2),1)),i=e.lessThan(.5).select(t,Wt(this.uHairMid,this.uHairTip,e.sub(.5).mul(2))).toVar(),n=s.mul(Wt(this.uShadeRoot,this.uShadeTip,e));i.assign(this.uColorSource.greaterThan(.5).select(n,i)),i.assign(Wt(i,this.pastelNoise(Ve),this.uNoiseMixHair));let l=nr(1).sub(Ae(a.x.sub(.5)).mul(2));return nr(1).sub(e.mul(this.uTipFade)).mul(ze(Pt(l,0),.5)).toVar().lessThan(.25).discard(),r.greaterThanEqual(this.uOpacity).discard(),de(i,1)});return i.positionNode=n(!1)(),i.castShadowPositionNode=n(!0)(),i.normalNode=t,i.colorNode=l(),i.needsUpdate=!0,i}_buildScalpMaterial(){let e=new zm(new Cm);e.name="SplineHairScalp";let t=re(()=>{let e=Wt(this.uHeadColor,this.pastelNoise(Ve),this.uNoiseMixHead);return de(e,1)});return e.colorNode=t(),e.needsUpdate=!0,e}update(e,t){let a=t;if(!0!==a.backend?.isWebGPUBackend||(this._renderer=a,!1===e.visible))return;if(!this._armed){this._armed=!0;let t=e.ribbonMesh.material;e.ribbonMesh.material=this.ribbonMaterial,t.dispose?.();let a=e.scalpMesh.material;e.scalpMesh.material=this.scalpMaterial,a.dispose?.(),e.ribbonMesh.visible=!0}e.checkDataDrift();let r=e.activeGuideStrands,s=r*vm;e.generation!==this._uploadedGeneration&&(this._uploadedGeneration=e.generation,this.initialPos.value.array.set(e.roots.initialPositions),this.initialPos.value.needsUpdate=!0,this.restLengths.value.array.set(e.roots.restLengths),this.restLengths.value.needsUpdate=!0,this.rootColors.value.array.set(e.roots.rootColors),this.rootColors.value.needsUpdate=!0,e.ribbonMesh.geometry.instanceCount=r*bm,e.resetRequested=!0),this._syncUniforms(e),e.boneTransform(km,Pm),this.uBoneQuat.value.set(km.x,km.y,km.z,km.w),this.uBoneTrans.value.copy(Pm);let i=this._hasPrevBone&&(Math.abs(this._prevBoneQuat.dot(km))<.9999995||this._prevBonePos.distanceToSquared(Pm)>1e-8),n=Math.floor(e.pendingSimSeconds/yr);n>xr&&(n=xr),e.pendingSimSeconds=Math.max(0,Math.min(e.pendingSimSeconds-n*yr,yr)),e.resetRequested&&n<1&&(n=1),n<1&&i&&(Am.copy(this._prevBoneQuat).invert().premultiply(km),this.uDeltaQuat.value.set(Am.x,Am.y,Am.z,Am.w),this.uPrevBoneTrans.value.copy(this._prevBonePos),this._dispatch(a,this.kRigidFollow,s));for(let t=0;t<n;t++){this.uReset.value=e.resetRequested&&0===t?1:0,e.simTime+=yr,this._updateWind(e),this._dispatch(a,this.kIntegrate,s),this._dispatch(a,this.kStrandLevel,r),this._dispatch(a,this.kVsp,s);for(let e=0;e<2;e++)this._dispatch(a,this.kLocalShape,r);this._dispatch(a,this.kLengthWind,r),e.data.clumpStrength>.001&&this._dispatch(a,this.kClump,r)}n>0&&(e.resetRequested=!1),this._prevBoneQuat.copy(km),this._prevBonePos.copy(Pm),this._hasPrevBone=!0}_dispatch(e,t,a){t.count=a,e.compute(t)}_updateWind(e){let t=e.data,a=Math.max(e.roots.unitScale,.001),r=t.windStrength/a;this.uHasWind.value=t.windStrength>.001?1:0;let s=.7*e.simTime,i=Math.sin(s)*r,n=Math.cos(s)*r*.5;this.uWind0.value.set(i,0,n),this.uWind1.value.set(.7*i,.5*r,1.2*n),this.uWind2.value.set(.3*-i,0,.5*n),this.uWind3.value.set(.5*i,-.3*r,.8*-n)}_shadowTexelWorld(e){let t=e;for(;t.parent;)t=t.parent;let a=t;if(!a?.traverse)return 0;let r=0;return a.traverse(e=>{let t=e;if(!0!==t.isDirectionalLight||!0!==t.castShadow||!1===t.visible)return;let a=t.shadow?.camera,s=t.shadow?.mapSize?.x??0;"number"!=typeof a?.right||"number"!=typeof a?.left||s<=0||(r=Math.max(r,(a.right-a.left)/s))}),r}_syncUniforms(e){let t=e.data,a=e.roots.unitScale;this.uNumStrands.value=e.activeGuideStrands,this.uNumVerts.value=e.activeGuideStrands*vm,this.uDamping.value=t.damping,this.uLocalStiffness.value=t.localStiffness,this.uGlobalStiffness.value=t.globalStiffness,this.uGlobalRange.value=t.globalRange,this.uStiffnessFalloff.value=t.stiffnessFalloff,this.uGravity.value=t.gravity*a,this.uVspCoeff.value=t.vspCoefficient,this.uVspThreshold.value=.5*a,this.uKink.value=t.kink,this.uKinkFreq.value=t.kinkFrequency,this.uUnitScale.value=a,this.uClumpStrength.value=t.clumpStrength,this.uClumpSize.value=Math.max(1,Math.round(t.clumpSize)),this.uClumpTipScale.value=t.clumpTipScale;let r=(e,t)=>{e.value.setRGB(t.r,t.g,t.b,ps)};r(this.uHairRoot,t.hairRootColor),r(this.uHairMid,t.hairMidColor),r(this.uHairTip,t.hairTipColor),r(this.uHeadColor,t.headColor),r(this.uNoiseA,t.noiseColorA),r(this.uNoiseB,t.noiseColorB),r(this.uNoiseC,t.noiseColorC),r(this.uNoiseD,t.noiseColorD);let s=t.noiseEnabled?1:0;this.uNoiseScale.value=t.noiseScale/Math.max(a,.001),this.uNoiseMixHair.value=t.noiseMixHair*s,this.uNoiseMixHead.value=t.noiseMixHead*s,this.uWidth.value=.003*t.hairWidth*_r*e.widthWorldScale,this.uShadowTexelWorld.value=this._shadowTexelWorld(e),this.uColorSource.value="object"===t.hairColorSource&&"object"===t.headShape&&t.baseObjectId?1:0,this.uShadeRoot.value=t.hairShadeRoot??.6,this.uShadeTip.value=t.hairShadeTip??1.15,this.uSpecPow.value=t.specularPower,this.uSpecInt.value=t.specularIntensity,this.uDiffInt.value=t.diffuseIntensity,this.uAmbInt.value=t.ambientIntensity,this.uOpacity.value=t.opacity,this.uTipFade.value=t.tipFade}dispose(){for(let e of[this.kIntegrate,this.kStrandLevel,this.kVsp,this.kLocalShape,this.kLengthWind,this.kClump,this.kRigidFollow])e.dispose();this.ribbonMaterial.dispose(),this.scalpMaterial.dispose();let e=this._renderer?.backend?.attributeUtils;if(e)for(let t of[this.initialPos,this.rootColors,this.positions,this.positionsPrev,this.positionsPrevPrev,this.tangents,this.restLengths,this.vspQuats,this.vspTrans])e.destroyAttribute(t.value);this._renderer=null}},Nm=new WeakMap,Bm=[];dr(e=>function(e){let t=Nm.get(e);return void 0===t&&(t=new Em,Nm.set(e,t)),t}(e)),mr({release:e=>function(e){let t=Nm.get(e);void 0!==t&&(Nm.delete(e),Bm.push(t))}(e),drainRetired:function(){let e=Bm.length;if(e>0){for(let e of Bm)e.dispose();Bm.length=0}return e}});var Lm="\nconst PI: f32 = 3.14159265358979323846;\n\nconst TRANSMITTANCE_TEXTURE_WIDTH: i32 = 256;\nconst TRANSMITTANCE_TEXTURE_HEIGHT: i32 = 64;\nconst SCATTERING_TEXTURE_R_SIZE: i32 = 32;\nconst SCATTERING_TEXTURE_MU_SIZE: i32 = 128;\nconst SCATTERING_TEXTURE_MU_S_SIZE: i32 = 32;\nconst SCATTERING_TEXTURE_NU_SIZE: i32 = 8;\nconst SCATTERING_TEXTURE_WIDTH: i32 = 256;\nconst SCATTERING_TEXTURE_HEIGHT: i32 = 128;\nconst SCATTERING_TEXTURE_DEPTH: i32 = 32;\nconst IRRADIANCE_TEXTURE_WIDTH: i32 = 64;\nconst IRRADIANCE_TEXTURE_HEIGHT: i32 = 16;\n\nstruct DensityProfileLayer {\n\twidth: f32,\n\texp_term: f32,\n\texp_scale: f32,\n\tlinear_term: f32,\n\tconstant_term: f32,\n\tpad0: f32,\n\tpad1: f32,\n\tpad2: f32,\n}\n\nstruct DensityProfile {\n\tlayers: array<DensityProfileLayer, 2>,\n}\n\n\n\n\nstruct Atm {\n\tsolar_irradiance: vec3f,\n\tsun_angular_radius: f32,\n\trayleigh_scattering: vec3f,\n\tbottom_radius: f32,\n\tmie_scattering: vec3f,\n\ttop_radius: f32,\n\tmie_extinction: vec3f,\n\tmie_phase_function_g: f32,\n\tabsorption_extinction: vec3f,\n\tmu_s_min: f32,\n\tground_albedo: vec3f,\n\tpad0: f32,\n\tsky_spectral_radiance_to_luminance: vec3f,\n\tpad1: f32,\n\tsun_spectral_radiance_to_luminance: vec3f,\n\tpad2: f32,\n\trayleigh_density: DensityProfile,\n\tmie_density: DensityProfile,\n\tabsorption_density: DensityProfile,\n}\n\nfn ClampCosine(mu: f32) -> f32 {\n\treturn clamp(mu, -1.0, 1.0);\n}\n\nfn ClampDistance(d: f32) -> f32 {\n\treturn max(d, 0.0);\n}\n\nfn ClampRadius(atm: Atm, r: f32) -> f32 {\n\treturn clamp(r, atm.bottom_radius, atm.top_radius);\n}\n\nfn SafeSqrt(a: f32) -> f32 {\n\treturn sqrt(max(a, 0.0));\n}\n\n\n\nfn smoothstepGl(edge0: f32, edge1: f32, x: f32) -> f32 {\n\tlet t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n\treturn t * t * (3.0 - 2.0 * t);\n}\n\n\n\n\nfn tex2DBilinear(t: texture_2d<f32>, uv: vec2f, size: vec2i) -> vec4f {\n\tlet coord = uv * vec2f(size) - 0.5;\n\tlet i0 = vec2i(floor(coord));\n\tlet f = coord - floor(coord);\n\tlet maxc = size - 1;\n\tlet c00 = textureLoad(t, clamp(i0, vec2i(0), maxc), 0);\n\tlet c10 = textureLoad(t, clamp(i0 + vec2i(1, 0), vec2i(0), maxc), 0);\n\tlet c01 = textureLoad(t, clamp(i0 + vec2i(0, 1), vec2i(0), maxc), 0);\n\tlet c11 = textureLoad(t, clamp(i0 + vec2i(1, 1), vec2i(0), maxc), 0);\n\treturn mix(mix(c00, c10, f.x), mix(c01, c11, f.x), f.y);\n}\n\nfn tex3DTrilinear(t: texture_3d<f32>, uvw: vec3f, size: vec3i) -> vec4f {\n\tlet coord = uvw * vec3f(size) - 0.5;\n\tlet i0 = vec3i(floor(coord));\n\tlet f = coord - floor(coord);\n\tlet maxc = size - 1;\n\tlet c000 = textureLoad(t, clamp(i0, vec3i(0), maxc), 0);\n\tlet c100 = textureLoad(t, clamp(i0 + vec3i(1, 0, 0), vec3i(0), maxc), 0);\n\tlet c010 = textureLoad(t, clamp(i0 + vec3i(0, 1, 0), vec3i(0), maxc), 0);\n\tlet c110 = textureLoad(t, clamp(i0 + vec3i(1, 1, 0), vec3i(0), maxc), 0);\n\tlet c001 = textureLoad(t, clamp(i0 + vec3i(0, 0, 1), vec3i(0), maxc), 0);\n\tlet c101 = textureLoad(t, clamp(i0 + vec3i(1, 0, 1), vec3i(0), maxc), 0);\n\tlet c011 = textureLoad(t, clamp(i0 + vec3i(0, 1, 1), vec3i(0), maxc), 0);\n\tlet c111 = textureLoad(t, clamp(i0 + vec3i(1, 1, 1), vec3i(0), maxc), 0);\n\tlet z0 = mix(mix(c000, c100, f.x), mix(c010, c110, f.x), f.y);\n\tlet z1 = mix(mix(c001, c101, f.x), mix(c011, c111, f.x), f.y);\n\treturn mix(z0, z1, f.z);\n}\n\nfn GetLayerDensity(layer: DensityProfileLayer, altitude: f32) -> f32 {\n\tlet density = layer.exp_term * exp(layer.exp_scale * altitude) +\n\t\tlayer.linear_term * altitude + layer.constant_term;\n\treturn clamp(density, 0.0, 1.0);\n}\n\nfn GetProfileDensity(profile: DensityProfile, altitude: f32) -> f32 {\n\tif (altitude < profile.layers[0].width) {\n\t\treturn GetLayerDensity(profile.layers[0], altitude);\n\t}\n\treturn GetLayerDensity(profile.layers[1], altitude);\n}\n\nfn DistanceToTopAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {\n\tlet discriminant = r * r * (mu * mu - 1.0) + atm.top_radius * atm.top_radius;\n\treturn ClampDistance(-r * mu + SafeSqrt(discriminant));\n}\n\nfn DistanceToBottomAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {\n\tlet discriminant = r * r * (mu * mu - 1.0) +\n\t\tatm.bottom_radius * atm.bottom_radius;\n\treturn ClampDistance(-r * mu - SafeSqrt(discriminant));\n}\n\nfn RayIntersectsGround(atm: Atm, r: f32, mu: f32) -> bool {\n\treturn mu < 0.0 &&\n\t\tr * r * (mu * mu - 1.0) + atm.bottom_radius * atm.bottom_radius >= 0.0;\n}\n\nfn GetTextureCoordFromUnitRange(x: f32, texture_size: i32) -> f32 {\n\treturn 0.5 / f32(texture_size) + x * (1.0 - 1.0 / f32(texture_size));\n}\n\nfn GetUnitRangeFromTextureCoord(u: f32, texture_size: i32) -> f32 {\n\treturn (u - 0.5 / f32(texture_size)) / (1.0 - 1.0 / f32(texture_size));\n}\n\nfn GetTransmittanceTextureUvFromRMu(atm: Atm, r: f32, mu: f32) -> vec2f {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius);\n\tlet d = DistanceToTopAtmosphereBoundary(atm, r, mu);\n\tlet d_min = atm.top_radius - r;\n\tlet d_max = rho + H;\n\tlet x_mu = (d - d_min) / (d_max - d_min);\n\tlet x_r = rho / H;\n\treturn vec2f(\n\t\tGetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH),\n\t\tGetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT));\n}\n\nfn GetRMuFromTransmittanceTextureUv(\n\tatm: Atm, uv: vec2f, r: ptr<function, f32>, mu: ptr<function, f32>) {\n\tlet x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH);\n\tlet x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT);\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = H * x_r;\n\t*r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius);\n\tlet d_min = atm.top_radius - *r;\n\tlet d_max = rho + H;\n\tlet d = d_min + x_mu * (d_max - d_min);\n\tif (d == 0.0) {\n\t\t*mu = 1.0;\n\t} else {\n\t\t*mu = (H * H - rho * rho - d * d) / (2.0 * (*r) * d);\n\t}\n\t*mu = ClampCosine(*mu);\n}\n\nfn GetTransmittanceToTopAtmosphereBoundary(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu: f32) -> vec3f {\n\tlet uv = GetTransmittanceTextureUvFromRMu(atm, r, mu);\n\treturn tex2DBilinear(transmittance_texture, uv,\n\t\tvec2i(TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT)).rgb;\n}\n\nfn GetTransmittance(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, d: f32, ray_r_mu_intersects_ground: bool) -> vec3f {\n\tlet r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\tlet mu_d = ClampCosine((r * mu + d) / r_d);\n\n\tif (ray_r_mu_intersects_ground) {\n\t\treturn min(\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, -mu_d) /\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, -mu),\n\t\t\tvec3f(1.0, 1.0, 1.0));\n\t} else {\n\t\treturn min(\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu) /\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, mu_d),\n\t\t\tvec3f(1.0, 1.0, 1.0));\n\t}\n}\n\nfn GetTransmittanceToSun(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet sin_theta_h = atm.bottom_radius / r;\n\tlet cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0));\n\n\tlet step = smoothstepGl(-sin_theta_h * atm.sun_angular_radius,\n\t\tsin_theta_h * atm.sun_angular_radius,\n\t\tmu_s - cos_theta_h);\n\n\treturn GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) * step;\n}\n\nfn RayleighPhaseFunction(nu: f32) -> f32 {\n\tlet k = 3.0 / (16.0 * PI);\n\treturn k * (1.0 + nu * nu);\n}\n\nfn MiePhaseFunction(g: f32, nu: f32) -> f32 {\n\tlet k = 3.0 / (8.0 * PI) * (1.0 - g * g) / (2.0 + g * g);\n\treturn k * (1.0 + nu * nu) / pow(abs(1.0 + g * g - 2.0 * g * nu), 1.5);\n}\n\nfn GetScatteringTextureUvwzFromRMuMuSNu(\n\tatm: Atm, r: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec4f {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius);\n\tlet u_r = GetTextureCoordFromUnitRange(rho / H, SCATTERING_TEXTURE_R_SIZE);\n\n\tlet r_mu = r * mu;\n\tlet discriminant = r_mu * r_mu - r * r +\n\t\tatm.bottom_radius * atm.bottom_radius;\n\tvar u_mu: f32;\n\n\tif (ray_r_mu_intersects_ground) {\n\t\tlet d = -r_mu - SafeSqrt(discriminant);\n\t\tlet d_min = r - atm.bottom_radius;\n\t\tlet d_max = rho;\n\t\tvar x: f32 = 0.0;\n\t\tif (d_max != d_min) {\n\t\t\tx = (d - d_min) / (d_max - d_min);\n\t\t}\n\t\tu_mu = 0.5 - 0.5 * GetTextureCoordFromUnitRange(x, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t} else {\n\t\tlet d = -r_mu + SafeSqrt(discriminant + H * H);\n\t\tlet d_min = atm.top_radius - r;\n\t\tlet d_max = rho + H;\n\t\tu_mu = 0.5 + 0.5 * GetTextureCoordFromUnitRange(\n\t\t\t(d - d_min) / (d_max - d_min), SCATTERING_TEXTURE_MU_SIZE / 2);\n\t}\n\n\tlet d = DistanceToTopAtmosphereBoundary(atm, atm.bottom_radius, mu_s);\n\tlet d_min = atm.top_radius - atm.bottom_radius;\n\tlet d_max = H;\n\tlet a = (d - d_min) / (d_max - d_min);\n\tlet A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min);\n\n\tlet u_mu_s = GetTextureCoordFromUnitRange(\n\t\tmax(1.0 - a / A, 0.0) / (1.0 + a), SCATTERING_TEXTURE_MU_S_SIZE);\n\n\tlet u_nu = (nu + 1.0) / 2.0;\n\treturn vec4f(u_nu, u_mu_s, u_mu, u_r);\n}\n\nfn GetRMuMuSNuFromScatteringTextureUvwz(\n\tatm: Atm, uvwz: vec4f,\n\tr: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>,\n\tnu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = H * GetUnitRangeFromTextureCoord(uvwz.w, SCATTERING_TEXTURE_R_SIZE);\n\t*r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius);\n\n\tif (uvwz.z < 0.5) {\n\t\tlet d_min = *r - atm.bottom_radius;\n\t\tlet d_max = rho;\n\t\tlet d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord(\n\t\t\t1.0 - 2.0 * uvwz.z, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t\tif (d == 0.0) {\n\t\t\t*mu = -1.0;\n\t\t} else {\n\t\t\t*mu = ClampCosine(-(rho * rho + d * d) / (2.0 * (*r) * d));\n\t\t}\n\t\t*ray_r_mu_intersects_ground = true;\n\t} else {\n\t\tlet d_min = atm.top_radius - *r;\n\t\tlet d_max = rho + H;\n\t\tlet d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord(\n\t\t\t2.0 * uvwz.z - 1.0, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t\tif (d == 0.0) {\n\t\t\t*mu = 1.0;\n\t\t} else {\n\t\t\t*mu = ClampCosine((H * H - rho * rho - d * d) / (2.0 * (*r) * d));\n\t\t}\n\t\t*ray_r_mu_intersects_ground = false;\n\t}\n\n\tlet x_mu_s = GetUnitRangeFromTextureCoord(uvwz.y, SCATTERING_TEXTURE_MU_S_SIZE);\n\tlet d_min = atm.top_radius - atm.bottom_radius;\n\tlet d_max = H;\n\tlet A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min);\n\tlet a = (A - x_mu_s * A) / (1.0 + x_mu_s * A);\n\tlet d = d_min + min(a, A) * (d_max - d_min);\n\tif (d == 0.0) {\n\t\t*mu_s = 1.0;\n\t} else {\n\t\t*mu_s = ClampCosine((H * H - d * d) / (2.0 * atm.bottom_radius * d));\n\t}\n\n\t*nu = ClampCosine(uvwz.x * 2.0 - 1.0);\n}\n\nfn GetRMuMuSNuFromScatteringTextureFragCoord(\n\tatm: Atm, frag_coord: vec3f,\n\tr: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>,\n\tnu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {\n\tlet SCATTERING_TEXTURE_SIZE = vec4f(\n\t\tf32(SCATTERING_TEXTURE_NU_SIZE - 1),\n\t\tf32(SCATTERING_TEXTURE_MU_S_SIZE),\n\t\tf32(SCATTERING_TEXTURE_MU_SIZE),\n\t\tf32(SCATTERING_TEXTURE_R_SIZE));\n\n\tlet frag_coord_nu = floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE));\n\tlet frag_coord_mu_s = frag_coord.x -\n\t\tf32(SCATTERING_TEXTURE_MU_S_SIZE) * floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE));\n\n\tlet uvwz = vec4f(frag_coord_nu, frag_coord_mu_s, frag_coord.y, frag_coord.z) /\n\t\tSCATTERING_TEXTURE_SIZE;\n\n\tGetRMuMuSNuFromScatteringTextureUvwz(\n\t\tatm, uvwz, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\t*nu = clamp(*nu,\n\t\t(*mu) * (*mu_s) - sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))),\n\t\t(*mu) * (*mu_s) + sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))));\n}\n\nfn GetIrradianceTextureUvFromRMuS(atm: Atm, r: f32, mu_s: f32) -> vec2f {\n\tlet x_r = (r - atm.bottom_radius) / (atm.top_radius - atm.bottom_radius);\n\tlet x_mu_s = mu_s * 0.5 + 0.5;\n\treturn vec2f(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH),\n\t\tGetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT));\n}\n\nfn GetIrradiance(\n\tatm: Atm, irradiance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet uv = GetIrradianceTextureUvFromRMuS(atm, r, mu_s);\n\treturn tex2DBilinear(irradiance_texture, uv,\n\t\tvec2i(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT)).rgb;\n}\n",Im=e=>`\n${Lm}\n\nfn ComputeOpticalLengthToTopAtmosphereBoundary(\n\tatm: Atm, profile: DensityProfile, r: f32, mu: f32) -> f32 {\n\tconst SAMPLE_COUNT: i32 = 500;\n\tlet dx = DistanceToTopAtmosphereBoundary(atm, r, mu) / f32(SAMPLE_COUNT);\n\tvar result: f32 = 0.0;\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\t\tlet r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r);\n\t\tlet y_i = GetProfileDensity(profile, r_i - atm.bottom_radius);\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\tresult += y_i * weight_i * dx;\n\t}\n\treturn result;\n}\n\nfn ComputeTransmittanceToTopAtmosphereBoundary(\n\tatm: Atm, r: f32, mu: f32) -> vec3f {\n\tvar density = vec3f(0.0);\n\tdensity += atm.rayleigh_scattering *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.rayleigh_density, r, mu);\n\tdensity += atm.mie_extinction *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.mie_density, r, mu);\n\tdensity += atm.absorption_extinction *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.absorption_density, r, mu);\n\treturn exp(-density);\n}\n\nfn ComputeTransmittanceToTopAtmosphereBoundaryTexture(\n\tatm: Atm, frag_coord: vec2f) -> vec3f {\n\tlet TRANSMITTANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(TRANSMITTANCE_TEXTURE_WIDTH), f32(TRANSMITTANCE_TEXTURE_HEIGHT));\n\tvar r: f32;\n\tvar mu: f32;\n\tGetRMuFromTransmittanceTextureUv(\n\t\tatm, frag_coord / TRANSMITTANCE_TEXTURE_SIZE, &r, &mu);\n\treturn ComputeTransmittanceToTopAtmosphereBoundary(atm, r, mu);\n}\n\nfn ComputeSingleScatteringIntegrand(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32, d: f32,\n\tray_r_mu_intersects_ground: bool,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tlet r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\tlet mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d);\n\n\tlet transmittance =\n\t\tGetTransmittance(atm, transmittance_texture, r, mu, d, ray_r_mu_intersects_ground) *\n\t\tGetTransmittanceToSun(atm, transmittance_texture, r_d, mu_s_d);\n\n\t*rayleigh = transmittance *\n\t\tGetProfileDensity(atm.rayleigh_density, r_d - atm.bottom_radius);\n\t*mie = transmittance *\n\t\tGetProfileDensity(atm.mie_density, r_d - atm.bottom_radius);\n}\n\nfn DistanceToNearestAtmosphereBoundary(\n\tatm: Atm, r: f32, mu: f32, ray_r_mu_intersects_ground: bool) -> f32 {\n\tif (ray_r_mu_intersects_ground) {\n\t\treturn DistanceToBottomAtmosphereBoundary(atm, r, mu);\n\t}\n\treturn DistanceToTopAtmosphereBoundary(atm, r, mu);\n}\n\nfn ComputeSingleScattering(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tconst SAMPLE_COUNT: i32 = 50;\n\tlet dx = DistanceToNearestAtmosphereBoundary(\n\t\tatm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT);\n\n\tvar rayleigh_sum = vec3f(0.0);\n\tvar mie_sum = vec3f(0.0);\n\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\t\tvar rayleigh_i: vec3f;\n\t\tvar mie_i: vec3f;\n\t\tComputeSingleScatteringIntegrand(\n\t\t\tatm, transmittance_texture, r, mu, mu_s, nu, d_i,\n\t\t\tray_r_mu_intersects_ground, &rayleigh_i, &mie_i);\n\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\trayleigh_sum += rayleigh_i * weight_i;\n\t\tmie_sum += mie_i * weight_i;\n\t}\n\n\t*rayleigh = rayleigh_sum * dx * atm.solar_irradiance * atm.rayleigh_scattering;\n\t*mie = mie_sum * dx * atm.solar_irradiance * atm.mie_scattering;\n}\n\nfn ComputeSingleScatteringTexture(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec3f,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar nu: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground);\n\tComputeSingleScattering(\n\t\tatm, transmittance_texture, r, mu, mu_s, nu,\n\t\tray_r_mu_intersects_ground, rayleigh, mie);\n}\n\n// The n-th-order lookup used during precompute: the delta textures are\n// float32, so they go through the manual trilinear helper.\nfn GetScatteringDelta(\n\tatm: Atm, scattering_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec3f {\n\tlet uvwz = GetScatteringTextureUvwzFromRMuMuSNu(\n\t\tatm, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\tlet tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1);\n\tlet tex_x = floor(tex_coord_x);\n\tlet lerp = tex_coord_x - tex_x;\n\n\tlet uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\tlet uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\n\tlet size = vec3i(SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT, SCATTERING_TEXTURE_DEPTH);\n\treturn tex3DTrilinear(scattering_texture, uvw0, size).rgb * (1.0 - lerp) +\n\t\ttex3DTrilinear(scattering_texture, uvw1, size).rgb * lerp;\n}\n\nfn GetScatteringOrder(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\tscattering_order: i32) -> vec3f {\n\tif (scattering_order == 1) {\n\t\tlet rayleigh = GetScatteringDelta(\n\t\t\tatm, single_rayleigh_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t\tlet mie = GetScatteringDelta(\n\t\t\tatm, single_mie_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t\treturn rayleigh * RayleighPhaseFunction(nu) +\n\t\t\tmie * MiePhaseFunction(atm.mie_phase_function_g, nu);\n\t} else {\n\t\treturn GetScatteringDelta(\n\t\t\tatm, multiple_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t}\n}\n\nfn GetRMuSFromIrradianceTextureUv(\n\tatm: Atm, uv: vec2f, r: ptr<function, f32>, mu_s: ptr<function, f32>) {\n\tlet x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH);\n\tlet x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT);\n\t*r = atm.bottom_radius + x_r * (atm.top_radius - atm.bottom_radius);\n\t*mu_s = ClampCosine(2.0 * x_mu_s - 1.0);\n}\n\nfn ComputeDirectIrradiance(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet alpha_s = atm.sun_angular_radius;\n\n\tvar average_cosine_factor: f32;\n\tif (mu_s < -alpha_s) {\n\t\taverage_cosine_factor = 0.0;\n\t} else if (mu_s > alpha_s) {\n\t\taverage_cosine_factor = mu_s;\n\t} else {\n\t\taverage_cosine_factor = (mu_s + alpha_s) * (mu_s + alpha_s) / (4.0 * alpha_s);\n\t}\n\n\treturn atm.solar_irradiance *\n\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) *\n\t\taverage_cosine_factor;\n}\n\nfn ComputeIndirectIrradiance(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tr: f32, mu_s: f32, scattering_order: i32) -> vec3f {\n\tconst SAMPLE_COUNT: i32 = 32;\n\tlet dphi = PI / f32(SAMPLE_COUNT);\n\tlet dtheta = PI / f32(SAMPLE_COUNT);\n\n\tvar result = vec3f(0.0);\n\tlet omega_s = vec3f(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s);\n\n\tfor (var j: i32 = 0; j < SAMPLE_COUNT / 2; j++) {\n\t\tlet theta = (f32(j) + 0.5) * dtheta;\n\t\tfor (var i: i32 = 0; i < 2 * SAMPLE_COUNT; i++) {\n\t\t\tlet phi = (f32(i) + 0.5) * dphi;\n\t\t\tlet omega = vec3f(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta));\n\t\t\tlet domega = dtheta * dphi * sin(theta);\n\t\t\tlet nu = dot(omega, omega_s);\n\n\t\t\tresult += GetScatteringOrder(atm,\n\t\t\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\t\t\tmultiple_scattering_texture,\n\t\t\t\tr, omega.z, mu_s, nu, false, scattering_order) * omega.z * domega;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfn ComputeDirectIrradianceTexture(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec2f) -> vec3f {\n\tvar r: f32;\n\tvar mu_s: f32;\n\tlet IRRADIANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT));\n\tGetRMuSFromIrradianceTextureUv(\n\t\tatm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s);\n\treturn ComputeDirectIrradiance(atm, transmittance_texture, r, mu_s);\n}\n\nfn ComputeIndirectIrradianceTexture(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tfrag_coord: vec2f, scattering_order: i32) -> vec3f {\n\tvar r: f32;\n\tvar mu_s: f32;\n\tlet IRRADIANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT));\n\tGetRMuSFromIrradianceTextureUv(\n\t\tatm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s);\n\treturn ComputeIndirectIrradiance(atm,\n\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\tmultiple_scattering_texture, r, mu_s, scattering_order);\n}\n\nfn ComputeScatteringDensity(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32, scattering_order: i32) -> vec3f {\n\tlet zenith_direction = vec3f(0.0, 0.0, 1.0);\n\tlet omega = vec3f(sqrt(1.0 - mu * mu), 0.0, mu);\n\tvar sun_dir_x: f32 = 0.0;\n\tif (omega.x != 0.0) {\n\t\tsun_dir_x = (nu - mu * mu_s) / omega.x;\n\t}\n\tlet sun_dir_y = sqrt(max(1.0 - sun_dir_x * sun_dir_x - mu_s * mu_s, 0.0));\n\tlet omega_s = vec3f(sun_dir_x, sun_dir_y, mu_s);\n\n\tconst SAMPLE_COUNT: i32 = 16;\n\tlet dphi = PI / f32(SAMPLE_COUNT);\n\tlet dtheta = PI / f32(SAMPLE_COUNT);\n\tvar rayleigh_mie = vec3f(0.0);\n\n\tfor (var l: i32 = 0; l < SAMPLE_COUNT; l++) {\n\t\tlet theta = (f32(l) + 0.5) * dtheta;\n\t\tlet cos_theta = cos(theta);\n\t\tlet sin_theta = sin(theta);\n\t\tlet ray_r_theta_intersects_ground = RayIntersectsGround(atm, r, cos_theta);\n\n\t\tvar distance_to_ground: f32 = 0.0;\n\t\tvar transmittance_to_ground = vec3f(0.0);\n\t\tvar ground_albedo = vec3f(0.0);\n\t\tif (ray_r_theta_intersects_ground) {\n\t\t\tdistance_to_ground = DistanceToBottomAtmosphereBoundary(atm, r, cos_theta);\n\t\t\ttransmittance_to_ground = GetTransmittance(\n\t\t\t\tatm, transmittance_texture, r, cos_theta, distance_to_ground, true);\n\t\t\t// NOTE: the reference leaves ground_albedo at vec3(0) here (it\n\t\t\t// declares it but never assigns atm.ground_albedo) — transcribed\n\t\t\t// as-is so the LUTs match bit-for-bit in spirit.\n\t\t}\n\n\t\tfor (var m: i32 = 0; m < 2 * SAMPLE_COUNT; m++) {\n\t\t\tlet phi = (f32(m) + 0.5) * dphi;\n\t\t\tlet omega_i = vec3f(cos(phi) * sin_theta, sin(phi) * sin_theta, cos_theta);\n\t\t\tlet domega_i = dtheta * dphi * sin(theta);\n\n\t\t\tlet nu1 = dot(omega_s, omega_i);\n\t\t\tvar incident_radiance = GetScatteringOrder(atm,\n\t\t\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\t\t\tmultiple_scattering_texture, r, omega_i.z, mu_s, nu1,\n\t\t\t\tray_r_theta_intersects_ground, scattering_order - 1);\n\n\t\t\tlet ground_normal = normalize(zenith_direction * r + omega_i * distance_to_ground);\n\t\t\tlet ground_irradiance = GetIrradiance(\n\t\t\t\tatm, irradiance_texture, atm.bottom_radius, dot(ground_normal, omega_s));\n\t\t\tincident_radiance += transmittance_to_ground * ground_albedo *\n\t\t\t\t(1.0 / PI) * ground_irradiance;\n\n\t\t\tlet nu2 = dot(omega, omega_i);\n\n\t\t\tlet rayleigh_density = GetProfileDensity(\n\t\t\t\tatm.rayleigh_density, r - atm.bottom_radius);\n\t\t\tlet mie_density = GetProfileDensity(\n\t\t\t\tatm.mie_density, r - atm.bottom_radius);\n\n\t\t\trayleigh_mie += incident_radiance * (\n\t\t\t\tatm.rayleigh_scattering * rayleigh_density * RayleighPhaseFunction(nu2) +\n\t\t\t\tatm.mie_scattering * mie_density * MiePhaseFunction(atm.mie_phase_function_g, nu2)) *\n\t\t\t\tdomega_i;\n\t\t}\n\t}\n\n\treturn rayleigh_mie;\n}\n\nfn ComputeMultipleScattering(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_density_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec3f {\n\tconst SAMPLE_COUNT: i32 = 50;\n\tlet dx = DistanceToNearestAtmosphereBoundary(\n\t\tatm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT);\n\n\tvar rayleigh_mie_sum = vec3f(0.0);\n\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\n\t\tlet r_i = ClampRadius(atm, sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r));\n\t\tlet mu_i = ClampCosine((r * mu + d_i) / r_i);\n\t\tlet mu_s_i = ClampCosine((r * mu_s + d_i * nu) / r_i);\n\n\t\tlet rayleigh_mie_i =\n\t\t\tGetScatteringDelta(atm, scattering_density_texture, r_i, mu_i, mu_s_i, nu,\n\t\t\t\tray_r_mu_intersects_ground) *\n\t\t\tGetTransmittance(atm, transmittance_texture, r, mu, d_i,\n\t\t\t\tray_r_mu_intersects_ground) * dx;\n\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\trayleigh_mie_sum += rayleigh_mie_i * weight_i;\n\t}\n\n\treturn rayleigh_mie_sum;\n}\n\nfn ComputeScatteringDensityTexture(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tfrag_coord: vec3f, scattering_order: i32) -> vec3f {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar nu: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground);\n\n\treturn ComputeScatteringDensity(atm, transmittance_texture,\n\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\tmultiple_scattering_texture, irradiance_texture, r, mu, mu_s, nu,\n\t\tscattering_order);\n}\n\nfn ComputeMultipleScatteringTexture(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_density_texture: texture_3d<f32>,\n\tfrag_coord: vec3f, nu: ptr<function, f32>) -> vec3f {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, nu, &ray_r_mu_intersects_ground);\n\n\treturn ComputeMultipleScattering(atm, transmittance_texture,\n\t\tscattering_density_texture, r, mu, mu_s, *nu,\n\t\tray_r_mu_intersects_ground);\n}\n\n\nstruct PassParams {\n\tluminance_from_radiance: mat3x3f,\n\tblend: vec4f,\n\tlayer: i32,\n\tscattering_order: i32,\n}\n\nfn RadianceToLuminance(pass_params: PassParams, rad: vec3f) -> vec3f {\n\treturn pass_params.luminance_from_radiance * rad;\n}\n\n@group(0) @binding(0) var<uniform> atm: Atm;\n@group(0) @binding(1) var<uniform> pass_params: PassParams;\n${e}\n`,Dm=Im("\n@group(0) @binding(2) var out_transmittance: texture_storage_2d<rgba32float, write>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\ttextureStore(out_transmittance, coord,\n\t\tvec4f(ComputeTransmittanceToTopAtmosphereBoundaryTexture(atm, frag_coord), 1.0));\n}\n",Fm=Im("\n@group(0) @binding(2) var irradiance_read: texture_2d<f32>;\n@group(0) @binding(3) var out_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(4) var out_delta_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(5) var transmittance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\n\ttextureStore(out_delta_irradiance, coord,\n\t\tvec4f(ComputeDirectIrradianceTexture(atm, transmittance, frag_coord), 1.0));\n\n\tvar result = vec4f(0.0, 0.0, 0.0, 1.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tresult += textureLoad(irradiance_read, coord, 0);\n\t}\n\ttextureStore(out_irradiance, coord, result);\n}\n",Um=Im("\n@group(0) @binding(2) var out_delta_rayleigh: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var out_delta_mie: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(4) var scattering_read: texture_3d<f32>;\n@group(0) @binding(5) var out_scattering: texture_storage_3d<rgba16float, write>;\n@group(0) @binding(6) var transmittance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tvar delta_rayleigh: vec3f;\n\tvar delta_mie: vec3f;\n\tComputeSingleScatteringTexture(atm, transmittance, frag_coord,\n\t\t&delta_rayleigh, &delta_mie);\n\n\ttextureStore(out_delta_rayleigh, coord, vec4f(delta_rayleigh, 1.0));\n\ttextureStore(out_delta_mie, coord, vec4f(delta_mie, 1.0));\n\n\tvar scattering = vec4f(\n\t\tRadianceToLuminance(pass_params, delta_rayleigh),\n\t\tRadianceToLuminance(pass_params, delta_mie).r);\n\tif (pass_params.blend[2] == 1.0) {\n\t\tscattering += textureLoad(scattering_read, coord, 0);\n\t}\n\ttextureStore(out_scattering, coord, scattering);\n}\n",Om=Im("\n@group(0) @binding(2) var out_delta_scattering_density: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var transmittance: texture_2d<f32>;\n@group(0) @binding(4) var single_rayleigh_scattering: texture_3d<f32>;\n@group(0) @binding(5) var single_mie_scattering: texture_3d<f32>;\n@group(0) @binding(6) var multiple_scattering: texture_3d<f32>;\n@group(0) @binding(7) var irradiance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tlet scattering_density = ComputeScatteringDensityTexture(\n\t\tatm, transmittance, single_rayleigh_scattering, single_mie_scattering,\n\t\tmultiple_scattering, irradiance, frag_coord, pass_params.scattering_order);\n\n\ttextureStore(out_delta_scattering_density, coord, vec4f(scattering_density, 1.0));\n}\n",Gm=Im("\n@group(0) @binding(2) var out_delta_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(3) var irradiance_read: texture_2d<f32>;\n@group(0) @binding(4) var out_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(5) var single_rayleigh_scattering: texture_3d<f32>;\n@group(0) @binding(6) var single_mie_scattering: texture_3d<f32>;\n@group(0) @binding(7) var multiple_scattering: texture_3d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\n\tlet delta_irradiance_value = ComputeIndirectIrradianceTexture(\n\t\tatm, single_rayleigh_scattering, single_mie_scattering,\n\t\tmultiple_scattering, frag_coord, pass_params.scattering_order);\n\ttextureStore(out_delta_irradiance, coord, vec4f(delta_irradiance_value, 1.0));\n\n\tvar irradiance = vec4f(RadianceToLuminance(pass_params, delta_irradiance_value), 1.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tirradiance += textureLoad(irradiance_read, coord, 0);\n\t}\n\ttextureStore(out_irradiance, coord, irradiance);\n}\n",qm=Im("\n@group(0) @binding(2) var out_delta_multiple_scattering: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var scattering_read: texture_3d<f32>;\n@group(0) @binding(4) var out_scattering: texture_storage_3d<rgba16float, write>;\n@group(0) @binding(5) var transmittance: texture_2d<f32>;\n@group(0) @binding(6) var delta_scattering_density: texture_3d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tvar nu: f32;\n\tlet delta_multiple_scattering_value = ComputeMultipleScatteringTexture(\n\t\tatm, transmittance, delta_scattering_density, frag_coord, &nu);\n\n\ttextureStore(out_delta_multiple_scattering, coord,\n\t\tvec4f(delta_multiple_scattering_value, 1.0));\n\n\tvar scattering = vec4f(\n\t\tRadianceToLuminance(pass_params, delta_multiple_scattering_value) /\n\t\t\tRayleighPhaseFunction(nu),\n\t\t0.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tscattering += textureLoad(scattering_read, coord, 0);\n\t}\n\ttextureStore(out_scattering, coord, scattering);\n}\n";function Wm(e){let t=e.backend.device;if(!t)throw new Error("[spline/sky] WebGPU device unavailable for LUT precompute");return t}function Hm(e,t){e.initTexture(t);let a=e.backend.get(t);if(!a?.texture)throw new Error("[spline/sky] three did not allocate a GPU texture");return a.texture}function jm(e,t,a,r){let s=new O(e,t);return s.type=a,s.minFilter=Hs,s.magFilter=Hs,s.generateMipmaps=!1,s.mipmapsAutoUpdate=!1,s.name=r,s}function Km(e,t,a,r,s,i){let n=new H(e,t,a);return n.type=r,n.minFilter=i,n.magFilter=i,n.generateMipmaps=!1,n.mipmapsAutoUpdate=!1,n.name=s,n}var $m=256,Xm={transmittance:{code:Dm,entries:[{storage:"2d",format:"rgba32float"}]},directIrradiance:{code:Fm,entries:[{sampled:"2d"},{storage:"2d",format:"rgba32float"},{storage:"2d",format:"rgba32float"},{sampled:"2d"}]},singleScattering:{code:Um,entries:[{storage:"3d",format:"rgba32float"},{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"}]},scatteringDensity:{code:Om,entries:[{storage:"3d",format:"rgba32float"},{sampled:"2d"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"},{sampled:"2d"}]},indirectIrradiance:{code:Gm,entries:[{storage:"2d",format:"rgba32float"},{sampled:"2d"},{storage:"2d",format:"rgba32float"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"}]},multipleScattering:{code:qm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"},{sampled:"3d"}]}};async function Qm(e,t,a,r,s,i){let n=Wm(e),l=Hm(e,t),o=a*(i?8:16),u=256*Math.ceil(o/256),d=n.createBuffer({size:u*r*s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),h=n.createCommandEncoder();h.copyTextureToBuffer({texture:l},{buffer:d,bytesPerRow:u,rowsPerImage:r},{width:a,height:r,depthOrArrayLayers:s}),n.queue.submit([h.finish()]),await d.mapAsync(GPUMapMode.READ);let m=d.getMappedRange(),c=new Float32Array(a*r*s*4);for(let e=0;e<s;e++)for(let t=0;t<r;t++){let s=(e*r+t)*u;if(i){let i=new Uint16Array(m,s,4*a);for(let s=0;s<4*a;s++)c[(e*r+t)*a*4+s]=Zm(i[s])}else{let i=new Float32Array(m,s,4*a);c.set(i,(e*r+t)*a*4)}}return d.unmap(),d.destroy(),c}function Zm(e){let t=(32768&e)>>15,a=(31744&e)>>10,r=1023&e;return 0===a?(t?-1:1)*Math.pow(2,-14)*(r/1024):31===a?r?NaN:1/0*(t?-1:1):(t?-1:1)*Math.pow(2,a-15)*(1+r/1024)}function Ym(e,t){return.5/t+e*(1-1/t)}function Jm(e,t,a,r,s){let i=Math.min(Math.max(r*t-.5,0),t-1),n=Math.min(Math.max(s*a-.5,0),a-1),l=Math.floor(i),o=Math.floor(n),u=Math.min(l+1,t-1),d=Math.min(o+1,a-1),h=i-l,m=n-o,c=[0,0,0];for(let a=0;a<3;a++){let r=e[4*(o*t+l)+a],s=e[4*(o*t+u)+a],i=e[4*(d*t+l)+a],n=e[4*(d*t+u)+a];c[a]=(r*(1-h)+s*h)*(1-m)+(i*(1-h)+n*h)*m}return c}function ec(e,t,a,r){let s=e.bottomRadius/a,i=-Math.sqrt(Math.max(0,1-s*s)),n=function(e,t,a){let r=Math.min(1,Math.max(0,(a-e)/(t-e)));return r*r*(3-2*r)}(-s*e.sunAngularRadius,s*e.sunAngularRadius,r-i),l=function(e,t,a,r){let s=Math.sqrt(e.topRadius*e.topRadius-e.bottomRadius*e.bottomRadius),i=Math.sqrt(Math.max(0,a*a-e.bottomRadius*e.bottomRadius)),n=function(e,t,a){let r=t*t*(a*a-1)+e.topRadius*e.topRadius;return Math.max(0,-t*a+Math.sqrt(Math.max(0,r)))}(e,a,r),l=e.topRadius-a,o=i/s;return Jm(t,256,64,Ym((n-l)/(i+s-l),256),Ym(o,64))}(e,t,a,r);return[l[0]*n,l[1]*n,l[2]*n]}function tc(e){return.2126*e[0]+.7152*e[1]+.0722*e[2]}function ac(e,t,a,r){let s=ec(e,t.transmittance,a,r),i=e.sunSpectralRadianceToLuminance;return[e.solarIrradiance[0]*s[0]*i[0],e.solarIrradiance[1]*s[1]*i[1],e.solarIrradiance[2]*s[2]*i[2]]}function rc(e,t,a,r){let s=function(e,t,a,r){let s=(a-e.bottomRadius)/(e.topRadius-e.bottomRadius);return Jm(t,64,16,Ym(.5*r+.5,64),Ym(s,16))}(e,t.irradiance,a,r),i=e.skySpectralRadianceToLuminance;return[s[0]*i[0],s[1]*i[1],s[2]*i[2]]}var sc="6.0e4",ic="\nfn GetExtrapolatedSingleMieScattering(atm: Atm, scattering: vec4f) -> vec3f {\n\tif (scattering.r == 0.0) {\n\t\treturn vec3f(0.0);\n\t}\n\treturn scattering.rgb * scattering.a / scattering.r *\n\t\t(atm.rayleigh_scattering.r / atm.mie_scattering.r) *\n\t\t(atm.mie_scattering / atm.rayleigh_scattering);\n}\n\nfn GetCombinedScattering(\n\tatm: Atm,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\tsingle_mie_scattering: ptr<function, vec3f>) -> vec3f {\n\tlet uvwz = GetScatteringTextureUvwzFromRMuMuSNu(\n\t\tatm, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\tlet tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1);\n\tlet tex_x = floor(tex_coord_x);\n\tlet lerp = tex_coord_x - tex_x;\n\n\tlet uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\tlet uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\n\tlet combined_scattering =\n\t\ttextureSampleLevel(scattering_texture, scattering_sampler, uvw0, 0.0) * (1.0 - lerp) +\n\t\ttextureSampleLevel(scattering_texture, scattering_sampler, uvw1, 0.0) * lerp;\n\tlet scattering = combined_scattering.xyz;\n\t*single_mie_scattering = GetExtrapolatedSingleMieScattering(atm, combined_scattering);\n\n\treturn scattering;\n}\n\n// GLSL relies on sqrt(negative) = NaN making both branch conditions false;\n// WGSL leaves that indeterminate, so the discriminant is tested explicitly —\n// same control flow for every defined input.\nfn GetSkyRadiance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tcamera_in: vec3f, view_ray: vec3f, shadow_length: f32,\n\tsun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f {\n\tvar camera = camera_in;\n\tvar r = length(camera);\n\tvar rmu = dot(camera, view_ray);\n\tlet disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius;\n\tvar distance_to_top_atmosphere_boundary = -1.0;\n\tif (disc >= 0.0) {\n\t\tdistance_to_top_atmosphere_boundary = -rmu - sqrt(disc);\n\t}\n\n\tif (distance_to_top_atmosphere_boundary > 0.0) {\n\t\tcamera = camera + view_ray * distance_to_top_atmosphere_boundary;\n\t\tr = atm.top_radius;\n\t\trmu += distance_to_top_atmosphere_boundary;\n\t} else if (r > atm.top_radius) {\n\t\t*transmittance = vec3f(0.0);\n\t\treturn vec3f(0.0);\n\t}\n\n\tlet mu = rmu / r;\n\tlet mu_s = dot(camera, sun_direction) / r;\n\tlet nu = dot(view_ray, sun_direction);\n\tlet ray_r_mu_intersects_ground = RayIntersectsGround(atm, r, mu);\n\n\tif (ray_r_mu_intersects_ground) {\n\t\t*transmittance = vec3f(0.0);\n\t} else {\n\t\t*transmittance = GetTransmittanceToTopAtmosphereBoundary(\n\t\t\tatm, transmittance_texture, r, mu);\n\t}\n\n\tvar single_mie_scattering: vec3f;\n\tvar scattering: vec3f;\n\n\tif (shadow_length == 0.0) {\n\t\tscattering = GetCombinedScattering(\n\t\t\tatm, scattering_texture, scattering_sampler,\n\t\t\tr, mu, mu_s, nu, ray_r_mu_intersects_ground,\n\t\t\t&single_mie_scattering);\n\t} else {\n\t\tlet d = shadow_length;\n\t\tlet r_p = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\t\tlet mu_p = (r * mu + d) / r_p;\n\t\tlet mu_s_p = (r * mu_s + d * nu) / r_p;\n\n\t\tscattering = GetCombinedScattering(\n\t\t\tatm, scattering_texture, scattering_sampler,\n\t\t\tr_p, mu_p, mu_s_p, nu, ray_r_mu_intersects_ground,\n\t\t\t&single_mie_scattering);\n\n\t\tlet shadow_transmittance = GetTransmittance(\n\t\t\tatm, transmittance_texture, r, mu, shadow_length,\n\t\t\tray_r_mu_intersects_ground);\n\n\t\tscattering = scattering * shadow_transmittance;\n\t\tsingle_mie_scattering = single_mie_scattering * shadow_transmittance;\n\t}\n\n\treturn scattering * RayleighPhaseFunction(nu) + single_mie_scattering *\n\t\tMiePhaseFunction(atm.mie_phase_function_g, nu);\n}\n\n/**\n * The transmittance half of GetSkyRadiance, without the radiance.\n *\n * The clouds march calls GetSkyRadiance once per LIT step purely for its\n * transmittance out-param and drops the returned radiance on the floor —\n * paying two 3D scattering-LUT samples, the single-Mie extrapolation and\n * both phase functions (a pow among them) for a value nothing reads. Whether a\n * driver's optimizer notices is up to the driver; this is the same control\n * flow and the same lookup with the dead half deleted, so the value is\n * bit-identical either way.\n */\nfn GetSkyTransmittance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tcamera_in: vec3f, view_ray: vec3f) -> vec3f {\n\tvar camera = camera_in;\n\tvar r = length(camera);\n\tvar rmu = dot(camera, view_ray);\n\tlet disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius;\n\tvar distance_to_top_atmosphere_boundary = -1.0;\n\tif (disc >= 0.0) {\n\t\tdistance_to_top_atmosphere_boundary = -rmu - sqrt(disc);\n\t}\n\n\tif (distance_to_top_atmosphere_boundary > 0.0) {\n\t\tcamera = camera + view_ray * distance_to_top_atmosphere_boundary;\n\t\tr = atm.top_radius;\n\t\trmu += distance_to_top_atmosphere_boundary;\n\t} else if (r > atm.top_radius) {\n\t\treturn vec3f(0.0);\n\t}\n\n\tlet mu = rmu / r;\n\tif (RayIntersectsGround(atm, r, mu)) {\n\t\treturn vec3f(0.0);\n\t}\n\treturn GetTransmittanceToTopAtmosphereBoundary(\n\t\tatm, transmittance_texture, r, mu);\n}\n\nfn GetSunAndSkyIrradiance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f,\n\tsky_irradiance: ptr<function, vec3f>) -> vec3f {\n\tlet r = length(p);\n\tlet mu_s = dot(p, sun_direction) / r;\n\n\t*sky_irradiance = GetIrradiance(atm, irradiance_texture, r, mu_s) *\n\t\t(1.0 + dot(normal, p) / r) * 0.5;\n\n\treturn atm.solar_irradiance *\n\t\tGetTransmittanceToSun(atm, transmittance_texture, r, mu_s) *\n\t\tmax(dot(normal, sun_direction), 0.0);\n}\n\n// atmosphere.glsl wrappers: radiance -> luminance via the spectral factors.\nfn GetSkyRadianceLum(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tcamera: vec3f, view_ray: vec3f, shadow_length: f32,\n\tsun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f {\n\treturn GetSkyRadiance(atm, transmittance_texture, scattering_texture,\n\t\tscattering_sampler, camera, view_ray, shadow_length, sun_direction,\n\t\ttransmittance) * atm.sky_spectral_radiance_to_luminance;\n}\n\nfn GetSunAndSkyIrradianceLum(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f,\n\tsky_irradiance: ptr<function, vec3f>) -> vec3f {\n\tlet sun_irradiance = GetSunAndSkyIrradiance(\n\t\tatm, transmittance_texture, irradiance_texture, p, normal,\n\t\tsun_direction, sky_irradiance);\n\t*sky_irradiance = *sky_irradiance * atm.sky_spectral_radiance_to_luminance;\n\treturn sun_irradiance * atm.sun_spectral_radiance_to_luminance;\n}\n\n/**\n * The sky half of GetSunAndSkyIrradianceLum. Same story as\n * GetSkyTransmittance: the clouds march reads only the sky out-param and\n * discards the sun return, whose GetTransmittanceToSun is a second manual\n * bilinear (four texel loads) plus a smoothstep. Multiplication order is\n * kept exactly as the two-function chain evaluates it, so the result is\n * bit-identical.\n */\nfn GetSkyIrradianceLum(\n\tatm: Atm,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f) -> vec3f {\n\tlet r = length(p);\n\tlet mu_s = dot(p, sun_direction) / r;\n\treturn GetIrradiance(atm, irradiance_texture, r, mu_s) *\n\t\t(1.0 + dot(normal, p) / r) * 0.5 *\n\t\tatm.sky_spectral_radiance_to_luminance;\n}\n\n// Rebuild the Atm struct from the packed uniforms the TSL entries receive\n// (density profiles are precompute-only and stay zeroed).\nfn UnpackAtm(\n\tsolar_irradiance: vec3f,\n\trayleigh_scattering: vec3f,\n\tmie_scattering: vec3f,\n\tsky_srtl: vec3f,\n\tsun_srtl: vec3f,\n\t// x: sun_angular_radius, y: bottom_radius, z: top_radius, w: mie_phase_g\n\tscalars: vec4f,\n\tmu_s_min: f32) -> Atm {\n\tvar atm: Atm;\n\tatm.solar_irradiance = solar_irradiance;\n\tatm.rayleigh_scattering = rayleigh_scattering;\n\tatm.mie_scattering = mie_scattering;\n\tatm.sky_spectral_radiance_to_luminance = sky_srtl;\n\tatm.sun_spectral_radiance_to_luminance = sun_srtl;\n\tatm.sun_angular_radius = scalars.x;\n\tatm.bottom_radius = scalars.y;\n\tatm.top_radius = scalars.z;\n\tatm.mie_phase_function_g = scalars.w;\n\tatm.mu_s_min = mu_s_min;\n\treturn atm;\n}\n\n// ray.vert's interpolation, reproduced exactly: the reference normalizes the\n// corner rays in the VERTEX shader, interpolates the unit vectors, then\n// renormalizes per fragment — bilinear-mixing the four unit corner rays here\n// is that same math (not the same as unprojecting the fragment directly).\nfn SkyViewRay(\n\tuv: vec2f, ray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f) -> vec3f {\n\treturn normalize(mix(mix(ray00, ray10, uv.x), mix(ray01, ray11, uv.x), uv.y));\n}\n",nc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\tlet earth_center = vec3f(0.0, -atm.bottom_radius, 0.0);\n\tlet camera = cameraPos - earth_center;\n\tlet sun_dir = normalize(sunDir);\n\tlet view_ray = SkyViewRay(uv, ray00, ray10, ray01, ray11);\n\n\tvar transmittance: vec3f;\n\tlet sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex,\n\t\tscatteringSamp, camera, view_ray, 0.0, sun_dir, &transmittance);\n\n\treturn vec4f(min(sky, vec3f(${sc})), 1.0);\n`,lc="\nfn mod289v4(x: vec4f) -> vec4f { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfn permuteV4(x: vec4f) -> vec4f { return mod289v4(((x * 34.0) + 10.0) * x); }\n\nfn taylorInvSqrt(r: vec4f) -> vec4f { return 1.79284291400159 - 0.85373472095314 * r; }\n\nfn mod289v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfn simplexNoise(v: vec3f) -> f32 {\n\tlet C = vec2f(1.0 / 6.0, 1.0 / 3.0);\n\tlet D = vec4f(0.0, 0.5, 1.0, 2.0);\n\n\t// First corner\n\tvar i = floor(v + dot(v, C.yyy));\n\tlet x0 = v - i + dot(i, C.xxx);\n\n\t// Other corners\n\tlet g = step(x0.yzx, x0.xyz);\n\tlet l = 1.0 - g;\n\tlet i1 = min(g.xyz, l.zxy);\n\tlet i2 = max(g.xyz, l.zxy);\n\n\tlet x1 = x0 - i1 + C.xxx;\n\tlet x2 = x0 - i2 + C.yyy;\n\tlet x3 = x0 - D.yyy;\n\n\t// Permutations\n\ti = mod289v3(i);\n\tlet p = permuteV4(permuteV4(permuteV4(\n\t\ti.z + vec4f(0.0, i1.z, i2.z, 1.0)) +\n\t\ti.y + vec4f(0.0, i1.y, i2.y, 1.0)) +\n\t\ti.x + vec4f(0.0, i1.x, i2.x, 1.0));\n\n\tlet n_ = 0.142857142857;\n\tlet ns = n_ * D.wyz - D.xzx;\n\n\tlet j = p - 49.0 * floor(p * ns.z * ns.z);\n\n\tlet x_ = floor(j * ns.z);\n\tlet y_ = floor(j - 7.0 * x_);\n\n\tlet x = x_ * ns.x + ns.yyyy;\n\tlet y = y_ * ns.x + ns.yyyy;\n\tlet h = 1.0 - abs(x) - abs(y);\n\n\tlet b0 = vec4f(x.xy, y.xy);\n\tlet b1 = vec4f(x.zw, y.zw);\n\n\tlet s0 = floor(b0) * 2.0 + 1.0;\n\tlet s1 = floor(b1) * 2.0 + 1.0;\n\tlet sh = -step(h, vec4f(0.0));\n\n\tlet a0 = b0.xzyw + s0.xzyw * sh.xxyy;\n\tlet a1 = b1.xzyw + s1.xzyw * sh.zzww;\n\n\tvar p0 = vec3f(a0.xy, h.x);\n\tvar p1 = vec3f(a0.zw, h.y);\n\tvar p2 = vec3f(a1.xy, h.z);\n\tvar p3 = vec3f(a1.zw, h.w);\n\n\t// Normalise gradients\n\tlet norm = taylorInvSqrt(vec4f(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\n\t// Mix final noise value\n\tvar m = max(0.5 - vec4f(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec4f(0.0));\n\tm = m * m;\n\treturn 105.0 * dot(m * m, vec4f(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));\n}\n\nfn simplexFBM(x: vec3f, octaves: i32, freq_in: f32) -> f32 {\n\tvar final_: f32 = 0.0;\n\tvar denom: f32 = 0.0;\n\tvar amp: f32 = 1.0;\n\tvar freq = freq_in;\n\n\tfor (var i: i32 = 0; i < octaves; i++) {\n\t\tfinal_ += amp * simplexNoise(x * freq);\n\t\tdenom += amp;\n\n\t\tfreq *= 2.0;\n\t\tamp *= 0.5;\n\t}\n\n\treturn final_ / denom;\n}\n\nfn mod7v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 7.0)) * 7.0; }\n\nfn permuteV3(x: vec3f) -> vec3f { return mod289v3((34.0 * x + 10.0) * x); }\n\nfn worleyNoise(P: vec3f) -> f32 {\n\tlet K = 0.142857142857;\n\tlet Ko = 0.428571428571;\n\tlet K2 = 0.020408163265306;\n\tlet Kz = 0.166666666667;\n\tlet Kzo = 0.416666666667;\n\tlet jitter = 1.0;\n\n\tlet Pi = mod289v3(floor(P));\n\tlet Pf = fract(P) - 0.5;\n\n\tlet Pfx = Pf.x + vec3f(1.0, 0.0, -1.0);\n\tlet Pfy = Pf.y + vec3f(1.0, 0.0, -1.0);\n\tlet Pfz = Pf.z + vec3f(1.0, 0.0, -1.0);\n\n\tlet p = permuteV3(Pi.x + vec3f(-1.0, 0.0, 1.0));\n\tlet p1 = permuteV3(p + Pi.y - 1.0);\n\tlet p2 = permuteV3(p + Pi.y);\n\tlet p3 = permuteV3(p + Pi.y + 1.0);\n\n\tlet p11 = permuteV3(p1 + Pi.z - 1.0);\n\tlet p12 = permuteV3(p1 + Pi.z);\n\tlet p13 = permuteV3(p1 + Pi.z + 1.0);\n\n\tlet p21 = permuteV3(p2 + Pi.z - 1.0);\n\tlet p22 = permuteV3(p2 + Pi.z);\n\tlet p23 = permuteV3(p2 + Pi.z + 1.0);\n\n\tlet p31 = permuteV3(p3 + Pi.z - 1.0);\n\tlet p32 = permuteV3(p3 + Pi.z);\n\tlet p33 = permuteV3(p3 + Pi.z + 1.0);\n\n\tlet ox11 = fract(p11 * K) - Ko;\n\tlet oy11 = mod7v3(floor(p11 * K)) * K - Ko;\n\tlet oz11 = floor(p11 * K2) * Kz - Kzo;\n\n\tlet ox12 = fract(p12 * K) - Ko;\n\tlet oy12 = mod7v3(floor(p12 * K)) * K - Ko;\n\tlet oz12 = floor(p12 * K2) * Kz - Kzo;\n\n\tlet ox13 = fract(p13 * K) - Ko;\n\tlet oy13 = mod7v3(floor(p13 * K)) * K - Ko;\n\tlet oz13 = floor(p13 * K2) * Kz - Kzo;\n\n\tlet ox21 = fract(p21 * K) - Ko;\n\tlet oy21 = mod7v3(floor(p21 * K)) * K - Ko;\n\tlet oz21 = floor(p21 * K2) * Kz - Kzo;\n\n\tlet ox22 = fract(p22 * K) - Ko;\n\tlet oy22 = mod7v3(floor(p22 * K)) * K - Ko;\n\tlet oz22 = floor(p22 * K2) * Kz - Kzo;\n\n\tlet ox23 = fract(p23 * K) - Ko;\n\tlet oy23 = mod7v3(floor(p23 * K)) * K - Ko;\n\tlet oz23 = floor(p23 * K2) * Kz - Kzo;\n\n\tlet ox31 = fract(p31 * K) - Ko;\n\tlet oy31 = mod7v3(floor(p31 * K)) * K - Ko;\n\tlet oz31 = floor(p31 * K2) * Kz - Kzo;\n\n\tlet ox32 = fract(p32 * K) - Ko;\n\tlet oy32 = mod7v3(floor(p32 * K)) * K - Ko;\n\tlet oz32 = floor(p32 * K2) * Kz - Kzo;\n\n\tlet ox33 = fract(p33 * K) - Ko;\n\tlet oy33 = mod7v3(floor(p33 * K)) * K - Ko;\n\tlet oz33 = floor(p33 * K2) * Kz - Kzo;\n\n\tlet dx11 = Pfx + jitter * ox11;\n\tlet dy11 = Pfy.x + jitter * oy11;\n\tlet dz11 = Pfz.x + jitter * oz11;\n\n\tlet dx12 = Pfx + jitter * ox12;\n\tlet dy12 = Pfy.x + jitter * oy12;\n\tlet dz12 = Pfz.y + jitter * oz12;\n\n\tlet dx13 = Pfx + jitter * ox13;\n\tlet dy13 = Pfy.x + jitter * oy13;\n\tlet dz13 = Pfz.z + jitter * oz13;\n\n\tlet dx21 = Pfx + jitter * ox21;\n\tlet dy21 = Pfy.y + jitter * oy21;\n\tlet dz21 = Pfz.x + jitter * oz21;\n\n\tlet dx22 = Pfx + jitter * ox22;\n\tlet dy22 = Pfy.y + jitter * oy22;\n\tlet dz22 = Pfz.y + jitter * oz22;\n\n\tlet dx23 = Pfx + jitter * ox23;\n\tlet dy23 = Pfy.y + jitter * oy23;\n\tlet dz23 = Pfz.z + jitter * oz23;\n\n\tlet dx31 = Pfx + jitter * ox31;\n\tlet dy31 = Pfy.z + jitter * oy31;\n\tlet dz31 = Pfz.x + jitter * oz31;\n\n\tlet dx32 = Pfx + jitter * ox32;\n\tlet dy32 = Pfy.z + jitter * oy32;\n\tlet dz32 = Pfz.y + jitter * oz32;\n\n\tlet dx33 = Pfx + jitter * ox33;\n\tlet dy33 = Pfy.z + jitter * oy33;\n\tlet dz33 = Pfz.z + jitter * oz33;\n\n\tlet d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11;\n\tlet d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12;\n\tlet d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13;\n\tlet d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21;\n\tlet d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22;\n\tlet d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23;\n\tlet d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31;\n\tlet d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32;\n\tlet d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33;\n\n\tlet d1 = min(min(d11, d12), d13);\n\tlet d2 = min(min(d21, d22), d23);\n\tlet d3 = min(min(d31, d32), d33);\n\tvar d = min(min(d1, d2), d3);\n\tlet dx = min(min(d.x, d.y), d.z);\n\treturn sqrt(dx);\n}\n",oc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\n\tvar ctx: CloudsCtx;\n\tctx.maxDistance = cloudsParamsA.x;\n\tctx.sigmaS = cloudsParamsA.y;\n\tctx.sigmaA = cloudsParamsA.z;\n\tctx.cloudLayerThickness = cloudsParamsA.w;\n\tctx.cloudLayerBottom = cloudsParamsB.x;\n\tctx.highCloudsHeight = cloudsParamsB.y;\n\tctx.highCloudsScale = cloudsParamsB.z;\n\tctx.weatherMapScale = cloudsParamsB.w;\n\tctx.baseNoiseScale = cloudsParamsC.x;\n\tctx.detailNoiseScale = cloudsParamsC.y;\n\tctx.cirrusDensity = cloudsParamsC.z;\n\tctx.altoDensity = cloudsParamsC.w;\n\tctx.windSpeed = cloudsParamsD.x;\n\tctx.weatherMapBlend = cloudsParamsD.y;\n\tctx.time = cloudsParamsD.z;\n\tctx.minStep = cloudsParamsD.w;\n\tctx.sigmaT = ctx.sigmaA + ctx.sigmaS;\n\tctx.fogFactor = ctx.maxDistance / 6.0;\n\tctx.bottomRadius = atm.bottom_radius;\n\tctx.sunDir = normalize(sunDir);\n\tctx.earthCenter = vec3f(0.0, -atm.bottom_radius, 0.0);\n\n\tlet rd = SkyViewRay(uv, ray00, ray10, ray01, ray11);\n\n\tlet volumetric = RaymarchVolumetricCloud(ctx, atm,\n\t\ttransmittanceTex, scatteringTex, scatteringSamp, irradianceTex,\n\t\tbaseNoiseTex, noiseSamp, detailNoiseTex,\n\t\tweatherCurTex, weatherSamp, weatherNextTex,\n\t\tcameraPos, rd);\n\tlet hightAlt = HighAltitudeCloud(ctx, atm,\n\t\ttransmittanceTex, scatteringTex, scatteringSamp,\n\t\thighCloudsTex, weatherSamp,\n\t\tcameraPos, rd);\n\n\tvar cloud = volumetric;\n\tcloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb,\n\t\tcloud.a + (1.0 - cloud.a) * hightAlt.a);\n\n\treturn vec4f(min(cloud.rgb, vec3f(${sc})), cloud.a);\n`,uc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\tlet earth_center = vec3f(0.0, -atm.bottom_radius, 0.0);\n\tlet camera = cameraPos - earth_center;\n\tlet sun_dir = normalize(sunDir);\n\n\tlet azimuth = (uv.x - 0.5) * 2.0 * PI;\n\tlet latitude = (uv.y - 0.5) * PI;\n\tlet cosLat = cos(latitude);\n\tlet rd = vec3f(cosLat * cos(azimuth), sin(latitude), cosLat * sin(azimuth));\n\n\tvar transmittance: vec3f;\n\tlet sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex,\n\t\tscatteringSamp, camera, rd, 0.0, sun_dir, &transmittance);\n\n\tvar cloud = vec4f(0.0);\n\tif (cloudsOn > 0.5) {\n\t\tvar ctx: CloudsCtx;\n\t\tctx.maxDistance = cloudsParamsA.x;\n\t\tctx.sigmaS = cloudsParamsA.y;\n\t\tctx.sigmaA = cloudsParamsA.z;\n\t\tctx.cloudLayerThickness = cloudsParamsA.w;\n\t\tctx.cloudLayerBottom = cloudsParamsB.x;\n\t\tctx.highCloudsHeight = cloudsParamsB.y;\n\t\tctx.highCloudsScale = cloudsParamsB.z;\n\t\tctx.weatherMapScale = cloudsParamsB.w;\n\t\tctx.baseNoiseScale = cloudsParamsC.x;\n\t\tctx.detailNoiseScale = cloudsParamsC.y;\n\t\tctx.cirrusDensity = cloudsParamsC.z;\n\t\tctx.altoDensity = cloudsParamsC.w;\n\t\tctx.windSpeed = cloudsParamsD.x;\n\t\tctx.weatherMapBlend = cloudsParamsD.y;\n\t\tctx.time = cloudsParamsD.z;\n\t\tctx.minStep = cloudsParamsD.w;\n\t\tctx.sigmaT = ctx.sigmaA + ctx.sigmaS;\n\t\tctx.fogFactor = ctx.maxDistance / 6.0;\n\t\tctx.bottomRadius = atm.bottom_radius;\n\t\tctx.sunDir = sun_dir;\n\t\tctx.earthCenter = earth_center;\n\n\t\tlet volumetric = RaymarchVolumetricCloud(ctx, atm,\n\t\t\ttransmittanceTex, scatteringTex, scatteringSamp, irradianceTex,\n\t\t\tbaseNoiseTex, noiseSamp, detailNoiseTex,\n\t\t\tweatherCurTex, weatherSamp, weatherNextTex,\n\t\t\tcameraPos, rd);\n\t\tlet hightAlt = HighAltitudeCloud(ctx, atm,\n\t\t\ttransmittanceTex, scatteringTex, scatteringSamp,\n\t\t\thighCloudsTex, weatherSamp,\n\t\t\tcameraPos, rd);\n\t\tcloud = volumetric;\n\t\tcloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb,\n\t\t\tcloud.a + (1.0 - cloud.a) * hightAlt.a);\n\t}\n\n\tlet WHITE_POINT: f32 = 11.07;\n\tvar color = min(sky, vec3f(${sc})) * (1.0 - cloud.a) +\n\t\tmin(cloud.rgb, vec3f(${sc}));\n\tcolor = Hable(color, exposure, WHITE_POINT);\n\tcolor = pow(color, vec3f(1.0 / gamma));\n\n\treturn vec4f(color, 1.0);\n`,dc="\nfn HableTonemap(x: vec3f) -> vec3f {\n\tlet A = 0.15;\n\tlet B = 0.50;\n\tlet C = 0.10;\n\tlet D = 0.20;\n\tlet E = 0.02;\n\tlet F = 0.30;\n\treturn ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;\n}\n\nfn Hable(color: vec3f, exposure: f32, whitePoint: f32) -> vec3f {\n\treturn HableTonemap(color * exposure) / HableTonemap(vec3f(whitePoint));\n}\n",hc=`\n${lc}\nfn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 {\n\treturn min2 + (value - min1) * (max2 - min2) / (max1 - min1);\n}\n\n@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>;\n\n// The reference dispatches 8x8x8 workgroups; WebGPU's default\n// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the\n// driver dispatches size/4 groups — same texel coverage, same math).\n@compute @workgroup_size(4, 4, 4)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet id = vec3i(gid);\n\tlet size = vec3i(textureDimensions(outNoise));\n\tif (any(id >= size)) {\n\t\treturn;\n\t}\n\n\tlet f = vec3f(id);\n\n\tlet p = simplexFBM(f, 4, 0.25) * 0.5 + 0.5;\n\tlet w = 1.0 - worleyNoise(f * 0.125) / 0.866;\n\n\tvar result: vec4f;\n\tresult.r = remap(p, 0.0, 1.0, w, 1.0);\n\tresult.g = worleyNoise(f * 0.25);\n\tresult.b = worleyNoise(f * 0.5);\n\tresult.a = worleyNoise(f);\n\n\ttextureStore(outNoise, id, result);\n}\n`,mc=`\n${lc}\n@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>;\n\n// The reference dispatches 8x8x8 workgroups; WebGPU's default\n// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the\n// driver dispatches size/4 groups — same texel coverage, same math).\n@compute @workgroup_size(4, 4, 4)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet id = vec3i(gid);\n\tlet size = vec3i(textureDimensions(outNoise));\n\tif (any(id >= size)) {\n\t\treturn;\n\t}\n\n\tlet f = vec3f(id);\n\n\tvar result: vec4f;\n\tresult.r = 1.0 - worleyNoise(f * 0.25);\n\tresult.g = 1.0 - worleyNoise(f * 0.5);\n\tresult.b = 1.0 - worleyNoise(f);\n\tresult.a = 1.0;\n\n\ttextureStore(outNoise, id, result);\n}\n`,cc=Math.fround,pc=360,gc=.5*Math.PI/180,fc=1e3,_c=[1.11776,1.14259,1.01249,1.14716,1.72765,1.73054,1.6887,1.61253,1.91198,2.03474,2.02042,2.02212,1.93377,1.95809,1.91686,1.8298,1.8685,1.8931,1.85149,1.8504,1.8341,1.8345,1.8147,1.78158,1.7533,1.6965,1.68194,1.64654,1.6048,1.52143,1.55622,1.5113,1.474,1.4482,1.41018,1.36775,1.34188,1.31429,1.28303,1.26758,1.2367,1.2082,1.18737,1.14683,1.12362,1.1058,1.07124,1.04992],yc=[118e-29,2182e-31,2818e-31,6636e-31,1527e-30,2763e-30,552e-29,8451e-30,1582e-29,2316e-29,3669e-29,4924e-29,7752e-29,9016e-29,148e-27,1602e-28,2139e-28,2755e-28,3091e-28,35e-26,4266e-28,4672e-28,4398e-28,4701e-28,5019e-28,4305e-28,374e-27,3215e-28,2662e-28,2238e-28,1852e-28,1473e-28,1209e-28,9423e-29,7455e-29,6566e-29,5105e-29,415e-28,4228e-29,3237e-29,2451e-29,2801e-29,2534e-29,1624e-29,1465e-29,2078e-29,1383e-29,7105e-30],xc=[360,1299e-7,3917e-9,6061e-7,365,2321e-7,6965e-9,.001086,370,4149e-7,1239e-8,.001946,375,7416e-7,2202e-8,.003486,380,.001368,39e-6,.006450001,385,.002236,64e-6,.01054999,390,.004243,12e-5,.02005001,395,.00765,217e-6,.03621,400,.01431,396e-6,.06785001,405,.02319,64e-5,.1102,410,.04351,.00121,.2074,415,.07763,.00218,.3713,420,.13438,.004,.6456,425,.21477,.0073,1.0390501,430,.2839,.0116,1.3856,435,.3285,.01684,1.62296,440,.34828,.023,1.74706,445,.34806,.0298,1.7826,450,.3362,.038,1.77211,455,.3187,.048,1.7441,460,.2908,.06,1.6692,465,.2511,.0739,1.5281,470,.19536,.09098,1.28764,475,.1421,.1126,1.0419,480,.09564,.13902,.8129501,485,.05795001,.1693,.6162,490,.03201,.20802,.46518,495,.0147,.2586,.3533,500,.0049,.323,.272,505,.0024,.4073,.2123,510,.0093,.503,.1582,515,.0291,.6082,.1117,520,.06327,.71,.07824999,525,.1096,.7932,.05725001,530,.1655,.862,.04216,535,.2257499,.9148501,.02984,540,.2904,.954,.0203,545,.3597,.9803,.0134,550,.4334499,.9949501,.008749999,555,.5120501,1,.005749999,560,.5945,.995,.0039,565,.6784,.9786,.002749999,570,.7621,.952,.0021,575,.8425,.9154,.0018,580,.9163,.87,.001650001,585,.9786,.8163,.0014,590,1.0263,.757,.0011,595,1.0567,.6949,.001,600,1.0622,.631,8e-4,605,1.0456,.5668,6e-4,610,1.0026,.503,34e-5,615,.9384,.4412,24e-5,620,.8544499,.381,19e-5,625,.7514,.321,1e-4,630,.6424,.265,4999999e-11,635,.5419,.217,3e-5,640,.4479,.175,2e-5,645,.3608,.1382,1e-5,650,.2835,.107,0,655,.2187,.0816,0,660,.1649,.061,0,665,.1212,.04458,0,670,.0874,.032,0,675,.0636,.0232,0,680,.04677,.017,0,685,.0329,.01192,0,690,.0227,.00821,0,695,.01584,.005723,0,700,.01135916,.004102,0,705,.008110916,.002929,0,710,.005790346,.002091,0,715,.004109457,.001484,0,720,.002899327,.001047,0,725,.00204919,74e-5,0,730,.001439971,52e-5,0,735,.0009999493,3611e-7,0,740,.0006900786,2492e-7,0,745,.0004760213,1719e-7,0,750,.0003323011,12e-5,0,755,.0002348261,848e-7,0,760,.0001661505,6e-5,0,765,117413e-9,424e-7,0,770,8307527e-11,3e-5,0,775,5870652e-11,212e-7,0,780,4150994e-11,1499e-8,0,785,2935326e-11,106e-7,0,790,2067383e-11,74657e-10,0,795,1455977e-11,52578e-10,0,800,1025398e-11,37029e-10,0,805,7221456e-12,26078e-10,0,810,5085868e-12,18366e-10,0,815,3581652e-12,12934e-10,0,820,2522525e-12,9.1093e-7,0,825,1776509e-12,6.4153e-7,0,830,1251141e-12,4.5181e-7,0],vc=[3.2406,-1.5372,-.4986,-.9689,1.8758,.0415,.0557,-.204,1.057],bc={maxOzoneNumberDensity:5374e15,rayleigh:124062e-11,rayleighScaleHeight:8e3,mieScaleHeight:1200,mieAngstromAlpha:0,mieAngstromBeta:.005328,mieSingleScatteringAlbedo:.9,miePhaseFunctionG:.9,groundAlbedo:.1,numScatteringOrders:4};function Tc(e,t,a){if(a<e[0])return t[0];for(let r=0;r<e.length-1;r++)if(a<e[r+1]){let s=(a-e[r])/(e[r+1]-e[r]);return t[r]*(1-s)+t[r+1]*s}return t[t.length-1]}function wc(e,t){if(e<=pc||e>=830)return 0;let a=(e-pc)/5,r=Math.floor(a);return a-=r,xc[4*r+t]*(1-a)+xc[4*(r+1)+t]*a}function Sc(e,t,a){let r=0,s=0,i=0,n=Tc(e,t,680),l=Tc(e,t,550),o=Tc(e,t,440);for(let u=pc;u<830;u+=1){let d=wc(u,1),h=wc(u,2),m=wc(u,3),c=vc[0]*d+vc[1]*h+vc[2]*m,p=vc[3]*d+vc[4]*h+vc[5]*m,g=vc[6]*d+vc[7]*h+vc[8]*m,f=Tc(e,t,u);r+=c*f/n*Math.pow(cc(u/680),a),s+=p*f/l*Math.pow(cc(u/550),a),i+=g*f/o*Math.pow(cc(u/440),a)}return r*=683,s*=683,i*=683,[r,s,i]}var Vc=Math.PI/180;function Mc(e,t,a,r,s){return[cc(e/fc),cc(t),cc(a*fc),cc(r*fc),cc(s)]}function Rc(e){return new Float32Array([...e,...e])}var Cc=cc(Vc),zc=cc(Math.PI),kc=cc(2*Math.PI);function Ac(e,t=80){let a=cc(52*Cc),r=cc(cc(23.44)*Cc),s=cc(e%86400/86400),i=cc(r*Math.sin(cc(cc(cc(2*zc)*(t-80))/365))),n=cc(cc(s-.5)*kc),l=cc(Math.sin(a)*Math.sin(i)+Math.cos(a)*Math.cos(i)*Math.cos(n)),o=cc(1-cc(l*l)),u=cc(Math.sqrt(o>0?o:0));return[cc(u*Math.sin(n)),l,cc(u*Math.cos(n))]}var Pc=Math.fround,Ec=256;function Nc(e){return Pc(e-Math.floor(e))}function Bc(e,t,a){e=Pc(e+a),t=Pc(t+a);let r=Pc(Pc(e*Pc(127.1))+Pc(t*Pc(311.7))),s=Pc(Pc(e*Pc(269.5))+Pc(t*Pc(183.3)));return[Nc(Pc(Pc(Math.sin(r))*Pc(43758.5453123))),Nc(Pc(Pc(Math.sin(s))*Pc(43758.5453123)))]}function Lc(e,t,a){return Pc(Pc(Pc(Pc(Pc(t-e)*Pc(3-Pc(2*a)))*a)*a)+e)}var Ic=Pc(Pc(3.14159265)/2147483648);function Dc(e,t,a,r,s){let[i,n]=function(e,t,a){let r=e>>>0,s=t>>>0;r=(r^Math.imul(a,2654435761))>>>0,s=(s^Math.imul(a,2246822519))>>>0,r=Math.imul(r,3284157443)>>>0,s=(s^(r<<16|r>>>16))>>>0,s=Math.imul(s,1911520717)>>>0,r=(r^(s<<16|s>>>16))>>>0,r=Math.imul(r,2048419325)>>>0;let i=Pc(Pc(r)*Ic);return[Pc(Math.sin(i)),Pc(Math.cos(i))]}(e,t,s),l=Pc(a-e),o=Pc(r-t);return Pc(Pc(l*i)+Pc(o*n))}function Fc(e,t,a=0){let r=Math.trunc(e),s=Math.trunc(t),i=r+1,n=s+1,l=Pc(e-r),o=Pc(t-s),u=Dc(r,s,e,t,a),d=Dc(i,s,e,t,a),h=Lc(u,d,l);u=Dc(r,n,e,t,a),d=Dc(i,n,e,t,a);let m=Lc(u,d,l);return Lc(h,m,o)}function Uc(e,t,a,r=1,s=1,i=0){let n=0,l=0;for(let o=0;o<e;o++)n=Pc(n+Pc(s*Fc(Pc(t*r),Pc(a*r),i))),l=Pc(l+s),s=Pc(.5*s),r=Pc(2*r);return Pc(n/l)}function Oc(e,t,a,r=0){let s=Math.floor(e),i=Math.floor(t),n=Pc(e-s),l=Pc(t-i),o=1e9;for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let u=Pc(Pc(Pc(s+t)+a)%a),d=Pc(Pc(Pc(i+e)+a)%a),[h,m]=Bc(u,d,r),c=Pc(h+t),p=Pc(m+e),g=Pc(c-n),f=Pc(p-l),_=Pc(Math.sqrt(Pc(Pc(g*g)+Pc(f*f))));_<o&&(o=_)}return o}function Gc(e,t,a){let r=Pc(Pc(a-e)/Pc(t-e));return r<0&&(r=0),r>1&&(r=1),Pc(Pc(r*r)*Pc(3-Pc(2*r)))}function qc(e,t,a){return Pc(Pc(e*Pc(1-a))+Pc(t*a))}function Wc(e){return Math.trunc(e)>>>0}var Hc=new Float32Array(1),jc=new Uint32Array(Hc.buffer);function Kc(e){Hc[0]=e;let t=jc[0],a=t>>>16&32768,r=t>>>23&255,s=8388607&t;if(255===r)return 31744|a|(0!==s?512:0);let i=r-112;return i>=31?31744|a:i<=0?a:(a|i<<10|s>>>13)+(s>>>12&1)}var $c=new Map;function Xc(e,t){let a=`${e}|${Pc(t)}`,r=$c.get(a);if(void 0!==r)return $c.delete(a),$c.set(a,r),r;let s=function(e){let t=new Uint16Array(262144);for(let a=0;a<65536;a++)t[4*a+0]=Kc(e[3*a+0]),t[4*a+1]=Kc(e[3*a+1]),t[4*a+2]=Kc(e[3*a+2]),t[4*a+3]=15360;return t}(function(e,t){switch(t=Pc(t),e){case"clear":return new Float32Array(196608);case"mostlyClear":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,24,1,a))+.5);t[n+0]=Pc(Gc(Pc(.45),Pc(.8),l)*Pc(.7)),t[n+1]=0,t[n+2]=Pc(.3)}return t}(t);case"partlyCloudy":return function(e){let t=new Float32Array(196608),a=Pc(Math.max(1,Wc(e)));for(let r=0;r<Ec;r++)for(let s=0;s<Ec;s++){let i=Pc(r/Ec),n=Pc(s/Ec),l=3*(s*Ec+r),o=Pc(1-Oc(Pc(24*i),Pc(24*n),24,e)),u=Pc(Pc(.5*Uc(3,i,n,16,a,0))+.5),d=Pc(u*Gc(Pc(.3),1,o)),h=Pc(qc(0,Pc(.35),Gc(Pc(.1),Pc(.4),d))*o);t[l+0]=d,t[l+1]=0,t[l+2]=d<.1?0:h}return t}(t);case"mostlyCloudy":return function(e){let t=new Float32Array(196608),a=Pc(Math.max(1,Wc(e)));for(let r=0;r<Ec;r++)for(let s=0;s<Ec;s++){let i=Pc(r/Ec),n=Pc(s/Ec),l=3*(s*Ec+r),o=Pc(1-Oc(Pc(32*i),Pc(32*n),32,e)),u=Pc(Pc(.5*Uc(3,i,n,16,a,0))+.5),d=Pc(u*Gc(0,Pc(.9),o)),h=Pc(qc(0,Pc(.6),Gc(Pc(.1),Pc(.4),d))*o);t[l+0]=d,t[l+1]=0,t[l+2]=d<.1?0:h}return t}(t);case"overcast":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,16,1,a))+.5);t[n+0]=Gc(Pc(.2),1,l),t[n+1]=Pc(.3),t[n+2]=Pc(.8)}return t}(t);case"storm":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,16,1,a))+.5);t[n+0]=Gc(Pc(.1),1,l),t[n+1]=Pc(Pc(.5*Uc(2,s,i,8,1,a))+.5),t[n+2]=1}return t}(t)}}(e,t));return $c.size>=8&&$c.delete($c.keys().next().value),$c.set(a,s),s}var Qc={cirrus:"sky-cirrus.png",alto:"sky-alto.png"};async function Zc(e){let t=es(Qc[e]),a=await fetch(t,{mode:"cors"});if(!a.ok)throw new Error(`skyAssets: fetching ${t} failed (${a.status})`);return new Uint8Array(await a.arrayBuffer())}async function Yc(e){let t=512,a=await createImageBitmap(new Blob([e],{type:"image/png"}),{colorSpaceConversion:"none"}),r=new OffscreenCanvas(t,t).getContext("2d");if(!r)throw new Error("skyAssets: no 2d context for PNG decode");r.drawImage(a,0,0,t,t),a.close();let s=r.getImageData(0,0,t,t).data,i=new Uint8Array(t*t);for(let e=0;e<t;e++){let a=511-e;for(let r=0;r<t;r++)i[e*t+r]=s[4*(a*t+r)]}return i}var Jc="\nconst HDRI_PI: f32 = 3.141592653589793;\n\nfn HdriRotateByEuler(dir: vec3f, euler: vec3f) -> vec3f {\n\tlet cx = cos(euler.x); let sx = sin(euler.x);\n\tlet cy = cos(euler.y); let sy = sin(euler.y);\n\tlet cz = cos(euler.z); let sz = sin(euler.z);\n\n\tlet rot = mat3x3f(\n\t\tcy * cz, cy * sz, -sy,\n\t\tsx * sy * cz - cx * sz, sx * sy * sz + cx * cz, sx * cy,\n\t\tcx * sy * cz + sx * sz, cx * sy * sz - sx * cz, cx * cy\n\t);\n\treturn rot * dir;\n}\n\n/** Direction → equirect uv — Hana's compute_equirectangular_uvs with the v\n * term flipped for three's flipY image upload (see the header note; u is\n * Hana's exact 1 − (long + π)/2π). */\nfn HdriDirToUv(dir0: vec3f, euler: vec3f) -> vec2f {\n\tlet dir = HdriRotateByEuler(normalize(dir0), euler);\n\tlet longitude = atan2(dir.x, dir.z);\n\tlet latitude = asin(clamp(dir.y, -1.0, 1.0));\n\tlet u = 1.0 - (longitude + HDRI_PI) / (2.0 * HDRI_PI);\n\tlet v = (latitude + HDRI_PI / 2.0) / HDRI_PI;\n\treturn vec2f(u, v);\n}\n\n/** Mip level whose texel footprint covers the given angle. Used per tap by\n * HdriSampleBlurred so the gaussian rings never undersample the gaps\n * between taps (same LOD-selection idea as the reflection layer's\n * cone-width blur). 0 when the footprint is smaller than one texel. */\nfn HdriBlurLod(texWidth: f32, footprintAngle: f32) -> f32 {\n\tlet texelsPerRadian = texWidth / (2.0 * HDRI_PI);\n\treturn clamp(log2(max(footprintAngle * texelsPerRadian, 1.0)), 0.0, 16.0);\n}\n\n/** Interleaved gradient noise (Jimenez) — the same per-pixel hash family\n * the reflection layer's blur uses. Deliberately STATIC here (no frame\n * animation, no TAA reliance): the blur must look identical whether or\n * not temporal AA runs, so the dither is a fixed spatial pattern. */\nfn HdriIGN(pix: vec2f) -> f32 {\n\treturn fract(\n\t\t52.9829189 * fract(dot(pix, vec2f(0.06711056, 0.00583715))));\n}\n\n/**\n * Gaussian-blurred equirect sample: a 13-tap disc around the ray — center\n * plus two hex rings at 1σ and 2σ (σ = half the blur angle), true gaussian\n * ring weights (e^0, e^-0.5, e^-2) — with every tap reading a σ-footprint\n * mip so the rings blend seamlessly. Reads like a gaussian of ~σ instead\n * of the boxy bilinear lozenges a bare mip pick produces at large radii;\n * a mip pyramid alone is a stack of 2×2 box filters.\n *\n * jitter (x = disc rotation in radians, y = ring radius scale)\n * decorrelates the kernel per pixel: a FIXED sparse disc leaves\n * tap-replica and mip-interpolation structure — subtle bands parallel to\n * strong source edges. The background pass feeds it static per-pixel IGN\n * (structured banding becomes fine, temporally stable spatial noise —\n * deliberately NOT frame-animated, so nothing depends on TAA); the tiny\n * env re-projection passes (0, 1).\n */\nfn HdriSampleBlurred(\n\tenvTex: texture_2d<f32>, envSamp: sampler,\n\tdir: vec3f, euler: vec3f, blurAngle: f32, jitter: vec2f) -> vec3f {\n\tlet st0 = HdriDirToUv(dir, euler);\n\tif (blurAngle <= 0.0) {\n\t\treturn textureSampleLevel(envTex, envSamp, st0, 0.0).rgb;\n\t}\n\tlet sigma = blurAngle * 0.5;\n\tlet lod = HdriBlurLod(f32(textureDimensions(envTex, 0).x), sigma);\n\n\t// Tangent frame around the ray (the offsets live on its normal plane).\n\tlet axis = select(\n\t\tvec3f(0.0, 1.0, 0.0), vec3f(1.0, 0.0, 0.0), abs(dir.y) > 0.99);\n\tlet t1 = normalize(cross(axis, dir));\n\tlet t2 = cross(dir, t1);\n\n\tlet r1 = sigma * jitter.y;\n\tlet r2 = 2.0 * sigma * jitter.y;\n\tlet wRing1 = 0.60653066; // e^-0.5, taps at 1σ\n\tlet wRing2 = 0.13533528; // e^-2, taps at 2σ\n\tvar sum = textureSampleLevel(envTex, envSamp, st0, lod).rgb;\n\tvar wSum = 1.0;\n\tfor (var i = 0u; i < 6u; i = i + 1u) {\n\t\t// Ring 2 sits on the hex vertices, ring 1 on the rotated midpoints.\n\t\tlet a1 = (f32(i) + 0.5) * (HDRI_PI / 3.0) + jitter.x;\n\t\tlet d1 = normalize(dir + (t1 * cos(a1) + t2 * sin(a1)) * r1);\n\t\tsum += textureSampleLevel(\n\t\t\tenvTex, envSamp, HdriDirToUv(d1, euler), lod).rgb * wRing1;\n\t\tlet a2 = f32(i) * (HDRI_PI / 3.0) + jitter.x;\n\t\tlet d2 = normalize(dir + (t1 * cos(a2) + t2 * sin(a2)) * r2);\n\t\tsum += textureSampleLevel(\n\t\t\tenvTex, envSamp, HdriDirToUv(d2, euler), lod).rgb * wRing2;\n\t\twSum += wRing1 + wRing2;\n\t}\n\treturn sum / wSum;\n}\n",ep=64,tp=32;function ap(e){return Math.pow(e/255,2.2)}var rp=class{constructor(e,t){this._uRotation=k(new hs),this._uBlurAngle=k(0),this.backgroundMesh=null,this._envTarget=null,this._envQuad=null,this._boundTexture=null,this._lastEnvKey=null,this._sampleTexture=null,this._sourceTexture=null,this._sourceVersion=-1,this._lighting=null,this._lightingKey=null,this._active=!1,this._renderer=e,this._rays=t}get attached(){return null!=this.backgroundMesh?.parent}get active(){return this._active}get environmentTexture(){return this._envTarget?.texture??null}lightingInfo(e){let t=`${e.uuid}|${e.version}`;return t!==this._lightingKey&&(this._lightingKey=t,this._lighting=function(e){let t;if(Or(e)){let{data:a,width:r,height:s}=e;t=(e,t)=>{let i=Math.min(r-1,Math.floor((e+.5)/ep*r)),n=Math.min(s-1,Math.floor((t+.5)/tp*s)),l=4*((s-1-n)*r+i);return[Math.pow(Math.max(Rs.fromHalfFloat(a[l]),0),2.2),Math.pow(Math.max(Rs.fromHalfFloat(a[l+1]),0),2.2),Math.pow(Math.max(Rs.fromHalfFloat(a[l+2]),0),2.2)]}}else{if(typeof document>"u")return null;let a=document.createElement("canvas");a.width=ep,a.height=tp;let r,s=a.getContext("2d",{willReadFrequently:!0});if(null===s)return null;try{s.drawImage(e,0,0,ep,tp),r=s.getImageData(0,0,ep,tp).data}catch{return null}t=(e,t)=>{let a=4*(t*ep+e);return[ap(r[a]),ap(r[a+1]),ap(r[a+2])]}}let a=e=>.2126*e[0]+.7152*e[1]+.0722*e[2],r=(e,t)=>{let a=(t+.5)/tp*Math.PI,r=Math.PI-(e+.5)/ep*2*Math.PI,s=Math.sin(a);return[s*Math.sin(r),Math.cos(a),s*Math.cos(r)]},s=[0,0,0],i=[0,0,0],n=0,l=0,o=0;for(let e=0;e<tp;e++){let r=Math.sin((e+.5)/tp*Math.PI),u=e<16;for(let d=0;d<ep;d++){let h=t(d,e);o=Math.max(o,a(h));let m=u?s:i;m[0]+=h[0]*r,m[1]+=h[1]*r,m[2]+=h[2]*r,u?n+=r:l+=r}}let u=[s[0]/n,s[1]/n,s[2]/n],d=[i[0]/l,i[1]/l,i[2]/l],h=a(u),m=a(d),c=(h*n+m*l)/Math.max(n+l,1e-6),p=.9*o,g=[0,0,0],f=[0,0,0],_=0;for(let e=0;e<tp;e++){let s=Math.sin((e+.5)/tp*Math.PI);for(let i=0;i<ep;i++){let n=t(i,e),l=a(n);if(l<p)continue;let o=r(i,e),u=s*l;g[0]+=o[0]*u,g[1]+=o[1]*u,g[2]+=o[2]*u,f[0]+=n[0]*s,f[1]+=n[1]*s,f[2]+=n[2]*s,_+=s}}let y=Math.hypot(g[0],g[1],g[2]),x=_>0?[f[0]/_,f[1]/_,f[2]/_]:[1,1,1],v=a(x);return{skyColor:u,skyLum:h,groundColor:d,groundLum:m,meanLum:c,sunDir:y>1e-4?[g[0]/y,g[1]/y,g[2]/y]:[0,1,0],sunColor:x,sunLum:v,sunPeak:c>1e-6?v/c:1}}(e.image)),this._lighting}_ensureSampleTexture(e){if(null===this._sampleTexture||this._sourceTexture!==e){this._sampleTexture?.dispose();let t=Or(e.image)?Gr(e.image):new gs(e.image);t.name="sky-hdri-source",t.wrapS=Is,t.wrapT=Fs,t.minFilter=ei,t.magFilter=Zs,t.generateMipmaps=!0,t.flipY=!Or(e.image),t.needsUpdate=!0,this._sampleTexture=t,this._sourceTexture=e,this._sourceVersion=e.version}else e.version!==this._sourceVersion&&(this._sampleTexture.image=e.image,this._sampleTexture.needsUpdate=!0,this._sourceVersion=e.version);return this._sampleTexture}_buildBackgroundNode(e){return Ne("fn hdriBackground(\n\tuv: vec2f,\n\tray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f,\n\trotation: vec3f, blurAngle: f32,\n\tresolution: vec2f,\n\tenvTex: texture_2d<f32>, envSamp: sampler) -> vec4f {\n\tlet ray = normalize(\n\t\tmix(mix(ray00, ray10, uv.x), mix(ray01, ray11, uv.x), 1.0 - uv.y));\n\t// Static per-pixel disc rotation + radius scale — the hex ring is\n\t// 60°-symmetric so a third of a turn covers the full phase.\n\tlet pix = uv * resolution;\n\tlet rotJitter = HdriIGN(pix) * (HDRI_PI / 3.0);\n\tlet radJitter = 0.85 + 0.3 * HdriIGN(pix + vec2f(59.0, 37.0));\n\treturn vec4f(\n\t\tHdriSampleBlurred(\n\t\t\tenvTex, envSamp, ray, rotation, blurAngle,\n\t\t\tvec2f(rotJitter, radJitter)),\n\t\t1.0);\n}",[ke(Jc)])({uv:Vt,ray00:this._rays.ray00,ray10:this._rays.ray10,ray01:this._rays.ray01,ray11:this._rays.ray11,rotation:this._uRotation,blurAngle:this._uBlurAngle,resolution:w.resolution,envTex:Da(e),envSamp:pt(e)})}_ensureBackgroundMesh(e){if(this.backgroundMesh)return this.backgroundMesh;let t=new Ps;t.setAttribute("position",new Cs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let a=new Tt;a.name="SplineSkyHdriBackground",a.lights=!1,a.depthWrite=!1,a.depthTest=!1,a.colorNode=this._buildBackgroundNode(e);let r=Ne("fn hdriBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");a.vertexNode=r({position:ie});let s=new Us(t,a);return s.name="SplineSkyHdriBackground",s.frustumCulled=!1,s.renderOrder=-1e9,s.matrixAutoUpdate=!1,s.raycast=()=>{},this.backgroundMesh=s,s}_ensureEnvQuad(e){let t=Ne("fn hdriEnvPass(\n\tuv: vec2f,\n\trotation: vec3f, blurAngle: f32,\n\tenvTex: texture_2d<f32>, envSamp: sampler) -> vec4f {\n\tlet azimuth = (uv.x - 0.5) * 2.0 * HDRI_PI;\n\tlet latitude = (uv.y - 0.5) * HDRI_PI;\n\tlet cosLat = cos(latitude);\n\tlet rd = vec3f(cosLat * cos(azimuth), sin(latitude), cosLat * sin(azimuth));\n\treturn vec4f(\n\t\tHdriSampleBlurred(\n\t\t\tenvTex, envSamp, rd, rotation, blurAngle, vec2f(0.0, 1.0)),\n\t\t1.0);\n}",[ke(Jc)])({uv:W(),rotation:this._uRotation,blurAngle:this._uBlurAngle,envTex:Da(e),envSamp:pt(e)});if(null===this._envQuad){let e=new Tt;e.name="SplineSkyHdriEnvironmentPass",e.lights=!1,e.fragmentNode=t,this._envQuad=new qa(e)}else{let e=this._envQuad.material;e.fragmentNode=t,e.needsUpdate=!0}}_bindTexture(e){if(this._boundTexture!==e)if(this._boundTexture=e,this._ensureEnvQuad(e),this.backgroundMesh){let t=this.backgroundMesh.material;t.colorNode=this._buildBackgroundNode(e),t.needsUpdate=!0}else this._ensureBackgroundMesh(e)}update(e,t,a,r,s=!0){if(null===t)return void this.detach();this._active=!0,this._uRotation.value.set(0,a??0,0),this._uBlurAngle.value=r;let i=this._ensureSampleTexture(t);this._bindTexture(i);let n=this._ensureBackgroundMesh(i);if(null===this._envTarget){this._envTarget=new xs(256,128,{type:as,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-hdri-environment",e.generateMipmaps=!0,e.minFilter=ei,e.magFilter=Zs,e.wrapS=Is}let l=this._uRotation.value,o=`${i.uuid}|${i.version}|${l.x},${l.y},${l.z}|${r}`;if(o!==this._lastEnvKey){this._lastEnvKey=o;let e=this._renderer,t=e.getRenderTarget();e.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),e.setRenderTarget(t)}s?n.parent!==e&&(n.parent?.remove(n),e.add(n)):n.parent?.remove(n)}detach(){this._active=!1,this.backgroundMesh?.parent?.remove(this.backgroundMesh)}dispose(){this.detach(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this._envQuad=null,this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._boundTexture=null,this._sampleTexture?.dispose(),this._sampleTexture=null,this._sourceTexture=null,this._sourceVersion=-1}},sp=new Vs,ip=new us,np=new ys,lp=new ys,op={maxDistance:128,sigmaS:10,sigmaA:0,cloudLayerThickness:4,cloudLayerBottom:2,highCloudsHeight:8,highCloudsScale:32,weatherMapScale:128,baseNoiseScale:25,detailNoiseScale:1.5},up=.3,dp=.3,hp={clear:[0,0],mostlyClear:[up,dp],partlyCloudy:[up,dp],mostlyCloudy:[up,dp],overcast:[up,dp],storm:[up,dp]},mp=null;try{let e=new URLSearchParams(window.location.search).get("dbgskystep");null!==e&&""!==e&&Number.isFinite(Number(e))&&(mp=Math.max(0,Number(e)))}catch{}var cp=.62,pp={clear:1,mostlyClear:.95,partlyCloudy:.9,mostlyCloudy:.8,overcast:.6,storm:.5},gp={clear:1,mostlyClear:.92,partlyCloudy:.8,mostlyCloudy:.55,overcast:.3,storm:.15},fp={clear:1,mostlyClear:.97,partlyCloudy:.92,mostlyCloudy:.8,overcast:.65,storm:.5},_p="\n\tuv: vec2f,\n\tray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f,\n\tcameraPos: vec3f, sunDir: vec3f,\n\tsolarIrradiance: vec3f, rayleighScattering: vec3f, mieScattering: vec3f,\n\tskySrtl: vec3f, sunSrtl: vec3f, atmScalars: vec4f, muSMin: f32,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler",yp=`${_p},\n\tirradianceTex: texture_2d<f32>,\n\tbaseNoiseTex: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoiseTex: texture_3d<f32>,\n\tweatherCurTex: texture_2d<f32>, weatherSamp: sampler,\n\tweatherNextTex: texture_2d<f32>,\n\thighCloudsTex: texture_2d<f32>,\n\tcloudsParamsA: vec4f, cloudsParamsB: vec4f,\n\tcloudsParamsC: vec4f, cloudsParamsD: vec4f`,xp=class{constructor(e){this._luts=null,this._baseNoise=null,this._detailNoise=null,this._highCloudsReady=!1,this._skyTarget=null,this._cloudsTarget=null,this._skyQuad=null,this._cloudsQuad=null,this._envTarget=null,this._envQuad=null,this._lastEnvKey=null,this.backgroundMesh=null,this._hdri=null,this._uRay00=k(new hs),this._uRay10=k(new hs),this._uRay01=k(new hs),this._uRay11=k(new hs),this._uCameraPos=k(new hs(0,.1,0)),this._uSunDir=k(new hs(0,1,0)),this._uCloudsParamsC=k(new ys(op.baseNoiseScale,op.detailNoiseScale,up,dp)),this._uCloudsParamsD=k(new ys(0,1,0,0)),this._uExposure=k(5e-4),this._uGamma=k(2.2),this._uEnvCloudsOn=k(0),this._lastPage=null,this._lastVersion=-1,this._appliedWeather=null,this._appliedSeed=0,this._blendStart=0,this._blendFrom=1,this._presetFrom="partlyCloudy",this._presetTo="partlyCloudy",this._windOffsetKm=0,this._lastFrameTime=null,this._cloudsEnabled=!0,this._cloudsTargetCleared=!1,this._animating=!1,this._lastSkyPassKey=null,this._lastCloudsPassKey=null,this._sunLight=null,this._iblHdriTexture=null,this._iblRotationY=0,this._pmremBumpAt=0,this._pmremPending=!1,this._skyHemi=null,this._userAmbientSuppressed=!1,this._lightingLuts=null,this._lightingLutsRequested=!1,this._noonSunLum=0,this._noonSkyLum=0,this._noonSunRgb=null,this._lightingPage=null,this.assetsReady=Promise.resolve(),this.fixedSkySize=null,this.fixedCloudsSize=null,this.fixedTimeSeconds=null,this.numScatteringOrdersOverride=null,this.highCloudDensityOverride=null,this.minStepKmOverride=null,this._cloudsArgs=null,this._cloudsLib=null,this._renderer=e,this._atmosphereUniforms=function(e){let t=function(e){let t=[],a=[],r=[],s=[],i=[],n=[],l=[];for(let o=pc;o<=830;o+=10){let u=.001*o,d=e.mieAngstromBeta/e.mieScaleHeight*Math.pow(u,-e.mieAngstromAlpha);t.push(o),a.push(_c[(o-pc)/10]),r.push(e.rayleigh*Math.pow(u,-4)),s.push(d*e.mieSingleScatteringAlbedo),i.push(d),n.push(e.maxOzoneNumberDensity*yc[(o-pc)/10]),l.push(e.groundAlbedo)}return{wavelengths:t,solarIrradiance:a,rayleighScattering:r,mieScattering:s,mieExtinction:i,absorptionExtinction:n,groundAlbedo:l}}(e),{wavelengths:a}=t,r=Sc(a,t.solarIrradiance,-3),s=Sc(a,t.solarIrradiance,0),i=(e,t)=>[cc(Tc(a,e,680)*t),cc(Tc(a,e,550)*t),cc(Tc(a,e,440)*t)];return{solarIrradiance:i(t.solarIrradiance,1),rayleighScattering:i(t.rayleighScattering,fc),mieScattering:i(t.mieScattering,fc),mieExtinction:i(t.mieExtinction,fc),absorptionExtinction:i(t.absorptionExtinction,fc),groundAlbedo:i(t.groundAlbedo,1),skySpectralRadianceToLuminance:[cc(r[0]),cc(r[1]),cc(r[2])],sunSpectralRadianceToLuminance:[cc(s[0]),cc(s[1]),cc(s[2])],bottomRadius:6360,topRadius:6420,muSMin:cc(Math.cos(120*Vc)),sunAngularRadius:cc(gc),miePhaseG:cc(e.miePhaseFunctionG),rayleighDensity:Rc(Mc(0,1,-1/e.rayleighScaleHeight,0,0)),mieDensity:Rc(Mc(0,1,-1/e.mieScaleHeight,0,0)),absorptionDensity:new Float32Array([...Mc(25e3,0,0,1/15e3,-2/3),...Mc(0,0,0,-1/15e3,8/3)]),luminanceFromRadiance:new Float32Array([1,0,0,0,1,0,0,0,1])}}(bc);let t=e=>{let t=new js(new Uint16Array(262144),Ec,Ec,fs,as);return t.wrapS=Is,t.wrapT=Is,t.minFilter=Zs,t.magFilter=Zs,t.name=e,t.needsUpdate=!0,t};this._weatherCur=t("sky-weather-current"),this._weatherNext=t("sky-weather-next"),this._highClouds=new js(new Uint8Array(1048576),512,512,fs,ai),this._highClouds.wrapS=Is,this._highClouds.wrapT=Is,this._highClouds.minFilter=Zs,this._highClouds.magFilter=Zs,this._highClouds.name="sky-high-clouds",this._highClouds.needsUpdate=!0,this.assetsReady=async function(){let[e,t]=await Promise.all([Zc("cirrus").then(Yc),Zc("alto").then(Yc)]),a=262144,r=new Uint8Array(2*a);for(let s=0;s<a;s++)r[2*s+0]=e[s],r[2*s+1]=t[s];return r}().then(e=>{let t=this._highClouds.image.data;for(let a=0;a<e.length/2;a++)t[4*a+0]=e[2*a+0],t[4*a+1]=e[2*a+1];this._highClouds.needsUpdate=!0,this._highCloudsReady=!0},()=>{})}get attached(){return null!=this.backgroundMesh?.parent||!0===this._hdri?.active}get animationActive(){return this.attached&&(this._animating||this._pmremPending)}get luts(){return this._luts}readbackLut(e){let t=this._luts;return t?"transmittance"===e?Qm(this._renderer,t.transmittance,256,64,1,!1):"irradiance"===e?Qm(this._renderer,t.irradiance,64,16,1,!1):Qm(this._renderer,t.scattering,256,128,32,!0):Promise.reject(new Error("sky LUTs not ready"))}readbackNoise(e){let t="base"===e?this._baseNoise:this._detailNoise;if(!t)return Promise.reject(new Error("sky noise not ready"));let a="base"===e?128:32;return Qm(this._renderer,t,a,a,a,!0)}get skyTexture(){return this._skyTarget?.texture??null}get cloudsTexture(){return this._cloudsTarget?.texture??null}get environmentTexture(){return!0===this._hdri?.active?this._hdri.environmentTexture:this._envTarget?.texture??null}get iblTexture(){return null===this._lightingPage?null:!0===this._hdri?.active?this._iblHdriTexture:this._envTarget?.texture??null}get iblRotationY(){return!0===this._hdri?.active?this._iblRotationY:0}_requestEnvPmrem(e){let t=this._envTarget?.texture;void 0!==t&&(e-this._pmremBumpAt>=150?(this._pmremBumpAt=e,this._pmremPending=!1,t.needsPMREMUpdate=!0):this._pmremPending=!0)}get weatherTextureData(){return{current:this._weatherCur.image.data,next:this._weatherNext.image.data}}_ensureLuts(){this._luts||(this._luts=function(e,t,a){let r=Wm(e),s=jm(256,64,ts,"sky-lut-transmittance"),i=[jm(64,16,ts,"sky-lut-irradiance-a"),jm(64,16,ts,"sky-lut-irradiance-b")],n=[Km(256,128,32,as,"sky-lut-scattering-a",Zs),Km(256,128,32,as,"sky-lut-scattering-b",Zs)],l=jm(64,16,ts,"sky-delta-irradiance"),o=Km(256,128,32,ts,"sky-delta-rayleigh",Hs),u=Km(256,128,32,ts,"sky-delta-mie",Hs),d=Km(256,128,32,ts,"sky-delta-density",Hs),h={transmittance:Hm(e,s),irr:i.map(t=>Hm(e,t)),scat:n.map(t=>Hm(e,t)),deltaIrradiance:Hm(e,l),deltaRayleigh:Hm(e,o),deltaMie:Hm(e,u),deltaDensity:Hm(e,d)},m=h.deltaRayleigh,c=function(e){let t=new Float32Array(80),a=0,r=(e,r)=>{t[a++]=e[0],t[a++]=e[1],t[a++]=e[2],t[a++]=r};r(e.solarIrradiance,e.sunAngularRadius),r(e.rayleighScattering,e.bottomRadius),r(e.mieScattering,e.topRadius),r(e.mieExtinction,e.miePhaseG),r(e.absorptionExtinction,e.muSMin),r(e.groundAlbedo,0),r(e.skySpectralRadianceToLuminance,0),r(e.sunSpectralRadianceToLuminance,0);for(let r of[e.rayleighDensity,e.mieDensity,e.absorptionDensity])for(let e=0;e<2;e++){for(let s=0;s<5;s++)t[a++]=r[5*e+s];a+=3}return t}(t),p=r.createBuffer({label:"sky-atm-uniforms",size:c.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(p,0,c.buffer,0,c.byteLength);let g=[],f=e=>(g.push(e),(g.length-1)*$m),_=new Map;for(let[e,t]of Object.entries(Xm)){let a=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform",hasDynamicOffset:!0}}];t.entries.forEach((e,t)=>{"sampled"in e?a.push({binding:2+t,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:"unfilterable-float",viewDimension:e.sampled}}):a.push({binding:2+t,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:e.format,viewDimension:e.storage}})});let s=r.createBindGroupLayout({label:`sky-${e}-bgl`,entries:a}),i=r.createComputePipeline({label:`sky-${e}`,layout:r.createPipelineLayout({bindGroupLayouts:[s]}),compute:{module:r.createShaderModule({label:`sky-${e}-wgsl`,code:t.code}),entryPoint:"main"}});_.set(e,{pipeline:i,layout:s})}let y=[],x=0,v=0,b=(e,t)=>[e/8,t/8,1];y.push([{kernel:"transmittance",textures:[h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:b(256,64)}]),y.push([{kernel:"directIrradiance",textures:[h.irr[x],h.irr[1-x],h.deltaIrradiance,h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:b(64,16)}]),x=1-x;{let e=[];for(let t=0;t<32;t++)e.push({kernel:"singleScattering",textures:[h.deltaRayleigh,h.deltaMie,h.scat[v],h.scat[1-v],h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:t,scatteringOrder:0}),groups:b(256,128)});y.push(e),v=1-v}for(let e=2;e<=a;e++){{let t=[];for(let a=0;a<32;a++)t.push({kernel:"scatteringDensity",textures:[h.deltaDensity,h.transmittance,h.deltaRayleigh,h.deltaMie,m,h.deltaIrradiance],slotOffset:f({blend:[0,0,0,0],layer:a,scatteringOrder:e}),groups:b(256,128)});y.push(t)}y.push([{kernel:"indirectIrradiance",textures:[h.deltaIrradiance,h.irr[x],h.irr[1-x],h.deltaRayleigh,h.deltaMie,m],slotOffset:f({blend:[0,1,0,0],layer:0,scatteringOrder:e-1}),groups:b(64,16)}]),x=1-x;{let t=[];for(let a=0;a<32;a++)t.push({kernel:"multipleScattering",textures:[m,h.scat[v],h.scat[1-v],h.transmittance,h.deltaDensity],slotOffset:f({blend:[0,1,0,0],layer:a,scatteringOrder:e}),groups:b(256,128)});y.push(t),v=1-v}}let T=new Float32Array(g.length*$m/4);g.forEach((e,t)=>function(e,t,a){let r=t;e[r+0]=1,e[r+5]=1,e[r+10]=1,e[r+12]=a.blend[0],e[r+13]=a.blend[1],e[r+14]=a.blend[2],e[r+15]=a.blend[3],new Int32Array(e.buffer,e.byteOffset+4*(r+16),2).set([a.layer,a.scatteringOrder])}(T,t*$m/4,e));let w=r.createBuffer({label:"sky-pass-params",size:T.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(w,0,T.buffer,0,T.byteLength);let S=new Map,V=e=>{let t=S.get(e);return t||(t=e.createView({mipLevelCount:1}),S.set(e,t)),t};for(let e of y){let t=r.createCommandEncoder({label:"sky-precompute"}),a=t.beginComputePass();for(let t of e){let{pipeline:e,layout:s}=_.get(t.kernel),i=[{binding:0,resource:{buffer:p}},{binding:1,resource:{buffer:w,size:$m}}];t.textures.forEach((e,t)=>{i.push({binding:2+t,resource:V(e)})});let n=r.createBindGroup({layout:s,entries:i});a.setPipeline(e),a.setBindGroup(0,n,[t.slotOffset]),a.dispatchWorkgroups(...t.groups)}a.end(),r.queue.submit([t.finish()])}let M=i[x],R=n[v],C=[i[1-x],n[1-v],l,o,u,d];for(let e of C)e.dispose();return p.destroy(),w.destroy(),{transmittance:s,scattering:R,irradiance:M,dispose(){s.dispose(),R.dispose(),M.dispose()}}}(this._renderer,this._atmosphereUniforms,this.numScatteringOrdersOverride??bc.numScatteringOrders))}_ensureNoise(){if(this._baseNoise)return;let e=this._renderer.backend.device;if(!e)throw new Error("[spline/sky] WebGPU device unavailable");let t=(e,t)=>{let a=new H(e,e,e);return a.type=as,a.minFilter=Zs,a.magFilter=Zs,a.wrapS=Is,a.wrapT=Is,a.wrapR=Is,a.generateMipmaps=!1,a.mipmapsAutoUpdate=!1,a.name=t,a};this._baseNoise=t(128,"sky-base-noise"),this._detailNoise=t(32,"sky-detail-noise");let a=(t,a,r)=>{this._renderer.initTexture(a);let s=this._renderer.backend.get(a).texture,i=e.createShaderModule({code:t}),n=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba16float",viewDimension:"3d"}}]}),l=e.createComputePipeline({layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:i,entryPoint:"main"}}),o=e.createCommandEncoder({label:"sky-noise"}),u=o.beginComputePass();u.setPipeline(l),u.setBindGroup(0,e.createBindGroup({layout:n,entries:[{binding:0,resource:s.createView({mipLevelCount:1})}]}));let d=r/4;u.dispatchWorkgroups(d,d,d),u.end(),e.queue.submit([o.finish()])};a(hc,this._baseNoise,128),a(mc,this._detailNoise,32)}_atmArgs(){let e=this._atmosphereUniforms;return{solarIrradiance:k(new hs(...e.solarIrradiance)),rayleighScattering:k(new hs(...e.rayleighScattering)),mieScattering:k(new hs(...e.mieScattering)),skySrtl:k(new hs(...e.skySpectralRadianceToLuminance)),sunSrtl:k(new hs(...e.sunSpectralRadianceToLuminance)),atmScalars:k(new ys(e.sunAngularRadius,e.bottomRadius,e.topRadius,e.miePhaseG)),muSMin:k(e.muSMin)}}_ensurePasses(){if(this._skyQuad)return;this._ensureLuts(),this._ensureNoise();let e=this._luts,t={uv:W(),ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11,cameraPos:this._uCameraPos,sunDir:this._uSunDir,...this._atmArgs(),transmittanceTex:Da(e.transmittance),scatteringTex:Ga(e.scattering),scatteringSamp:pt(e.scattering)},a=ke(Lm+ic),r=Ne(`fn skyPass(${_p}) -> vec4f {${nc}}`,[a]),s=new Tt;s.name="SplineSkyPass",s.lights=!1,s.fragmentNode=r(t),this._skyQuad=new qa(s);let i=ke(Lm+ic+"\nfn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 {\n\treturn min2 + (value - min1) * (max2 - min2) / (max1 - min1);\n}\n\nfn saturateF(x: f32) -> f32 {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nfn triplanarSample(\n\tt: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f {\n\tvar blend = abs(n);\n\tblend = pow(blend, vec3f(4.0));\n\tblend /= dot(blend, vec3f(1.0));\n\n\tlet cx = textureSampleLevel(t, s, p.yz * scale, 0.0);\n\tlet cy = textureSampleLevel(t, s, p.xz * scale, 0.0);\n\tlet cz = textureSampleLevel(t, s, p.xy * scale, 0.0);\n\n\treturn cx * blend.x + cy * blend.y + cz * blend.z;\n}\n\n/** Weight below which a triplanar axis is dropped instead of sampled.\n *\n * The weights are normalized pow(|n|, 4). Inside the cloud shell n is the\n * planet's up vector at the sample, and the march reaches at most\n * CLOUDS_PARAMS.maxDistance (128 km) over a 6360 km radius: |n.x| and |n.z|\n * stay under sin(128 / 6363) = 0.021, so their weights stay under 2e-7 —\n * four orders of magnitude under the fp16 quantum of the [0, 1] weather\n * channels they scale. The threshold sits well above that worst case on\n * purpose: it keeps the branch UNIFORM across the pass (every ray in the\n * layer drops the same two axes) instead of flickering per texel, and it\n * bounds the error at one threshold per dropped axis. */\nconst TRIPLANAR_WEIGHT_EPS: f32 = 1.0e-5;\n\n/**\n * triplanarSample with negligible axes skipped — three texture samples down\n * to one for any sample inside the cloud shell. This is the hot one: the\n * weather map is read once per density sample (twice mid-transition) and there\n * are up to seven density samples per lit step, so between this and the blend\n * branch below the weather taps go from six per density sample to one. When\n * all three axes clear the threshold the accumulation matches triplanarSample\n * exactly (adding into a zero-initialized vec4 is exact).\n */\nfn triplanarSampleAdaptive(\n\tt: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f {\n\tvar blend = abs(n);\n\tblend = pow(blend, vec3f(4.0));\n\tblend /= dot(blend, vec3f(1.0));\n\n\tvar c = vec4f(0.0);\n\tif (blend.x > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.yz * scale, 0.0) * blend.x;\n\t}\n\tif (blend.y > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.xz * scale, 0.0) * blend.y;\n\t}\n\tif (blend.z > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.xy * scale, 0.0) * blend.z;\n\t}\n\treturn c;\n}\n\nfn raySphereIntersectFar(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 {\n\tlet a = dot(rd, rd);\n\tlet s0_r0 = r0 - s0;\n\tlet b = 2.0 * dot(rd, s0_r0);\n\tlet c = dot(s0_r0, s0_r0) - (sr * sr);\n\n\tlet d = b * b - 4.0 * a * c;\n\tif (d < 0.0) {\n\t\treturn -1.0;\n\t}\n\n\treturn (-b + sqrt(d)) / (2.0 * a);\n}\n\nfn raySphereIntersect(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 {\n\tlet a = dot(rd, rd);\n\tlet s0_r0 = r0 - s0;\n\tlet b = 2.0 * dot(rd, s0_r0);\n\tlet c = dot(s0_r0, s0_r0) - (sr * sr);\n\n\tlet d = b * b - 4.0 * a * c;\n\tif (d < 0.0) {\n\t\treturn -1.0;\n\t}\n\n\tlet sqrtD = sqrt(d);\n\n\tlet t0 = (-b - sqrtD) / (2.0 * a);\n\tif (t0 > 0.0) {\n\t\treturn t0;\n\t}\n\n\tlet t1 = (-b + sqrtD) / (2.0 * a);\n\tif (t1 > 0.0) {\n\t\treturn t1;\n\t}\n\n\treturn -1.0;\n}\n\nconst CLOUD_RAY_STEPS: i32 = 160;\nconst LIGHT_RAY_STEPS: i32 = 6;\n\nconst cirrusSpeedFactor: f32 = 3.5;\nconst altoSpeedFactor: f32 = 2.0;\nconst detailStrength: f32 = 0.1;\nconst CLOUD_EPS: f32 = 1e-5;\n\nstruct CloudsCtx {\n\tmaxDistance: f32,\n\tsigmaS: f32,\n\tsigmaA: f32,\n\tcloudLayerThickness: f32,\n\tcloudLayerBottom: f32,\n\thighCloudsHeight: f32,\n\thighCloudsScale: f32,\n\tweatherMapScale: f32,\n\tbaseNoiseScale: f32,\n\tdetailNoiseScale: f32,\n\tcirrusDensity: f32,\n\taltoDensity: f32,\n\twindSpeed: f32,\n\tweatherMapBlend: f32,\n\ttime: f32,\n\t/** Floor on the march step length, km. 0 = the reference's fixed\n\t * CLOUD_RAY_STEPS division of the span (see RaymarchVolumetricCloud). */\n\tminStep: f32,\n\tsigmaT: f32,\n\tfogFactor: f32,\n\tbottomRadius: f32,\n\tsunDir: vec3f,\n\tearthCenter: vec3f,\n}\n\nfn HenyeyGreenstein(g: f32, costh: f32) -> f32 {\n\treturn (1.0 - g * g) / (4.0 * PI * pow(1.0 + g * g - 2.0 * g * costh, 1.5));\n}\n\nfn HeightGradient(h: f32, cloudType: f32) -> f32 {\n\tlet stratus = smoothstepGl(0.0, 0.07, h) * smoothstepGl(0.2, 0.07, h);\n\tlet cumulus = smoothstepGl(0.0, 0.2, h) * smoothstepGl(0.65, 0.35, h);\n\tlet cumulonimbus = smoothstepGl(0.0, 0.1, h) * smoothstepGl(0.95, 0.4, h);\n\n\tlet a = 1.0 - cloudType;\n\tlet wS = a * a;\n\tlet wCu = 2.0 * cloudType * a;\n\tlet wCb = cloudType * cloudType;\n\n\treturn wS * stratus + wCu * cumulus + wCb * cumulonimbus;\n}\n\nfn SampleDensity(\n\tctx: CloudsCtx,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tpos: vec3f) -> f32 {\n\tlet heightFraction = (length(pos - ctx.earthCenter) - ctx.bottomRadius - ctx.cloudLayerBottom) /\n\t\tctx.cloudLayerThickness;\n\tif (heightFraction < 0.0 || heightFraction > 1.0) {\n\t\treturn 0.0;\n\t}\n\n\tlet n = normalize(pos - ctx.earthCenter);\n\t// triplanar fixes 2d texture stretching on sphere\n\tlet weatherPos = pos + ctx.time * ctx.windSpeed;\n\tlet weatherScale = 1.0 / ctx.weatherMapScale;\n\t// The blend sits pinned at 1 except during the 2 s preset transition, and\n\t// mix(a, b, 1) is b — so outside a transition the \"current\" map's taps are\n\t// dead weight on every density sample. The blend is a uniform, so this\n\t// branch is coherent across the whole pass; a driver cannot fold it away\n\t// on its own. (At the endpoints the result differs from the mix by at most\n\t// one ulp, and only if the implementation lowers mix to an fma.)\n\tvar weather: vec3f;\n\tif (ctx.weatherMapBlend >= 1.0) {\n\t\tweather = triplanarSampleAdaptive(nextWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t} else if (ctx.weatherMapBlend <= 0.0) {\n\t\tweather = triplanarSampleAdaptive(currentWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t} else {\n\t\tlet weather0 = triplanarSampleAdaptive(currentWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t\tlet weather1 = triplanarSampleAdaptive(nextWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t\tweather = mix(weather0, weather1, ctx.weatherMapBlend);\n\t}\n\n\tlet coverage = weather.r;\n\tlet precipitation = weather.g;\n\tlet cloudType = weather.b;\n\tlet heightGradient = HeightGradient(heightFraction, cloudType);\n\n\t// Zero coverage: the reference's remap below divides by zero and the\n\t// resulting NaN dies in GLSL's NaN-hostile clamp/compares (density 0).\n\t// WGSL's min/max SWALLOW NaN — saturate(NaN) becomes 1.0, a full-density\n\t// phantom cloud — so the \"no coverage, no cloud\" outcome is made\n\t// explicit here instead of riding on NaN semantics.\n\t// (Negated form so NaN coverage — the upstream partlyCloudy/seed-0\n\t// weather-map quirk — also lands here instead of resurrecting.)\n\tif (!(coverage > 0.0)) {\n\t\treturn 0.0;\n\t}\n\n\t// === base form ===\n\tlet base_uv = pos / ctx.baseNoiseScale + ctx.time * ctx.windSpeed / ctx.baseNoiseScale;\n\tlet baseN = textureSampleLevel(baseNoise, noiseSamp, base_uv, 0.0);\n\tlet lowFBM = baseN.g * 0.625 + baseN.b * 0.25 + baseN.a * 0.125;\n\tvar baseCloud = remap(baseN.r, -(1.0 - lowFBM), 1.0, 0.0, 1.0);\n\n\t// === compose ===\n\tbaseCloud = remap(baseCloud, 1.0 - coverage, 1.0, 0.0, 1.0);\n\tbaseCloud *= coverage;\n\tbaseCloud *= heightGradient;\n\n\tif (baseCloud < 0.0) {\n\t\treturn 0.0;\n\t}\n\n\t// === details ===\n\tlet detail_uv = pos / ctx.detailNoiseScale + ctx.time * ctx.windSpeed / ctx.detailNoiseScale;\n\tlet detailN = textureSampleLevel(detailNoise, noiseSamp, detail_uv, 0.0).rgb;\n\tlet detailFBM = dot(detailN, vec3f(0.625, 0.25, 0.125));\n\tlet detailCloud = remap(baseCloud, detailFBM * detailStrength, 1.0, 0.0, 1.0);\n\n\t// Detail erosion can push detailCloud negative; pow(<0, e) is NaN and\n\t// WGSL's NaN-swallowing saturate below would resurrect it to FULL\n\t// density (the GLSL NaN dies in the reference's clamp/compares —\n\t// effective density 0). Negated compare so NaN input lands here too.\n\tif (!(detailCloud > 0.0)) {\n\t\treturn 0.0;\n\t}\n\n\tlet density = pow(detailCloud, mix(1.0, 0.5, precipitation));\n\n\treturn saturateF(density);\n}\n\nconst SCATTERING_OCTAVES: i32 = 4;\n\n/**\n * The per-octave phase terms of MultipleOctaveScattering.\n *\n * They depend only on mu (the view/sun cosine) and a fixed geometric\n * sequence — nothing that varies along a ray. The reference nonetheless\n * recomputes all eight Henyey-Greenstein lobes, each with a pow, inside the\n * light march: once per LIT step, up to CLOUD_RAY_STEPS times per pixel.\n * Hoisted to once per pixel here; same values, same order, so the sum below\n * is bit-identical.\n */\nfn OctaveScatteringPhases(mu: f32) -> vec4f {\n\tlet phaseAttenuation = 0.2;\n\n\tvar c: f32 = 1.0;\n\tvar phases = vec4f(0.0);\n\n\tfor (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) {\n\t\tphases[i] = mix(\n\t\t\tHenyeyGreenstein(-0.2 * c, mu), HenyeyGreenstein(0.8 * c, mu), 0.3);\n\t\tc *= phaseAttenuation;\n\t}\n\n\treturn phases;\n}\n\nfn MultipleOctaveScattering(\n\tctx: CloudsCtx, density: f32, phases: vec4f) -> f32 {\n\tlet attenuation = 0.5;\n\tlet contribution = 0.6;\n\n\tvar a: f32 = 1.0;\n\tvar b: f32 = 1.0;\n\n\tvar luminance: f32 = 0.0;\n\n\tfor (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) {\n\t\tluminance += b * phases[i] * exp(-ctx.sigmaT * density * a);\n\n\t\ta *= attenuation;\n\t\tb *= contribution;\n\t}\n\n\treturn luminance;\n}\n\nfn IntersectCloudLayer(\n\tctx: CloudsCtx, ro: vec3f, rd: vec3f,\n\ttEnter: ptr<function, f32>, tExit: ptr<function, f32>) -> bool {\n\tlet innerRadius = ctx.bottomRadius + ctx.cloudLayerBottom;\n\tlet outerRadius = ctx.bottomRadius + ctx.cloudLayerBottom + ctx.cloudLayerThickness;\n\n\tlet tInnerNear = raySphereIntersect(ro, rd, ctx.earthCenter, innerRadius);\n\tlet tInnerFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, innerRadius);\n\tlet tOuterNear = raySphereIntersect(ro, rd, ctx.earthCenter, outerRadius);\n\tlet tOuterFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, outerRadius);\n\n\tlet distToCenter = length(ro - ctx.earthCenter);\n\n\tif (distToCenter < innerRadius) { // cam below layer\n\t\t*tEnter = tInnerFar;\n\t\t*tExit = tOuterFar;\n\t} else if (distToCenter < outerRadius) { // cam inside layer\n\t\t*tEnter = 0.0;\n\t\tif (tInnerNear > 0.0) {\n\t\t\t*tExit = tInnerNear;\n\t\t} else {\n\t\t\t*tExit = tOuterFar;\n\t\t}\n\t} else { // cam above layer\n\t\tif (tOuterNear < 0.0) {\n\t\t\treturn false;\n\t\t}\n\t\t*tEnter = tOuterNear;\n\t\tif (tInnerNear > 0.0) {\n\t\t\t*tExit = tInnerNear;\n\t\t} else {\n\t\t\t*tExit = tOuterFar;\n\t\t}\n\t}\n\n\tif (*tExit < 0.0 || *tEnter >= *tExit) {\n\t\treturn false;\n\t}\n\n\t*tEnter = max(*tEnter, 0.0);\n\treturn true;\n}\n\nfn ComputeLightVisibility(\n\tctx: CloudsCtx,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tpos: vec3f, lightDir: vec3f, phases: vec4f) -> f32 {\n\tvar tLightEnter: f32;\n\tvar tLightExit: f32;\n\tif (!IntersectCloudLayer(ctx, pos, lightDir, &tLightEnter, &tLightExit)) {\n\t\treturn 0.0;\n\t}\n\n\ttLightExit = min(tLightExit, ctx.cloudLayerThickness * 1.0);\n\n\tlet dt = (tLightExit - tLightEnter) / f32(LIGHT_RAY_STEPS);\n\tlet startPos = pos + lightDir * tLightEnter;\n\tvar d: f32 = 0.0;\n\n\tfor (var i: i32 = 0; i < LIGHT_RAY_STEPS; i++) {\n\t\td += SampleDensity(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap,\n\t\t\tstartPos + lightDir * dt * f32(i));\n\t}\n\td *= dt;\n\n\treturn MultipleOctaveScattering(ctx, d, phases);\n}\n\nfn RaymarchVolumetricCloud(\n\tctx: CloudsCtx, atm: Atm,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler,\n\tirradianceTex: texture_2d<f32>,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tro: vec3f, rd: vec3f) -> vec4f {\n\tvar tEnter: f32;\n\tvar tExit: f32;\n\n\tif (!IntersectCloudLayer(ctx, ro, rd, &tEnter, &tExit)) {\n\t\treturn vec4f(0.0);\n\t}\n\n\ttExit = min(tExit, ctx.maxDistance);\n\tlet span = tExit - tEnter;\n\n\t// The reference always divides the span into CLOUD_RAY_STEPS, so the step\n\t// length swings with the ray's elevation: a near-vertical ray crosses the\n\t// 4 km shell in 25 m steps — 8x finer than the 195 m base-noise texel it is\n\t// sampling, so runs of those samples re-read one texel — while a grazing\n\t// 128 km ray gets 800 m and is the case the step budget is actually FOR. A\n\t// floor on the step length spends the full budget on the grazing rays and\n\t// stops over-marching the steep ones. ctx.minStep = 0 reproduces the\n\t// reference exactly (?dbgskystep=0, and CI pins it via minStepKmOverride);\n\t// see MIN_MARCH_STEP_KM for the measured cost/benefit.\n\tlet refDt = span / f32(CLOUD_RAY_STEPS);\n\tlet dt = max(refDt, ctx.minStep);\n\tlet steps = select(\n\t\tmin(CLOUD_RAY_STEPS, i32(ceil(span / dt))),\n\t\tCLOUD_RAY_STEPS,\n\t\tctx.minStep <= 0.0);\n\n\tvar t = max(tEnter, 0.0);\n\tvar pos = ro + rd * t;\n\n\tvar radiance = vec3f(0.0);\n\tvar totalTransmittance = vec3f(1.0);\n\n\tlet mu = dot(rd, ctx.sunDir);\n\tlet horizDist = length(pos - ro);\n\t// Loop-invariant for the whole march (see OctaveScatteringPhases).\n\tlet phases = OctaveScatteringPhases(mu);\n\n\tvar sky_transmittance: vec3f;\n\tvar sunLight: vec3f;\n\tvar skyIrradiance: vec3f;\n\n\tfor (var i: i32 = 0; i < steps; i++) {\n\t\tif (t > tExit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tpos = ro + rd * t;\n\n\t\tif (horizDist * horizDist > ctx.maxDistance * ctx.maxDistance) {\n\t\t\tbreak;\n\t\t}\n\n\t\tlet density = SampleDensity(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap, pos);\n\n\t\tif (density > 0.0) {\n\t\t\t// get lightning — only the sun-ward transmittance and the sky\n\t\t\t// irradiance are read, so both lookups take the halved variants\n\t\t\t// (same values, see GetSkyTransmittance / GetSkyIrradianceLum).\n\t\t\tsky_transmittance = GetSkyTransmittance(\n\t\t\t\tatm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir);\n\t\t\tskyIrradiance = GetSkyIrradianceLum(atm, irradianceTex,\n\t\t\t\tpos - ctx.earthCenter, normalize(pos - ctx.earthCenter), ctx.sunDir);\n\t\t\tsunLight = sky_transmittance * atm.sun_spectral_radiance_to_luminance;\n\t\t\t// night\n\t\t\tskyIrradiance = max(vec3f(10.0), skyIrradiance);\n\t\t\tsunLight = max(vec3f(100.0), sunLight);\n\n\t\t\tlet vis = ComputeLightVisibility(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap, pos, ctx.sunDir,\n\t\t\t\tphases);\n\n\t\t\tlet sampleSigmaS = ctx.sigmaS * density;\n\t\t\tlet sampleSigmaT = max(ctx.sigmaT * density, CLOUD_EPS);\n\n\t\t\tlet powder = exp(-density * sampleSigmaT);\n\t\t\tlet powderEffect = mix(1.0, powder, smoothstepGl(0.5, -0.5, mu));\n\t\t\tvar inscatter = (sunLight * vis + skyIrradiance) * sampleSigmaS;\n\t\t\tinscatter *= powderEffect;\n\n\t\t\tlet transmittance = exp(-sampleSigmaT * dt);\n\n\t\t\t// Energy conserving\n\t\t\tradiance += totalTransmittance * (inscatter - inscatter * transmittance) / sampleSigmaT;\n\t\t\ttotalTransmittance *= transmittance;\n\n\t\t\tif (length(totalTransmittance) <= 0.1) {\n\t\t\t\ttotalTransmittance = vec3f(0.0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tt += dt;\n\t}\n\n\t// Convert transmittance to alpha\n\tlet alpha = 1.0 - dot(totalTransmittance, vec3f(0.2126, 0.7152, 0.0722));\n\n\tlet fog = exp(-horizDist / ctx.fogFactor); // ! hack probably should use bruneton transmittance\n\n\treturn vec4f(radiance, alpha) * fog;\n}\n\n// High-altitude clouds (above the volumetric) 2D\nfn HighAltitudeCloud(\n\tctx: CloudsCtx, atm: Atm,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler,\n\thighCloudsMap: texture_2d<f32>, weatherSamp: sampler,\n\tro: vec3f, rd: vec3f) -> vec4f {\n\tif (abs(rd.y) < CLOUD_EPS) {\n\t\treturn vec4f(0.0);\n\t}\n\n\tvar result = vec4f(0.0);\n\n\tlet t = raySphereIntersect(ro, rd, ctx.earthCenter, ctx.bottomRadius + ctx.highCloudsHeight);\n\tif (t < 0.0) {\n\t\treturn result;\n\t}\n\n\tlet pos = ro + rd * t;\n\tlet normal = normalize(pos - ctx.earthCenter);\n\tlet mu = dot(-rd, ctx.sunDir);\n\tlet phase = mix(HenyeyGreenstein(-0.1, mu), HenyeyGreenstein(0.2, mu), 0.2);\n\n\t// Sun-ward: transmittance only (the radiance return was discarded).\n\tlet trans = GetSkyTransmittance(\n\t\tatm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir);\n\tlet sunLight = trans * atm.sun_spectral_radiance_to_luminance;\n\tvar zenithTrans: vec3f;\n\tlet skyLight = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex, scatteringSamp,\n\t\tpos - ctx.earthCenter, vec3f(0.0, 1.0, 0.0), 0.0, ctx.sunDir, &zenithTrans);\n\n\tlet scatter = sunLight * phase + skyLight;\n\n\t// === Cirrus (R) ===\n\tlet cirrusDensity = triplanarSample(highCloudsMap, weatherSamp,\n\t\tpos + ctx.time * ctx.windSpeed * cirrusSpeedFactor, normal,\n\t\t1.0 / ctx.highCloudsScale).r;\n\n\tif (cirrusDensity > CLOUD_EPS) {\n\t\tlet alpha = cirrusDensity * ctx.cirrusDensity;\n\t\tresult = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha,\n\t\t\tresult.a + (1.0 - result.a) * alpha);\n\t}\n\n\t// === Alto (G) ===\n\tlet altoDensity = triplanarSample(highCloudsMap, weatherSamp,\n\t\tpos + ctx.time * ctx.windSpeed * altoSpeedFactor, normal,\n\t\t1.0 / ctx.highCloudsScale).g;\n\n\tif (altoDensity > CLOUD_EPS) {\n\t\tlet alpha = altoDensity * ctx.altoDensity;\n\t\tresult = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha,\n\t\t\tresult.a + (1.0 - result.a) * alpha);\n\t}\n\n\tlet fog = exp(-length((ro + rd * t) - ro) / ctx.fogFactor);\n\treturn result * fog;\n}\n"),n=Ne(`fn cloudsPass(${yp}) -> vec4f {${oc}}`,[i]),l=op,o={...t,irradianceTex:Da(e.irradiance),baseNoiseTex:Ga(this._baseNoise),noiseSamp:pt(this._baseNoise),detailNoiseTex:Ga(this._detailNoise),weatherCurTex:Da(this._weatherCur),weatherSamp:pt(this._weatherCur),weatherNextTex:Da(this._weatherNext),highCloudsTex:Da(this._highClouds),cloudsParamsA:k(new ys(l.maxDistance,l.sigmaS,l.sigmaA,l.cloudLayerThickness)),cloudsParamsB:k(new ys(l.cloudLayerBottom,l.highCloudsHeight,l.highCloudsScale,l.weatherMapScale)),cloudsParamsC:this._uCloudsParamsC,cloudsParamsD:this._uCloudsParamsD},u=new Tt;u.name="SplineSkyCloudsPass",u.lights=!1,u.fragmentNode=n(o),this._cloudsQuad=new qa(u),this._cloudsArgs=o,this._cloudsLib=i}_ensureEnvPass(){if(this._envQuad)return;this._ensurePasses();let e=Ne(`fn skyEnvPass(${yp},\n\texposure: f32, gamma: f32, cloudsOn: f32) -> vec4f {${uc}}`,[ke(dc),this._cloudsLib]),t=new Tt;t.name="SplineSkyEnvironmentPass",t.lights=!1,t.fragmentNode=e({...this._cloudsArgs,exposure:this._uExposure,gamma:this._uGamma,cloudsOn:this._uEnvCloudsOn}),this._envQuad=new qa(t)}_ensureBackgroundMesh(e,t){if(this.backgroundMesh)return this.backgroundMesh;let a=new Ps;a.setAttribute("position",new Cs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let r=new Tt;r.name="SplineSkyBackground",r.lights=!1,r.depthWrite=!1,r.depthTest=!1,r.colorNode=this._buildComposeNode(e,t);let s=Ne("fn skyBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");r.vertexNode=s({position:ie});let i=new Us(a,r);return i.name="SplineSkyBackground",i.frustumCulled=!1,i.renderOrder=-1e9,i.matrixAutoUpdate=!1,i.raycast=()=>{},this.backgroundMesh=i,i}_syncState(e){let t=e.skyState,a=e!==this._lastPage;if(!a&&e.skyStateVersion===this._lastVersion)return;this._lastPage=e,this._lastVersion=e.skyStateVersion;let r=t.weather;if(r!==this._appliedWeather||t.seed!==this._appliedSeed||a){let e=Xc(r,t.seed);if(null===this._appliedWeather||a)this._weatherCur.image.data.set(e),this._weatherNext.image.data.set(e),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendFrom=1,this._blendStart=0,this._presetFrom=r,this._presetTo=r;else{let t=this._weatherCur.image.data,a=this._weatherNext.image.data;t.set(a),a.set(e),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendStart=performance.now(),this._blendFrom=0,this._presetFrom=this._presetTo,this._presetTo=r}this._appliedWeather=r,this._appliedSeed=t.seed}this._uExposure.value=5e-4*t.exposure,this._cloudsEnabled=t.clouds}_cornerRay(e,t,a,r){let s=np.set(e,t,-1,1).applyMatrix4(a.projectionMatrixInverse);return this._eyeRayToWorld(s.x,s.y,a,r)}_eyeRayToWorld(e,t,a,r){let s=lp.set(e,t,-1,0).applyMatrix4(a.matrixWorld);return r.set(s.x,s.y,s.z).normalize()}_updateCornerRays(e,t){let a=e;if(-1!==e.projectionMatrix.elements[11]){let r="number"==typeof a.fov&&a.fov>0?a.fov:45,s=Math.tan(r*Math.PI/360),i=s*t;return this._eyeRayToWorld(-i,-s,e,this._uRay00.value),this._eyeRayToWorld(i,-s,e,this._uRay10.value),this._eyeRayToWorld(-i,s,e,this._uRay01.value),void this._eyeRayToWorld(i,s,e,this._uRay11.value)}this._cornerRay(-1,-1,e,this._uRay00.value),this._cornerRay(1,-1,e,this._uRay10.value),this._cornerRay(-1,1,e,this._uRay01.value),this._cornerRay(1,1,e,this._uRay11.value)}update(e,t){if("hdri"===e.skyState?.mode)return void this._updateHdri(e,t,e.skyState);!0===this._hdri?.active&&this._hdri.detach(),this._ensurePasses(),this._syncState(e);let a=e.skyState,r=performance.now(),s=null===this._lastFrameTime?0:(r-this._lastFrameTime)/1e3;this._lastFrameTime=r;let i=a.animateWind&&!0===this._renderer.skyAnimationAllowed&&null===this.fixedTimeSeconds;i&&(this._windOffsetKm+=a.windSpeed/1e3*300*Math.min(s,.25));let n=this.fixedTimeSeconds??3600*a.timeOfDay,l=Ac(n);this._uSunDir.value.set(l[0],l[1],l[2]);let o=1;this._blendStart>0&&(o=Math.min(1,this._blendFrom+(r-this._blendStart)/1e3/2),o>=1&&(this._blendStart=0));let u=this.minStepKmOverride??mp??.05;null!==this.fixedTimeSeconds?this._uCloudsParamsD.value.set(a.windSpeed/1e3,o,this.fixedTimeSeconds,u):this._uCloudsParamsD.value.set(1,o,this._windOffsetKm,u);let d=this.highCloudDensityOverride,h=hp[this._presetFrom],m=hp[this._presetTo];this._uCloudsParamsC.value.set(op.baseNoiseScale,op.detailNoiseScale,null!==d?d[0]:h[0]+(m[0]-h[0])*o,null!==d?d[1]:h[1]+(m[1]-h[1])*o),this._animating=this._cloudsEnabled&&(this._blendStart>0||i&&0!==a.windSpeed),!0===a.lighting?(this._ensureLightingLuts(),this._updateLighting(e,o,a.exposure,a.lightingIntensity??1)):null!==this._lightingPage&&this._teardownLighting();let c=this._renderer.getDrawingBufferSize(ip);this._updateCornerRays(t,c.y>0?c.x/c.y:1);let p=Math.max(1,Math.round(this.fixedSkySize?.x??c.x)),g=Math.max(1,Math.round(this.fixedSkySize?.y??c.y)),f=Math.max(1,Math.round(this.fixedCloudsSize?.x??c.x/4)),_=Math.max(1,Math.round(this.fixedCloudsSize?.y??c.y/4)),y=(e,t,a,r)=>{if(e&&e.width===t&&e.height===a)return e;void 0!==this._renderer.retireRenderTarget?this._renderer.retireRenderTarget(e):e?.dispose();let s=new xs(t,a,{type:as,depthBuffer:!1});return s.texture.name=r,s},x=this._skyTarget,v=this._cloudsTarget;this._skyTarget=y(this._skyTarget,p,g,"sky-pass"),this._cloudsTarget=y(this._cloudsTarget,f,_,"sky-clouds-pass"),v!==this._cloudsTarget&&(this._cloudsTargetCleared=!1);let b=this._renderer,T=b.getRenderTarget(),w=this._uCloudsParamsD.value,S=this._uCloudsParamsC.value,V=this._uRay00.value,M=this._uRay10.value,R=this._uRay01.value,C=this._uRay11.value,z=`${n}|${V.x},${V.y},${V.z}|${M.x},${M.y},${M.z}|${R.x},${R.y},${R.z}|${C.x},${C.y},${C.z}`,k=z===this._lastSkyPassKey&&x===this._skyTarget;this._lastSkyPassKey=z,k||(b.setRenderTarget(this._skyTarget),this._skyQuad.render(this._renderer));let A=this._cloudsEnabled?`${z}|${w.x},${w.y},${w.z},${w.w}|${S.z},${S.w}|${this._appliedWeather}|${this._appliedSeed}|${this._highCloudsReady}`:"off",P=A===this._lastCloudsPassKey&&v===this._cloudsTarget;if(this._lastCloudsPassKey=A,b.setRenderTarget(this._cloudsTarget),this._cloudsEnabled)P||this._cloudsQuad.render(this._renderer),this._cloudsTargetCleared=!1;else if(!this._cloudsTargetCleared){let e=b.getClearColor(sp),t=b.getClearAlpha();b.setClearColor(0,0),b.clear(!0,!1,!1),b.setClearColor(e,t),this._cloudsTargetCleared=!0}if(!1!==this._renderer.skyEnvironmentNeeded){if(this._ensureEnvPass(),null===this._envTarget){this._envTarget=new xs(256,128,{type:as,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-environment",e.generateMipmaps=!0,e.minFilter=ei,e.magFilter=Zs,e.wrapS=Is}this._uEnvCloudsOn.value=this._cloudsEnabled?1:0;let e=i?.25*Math.round(w.z/.25):w.z,t=this._blendStart>0?Math.floor(16*o)/16:o,a=`${n}|${this._uExposure.value}|${this._uGamma.value}|${this._cloudsEnabled}|${w.x},${t},${e},${w.w}|${this._presetFrom}>${this._presetTo}|${d??""}|${this._appliedWeather}|${this._appliedSeed}|${this._highCloudsReady}`;a!==this._lastEnvKey?(this._lastEnvKey=a,b.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),this._requestEnvPmrem(r)):this._pmremPending&&this._requestEnvPmrem(r)}b.setRenderTarget(T);let E=this._ensureBackgroundMesh(this._skyTarget.texture,this._cloudsTarget.texture);(x!==this._skyTarget||v!==this._cloudsTarget)&&this._rebindComposeTextures(),E.parent!==e&&(E.parent?.remove(E),e.add(E))}_updateHdri(e,t,a){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._animating=!1;let r=this._renderer.getDrawingBufferSize(ip);this._updateCornerRays(t,r.y>0?r.x/r.y:1),null===this._hdri&&(this._hdri=new rp(this._renderer,{ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11}));let s=e.skyHdriHolder,i=null!==s&&s.loaded?s.getTexture(1001):null;this._iblHdriTexture=i,this._iblRotationY=a.hdri?.rotation??0;let n=t.fov,l="number"==typeof n&&n>0?n:45,o=r.y/(this._renderer.getPixelRatio?.()??1),u=l*Math.PI/180/Math.max(1,o),d=(a.hdri?.blur??0)*u;this._hdri.update(e,i,a.hdri?.rotation,d,!1!==a.hdri?.showBackground);let h=!0===a.lighting&&null!==i?this._hdri.lightingInfo(i):null;null!==h?this._updateHdriLighting(e,h,a.hdri?.rotation??0,a.lightingIntensity??1):null!==this._lightingPage&&this._teardownLighting()}_updateHdriLighting(e,t,a,r){null!==this._lightingPage&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let s=e=>{let t=Math.max(e[0],e[1],e[2],1e-6);return[e[0]/t,e[1]/t,e[2]/t]},i=this._sunLight;null===i&&(i=new is(16777215,0),i.name="SplineSkySun",i.layers.enable(3),i.raycast=()=>{},this._sunLight=i),i.parent!==e&&e.add(i),i.userData.splineDiffuseOnly=!0;let n=Math.cos(a),l=Math.sin(a),o=t.sunDir;i.position.set(n*o[0]-l*o[2],o[1],l*o[0]+n*o[2]).multiplyScalar(1e5);let u=s(t.sunColor);i.color.setRGB(u[0],u[1],u[2]);let d=Math.min(Math.max((t.sunPeak-1)/2,0),1);i.intensity=1*Math.PI*Math.min(t.sunLum,1)*d*r;let h=e.ambientLight;null!=h&&(null!==h.parent&&h.removeFromParent(),this._userAmbientSuppressed=!0);let m=this._skyHemi;null===m&&(m=new Ai(16777215,8947848,0),m.name="SplineSkyAmbient",m.layers.enable(3),m.raycast=()=>{},this._skyHemi=m),m.parent!==e&&e.add(m);let c=s(t.skyColor);m.color.setRGB(c[0],c[1],c[2]);let p=s(t.groundColor),g=t.skyLum>1e-6?Math.min(t.groundLum/t.skyLum,1):cp;m.groundColor.setRGB(p[0]*g,p[1]*g,p[2]*g),m.intensity=.75*Math.PI*(t.skyLum/.5)*r}_ensureLightingLuts(){if(this._lightingLutsRequested||null===this._luts)return;this._lightingLutsRequested=!0;let e=this._luts;Promise.all([Qm(this._renderer,e.transmittance,256,64,1,!1),Qm(this._renderer,e.irradiance,64,16,1,!1)]).then(([e,t])=>{this._lightingLuts={transmittance:e,irradiance:t};let a=this._atmosphereUniforms,r=a.bottomRadius+.1,s=Ac(43200)[1],i=ac(a,this._lightingLuts,r,s);this._noonSunRgb=[i[0],i[1],i[2]],this._noonSunLum=tc(i),this._noonSkyLum=tc(rc(a,this._lightingLuts,r,s))},()=>{})}_updateLighting(e,t,a,r){let s=this._lightingLuts,i=this._noonSunRgb;if(null===s||null===i||this._noonSunLum<=0||this._noonSkyLum<=0)return;null!==this._lightingPage&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let n=this._atmosphereUniforms,l=n.bottomRadius+.1,o=this._uSunDir.value,u=o.y,d=e=>e[this._presetFrom]+(e[this._presetTo]-e[this._presetFrom])*t,h=(e,t)=>{let a=[e[0]/Math.max(i[0],1e-12),e[1]/Math.max(i[1],1e-12),e[2]/Math.max(i[2],1e-12)],r=tc(a),s=[r+(a[0]-r)*t,r+(a[1]-r)*t,r+(a[2]-r)*t],n=Math.max(s[0],s[1],s[2],1e-12);return[s[0]/n,s[1]/n,s[2]/n]},m=d(pp),c=ac(n,s,l,u),p=tc(c),g=this._sunLight;if(null===g&&(g=new is(16777215,0),g.name="SplineSkySun",g.layers.enable(3),g.raycast=()=>{},this._sunLight=g),g.parent!==e&&e.add(g),g.userData.splineDiffuseOnly=!1,g.position.set(o.x,o.y,o.z).multiplyScalar(1e5),p>0){let e=h(c,m);g.color.setRGB(e[0],e[1],e[2])}g.intensity=1*Math.PI*(p/this._noonSunLum)*d(gp)*a*r;let f=e.ambientLight;null!=f&&(null!==f.parent&&f.removeFromParent(),this._userAmbientSuppressed=!0);let _=this._skyHemi;null===_&&(_=new Ai(16777215,8947848,0),_.name="SplineSkyAmbient",_.layers.enable(3),_.raycast=()=>{},this._skyHemi=_),_.parent!==e&&e.add(_);let y=rc(n,s,l,u),x=tc(y),[v,b,T]=h(y,m);_.color.setRGB(v,b,T),_.groundColor.setRGB(v*cp,b*cp,T*cp),_.intensity=.75*Math.PI*(x/this._noonSkyLum)*d(fp)*a*r}_teardownLighting(){let e=this._lightingPage;if(this._lightingPage=null,this._sunLight?.parent?.remove(this._sunLight),this._skyHemi?.parent?.remove(this._skyHemi),this._userAmbientSuppressed){this._userAmbientSuppressed=!1;let t=e?.ambientLight,a=e?.data?.ambient?.enabled;t&&!1!==a&&e.add(t)}}_buildComposeNode(e,t){return Ne("fn skyCompose(\n\tuv: vec2f,\n\tskyTex: texture_2d<f32>, skySamp: sampler,\n\tcloudsTex: texture_2d<f32>,\n\texposure: f32, gamma: f32) -> vec4f {\n\tlet WHITE_POINT: f32 = 11.07;\n\t// three's screenUV is GL-style bottom-origin while the pass targets hold\n\t// top-row-first content — flip v to line the compose up with the view.\n\tlet uvFlipped = vec2f(uv.x, 1.0 - uv.y);\n\tlet sky = textureSampleLevel(skyTex, skySamp, uvFlipped, 0.0).rgb;\n\tlet clouds = textureSampleLevel(cloudsTex, skySamp, uvFlipped, 0.0);\n\n\tvar color = vec4f(sky * (1.0 - clouds.a) + clouds.rgb, 1.0);\n\tcolor = vec4f(Hable(color.rgb, exposure, WHITE_POINT), color.a);\n\tcolor = vec4f(pow(color.rgb, vec3f(1.0 / gamma)), color.a);\n\n\treturn color;\n}",[ke(dc)])({uv:Vt,skyTex:Da(e),skySamp:pt(e),cloudsTex:Da(t),exposure:this._uExposure,gamma:this._uGamma})}_rebindComposeTextures(){let e=this.backgroundMesh?.material;!e||!this._skyTarget||!this._cloudsTarget||(e.colorNode=this._buildComposeNode(this._skyTarget.texture,this._cloudsTarget.texture),e.needsUpdate=!0)}detach(){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._hdri?.detach(),this._teardownLighting()}dispose(){this.detach(),this._hdri?.dispose(),this._hdri=null,this._sunLight?.dispose(),this._sunLight=null,this._skyHemi?.dispose(),this._skyHemi=null,this._luts?.dispose(),this._luts=null,this._baseNoise?.dispose(),this._detailNoise?.dispose(),this._weatherCur.dispose(),this._weatherNext.dispose(),this._highClouds.dispose(),this._skyTarget?.dispose(),this._cloudsTarget?.dispose(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._skyQuad=null,this._cloudsQuad=null,this._envQuad=null,this._cloudsArgs=null,this._cloudsLib=null,this._lastSkyPassKey=null,this._lastCloudsPassKey=null}};zl=e=>new xp(e);var vp=e=>e,bp=Y("vec4","vSplatColor"),Tp=Y("vec2","vSplatPosition");function wp(e,t,a){return e.element(t).element(a)}var Sp=class extends Tt{constructor(e){super(),this.uniformsNeedUpdate=!1,this._covariancesTex=Da(new gs),this._centersColorsTex=Da(new gs),this._meshMatrixWorldsTex=Da(new gs),this._focal=k(new us),this._viewport=k(new us),this._basisViewport=k(new us),this._covariancesTextureSize=k(new us(1024,1024)),this._centersColorsTextureSize=k(new us(1024,1024)),this._orthoZoom=k(-1),this._velocityMRT=Ta({velocity:de(0)}),this.name="WebGPUSplatMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.side=Ds,this.lights=!1;let t=e=>({get value(){return e.value},set value(t){t&&t.isTexture&&(e.value=t)}}),a=e=>({get value(){return e.value},set value(t){e.value=t}}),r=e=>({value:e});this.uniforms={covariancesTexture:t(this._covariancesTex),centersColorsTexture:t(this._centersColorsTex),meshMatrixWorldsTexture:t(this._meshMatrixWorldsTex),focal:a(this._focal),viewport:a(this._viewport),basisViewport:a(this._basisViewport),covariancesTextureSize:a(this._covariancesTextureSize),centersColorsTextureSize:a(this._centersColorsTextureSize),orthoZoom:a(this._orthoZoom),meshIndexIntervals:r(e),debugColor:r(new Vs)},this._buildGraph(e)}_buildGraph(e){let t=this._covariancesTex,a=this._centersColorsTex,r=this._meshMatrixWorldsTex,s=this._focal,i=this._basisViewport,n=this._covariancesTextureSize,l=this._centersColorsTextureSize,o=this._orthoZoom,u=re(()=>{let u=nt("splatIndex","uint"),d=(e,t,a)=>{let r=u.mul(or(e)).add(or(t)).toFloat().div(a.x);return ae(L(r),C(r).div(a.y))},h=a.sample(d(1,0,l)).toVar(),m=ut($(h.y,h.z,h.w),"vec3").toVar(),c=h.x;bp.assign(de(c.bitAnd(or(255)).toFloat(),c.shiftRight(or(8)).bitAnd(or(255)).toFloat(),c.shiftRight(or(16)).bitAnd(or(255)).toFloat(),c.shiftRight(or(24)).bitAnd(or(255)).toFloat()).mul(1/255));let p=nt("position","vec3").xy.mul(2).toVar();Tp.assign(p);let g=nr(0);for(let t=1;t<e.length-1;t++)g=vp(g.add(u.greaterThanEqual(or(e[t])).select(nr(1),nr(0))));let f=g.mul(4).toVar(),_=e=>r.sample(ae(f.add(e).div(1024),0)),y=vt(_(0),_(1),_(2),_(3)),x=At.mul(y).toVar(),v=x.mul(de(m,1)).toVar(),b=wt.mul(v).toVar(),T=t.sample(d(3,0,n)).xy.toVar(),w=t.sample(d(3,1,n)).xy.toVar(),S=t.sample(d(3,2,n)).xy.toVar(),V=T.x,M=T.y,R=w.x,z=w.y,k=S.x,A=S.y,P=ft(V,M,R,M,z,k,R,k,A),E=nr(1).div(v.z.mul(v.z)).toVar(),N=x,B=ft(N.element(0).xyz,N.element(1).xyz,N.element(2).xyz).transpose(),I=ft(s.x.div(v.z),0,s.x.mul(v.x).negate().mul(E),0,s.y.div(v.z),s.y.mul(v.y).negate().mul(E),0,0,0),D=e=>{let t=e.transpose().mul(P).mul(e);return de(wp(t,0,0).add(.3),wp(t,0,1),wp(t,1,1).add(.3),0).xyz},F=o.greaterThan(0),U=F.select(D(B),D(B.mul(I))).toVar(),O=b.xyz.div(b.w).toVar(),G=U.x,q=U.z,W=U.y,H=G.mul(q).sub(W.mul(W)),j=G.add(q),K=j.mul(.5),X=ha(Pt(j.mul(j).div(4).sub(H),0)).toVar(),Q=K.add(X).toVar(),Z=Pt(K.sub(X),0).toVar(),Y=Ja(ae(W,Q.sub(G))).toVar(),J=ae(Y.y,Y.x.negate()).toVar(),ee=Y.mul(Ut(ha(Q.mul(2)),1024)).toVar(),te=J.mul(Ut(ha(Z.mul(2)),1024)).toVar(),re=ee.mul(p.x).add(te.mul(p.y)).mul(i).toVar();return re.assign(F.select(re.mul(o),re)),de(O.xy.add(re),O.z,1)}),d=re(()=>{let e=Tp.dot(Tp).negate().toVar();e.lessThan(-4).discard();let t=$a(e).mul(bp.w);return de(bp.xyz,t)});this.vertexNode=u(),this.colorNode=d(),this.needsUpdate=!0}setup(e){let t=e.renderer.getMRT?.();this.mrtNode=t?this._velocityMRT:null,super.setup(e)}nodeMaterialDispose(){this.dispose()}};function Vp(){let e=k(1),t=k(.6),a=k(1),r=k(1),s=k(new Vs(16603997)),i=k(new Vs(2857471)),n=k(new Vs(3728051)),l=k(9),o=k(new us),u=new Tt;u.name="EditorGridNodeMaterial",u.transparent=!0,u.lights=!1,u.fog=!1;let d=zt(l.equal(10),n,i),h=zt(l.equal(8),n,s),m=zt(ue.x.equal(o.x),d,zt(ue.z.equal(o.y),h,ne(.5)));u.colorNode=m;let c=_e.z.negate(),p=Jt(a.mul(500),a.mul(4500),c).mul(r);u.opacityNode=Wt(e.mul(t),nr(0),p);let g={get value(){return 0===r.value?1/0:a.value},set value(e){Number.isFinite(e)?(a.value=e,r.value=1):r.value=0}};return u.uniforms={angleFadeFactor:e,opacityFactor:t,gridScale:g,red:s,blue:i,green:n,mode:l,offset:o},u}function Mp(){return typeof navigator<"u"&&void 0!==navigator.gpu}br({createSplatMaterial:e=>new Sp(e)}),Ar({createRootMaterial:(e,t)=>new nh(e,t),createSharedMaterial:(e,t,a)=>new lh(e,t,a)}),Er({tsl:tr,NodeMaterial:Tt,MeshBasicNodeMaterial:jt,MeshStandardNodeMaterial:fa,MeshPhysicalNodeMaterial:va,MeshPhongNodeMaterial:sa,MeshLambertNodeMaterial:ea,MeshToonNodeMaterial:Sa,MeshMatcapNodeMaterial:Ca,MeshNormalNodeMaterial:Dt,SpriteNodeMaterial:Pa,PointsNodeMaterial:Ba,LineBasicNodeMaterial:Mt,LineDashedNodeMaterial:kt,Color:Vs,Vector2:us,Vector3:hs,Vector4:ys,Matrix3:ms,Matrix4:ws,Texture:gs,CanvasTexture:ss,DataTexture:js,VideoTexture:si,FrontSide:Bs,BackSide:Ls,DoubleSide:Ds,NormalBlending:Ws,AdditiveBlending:Ks,MultiplyBlending:Qs,SubtractiveBlending:$s,RepeatWrapping:Is,ClampToEdgeWrapping:Fs,MirroredRepeatWrapping:Gs,NearestFilter:Hs,LinearFilter:Zs,LinearMipmapLinearFilter:ei,SRGBColorSpace:ps,LinearSRGBColorSpace:_s}),Pr(()=>{let e=new Fa;return e.depthWrite=!1,e.opacity=.5,e});var Rp=["maxUniformBuffersPerShaderStage","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageBufferBindingSize","maxBufferSize","maxVertexBuffers","maxVertexAttributes","maxUniformBufferBindingSize","maxColorAttachmentBytesPerSample"];async function Cp(e={}){let t=!1;try{t="default"===new URLSearchParams(window.location.search).get("dbglimits")}catch{}let a=t?{}:e.requiredLimits??await async function(e){if(!(e.forceWebGL||typeof navigator>"u"||void 0===navigator.gpu))try{let t=await navigator.gpu.requestAdapter({powerPreference:e.powerPreference,featureLevel:"compatibility"});if(!t)return;let a={},r=t.limits;for(let e of Rp){let t=r[e];"number"==typeof t&&Number.isFinite(t)&&(a[e]=t)}return a}catch{return}}(e),r=new wo({...e,requiredLimits:a});await r.init();try{let e=new URLSearchParams(window.location.search);if("off"===e.get("taa")&&(r.temporalAAEnabled=!1),"1"===e.get("nojit")){let e=r.taaHistory;e.beginJitter=()=>{},e.endJitter=()=>{}}"1"===e.get("dbghdt")&&(r.hdTransmission=!0)}catch{}return r}export{Fo as SPE_BLENDING_MULTIPLY,Do as SPE_BLENDING_NORMAL,Oo as SPE_BLENDING_OVERLAY,Uo as SPE_BLENDING_SCREEN,Bo as TSLLayerParams,nh as TSLRootMaterial,lh as TSLSharedMaterial,Hi as WebGPUPostPipeline,wo as WebGPUSplineRenderer,Vp as createEditorGridNodeMaterial,Cp as createWebGPUSplineRenderer,$o as getTSLLayerBuilder,Xo as hasTSLLayerBuilder,Mp as isWebGPUSupported,Eo as ownUniformValue,Ko as registerTSLLayer,No as setRenderUniformValue,Io as simpleCalpha,qo as speBlend,zo as speObjectNormal,Co as speObjectPosition,Po as splitUniformValueSlots,Lo as standardCalpha,jo as unsupportedTSLLayerBuilder,w as webgpuGlobals};