@splinetool/runtime 2.0.39 → 2.0.40

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 (267) hide show
  1. package/build/{runtime-chunk-VIZKPLGM.js → runtime-chunk-3Q3TFE4L.js} +1 -1
  2. package/build/runtime-chunk-3Q3TFE4L.js.br +0 -0
  3. package/build/runtime-chunk-3Q3TFE4L.js.gz +0 -0
  4. package/build/{runtime-chunk-IREDLRM2.js → runtime-chunk-437VKY6M.js} +1 -1
  5. package/build/runtime-chunk-437VKY6M.js.br +0 -0
  6. package/build/runtime-chunk-437VKY6M.js.gz +0 -0
  7. package/build/{runtime-chunk-2CTT6DDT.js → runtime-chunk-52ZGPCUJ.js} +1 -1
  8. package/build/runtime-chunk-52ZGPCUJ.js.br +0 -0
  9. package/build/runtime-chunk-52ZGPCUJ.js.gz +0 -0
  10. package/build/{runtime-chunk-D32CMPSD.js → runtime-chunk-72KWEEBW.js} +1 -1
  11. package/build/runtime-chunk-72KWEEBW.js.br +0 -0
  12. package/build/runtime-chunk-72KWEEBW.js.gz +0 -0
  13. package/build/{runtime-chunk-VNZGYOZ2.js → runtime-chunk-74ERBJIJ.js} +1 -1
  14. package/build/runtime-chunk-74ERBJIJ.js.br +0 -0
  15. package/build/runtime-chunk-74ERBJIJ.js.gz +0 -0
  16. package/build/{runtime-chunk-SCKYPA44.js → runtime-chunk-AIQQJ76T.js} +1 -1
  17. package/build/runtime-chunk-AIQQJ76T.js.br +0 -0
  18. package/build/runtime-chunk-AIQQJ76T.js.gz +0 -0
  19. package/build/{runtime-chunk-VSUS2ENU.js → runtime-chunk-DMKAUMD7.js} +1 -1
  20. package/build/runtime-chunk-DMKAUMD7.js.br +0 -0
  21. package/build/runtime-chunk-DMKAUMD7.js.gz +0 -0
  22. package/build/{runtime-chunk-VE72475E.js → runtime-chunk-EILLIEX6.js} +1 -1
  23. package/build/runtime-chunk-EILLIEX6.js.br +0 -0
  24. package/build/runtime-chunk-EILLIEX6.js.gz +0 -0
  25. package/build/{runtime-chunk-ZQQ2SZLX.js → runtime-chunk-FVHYKE4I.js} +1 -1
  26. package/build/runtime-chunk-FVHYKE4I.js.br +0 -0
  27. package/build/runtime-chunk-FVHYKE4I.js.gz +0 -0
  28. package/build/{runtime-chunk-SBYPS54F.js → runtime-chunk-GG5DCHW5.js} +1 -1
  29. package/build/runtime-chunk-GG5DCHW5.js.br +0 -0
  30. package/build/runtime-chunk-GG5DCHW5.js.gz +0 -0
  31. package/build/runtime-chunk-GMMSBPBR.js +1 -0
  32. package/build/runtime-chunk-GMMSBPBR.js.br +0 -0
  33. package/build/runtime-chunk-GMMSBPBR.js.gz +0 -0
  34. package/build/{runtime-chunk-UYA2WO4N.js → runtime-chunk-KOUTKAXS.js} +1 -1
  35. package/build/runtime-chunk-KOUTKAXS.js.br +0 -0
  36. package/build/runtime-chunk-KOUTKAXS.js.gz +0 -0
  37. package/build/{runtime-chunk-KRS7HASU.js → runtime-chunk-KXSZSGYQ.js} +1 -1
  38. package/build/runtime-chunk-KXSZSGYQ.js.br +0 -0
  39. package/build/runtime-chunk-KXSZSGYQ.js.gz +0 -0
  40. package/build/{runtime-chunk-S4WS6LMW.js → runtime-chunk-NGTED3QN.js} +1 -1
  41. package/build/runtime-chunk-NGTED3QN.js.br +0 -0
  42. package/build/runtime-chunk-NGTED3QN.js.gz +0 -0
  43. package/build/{runtime-chunk-GC6CHE62.js → runtime-chunk-NKMEWBWN.js} +1 -1
  44. package/build/runtime-chunk-NKMEWBWN.js.br +0 -0
  45. package/build/runtime-chunk-NKMEWBWN.js.gz +0 -0
  46. package/build/{runtime-chunk-XX5W33KU.js → runtime-chunk-OIFXPS5S.js} +1 -1
  47. package/build/runtime-chunk-OIFXPS5S.js.br +0 -0
  48. package/build/runtime-chunk-OIFXPS5S.js.gz +0 -0
  49. package/build/{runtime-chunk-OQG3KCQR.js → runtime-chunk-OT65D5VY.js} +1 -1
  50. package/build/runtime-chunk-OT65D5VY.js.br +2 -0
  51. package/build/runtime-chunk-OT65D5VY.js.gz +0 -0
  52. package/build/{runtime-chunk-MVECWW4R.js → runtime-chunk-PF6CS4BQ.js} +1 -1
  53. package/build/runtime-chunk-PF6CS4BQ.js.br +0 -0
  54. package/build/runtime-chunk-PF6CS4BQ.js.gz +0 -0
  55. package/build/{runtime-chunk-Y5QIFTMO.js → runtime-chunk-Q4ZYC44D.js} +1 -1
  56. package/build/runtime-chunk-Q4ZYC44D.js.br +0 -0
  57. package/build/runtime-chunk-Q4ZYC44D.js.gz +0 -0
  58. package/build/{runtime-chunk-PZF2TNFL.js → runtime-chunk-QKE6PC2U.js} +1 -1
  59. package/build/runtime-chunk-QKE6PC2U.js.br +0 -0
  60. package/build/runtime-chunk-QKE6PC2U.js.gz +0 -0
  61. package/build/{runtime-chunk-CB2YLBVS.js → runtime-chunk-QSE6KN7A.js} +1 -1
  62. package/build/runtime-chunk-QSE6KN7A.js.br +0 -0
  63. package/build/runtime-chunk-QSE6KN7A.js.gz +0 -0
  64. package/build/{runtime-chunk-XL26HAPC.js → runtime-chunk-SOAE4CUG.js} +1 -1
  65. package/build/runtime-chunk-SOAE4CUG.js.br +0 -0
  66. package/build/runtime-chunk-SOAE4CUG.js.gz +0 -0
  67. package/build/{runtime-chunk-ZXWVC5XG.js → runtime-chunk-TUJ7GIEW.js} +1 -1
  68. package/build/runtime-chunk-TUJ7GIEW.js.br +0 -0
  69. package/build/runtime-chunk-TUJ7GIEW.js.gz +0 -0
  70. package/build/{runtime-chunk-2HK3OUE2.js → runtime-chunk-VHW3GBX4.js} +1 -1
  71. package/build/runtime-chunk-VHW3GBX4.js.br +0 -0
  72. package/build/runtime-chunk-VHW3GBX4.js.gz +0 -0
  73. package/build/{runtime-chunk-553MWMQ3.js → runtime-chunk-VL5YASFE.js} +1 -1
  74. package/build/runtime-chunk-VL5YASFE.js.br +0 -0
  75. package/build/runtime-chunk-VL5YASFE.js.gz +0 -0
  76. package/build/{runtime-classicRuntime-CZRCGEHW.js → runtime-classicRuntime-IYJ4ZZ5P.js} +1 -1
  77. package/build/runtime-classicRuntime-IYJ4ZZ5P.js.br +0 -0
  78. package/build/runtime-classicRuntime-IYJ4ZZ5P.js.gz +0 -0
  79. package/build/{runtime-cloners-HKKSSULT.js → runtime-cloners-7MNWAPCD.js} +1 -1
  80. package/build/runtime-cloners-7MNWAPCD.js.br +0 -0
  81. package/build/runtime-cloners-7MNWAPCD.js.gz +0 -0
  82. package/build/{runtime-components-PY5DFPX4.js → runtime-components-GPKAWZUD.js} +1 -1
  83. package/build/runtime-components-GPKAWZUD.js.br +0 -0
  84. package/build/runtime-components-GPKAWZUD.js.gz +0 -0
  85. package/build/{runtime-createDestroy-EZYO573X.js → runtime-createDestroy-BLEWKKAE.js} +1 -1
  86. package/build/runtime-createDestroy-BLEWKKAE.js.br +0 -0
  87. package/build/runtime-createDestroy-BLEWKKAE.js.gz +0 -0
  88. package/build/{runtime-dragDrop-HPBUZHL4.js → runtime-dragDrop-WIRCCUT7.js} +1 -1
  89. package/build/runtime-dragDrop-WIRCCUT7.js.br +0 -0
  90. package/build/runtime-dragDrop-WIRCCUT7.js.gz +0 -0
  91. package/build/{runtime-gameControls-3ISZMHR6.js → runtime-gameControls-GNPJLOOO.js} +1 -1
  92. package/build/runtime-gameControls-GNPJLOOO.js.br +0 -0
  93. package/build/runtime-gameControls-GNPJLOOO.js.gz +0 -0
  94. package/build/{runtime-hair-USDBS2L5.js → runtime-hair-PDXYEKUD.js} +1 -1
  95. package/build/runtime-hair-PDXYEKUD.js.br +0 -0
  96. package/build/runtime-hair-PDXYEKUD.js.gz +0 -0
  97. package/build/{runtime-mergeStaticGeometries-RG5ACE5U.js → runtime-mergeStaticGeometries-UUK6YHRY.js} +1 -1
  98. package/build/runtime-mergeStaticGeometries-UUK6YHRY.js.br +0 -0
  99. package/build/runtime-mergeStaticGeometries-UUK6YHRY.js.gz +0 -0
  100. package/build/{runtime-miscActions-3WRFFF4G.js → runtime-miscActions-47R3AVYV.js} +1 -1
  101. package/build/runtime-miscActions-47R3AVYV.js.br +0 -0
  102. package/build/runtime-miscActions-47R3AVYV.js.gz +0 -0
  103. package/build/{runtime-mouseHover-VDZE3VAO.js → runtime-mouseHover-DHQY27ZR.js} +1 -1
  104. package/build/runtime-mouseHover-DHQY27ZR.js.br +0 -0
  105. package/build/runtime-mouseHover-DHQY27ZR.js.gz +0 -0
  106. package/build/{runtime-particles-NVGOD4I2.js → runtime-particles-KZP4XIQI.js} +1 -1
  107. package/build/runtime-particles-KZP4XIQI.js.br +0 -0
  108. package/build/runtime-particles-KZP4XIQI.js.gz +0 -0
  109. package/build/{runtime-paths-KE2ZWY4D.js → runtime-paths-RKDNKC3K.js} +1 -1
  110. package/build/runtime-paths-RKDNKC3K.js.br +0 -0
  111. package/build/runtime-paths-RKDNKC3K.js.gz +0 -0
  112. package/build/{runtime-resize-KIKK4KNW.js → runtime-resize-AOTFZE4N.js} +1 -1
  113. package/build/runtime-resize-AOTFZE4N.js.br +0 -0
  114. package/build/runtime-resize-AOTFZE4N.js.gz +0 -0
  115. package/build/{runtime-sceneTransition-EACLIOER.js → runtime-sceneTransition-YL6G34QI.js} +1 -1
  116. package/build/runtime-sceneTransition-YL6G34QI.js.br +0 -0
  117. package/build/runtime-sceneTransition-YL6G34QI.js.gz +0 -0
  118. package/build/{runtime-scroll-SRD4A2B2.js → runtime-scroll-MQ25YLZ4.js} +1 -1
  119. package/build/runtime-scroll-MQ25YLZ4.js.br +0 -0
  120. package/build/runtime-scroll-MQ25YLZ4.js.gz +0 -0
  121. package/build/runtime-shapeBlends-XH3MJU24.js +1 -0
  122. package/build/runtime-shapeBlends-XH3MJU24.js.br +2 -0
  123. package/build/runtime-shapeBlends-XH3MJU24.js.gz +0 -0
  124. package/build/{runtime-text-PFCWEDL3.js → runtime-text-PEQHNYG4.js} +1 -1
  125. package/build/runtime-text-PEQHNYG4.js.br +0 -0
  126. package/build/runtime-text-PEQHNYG4.js.gz +0 -0
  127. package/build/{runtime-textInputs-4ZUZIOSB.js → runtime-textInputs-FDHLTSR4.js} +1 -1
  128. package/build/runtime-textInputs-FDHLTSR4.js.br +0 -0
  129. package/build/runtime-textInputs-FDHLTSR4.js.gz +0 -0
  130. package/build/{runtime-timeline-GFQ3PLAW.js → runtime-timeline-EACZNJXJ.js} +1 -1
  131. package/build/runtime-timeline-EACZNJXJ.js.br +0 -0
  132. package/build/runtime-timeline-EACZNJXJ.js.gz +0 -0
  133. package/build/{runtime-tracking-NUDARHPE.js → runtime-tracking-GO6DLRHP.js} +1 -1
  134. package/build/runtime-tracking-GO6DLRHP.js.br +0 -0
  135. package/build/runtime-tracking-GO6DLRHP.js.gz +0 -0
  136. package/build/{runtime-transitions-YXPI5GOJ.js → runtime-transitions-WMBFHHQW.js} +1 -1
  137. package/build/runtime-transitions-WMBFHHQW.js.br +0 -0
  138. package/build/runtime-transitions-WMBFHHQW.js.gz +0 -0
  139. package/build/{runtime-ui2d-VZQWBLIN.js → runtime-ui2d-TW7JNQQY.js} +1 -1
  140. package/build/runtime-ui2d-TW7JNQQY.js.br +0 -0
  141. package/build/runtime-ui2d-TW7JNQQY.js.gz +0 -0
  142. package/build/{runtime-vectorShapes-EG2YDSCZ.js → runtime-vectorShapes-NS2KGHAX.js} +1 -1
  143. package/build/runtime-vectorShapes-NS2KGHAX.js.br +0 -0
  144. package/build/runtime-vectorShapes-NS2KGHAX.js.gz +0 -0
  145. package/build/{runtime-webgpu-VMMU4QBO.js → runtime-webgpu-AMGSADK7.js} +1 -1
  146. package/build/runtime-webgpu-AMGSADK7.js.br +0 -0
  147. package/build/runtime-webgpu-AMGSADK7.js.gz +0 -0
  148. package/build/runtime.cjs +5 -5
  149. package/build/runtime.js +1 -1
  150. package/build/runtime.js.br +0 -0
  151. package/build/runtime.js.gz +0 -0
  152. package/build/runtime.standalone.js +1 -1
  153. package/build/runtime.standalone.js.br +0 -0
  154. package/build/runtime.standalone.js.gz +0 -0
  155. package/build/runtime.standalone.webgl.js +1 -1
  156. package/build/runtime.standalone.webgl.js.br +0 -0
  157. package/build/runtime.standalone.webgl.js.gz +0 -0
  158. package/build/runtime.standalone.webgpu.js +1 -1
  159. package/build/runtime.standalone.webgpu.js.br +0 -0
  160. package/build/runtime.standalone.webgpu.js.gz +0 -0
  161. package/build/runtime.standalone.webgpu.micro.js +1 -1
  162. package/build/runtime.standalone.webgpu.micro.js.br +0 -0
  163. package/build/runtime.standalone.webgpu.micro.js.gz +0 -0
  164. package/build/runtime.standalone.webgpu.min.js +1 -1
  165. package/build/runtime.standalone.webgpu.min.js.br +0 -0
  166. package/build/runtime.standalone.webgpu.min.js.gz +0 -0
  167. package/package.json +1 -1
  168. package/build/runtime-chunk-2CTT6DDT.js.br +0 -0
  169. package/build/runtime-chunk-2CTT6DDT.js.gz +0 -0
  170. package/build/runtime-chunk-2HK3OUE2.js.br +0 -0
  171. package/build/runtime-chunk-2HK3OUE2.js.gz +0 -0
  172. package/build/runtime-chunk-553MWMQ3.js.br +0 -0
  173. package/build/runtime-chunk-553MWMQ3.js.gz +0 -0
  174. package/build/runtime-chunk-CB2YLBVS.js.br +0 -0
  175. package/build/runtime-chunk-CB2YLBVS.js.gz +0 -0
  176. package/build/runtime-chunk-D32CMPSD.js.br +0 -0
  177. package/build/runtime-chunk-D32CMPSD.js.gz +0 -0
  178. package/build/runtime-chunk-GAWCMR4R.js +0 -1
  179. package/build/runtime-chunk-GAWCMR4R.js.br +0 -0
  180. package/build/runtime-chunk-GAWCMR4R.js.gz +0 -0
  181. package/build/runtime-chunk-GC6CHE62.js.br +0 -0
  182. package/build/runtime-chunk-GC6CHE62.js.gz +0 -0
  183. package/build/runtime-chunk-IREDLRM2.js.br +0 -0
  184. package/build/runtime-chunk-IREDLRM2.js.gz +0 -0
  185. package/build/runtime-chunk-KRS7HASU.js.br +0 -0
  186. package/build/runtime-chunk-KRS7HASU.js.gz +0 -0
  187. package/build/runtime-chunk-MVECWW4R.js.br +0 -0
  188. package/build/runtime-chunk-MVECWW4R.js.gz +0 -0
  189. package/build/runtime-chunk-OQG3KCQR.js.br +0 -2
  190. package/build/runtime-chunk-OQG3KCQR.js.gz +0 -0
  191. package/build/runtime-chunk-PZF2TNFL.js.br +0 -0
  192. package/build/runtime-chunk-PZF2TNFL.js.gz +0 -0
  193. package/build/runtime-chunk-S4WS6LMW.js.br +0 -0
  194. package/build/runtime-chunk-S4WS6LMW.js.gz +0 -0
  195. package/build/runtime-chunk-SBYPS54F.js.br +0 -0
  196. package/build/runtime-chunk-SBYPS54F.js.gz +0 -0
  197. package/build/runtime-chunk-SCKYPA44.js.br +0 -0
  198. package/build/runtime-chunk-SCKYPA44.js.gz +0 -0
  199. package/build/runtime-chunk-UYA2WO4N.js.br +0 -0
  200. package/build/runtime-chunk-UYA2WO4N.js.gz +0 -0
  201. package/build/runtime-chunk-VE72475E.js.br +0 -0
  202. package/build/runtime-chunk-VE72475E.js.gz +0 -0
  203. package/build/runtime-chunk-VIZKPLGM.js.br +0 -0
  204. package/build/runtime-chunk-VIZKPLGM.js.gz +0 -0
  205. package/build/runtime-chunk-VNZGYOZ2.js.br +0 -0
  206. package/build/runtime-chunk-VNZGYOZ2.js.gz +0 -0
  207. package/build/runtime-chunk-VSUS2ENU.js.br +0 -0
  208. package/build/runtime-chunk-VSUS2ENU.js.gz +0 -0
  209. package/build/runtime-chunk-XL26HAPC.js.br +0 -0
  210. package/build/runtime-chunk-XL26HAPC.js.gz +0 -0
  211. package/build/runtime-chunk-XX5W33KU.js.br +0 -0
  212. package/build/runtime-chunk-XX5W33KU.js.gz +0 -0
  213. package/build/runtime-chunk-Y5QIFTMO.js.br +0 -0
  214. package/build/runtime-chunk-Y5QIFTMO.js.gz +0 -0
  215. package/build/runtime-chunk-ZQQ2SZLX.js.br +0 -0
  216. package/build/runtime-chunk-ZQQ2SZLX.js.gz +0 -0
  217. package/build/runtime-chunk-ZXWVC5XG.js.br +0 -0
  218. package/build/runtime-chunk-ZXWVC5XG.js.gz +0 -0
  219. package/build/runtime-classicRuntime-CZRCGEHW.js.br +0 -0
  220. package/build/runtime-classicRuntime-CZRCGEHW.js.gz +0 -0
  221. package/build/runtime-cloners-HKKSSULT.js.br +0 -2
  222. package/build/runtime-cloners-HKKSSULT.js.gz +0 -0
  223. package/build/runtime-components-PY5DFPX4.js.br +0 -0
  224. package/build/runtime-components-PY5DFPX4.js.gz +0 -0
  225. package/build/runtime-createDestroy-EZYO573X.js.br +0 -0
  226. package/build/runtime-createDestroy-EZYO573X.js.gz +0 -0
  227. package/build/runtime-dragDrop-HPBUZHL4.js.br +0 -0
  228. package/build/runtime-dragDrop-HPBUZHL4.js.gz +0 -0
  229. package/build/runtime-gameControls-3ISZMHR6.js.br +0 -0
  230. package/build/runtime-gameControls-3ISZMHR6.js.gz +0 -0
  231. package/build/runtime-hair-USDBS2L5.js.br +0 -1
  232. package/build/runtime-hair-USDBS2L5.js.gz +0 -0
  233. package/build/runtime-mergeStaticGeometries-RG5ACE5U.js.br +0 -0
  234. package/build/runtime-mergeStaticGeometries-RG5ACE5U.js.gz +0 -0
  235. package/build/runtime-miscActions-3WRFFF4G.js.br +0 -0
  236. package/build/runtime-miscActions-3WRFFF4G.js.gz +0 -0
  237. package/build/runtime-mouseHover-VDZE3VAO.js.br +0 -0
  238. package/build/runtime-mouseHover-VDZE3VAO.js.gz +0 -0
  239. package/build/runtime-particles-NVGOD4I2.js.br +0 -0
  240. package/build/runtime-particles-NVGOD4I2.js.gz +0 -0
  241. package/build/runtime-paths-KE2ZWY4D.js.br +0 -0
  242. package/build/runtime-paths-KE2ZWY4D.js.gz +0 -0
  243. package/build/runtime-resize-KIKK4KNW.js.br +0 -0
  244. package/build/runtime-resize-KIKK4KNW.js.gz +0 -0
  245. package/build/runtime-sceneTransition-EACLIOER.js.br +0 -0
  246. package/build/runtime-sceneTransition-EACLIOER.js.gz +0 -0
  247. package/build/runtime-scroll-SRD4A2B2.js.br +0 -0
  248. package/build/runtime-scroll-SRD4A2B2.js.gz +0 -0
  249. package/build/runtime-shapeBlends-XRWXHXCW.js +0 -1
  250. package/build/runtime-shapeBlends-XRWXHXCW.js.br +0 -0
  251. package/build/runtime-shapeBlends-XRWXHXCW.js.gz +0 -0
  252. package/build/runtime-text-PFCWEDL3.js.br +0 -0
  253. package/build/runtime-text-PFCWEDL3.js.gz +0 -0
  254. package/build/runtime-textInputs-4ZUZIOSB.js.br +0 -0
  255. package/build/runtime-textInputs-4ZUZIOSB.js.gz +0 -0
  256. package/build/runtime-timeline-GFQ3PLAW.js.br +0 -0
  257. package/build/runtime-timeline-GFQ3PLAW.js.gz +0 -0
  258. package/build/runtime-tracking-NUDARHPE.js.br +0 -0
  259. package/build/runtime-tracking-NUDARHPE.js.gz +0 -0
  260. package/build/runtime-transitions-YXPI5GOJ.js.br +0 -0
  261. package/build/runtime-transitions-YXPI5GOJ.js.gz +0 -0
  262. package/build/runtime-ui2d-VZQWBLIN.js.br +0 -0
  263. package/build/runtime-ui2d-VZQWBLIN.js.gz +0 -0
  264. package/build/runtime-vectorShapes-EG2YDSCZ.js.br +0 -0
  265. package/build/runtime-vectorShapes-EG2YDSCZ.js.gz +0 -0
  266. package/build/runtime-webgpu-VMMU4QBO.js.br +0 -0
  267. package/build/runtime-webgpu-VMMU4QBO.js.gz +0 -0
@@ -1 +1 @@
1
- import{a as e,b as t,c as a,d as r}from"./runtime-chunk-553MWMQ3.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-VNZGYOZ2.js";import{b as g}from"./runtime-chunk-CVUJ3GMH.js";import"./runtime-chunk-IREDLRM2.js";import"./runtime-chunk-VSUS2ENU.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-XEXAWJME.js";import{$ as S,$a as V,$b as M,A as C,Aa as R,Ab as z,Ac as k,B as A,Ba as P,Bb as E,Bc as N,C as B,Ca as L,Cb as I,Cc as D,D as F,Da as U,Db as O,E as G,Ea 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 Ce,Oa as Re,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,Rb as Oe,Rc as Ge,S as qe,Sa as We,Sb as He,Sc as je,T as Ke,Ta as $e,Tc as Xe,U as Qe,Ua as Ze,V as Ye,Va as Je,Vb as et,W as tt,Wa as at,Wb as rt,X as st,Xa as it,Xb as nt,Y as lt,Ya as ot,Yb as ut,Z as dt,Za as ht,Zb as mt,_ as ct,_a as pt,_b as gt,aa as ft,ab as _t,ac as yt,b as xt,ba as vt,bb as bt,bc as Tt,c as wt,ca as St,cb as Vt,cc as Mt,d as Ct,da as Rt,db as zt,dc as kt,e as At,ea as Pt,eb as Et,ec as Nt,f as Bt,fa as Lt,fb as It,fc as Dt,g as Ft,ga as Ut,gb as Ot,gc as Gt,h as qt,ha as Wt,hb as Ht,hc as jt,i as Kt,ia as $t,ib as Xt,ic as Qt,j as Zt,ja as Yt,jb as Jt,jc as ea,k as ta,ka as aa,kb as ra,kc as sa,l as ia,la as na,lb as la,lc as oa,m as ua,ma as da,mb as ha,mc as ma,n as ca,na as pa,nb as ga,nc as fa,o as _a,oa as ya,ob as xa,oc as va,p as ba,pa as Ta,pb as wa,pc as Sa,q as Va,qa as Ma,qb as Ca,qc as Ra,r as za,ra as ka,rb as Aa,rc as Pa,s as Ea,sa as Na,sb as Ba,sc as La,t as Ia,ta as Da,tc as Fa,u as Ua,ua as Oa,ub as Ga,uc as qa,v as Wa,va as Ha,vb as ja,vc as Ka,w as $a,wa as Xa,wb as Qa,wc as Za,x as Ya,xa as Ja,xb as er,xc as tr,y as ar,ya as rr,yb as sr,yc as ir,z as nr,za as lr,zb as or,zc as ur}from"./runtime-chunk-GNCRONVM.js";import{a as dr}from"./runtime-chunk-GFTBNL2W.js";import{a as hr,b as mr,c as cr,d as pr,e as gr,f as fr,g as _r,h as yr,i as xr,j as vr}from"./runtime-chunk-S4WS6LMW.js";import{a as br,b as Tr,e as wr,f as Sr}from"./runtime-chunk-KRS7HASU.js";import{a as Vr}from"./runtime-chunk-2HK3OUE2.js";import"./runtime-chunk-ZQQ2SZLX.js";import{a as Mr,b as Cr,c as Rr}from"./runtime-chunk-SCKYPA44.js";import{a as zr,b as kr}from"./runtime-chunk-XL26HAPC.js";import"./runtime-chunk-Y5QIFTMO.js";import"./runtime-chunk-TU4KDRKR.js";import"./runtime-chunk-PZF2TNFL.js";import{a as Ar}from"./runtime-chunk-GC6CHE62.js";import"./runtime-chunk-OQG3KCQR.js";import"./runtime-chunk-2CTT6DDT.js";import"./runtime-chunk-SBYPS54F.js";import"./runtime-chunk-MVECWW4R.js";import"./runtime-chunk-ZXWVC5XG.js";import{L as Pr,O as Er,Q as Nr,U as Br,V as Lr,W as Ir,Y as Dr,Z as Fr,_ as Ur,h as Or,k as Gr,l as qr,m as Wr}from"./runtime-chunk-CB2YLBVS.js";import"./runtime-chunk-4YV3EXSU.js";import"./runtime-chunk-NSD7DU3P.js";import"./runtime-chunk-XX5W33KU.js";import"./runtime-chunk-RTLL6WIB.js";import"./runtime-chunk-2PT2WH66.js";import"./runtime-chunk-C6JZPJNZ.js";import"./runtime-chunk-TZCHGFVF.js";import{U as Hr,ca as jr,da as Kr,oa as $r,pa as Xr,qa as Qr,ra as Zr,w as Yr}from"./runtime-chunk-WKTS4T2Q.js";import{e as Jr,f as es}from"./runtime-chunk-EOV2DL2V.js";import{b as ts}from"./runtime-chunk-Y3BMDVJ7.js";import{Aa as as,Ba as rs,Bc as ss,Bd as is,Be as ns,Cc as ls,Cd as os,D as us,Dc as ds,Ec as hs,Fc as ms,Gc as cs,Hc as ps,Ib as gs,Ic as fs,Ja as _s,Jb as ys,Jc as xs,Kc as vs,Ma as bs,Me as Ts,Oa as ws,Oc as Ss,Pc as Vs,Tc as Ms,Y as Cs,Yc as Rs,Zc as zs,aa as ks,ca as As,da as Ps,dd as Es,g as Ns,id as Bs,j as Ls,k as Is,ka as Ds,l as Fs,la as Us,ld as Os,m as Gs,ma as qs,mc as Ws,n as Hs,na as js,nd as Ks,o as $s,p as Xs,pd as Qs,q as Zs,qa as Ys,r as Js,rd as ei,sa as ti,t as ai,ua as ri,ve as si,yd as ii,ye as ni,z as li,ze as oi}from"./runtime-chunk-BVVSZMXD.js";import"./runtime-chunk-ML3Z74BL.js";var ui=[[.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]],di=N(new Ms(1,1,1)).setGroup(mt),hi=N(.1).setGroup(mt),mi=N(2e3).setGroup(mt),ci=N(0).setGroup(mt),pi=N(new ms(.005,.01,0)).setGroup(mt),gi=le(([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=Nt(o.greaterThanEqual(0),R(1),R(-1)).mul(o.abs().max(1e-4));return l.mul(t).mul(R(1).sub(u.negate().exp())).div(u).max(0).negate().exp().oneMinus()}),fi=le(()=>{let e=Ee.sub(St).toVar(),t=e.length().max(1e-6);return gi(e,t,St,pi)}),_i=(()=>{let e=R(1).sub(va(.5,ci)).add(va(1.5,ci)),t=va(.5,ci),a=R(1).sub(R(1).sub(rt(hi,mi).mul(e)).mul(R(1).sub(fi().mul(t))));return L(di,a)})();function yi(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=_i);di.value.copy(a.color),hi.value=a.near,mi.value=a.far,ci.value=$r.getModeIndex({mode:e.fogMode}),pi.value.set(e.fogDensity??$r.getDensity({}),e.fogHeightFalloff??$r.getHeightFalloff({}),e.fogHeightBase??$r.getHeightBase({}))}else if(null===t)for(let e of r)e?.fogNode&&(e.fogNode=null)}var xi=e=>e,vi=e=>e,bi=e=>e,Ti=(e,t,a)=>P(e.add(.5).mul(t)).add(.5).div(a),wi=new $a,Si=new Ms,Vi=class{constructor(){this._gBuffer=null,this._aoBuffer=null,this._hbaoMaterial=null,this._resolveMaterial=null,this._boundBlueNoise=null,this._frameIndex=0,this._projectionMatrixInverse=N(new Ss),this._isOrtho=N(0),this._resolution=N(new ds(1,1)),this._fullResolution=N(new ds(1,1)),this._radiusOfInfluence=N(128),this._radiusInScreenSpace=N(1),this._exponent=N(1),this._aoColor=N(new Ms(0,0,0)),this._bias=N(.5),this._frame=N(0),this._fogEnabled=N(0),this._fogNear=N(1),this._fogFar=N(1e3),this._fogMode=N(0),this._fogHeightParams=N(new ms(.005,.01,0)),this._cameraWorldMatrix=N(new Ss);let e=new Ct;e.name="SplineHBAO.gbuffer",e.side=Fs,e.fragmentNode=pe(Qa.mul(lr),1),e.lights=!1,e.blending=Gs,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=qa(this._gBuffer.depthTexture),r=qa(this._gBuffer.texture),s=qa(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)=>se(e,t,i),S=e=>w(e,T(e)),V=le(()=>{let e=$().toVar(),t=l,a=o,i=P(e.mul(t)).toVar(),V=a.div(t).toVar(),C=Ti(i,V,a).toVar(),z=T(C).toVar(),k=w(C,z).toVar(),A=or(r.sample(C).xyz).toVar(),E=It(d.div(Xt(k.z.negate(),R(1),n)),R(5)).toVar(),N=Je(Pe(Mt.xy.x).bitAnd(Pe(127)),Pe(Mt.xy.y).bitAnd(Pe(127))),B=s.load(N).xyz.x,L=U(B.add(R(.61803398875).mul(p))).mul(6.283),I=pa(L).toVar(),D=ea(L).toVar(),F=E.div(5).toVar(),O=R(0).toVar();for(let e=0;e<4;e++){let t=F.add(1).toVar();for(let r=0;r<4;r++){let[s,n]=ui[4*e+r],l=ne(I.mul(s).sub(D.mul(n)),D.mul(s).add(I.mul(n))),o=vi(i.add(M(l.mul(t)))).toVar(),d=bi(S(Ti(o,V,a))).toVar();t.addAssign(F);let h=bi(d.sub(k)).toVar(),m=xi(h.dot(h)).toVar(),p=fa(m),g=xi(A.dot(h)).div(It(p,R(1e-4))),f=m.mul(R(-1).div(u.mul(u))).add(1);O.addAssign(Wt(g.sub(c),0,1).mul(Wt(f,0,1)))}}let G=R(1).div(R(1).sub(c));O.mulAssign(G.div(16));let q=Wt(R(1).sub(O.mul(2)),0,1),W=Ie(q,h).toVar(),H=b?z.lessThanEqual(0):z.greaterThanEqual(1);W.assign(H.select(R(1),W));let j=de(Xt(m,de(1),W)).toVar(),K=sa(f,_,k.z.negate()),X=v.mul(pe(k,1)).xyz,Q=v.mul(pe(0,0,0,1)).xyz,Z=X.sub(Q).toVar(),Y=gi(Z,Z.length().max(1e-6),Q,x),J=y,ee=R(1).sub(va(.5,J)).add(va(1.5,J)),te=va(.5,J),ae=R(1).sub(R(1).sub(K.mul(ee)).mul(R(1).sub(Y.mul(te)))).mul(g);return j.assign(Xt(j,de(1),ae)),pe(j,1)}),C=new Ct;return C.name="SplineHBAO.hbao",C.colorNode=V(),C.depthTest=!1,C.depthWrite=!1,C.blending=Gs,C.needsUpdate=!0,C}_buildResolveMaterial(){let e=qa(this._aoBuffer.texture),t=qa(this._gBuffer.depthTexture),a=this._resolution,r=this._fullResolution,s=le(()=>{let s=$().toVar(),i=a,n=r,l=ne(R(1).div(i.x),R(1).div(i.y)).toVar(),o=s.sub(l.mul(.5)).toVar(),u=o.add(ne(l.x,0)).toVar(),d=o.add(ne(0,l.y)).toVar(),h=o.add(l).toVar(),m=t.sample(s).toVar(),c=n.div(i).toVar(),p=e=>t.sample(Ti(e,c,n)),g=P(o.mul(i)).toVar(),f=m.sub(p(g)).abs().toVar(),_=m.sub(p(g.add(ne(1,0)))).abs().toVar(),y=m.sub(p(g.add(ne(0,1)))).abs().toVar(),x=m.sub(p(g.add(ne(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 Ct;return i.name="SplineHBAO.resolve",i.colorNode=s(),i.depthTest=!1,i.depthWrite=!1,i.blending=Gs,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 vs(n,l,{type:rs,depthTexture:new os(n,l),minFilter:Ys,magFilter:Ys}));if(this._gBuffer=c.target,m=m||c.changed,o){let e=this._ensureTarget(this._aoBuffer,d,h,()=>new vs(d,h,{minFilter:Ys,magFilter:Ys,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(Si),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,wi.material=this._hbaoMaterial,wi.name="SplineHBAO.hbao",y.setRenderTarget(o?this._aoBuffer:i),wi.render(e),o&&(wi.material=this._resolveMaterial,wi.name="SplineHBAO.resolve",y.setRenderTarget(i),wi.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}},Mi={texture:null,version:0,rotation:new Vs,quality:"full"},Ci=new Set;function Ri(e){let t=Mi.texture,a=e.lights&&"physical"===e.category&&null!==t&&("full"===Mi.quality||!1!==e.envReflectiveInLow?.()),r=e.envNode instanceof Ai;a?(!r||e.envNode.sourceTexture!==t)&&(e.envNode=new Ai(t),e.needsUpdate=!0):r&&(e.envNode=null,e.needsUpdate=!0)}var zi=new WeakMap;function ki(e,t){let a=null;return{getUV:()=>{if(null===a){let r=ze.negate().reflect(t);r=He(e).mix(r,t),r=r.normalize(),a=r.transformDirection(Ut)}return a},getTextureLevel:()=>e}}var Ai=class extends _a{constructor(e){super(null),this.sourceTexture=e}static get type(){return"SplineEnvironmentNode"}setup(e){let t=function(e){let t=zi.get(e);return void 0===t&&(t=ue(e),zi.set(e,t)),t}(this.sourceTexture),a=e.context,r=t.context(ki(gt,Qa)).mul(Et);a.radiance.addAssign(new wt(r));let s=t.context({getUV:()=>er,getTextureLevel:()=>R(1)}).mul(Math.PI).mul(Et);a.iblIrradiance.addAssign(new wt(s));let i=a.lightingModel?.clearcoatRadiance;if(i){let e=t.context(ki(aa,Yt)).mul(Et);i.addAssign(new wt(e))}return null}},Pi=class extends si{},Ei=class extends A{static get type(){return"SplineSkyHemisphereLightNode"}setup(e){return e.material?.envNode instanceof Ai?null:super.setup(e)}},Ni=e=>e,Bi=e=>e,Li=e=>e,Ii=e=>e,Di=.25,Fi=256/(2*Math.PI),Ui=(e,t,a,r,s)=>{let i=de(0).toVar();return he(r.lessThan(.5),()=>{i.assign(e.sample(t).level(s).rgb)}).Else(()=>{let r=de(0).toVar(),n=R(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=Li(Ii(e.sample(ne(Ni(t.x).add(a.mul(u)),Ni(t.y).add(a.mul(d)))).level(s)).rgb);r.addAssign(m.mul(h)),n.addAssign(R(h))}i.assign(r.div(n))}),i},Oi=(e,t,a,r)=>{let s=pe(t.mul(2).sub(1),R(1).sub(a).mul(2).sub(1),r,1),i=e.mul(s).toVar();return i.xyz.div(i.w)},Gi=(e,t,a,r)=>{let s=w.reflectionEnvEnabled,i=w.reflectionMissColor,n=a.greaterThan(.05),l=r??Nt(n,R(.6),R(1)),o=Qe(t.z,t.x).div(2*Math.PI).add(.5),u=Ke(Wt(t.y,R(-1),R(1))).div(Math.PI).add(.5),d=Ht(V(a.mul(l).mul(Di*Fi).add(1)),R(8)),h=e.sample(ne(o,u)).level(d).rgb;return Nt(s.greaterThan(.5),h,i)},qi=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=Nt(y,de(0,0,-1),or(a.originView)).toVar(),v=a.normalV.toVar(),b=nt(x,v).toVar(),T=Wt(i.mul(.1),R(0),R(1)).toVar(),S=w.resolution,M=T.greaterThan(.05),C=e.singleRay?R(1):Nt(M,R(.6),R(1)),z=(e,t,s,i)=>{let l=or(ir(e,r.worldMatrix)).toVar(),h=R(1).sub(sa(R(.85),R(.99),e.z)).toVar(),x=a.originView.toVar(),b=x.z.negate().max(r.near).toVar(),w=R(b.mul(10)).toVar();he(e.z.greaterThan(1e-5),()=>{let t=r.near.negate().sub(x.z).div(e.z);w.assign(Ht(w,t.mul(.95).max(1e-4)))});let M,z=x.add(e.mul(w)).toVar(),k=de(a.screenUv,a.fragWindowZ).toVar(),A=(e=>{let t=r.projectionMatrix.mul(pe(e,1)).toVar(),a=t.xyz.div(t.w);return de(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5),a.z)})(z).toVar(),P=T.mul(S.y).mul(.075).toVar();if(i){let e=P.mul(g.y.div(S.y)).toVar(),t=Ht(R(.8),R(12).div(e.max(.001))).toVar();i.assign(e.mul(t)),M=R(1).sub(t.mul(t)).max(0).sqrt().toVar()}let E=A.sub(k).toVar(),N=It(E.xy.length(),R(1e-5)).toVar(),B=R(0).toVar(),L=de(0).toVar(),I=()=>{let e=f.sub(1).toVar(),a=Pe(1).toVar(),r=Pe(0).toVar(),s=(e,t)=>Ht(e,t),i=E,l=i.div(i.z).toVar(),o=de(k).toVar(),u=ne(Nt(i.x.greaterThanEqual(0),R(1),R(-1)),Nt(i.y.greaterThanEqual(0),R(1),R(-1))).toVar(),d=u.mul(1e-5).toVar();u.assign(Wt(u,ne(0),ne(1)));let h=e=>ne(Za(m,e)),c=(e,t)=>e.mul(t).floor(),p=(e,t,a)=>{let r=ne(1).div(a),s=t.div(a).add(r.mul(u)).sub(e.xy).div(i.xy).toVar(),n=e.add(i.mul(Ht(s.x,s.y))).toVar();return n.xy.addAssign(Nt(s.x.lessThan(s.y),ne(d.x,0),ne(0,d.y))),n},y=h(a),x=c(o.xy,y);o.assign(p(o,x,y)),ge(256,()=>{he(a.lessThan(Pe(0)).or(r.greaterThanEqual(t)),()=>{J()});let u=h(a).toVar(),d=c(o.xy,u).toVar(),m=_(Je(Pe(d.x),Pe(d.y)),a).toVar(),g=de(o).toVar();he(i.z.greaterThan(0),()=>{let t=m.sub(o.z).toVar();he(t.greaterThan(0),()=>{g.assign(o.add(l.mul(t)))});let r=c(g.xy,u).toVar();he(((e,t)=>Pe(e.x).notEqual(Pe(t.x)).or(Pe(e.y).notEqual(Pe(t.y))))(d,r),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Pe(2))))}).Else(()=>{he(a.equal(Pe(1)).and(t.abs().greaterThan(n)),()=>{g.assign(p(o,d,u)),a.assign(Pe(2))})})}).Else(()=>{he(o.z.lessThan(m),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Pe(2))))})}),o.assign(g),a.subAssign(Pe(1)),r.addAssign(Pe(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));he(a.lessThan(Pe(0)).and(r.lessThan(t)).and(v),()=>{B.assign(1),L.assign(o);let e=o.xy.sub(k.xy).length().div(N).clamp(0,1),t=e.sub(R(2).div(g.y).div(N)).max(0),a=de(k.add(E.mul(t))).toVar(),r=de(k.add(E.mul(e))).toVar(),s=de(r).toVar();for(let e=0;e<4;e++){s.assign(Xt(a,r,.5));let e=Ni(_(Je(Bi(s.xy).mul(g)),Pe(0)));he(s.z.sub(e).greaterThan(0),()=>{r.assign(s)}).Else(()=>{a.assign(s)})}L.assign(s)})},D=()=>{let e=It(o,R(1e-4)),a=R(e).toVar(),r=de(k).toVar(),s=de(k).toVar(),i=R(-1).toVar();ge(256,({i:l})=>{he(l.greaterThanEqual(t),()=>{J()});let o=R(l).mul(a).div(N).toVar();he(o.greaterThan(1),()=>{J()}),s.assign(E.mul(o).add(k));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));he(u,()=>{J()});let d=_(Je(s.xy.mul(g)),Pe(0)).toVar(),h=s.z.sub(d).toVar();he(i.lessThanEqual(0).and(h.greaterThan(0)),()=>{let e=de(r).toVar(),t=de(s).toVar(),a=de(s).toVar(),i=R(h).toVar();for(let r=0;r<4;r++){a.assign(Xt(e,t,.5));let r=Ni(_(Je(Bi(a.xy).mul(g)),Pe(0)));i.assign(a.z.sub(r)),he(i.greaterThan(0),()=>{t.assign(a)}).Else(()=>{e.assign(a)})}he(i.abs().lessThan(n),()=>{B.assign(1),L.assign(a),J()})}),i.assign(h),r.assign(s),a.addAssign(e.div(2))})};he(h.greaterThan(0).and(p.not()),()=>{"number"==typeof u?1===u?I():D():he(u.greaterThan(.5),()=>{I()}).Else(()=>{D()})});let F=Gi(c,l,T,M).toVar(),U=de(F).toVar();return he(B.greaterThan(.5),()=>{let t=L.xy.sub(k.xy).length().div(N).clamp(0,1).toVar(),a=x.z.negate().max(1e-4).toVar(),n=z.z.negate().max(1e-4).toVar(),l=Xt(R(1).div(a),R(1).div(n),t).toVar(),o=Xt(x.div(a),z.div(n),t).div(l),u=Xt(x,z,t),m=Nt(y,u,o).toVar(),c=m.sub(x).length().toVar(),p=r.projectionMatrix.element(1).y.mul(S.y).mul(.5),w=Nt(y,R(1),m.z.abs().max(1e-4)),M=T.mul(C).mul(Di).mul(c).mul(p).div(w),A=It(M,P).toVar(),E=A.mul(g.y.div(S.y)).toVar(),B=E.toVar(),I=A.toVar();if(i){let e=Ht(R(.8),R(12).div(E.max(.001))).toVar();i.assign(E.mul(e)),B.assign(E.mul(R(1).sub(e.mul(e)).max(0).sqrt())),I.assign(B.mul(S.y.div(g.y)))}let D=R(f.sub(1)),O=Ht(V(B.add(1)),D),G=s?Ui(d,L.xy,I.mul(.75).div(S.y),B.mul(.75),O.sub(1).max(0).floor()).toVar():d.sample(L.xy).level(O).rgb.toVar(),q=e=>sa(R(0),R(.07),e).mul(sa(R(0),R(.07),R(1).sub(e))),W=q(L.x).mul(q(L.y)),H=L.xy.mul(g),j=_(Je(H),Pe(0)),K=Oi(r.projectionMatrixInverse,L.x,L.y,j).toVar(),$=Ha(K.sub(x),v),X=sa(b.mul(-.05),b.mul(-.005),$),Q=R(1).div(g.x),Z=R(1).div(g.y),Y=_(Je(H.sub(ne(1,0))),Pe(0)),J=_(Je(H.add(ne(1,0))),Pe(0)),ee=_(Je(H.sub(ne(0,1))),Pe(0)),te=_(Je(H.add(ne(0,1))),Pe(0)),ae=Oi(r.projectionMatrixInverse,L.x.sub(Q),L.y,Y),re=Oi(r.projectionMatrixInverse,L.x.add(Q),L.y,J),se=Oi(r.projectionMatrixInverse,L.x,L.y.sub(Z),ee),ie=Oi(r.projectionMatrixInverse,L.x,L.y.add(Z),te),le=or(ya(re.sub(ae),ie.sub(se))).toVar(),oe=Nt(le.z.lessThan(0),le.negate(),le),ue=sa(R(.02),R(.12),Ha(oe,e).negate()),de=h.mul(W).mul(X).mul(ue);U.assign(Xt(F,G,de))}),U};if(e.singleRay)return z(b,l,!0,e.singleRay.footprintOut).toVar();let k=e.noisePixel,A=U(R(52.9829189).mul(U(k.x.mul(.06711056).add(k.y.mul(.00583715))))).mul(2*Math.PI).toVar(),P=Nt(b.y.abs().greaterThan(.99),de(1,0,0),de(0,1,0)),E=or(ya(P,b)).toVar(),N=ya(b,E).toVar(),B=(e,t=4)=>{let a=T.mul(Di*Math.sqrt((e+.5)/t)),r=A.add(2.399963229728653*e);return or(b.mul(pa(a)).add(E.mul(pa(r)).add(N.mul(ea(r))).mul(ea(a)))).toVar()},L=M.and(p.not()),I=Nt(L,B(0),b).toVar(),D=de(0).toVar();D.addAssign(z(I,l,!0));let F=R(1).toVar();return he(L,()=>{D.addAssign(z(B(2),l,!1)),F.assign(2),he(T.greaterThan(.35),()=>{D.addAssign(z(B(1),l,!1)),D.addAssign(z(B(3),l,!1)),F.assign(4)})}),D.div(F).toVar()},Wi=new ds,Hi=class extends ss{constructor(e){super(),this.postprocessingState=Qr.defaultData,this.sceneTransitionPass={uniforms:{mixRatio:N(0),uDPR:{value:1},uResolution:{value:new ds}}},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 Ks,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 Ks(e,128,128);t.wrapS=Ds,t.wrapT=Ds,t.minFilter=js,t.magFilter=js,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=Hi.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=Hi._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(Wi);let e=Math.max(1,Math.round(Wi.x)),t=Math.max(1,Math.round(Wi.y));null===this._rt?this._rt=new vs(e,t,{depthBuffer:!0}):(this._rt.width!==e||this._rt.height!==t)&&(this._rt.dispose(),this._rt=new vs(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":null!==this.sceneTransitionFromTexture&&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),null!==this._chainTransitionTexture&&null===this.sceneTransitionFromTexture&&(this.sceneTransitionPass.uniforms.mixRatio.value=1);let e=a.temporalAAEnabled?a.taaHistory:null;e&&(a.getDrawingBufferSize(Wi),e.beginJitter(t,Wi.x,Wi.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 xs?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 xs?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()}},ji=Hi;ji.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 Ki=(()=>{try{return"1"===new URLSearchParams(window.location.search).get("dbgdestroys")}catch{return!1}})(),$i=[],Xi=6,Qi=()=>-1,Zi=!1,Yi=null;function Ji(e,t,a){$i.push({t:Math.round(performance.now()),frame:Qi(),kind:e,label:t||"(unlabeled)",size:a,stack:((new Error).stack??"").split("\n").slice(2,9).join("\n")}),$i.length>32&&$i.shift()}var en=(e,t)=>({start:Pe(0),end:Pe(t),type:"int",condition:"<",name:e}),tn=Wt;function an(e,t){let a=new vs(e,t,{depthBuffer:!1,type:as,format:ws});return a.texture.generateMipmaps=!1,a.texture.minFilter=js,a.texture.magFilter=js,a}var rn=null;function sn(){return null===rn&&((rn=an(64,8)).texture.name="SplinePCSSPyramidAtlas"),rn.texture}function nn(e,t,a,r,s,i){let n=new Ct,l=qa(t),o=le(()=>{let e=Mt,t=0!==i?e.x.sub(i):e.x,n=Pe(t).mul(a).toVar(),o=Pe(e.y).mul(a).toVar(),u=R(1e9).toVar(),d=R(-1e9).toVar();return ge(en("ly",a),en("lx",a),e=>{let{lx:t,ly:a}=e,i=tn(n.add(t),Pe(0),Pe(r)),h=tn(o.add(a),Pe(0),Pe(r)),m=l.load(Je(i,h));u.assign(Ht(u,m.x)),d.assign(It(d,s?m.y:m.x))}),pe(u,d,0,1)})();return n.fragmentNode=o,n.name=e,n.lights=!1,n.blending=Gs,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,n}var ln=new Set;function on(e){let t=e;if(!t.__spePcssPyramid){t.__spePcssPyramid={fresh:!1,slot:-1,passKey:"",mid:null,small:null,toMid:null,toSmall:null};for(let e of ln)void 0===e.deref()&&ln.delete(e);ln.add(new WeakRef(t.__spePcssPyramid))}return t.__spePcssPyramid}var un=new Array(8).fill(null);function dn(e){return!0===e.__spePcssPyramid?.fresh}function hn(e){return e.__spePcssPyramid?.slot??-1}var mn=!1;var cn=new ms,pn=e=>e,gn=e=>e,fn=e=>e,_n=!0,yn=!0,xn=!0,vn=!0;try{let e=new URLSearchParams(window.location.search),t=e.get("dbgpcss");"classic"===t||"0"===t?(_n=!1,yn=!1,xn=!1,vn=!1):(_n="0"!==e.get("dbgpcsssplit"),yn="0"!==e.get("dbgpcsshw"),xn="0"!==e.get("dbgpcsshiz"),vn="0"!==e.get("dbgshadowmask"))}catch{}var bn=!1,Tn=()=>yn&&bn,wn=()=>xn&&bn,Sn=()=>vn&&bn,Vn=()=>wn(),Mn=()=>Sn(),Cn=[[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 zn(e){let t=e;return t.__spePcssKnobs||(t.__spePcssKnobs={mapSize:N(2048),radius:N(1),penumbraSize:N(.5),depthEps:N(1e-4),penumbraFrameScale:N(1),penumbraFrameOffset:N(0),pyramidEnabled:N(0),pyramidSlot:N(0),maskChannel:N(new xs(0,0,0,0)),planeNormalMat:N((new cs).set(0,0,0,0,0,0,0,0,0))}),t.__spePcssKnobs}function kn(e,t){zn(e).maskChannel.value.set(0===t?1:0,1===t?1:0,2===t?1:0,3===t?1:0)}function An(e,t,a){let r=e,s=zn(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&&wn()){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 Pn(e,t){let a=e.planeNormalMat.mul(t).toVar(),r=a.z,s=Qt(r).add(va(Be(r),R(0))).mul(It(Be(r),R(1e-4)));return ne(a.x.negate().div(s),a.y.div(s)).toVar()}var En=(e,t)=>Wt(Ha(e,t),R(-.05),R(.05));function Nn(e,t,a,r,s,i,n){let l=Tn()?Math.max(4,Rn>>1):Rn,o=_n?Math.max(4,Rn>>1):Rn,u=Tn(),d=zn(t),h=d.mapSize,m=ne(h,h),c=d.radius,p=d.penumbraSize,g=qa(e),f=e=>g.load(Je(Wt(e,ne(0),ne(1)).mul(m))).x,_=R(1).div(m.x).toVar(),y=R(80).div(_.mul(1024)).toVar(),x=d.depthEps,v=Pn(d,n),b=()=>{let t=R(0).toVar(),n=R(0).toVar();for(let e=0;e<o;e++){let i=gn(ee(Pe(e),Pe(o),s)).mul(_).mul(y),l=f(gn(a.add(i))).toVar();he(l.lessThan(r.add(En(v,i)).add(x)),()=>{t.addAssign(l),n.addAssign(1)})}let h=R(0).toVar();he(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(Wt(i.mul(i).mul(200).mul(p),R(0),R(1)))});let m=R(0).toVar();for(let t=0;t<l;t++){let i=gn(ee(Pe(t),Pe(l),s)).mul(_),n=gn(i.mul(c.mul(2)).add(i.mul(h.mul(y)))),o=pn(r.add(En(v,n)));u?m.addAssign(pn(qa(e,gn(a.add(n))).compare(o))):m.addAssign(va(o,f(gn(a.add(n)))))}i.assign(m.div(l))};if(wn()){let e=qa(sn()),t=d.pyramidEnabled,s=d.pyramidSlot,n=R(8),l=R(0).toVar();he(t.greaterThan(.5),()=>{let t=Wt(a,ne(0),ne(1)),i=t.x.mul(n).toVar(),o=t.y.mul(n).toVar(),u=s.mul(n),d=R(1e9).toVar(),h=R(-1e9).toVar();for(let t=-1;t<=1;t++)for(let a=-1;a<=1;a++){let r=Wt(i.add(R(a)),R(0),n.sub(1)),s=Wt(o.add(R(t)),R(0),n.sub(1)),l=gn(ne(r.add(u),s)),m=e.load(Je(l));d.assign(Ht(d,pn(m.x))),h.assign(It(h,pn(m.y)))}let m=_.mul(c.mul(2).add(y)),p=Ht(it(v).mul(m),R(.05)).toVar();he(d.greaterThanEqual(r.add(x).add(p)),()=>{l.assign(1)}).ElseIf(h.lessThan(r.sub(p)),()=>{l.assign(2)})}),he(l.equal(1),()=>{i.assign(1)}).ElseIf(l.equal(2),()=>{i.assign(0)}).Else(b)}else b()}var Bn=le(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=zn(r),i=a.xy.toVar(),n=a.z.toVar(),l=er.toVar(),o=w.pcssHalton,u=Q(Mt.xy.add(o)).mul(6.28318530718).toVar(),d=R(1).toVar();if(Sn()){let e=s.maskChannel,a=w.shadowMaskEnabled,o=w.shadowMaskGBuffer,h=w.shadowMaskTexture,m=R(0).toVar(),c=R(1).toVar();he(a.greaterThan(.5).and(Ha(e,pe(1,1,1,1)).greaterThan(.5)),()=>{let t=kt,a=w.shadowMaskResolution,r=w.shadowMaskFullResolution,s=Ve.z,i=t.mul(a).sub(ne(.5,.5)).toVar(),n=P(i).toVar(),l=i.sub(n).toVar(),u=It(Be(s).mul(.02),R(.05)),d=R(0).toVar(),p=R(0).toVar();for(let t=0;t<=1;t++)for(let i=0;i<=1;i++){let m=gn(Wt(n.add(ne(i,t)),ne(0,0),a.sub(ne(1,1)))),c=gn(m.add(ne(.5,.5)).div(a)),g=gn(P(c.mul(r)).add(ne(.5,.5)).div(r)),f=pn(o.sample(g).w),_=pn(Ha(h.sample(c),e)),y=pn(0===i?R(1).sub(l.x):pn(l.x)),x=pn(0===t?R(1).sub(l.y):pn(l.y)),v=pn(va(Be(f.sub(s)),u)),b=pn(y.mul(x).mul(v)).toVar();d.addAssign(b),p.addAssign(_.mul(b))}he(d.greaterThan(.001),()=>{m.assign(1),c.assign(p.div(d))})}),he(m.greaterThan(.5),()=>{d.assign(c)}).Else(()=>{Nn(t,r,i,n,u,d,l)})}else Nn(t,r,i,n,u,d,l);return d}),Ln=le(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=zn(r),i=a.xy.toVar(),n=a.z.toVar(),l=Pn(s,er.toVar()),o=s.mapSize,u=s.radius.mul(R(1).div(o)).toVar(),d=Q(Mt.xy).mul(6.28318530718).toVar(),h=R(0).toVar();for(let e=0;e<5;e++){let a=gn(ee(Pe(e),Pe(5),d)).mul(u).toVar();h.addAssign(pn(qa(t,gn(i.add(a))).compare(n.add(En(l,a)))))}return h.mul(.2)}),In=le(e=>{let{depthTexture:t,bd3D:a,dp:r,shadow:s}=e,i=Rn,n=zn(s),l=n.mapSize,o=n.radius,u=R(1).div(l).toVar(),d=w.pcssHalton,h=Q(Mt.xy.add(d)).mul(6.28318530718).toVar(),m=o.add(5).toVar(),c=R(0).toVar();for(let e=0;e<i;e++){let s=gn(ee(Pe(e),Pe(i),h)).mul(u).toVar(),n=fn(de(s.x,s.y,pn(s.x).negate()).mul(m)),l=fn(a.add(n));c.addAssign(pn(Ta(t,l).compare(r)))}return c.div(i)});function Dn(e,t){let a=t;return a.isPointLight?(T.pcssHookServes++,Hn):a.isSpotLight||a.isDirectionalLight?(T.pcssHookServes++,Wn):null}var Fn=N(1);function Un(e){Fn.value=e?1:0}var On=(e,t)=>e(t),Gn=["depthTexture","shadowCoord","shadow","depthLayer","bd3D","dp"];function qn(e,t){return a=>{let r=function(e){let t=e,a={};if(null==t)return a;for(let e of Gn){let r=t[e];void 0!==r&&(a[e]=r)}return a}(a),s=On(e,r),i=On(t,r);return le(()=>{let e=R(1).toVar();return he(Fn.greaterThan(.5),()=>{e.assign(s)}).Else(()=>{e.assign(i)}),e})()}}var Wn=qn(Bn,Ln),Hn=qn(In,Ce),jn=new $a,Kn=new Ms,$n=new ds,Xn=class{constructor(){this._gBuffer=null,this._maskTarget=null,this._resolveMaterial=null,this._resolveKey="",this._cameraWorld=N(new Ss),this._projInv=N(new Ss),this._lightRows=[];let e=new Ct;e.name="SplineShadowMask.gbuffer",e.fragmentNode=pe(Qa,Ve.z),e.lights=!1,e.blending=Gs,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 Ct;t.name="SplineShadowMask.resolve";let a=qa(this._gBuffer.depthTexture),r=qa(this._gBuffer.texture),s=this._cameraWorld,i=this._projInv,n=this._gBuffer.width,l=this._gBuffer.height;this._lightRows=e.map(()=>({matrix:N(new Ss),bias:N(0),normalBias:N(0)}));let o=this._lightRows,u=le(()=>{let t=$(),u=P(t.mul(ne(n,l))).add(ne(.5,.5)).div(ne(n,l)).toVar(),d=a.sample(u),h=se(u,d,i).toVar(),m=r.sample(u).toVar(),c=s,p=c.mul(pe(h,1)).xyz.toVar(),g=or(c.mul(pe(m.xyz,0)).xyz).toVar(),f=w.pcssHalton,_=Q(Mt.xy.add(f)).mul(6.28318530718).toVar(),y=[R(1).toVar(),R(1).toVar(),R(1).toVar(),R(1).toVar()];return e.forEach((e,t)=>{let a=o[t],r=p.add(g.mul(a.normalBias)),s=a.matrix.mul(pe(r,1)).toVar(),i=s.xyz.div(s.w),n=de(i.x,R(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));he(u,()=>{Nn(e.shadow.map.depthTexture,e.shadow,n.xy,l,_,y[t],g)})}),pe(y[0],y[1],y[2],y[3])})();return t.fragmentNode=u,t.lights=!1,t.blending=Gs,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,t}render(e,t,a,r,s){let i=s??e.getDrawingBufferSize($n),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 vs(n,l,{type:rs,depthTexture:new os(n,l),minFilter:Ys,magFilter:Ys});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 vs(o,u,{depthBuffer:!1,minFilter:Ys,magFilter:Ys});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(Kn),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 jn.material=this._resolveMaterial,jn.name="SplineShadowMask.resolve",e.setRenderTarget(this._maskTarget),jn.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)=>{kn(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=""}},Qn=e=>e,Zn=e=>e,Yn=new $a,Jn=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 el(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 tl=Array.from({length:16},(e,t)=>[el(t+1,2),el(t+1,3)]),al="h16";try{let e=new URLSearchParams(window.location.search).get("dbgjitseq");("r2"===e||"h64"===e||"white"===e||"half"===e)&&(al=e)}catch{}function rl(e){return de(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 sl(e,t=!0){let a=de(e.x.add(e.y).sub(e.z),e.x.add(e.z),e.x.sub(e.y).sub(e.z));return t?Wt(a,de(0),de(1)):It(a,de(0))}var il=class extends xt{constructor(e,t,a,r,s=!1){super("vec4"),this._resolution=N(new ds(1,1)),this._historyValid=N(0),this._jitterUV=N(new ds(0,0)),this._resolveMaterials=null,this._rebuildResolveMaterials=null,this.beautyNode=e,this.depthNode=t,this.velocityNode=a,this._hdr=s,this._history=r??nl(),this._ownsHistory=void 0===r,this._outputTexNode=qa(this._history.rtA.texture)}static get type(){return"SplineTAANode"}get outputTextureNode(){return this._outputTexNode}renderResolve(e){ye.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&&(Yn.material=n,Yn.name="SplineTAA.resolve",Yn.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 pe(rl(t.rgb),t.a)},v=e=>{let c=le(()=>{let c=$().toVar();if(h)return pe(y.x.mul(400).add(.5),y.y.mul(400).add(.5),R(.5),R(1));let v=c,b=ne(R(1).div(f.x),R(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(ne(b.x.mul(e),b.y.mul(t))).toVar()),S=T,V=R(t?-1e3:1e3).toVar(),M=ne(T[4]).toVar();for(let e=0;e<9;e++){let a=Qn(g.load(Je(T[e].mul(Zn(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 C=p.load(Je(M.mul(f))).xy.mul(ne(.5,-.5)).toVar();s&&C.assign(ne(0,0));let z=c.sub(C).toVar(),k=a?ne(z.x,R(1).sub(z.y)).toVar():z,A=x(v).toVar();if(r)return pe(C.x.mul(20).add(.5),C.y.mul(20).add(.5),_,R(1));if(o){let e=new Ks(new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]),2,2);return e.needsUpdate=!0,qa(e).sample(c)}if(l){let t=a?ne(c.x,R(1).sub(c.y)):c;return e.sample(t)}if(n){let t=a?ne(c.x,R(1).sub(c.y)):c,r=e.sample(k),s=e.sample(t),i=A.x,n=e=>rl(e.rgb).x;return pe(n(r).sub(i).abs().mul(8),n(s).sub(i).abs().mul(8),R(0),R(1))}let E=k.mul(f).toVar(),N=P(E.sub(.5)).add(.5).toVar(),B=E.sub(N).toVar(),L=B.mul(B.mul(B.mul(-.5).add(1)).add(-.5)).toVar(),I=B.mul(B).mul(B.mul(1.5).add(-2.5)).add(1).toVar(),D=B.mul(B.mul(B.mul(-1.5).add(2)).add(.5)).toVar(),F=B.mul(B).mul(B.mul(.5).add(-.5)).toVar(),U=I.add(D).toVar(),O=D.div(U).toVar(),G=N.sub(1).div(f).toVar(),q=N.add(2).div(f).toVar(),W=N.add(O).div(f).toVar(),H=pe(0).toVar();H.addAssign(e.sample(ne(W.x,G.y)).mul(U.x.mul(L.y))),H.addAssign(e.sample(ne(G.x,W.y)).mul(L.x.mul(U.y))),H.addAssign(e.sample(ne(W.x,W.y)).mul(U.x.mul(U.y))),H.addAssign(e.sample(ne(q.x,W.y)).mul(F.x.mul(U.y))),H.addAssign(e.sample(ne(W.x,q.y)).mul(U.x.mul(F.y)));let j=pe(rl(H.rgb),H.a).toVar();if(m)return pe(sl(j.rgb).mul(de(1,.55,.55)),H.a);let K=x(S[0]).toVar(),X=x(S[1]).toVar(),Q=x(S[2]).toVar(),Z=x(S[3]).toVar(),Y=x(S[4]).toVar(),J=x(S[5]).toVar(),ee=x(S[6]).toVar(),te=x(S[7]).toVar(),ae=x(S[8]).toVar(),re=pe(Ht(K,Ht(X,Ht(Q,Ht(Z,Ht(Y,Ht(J,Ht(ee,Ht(te,ae))))))))).toVar(),se=pe(It(K,It(X,It(Q,It(Z,It(Y,It(J,It(ee,It(te,ae))))))))).toVar(),ie=pe(Ht(X,Ht(Z,Ht(Y,Ht(J,te))))).toVar(),le=pe(It(X,It(Z,It(Y,It(J,te))))).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=pe(i?j:Wt(j,re,se)).toVar(),me=d||i?R(.9):R(.9).mul(_),ce=pe(Xt(A,he,me)).toVar(),ge=w.tapAngle,fe=et(c.mul(f).add(ne(ge.mul(127.1),ge.mul(311.7)))).sub(.5).mul(1/255);return pe(sl(ce.rgb,!this._hdr).add(de(fe)),ce.a)}),v=new Ct;return v.name="SplineTAA.resolve",v.colorNode=c(),v.depthTest=!1,v.depthWrite=!1,v.blending=Gs,v.needsUpdate=!0,v};return this._rebuildResolveMaterials=()=>{this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose()),this._resolveMaterials=[v(qa(this._history.rtB.texture)),v(qa(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),ye.setProjectionMatrix(null)}};function nl(){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 vs(e,t,{minFilter:Ys,magFilter:Ys,depthBuffer:!1});return a()?s.texture.type=rs: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 Ss,jitterOffsetUV:new ds(0,0),beginJitter(e,t,a){if(l)return;let r,s;if(l=!0,(null===n||n.cam!==e)&&(n?.clearViewOffset(),n=new Jn(e)),this.unjitteredProjection.copy(e.projectionMatrix),w.unjitteredProjection.value.copy(e.projectionMatrix),"r2"===al){let e=++this.jitterIndex;r=(.5+.7548776662466927*e)%1,s=(.5+.5698402909980532*e)%1}else if("white"===al)this.jitterIndex++,r=Math.random(),s=Math.random();else if("h64"===al)r=el(this.jitterIndex%64+1,2),s=el(this.jitterIndex%64+1,3),this.jitterIndex=(this.jitterIndex+1)%64;else if("half"===al){let[e,t]=tl[this.jitterIndex];r=.5+.5*(e-.5),s=.5+.5*(t-.5),this.jitterIndex=(this.jitterIndex+1)%tl.length}else[r,s]=tl[this.jitterIndex],this.jitterIndex=(this.jitterIndex+1)%tl.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 ll,ol=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}},ul=new $a,dl=new ds,hl=class extends xt{static get type(){return"SMAANode"}constructor(e){super("vec4"),this.textureNode=e,this.updateBeforeType=xe.FRAME,this._renderTargetEdges=new vs(1,1,{depthBuffer:!1,type:rs}),this._renderTargetEdges.texture.name="SMAANode.edges",this._renderTargetWeights=new vs(1,1,{depthBuffer:!1,type:rs}),this._renderTargetWeights.texture.name="SMAANode.weights",this._renderTargetBlend=new vs(1,1,{depthBuffer:!1,type:rs}),this._renderTargetBlend.texture.name="SMAANode.blend";let t=this,a=new Image;a.crossOrigin="anonymous",a.src=ts("smaa-node-area.png"),a.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new fs,this._areaTexture.name="SMAANode.area",this._areaTexture.image=a,this._areaTexture.minFilter=Ys,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;let r=new Image;r.crossOrigin="anonymous",r.src=ts("smaa-node-search.png"),r.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new fs,this._searchTexture.name="SMAANode.search",this._searchTexture.image=r,this._searchTexture.magFilter=js,this._searchTexture.minFilter=js,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._invSize=N(new ds),this._areaTextureUniform=qa(this._areaTexture),this._searchTextureUniform=qa(this._searchTexture),this._edgesTextureUniform=qa(this._renderTargetEdges.texture),this._weightsTextureUniform=qa(this._renderTargetWeights.texture),this._materialEdges=new Ct,this._materialEdges.name="SMAANode.edges",this._materialWeights=new Ct,this._materialWeights.name="SMAANode.weights",this._materialBlend=new Ct,this._materialBlend.name="SMAANode.blend",this._textureNode=te(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;ll=Ya.resetRendererState(t,ll);let a=t.getDrawingBufferSize(dl);this.setSize(a.width,a.height),t.setRenderTarget(this._renderTargetEdges),ul.material=this._materialEdges,ul.render(t),t.setRenderTarget(this._renderTargetWeights),ul.material=this._materialWeights,ul.render(t),t.setRenderTarget(this._renderTargetBlend),ul.material=this._materialBlend,ul.render(t),Ya.restoreRendererState(t,ll)}setup(e){let t=ne(.00625,.0017857142857142857),a=1/7,r=this.textureNode.uvNode||$(),s=le(()=>{let e=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-1,0,0,-1))),t=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(1,0,0,1))),a=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-2,0,0,-2)));return ae("vec4","vOffset0").assign(e),ae("vec4","vOffset1").assign(t),ae("vec4","vOffset2").assign(a),ga}),i=le(()=>{let e=ae("vec4","vOffset0"),t=ae("vec4","vOffset1"),a=ae("vec4","vOffset2"),s=ne(.1,.1),i=pe().toVar(),n=this.textureNode.sample(r).rgb.toVar(),l=this.textureNode.sample(e.xy).rgb.toVar(),o=Be(n.sub(l));i.x=It(o.r,o.g,o.b);let u=this.textureNode.sample(e.zw).rgb.toVar();o=Be(n.sub(u)),i.y=It(o.r,o.g,o.b);let d=va(s,i.xy).toVar();Ha(d,ne(1,1)).equal(0).discard();let h=this.textureNode.sample(t.xy).rgb.toVar();o=Be(n.sub(h)),i.z=It(o.r,o.g,o.b);let m=this.textureNode.sample(t.zw).rgb.toVar();o=Be(n.sub(m)),i.w=It(o.r,o.g,o.b);let c=It(i.x,i.y,i.z,i.w).toVar(),p=this.textureNode.sample(a.xy).rgb.toVar();o=Be(n.sub(p)),i.z=It(o.r,o.g,o.b);let g=this.textureNode.sample(a.zw).rgb.toVar();return o=Be(n.sub(g)),i.w=It(o.r,o.g,o.b),c=It(c,i.z,i.w),d.xy.mulAssign(ne(va(R(.5).mul(c),i.xy))),pe(d,0,0)}),n=le(([e,t,a,r])=>{let s=ne(t).toVar();return s.r=a.add(s.r.mul(r)),R(255).mul(e.sample(s)).r}),l=le(([e,r,s,i,n])=>{let l=R(16).mul(R(4).mul(ne(s,i)).round()).add(r);return l=t.mul(l).add(R(.5).mul(t)),l.y.addAssign(R(a).mul(n)),e.sample(l).rg}),o=le(([e,t,a,r])=>{let s=ne(0,1).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(ne(2,0).mul(this._invSize)),he(i.x.lessThanEqual(r).or(s.g.lessThanEqual(R(.8281)).or(s.r.notEqual(R(0)))),()=>{J()})}),i.x.addAssign(R(.25).mul(this._invSize.x)),i.x.addAssign(this._invSize.x),i.x.addAssign(R(2).mul(this._invSize.x)),i.x.subAssign(this._invSize.x.mul(n(t,s,0,.5))),i.x}),u=le(([e,t,a,r])=>{let s=ne(0,1).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(ne(2,0).mul(this._invSize)),he(i.x.greaterThanEqual(r).or(s.g.lessThanEqual(R(.8281)).or(s.r.notEqual(R(0)))),()=>{J()})}),i.x.subAssign(R(.25).mul(this._invSize.x)),i.x.subAssign(this._invSize.x),i.x.subAssign(R(2).mul(this._invSize.x)),i.x.addAssign(this._invSize.x.mul(n(t,s,.5,.5))),i.x}),d=le(([e,t,a,r])=>{let s=ne(1,0).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(ne(0,-2).mul(this._invSize)),he(i.y.lessThanEqual(r).or(s.r.lessThanEqual(R(.8281)).or(s.g.notEqual(R(0)))),()=>{J()})}),i.y.addAssign(R(.25).mul(this._invSize.y)),i.y.addAssign(this._invSize.y),i.y.addAssign(R(2).mul(this._invSize.y)),i.y.subAssign(this._invSize.y.mul(n(t,s.gr,0,.5))),i.y}),h=le(([e,t,a,r])=>{let s=ne(1,0).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(ne(0,-2).mul(this._invSize)),he(i.y.greaterThanEqual(r).or(s.r.lessThanEqual(R(.8281)).or(s.g.notEqual(R(0)))),()=>{J()})}),i.y.subAssign(R(.25).mul(this._invSize.y)),i.y.subAssign(this._invSize.y),i.y.subAssign(R(2).mul(this._invSize.y)),i.y.addAssign(this._invSize.y.mul(n(t,s.gr,.5,.5))),i.y}),m=le(()=>{let e=r.xy.div(this._invSize),t=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-.25,-.125,1.25,-.125))).toVar(),a=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-.125,-.25,-.125,1.25))).toVar(),s=pe(t.xz,a.yw).add(pe(-2,2,-2,2).mul(pe(this._invSize.xx,this._invSize.yy)).mul(R(8))).toVar();return ae("vec2","vPixcoord").assign(e),ae("vec4","vOffset0").assign(t),ae("vec4","vOffset1").assign(a),ae("vec4","vOffset2").assign(s),ga}),c=le(()=>{let e=ae("vec2","vPixcoord"),t=ae("vec4","vOffset0"),a=ae("vec4","vOffset1"),s=ae("vec4","vOffset2"),i=pe(0,0,0,0).toVar(),n=pe(0,0,0,0).toVar(),m=this._edgesTextureUniform.sample(r).rg.toVar();return he(m.g.greaterThan(R(0)),()=>{let r=ne().toVar(),d=ne().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=ne().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=fa(Be(r)),p=this._edgesTextureUniform.sample(m.add(ne(1,0).mul(this._invSize))).r.toVar();i.r=p,i.rg=l(this._areaTextureUniform,c,h,p,R(n.y))}),he(m.r.greaterThan(R(0)),()=>{let r=ne().toVar(),o=ne().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=ne().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=fa(Be(r)),p=this._edgesTextureUniform.sample(m.add(ne(0,1).mul(this._invSize))).g.toVar();i.ba=l(this._areaTextureUniform,c,u,p,R(n.x))}),i}),p=le(()=>{let e=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(1,0,0,1)));return ae("vec4","vOffset1").assign(e),ga}),g=le(()=>{let e=ae("vec4","vOffset1"),t=pe().toVar(),a=pe().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,he(Ha(a,pe(1)).lessThan(1e-5),()=>{t.assign(this.textureNode.sample(r))}).Else(()=>{let e=ne().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()),he(Be(e.x).greaterThan(Be(e.y)),()=>{e.y.assign(0)}).Else(()=>{e.x.assign(0)});let s=this.textureNode.sample(r).toVar(),i=ne(r).toVar();i.addAssign(Qt(e).mul(this._invSize));let n=this.textureNode.sample(i).toVar(),l=Be(e.x).greaterThan(Be(e.y)).select(Be(e.x),Be(e.y)).toVar(),o=Xt(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""}},ml=new ds,cl=new Ms,pl=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 vs(e,t,{depthBuffer:!0,stencilBuffer:!1,samples:0});a.texture.name="SplineHelperOverlay.color",this._rt=a}if(null===this._texNode){this._texNode=qa(this._rt.texture),this._smaaNode=(r=this._texNode,new hl(da(r)));let e=new Ct;e.name="SplineHelperOverlayComposite",e.fragmentNode=this._smaaNode,e.transparent=!0,e.blending=Js,e.blendEquation=ai,e.blendSrc=li,e.blendDst=us,e.blendSrcAlpha=li,e.blendDstAlpha=us,e.depthTest=!1,e.depthWrite=!1,this._material=e,this._quad=new $a(e);let t=new Ct;t.name="SplineHelperOverlayDepthSeed",this._depthTexNode=qa(a),t.depthNode=this._depthTexNode.x,t.fragmentNode=pe(0),t.colorWrite=!1,t.depthTest=!1,t.depthWrite=!0,this._seedMaterial=t,this._seedQuad=new $a(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(ml);let i=this._ensureTarget(ml.x,ml.y,s),n=e.getRenderTarget(),l=e.autoClear;e.getClearColor(cl);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(cl,o),b()){let t=e.toneMapping,a=e.outputColorSpace;e.toneMapping=Cs,e.outputColorSpace=ps.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()}},gl=new WeakMap,fl=new Set,_l=0;var yl=new WeakMap,xl=new Set,vl=0;function bl(e){let t=e.parent?.selectedTexture;return t&&!0===t.isTexture?t:null}function Tl(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 wl=new WeakMap;function Sl(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=R(1).sub(R(1).sub(e).mul(R(1).sub(t))).toVec3();return Xt(e,a,s)}case 10:return Xt(e,e.mul(t),s);default:return Xt(e,t,s)}}var Vl=null;function Ml(){return null===Vl&&(Vl=Ca({output:O,velocity:ye})),Vl}var Cl=le(e=>{let t=e.lightDistance,a=e.cutoffDistance,r=e.decayExponent,s=a.greaterThan(0).and(r.greaterThan(0));return Nt(s,t.div(a).oneMinus().clamp().pow(r),R(1))}),Rl=class extends ar{static get type(){return"SplinePointLightNode"}setupDirect(e){let t=this.getLightVector(e),a=t.normalize(),r=Cl({lightDistance:t.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode});return{lightColor:this.colorNode.mul(r),lightDirection:a}}},zl=class extends B{static get type(){return"SplineSpotLightNode"}setupDirect(e){let t,a,r=this.light,s=this.getLightVector(e),i=s.normalize(),n=i.dot(ot(r)),l=this.getSpotAttenuation(e,n),o=Cl({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=qa(d.map,a.xy).onRenderUpdate(()=>d.map)),t&&a){let e=a.mul(2).sub(1).abs().lessThan(1).all();u=Nt(e,u.mul(t),u)}return{lightColor:u,lightDirection:i}}},kl=null,Al=new ms,Pl=new ms,El=new Ms,Nl=new Ms,Bl=new Ms,Ll=new ms,Il=new ms,Dl=new ds,Fl=new ms(1,0,0),Ul=new ms(0,1,0),Ol=new ms(0,0,1),Gl=new ms,ql=new ms,Wl=new ms,Hl=new ms,jl=new Ss,Kl=new ms,$l=new ms,Xl=new ei,Ql=new xs,Zl=new xs,Yl=new ds,Jl=new ds,eo=new ms,to=new ms,ao=new ms,ro=new ms,so=new ms,io=[],no=!1,lo=!1,oo=!1,uo="full",ho="g16",mo=!1,co=!1,po=!1,go="default",fo=!1,_o=!0,yo=!0,xo=!0,vo=!0,bo=!0,To=br;try{let e=new URLSearchParams(window.location.search),t=e.get("instancing");if(null!==t)if("off"===t||"0"===t||"false"===t||"no"===t)bo=!1;else{let e=Number.parseInt(t,10);Number.isFinite(e)&&e>1&&(To=e)}no="0"===e.get("dbgao"),lo="0"===e.get("dbgshadow"),oo="1"===e.get("dbgfp16"),mo="0"===e.get("dbgsky"),co="0"===e.get("dbgssr"),po="0"===e.get("dbgibl");let a=e.get("pbrcolor");"0"===a?go="off":("linear"===a||"aces"===a||"agx"===a||"neutral"===a)&&(go=a),fo="0"===e.get("dbgplanar"),_o="0"!==e.get("dbgplanarpyr"),yo="0"!==e.get("dbgssrpyr"),xo="0"!==e.get("dbgssrhalf"),vo="0"!==e.get("dbgssrresolve");let r=e.get("dbgprefilter");"0"===r?uo="off":"base"===r?uo="base":"k4"===r&&(ho="k4")}catch{}function wo(){return"function"!=typeof requestAnimationFrame||typeof document<"u"&&!0===document.hidden?Promise.resolve():new Promise(e=>{let t=!1,a=()=>{t||(t=!0,clearTimeout(r),e())},r=setTimeout(a,250);requestAnimationFrame(a)})}var So=class extends F{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:oo?rs:ri,asyncCompilation:!0===e.asyncCompilation||"load"===e.asyncCompilation}),this.viewportWidth=1,this.viewportHeight=1,this.resolution=new ds,this.dummyCamera=new Ar,this.sceneTransitionDuration=0,this.sceneTransitionTimeRemaining=-1,this.manageShadowUpdates=!1,this.forceShadowUpdates=!1,this._shadowMapMissingAtSync=!1,this._shadowSyncPromotions=-1,this._lightShadowStateDirty=!1,this._lightShadowSignatures=new WeakMap,this._shadowMapIds=new WeakMap,this._shadowMapIdSeq=0,this.temporalAAEnabled=!0,this.hdrChainActive=!1,this.isWebGPUSplineRenderer=!0,this.shadowFilterHook=Dn,this._gaugeSnapshot="",this._gaugeChangedAt=0,this._gaugeStallWarned=!1,this._skipStalls=new ol,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.suppressShadowMask=!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(),Ki&&function(){if(!Zi){if(Zi=!0,Qi=()=>w.frameIndex.value,typeof GPUBuffer<"u"){let e=GPUBuffer.prototype.destroy;GPUBuffer.prototype.destroy=function(){return Ji("buffer",this.label,this.size),e.call(this)}}if(typeof GPUTexture<"u"){let e=GPUTexture.prototype.destroy;GPUTexture.prototype.destroy=function(){return Ji("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 ji(this),this.library.addLight(Ei,Pi),this.shadowMap.enabled=!0,this.shadowMap.type=Ns,t=!0===this.backend?.isWebGPUBackend,bn=t,this._deferGpuBufferDestruction(),this.outputColorSpace=ys,this.toneMapping=Cs,function(e){let t=e.library;t.addLight(Rl,Vr),t.addLight(zl,kr),t.addLight(C,zr),t.lightNodes.delete(oi),t.lightNodes.delete(ni),t.addLight(Rl,oi),t.addLight(zl,ni)}(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>So._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 ${So._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=nl()),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 vs(2,2,{count:2});e.textures[0].name="output",e.textures[0].type=ri,e.textures[1].name="velocity",e.textures[1].type=rs;let t=new os(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 Sr?e.activePage:e;Un(Zr.isSoft(t?.data?.shadow)),t&&yi(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(Ml())),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(Ml())),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 Sr?e:e.scene;if(!0!==a.needsTransmission?.()&&!0!==a.needsReflection?.())return null;if(null===this._grabWarmupTarget){let e=new vs(2,2);e.texture.type=ri;let t=new os(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=yl.get(e);return a&&(a.epoch!==vl||a.srcMaterial!==t||a.geometry!==e.geometry||a.position.src!==e.geometry.getAttribute("position")||a.map!==t.map||a.selectedMap!==bl(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=bl(e),o=new Qs(r.array,3);o.setUsage(Ws);let u={src:r,attr:o,version:r.version},d=[],h=e=>{let t=new Qs(new Float32Array(e.count),1);t.setUsage(Ws);let a={src:e,attr:t,version:e.version};return Tl(a),d.push(a),a},m=s?h(s):null,c=i?h(i):null,p=new Ua;p.name=`SplinePointsTwin(${t.name||t.type})`,p.positionNode=Se(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?Se(m.attr,"float"):null,f=c?Se(c.attr,"float"):null;p.colorNode=le(()=>{null!==f?re(f.lessThan(.5)):null!==g&&re(g.greaterThan(.5));let e=null!==n?qa(n,$()):pe(1);return(null!==g&&null!==n&&null!==l?Xt(e,qa(l,$()),g):e).mul(pe(zt,1))})();let _=new Bs(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:vl};return xl.add(new WeakRef(y)),y}(e,t),yl.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&&(Tl(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=wl.get(e);return a&&(a.epoch!==vl||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 Qs(new Float32Array(e.count*t),t);a.setUsage(Ws);let r={src:e,attr:a,version:e.version};return Tl(r),r},i=s(a.getAttribute("position"),3),n=s(a.getAttribute("hover"),1),l=s(a.getAttribute("selected"),1),o=N(r.pointSize.value),u=N((new Ms).fromArray(r.color.value)),d=new Ua;d.name=`SplinePointsTwin(${t.name||t.type})`,d.positionNode=Se(i.attr,"vec3");let h=Se(n.attr,"float"),m=Se(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=le(()=>{let e=it($().mul(2).sub(1)).toVar();re(e.greaterThan(1));let t=Nt(m.equal(1),de(.22,.9,.7),u.add(h.mul(.25)));return pe(Nt(e.greaterThan(.75),de(1),t),1)})();let c=new Bs(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:vl};return xl.add(new WeakRef(p)),p}(e,t),wl.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&&(Tl(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=gl.get(e);if(!t||t.epoch!==_l){let a=new Ft;a.name=`SplineHelperTwin(${e.name||e.type})`,a.worldUnits=!1,t={twin:a,epoch:_l},gl.set(e,t),fl.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 pl),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=Z(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(Ml()),o=function(e,t,a,r,s=!1){return new il(e,t,a,r,s)}(n,s.getTextureNode("depth"),s.getTextureNode("velocity"),e.taaHistory,i),l=o,s.getTexture("velocity").type=rs;try{if("1"===new URLSearchParams(window.location.search).get("dbgvel")){let e=s.getTextureNode("velocity");l=pe(e.x.mul(20).add(.5),e.y.mul(20).add(.5),R(.5),R(1))}}catch{}}i?s.getTexture("output").type=rs:v()&&(s.getTexture("output").internalFormat="rgba8unorm-srgb");let u=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,d={bloomIntensity:N(1),caOffset:N(new ds(0,0)),vignetteOffset:N(0),vignetteDarkness:N(0),hue:N(0),saturationPlus1:N(1),brightness:N(0),bcContrastScale:N(1),dofFocusDistance:N(0),dofFocalLength:N(0),dofBokehScale:N(1),dofCameraNear:N(50),dofCameraFar:N(1e4),dofOrtho:N(0),pixelCells:N(new ds(1,1)),bloomOpacity:N(1),caOpacity:N(1),vignetteOpacity:N(1),noiseOpacity:N(1),hueSaturationOpacity:N(1),brightnessContrastOpacity:N(1),dofOpacity:N(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);let r=Math.min(u(e.brightnessContrast.contrast,0),.9999);d.bcContrastScale.value=r>0?1/(1-r):1+r,d.brightnessContrastOpacity.value=u(e.brightnessContrast.opacity,1);let s=t.camera,i=!0===s?.isPerspectiveCamera,n=u(s?.near,50),l=u(s?.far,1e4),o=l-n,h=u(e.depthOfField.focusDistance,0),m=i?h/2e3:(h+992)/2e3;d.dofFocusDistance.value=n+m*o,d.dofFocalLength.value=u(e.depthOfField.focalLength,0)/2e3*o,d.dofBokehScale.value=u(e.depthOfField.bokehScale,1),d.dofOpacity.value=u(e.depthOfField.opacity,1),d.dofCameraNear.value=n,d.dofCameraFar.value=l,d.dofOrtho.value=i?0:1;let c=a.resolution.x?a.resolution:new ds(a.viewportWidth*a.getPixelRatio(),a.viewportHeight*a.getPixelRatio()),p=Math.floor(u(e.pixelation.granularity,30));p%2>0&&(p+=1);let g=p>0;d.pixelCells.value.set(g?c.x/p:c.x,g?c.y/p:c.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(_($()));c=Xt(c,e.rgb,1),p=Xt(p,e.a,1)}let x=null;if(r&&a.bloom.enabled){let e=Jr("bloom");if(e){let t=a.bloom;x=e(o?o.outputTextureNode:n,{kernelSize:Xr(t.kernelSize),blurScale:u(t.blurScale,1),luminanceThreshold:u(t.luminanceThreshold,.9),luminanceSmoothing:u(t.luminanceSmoothing,.025)});let r=Wt(x.mul(d.bloomIntensity),0,1);c=Sl(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=R(1).sub(R(1).sub(e).mul(R(1).sub(t)));return Xt(e,a,s)}case 10:return Xt(e,e.mul(t),s);default:return Xt(e,t,s)}}(p,r.a,t.blendFunction,d.bloomOpacity)}else es("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=$().sub(.5),l=r.sample(s($().add(i.mul(t)))).r,o=r.sample(s($())).g,u=r.sample(s($().sub(i.mul(t)))).b;c=Sl(c,de(l,o,u),e.blendFunction,d.caOpacity)}if(r&&a.vignette.enabled){let e=a.vignette,t=it($().sub(.5)),r=sa(R(.8).mul(d.vignetteOffset),d.vignetteOffset.add(.799),t.mul(d.vignetteDarkness));c=Sl(c,c.mul(r.oneMinus()),e.blendFunction,d.vignetteOpacity)}if(r&&a.noise.enabled){let e=a.noise,t=U(ea(Ha($().add(U(tr)),ne(12.9898,78.233))).mul(43758.5453));c=Sl(c,de(t),e.blendFunction,d.noiseOpacity)}if(r&&a.hueSaturation.enabled){let e=a.hueSaturation,t=me(c,d.hue);t=Tt(t,d.saturationPlus1),c=Sl(c,t,e.blendFunction,d.hueSaturationOpacity)}if(r&&a.brightnessContrast.enabled){let e=a.brightnessContrast,t=c.add(de(d.brightness));t=t.sub(.5).mul(d.bcContrastScale).add(.5),c=Sl(c,t.min(1),e.blendFunction,d.brightnessContrastOpacity).max(0)}if(r&&a.depthOfField.enabled){let e=Jr("depthOfField");if(e){let t=a.depthOfField,r=s.getTextureNode("depth"),i=Xt(ie(r,d.dofCameraNear,d.dofCameraFar),I(r,d.dofCameraNear,d.dofCameraFar),d.dofOrtho);c=Sl(c,e(pe(c,p),i,d.dofFocusDistance,d.dofFocalLength,d.dofBokehScale).rgb,t.blendFunction,d.dofOpacity)}else es("depthOfField","webgpu")}let b=pe(c,p);if(t.uiOverlayEnabled&&t.uiCanvasTexture){let e=qa(t.uiCanvasTexture,$().flipY()),a=Xt(b.rgb,e.rgb,e.a),r=Wt(b.a.add(e.a),0,1);b=pe(a,r)}let T=t.sceneTransitionFromTexture;if(T){let e=qa(T,$()),a=t.sceneTransitionPass.uniforms.mixRatio;b=Xt(e,b,a)}let w=t.watermarkTexture;if(w){let t=w.image,a=t?.width||128,r=t?.height||32,s=new ds(e.viewportWidth*e.getPixelRatio(),e.viewportHeight*e.getPixelRatio()),i=12*e.getPixelRatio(),n=.5*a*e.getPixelRatio(),l=.5*r*e.getPixelRatio(),o=ne((s.x-n-i)/s.x,i/s.y),u=ne(n/s.x,l/s.y),d=$().flipY().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=Wt(d,0,1),c=qa(w,m),p=c.a.mul(h.select(R(1),R(0)));b=pe(Xt(b.rgb,c.rgb,p),Wt(b.a.add(p),0,1))}let S=new G(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(),(pr()?.drainRetired()??0)+(d()?.drainRetired()??0)>0&&this._retireBundleRecords(),Ki&&function(e){if(null==e||e===Yi)return;let t=e;"function"==typeof t.addEventListener&&(Yi=e,t.addEventListener("uncapturederror",e=>{let t=e?.error?.message??"";!t.toLowerCase().includes("destroyed")||Xi<=0||(Xi--,console.warn(`[spline/webgpu][dbgdestroys] submit rejected at frame ${Qi()} (t=${Math.round(performance.now())}ms):\n${t.slice(0,400)}\n— last ${$i.length} destroy() calls, newest last (a stack WITHOUT _disposeRetiredGrabTargets bypassed the deferral):`,$i.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 Sr?a.activePage:a,u=l.visible;l.visible=!0;let h=l.scene;if(yi(l),this.renderStarted=!0,bo&&a instanceof Sr){let e=a.updateInstanceGroups(l,To);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=mo?null:l.skyState;if(!0===m?.enabled){if(this.skyEnvironmentNeeded=!co&&(h.needsReflectionDirty||h.needsReflection())||!po&&!0===m.lighting,null===this._skySystem){let e=kl;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;!po&&!0===m?.enabled&&this._skySystem&&(c=this._skySystem.iblTexture??null,p=this._skySystem.iblRotationY??0),function(e){if(Mi.quality===e)return!1;Mi.quality=e;for(let e of Ci)Ri(e)}("low"===m?.lightingQuality?"low":"full"),function(e){if(Mi.texture===e)return!1;Mi.texture=e,Mi.version++;for(let e of Ci)Ri(e)}(c),Mi.rotation.set(0,-p,0),l.environmentIntensity=!0===m?.enabled?m.lightingIntensity??1:1;{let e="off"===go?null:l.gradingState,t="default"!==go&&"off"!==go,a=t||"linear"===e?.pipeline,r=t?"linear"===go?"none":go:e?.toneMapping??"aces";this.toneMapping=a?"aces"===r?ks:"agx"===r?As:"neutral"===r?Ps:Cs:Cs,this.toneMappingExposure=a?e?.exposure??1:1,this.outputColorSpace=a?gs:ys,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 _=Cn[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),this.sceneBundlesEnabled&&this._lightShadowStateDirty&&(this._lightShadowStateDirty=!1,this._updateSceneBundle(l,r)),w.unjitteredProjection.value.copy(r.projectionMatrix);let y=this.temporalAAEnabled?this.taaHistory:null;if(y){let e=this.getDrawingBufferSize(Jl);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?mr():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?wr:null,r.layers.enable(3),r.layers.enable(8),r.layers.enable(4);let b=l.data.ao,S=b.occlusion&&!no&&!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(!co&&h.needsReflection()?(this._renderReflectionPass(l,r),fo?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);if(this.pipeline.postprocessingState!==V&&this.pipeline.updatePostprocessing(V),this.pipeline.render(),y?.endJitter(),T.outputInterpositions=this._frameBufferTargets?.size??0,this.manageShadowUpdates){let e=(this._skippedAsyncDraws??0)>0&&!this._skipStalls.stalled,t=this.info.asyncCompilation?.promotions??0,a=t!==this._shadowSyncPromotions;this._shadowSyncPromotions=t,h.shadowsDirty=this._shadowMapMissingAtSync||this._warmupInFlight||e||a}r instanceof Ar&&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,ao.setFromMatrixPosition(e.matrixWorld),e.target?(e.target.updateMatrixWorld(),ro.setFromMatrixPosition(e.target.matrixWorld)):ro.set(0,0,0),so.subVectors(ro,ao),so.lengthSq()<1e-10)return;so.normalize();let l=1/0,o=-1/0;for(let e=0;e<a;e++){let a=4*e,r=(t[a]-ao.x)*so.x+(t[a+1]-ao.y)*so.y+(t[a+2]-ao.z)*so.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){a.getShadowBoundsCenter?a.getShadowBoundsCenter(eo):eo.setFromMatrixPosition(a.matrixWorld);let r=4*t;io[r]=eo.x,io[r+1]=eo.y,io[r+2]=eo.z,io[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;eo.copy(r.center).applyMatrix4(a.matrixWorld),to.setFromMatrixScale(a.matrixWorld);let i=r.radius*Math.max(Math.abs(to.x),Math.abs(to.y),Math.abs(to.z)),n=4*t;io[n]=eo.x,io[n+1]=eo.y,io[n+2]=eo.z,io[n+3]=i,t++}),t}_syncLightState(e){let t=Zr.isSoft(e.data.shadow);Un(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&&Vn()&&(mn||(this.initTexture?.(sn()),mn=!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;let u=-2128831035,d=e=>{u^=0|e,u=Math.imul(u,16777619)};e.traverseVisible(u=>{let h=u;if(a(h)&&(e.scene.shadowsDirty=!0),l&&(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&h.shadow&&(h.shadow.autoUpdate=o,o&&!0===h.castShadow&&null==h.shadow.map&&(this._shadowMapMissingAtSync=!0)),lo&&(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&h.castShadow&&(h.castShadow=!1),(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&(d(u.id),d(!0===h.castShadow?1:0),d(this._shadowMapId(h.shadow?.map))),h.isPointLight&&h.castShadow&&h.shadow&&(function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Hn&&T.pcssForeignFilter++:(e.filterNode=Hn,T.pcssInstalled++)}(h.shadow),An(h.shadow),T.pcssLights++),(h.isSpotLight||h.isDirectionalLight)&&h.castShadow&&h.shadow){h.isDirectionalLight&&(r<0&&(r=this._gatherShadowBounds(e)),this._fitDirectionalShadowRange(h,io,r)),function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Wn&&T.pcssForeignFilter++:(Object.defineProperty(e,"penumbraSize",{get:()=>h.data?.penumbraSize??.5,configurable:!0}),e.filterNode=Wn,T.pcssInstalled++)}(h.shadow);let a,i=!l||o||!0===h.shadow.needsUpdate;if(t&&Vn()&&(i?function(e){let t=e;t.__spePcssPyramid&&(t.__spePcssPyramid.fresh=!1)}(h.shadow):dn(h.shadow)||function(e,t){let a=t,r=a.map?.depthTexture??null;if(null==r)return!1;let s=on(t);if(function(e){let t=on(e);if(t.slot>=0)return t.slot;for(let a=0;a<8;a++){let r=un[a];if(null===r||void 0===r.deref())return un[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=an(64,64),s.mid.texture.name="SplinePCSSPyramidMid"),null===s.small&&(s.small=an(8,8),s.small.texture.name="SplinePCSSPyramidSmall"),s.toMid=new $a(nn(`SplinePCSSPyramidToMid${i}`,r,Math.ceil(i/64),i-1,!1,0)),s.toSmall=new $a(nn("SplinePCSSPyramidToSmall",s.mid.texture,8,63,!0,0)),s.passKey=l),sn();let o=e.getRenderTarget();e.setRenderTarget(s.mid),s.toMid.render(e),e.setRenderTarget(s.small),s.toSmall.render(e),e.setRenderTarget(o),cn.set(n,0,0),e.copyTextureToTexture(s.small.texture,rn.texture,null,cn),s.fresh=!0,T.pcssPyramidBuilds++}(this,h.shadow),a={slot:hn(h.shadow),fresh:dn(h.shadow)}),t&&Mn()&&(kn(h.shadow,-1),this._maskLights.push({light:h,shadow:h.shadow}),(i||null==h.shadow.map)&&(this._maskBlocked=!0)),An(h.shadow,h.data?.penumbraSize??.5,a)&&T.pcssPyramidActive++,!s){s=!0;let e=h.shadow;T.pcssRadius0=e.radius??-1,T.pcssPenumbra0=e.penumbraSize??-1}T.pcssLights++}if(!(n>=f))if(h.isPointLight||h.isSpotLight)Pl.setFromMatrixPosition(h.matrixWorld),i[n].set(Pl.x,Pl.y,Pl.z,0),n++;else if(h.isDirectionalLight&&h.target){h.target.updateMatrixWorld();let e=Pl;e.setFromMatrixPosition(h.matrixWorld),e.sub(Al.setFromMatrixPosition(h.target.matrixWorld)).normalize(),i[n].set(e.x,e.y,e.z,1),n++}}),w.toonLightCount.value=n;let h=this._lightShadowSignatures.get(e);this._lightShadowSignatures.set(e,u),this._lightShadowStateDirty=void 0!==h&&h!==u}_shadowMapId(e){if(null==e)return 0;let t=this._shadowMapIds.get(e);return void 0===t&&(t=++this._shadowMapIdSeq,this._shadowMapIds.set(e,t)),t}_renderShadowMaskPass(e,t){let a=0;if(Mn()&&!this.suppressShadowMask&&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 Xn);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(Jl),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 vs(s,i,{depthBuffer:!1})),w.aoRenderTarget.value=this._aoRenderTarget.texture,this._hbao||(this._hbao=new Vi);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:$r.getModeIndex({mode:e.fogMode}),fogDensity:e.fogDensity??$r.getDensity({}),fogHeightFalloff:e.fogHeightFalloff??$r.getHeightFalloff({}),fogHeightBase:e.fogHeightBase??$r.getHeightBase({})},this.pipeline.blueNoiseTexture,this._aoRenderTarget)}_renderNormalPass(e,t,a){let r=a.outline&&a.cavity?"both":a.cavity?"normals":"hash",s=this.getDrawingBufferSize(Jl),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 vs(i,n,{count:"both"===r?2:1,type:"normals"===r?rs:as,depthTexture:new os(i,n)});"both"===r&&(e.textures[0].name="g0",e.textures[1].name="g1",e.textures[1].type=rs);for(let t of e.textures)t.minFilter=js,t.magFilter=js;return e});let l=this._encodeMaterials[r];if(void 0===l){this._depthContrastUniform??(this._depthContrastUniform=N(1));let e=new Ct;e.name=`SplineNormalPassEncode_${r}`;let t=dt("randomColor","vec3"),a=()=>{let e=or(er),a=Na.sub(.5).mul(this._depthContrastUniform).add(.5),r=Xt(Xt(t,e,.2),de(a),.4);return pe(r,t.x)},s=()=>{let e=or(Qa),a=Nt(q,e,e.negate());return pe(a,t.x)};e.fragmentNode="both"===r?Ca({g0:a(),g1:s()}):"normals"===r?s():a(),e.lights=!1,e.blending=Gs,e.needsUpdate=!0,this._encodeMaterials[r]=e,l=e}this._depthContrastUniform.value=t instanceof Ar?(t.far-t.near)/1e4:1;let o=e.overrideMaterial,u=this.getRenderTarget(),d=this.getClearColor(El),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=qa(_),t=new Ct;t.name="SplineUICanvasBlit",t.fragmentNode=e.sample($()),t.lights=!1,t.blending=Gs,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,a={quad:new $a(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=qa(_),r=N(new ds(1,0)),s=new Ct;s.name="SplineTransmissionPrefilter";let i=$(),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=pe(o,1),s.lights=!1,s.blending=Gs,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,t={quad:new $a(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(ho,"SplineTransmissionDownsample"),this._downsamplePasses[e]=t,t)}_buildDownsamplePassEntry(e,t){let a=qa(_),r=N(new ds(1,1)),s=new Ct;s.name=t;let i=$(),n=r,l=(e,t)=>a.sample(i.add(ne(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=pe(o,1),s.lights=!1,s.blending=Gs,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,{quad:new $a(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(Jl),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?uo:"off";this._transmissionTarget=this._reallocGrabTarget(this._transmissionTarget,s,i,()=>{let e=new vs(s,i,{depthBuffer:!0}),t=e.texture;return"off"===n?(t.generateMipmaps=!0,t.minFilter=ti):(t.generateMipmaps=!1,t.minFilter=Ys),t.magFilter=Ys,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 vs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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 vs(s,i,{depthBuffer:!1}),a=e.texture;return a.minFilter=ti,a.magFilter=Ys,"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 Ct;e.name="SplineReflectionDepthBlit";let t=qa(this._reflectionTarget.depthTexture);e.fragmentNode=pe(de(t.sample($())),1),e.lights=!1,e.blending=Gs,e.depthTest=!1,e.depthWrite=!1,e.needsUpdate=!0,r.push({quad:new $a(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 Ct;n.name=`SplineReflectionDepthMin${s}`;let l=qa(this._reflectionDepthChain[s-1].texture),o=Mt,u=Pe(o.x).mul(2),d=Pe(o.y).mul(2),h=(e,t)=>l.load(Je(u.add(e),d.add(t))).x,m=(e,t)=>Ht(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=pe(de(c),1),n.lights=!1,n.blending=Gs,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,r.push({quad:new $a(n)})}this._reflectionDepthPasses=r}_renderReflectionPass(e,t){let a=this.getDrawingBufferSize(Jl),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=Cr(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(xo&&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&&yo;this._reflectionTarget=this._reallocGrabTarget(this._reflectionTarget,l,o,()=>{let e=new vs(l,o,{depthTexture:new os(l,o)});return d?(e.texture.generateMipmaps=!1,e.texture.minFilter=Ys):(e.texture.generateMipmaps=!0,e.texture.minFilter=ti),e.texture.magFilter=Ys,e});let h=(e,t)=>{let a=new vs(e,t,{depthBuffer:!1,type:as,format:bs});return a.texture.generateMipmaps=!1,a.texture.minFilter=js,a.texture.magFilter=js,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(Nl);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 vs(l,o,{depthBuffer:!1}),t=e.texture;return t.minFilter=ti,t.magFilter=Ys,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 vs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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;Ll.copy(s.center).applyMatrix4(e.matrixWorld);let o=t.projectionMatrix.elements[5]*a/2,u=1;!0===t.isPerspectiveCamera&&(Il.setFromMatrixPosition(t.matrixWorld),u=Math.max(Ll.distanceTo(Il),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&&vo&&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(Dl).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 vs(e,t,{type:rs,depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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 vs(l,o,{count:2,type:rs,depthTexture:new os(l,o)});for(let t of e.textures)t.generateMipmaps=!1,t.minFilter=js,t.magFilter=js;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 Ct;e.name="SplineReflectionGBuffer";let t=W("__splinePlanarMirror","float"),a=w.reflectionPlanarEnabled.greaterThan(.5),r=W("__srMode","float"),s=Nt(t.greaterThan(.5).and(a),R(0),r);e.fragmentNode=Ca({g0:pe(or(Qa),s),g1:pe(W("__srBlur","float"),W("__srThickness","float"),W("__srStepSize","float"),W("__srSteps","float"))}),e.lights=!1,e.blending=Gs,e.needsUpdate=!0,this._reflectionGBufferMaterial=e}let u=this._skippedAsyncDraws??0,d=e.overrideMaterial,h=this.getRenderTarget(),m=this.getClearColor(Bl),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=N(new Ss),i=N(new Ss),n=N(new Ss),l=N(.1),o=this._reflectionGBufferTarget,u=qa(o.textures[0]),d=qa(o.textures[1]),h=qa(o.depthTexture),m=qa(e),c=qa(this._reflectionDepthPyramid.texture),p=qa(t),g=new Ct;g.name="SplineReflectionResolve";let f=le(()=>{let e=Mt,t=Je(Pe(e.x),Pe(e.y)),a=$(),r=u.load(t).toVar(),o=h.sample(a).toVar(),g=pe(0).toVar(),f=R(0).toVar();return he(r.w.greaterThan(.5),()=>{let e=d.load(t).toVar(),u=Oi(i,a.x,a.y,o),h=qi({dials:{blur:e.x,thickness:e.y,stepSize:e.z,steps:Pe(e.w),tracingMode:r.w.sub(1)},surface:{originView:u,normalV:or(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:S(!1),noisePixel:ne(t),singleRay:{footprintOut:f}});g.assign(pe(h,f.add(1)))}),g});g.fragmentNode=f(),g.lights=!1,g.blending=Gs,g.depthTest=!1,g.depthWrite=!1,g.needsUpdate=!0,this._reflectionResolveMarch={quad:new $a(g),proj:s,projInv:i,camWorld:n,near:l};let _=qa(this._reflectionResolveMarchTarget.texture),y=qa(this._reflectionResolveBlurTmp.texture),x=e=>{let t=new Ct;t.name=`SplineReflectionResolveBlur${e.toUpperCase()}`;let s="x"===e?_:y,i="x"===e?1/a:1/r,n=le(()=>{let t=$(),a=_.sample(t).toVar().w.sub(1).max(0).clamp(.5,12).toVar(),r=pe(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?ne(a.mul(l/6*i),0):ne(0,a.mul(l/6*i)),d=s.sample(t.add(u)).toVar(),h="x"===e?d.w.min(1):d.w;r.addAssign(pe(d.rgb,h).mul(o))}return r.div(n)});return t.fragmentNode=n(),t.lights=!1,t.blending=Gs,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,new $a(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&&Mr(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=Fl,i=o*m*(u*c)):o<=l&&o<=u?(s=Ul,i=l*h*(u*c)):(s=Ol,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(Gl.copy(a.normalAxis).transformDirection(s),ql.setFromMatrixPosition(s),Wl.setFromMatrixPosition(t.matrixWorld),Hl.subVectors(ql,Wl),Hl.dot(Gl)>0&&Gl.negate(),Hl.dot(Gl)>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(Hl.subVectors(ql,Wl),Hl.reflect(Gl).negate(),Hl.add(ql),jl.extractRotation(t.matrixWorld),Kl.set(0,0,-1).applyMatrix4(jl).add(Wl),$l.subVectors(ql,Kl),$l.reflect(Gl).negate(),$l.add(ql),i.position.copy(Hl),i.up.set(0,1,0).applyMatrix4(jl),i.up.reflect(Gl),i.lookAt($l),i.updateMatrixWorld(),i.projectionMatrix.copy(t.projectionMatrix),i.projectionMatrixInverse.copy(i.projectionMatrix).invert(),!0===t.isPerspectiveCamera){Xl.setFromNormalAndCoplanarPoint(Gl,ql),Xl.applyMatrix4(i.matrixWorldInverse),Ql.set(Xl.normal.x,Xl.normal.y,Xl.normal.z,Xl.constant);let e=i.projectionMatrix.elements;Zl.x=(Math.sign(Ql.x)+e[8])/e[0],Zl.y=(Math.sign(Ql.y)+e[9])/e[5],Zl.z=-1,Zl.w=(1+e[10])/e[14],Ql.multiplyScalar(1/Ql.dot(Zl)),e[2]=Ql.x,e[6]=Ql.y,e[10]=Ql.z,e[14]=Ql.w}let n=this.getDrawingBufferSize(Yl),l=Math.max(1,Math.round(n.x)),o=Math.max(1,Math.round(n.y)),u=!0===this.backend?.isWebGPUBackend&&_o;this._planarTarget=this._reallocGrabTarget(this._planarTarget,l,o,()=>{let e=new vs(l,o);return u?(e.texture.generateMipmaps=!1,e.texture.minFilter=Ys):(e.texture.generateMipmaps=!0,e.texture.minFilter=ti),e.texture.magFilter=Ys,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 vs(l,o,{depthBuffer:!1}),a=t.texture;return a.minFilter=ti,a.magFilter=Ys,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 vs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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(Jl),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 vs(s,i,{depthBuffer:!0}));let n=this.getRenderTarget();this.setRenderTarget(this._transitionCaptureTarget);try{this.renderSplineScene(e,t)}finally{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,settleFrames:a=0}={}){if(!0===this.xr?.isPresenting)return null;let r=this._frameSerial,s=this.getRenderTarget(),i=this.pipeline.renderToScreen,n=this.pipeline.helpersEnabled,l=this.suppressShadowMask;this.suppressShadowMask=!0,t||this.pipeline.disableHelpers(),this.pipeline.renderToScreen=!1,this.setRenderTarget(null);try{for(let t=0;t<a;t++)e(),await wo();e()}finally{this.suppressShadowMask=l,this.pipeline.renderToScreen=i,this.setRenderTarget(s),n&&this.pipeline.enableHelpers()}if(this._frameSerial===r||this.lastFrameIncomplete)return null;let o=this.pipeline.lastOutputTarget;if(!o||!this.backend.get(o.textures[0])?.textureDescriptorGPU)return null;let u=o.width,d=o.height,h=this,m=new Uint8Array(u*d*4),c=4*u,p=256*Math.ceil(c/256),g=Math.max(1,Math.min(d,Math.floor((1<<20)/p)));for(let e=0;e<d;e+=g){let t=Math.min(g,d-e),a=await h.readRenderTargetPixelsAsync(o,0,e,u,t);if(p===c)m.set(a.subarray(0,t*c),e*c);else for(let r=0;r<t;r++){let t=r*p;m.set(a.subarray(t,t+c),(e+r)*c)}}return{pixels:m,width:u,height:d}}_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 vs(e,t,{depthBuffer:!0})):(this._ciOffscreenTarget=new vs(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(),pr()?.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 ln){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)}ln.clear(),un.fill(null),rn?.dispose(),rn=null,mn=!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 fl)e.deref()?.dispose();fl.clear(),_l++}(),function(){for(let e of xl){let t=e.deref();void 0!==t&&(t.sprite.removeFromParent(),t.material.dispose())}xl.clear(),vl++}(),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}},Vo=So;Vo._GAUGE_STALL_MS=3e3;var Mo=(e,t)=>e.element(t);function Co(e){let t=e;return null!=t&&!0===t.isInstancedMesh&&null!=t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute}var Ro=new WeakMap;function zo(e){return xa.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 Mo(Sa(r,"mat4",s),fe);if(16*s*4<=e.getUniformBufferLimit())return Mo(ft(r.array,"mat4",s),fe);let i=Ro.get(r);void 0===i&&(i=new Ts(r.array,16,1),Ro.set(r,i));let n=r.usage===Ws?Re:Se;return Vt(n(i,"vec4",16,0),n(i,"vec4",16,4),n(i,"vec4",16,8),n(i,"vec4",16,12))}(e))}var ko=le(e=>Co(e.object)?ce:_e).once()().toVar("speObjectPosition"),Ao=le(e=>{let t=e.material?.shapeBlendObjectNormal;return t||(Co(e.object)?e.geometry.hasAttribute("normal")?Ga:de(0,1,0):ja)}).once()().toVar("speObjectNormal"),Po=(le(e=>Co(e.object)?zo(e):xa).once()(),le(e=>{if(!Co(e.object))return la;let t=zo(e),a=e=>Mo(t,e).xyz;return de(a(0).length(),a(1).length(),a(2).length()).toVarying("v_speModelScale")}).once()().toVar("speModelScale")),Eo=(le(e=>Co(e.object)?bt(zo(e)).inverse().transpose():ra).once()(),le(e=>Co(e.object)?zo(e).inverse():wa).once()(),new WeakMap);function No(e){if(Eo.has(e))return;let t={own:e.value,render:e.value};Eo.set(e,t),Object.defineProperty(e,"value",{configurable:!0,enumerable:!0,get:()=>t.render,set:e=>{t.render=e,t.own=e}})}function Bo(e){let t=Eo.get(e);return void 0!==t?t.own:e.value}function Lo(e,t){let a=Eo.get(e);void 0!==a?a.render=t:e.value=t}var Io=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:Bo(t)}getLiveValue(e){return this.liveValues.get(e)}getNodeValue(e){let t=this.byName.get(e);return void 0===t?void 0:Bo(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 Do(e,t,a){let r=R(e).toVar(),s=R(Xt(r.div(Wt(r.add(t.accumAlpha),R(1e-5),R(1))),r,a)).toVar();return t.accumAlpha.addAssign(E(t.accumAlpha).mul(r).mul(E(a))),s}function Fo(e,t){let a=R(e).toVar(),r=R(a.div(Wt(a.add(t.accumAlpha),R(1e-5),R(1)))).toVar();return t.accumAlpha.addAssign(E(t.accumAlpha).mul(a)),r}var Uo=0,Oo=1,Go=2,qo=3,Wo=le(e=>{let t=e.a.toVar(),a=e.b.toVar(),r=e.alpha.toVar(),s=e.mode,i=de(1).toVar();return he(s.equal(Pe(0)),()=>{i.assign(Xt(t,a,r))}).ElseIf(s.equal(Pe(1)),()=>{i.assign(Xt(t,t.mul(a),r))}).ElseIf(s.equal(Pe(2)),()=>{i.assign(Xt(t,E(E(t).mul(E(a))),r))}).ElseIf(s.equal(Pe(3)),()=>{let e=va(t,de(.5)),s=Xt(E(E(t).mul(E(a)).mul(2)),t.mul(a).mul(2),e);i.assign(Xt(t,s,r).clamp(0,1))}),i});function Ho(e,t,a,r){return Wo({a:e,b:t,alpha:a,mode:r})}var jo=new Map,Ko=new Set,$o=(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:de(1,0,0),calpha:Fo(r,a)}};function Xo(e,t){jo.set(e,t)}function Qo(e){let t=jo.get(e);return void 0!==t?t:(Ko.has(e)||(Ko.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.`)),$o)}function Zo(e){return jo.has(e)}var{diffuseContribution:Yo,specularColorBlended:Jo}=nr,eu=le(e=>{let t=Qa.dot(e.lightDirection),a=ne(t.mul(.5).add(.5),0),r=a.fwidth().mul(.5);return Xt(de(.7),de(1),sa(R(.7).sub(r.x),R(.7).add(r.x),a.x))}),tu=le(e=>{let t=e.lightDirection.add(ze).normalize(),a=Qa.dot(t).clamp(),r=ze.dot(t).clamp(),s=r.mul(-5.55473).sub(6.98316).mul(r).exp2(),i=oa.mul(s.oneMinus()).add(s),n=R(.25),l=jt.mul(.5).add(1).mul(1/Math.PI).mul(a.pow(jt));return i.mul(n).mul(l)});function au(e){let t=w.aoRenderTarget.sample(kt).rgb,a=w.aoEnabledUniform;return null!==e&&(a=a.mul(Nt(e,R(1),R(0)))),Xt(de(1),t,a)}var ru,su=(ru=class extends ta{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=eu({lightDirection:t}).mul(a);r.directDiffuse.addAssign(s.mul(Da.rgb.mul(1/Math.PI))),r.directSpecular.addAssign(s.mul(tu({lightDirection:t})))}},class extends ru{constructor(){super(...arguments),this.aoOcclusionGate=null}finish(e,...t){super.finish?.call(this,e,...t);let{reflectedLight:a,outgoingLight:r}=e.context,s=au(this.aoOcclusionGate),i=a.directDiffuse.add(a.indirectDiffuse);r.subAssign(i.mul(E(s)))}}),iu=class extends ca{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=Qa.dot(a.lightDirection).clamp().mul(a.lightColor),t=nr.BRDF_Lambert({diffuseColor:Yo});return void a.reflectedLight.directDiffuse.addAssign(e.mul(t))}super.direct(e,t)}},nu=e=>e,lu=[{a:"y",b:"z",pole:"x"},{a:"z",b:"x",pole:"y"},{a:"x",b:"y",pole:"z"}];function ou(e,t){return"x"===t?e.x:"y"===t?e.y:e.z}function uu(e,t){return Aa(e,de(t,1)).div(2).add(.5).xy}function du(e,t,a){let r=R(e.div(Wt(e.add(t.accumAlpha),R(1e-5),R(1)))).toVar();return t.accumAlpha.addAssign(E(t.accumAlpha).mul(e).mul(E(a))),r}function hu(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=ko,t=0===r?e.zy:1===r?e.xz:e.xy,a=ne(t.add(1).div(2)).toVar();return{uvs:[ne(uu(n,a.mul(2).sub(1).div(l.mul(.5)))).toVar()],weights:null}}if(2===t){let e=de(or(ko)).toVar(),{a:t,b:a,pole:r}=lu[i],s=R(Qe(ou(e,t),ou(e,a)).div(6.283).add(.5)).toVar(),l=R(Ke(ou(e,r)).div(3.1415).add(.5)).toVar(),o=ne(s,l).toVar();return{uvs:[ne(uu(n,o.mul(2).sub(1))).toVar()],weights:null}}if(3===t){let e=de(or(ko)).toVar(),{a:t,b:a,pole:r}=lu[i],s=R(Qe(ou(e,t),ou(e,a)).div(6.283).add(.5)).toVar(),o=R(ou(ko,r).div(l.y.mul(.5))).toVar(),u=R(o.div(2).add(.5)).toVar(),d=ne(s,u).toVar();return{uvs:[ne(uu(n,d.mul(2).sub(1))).toVar()],weights:null}}if(4===t){let t=e.getFloat("blending"),a=de(ko).toVar(),r=ne(a.xy.add(1).div(2)).toVar(),s=ne(a.zy.add(1).div(2)).toVar(),i=ne(a.xz.add(1).div(2)).toVar();for(let e of[r,s,i])e.assign(uu(n,nu(e.mul(2).sub(1).div(l.mul(.5)))));let o=R(E(t).mul(125).add(3)).toVar(),u=de(Ao).toVar(),d=de(Be(or(u))).toVar();return d.assign(Ie(d,de(o))),d.divAssign(Ha(d,de(1))),{uvs:[r,s,i],weights:d}}return{uvs:[ne(uu(n,$().mul(2).sub(1))).toVar()],weights:null}}var mu=(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}=hu(e),m=[...d],c=null;if(1===s){if(r=o.sample(d[0]),2!==l){let e=0===n?de(1,0,0):1===n?de(0,1,0):de(0,0,1),t=Ha(Ao,e);c=va(R(0),1===l?t.mul(-1):t)}}else if(2===s||3===s)r=function(e,t){if(e.value.minFilter===js&&e.value.magFilter===js)return e.sample(t);let a=ne(Ma(t)).toVar(),r=ne(ka(t)).toVar();return a.x.subAssign(P(a.x.add(.5))),r.x.subAssign(P(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"):R(1),g=pe(Xt(pe(0,0,0,1),r,p)).toVar(),f=de(g.rgb).toVar(),_=R(t.alpha.mul(g.a)).toVar();return null!==c&&_.mulAssign(c),function(e,t,a){he(e.greaterThan(.5),()=>{for(let e of a)he(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:du(_,a,t.isMask)}};function cu(e,t,a){let r=ne(t).toVar(),s=ne(Ma(r)).toVar(),i=ne(ka(r)).toVar(),n=t=>a.mul(_t(e.sample(t).rgb)),l=R(n(r)).toVar(),o=R(n(r.add(s)).sub(l)).toVar(),u=R(n(r.add(i)).sub(l)).toVar();return ne(o,u)}function pu(e,t,a){let r=de(Ma(e)).toVar(),s=de(ka(e)).toVar(),i=de(or(t)).toVar(),n=de(or(ya(s,i))).toVar(),l=de(or(ya(i,r))).toVar(),o=R(Ha(r,n).mul(lr)).toVar(),u=de(Qt(o).mul(a.x.mul(n).add(a.y.mul(l)))).toVar();return or(Be(o).mul(i).sub(u))}function gu(e,t){let a,r=e.get("texture"),s=e.has("loaded")?e.getFloat("loaded"):R(1),i=e=>{let a=r.sample(e),s="luminance"===t?_t(a.rgb):a[t];return R(s).toVar()},{uvs:n,weights:l}=hu(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 Xt(R(1),a,s)}Xo("texture",mu),Xo("video",mu);var fu=z,_u=ge,yu=.1666667,xu=le(e=>{let t=e.c,a=ea(Ha(t,de(17,59.4,15))).mul(4096),r=U(a.mul(512)),s=a.mul(.125),i=U(s.mul(512)),n=s.mul(.125),l=U(n.mul(512));return de(i,l,r).sub(.5)}).setLayout({name:"spe_random3",type:"vec3",inputs:[{name:"c",type:"vec3"}]});function vu(e){return xu({c:e})}var bu=le(e=>{let t=e.p,a=P(t.add(Ha(t,de(.3333333)))).toVar(),r=t.sub(a).add(Ha(a,de(yu))).toVar(),s=va(de(0),r.sub(r.yzx)).toVar(),i=s.mul(E(s.zxy)).toVar(),n=E(s.zxy.mul(E(s))).toVar(),l=r.sub(i).add(yu).toVar(),o=r.sub(n).add(2*yu).toVar(),u=r.sub(1).add(3*yu).toVar(),d=pe(Ha(r,r),Ha(l,l),Ha(o,o),Ha(u,u)).toVar();d.assign(pe(.6).sub(d).max(0));let h=pe(Ha(vu(a),r),Ha(vu(a.add(i)),l),Ha(vu(a.add(n)),o),Ha(vu(a.add(1)),u)).toVar();return d.mulAssign(d),d.mulAssign(d),h.mulAssign(d),Ha(h,pe(52))}).setLayout({name:"spe_simplexFast",type:"float",inputs:[{name:"p",type:"vec3"}]});function Tu(e){return bu({p:e})}var wu=le(e=>{let t=e.m,a=bt(de(-.37,.36,.85),de(-.14,-.93,.34),de(.92,.01,.4)),r=bt(de(-.55,-.39,.74),de(.33,-.91,-.24),de(.77,.12,.63)),s=bt(de(-.71,.52,-.47),de(-.08,-.72,-.68),de(-.7,-.45,.56));return Tu(t.mul(a)).mul(.5333333).add(Tu(t.mul(2).mul(r)).mul(.2666667)).add(Tu(t.mul(4).mul(s)).mul(.1333333)).add(Tu(t.mul(8)).mul(.0666667))}).setLayout({name:"spe_simplexFractal",type:"float",inputs:[{name:"m",type:"vec3"}]}),Su=le(e=>{let t=e.x;return Jt(t.mul(34).add(1).mul(t),289)}).setLayout({name:"spe_permute",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function Vu(e){return Su({x:e})}var Mu=le(e=>Pa(1.79284291400159,e.r.mul(.85373472095314))).setLayout({name:"spe_taylorInvSqrt",type:"vec4",inputs:[{name:"r",type:"vec4"}]});function Cu(e){return Mu({r:e})}var Ru=le(e=>{let t=e.v,a=ne(1/6,1/3),r=pe(0,.5,1,2),s=P(t.add(Ha(t,a.yyy))).toVar(),i=t.sub(s).add(Ha(s,a.xxx)).toVar(),n=va(i.yzx,i.xyz).toVar(),l=E(n).toVar(),o=Ht(n.xyz,l.zxy).toVar(),u=It(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(Jt(s,289));let c=Vu(Vu(Vu(s.z.add(pe(0,o.z,u.z,1))).add(s.y).add(pe(0,o.y,u.y,1))).add(s.x).add(pe(0,o.x,u.x,1))).toVar(),p=r.wyz.mul(1/7).sub(r.xzx).toVar(),g=c.sub(P(c.mul(p.z).mul(p.z)).mul(49)).toVar(),f=P(g.mul(p.z)).toVar(),_=P(g.sub(f.mul(7))).toVar(),y=f.mul(p.x).add(p.yyyy).toVar(),x=_.mul(p.x).add(p.yyyy).toVar(),v=Pa(1,Be(y)).sub(Be(x)).toVar(),b=pe(y.xy,x.xy).toVar(),T=pe(y.zw,x.zw).toVar(),w=P(b).mul(2).add(1).toVar(),S=P(T).mul(2).add(1).toVar(),V=va(v,pe(0)).negate().toVar(),M=b.xzyw.add(w.xzyw.mul(V.xxyy)).toVar(),C=T.xzyw.add(S.xzyw.mul(V.zzww)).toVar(),R=de(M.xy,v.x).toVar(),z=de(M.zw,v.y).toVar(),k=de(C.xy,v.z).toVar(),A=de(C.zw,v.w).toVar(),N=Cu(pe(Ha(R,R),Ha(z,z),Ha(k,k),Ha(A,A))).toVar();R.mulAssign(N.x),z.mulAssign(N.y),k.mulAssign(N.z),A.mulAssign(N.w);let B=It(Pa(.6,pe(Ha(i,i),Ha(d,d),Ha(h,h),Ha(m,m))),0).toVar();return B.mulAssign(B),Ha(B.mul(B),pe(Ha(R,i),Ha(z,d),Ha(k,h),Ha(A,m))).mul(42)}).setLayout({name:"spe_simplexAshima",type:"float",inputs:[{name:"v",type:"vec3"}]});function zu(e){return Ru({v:e})}var ku=le(e=>{let t=e.x;return t.sub(P(t.mul(1/289)).mul(289))}).setLayout({name:"spe_mod289",type:"vec4",inputs:[{name:"x",type:"vec4"}]}),Au=le(e=>{let t=e.x;return ku({x:t.mul(34).add(1).mul(t)})}).setLayout({name:"spe_perm",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function Pu(e){return Au({x:e})}var Eu=le(e=>{let t=e.p,a=P(t).toVar(),r=t.sub(a).toVar();r.assign(r.mul(r).mul(Pa(3,r.mul(2))));let s=a.xxyy.add(pe(0,1,0,1)).toVar(),i=Pu(s.xyxy).toVar(),n=Pu(i.xyxy.add(s.zzww)).toVar().add(a.zzzz).toVar(),l=Pu(n).toVar(),o=Pu(n.add(1)).toVar(),u=U(l.mul(1/41)).toVar(),d=U(o.mul(1/41)).toVar().mul(r.z).add(u.mul(E(r.z))).toVar(),h=d.yw.mul(r.x).add(d.xz.mul(E(r.x))).toVar();return h.y.mul(r.y).add(h.x.mul(E(r.y)))}).setLayout({name:"spe_valueNoise",type:"float",inputs:[{name:"p",type:"vec3"}]}),Nu=le(e=>{let t=de(e.x).toVar(),a=R(0).toVar(),r=R(.5).toVar(),s=de(100).toVar();return ge(5,()=>{a.addAssign(r.mul(function(e){return Eu({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"}]}),Bu=le(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"}]}),Lu=le(e=>{let t=e.P,a=P(t).toVar(),r=a.add(de(1)).toVar();a.assign(Jt(a,289)),r.assign(Jt(r,289));let s=U(t).toVar(),i=s.sub(de(1)).toVar(),n=pe(a.x,r.x,a.x,r.x).toVar(),l=pe(a.yy,r.yy).toVar(),o=pe(a.zzzz).toVar(),u=pe(r.zzzz).toVar(),d=Vu(Vu(n).add(l)).toVar(),h=Vu(d.add(o)).toVar(),m=Vu(d.add(u)).toVar(),c=h.div(7).toVar(),p=U(P(c).div(7)).sub(.5).toVar();c.assign(U(c));let g=pe(.5).sub(Be(c)).sub(Be(p)).toVar(),f=va(g,pe(0)).toVar();c.subAssign(f.mul(va(0,c).sub(.5))),p.subAssign(f.mul(va(0,p).sub(.5)));let _=m.div(7).toVar(),y=U(P(_).div(7)).sub(.5).toVar();_.assign(U(_));let x=pe(.5).sub(Be(_)).sub(Be(y)).toVar(),v=va(x,pe(0)).toVar();_.subAssign(v.mul(va(0,_).sub(.5))),y.subAssign(v.mul(va(0,y).sub(.5)));let b=de(c.x,p.x,g.x).toVar(),T=de(c.y,p.y,g.y).toVar(),w=de(c.z,p.z,g.z).toVar(),S=de(c.w,p.w,g.w).toVar(),V=de(_.x,y.x,x.x).toVar(),M=de(_.y,y.y,x.y).toVar(),C=de(_.z,y.z,x.z).toVar(),R=de(_.w,y.w,x.w).toVar(),z=Cu(pe(Ha(b,b),Ha(w,w),Ha(T,T),Ha(S,S))).toVar();b.mulAssign(z.x),w.mulAssign(z.y),T.mulAssign(z.z),S.mulAssign(z.w);let k=Cu(pe(Ha(V,V),Ha(C,C),Ha(M,M),Ha(R,R))).toVar();V.mulAssign(k.x),C.mulAssign(k.y),M.mulAssign(k.z),R.mulAssign(k.w);let A=Ha(b,s).toVar(),E=Ha(T,de(i.x,s.yz)).toVar(),N=Ha(w,de(s.x,i.y,s.z)).toVar(),B=Ha(S,de(i.xy,s.z)).toVar(),L=Ha(V,de(s.xy,i.z)).toVar(),I=Ha(M,de(i.x,s.y,i.z)).toVar(),D=Ha(C,de(s.x,i.yz)).toVar(),F=Ha(R,i).toVar(),O=function(e){return Bu({t:e})}(s).toVar(),G=Xt(pe(A,E,N,B),pe(L,I,D,F),O.z).toVar(),q=Xt(G.xy,G.zw,O.y).toVar();return Xt(q.x,q.y,O.x).toVar().mul(2.2)}).setLayout({name:"spe_perlin",type:"float",inputs:[{name:"P",type:"vec3"}]});function Iu(e){return Lu({P:e})}var Du=le(e=>{let t=U(e.p3.mul(.1031)).toVar();return t.addAssign(Ha(t,t.yzx.add(33.33))),U(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_hashwithoutsine13",type:"float",inputs:[{name:"p3",type:"vec3"}]}),Fu=le(e=>{let t=U(e.p3.mul(de(.1031,.103,.0973))).toVar();return t.addAssign(Ha(t,t.yxz.add(33.33))),U(t.xxy.add(t.yxx).mul(t.zyx))}).setLayout({name:"spe_hashwithoutsine33",type:"vec3",inputs:[{name:"p3",type:"vec3"}]});function Uu(e){return Fu({p3:e})}var Ou=le(e=>{let{a:t,b:a,k:r}=e,s=sa(0,1,a.sub(t).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(E(s)).toVar();return Xt(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 Gu(e,t,a){return Ou({a:e,b:t,k:a})}var qu=le(e=>{let{a:t,b:a,k:r}=e,s=sa(1,0,t.sub(a).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(E(s)).toVar();return Xt(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 Wu(e,t,a){return qu({a:e,b:t,k:a})}var Hu=le(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 ju(e,t,a,r,s){return Hu({value:e,input_min:t,input_max:a,output_min:r,output_max:s})}var Ku=le(e=>{let{x:t,style:a,smoothness:r,seed:s,quality:i}=e,n=at(P(t)).toVar(),l=U(t).toVar(),o=R(8).toVar(),u=R(8).toVar(),d=R(8).toVar(),h=R(8).toVar(),m=R(8).toVar(),c=R(8).toVar(),p=at(0).toVar(),g=de(0).toVar(),f=Pe(i).toVar(),_=()=>({start:f.negate(),end:f,condition:"<=",type:"int"});_u(_(),_(),_(),({i:e,j:t,k:a})=>{let i=at(e,t,a).toVar(),d=de(i).add(Uu(de(n.add(i)).add(s))).sub(l).toVar(),m=it(d).toVar();o.assign(Gu(m,o,r)),he(m.lessThan(u),()=>{h.assign(u),u.assign(m),p.assign(at(e,t,a)),g.assign(d)}).ElseIf(m.lessThan(h),()=>{h.assign(m)})}),he(a.notEqual(Pe(0)).and(a.notEqual(Pe(5))).and(a.notEqual(Pe(7))),()=>{_u(_(),_(),_(),({i:e,j:t,k:a})=>{let i=p.add(at(e,t,a)).toVar(),o=de(i).add(Uu(de(n.add(i)).add(s))).sub(l).toVar(),u=Ha(g.add(o).mul(.5),o.sub(g)).toVar(),h=Ha(g.add(o).mul(.5),or(o.sub(g))).toVar();m.assign(Gu(u,m,r)),c.assign(Ht(c,h));let f=at(e,t,a).toVar();he(qe(fu(f,p)),()=>{let e=de(f).add(Uu(de(n.add(f)).add(s))).sub(l).toVar(),t=it(e).toVar();d.assign(Gu(t,d,r))})})});let y=R(0).toVar();return he(a.equal(Pe(0)),()=>{y.assign(o)}).ElseIf(a.equal(Pe(1)),()=>{y.assign(d)}).ElseIf(a.equal(Pe(2)),()=>{y.assign(d.sub(o))}).ElseIf(a.equal(Pe(3)),()=>{let e=R(3).toVar(),t=It(e.sub(Be(u.sub(h))),0).div(e).toVar();y.assign(Ht(u,h).sub(t.mul(t).mul(e).mul(1/4)))}).ElseIf(a.equal(Pe(4)),()=>{y.assign(Ja(m.mul(5)))}).ElseIf(a.equal(Pe(5)),()=>{y.assign(Ie(o,3))}).ElseIf(a.equal(Pe(6)),()=>{let e=r.mul(.25).add(.0125).toVar(),t=Ie(r,3).mul(.25).add(.0125).toVar();y.assign(sa(e.sub(e.mul(t)),e.add(e.mul(t)),c))}).ElseIf(a.equal(Pe(7)),()=>{y.assign(function(e){return Du({p3:e})}(de(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 $u(e,t,a,r,s){return Ku({x:e,style:t,smoothness:a,seed:r,quality:s})}var Xu=[Tu,function(e){return wu({m:e})},zu,function(e){return Nu({x:e})},Iu],Qu=e=>e,Zu=le(e=>{let t=e.v;return or(Nt(Be(t.x).greaterThan(Be(t.z)),de(t.y.negate(),t.x,0),de(0,t.z.negate(),t.y)))}).setLayout({name:"spe_displaceOrthogonal",type:"vec3",inputs:[{name:"v",type:"vec3"}]});function Yu(e,t,a,r){return e.add(t).mul(a).mul(.001).add(1e-4).add(r.mul(.1))}var Ju=new Map,ed=le(e=>{let{n:t,scale:a,intensity:r,offset:s,movement:i,smoothness:n}=e,l=e.p,o=R($u(Yu(l,s,a,i),e.voronoiStyle,n,e.seed,e.quality)).toVar();return o.assign(ju(o,e.lowCut,e.highCut,R(0),R(1))),o.assign(Wu(o,R(0),n.mul(.25))),o.assign(Gu(o,R(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 td(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=>ed({...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=Ju.get(e);if(void 0===t){let a=Xu[e]??Xu[0];t=le(e=>{let{n:t,scale:r,intensity:s,offset:i,movement:n}=e,l=e.p;return l.add(t.mul(a(Yu(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"}]}),Ju.set(e,t)}return t}(a);return e=>s({...r,p:e})}(e,a),s=de(r(t)).toVar(),i=de(function(e){return Zu({v:e})}(a)).toVar(),n=or(ya(a,i)).toVar(),l=de(r(t.add(i))).toVar(),o=de(r(t.add(n))).toVar();return{position:s,normal:or(ya(l.sub(s),o.sub(s)))}}Xo("color",(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:e.getColor("color"),calpha:Fo(r,a)}});var ad=e=>e,rd=e=>e;Xo("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?Ee:ko;if(u){let s=or(e.getVec3("direction"));r=Ha(s,a.sub(t))}else r=it(a.sub(t))}else r=it(Ee.sub(St));let c=r.sub(h).div(m.sub(h)).toVar(),p=pe(s.element(0)).toVar();for(let e=1;e<n;e++){let t=ad(i.element(e-1)),a=ad(i.element(e)),r=Wt(c.sub(t).div(a.sub(t)),R(0),R(1)),n=l?sa(R(0),R(1),r):r;p.assign(Xt(p,rd(s.element(e)),n))}let g=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Do(g,a,t.isMask)}}),Xo("cavity",(e,t,a)=>{let r=Wt(e.getFloat("ridge"),0,2),s=Wt(e.getFloat("valley"),0,2),i=w.normalViewRenderTarget,n=w.resolution,l=dt("randomColor","vec3").x.toVar(),o=kt.toVar(),u=ne(R(1).div(n.x),R(1).div(n.y)).toVar(),d=(e,t)=>i.sample(o.add(ne(e,t)).toVar()).toVar(),h=d(R(0),u.y.negate()),m=d(R(0),u.y),c=d(u.x.negate(),R(0)),p=d(u.x,R(0)),g=e=>e.a.equal(l).and(Ha(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=R(.5).div(It(r.mul(r),R(1e-4))).toVar(),x=R(.7).div(It(s.mul(s),R(1e-4))).toVar(),v=(e,t)=>Nt(e.lessThan(R(.5).div(t)),e.mul(R(1).sub(e.mul(t))),R(.25).div(t)),b=Nt(f,Nt(_.greaterThan(0),v(_,y).mul(2),v(_.negate(),x).mul(-2)),R(0)).toVar(),T=Nt(b.abs().lessThan(.001),R(0),b).toVar(),S=de(Wt(T.mul(.5).add(.5),0,1)),V=Nt(T.notEqual(0),R(1),R(0)),M=Nt(t.isMask,R(1),V);return{color:S,calpha:Do(t.alpha.mul(t.mask).mul(M),a,t.isMask)}});var sd=le(e=>{let t=e.material?.vertexObjectNormal??null;return t?ur(t).transformNormalByInverseViewMatrix(Lt).normalize():sr}).once()().toVar("speVertexNormalWorld");Xo("dust",(e,t,a)=>{let r=e.getFloat("coverage"),s=e.getFloat("softness"),i=e.getFloat("noiseStrength"),n=e.getFloat("noiseScale"),l=Ha(or(sd),de(0,1,0)),o=R(0).toVar();he(i.notEqual(0),()=>{let e=Tu(ko.div(n).toVar().add(de(1.7,9.2,1)));o.assign(e.mul(i))});let u=It(s,1e-4).toVar(),d=Xt(u.add(1),u.add(1).negate(),Wt(r,0,1)).toVar(),h=sa(d.sub(u),d.add(u),l.add(o)).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Do(h,a,t.isMask)}});var id=(e,t)=>e.element(t);Xo("fresnel",(e,t,a)=>{let r=id(Rt,2).w.equal(-1),s=de(id(Lt,0).z,id(Lt,1).z,id(Lt,2).z).negate(),i=Ee.sub(St),n=Nt(r,i,s),l=e.getFloat("bias").add(e.getFloat("scale").mul(Ie(Be(e.getFloat("factor").add(Ha(or(n),or(sd)))),e.getFloat("intensity")))),o=Wt(l,0,1).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Do(o,a,t.isMask)}});var nd=e=>e,ld=e=>e;Xo("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=$(),p=pe(r.element(0)).toVar(),g=ne(h.div(c)).toVar(),f=ne(R(.5).add(g.x),g.y).toVar(),_=ne(pa(m).mul(f.x).sub(ea(m).mul(f.y)),ea(m).mul(f.x).add(pa(m).mul(f.y))).toVar(),y=ne(c.sub(.5).add(d).div(2).add(_.div(2))),x=R(Ha(y,_).div(Ha(_,_))).toVar();he(o.equal(Pe(1)),()=>{x.assign(Oa(c.add(h).mul(3),c.add(d).add(1)).add(m))}).ElseIf(o.equal(Pe(2)),()=>{let e=Qe(c.x.add(h.x).sub(.5).add(d.x),c.y.add(h.y).sub(.5).add(d.y)).mul(-1);x.assign(U(m.div(we).div(-2).add(e.div(we).mul(.5))))});for(let e=1;e<l;e++){let t=nd(s.element(e-1)),a=nd(s.element(e)),i=Wt(x.sub(t).div(a.sub(t)),R(0),R(1)),n=nd(Nt(u,sa(R(0),R(1),i),i));p.assign(Xt(p,ld(r.element(e)),n))}let v=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Do(v,a,t.isMask)}}),Xo("matcap",(e,t,a)=>{let r=e.getFloat("rotation"),s=or(Ve.negate()),i=or(de(s.z,0,s.x.negate())),n=ya(s,i),l=ne(Ha(i,Qa),Ha(n,Qa)),o=pa(r),u=ea(r),d=ne(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:Do(m,a,t.isMask)}}),Xo("noise",(e,t,a)=>{try{if("0"===new URLSearchParams(window.location.search).get("dbgnoise"))return{color:de(0),calpha:R(0)}}catch{}let r=Math.trunc(e.getValue("noiseType")??0),s=R(It(Be(e.getFloat("scale")),.001)).toVar(),i=de(ko.div(e.getVec3("size"))).toVar();i.divAssign(s);let n=e.getFloat("move"),l=e.getVec4("colorA"),o=e.getVec4("colorC"),u=pe(0).toVar();if(5===r){let t=e.getFloat("smoothness"),a=R($u(i.add(n),e.getInt("voronoiStyle"),t,e.getFloat("seed"),e.getInt("quality"))).toVar();a.assign(ju(a,e.getFloat("lowCut"),e.getFloat("highCut"),R(0),R(1))),a.assign(Wu(a,R(0),t.mul(.25))),a.assign(Gu(a,R(1),t.mul(.25))),u.assign(Xt(l,o,a))}else{let t=Xu[r]??Xu[0],a=e.getVec4("colorB"),s=e.getVec4("colorD"),d=de(e.getVec2("distortion"),1).toVar(),h=de(e.getVec2("fA"),1).toVar(),m=de(e.getVec2("fB"),1).toVar(),c=de(t(i),t(i.add(de(1))),t(i.add(de(1)))).toVar(),p=de(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=R(t(i.add(p))).toVar();u.assign(Xt(l,a,Wt(g.mul(g).mul(4),R(0),R(1)))),u.assign(Xt(u,o,Wt(it(c),R(0),R(1)))),u.assign(Xt(u,s,Wt(it(p.x),R(0),R(1))))}let d=t.alpha.mul(u.a).mul(t.mask);return{color:Wt(u,R(0),R(1)).rgb,calpha:Do(d,a,t.isMask)}}),Xo("normal",(e,t,a)=>({color:K(or(Qa)).mul(va(de(.5),e.getVec3("cnormal"))),calpha:Fo(t.alpha.mul(t.mask),a)}));var od=2*Math.PI,ud=Math.PI/180,dd=le(e=>{let t=U(e.p.xyx.mul(.1031)).toVar();return t.addAssign(Ha(t,t.yzx.add(33.33))),U(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_pattern_hash12",type:"float",inputs:[{name:"p",type:"vec2"}]});function hd(e){return dd({p:e})}var md=le(e=>{let t=e.uv,a=.5,r=R(e.a.mul(ud)).toVar(),s=ne(pa(r).mul(t.x.sub(a)).add(ea(r).mul(t.y.sub(a))).add(a),pa(r).mul(t.y.sub(a)).sub(ea(r).mul(t.x.sub(a))).add(a));return U(s)}).setLayout({name:"spe_pattern_rotate_uv",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"a",type:"float"}]});function cd(e,t){return md({uv:e,a:t})}var pd=le(e=>{let t=ne(e.uv.mul(e.frequency)).toVar(),a=ne(P(t)).toVar(),r=R(Jt(a.y,2)).toVar();t.x.addAssign(r.mul(e.zigzag));let s=ne(U(t)).toVar();s.assign(s.mul(2).sub(1)),a.assign(P(t));let i=R(hd(a).mul(5).add(1)).toVar(),n=R(Xt(R(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 gd(e,t,a,r,s){return pd({uv:e,frequency:t,variation:a,zigzag:r,rotation:s})}var fd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,it(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"}]}),_d=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar(),a=R(it(t)).toVar(),r=R(sa(e.smoothness.negate(),e.smoothness,a.sub(e.size))).toVar(),s=R(sa(e.smoothness.negate(),e.smoothness,a.sub(e.size.mul(.5)))).toVar();return r.add(E(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"}]}),yd=le(e=>{let t=R(R(od).div(R(e.n))).toVar(),a=R(e.r.mul(Fa(t.mul(.5)))).toVar(),r=ne(e.p.yx.negate()).toVar(),s=R(t.mul(P(Qe(r.y,r.x).add(t.mul(.5)).div(t)))).toVar(),i=ne(pa(s),ea(s)).toVar();return r.assign(ne(i.x.mul(r.x).add(i.y.mul(r.y)),i.y.negate().mul(r.x).add(i.x.mul(r.y)))),it(r.sub(ne(e.r,Wt(r.y,a.negate(),a)))).mul(Qt(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"}]}),xd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,yd({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"}]}),vd=le(e=>{let t=e.b,a=ne(Be(e.p)).toVar();a.assign(Nt(a.y.greaterThan(a.x),a.yx,a.xy));let r=ne(a.sub(t)).toVar(),s=R(It(r.y,r.x)).toVar(),i=ne(Nt(s.greaterThan(0),r,ne(t.y.sub(a.x),s.negate()))).toVar();return Qt(s).mul(it(It(i,ne(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"}]}),bd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,vd({p:t,b:ne(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"}]}),Td=le(e=>{let t=e.b,a=ne(Be(e.p)).toVar(),r=ne(t.sub(a.mul(2))).toVar(),s=r.x.mul(t.x).sub(r.y.mul(t.y)),i=R(Wt(s.div(Ha(t,t)),R(-1),R(1))).toVar();return R(it(a.sub(t.mul(.5).mul(ne(E(i),i.add(1)))))).toVar().mul(Qt(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"}]}),wd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,Td({p:t,b:ne(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"}]}),Sd=le(e=>{let t=ne(e.uv.mul(e.frequency)).toVar(),a=ne(P(t)).toVar(),r=R(Jt(a.y,2)).toVar();t.x.addAssign(r.add(e.zigzag.mul(r)));let s=R(P(t.x)).toVar();return Jt(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"}]}),Vd=le(e=>{let t=ne(gd(e.uv,e.frequency,R(0),e.zigzag,e.rotation)).toVar(),a=R(P(e.uv.mul(e.frequency)).y).toVar(),r=R(hd(ne(a))).toVar(),s=R(Xt(e.size,e.size.mul(r),e.variation)).toVar();return sa(s.sub(e.smoothness),s.add(e.smoothness),Be(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"}]}),Md=le(e=>{let{a:t,b:a,c:r,d:s}=e,i=ne(e.p.sub(ne(s,t)).mul(r)).toVar();i.x.assign(Jt(i.x,od)),he(i.x.greaterThan(Math.PI),()=>{i.x.assign(R(od).sub(i.x))});let n=R(0).toVar(),l=R(od).toVar();ge(24,()=>{let e=R(n.add(l).mul(.5)).toVar(),t=R(e.sub(i.x).add(a.mul(r).mul(ea(e)).mul(i.y.sub(a.mul(r).mul(pa(e)))))).toVar();he(t.lessThan(0),()=>{n.assign(e)}).Else(()=>{l.assign(e)})});let o=R(n.add(l).mul(.5)).toVar(),u=ne(o,a.mul(r).mul(pa(o))).toVar();return it(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"}]}),Cd=le(e=>{let t=R(e.frequency.x).toVar(),a=ne(e.uv.mul(t)).toVar(),r=ne(P(a)).toVar(),s=R(Jt(r.y,2)).toVar();a.x.addAssign(s.mul(e.zigzag));let i=ne(a.x,U(a.y)).toVar(),n=R(e.frequency.y.mul(.1)).toVar(),l=R(Md({p:i,a:R(.5),b:R(.125),c:n.mul(od),d:R(0)})).toVar(),o=R(hd(ne(r.y))).toVar(),u=R(Xt(e.size,e.size.mul(o),e.variation)).toVar();return sa(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 Rd(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 _d(a);case 2:return xd({...a,sides:t.sides});case 3:return bd(a);case 4:return wd(a);case 5:return Sd(a);case 6:return Vd(a);case 7:return Cd(a);default:return fd(a)}}Xo("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:R(Ie(g,5)).toVar(),zigzag:f,rotation:_,sides:v};if(4===n){let e=de(ko).toVar(),t=R(.0125).toVar(),a=ne(U(e.xy.mul(t))).toVar(),n=ne(U(e.zy.mul(t))).toVar(),l=ne(U(e.xz.mul(t))).toVar();a.assign(cd(a.add(u),_)),n.assign(cd(n.add(u),_)),l.assign(cd(l.add(u),_));let d=R(Rd(i,{uv:a,...b})).toVar(),h=R(Rd(i,{uv:n,...b})).toVar(),m=R(Rd(i,{uv:l,...b})).toVar(),c=R(E(o).mul(125).add(3)).toVar(),p=de(Ao).toVar(),g=de(Be(or(p))).toVar();g.assign(Ie(g,de(c))),g.divAssign(Ha(g,de(1))),d.mulAssign(g.z),h.mulAssign(g.x),m.mulAssign(g.y),r=R(d.add(h).add(m)).toVar(),s=ne(a.mul(g.z).add(n.mul(g.x)).add(l.mul(g.y))).toVar()}else{let e=ne(0).toVar();if(0===n)e.assign($());else if(2===n){let t,a,r=de(ko).toVar(),s=R(it(r)).toVar();0===l?(t=R(Qe(r.y,r.z)).toVar(),a=R(Fe(r.x.div(s))).toVar()):1===l?(t=R(Qe(r.x,r.z)).toVar(),a=R(Fe(r.y.div(s))).toVar()):(t=R(Qe(r.y,r.x)).toVar(),a=R(Fe(r.z.div(s))).toVar()),e.assign(ne(t,a).div(Math.PI))}e.addAssign(u),e.assign(U(e)),e.assign(cd(e,_)),r=Rd(i,{uv:e,...b}),s=e}let T=pe(Xt(d,h,r)).toVar();T.a.assign(Wt(T.a,R(0),R(1))),T.a.mulAssign(va(y.x,s.y).mul(va(s.y,y.y))),T.a.mulAssign(va(x.x,Be(s.x)).mul(va(Be(s.x),x.y)));let w=t.alpha.mul(Wt(T.a,R(0),R(1))).mul(t.mask);return{color:Wt(T,pe(0),pe(1)).rgb,calpha:Do(w,a,t.isMask)}});var zd=(e,t)=>e.element(t);Xo("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=R(0).toVar();!1!==t.noiseCompiledIn&&he(n.notEqual(0),()=>{let e=ko.div(l).toVar(),t=Tu(e.mul(1.6).add(de(1.8,1.5,1.9).mul(Tu(e))).add(de(1.7,9.2,1)));u.assign(t.mul(n))});let d=i.mul(de(1,.8,.6)).add(1),h=zd(Rt,2).w.equal(-1),m=de(zd(Lt,0).z,zd(Lt,1).z,zd(Lt,2).z).negate(),c=Ee.sub(St),p=Nt(h,c,m),g=Ha(or(p.add(o.mul(-.001))),or(sd)),f=pa(r.add(u).div(d).mul(g).add(s)).mul(.5).add(.5),_=de(Wt(f,0,2)).toVar(),y=Wt(_.r.add(_.g).add(_.b),0,1);return{color:_,calpha:Do(t.alpha.mul(y).mul(t.mask),a,t.isMask)}});var kd=e=>e,Ad=e=>e,Pd=ge,Ed=ge,Nd=le(e=>{let t=e.x,a=de(Ha(t,de(127.1,311.7,74.7)),Ha(t,de(269.5,183.3,246.1)),Ha(t,de(113.5,271.9,124.6)));return U(ea(a).mul(43758.5453123))}).setLayout({name:"spe_toonHash3",type:"vec3",inputs:[{name:"x",type:"vec3"}]}),Bd=le(e=>{let t=e.x,a=P(t).toVar(),r=U(t).toVar(),s=R(100).toVar(),i=()=>({start:Pe(-1),end:Pe(1),condition:"<=",type:"int"});return Ed(i(),i(),i(),({i:e,j:t,k:i})=>{let n=de(e,t,i).toVar(),l=n.sub(r).add(function(e){return Nd({x:e})}(a.add(n))).toVar(),o=Ha(l,l).toVar();he(o.lessThan(s),()=>{s.assign(o)})}),s.sqrt()}).setLayout({name:"spe_toonVoronoiF1",type:"float",inputs:[{name:"x",type:"vec3"}]});Xo("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=or(sd).toVar(),c=R(0).toVar();!0===a.lightsAvailable&&he(r.equal(Pe(0)),()=>{Pd({start:Pe(0),end:w.toonLightCount,condition:"<",type:"int"},({i:e})=>{let t=w.toonLightData.element(e).toVar(),a=t.xyz,r=t.w,s=Nt(r.greaterThan(.5),or(a),or(a.sub(Ee))),i=Ha(s,m).mul(.5).add(.5);c.assign(It(c,i))}),c.assign(Wt(c,0,1))}),he(r.equal(Pe(1)),()=>{let e=Xt(ko,Ee,Nt(l,R(1),R(0))),t=or(n.sub(e));c.assign(Ha(t,m).mul(.5).add(.5))}).ElseIf(r.equal(Pe(2)),()=>{let e=St.sub(h),t=or(e.sub(Ee));c.assign(Ha(t,m).mul(.5).add(.5))}),he(o.greaterThan(0),()=>{let e=ko.div(u),t=R(1).sub(Bd({x:e}));c.addAssign(t.mul(o))}),c.assign(Wt(c,0,1));let p=(e.getValue("colors")??s.array).length,g=(e.getValue("steps")??i.array).length,f=Math.min(10,p,g),_=pe(s.element(0)).toVar();for(let e=1;e<f;e++){let t=kd(i.element(e-1)),a=kd(i.element(e)),r=Wt(c.sub(t).div(a.sub(t)),R(0),R(1));_.assign(Xt(_,Ad(s.element(e)),sa(0,1,r)))}!0===a.lightsAvailable&&he(r.equal(Pe(0)),()=>{let e=R(1),t=Xt(_.rgb,d.rgb,d.a);_.rgb.assign(Xt(t,_.rgb,e))});let y=t.alpha.mul(_.a).mul(t.mask);return{color:_.rgb,calpha:Fo(y,a)}});var Ld=e=>e,Id=e=>e,Dd=e=>e,Fd=e=>e;Xo("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)=>Lt.element(t))(0,e),u=or(de(o(0).z.negate(),o(1).z.negate(),o(2).z.negate())),d=or(Ee.sub(St)),h=w.orthographicUniform,m=Nt(h.greaterThan(.5),u,d).toVar(),c=or(sd).toVar(),p=ut(m,c,R(1).div(s)).toVar(),g=or(p).mul(r).mul(Po).toVar(),f=e=>{let t=w.unjitteredProjection.mul(Lt).mul(pe(e,1)),a=t.xy.div(t.w);return ne(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5))},_=f(Ee.add(g).toVar()).toVar(),y=(f(Ee).toVar(),i.mul(Wt(s.mul(2).sub(2),R(0),R(1))).toVar()),x=V(l.x).mul(y).toVar(),v=y,b=Ht(x.div(5.5),R(8.5)).toVar(),T=null,S="fit",M=!0,C=!1,z=12,k="white",A=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))&&(A=Math.max(0,Number(r))),"6"===a&&(S="ring",z=6),"0"===e.get("dbgwarp")&&(M=!1),"1"===e.get("dbgdither")&&(C=!0);let s=e.get("dbgangle");("classic"===s||"0"===s)&&(k=s)}catch{}null!==T&&Number.isFinite(T)&&b.assign(R(T));let E,N=(()=>{if("singlewide"===S)return Ht(b.add(1),R(8.5)).toVar();if("fit"!==S)return b;let e=w.transmissionActualSize.x.div(w.resolution.x),t=v.mul(b).mul(5*A).mul(e).toVar();return Ht(V(rr(b.mul(2)).add(t.mul(t).mul(3))).mul(.5),R(8.5)).toVar()})(),B=e=>n.sample(M?(e=>{let t=w.transmissionActualSize.div(rr(P(N))),a=e.mul(t).sub(.5),r=P(a),s=a.sub(r),i=s.mul(s).mul(ne(3,3).sub(s.mul(2)));return r.add(.5).add(i).div(t)})(e):e).level(N).rgb,L="r50"===S?.5:"r75"===S?.75:1;if("single"===S||"singlewide"===S||"fit"===S)if("fit"===S){let e=P(N).toVar(),t=N.sub(e).toVar(),a=fa(rr(t.mul(2)).sub(1)).mul(1.1547).toVar(),r=ne(rr(e)).div(w.transmissionActualSize).mul(a).toVar(),s=de(0).toVar(),i=12;for(let t=0;t<i;t++){let a=Id(ee(t,i,R(0))),l=Id(_.add(a.mul(r)));s.addAssign(Dd(Fd(n.sample(l).level(e)).rgb))}E=s.div(i).toVar()}else E=B(_).toVar();else{let e=ne(R(1).div(w.resolution.x),R(1).div(w.resolution.y)).toVar(),t=Q("classic"===k?Mt.xy.add(w.cameraJitterPx):Mt.xy).mul(6.28318530718);"white"===k&&(t=t.add(w.tapAngle));let a=t.toVar(),r=w.tapAngle.mul(13.7).toVar(),s=w.tapAngle2.mul(5.3).toVar(),i=ne(rr(P(N).add(1))).div(w.transmissionActualSize).toVar(),n=Q(Mt.xy.add(ne(r,s))).toVar(),l=Q(Mt.xy.add(ne(s.mul(1.71),r.mul(2.39)))).toVar(),o=de(0).toVar();for(let t=0;t<z;t++){let r=Id(ee(t,z,a)).mul(e).mul(v).mul(b.mul(10)).mul(L),s=Id(_.add(r));if(C){let e=Ld(U(n.add(.7548776662*t))),a=Ld(U(l.add(.5698402911*t))),r=Id(ne(e.sub(.5),a.sub(.5)).mul(i));s=Id(s.add(r))}o.addAssign(B(s))}E=o.div(z).toVar()}if(e.has("attenuationDistance")){let t=e.getFloat("attenuationDistance"),a=de(e.getColor("attenuationColor")).toVar();he(t.greaterThan(0),()=>{let e=Ie(It(a,de(1e-4)),de(r.div(t)));E.mulAssign(e)})}let I=t.alpha.mul(t.mask).toVar(),D=I.div(Wt(I.add(a.accumAlpha),R(1e-5),R(1))).toVar();return a.accumAlpha.addAssign(R(1).sub(a.accumAlpha).mul(t.alpha)),{color:E,calpha:D}}),Xo("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=W("__splinePlanarMirror","float"),f=p.greaterThan(.5).and(g.greaterThan(.5)),_=w.reflectionResolveTarget,y=w.reflectionResolveEnabled,x=w.orthographicUniform.greaterThan(.5),v=Nt(x,de(0,0,-1),or(Ve)).toVar(),b=or(Qa).toVar(),T=nt(v,b).toVar(),S=Wt(r.mul(.1),R(0),R(1)).toVar(),M=w.resolution,C=de(0).toVar(),z=y.greaterThan(.5).and(S.greaterThan(.05)).and(f.not()),k=or(ir(T,Ut)).toVar(),A=Gi(m,k,S).toVar(),P=_.sample(kt).level(R(0)).toVar();he(z,()=>{let e=P.a.toVar();C.assign(Xt(A,P.rgb.div(e.max(1e-4)),Wt(e.mul(2),R(0),R(1))))}).Else(()=>{C.assign(qi({dials:{blur:r,thickness:s,steps:i,stepSize:n,tracingMode:l},surface:{originView:Ve,normalV:b,screenUv:kt,fragWindowZ:Na},camera:{projectionMatrix:Rt,projectionMatrixInverse:Pt,worldMatrix:Ut,near:vt},resources:{colorMap:o,depthPyramid:u,depthPyramidNode:d,envMap:m},usePlanar:f,noisePixel:kt.mul(M).floor()}))}),he(f,()=>{let e=ne(R(1).sub(kt.x),kt.y).toVar(),t=R(h.sub(1)),a=Ht(V(S.mul(M.y).mul(.075).add(1)),t).toVar(),r=a.sub(1).max(0).floor().toVar(),s=R(2).pow(a).sub(1).max(0).toVar(),i=s.mul(.75).div(M.y).toVar();C.assign(Ui(c,e,i,s.mul(.75),r))});let E=t.alpha.mul(t.mask).toVar(),N=E.div(Wt(E.add(a.accumAlpha),R(1e-5),R(1))).toVar();return a.accumAlpha.addAssign(R(1).sub(a.accumAlpha).mul(E)),{color:C,calpha:N}});var Ud=e=>e,Od=e=>e;function Gd(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=Fr[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(";")}Xo("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=dt("randomColor","vec3").x.toVar(),x=Na.toVar(),v=kt.toVar(),b=ne(R(1).div(f.x),R(1).div(f.y)).toVar(),T=w.pcssHalton,S=Q(Mt.xy.add(T)).mul(6.28318530718).toVar(),V=c.select(i.div(2),i),M=b.mul(V).mul(_).toVar(),C=[[-1,-1],[0,-1],[1,-1],[-1,0],[0,0],[1,0],[-1,1],[0,1],[1,1]],z=e=>ee(e,9,S).mul(b),k=[],A=R(0).toVar();for(let e=0;e<9;e++){let[t,a]=C[e],r=4===e?v:Ud(v.add(ne(M.x.mul(t),M.y.mul(a))).add(z(e))),s=Ud(r).toVar(),i=Od(p.sample(s)).toVar();k.push(i),he(i.a.notEqual(y).and(i.a.notEqual(0)),()=>{let e=g.sample(s).r.add(1e-4);he(x.greaterThan(e),()=>{A.assign(1)})})}let P=k[2].rgb.add(k[5].rgb.mul(2)).add(k[8].rgb).sub(k[0].rgb.add(k[3].rgb.mul(2)).add(k[6].rgb)),E=k[0].rgb.add(k[1].rgb.mul(2)).add(k[2].rgb).sub(k[6].rgb.add(k[7].rgb.mul(2)).add(k[8].rgb)),N=fa(Ha(P,P).add(Ha(E,E))).mul(A.oneMinus()).toVar(),B=de(r).toVar(),L=sa(l.sub(u),l.add(u),N).toVar(),I=or(sd).toVar(),D=R(1).sub(o).toVar();he(m,()=>{let e=ko.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=U(t.mul(d).mul(.01)),r=j(t.mul(d)),i=sa(r.mul(n.mul(.01)),r.mul(n.mul(.02)),a).toVar();he(i.lessThan(1).and(L.equal(0)),()=>{B.assign(s),L.assign(1)})}).Else(()=>{let e=I.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=j(t.mul(o)).toVar(),r=ea(t.mul(d)).toVar(),i=sa(R(0),a.mul(n),R(1).sub(r)).toVar();he(a.greaterThan(D.mul(.5)).and(i.lessThan(1)).and(L.equal(0)),()=>{B.assign(s),L.assign(R(1).sub(i))})});let F=t.alpha.mul(L).mul(t.mask).toVar(),O=F.div(Wt(F.add(a.accumAlpha),R(1e-5),R(1))).toVar();return a.accumAlpha.addAssign(R(1).sub(a.accumAlpha).mul(F)),{color:B,calpha:O}}),Xo("vertexColor",(e,t,a)=>{let r=Te(),s=t.alpha.mul(t.mask).mul(r.a);return{color:r.rgb,calpha:Fo(s,a)}});var qd=e=>e,Wd=e=>e;function Hd(e,t=1){let a=new Ms(e);return new Or(a.r,a.g,a.b,t)}function jd(e,t){if(e instanceof Or)return e;if(e instanceof Ms)return new Or(e.r,e.g,e.b,1);if("number"==typeof e)return Hd(e);if("object"==typeof e&&null!==e&&"r"in e&&"g"in e&&"b"in e){let t=e;return new Or(t.r,t.g,t.b,t.a??1)}return t()}function Kd(){let e=new Array(10).fill(new xs(0,0,0,1)).map(e=>e.clone());return e[1]=new xs(1,1,1,1),e}function $d(){let e=new Array(10).fill(1);return e[0]=0,e}var Xd={color:{color:{kind:"color",def:()=>Hd(Yr)}},vertexColor:{},cavity:{ridge:{kind:"float",def:()=>1},valley:{kind:"float",def:()=>1}},fresnel:{color:{kind:"color",def:()=>Hd(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:()=>Hd(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 ms},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},offset:{kind:"vec3",def:()=>new ms}},transmission:{thickness:{kind:"float",def:()=>10},ior:{kind:"float",def:()=>1.5},roughness:{kind:"float",def:()=>.5},attenuationColor:{kind:"color",def:()=>Hd(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:Kd},steps:{kind:"floatArray",def:$d},source:{kind:"vec3",def:()=>new ms},isWorldSpace:{kind:"bool",def:()=>!0},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},shadowColor:{kind:"colorVec4",def:()=>new Or(0,0,0,0)},offset:{kind:"vec3",def:()=>new ms}},outline:{outlineColor:{kind:"color",def:()=>Hd(16777215)},contourColor:{kind:"color",def:()=>Hd(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 ms(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 ms},direction:{kind:"vec3",def:()=>new ms(1,0,0)},colors:{kind:"vec4array",def:()=>[new xs(0,0,0,1),new xs(1,1,1,1)]},steps:{kind:"floatArray",def:()=>[0,1]}},noise:{scale:{kind:"float",def:()=>1},size:{kind:"vec3",def:()=>new ms(100,100,100)},move:{kind:"float",def:()=>1},fA:{kind:"vec2",def:()=>new ds(1.7,9.2)},fB:{kind:"vec2",def:()=>new ds(8.3,2.8)},distortion:{kind:"vec2",def:()=>new ds(1,1)},colorA:{kind:"colorVec4",def:()=>new Or(.4,.4,.4,1)},colorB:{kind:"colorVec4",def:()=>new Or(.4,.4,.4,1)},colorC:{kind:"colorVec4",def:()=>new Or(1,1,1,1)},colorD:{kind:"colorVec4",def:()=>new Or(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 ms(1,1,1)}},gradient:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},colors:{kind:"vec4array",def:Kd},steps:{kind:"floatArray",def:$d},offset:{kind:"vec2",def:()=>new ds},morph:{kind:"vec2",def:()=>new ds},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 ds},colorA:{kind:"colorVec4",def:()=>new Or(0,0,0,1)},colorB:{kind:"colorVec4",def:()=>new Or(1,1,1,1)},frequency:{kind:"vec2",def:()=>new ds(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 ds(0,1)},horizontal:{kind:"vec2",def:()=>new ds(0,1)},sides:{kind:"int",def:()=>6}}},Qd=new xs;function Zd(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 Yd(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 Jd(e,t,a,r){let s,i,n=e.params;switch(a){case"float":s=N(Number(r??0));break;case"int":s=N(Number(r??0),"int");break;case"axis":s=N(["x","y","z"].indexOf(String(r)),"int");break;case"bool":s=N(!!r);break;case"vec2":s=N(r instanceof ds?r:new ds);break;case"vec3":s=N(r instanceof ms?r:new ms);break;case"vec4":s=N(r instanceof xs?r:new xs);break;case"color":{let e=jd(r,()=>Hd(16777215));s=N(e),i=e;break}case"colorVec4":{let a=jd(r,()=>new Or(1,1,1,1)),n=new xs(a.r,a.g,a.b,a.a),l=N(n);l.onObjectUpdate(r=>{let s=Zd(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=Yd(t,s),n=r.get(i);if(void 0===n){let s=N(a[i]??new xs);s.onObjectUpdate(r=>(Zd(r,e).params.getValue(t)??a)[i]??Qd),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 xs]),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=Yd(t,s),n=r.get(i);if(void 0===n){let s=N(a[i]??0);s.onObjectUpdate(r=>{let s=Zd(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&&(No(s),s.onObjectUpdate(a=>{let r=Zd(a,e).params.getValue(t);void 0!==r&&Lo(s,r)})),n.set(t,s,i),e.uniformKinds.set(t,a)}var eh=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 cs).makeRotation(this.rotation*ls.DEG2RAD))}},th=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 Io(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 Wr||e.deref();this.holders.length=0}},ah=class extends th{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 rh(e,t){let a=e.data;"displace"!==a.type?("alpha"in a&&e.params.has("alpha")&&e.params.setValue("alpha",Lr(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",(Ir(a.intensity,t)??1)*(a.visible?1:0))}function sh(e,t){Jd(e,"alpha","float",t.alpha??1),Jd(e,"mode","int",t.mode??0),Jd(e,"isMask","float",t.isMask?1:0)}function ih(e,t,a,r){let s=new ah(e,t,a),i=a;if(Jd(s,"alpha","float",Lr(i.alpha,r)),Jd(s,"mode","int",i.mode??0),Jd(s,"bumpMapIntensity","float",i.bumpMapIntensity??5),Jd(s,"alphaOverride","float",Lr(i.alphaOverride,r)),a.visible)if("lambert"===i.category)Jd(s,"emissive","color",r.color(i.emissive)??Hd(0)),Jd(s,"occlusion","bool",i.occlusion??!0);else if("toon"===i.category)Jd(s,"shininess","float",i.shininess??30),Jd(s,"specular","color",r.color(i.specular)??Hd(1118481));else if("physical"===i.category){Jd(s,"roughness","float",i.roughness??.3),Jd(s,"metalness","float",i.metalness??0),Jd(s,"reflectivity","float",i.reflectivity??.5),Jd(s,"occlusion","bool",i.occlusion??!0),Jd(s,"normalScale","float",i.normalScale??1),Jd(s,"aoMapIntensity","float",i.aoMapIntensity??1),Jd(s,"emissive","color",void 0!==i.emissive?r.color(i.emissive)??Hd(0):Hd(0)),Jd(s,"emissiveIntensity","float",i.emissiveIntensity??1);let e=i;void 0!==e.clearcoat&&(Jd(s,"clearcoat","float",e.clearcoat),Jd(s,"clearcoatRoughness","float",e.clearcoatRoughness??.1)),void 0!==e.sheen&&(Jd(s,"sheen","float",e.sheen),Jd(s,"sheenColor","color",void 0!==e.sheenColor?r.color(e.sheenColor)??Hd(16777215):Hd(16777215)),Jd(s,"sheenRoughness","float",e.sheenRoughness??.5)),void 0!==e.ior&&(Jd(s,"ior","float",e.ior),Jd(s,"specularIntensity","float",e.specularIntensity??1),Jd(s,"specularColor","color",void 0!==e.specularColor?r.color(e.specularColor)??Hd(16777215):Hd(16777215))),void 0!==e.iridescence&&(Jd(s,"iridescence","float",e.iridescence),Jd(s,"iridescenceIOR","float",e.iridescenceIOR??1.3),Jd(s,"iridescenceThickness","float",e.iridescenceThickness??400))}else Jd(s,"shininess","float",i.shininess??30),Jd(s,"specular","color",void 0!==i.specular?r.color(i.specular)??Hd(1118481):Hd(1118481)),Jd(s,"occlusion","bool",i.occlusion??!0);return s.node.alphaOverride=s.params.get("alphaOverride"),rh(s,r),s}function nh(e,t,a,r){let s=new th("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=qa(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=Ir(a.texture.rotation??0,r)??0;if("matcap"===a.type)Jd(s,"rotation","float",o*ls.DEG2RAD);else{let e=N(new ds(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=N(i.loaded||i.isBuffer?1:0);t.onRenderUpdate(()=>i.loaded||i.isBuffer?1:0),s.params.set("loaded",t),s.uniformKinds.set("loaded","float"),Jd(s,"crop","float",a.crop?1:0),Jd(s,"projection","int",a.projection??0),Jd(s,"axis","axis",a.axis),Jd(s,"projectionAxis","axis",a.projectionAxis),Jd(s,"side","int",a.side??0);let l=a.size?new ds(Ir(a.size[0],r)??0,Ir(a.size[1],r)??0):new ds(100,100);Jd(s,"size","vec2",l),Jd(s,"blending","float",a.blending??0);let u=new cs,d=new eh([Ir(a.texture.repeat?.[0]??1,r)??1,Ir(a.texture.repeat?.[1]??1,r)??1],[Ir(a.texture.offset?.[0]??0,r)??0,Ir(a.texture.offset?.[1]??0,r)??0],o,u),h=N(u);No(h),h.onObjectUpdate(e=>{let t=Zd(e,s).params.getNodeValue("mat");void 0!==t&&Lo(h,t)}),s.params.set("mat",h,d)}return sh(s,{alpha:Lr(a.alpha,r),mode:a.mode??0,isMask:a.isMask??!1}),rh(s,r),s}function lh(e,t,a,s){if("light"===a.type)return ih(e,t,a,s);if("texture"===a.type||"video"===a.type||"matcap"===a.type)return nh(e,t,a,s);if("displace"===a.type)return function(e,t,a,r){if("noise"!==a.displacementType)throw new Error;let s=new th("vertex",e,t,a),i=(e,t)=>Ir(e,r)??t;return Jd(s,"offset","vec3",new ms(...a.offset.map(e=>i(e,0)))),Jd(s,"scale","float",i(a.scale,10)),Jd(s,"intensity","float",i(a.intensity,8)),Jd(s,"movement","float",i(a.movement,1)),Jd(s,"noiseType","int",a.noiseType??0),Jd(s,"voronoiStyle","int",a.voronoiStyle??0),Jd(s,"smoothness","float",i(a.smoothness,.5)),Jd(s,"seed","float",i(a.seed,0)),Jd(s,"highCut","float",i(a.highCut,1)),Jd(s,"lowCut","float",i(a.lowCut,0)),Jd(s,"quality","int",Ir(a.quality,r)??1),rh(s,r),s}(e,t,a,s);let i=new th("fragment",e,t,a),n=r(a,s),l=Xd[a.type]??Xd.color;for(let[e,t]of Object.entries(l))Jd(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;Jd(i,"aspectRatio","vec2",e>=t?new ds(t/e,1):new ds(1,e/t))}return sh(i,n),rh(i,s),i}var oh={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"]}]},uh=class extends Ct{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=Mi.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){Ci.add(e)}(this),this.addEventListener("dispose",()=>function(e){Ci.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(${Gd(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(Gd(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 Ai?Mi.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 vertexObjectNormal(){return this.shapeBlendObjectNormal??this.root.displacedObjectNormal}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??Kr.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=lh(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 ah);if(void 0===s&&(s=ih(0,"",{...jr.defaultData("light","phong"),visible:!1},t.shared)),this.lightLayer=s,this.lights=!!this.lightLayer.data.visible,this.ctx={accumAlpha:R(0).toVar("accumAlpha"),lightsAvailable:this.lights&&("phong"===this.category||"lambert"===this.category||"physical"===this.category)},this.colorNode=le(()=>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=le(()=>{let t=de(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"):R(1),{uvs:s,weights:i}=hu(e);if(null!==i){let e=de(a.sample(s[0]).rgb).toVar(),r=de(a.sample(s[1]).rgb).toVar(),n=de(a.sample(s[2]).rgb).toVar();t=e.mul(i.z).add(r.mul(i.x)).add(n.mul(i.y))}else t=de(a.sample(s[0]).rgb);return Xt(de(0),t,r)}(a.params))),t})()}let a=this.findTextureMapLayer(t.aoMap);null!==a&&(this.aoNode=le(()=>Xt(R(1),gu(a.params,t.aoMapChannel??"r"),e.getFloat("aoMapIntensity")))())}this.transparent=Br(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 uh(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(Ba(ur(t.normal))),this.castShadowPositionNode=t.position,this.shapeBlendOptions.useChildrenColors&&(this._shapeBlendColorNode=t.color,this.colorNode=le(()=>this.buildColorStack())()),this.needsUpdate=!0}lightLayerIndex(){return this.layers.findIndex(e=>e instanceof ah)}findTextureMapLayer(e){if(!e)return null;if("string"!=typeof e)return Hr.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=jr.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=nh(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 le(()=>function(e,t,a){let r=de(a??Qa).toVar(),s=Ve,i=e.get("texture"),n=e.has("loaded")?e.getFloat("loaded"):R(1),l=e=>{let a=ne(e).toVar(),l=de(i.sample(a).rgb.mul(2).sub(1)).toVar(),o=de(Xt(de(0,0,1),l,n)).toVar();o.xy.mulAssign(t);let u=de(Ma(s)).toVar(),d=de(ka(s)).toVar(),h=ne(Ma(a)).toVar(),m=ne(ka(a)).toVar(),c=de(or(r)).toVar(),p=de(ya(d,c)).toVar(),g=de(ya(c,u)).toVar(),f=de(p.mul(h.x).add(g.mul(m.x))).toVar(),_=de(p.mul(h.y).add(g.mul(m.y))).toVar(),y=R(It(Ha(f,f),Ha(_,_))).toVar(),x=R(Nt(y.equal(0),R(0),lr.mul(Le(y)))).toVar();return or(f.mul(o.x.mul(x)).add(_.mul(o.y.mul(x))).add(c.mul(o.z)))},{uvs:o,weights:u}=hu(e);if(null!==u){let e=l(o[0]),t=l(o[1]),a=l(o[2]);return or(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 le(()=>function(e,t,a){let r=de(a??Qa).toVar(),s=Ve,i=e.get("texture"),{uvs:n,weights:l}=hu(e);if(null!==l){let e=pu(s,r,cu(i,n[0],t)),a=pu(s,r,cu(i,n[1],t)),o=pu(s,r,cu(i,n[2],t));return or(e.mul(l.z).add(a.mul(l.x)).add(o.mul(l.y)))}return pu(s,r,cu(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=ae("vec3","vDisplacedNormal");return{position:le(a=>{let r=_e,s=ja;for(let t=0;t<e.length;t++){let a=td(e[t],Qu(_e),s);r=0===t?a.position:Qu(r.add(a.position).mul(.5)),s=a.normal}let i=de(r).toVar();return t.assign(s),!0===a.needsPreviousData?.()&&be.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:Ba(ur(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=R(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=Qo(e.type)(e.params,s,this.ctx);return a?.color?{...i,color:a.color}:i}evaluateMask(e){let t=this.runLayerBuilder(e,null);return _t(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=Wd(this.runLayerBuilder(t,this.maskSourceFor(e),r?{color:Wd(r.rgb),alpha:qd(r.w)}:void 0).color);continue}if(t.isMaskEnabled)continue;let r=this.runLayerBuilder(t,this.maskSourceFor(e));a=Ho(a,r.color,r.calpha,t.modeNode)}return a??na(Yr)}setup(e){e.context.setupClearcoatNormal=()=>La(Qa,"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 iu(!0===a?.clearcoat,!0===a?.sheen,!0===a?.iridescence,!1,!1,!1);return e.envIrradianceActive=r,e}case"lambert":return new ta(!1);case"toon":{let e=new su;return e.aoOcclusionGate=t,e}default:return new ta}}(this.category,e,this.physicalLobes(),this.envNode instanceof Ai)}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=le(()=>gu(r.params,e.roughnessMapChannel??"luminance"))());let s=this.findTextureMapLayer(e.metalnessMap);null!==s&&(a=le(()=>gu(s.params,e.metalnessMapChannel??"b"))())}!function(e,t,a=null,r=null){if("phong"===e||"toon"===e)jt.assign(t.getFloat("shininess").max(1e-4)),oa.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=Wt(r.mul(e),R(0),R(1))),Ot.assign(e),gt.assign(Wt(s,R(.0525),R(1))),t.has("ior")){let a=t.getFloat("ior"),r=t.has("specularColor")?de(t.getColor("specularColor")):de(1),s=t.has("specularIntensity")?t.getFloat("specularIntensity"):R(1);Ue.assign(a),oa.assign(Ht(Oe(Ue.sub(1).div(Ue.add(1))).mul(r),de(1)).mul(s)),Jo.assign(Xt(oa,Da.rgb,e)),ma.assign(Xt(s,R(1),e))}else{let t=de(i.pow(2).mul(.16));oa.assign(t),Jo.assign(Xt(t,Da.rgb,e)),ma.assign(R(1))}if(Yo.assign(Da.rgb.mul(E(e))),t.has("clearcoat")&&($t.assign(t.getFloat("clearcoat")),aa.assign(Wt(t.getFloat("clearcoatRoughness"),R(.0525),R(1)))),t.has("sheen")){let e=t.has("sheenColor")?de(t.getColor("sheenColor")):de(1);Dt.assign(e.mul(t.getFloat("sheen"))),Gt.assign(Wt(t.getFloat("sheenRoughness"),R(.07),R(1)))}t.has("iridescence")&&(We.assign(t.getFloat("iridescence")),$e.assign(t.getFloat("iridescenceIOR")),Ze.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?de(0):Da.rgb,i=de(0),n=de(0);if(r&&(a.length>0||r.getScope().hasLights)){let e=this.setupLightingModel()||null,t=ht(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&&(Xa.assign(de(this.emissiveNode)),s=s.add(Xa)),le(()=>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=R(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=de(t).toVar();return he(qe(z(u,Da.rgb)),()=>{let e=Wt(it(a.add(r)),R(0),R(1));o.accumAlpha.addAssign(E(o.accumAlpha).mul(s).mul(n).mul(e)),u.assign(Ho(Da.rgb,u,s.mul(n),i)),u.mulAssign(au(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=de(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=Ho(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"):R(1),m=i?s:s.mul(o);if(Da.a.assign(m.mul(h)),Da.a.lessThanEqual(R(0)).discard(),this.dithering){let e=et(Mt.xy),t=de(.25/255,-.25/255,.25/255),a=Xt(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||Dr(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)&&!Dr(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(Br(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||uh.hasVariableString(s[e])||uh.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)*ls.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||Dr(r))!==e.noiseCompiledIn)return!0}let r=Fr[e.type];if(void 0!==r&&r.includes(t))return!0;let i=Ur[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)&&(rh(e,r),"intensity"!==t||"displace"===e.type))return;if("alphaOverride"===t&&e instanceof ah)return void e.setValue("alphaOverride",Lr(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):jd(n,()=>a??new Or(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(Br(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(Br(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 fs||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=oh[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()}},dh=class extends uh{constructor(e,t,a){super(e,t,!1),this.isTSLSharedMaterial=!0,this.uuid=a,this.allowVariableSaves=!0,this.saveVariableLocations(t)}};function hh(e,t){let a=e.xyz;return t.add(ya(a,ya(a,t).add(t.mul(e.w))).mul(2))}function mh(e){let t=zu(e),a=zu(de(e.y.sub(19.1),e.z.add(33.4),e.x.add(47.2))),r=zu(de(e.z.add(74.2),e.x.sub(124.5),e.y.add(99.4)));return de(t,a,r)}var ch=le(e=>{let t=e.p.add(e.seed).toVar(),a=de(.1,0,0),r=de(0,.1,0),s=de(0,0,.1),i=mh(t.sub(a)).toVar(),n=mh(t.add(a)).toVar(),l=mh(t.sub(r)).toVar(),o=mh(t.add(r)).toVar(),u=mh(t.sub(s)).toVar(),d=mh(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 or(de(h,m,c).mul(5))});function ph(e,t){return ch({p:e,seed:t})}function gh(e,t,a){return de(Iu(e.add(de(a)).mul(t)),Iu(e.add(de(a.add(20))).mul(t)),Iu(e.add(de(a.sub(30))).mul(t)))}function fh(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 _h(e,t){switch(e){case"position":return function(e){let t=fh(e.registry);return le(()=>{let a=$(),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=va(.5,p),_=R(3).mul(f),y=c.mul(R(1).add(_)),x=c.mul(Ht(t.f("uFPSRatio",1),R(5)));n.addAssign(Xt(x,y,f));let v=hh(t.v4("uWorldQuaternion"),h).add(t.v3("uWorldOffset"));n.assign(Xt(n,v,o)),d.assign(Xt(d,t.f("uTime"),o));let b=It(g.sub(t.f("uTime").sub(d)),R(0)).div(g);return Xt(pe(0),pe(n,b),u)})()}(t);case"velocity":return function(e){let t=fh(e.registry),a=e.features;return le(()=>{let r=$(),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=R(1).sub(t.f("uRandomMassFactor").mul(function(e){return e.dot(ne(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");he(c.equal(1),()=>{a.USE_CURL_NOISE&&(he(y.greaterThan(0),()=>{d.assign(ph(l.mul(y).mul(.002),x).mul(_.add(1)).mul(.05).mul(f))}),he(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(ph(l,x).mul(_).mul(.05).mul(f))})),a.USE_SIMPLEX_NOISE&&(he(y.greaterThan(0),()=>{d.assign(de(zu(l.mul(y).mul(.001)).mul(_.add(1)).mul(.1)).mul(f))}),he(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(de(zu(l.mul(_).mul(.001)).mul(.05)).mul(f))})),a.USE_FBM_NOISE&&(he(y.greaterThan(0),()=>{d.assign(gh(l.mul(y).mul(.001),_.add(1),x).mul(f))}),he(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(gh(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=It(t.f("uBounce").mul(2),R(.01)).toVar(),n=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),l=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar().div(e).toVar(),o=it(l).toVar();he(o.lessThanEqual(R(1).add(n.div(it(e)))).and(s.equal(0)),()=>{let a=l.mul(R(1).add(n.div(it(e)))),o=or(a.div(e.mul(e)));o=hh(t.v4("uColliderQuaternion"),o),r.assign(nt(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=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),o=Be(l).sub(e).toVar(),u=It(o.x,It(o.y,o.z)).toVar();he(u.lessThanEqual(n.mul(.5)).and(s.equal(0)),()=>{let e=de(0).toVar();he(o.x.greaterThan(o.y).and(o.x.greaterThan(o.z)),()=>{e.assign(de(Qt(l.x),0,0))}).ElseIf(o.y.greaterThan(o.z),()=>{e.assign(de(0,Qt(l.y),0))}).Else(()=>{e.assign(de(0,0,Qt(l.z)))});let a=hh(t.v4("uColliderQuaternion"),e);r.assign(nt(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=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos")));n=it(r.div(e)).toVar(),l=R(1)}else{let e=t.v3("uColliderSize").div(2),r=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))),s=Be(r).sub(e);n=It(s.x,It(s.y,s.z)).toVar(),l=o}he(n.lessThanEqual(l),()=>{let o=e.features.USE_SPHERE_COLLIDER?R(1).sub(n).mul(s):It(R(1).sub(l.div(n)),R(0)).mul(s),u=a.sub(t.v3("uColliderPos")),d=or(u).mul(o);r.subAssign(d),r.mulAssign(i)})}else{let e=a.sub(t.v3("uColliderPos")),n=or(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=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),d=Be(u).sub(o).toVar(),h=It(d.x,It(d.y,d.z)).toVar();he(h.lessThanEqual(l),()=>{let e=t.f("uForceIntensity"),l=t.v3("uColliderPos").add(hh(t.v4("uColliderQuaternion"),de(0))).sub(a).toVar(),o=de(0,1,.01),u=or(ya(o,hh(t.v4("uColliderQuaternion"),l))).toVar(),d=it(l.mul(e).mul(3)).toVar();r.assign(u.mul(d).mul(.005));let h=hh(t.v4("uWorldQuaternion"),s);r.addAssign(h.mul(n).mul(R(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(Xt(d,hh(t.v4("uWorldQuaternion"),v).mul(f),m)),d.addAssign(t.v3("uGravity").div(g.mul(.5)).mul(R(1).sub(p))),pe(d,p)})()}(t);case"emissionRate":return function(e){let t=fh(e.registry);return le(()=>{let a=$(),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=va(o,s),h=va(s,o.add(u).sub(1)),m=d.mul(h);return l.assign(Xt(l,t.f("uTime"),m)),pe(m,Xt(n,R(1),m),l,1)})()}(t)}}var yh=class{constructor(){this.nodes=new Map,this.textureNodes=new Map}getUniform(e,t){let a=this.nodes.get(e);return a||(a=N(t),this.nodes.set(e,a)),a}getTexture(e,t){let a=this.textureNodes.get(e);return a||(a=qa(t??new fs),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 fs||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}}})}}}},xh=class{constructor(e,t,a,r){this.name=e,this.kind=t,this.initialTexture=a,this.currentIndex=0,this.registry=new yh,this.depTextureNodes=new Map,this.dependencies=[],this.nodeMaterial=null,this._uniformsStore={};let s=()=>new vs(r,r,{type:as,minFilter:js,magFilter:js,wrapS:Us,wrapT:Us,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()}},vh=new $a,bh=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=qa(new fs)}addVariable(e,t,a){let r=new xh(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,qa(a.currentRenderTarget.texture))}init(){if(!this._copyMaterial){let e=new Ct;e.name="WebGPUComputation.copy",e.fragmentNode=pe(this._copyTextureNode),e.depthTest=!1,e.depthWrite=!1,e.blending=Gs,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 Ct;t.name=`WebGPUComputation.${e.kind}`,t.fragmentNode=_h(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 ds(this.sizeX,this.sizeY)}),t.depthTest=!1,t.depthWrite=!1,t.blending=Gs,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),vh.material=e,vh.render(a),a.setRenderTarget(r),a.setMRT(s)}dispose(){for(let e of this.variables)e.dispose();this._copyMaterial?.dispose()}};function Th(e,t){switch(e){case"linearFadeOut":return R(1).sub(t);case"linearInOut":return t.lessThan(.5).select(t,R(1).sub(t));case"exponentialInOut":return t.lessThan(.4).select(t.div(.4),t.greaterThan(.6).select(R(1).sub(t.sub(.6).div(.4)),R(1)));case"constant":return R(1);default:return t}}function wh(e){return e.dot(ne(12.9898,78.233)).sin().mul(43758.5453).fract()}var Sh=class extends Ct{constructor(e,t){super(),this.easeOpacity="linearFadeIn",this.easeSize="linearFadeIn",this.useSizeEnd=!1,this.isColoringRandom=!1,this._uniformsStore={},this._uPosition=qa(new fs),this._uTexture=qa(new fs),this._uColor=N(new xs(1,1,1,1)),this._uColor2=N(new xs(1,1,1,1)),this._uSize=N(1),this._uSizeEnd=N(1),this._uWorldOffset=N(new ms),this._uWorldQuaternion=N(new xs(0,0,0,1)),this._uRotation=N(0),this._uRotationEnd=N(0),this._center=N(new ds(.5,.5)),this._uRandScaleFactor=N(0),this._uRandRotationFactor=N(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=dt("particleRef","vec2"),t=this._uPosition,a=le(()=>{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=dt("position","vec3"),n=R(1).sub(r),l=this.useSizeEnd?i.mul(de(Xt(this._uSize,this._uSizeEnd,n))):i.mul(de(this._uSize.mul(Th(this.easeSize,n)))),o=xa,u=o.element(0).xyz.length(),d=o.element(1).xyz.length(),h=wh(e).toVar(),m=R(1).sub(this._uRandScaleFactor.mul(h)),c=ne(u,d).mul(m).toVar(),p=2*Math.PI,g=h.mul(this._uRandRotationFactor).mul(p),f=R(1).sub(this._uRotation).mul(p),_=R(1).sub(this._uRotationEnd).mul(p),y=Xt(f.add(g),_.add(g),r).toVar(),x=this._center,v=l.xy.sub(x.sub(ne(.5))).mul(c).toVar(),b=ne(pa(y).mul(v.x).sub(ea(y).mul(v.y)),ea(y).mul(v.x).add(pa(y).mul(v.y))).toVar(),T=ha.mul(pe(s,1)).toVar();return T.xy.addAssign(b),Rt.mul(T)}),r=le(()=>{let a=t.sample(e).w.toVar();a.lessThanEqual(.005).discard();let r=R(1).sub(a),s=this.isColoringRandom?wh(e):r,i=Xt(this._uColor,this._uColor2,s).toVar(),n=Th(this.easeOpacity,r).toVar(),l=this._uTexture.sample($()).toVar();return pe(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 Vh(e,t){return(a,r,s,i)=>{let n=s.mod(t).add(a.add(.5).div(e)).div(t),l=P(s.div(t)).add(r.add(.5).div(e)).div(t);return i.sample(ne(n,l))}}dr({createComputation:(e,t,a,r)=>new bh(e,t,a,r),createMaterial:(e,t)=>new Sh(e,t)});var Mh=[[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 Ch(e){let t=k(e.x.mul(65535).add(.5)),a=t.bitAnd(k(255)).toFloat().mul(.00392156862),r=t.shiftRight(k(8)).bitAnd(k(255)).toFloat().mul(.00392156862);return pe(r,a,e.y,e.z)}function Rh(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=Vh(l,o),d=e.pyramid1Size.width,h=e.pyramid1Size.height,m=e.pyramid2Size.width,c=e.pyramid2Size.height,p=D(Mh.map(([e,t,a])=>new ms(e,t,a)));return s=>{let g=de(0).toVar(),f=de(0,0,1).toVar(),_=pe(0).toVar(),y=s.toVar(),x=P(y.div(3)).toVar(),v=(e,t)=>ne(e.x.add(t).add(.5).div(d),e.y.add(.5).div(h)),b=(e,t)=>ne(e.x.add(t).add(.5).div(m),e.y.add(.5).div(c)),T=d-2,w=m-1,S=ne(0,0).toVar(),V=e.pyramid2.sample(b(S,w)).toVar();return he(x.lessThan(V.x),()=>{let s=R(0).toVar(),d=e=>{let t=V.add(pe(s)).toVar(),a=pe(t.yzw,s),r=pe(pe(x).greaterThanEqual(a)).mul(pe(pe(x).lessThan(t))).toVar();S.mulAssign(2),S.addAssign(ne(0,1).mul(r.x).add(ne(1,1).mul(r.y)).add(ne(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=P(S.x.div(l)).add(P(S.y.div(l)).mul(o)).toVar(),M=y.sub(s.mul(3)).mul(.0625).add(.03125),C=u(h,m,c,e.voxel).toVar().w.add(.5).mul(.00390625),z=e.triTable.sample(ne(M,C)).x.mul(2).toInt().toVar(),k=de(h,m,c).add(p.element(z)).toVar(),A=de(h,m,c).add(p.element(z.add(1))).toVar(),E=u(k.x,k.y,k.z,e.potential).toVar(),N=u(A.x,A.y,A.z,e.potential).toVar(),B=E.x.div(E.x.sub(N.x));_.assign(Xt(Ch(E.yzw),Ch(N.yzw),B)),g.assign(k.add(A.sub(k).mul(B)).sub(de(r)).mul(a));let L=u(k.x,k.y,k.z,e.voxel),I=u(A.x,A.y,A.z,e.voxel);f.assign(or(Xt(L.xyz,I.xyz,B)))}),{position:g,normal:f,color:_}}}function zh(e,t){!0===e.needsPreviousData?.()&&be.assign(t)}var kh=e=>e,Ah=e=>e,Ph=h,Eh=m;function Nh(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}function Bh(e,t,a,r){let s=Wt(e,-1,1),i=e.sub(s).mul(2).add(1),n=Wt(R(.5).add(s.mul(.5).mul(t.sub(s.mul(i).mul(a))).div(r)),0,1);return Xt(t,s.mul(i).mul(a),n).sub(s.mul(r).mul(n).mul(R(1).sub(n)))}function Lh(e,t,a,r,s){let i=R(0).toVar(),n=a.y,l=a.z,o=a.w,u=he(e.lessThan(.5),()=>{i.assign(it(t).sub(n))}).ElseIf(e.lessThan(1.5),()=>{let e=de(n,l,o),a=it(t.div(e)),r=it(t.div(e.mul(e)));i.assign(a.mul(a.sub(1)).div(r))}).ElseIf(e.lessThan(2.5),()=>{let e=de(n,l,o),a=Be(t).sub(e).toVar();i.assign(it(It(a,de(0))).add(Ht(It(a.x,It(a.y,a.z)),0)))}).ElseIf(e.lessThan(3.5),()=>{let e=Be(ne(it(t.xz),t.y)).sub(ne(l,n)).toVar();i.assign(Ht(It(e.x,e.y),0).add(it(It(e,ne(0)))))}).ElseIf(e.lessThan(4.5),()=>{let e=n,a=l,r=o,s=ne(it(t.xz),t.y).toVar(),u=ne(r,e),d=ne(r.sub(a),e.mul(2)),h=ne(s.x.sub(Ht(s.x,s.y.lessThan(0).select(a,r))),Be(s.y).sub(e)).toVar(),m=s.sub(u).add(d.mul(Wt(Ha(u.sub(s),d).div(Ha(d,d)),0,1))).toVar(),c=m.x.lessThan(0).and(h.y.lessThan(0)).select(R(-1),R(1));i.assign(c.mul(fa(Ht(Ha(h,h),Ha(m,m)))))}).ElseIf(e.lessThan(5.5),()=>{let e=ne(it(t.xy).sub(n),t.z);i.assign(it(e).sub(l))}),d=()=>{let e=Be(t.x).toVar(),a=ne(n,l),s=o,u=r.w,d=a.y.mul(e).greaterThan(a.x.mul(t.y)).select(Ha(ne(e,t.y),a),it(ne(e,t.y))),h=de(e,t.y,t.z);i.assign(fa(Ha(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 Ih(e,t=!0){let a=e.spatialDivisions,r=e.spatialn;return(s,i)=>{let n=t?pe(0).toVar():pe(0),l=R(1e3).toVar(),o=t?R(0).toVar():R(0),u=t?R(0).toVar():R(0),d=i.y.add(i.z.mul(a)).add(.5).div(a*a),h=(a,r)=>{let i=r.toVar();ge(Ph,({i:r})=>{he(i.lessThan(1),()=>{J()}),i.mulAssign(.5),he(U(i).greaterThanEqual(.5),()=>{let i=R(r).add(a).add(.5).mul(1/Eh),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=Nh(h,s.sub(d.xyz)).div(c.z).toVar(),g=Lh(m.x,p,m,c,e.meshSdf).sub(c.y).mul(c.z).toVar(),f=c.x.toVar(),_=d.w;if(l.assign(Bh(_,l,g,f)),t){let t=va(-1.5,_).mul(va(_,-.5)),a=sa(u,0,g.negate()),r=Xt(R(1),a,t);n.mulAssign(r),o.mulAssign(r),u.assign(It(u,f)),f.addAssign(e.colorKBump);let s=e.shapeRow(i,4).toVar(),l=sa(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*Ph).toVar(),n=e.spatialTex.sample(ne(i.x.mul(r).add(t).add(.5).div(r*a),d)).toVar();h(s,n.x),h(s.add(Ph),n.y),h(s.add(2*Ph),n.z),h(s.add(3*Ph),n.w)};return 1===r?m(R(0)):ge(r,({i:e})=>{m(R(e).toVar())}),t&&n.divAssign(o),{sdf:Xt(l,R(0),va(1e20,l)).toVar(),color:n,colorDivisor:o}}}var Dh=[4,4,4],Fh=(e,t)=>Ge(e,t);function Uh(e){let t=e.resolution,a=t-1,r=e.colorResolution,s=e.capacity,i=t/4,n=i-1,l=N(e.bboxHalf),o=N(e.bboxOffset),u=N(1e30),d=N(new ms(0,0,0)),h=N(new ms(i,i,i)),m=e.env.spatialDivisions,c=R(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 X(e,t,a);return s.format=bs,s.type=as,s.minFilter=js,s.magFilter=js,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=bs,T.type=as,T.minFilter=js,T.magFilter=js;let w=e.reuseTextures?.colorTexture??new X(r,r,r);w.name="SplineShapeBlend.ultraColor";let S=e.reuseTextures?.coarseTexture??new X(i,i,i);S.format=bs,S.type=as,S.minFilter=js,S.magFilter=js,S.name="SplineShapeBlend.ultraCoarse";let V=ve(8,"uint").toAtomic(),M=(e=0)=>V.element(e),C=p?ve(_?12:4,"int").toAtomic():null,z=e=>C.element(e),A=p?ve(Math.max(g,1),"float"):null,E=i*i*i,B=p?ve(E*(_?4:1),"float"):null,L=e=>Pe(e.x.add(e.y.mul(i)).add(e.z.mul(i*i))),I=e=>B.element(L(e)),F=e=>B.element(L(e).add(Pe(E))),U=e=>B.element(L(e).add(Pe(2*E))),O=e=>B.element(L(e).add(Pe(3*E))),G=e=>B.element(e.add(Pe(3*E))),q=p?ve(Math.max(g,1),"float"):null,W=_?ve(3*Math.max(x,1),"float"):null,H=e=>W.element(e),j=e=>H(Pe(e)),K=e=>H(Pe(e.add(x))),$=e=>H(e.add(Pe(2*x))),Q=_?ve(Math.max(v,1),"float"):null,Z=e=>Q.element(e),Y=_?ve(24*Math.max(x,1),"uint"):null,ee=e=>Y.element(e),te=_?N(0):null,ae=_?N(new Ss):null,re=_?N(2):null,se=D(Array.from(e.numTrisTable)),ie=D(Mh.map(([e,t,a])=>new ms(e,t,a))),ue=Ih(e.env,!1),me=Ih(e.env),ce=(e,t)=>e.div(t).mul(2).sub(1),_e=(e,t)=>e.div(t).mul(m-1).floor(),ye=le(()=>{for(let e=0;e<8;e++)st(M(e),k(0))})(),xe=le(()=>{he(Pe(fe).greaterThanEqual(Pe(s)),()=>{Ae()}),e.buffers.positions.element(Pe(fe)).assign(pe(0))})(),be=_?le(()=>{he(Pe(fe).greaterThanEqual(Pe(s)),()=>{Ae()}),y.element(Pe(fe)).assign(k(c))})():null,Te=Ka(S),we=e=>Te.load(at(Wt(e,de(0),de(n)))).x,Se=e=>I(Wt(e,de(0),de(n))),Ve=(e,t)=>{let a=It(e,0),r=P(a.div(4096)),s=a.sub(r.mul(4096)),i=P(s.div(64)),n=s.sub(i.mul(64));return de(n,i,r).mul(4).add(t)},Me=le(()=>{let t=de(oe).add(d).toVar();he(t.x.greaterThan(n).or(t.y.greaterThan(n)).or(t.z.greaterThan(n)),()=>{Ae()});let r=t.mul(4).add(de(1.5)),s=(t=>{let a=R(1e3).toVar();return ge(Eh,({i:r})=>{he(R(r).greaterThanEqual(e.npart),()=>{J()});let s=R(r).add(.5).mul(1/Eh),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=Nh(n,t.sub(i.xyz)).div(o.z).toVar(),d=Lh(l.x,u,l,o,e.env.meshSdf).sub(o.y).mul(o.z).toVar();a.assign(Bh(i.w,a,d,o.x))}),a})(ce(r,a));Ra(S,at(t),pe(s.add(c),0,0,0)).toStack()})(),Ce=e=>{he(e.x.greaterThan(n).or(e.y.greaterThan(n)).or(e.z.greaterThan(n)),()=>{Ae()})},Re=p?le(()=>{let e=de(oe).toVar();Ce(e),I(e).assign(R(-1).add(c)),_&&(F(e).assign(R(-1).add(c)),U(e).assign(R(-1).add(c)))})():null,ze=p?le(()=>{let e=de(oe).add(d).toVar();Ce(e);let t=we(e).toVar(),a=Se(e).toVar();he(Be(t).greaterThan(u).and(a.greaterThan(-.5)),()=>{let t=Ye(z(1),Pe(1)).toVar();A.element(t).assign(a),I(e).assign(R(-1).add(c))})})():null,ke=p?le(()=>{let e=de(oe).add(d).toVar();Ce(e);let t=we(e).toVar(),a=Se(e).toVar();he(Be(t).lessThanEqual(u).and(a.lessThan(-.5)),()=>{let t=R(-1).toVar(),a=lt(z(1),Pe(1)).toVar();he(a.greaterThanEqual(1),()=>{t.assign(A.element(a.sub(1)))}).Else(()=>{Ye(z(1),Pe(1));let e=Ye(z(0),Pe(1)).toVar();he(e.lessThan(Pe(g)),()=>{t.assign(e.toFloat())}).Else(()=>{st(z(2),Pe(1))})}),he(t.greaterThan(-.5),()=>{q.element(Pe(t)).assign((e=>e.x.add(e.y.mul(256)).add(e.z.mul(65536)))(e)),I(e).assign(t.add(c))})})})():null,Ee=p?le(()=>{let e=tt(z(0)).toVar(),t=tt(z(2)).toVar();if(st(M(1),k(e)),st(M(2),k(t)),st(z(2),Pe(0)),_){let e=tt(z(3)).toVar(),t=tt(z(5)).toVar();st(M(4),k(e)),st(M(5),k(t)),st(z(5),Pe(0));let a=tt(z(6)).toVar(),r=tt(z(8)).toVar();st(M(6),k(a)),st(M(7),k(r)),st(z(8),Pe(0))}})():null,Ne=_?le(()=>{let e=de(oe).toVar();he(e.x.greaterThanEqual(h.x).or(e.y.greaterThanEqual(h.y)).or(e.z.greaterThanEqual(h.z)),()=>{Ae()});let t=e.add(d).toVar();Ce(t);let a=U(t).toVar();he(a.greaterThan(-.5),()=>{let e=Ye(z(7),Pe(1)).toVar();Z(e).assign(a),U(t).assign(R(-1).add(c))});let r=F(t).toVar();he(r.lessThan(-.5),()=>{Ae()}),F(t).assign(R(-1).add(c)),ge(48,()=>{he(r.lessThan(-.5),()=>{J()});let e=Ye(z(4),Pe(1)).toVar();$(e).assign(r),r.assign(j(r))})})():null,Le=_?le(()=>{let e=de(oe).add(d).toVar();Ce(e);let t=R(0).toVar();he(Se(e).greaterThan(-.5),()=>{let a=e.mul(4).toVar(),r=Je.map(([e,t,r])=>He(de(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=or(s).toVar(),n=Ha(r[0],i);for(let e=1;e<8;e++)n=Ht(n,Ha(r[e],i));he(n.greaterThan(re),()=>{t.assign(R(1))})}),O(e).assign(t.add(c))})():null,Ie=Math.min(4096,Math.max(g,1)),De=()=>{let e=de(oe).toVar(),t=P(e.x.mul(.25)).toVar(),a=P(e.y.mul(.25)).toVar();return{slot:a.mul(Ie).add(t).toVar(),local:de(e.x.sub(t.mul(4)),e.y.sub(a.mul(4)),e.z).toVar()}},Fe=e=>(e=>{let t=P(e.div(65536)),a=e.sub(t.mul(65536)),r=P(a.div(256)),s=a.sub(r.mul(256));return de(s,r,t)})(q.element(Pe(e))),Ue=p?le(()=>{let e=de(oe).add(d.mul(4)).toVar(),t=e.mul(.25).floor().toVar(),r=Se(t).toVar();he(r.lessThan(-.5),()=>{Ae()});let{sdf:s}=ue(ce(e,a),_e(e,a));Ra(T,at(Ve(r,e.sub(t.mul(4)))),pe(s.add(c),0,0,0)).toStack()})():null,Oe=p?le(()=>{let{slot:e,local:t}=De();he(e.greaterThanEqual(g),()=>{Ae()});let r=Fe(e).toVar();he(Se(r).notEqual(e),()=>{Ae()});let s=r.mul(4).add(t).toVar(),{sdf:i}=ue(ce(s,a),_e(s,a));Ra(T,at(Ve(e,t)),pe(i.add(c),0,0,0)).toStack()})():le(()=>{let e=de(oe).add(d.mul(4)).toVar(),t=we(e.mul(.25).floor()).toVar();he(Be(t).greaterThan(u),()=>{Ra(T,at(e),pe(t.add(c),0,0,0)).toStack(),Ae()});let{sdf:r}=ue(ce(e,a),_e(e,a));Ra(T,at(e),pe(r.add(c),0,0,0)).toStack()})(),Ge=le(()=>{let e=de(oe).add(d.mul(2)).toVar();he(e.x.greaterThan(r-1).or(e.y.greaterThan(r-1)).or(e.z.greaterThan(r-1)),()=>{Ae()}),he(Be(we(e.mul(.5).floor())).greaterThan(u),()=>{Ae()});let{color:t,colorDivisor:a}=me(ce(e,r-1),_e(e,r-1)),s=a.greaterThan(0).select(t,pe(0));Ra(w,at(e),Wt(s.add(c),pe(0),pe(1))).toStack()})(),qe=Ka(T),We=p?(e,t,r)=>{let s=Wt(de(e,t,r),de(0),de(a)),i=s.mul(.25).floor(),n=Se(i),l=qe.load(at(Ve(n,s.sub(i.mul(4))))).x;return n.lessThan(-.5).select(we(i),l)}:(e,t,r)=>qe.load(at(Wt(de(e,t,r),de(0),de(a)))).x,He=e=>{let t=e.x,a=e.y,r=e.z,s=We(t.add(1),a,r).sub(We(t.sub(1),a,r)),i=We(t,a.add(1),r).sub(We(t,a.sub(1),r)),n=We(t,a,r.add(1)).sub(We(t,a,r.sub(1)));return s.equal(0).and(i.equal(0)).and(n.equal(0)).select(de(.199,.299,.399),or(de(s,i,n)))},Ke=(t,r,i)=>{let n=((e,t,a)=>{let r=(r,s,i,n)=>We(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=se.element(Pe(n)).toVar();he(u.lessThan(.5),()=>{Ae()});let d=Ye(M(),k(u)).toVar();he(R(d).add(u).mul(3).lessThanEqual(s),()=>{let s=n.add(.5).mul(.00390625);ge(5,({i:n})=>{he(R(n).greaterThanEqual(u),()=>{J()});let h=R(n).toVar();ge(3,({i:n})=>{let u=R(n).toVar();((t,r,s,i,n,u)=>{let d=n.mul(.0625).add(.03125),h=e.triTable.sample(ne(d,i)).x.mul(2).toInt().toVar(),m=de(t,r,s).add(ie.element(h)).toVar(),c=de(t,r,s).add(ie.element(h.add(1))).toVar(),p=We(m.x,m.y,m.z).toVar(),g=We(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(de(o)),x=or(Xt(He(m),He(c),f)),v=_.add(1).mul(.5),b=Ka(w,v,Pe(0)),T=u.toVar();e.buffers.positions.element(T).assign(pe(y,1)),e.buffers.normals.element(T).assign(pe(x,0)),e.buffers.colors.element(T).assign(b)})(t,r,i,s,h.mul(3).add(u),Pe(d).add(Pe(h)).mul(3).add(Pe(u)))})})})},$e=p?le(()=>{let{slot:e,local:t}=De();he(e.greaterThanEqual(g),()=>{Ae()});let r=Fe(e).toVar();he(Se(r).notEqual(e),()=>{Ae()});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();he(s.greaterThanEqual(a).or(i.greaterThanEqual(a)).or(n.greaterThanEqual(a)),()=>{Ae()}),Ke(s,i,n)})():le(()=>{let e=de(oe).x.toVar(),t=de(oe).y.toVar(),r=de(oe).z.toVar();he(e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a)),()=>{Ae()}),he(Be(we(de(e,t,r).mul(.25).floor())).greaterThan(u),()=>{Ae()}),Ke(e,t,r)})(),Qe=()=>{let e=de(Xe).toVar(),t=e.y.mul(Ie).add(e.x).toVar(),a=de(0).toVar(),r=R(0).toVar();return he(t.lessThan(g),()=>{a.assign(Fe(t)),he(Se(a).equal(t),()=>{r.assign(R(1))})}),{brick:a,valid:r}},Ze=()=>{let e=de(Xe).add(d).toVar(),t=R(0).toVar();return he(e.x.lessThanEqual(n).and(e.y.lessThanEqual(n)).and(e.z.lessThanEqual(n)),()=>{he(Se(e).greaterThan(-.5),()=>{t.assign(R(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]],et=[[0,1],[2,3],[4,5],[6,7],[0,2],[1,3],[4,6],[5,7],[0,4],[1,5],[2,6],[3,7]],rt=t=>le(()=>{let r=Fh("float",64),s=Fh("float",1),i=de(pt).toVar(),n=Pe(i.x.add(i.y.mul(4)).add(i.z.mul(16))).toVar(),{brick:u,valid:d}=t(),h=O(u).toVar(),m=R(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])=>We(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=R(0).toVar();he(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(R(1))}),r.element(n).assign(S.add(c)),je(),he(n.equal(Pe(0)).and(d.greaterThan(.5)),()=>{let e=R(0).toVar();ge(64,({i:t})=>{e.addAssign(r.element(t))});let t=R(-1).toVar();he(e.greaterThan(.5),()=>{let e=lt(z(7),Pe(1)).toVar();he(e.greaterThanEqual(1),()=>{t.assign(Z(e.sub(1)))}).Else(()=>{Ye(z(7),Pe(1));let e=Ye(z(6),Pe(1)).toVar();he(e.lessThan(Pe(v)),()=>{t.assign(e.toFloat())}).Else(()=>{st(z(8),Pe(1))})}),he(t.greaterThan(-.5),()=>{U(u).assign(t.add(c))})}),s.element(Pe(0)).assign(t)}),je();let V=s.element(Pe(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)));he(M.and(V.greaterThan(-.5)),()=>{let t=de(0).toVar(),r=R(0).toVar();for(let[e,a]of et)he(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(de(i,n,l).add(de(o-i,u-n,d-l).mul(s)).mul(m)),r.addAssign(1)});let s=t.div(It(r,1)).toVar();he(r.lessThan(.5),()=>{s.assign(de(m.mul(.5)))});let u=de(f,_,y).add(s).toVar().div(a).mul(2).sub(1).toVar(),d=u.mul(l).add(de(o)),h=de(0).toVar(),c=s.div(m).toVar();for(let e=0;e<8;e++){let[t,a,r]=Je[e],s=t?kh(c.x):R(1).sub(kh(c.x)),i=a?kh(c.y):R(1).sub(kh(c.y)),n=r?kh(c.z):R(1).sub(kh(c.z));h.addAssign(He(Ah(de(f.add(m.mul(t)),_.add(m.mul(a)),y.add(m.mul(r))))).mul(s.mul(i).mul(n)))}let g=or(h),v=u.add(1).mul(.5),b=Ka(w,v,Pe(0)),T=Pe(p.select(i.x.add(i.y.mul(2)).add(i.z.mul(4)),R(n))).toVar(),S=Pe(V.mul(64)).add(T).toVar();e.buffers.positions.element(S).assign(pe(d,1)),e.buffers.normals.element(S).assign(pe(g,0)),e.buffers.colors.element(S).assign(b)})})(),it=_?rt(Qe):null,nt=_?rt(Ze):null,ot=e=>le(()=>{let t=Fh("float",64),r=Fh("float",64),s=Fh("float",48),n=de(pt).toVar(),l=Pe(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=We(d,h,m).lessThan(0).toFloat().toVar(),g=(e,t,a)=>G(Pe(P(e.mul(.25))).add(Pe(P(t.mul(.25))).mul(i)).add(Pe(P(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=R(0).toVar(),v=R(0).toVar(),b=R(0).toVar(),T=R(1).toVar(),w=R(1).toVar(),S=R(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=We(d.add(r),h.add(s),m.add(i)).lessThan(0).toFloat(),v=We(d.add(2*r),h.add(2*s),m.add(2*i)).lessThan(0).toFloat();he(u.greaterThan(.5).and(y.not()).and(o.add(1).lessThanEqual(a)).and(_(n,R(1))).and(_(l,R(1))).and(p.notEqual(x)),()=>{e.assign(R(1)),t.assign(R(1))}),he(u.greaterThan(.5).and(y).and(f(d)).and(f(h)).and(f(m)).and(o.add(2).lessThanEqual(a)).and(_(n,R(2))).and(_(l,R(2))).and(p.notEqual(v)),()=>{e.assign(R(1)),t.assign(R(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 C=y.add(v).add(b).mul(2).toVar();t.element(l).assign(C.add(c)),je(),he(l.equal(Pe(0)).and(u.greaterThan(.5)),()=>{let e=R(0).toVar();ge(64,({i:a})=>{r.element(a).assign(e),e.addAssign(t.element(a))}),Ye(M(0),k(e));let a=P(e.add(7).mul(1/8)).toVar(),i=R(-1).toVar(),n=R(-1).toVar();ge(48,({i:t})=>{he(R(t).greaterThanEqual(a),()=>{J()});let r=R(t).toVar(),l=R(-1).toVar(),o=lt(z(4),Pe(1)).toVar();he(o.greaterThanEqual(1),()=>{l.assign($(o.sub(1)))}).Else(()=>{Ye(z(4),Pe(1));let e=Ye(z(3),Pe(1)).toVar();he(e.lessThan(Pe(x)),()=>{l.assign(e.toFloat())}).Else(()=>{st(z(5),Pe(1))})}),s.element(Pe(r)).assign(l),he(l.greaterThan(-.5),()=>{K(l).assign(Ht(e.sub(r.mul(8)),8)),j(l).assign(R(-1)),he(n.greaterThan(-.5),()=>{j(n).assign(l)}).Else(()=>{i.assign(l)}),n.assign(l)})}),F(o).assign(i)}),je(),he(C.greaterThan(.5),()=>{let e=(e,t,a)=>{let r=P(e.mul(.25)),s=P(t.mul(.25)),n=P(a.mul(.25)),l=Pe(r).add(Pe(s).mul(i)).add(Pe(n).mul(i*i)),o=Pe(e.sub(r.mul(4))).add(Pe(t.sub(s.mul(4))).mul(4)).add(Pe(a.sub(n.mul(4))).mul(16));return k(l.mul(64).add(o))},t=r.element(l).toVar(),a=(e,a,r)=>{let i=s.element(Pe(P(t.mul(1/8)))).toVar();he(i.greaterThan(-.5),()=>{let s=t.sub(P(t.mul(1/8)).mul(8)),n=Pe(i.mul(24).add(s.mul(3))).toVar();ee(n).assign(e),ee(n.add(Pe(1))).assign(a),ee(n.add(Pe(2))).assign(r)}),t.addAssign(1)},n=(t,r)=>{he(t.greaterThan(.5),()=>{let t=e(...r[0]).toVar(),s=e(...r[1]).toVar(),i=e(...r[2]).toVar(),n=e(...r[3]).toVar();he(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]])})})(),ut=_?ot(Qe):null,dt=_?ot(Ze):null,ht=_?le(()=>{let e=Fh("float",48),t=Fh("float",2),r=de(pt).toVar(),s=Pe(r.x.add(r.y.mul(4)).add(r.z.mul(16))).toVar(),i=de(Xe).toVar(),n=i.y.mul(Ie).add(i.x).toVar();he(s.equal(Pe(0)),()=>{let r=R(0).toVar();he(n.lessThan(g),()=>{let t=Fe(n).toVar();he(Se(t).equal(n),()=>{let s=R(0).toVar();he(te.greaterThan(.5),()=>{let e=de(0).toVar(),r=de(0).toVar();for(let s=0;s<8;s++){let i=Ah(t.mul(4).add(de(4*(1&s),4*(s>>1&1),4*(s>>2&1)))),n=Ah(i.div(a).mul(2).sub(1)).mul(l).add(de(o)),u=ae.mul(pe(n,1)).toVar(),d=kh(u.w);e.addAssign(de(kh(u.x).lessThan(d.negate()).toFloat(),kh(u.y).lessThan(d.negate()).toFloat(),kh(u.z).lessThan(0).toFloat())),r.addAssign(de(kh(u.x).greaterThan(d).toFloat(),kh(u.y).greaterThan(d).toFloat(),kh(u.z).greaterThan(d).toFloat()))}he(It(It(e.x,It(e.y,e.z)),It(r.x,It(r.y,r.z))).greaterThan(7.5),()=>{s.assign(R(1))})}),he(s.lessThan(.5),()=>{let a=F(t).toVar();ge(48,({i:t})=>{he(a.lessThan(-.5),()=>{J()}),e.element(t).assign(a),r.addAssign(K(a)),a.assign(j(a))})})})});let s=R(0).toVar();he(r.greaterThan(.5),()=>{let e=Ye(M(3),k(r.mul(3))).toVar();s.assign(R(e))}),t.element(Pe(0)).assign(s.add(c)),t.element(Pe(1)).assign(r)}),je();let u=t.element(Pe(1)).toVar(),d=t.element(Pe(0)).toVar(),h=R(s).toVar();ge(6,()=>{he(h.greaterThanEqual(u),()=>{J()});let t=e.element(Pe(P(h.mul(1/8)))).toVar(),a=h.sub(P(h.mul(1/8)).mul(8)),r=Pe(t.mul(24).add(a.mul(3))).toVar(),s=Pe(d.add(h.mul(3))).toVar(),i=e=>{let t=ee(0===e?r:r.add(Pe(e))).toVar(),a=Pe(t.shiftRight(k(6))).toVar(),s=Pe(t.bitAnd(k(63))).toVar(),i=(e=>B.element(e.add(Pe(2*E))))(a).toVar(),n=G(a),l=s.bitAnd(Pe(3)),o=s.shiftRight(Pe(2)).bitAnd(Pe(3)),u=s.shiftRight(Pe(4)).bitAnd(Pe(3)),d=l.shiftRight(Pe(1)).add(o.shiftRight(Pe(1)).mul(Pe(2))).add(u.shiftRight(Pe(1)).mul(Pe(4)));return{blockF:i,li:Pe(n.greaterThan(.5).select(d,s)).toVar()}},n=i(0),l=i(1),o=i(2);he(n.blockF.greaterThan(-.5).and(l.blockF.greaterThan(-.5)).and(o.blockF.greaterThan(-.5)),()=>{let e=e=>k(Pe(e.blockF.mul(64)).add(e.li));y.element(s).assign(e(n)),y.element(s.add(Pe(1))).assign(e(l)),y.element(s.add(Pe(2))).assign(e(o))}).Else(()=>{y.element(s).assign(k(0)),y.element(s.add(Pe(1))).assign(k(0)),y.element(s.add(Pe(2))).assign(k(0))}),h.addAssign(64)})})():null,mt=Math.ceil(t/Dh[0]),ct=Math.ceil(r/Dh[0]),gt=Math.ceil(i/Dh[0]),ft=(e,t)=>e.compute(t,Array.isArray(t)?Dh:void 0),_t=[Ie,Math.max(1,Math.ceil(g/Ie)),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,C,A,B,q,W,Q,Y].filter(e=>null!==e).map(e=>e.value),uniforms:{bboxHalf:l,bboxOffset:o,activeThreshold:u,windowOrigin:d,..._?{windowSize:h,cullEnabled:te,cullMVP:ae,adaptCos:re}:{}},kernels:{zero:ft(ye,1),clear:xe.compute([Math.ceil(s/256),1,1],[256,1,1]),coarse:ft(Me,[gt,gt,gt]),...Re?{init:ft(Re,[gt,gt,gt])}:{},...ze?{release:ft(ze,[gt,gt,gt])}:{},...ke?{alloc:ft(ke,[gt,gt,gt])}:{},...Ee?{stats:ft(Ee,1)}:{},sdf:ft(Oe,p?_t:[mt,mt,mt]),...Ue?{sdfWindow:ft(Ue,[mt,mt,mt])}:{},color:ft(Ge,[ct,ct,ct]),extract:_?ft(ut,_t):ft($e,p?_t:[mt,mt,mt]),..._?{clearDraw:be.compute([Math.ceil(s/256),1,1],[256,1,1]),meshRelease:ft(Ne,[gt,gt,gt]),verts:ft(it,_t),vertsWindow:ft(nt,[i,i,i]),extractWindow:ft(dt,[i,i,i]),classify:ft(Le,[gt,gt,gt]),gather:ft(ht,_t)}:{}}}}var Oh=24576;function Gh(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/Oh));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 ms(0,0,0),o=new ms,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 qh(e){let t=Ka(e);return(e,a,r)=>{let s=It(de(a.z,a.w,r.w),de(1e-5)).toVar(),i=a.y,n=de(i.mod(4).mul(48),P(i.div(4)).mul(48),0).toVar(),l=Wt(e.div(s).mul(.5).add(.5),de(0),de(1)).mul(47).toVar(),o=Ht(P(l),de(46)).toVar(),u=l.sub(o).toVar(),d=n.add(o).toVar(),h=(e,a,r)=>t.load(at(d.add(de(e,a,r)))).x,m=u.x,c=u.y,p=u.z,g=Xt(h(0,0,0),h(1,0,0),m),f=Xt(h(0,1,0),h(1,1,0),m),_=Xt(h(0,0,1),h(1,0,1),m),y=Xt(h(0,1,1),h(1,1,1),m),x=Xt(Xt(g,f,c),Xt(_,y,c),p),v=It(s.x,It(s.y,s.z)),b=Be(e).sub(s),T=it(It(b,de(0)));return x.mul(v).add(T)}}function Wh(e){return new ms(e%4*48,48*Math.floor(e/4),0)}var Hh=e=>e,jh=e=>e,Kh=new $a,$h=qa(new fs),Xh=N(1),Qh=N(1),Zh=N(0),Yh=N(0),Jh=N(1),em=null;function tm(){if(null!==em)return em;let e=le(()=>{let e=ne(Xh,Qh),t=ne(1).div(e),a=$().mul(Jh).sub(ne(.5)).mul(2).add(ne(.5)).toVar();a.x.addAssign(Zh);let r=a.div(e).toVar(),s=$h.sample(r).x.toVar();r.x.addAssign(t.x);let i=$h.sample(r).x.toVar();r.y.addAssign(t.y);let n=$h.sample(r).x.toVar();r.x.subAssign(t.x);let l=$h.sample(r).x.toVar(),o=s,u=o.add(i),d=u.add(n),h=d.add(l);return pe(h,d,u,o)})(),t=new Ct;return t.name="SplineShapeBlend.pyramid",t.fragmentNode=e,t.depthTest=!1,t.depthWrite=!1,t.blending=Gs,t.needsUpdate=!0,em=t,t}var am=!1,rm=!1,sm="",im=!1,nm=!1,lm=!1,om=!1,um=!1,dm=!1,hm=!1,mm=!1,cm=!1;try{let e=new URLSearchParams(window.location.search);am="vertex"===e.get("dbgsbmarch"),rm="0"===e.get("dbgsbultra"),sm=e.get("dbgsbchain")??"",im="1"===e.get("dbgsbnoclear"),nm="0"===e.get("dbgsbsparse"),lm="0"===e.get("dbgsbincr"),om="1"===e.get("dbgsblod"),um="1"===e.get("dbgsbpool"),dm="0"===e.get("dbgsbpool"),hm="0"===e.get("dbgsbmesh"),mm="0"===e.get("dbgsbadapt"),cm="1"===e.get("dbgsbcull")}catch{}var pm={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},gm=24576,fm=Math.cos(8*Math.PI/180);function _m(e,t,a=1){return new vs(e,t,{count:a,format:_s,type:as,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:js,magFilter:js,wrapS:Us,wrapT:Us})}var ym=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 Ss,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=qa(new fs),this.spatialTexNode=qa(new fs),this.potentialTexNode=qa(new fs),this.voxelTexNode=qa(new fs),this.pyramid1TexNode=qa(new fs),this.pyramid2TexNode=qa(new fs),this.npartUniform=N(0),this.spatialnUniform=N(1),this.spanUniform=N(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 Ks(r.triTable,16,256,bs,as);i.needsUpdate=!0;let n=new Ks(r.numTrisTable,256,1,bs,as);n.needsUpdate=!0,this.triTableTexNode=qa(i),this.numTrisTableTexNode=qa(n)}shapeRow(e,t){return this.shapesTex.sample(ne(e,(t+.5)/5))}_quadMaterial(e,t){let a=new Ct;return a.name=e,a.fragmentNode=t,a.depthTest=!1,a.depthWrite=!1,a.blending=Gs,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=le(()=>{let e=ne(t*l,t**2),o=P($().mul(e)).toVar(),u=o.y.toVar(),d=u.sub(P(u.div(t)).mul(t)).toVar();u.assign(P(u.div(t)));let h=u,m=o.x.toVar(),c=m.sub(P(m.div(i)).mul(i)).toVar().mul(4*a).toVar();m.assign(P(m.div(i)));let p=de(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=R(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=jh(l.xyz),u=Hh(l.w);t.mulAssign(2);let d=Hh(g.x).lessThan(Hh(o.x)).and(Hh(o.x).lessThan(Hh(f.x))).and(Hh(g.y).lessThan(Hh(o.y))).and(Hh(o.y).lessThan(Hh(f.y))).and(Hh(g.z).lessThan(Hh(o.z))).and(Hh(o.z).lessThan(Hh(f.z))).and(a.lessThan(Hh(s))).or(u.equal(-2));t.addAssign(d.select(R(1),R(0)))}return t};return pe(_(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?qh(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=Ih(this._fieldEnv(e,2*s)),o=le(()=>{let e=P($().mul(ne(n,n))).toVar(),o=e.x.mod(a),u=e.y.mod(a),d=P(e.x.mul(s)).add(P(e.y.mul(s)).mul(i)),h=de(o,u,d),m=h.div(r).mul(2).sub(1).toVar(),c=P(h.div(r).mul(t-1)).toVar(),{sdf:p,color:g}=l(m,c),f=k(g.x.mul(255)),_=k(g.y.mul(255)),y=f.shiftLeft(k(8)).bitOr(_);return pe(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=Vh(t,s),l=this.potentialTexNode,o=()=>{let e=P($().mul(ne(i,i))).toVar();return{xi:e.x.mod(t).toVar(),yi:e.y.mod(t).toVar(),zi:P(e.x.mul(r)).add(P(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=le(()=>{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(de(.199,.299,.399),or(de(r,s,i)))})(e,t,r).toVar(),i=pe(s,0).toVar(),d=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return he(d.not(),()=>{i.assign(pe(s,u(e,t,r)))}),i})(),h=le(()=>{let{xi:e,yi:t,zi:r}=o(),s=pe(0).toVar(),i=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return he(i.not(),()=>{let a=u(e,t,r);s.assign(this.numTrisTableTexNode.sample(ne(a.add(.5).div(256),.5)))}),s})();return this._quadMaterial("SplineShapeBlend.voxel",Ca({output:d,numTris:h}))}_spatialTargetFor(e){let t=e.resolutionLevel,a=this.spatialTargets[t];return a||(a=_m(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=_m(e.basePyramidSize,e.basePyramidSize),this.potentialTargets[t]=r);let s=this.voxelTargets[t];s||(s=_m(e.basePyramidSize,e.basePyramidSize,2),s.textures[0].name="output",s.textures[1].name="numTris",s.textures[1].format=bs,this.voxelTargets[t]=s);let i=this.pyramidTargets[t];return i||(i=[_m(e.pyramidTexture1Width,e.pyramidTexture1Height),_m(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,gm),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:ve(a,"vec4"),normals:ve(a,"vec4"),colors:ve(a,"vec4")},this._marchCapacity=a,this._computeNode=null,!0}update(e,t,a){if(pm.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 X(192,48*Math.ceil(4),48);a.format=bs,a.type=as,a.minFilter=js,a.magFilter=js,a.name="SplineShapeBlend.meshSdfAtlas";let r=R(t).mul(0),s=N(new ms(0,0,0)),i=N(0),n=N(new ms(1,1,1)),l=ve(3*Oh,"vec4"),o=e=>l.element(e),u=le(()=>{let e=de(oe).toVar();he(e.x.greaterThanEqual(48).or(e.y.greaterThanEqual(48)).or(e.z.greaterThanEqual(48)),()=>{Ae()});let t=e.div(47).mul(2).sub(1).mul(n).toVar(),l=R(1e30).toVar(),u=R(1e15).toVar();ge(Oh,({i:e})=>{he(R(e).greaterThanEqual(i),()=>{J()});let a=Pe(R(e).toVar()).mul(3).toVar(),r=o(a).xyz.toVar(),s=o(a.add(Pe(1))).xyz.toVar(),n=o(a.add(Pe(2))).xyz.toVar(),d=s.sub(r).toVar(),h=n.sub(r).toVar(),m=t.sub(r).toVar(),c=Ha(d,m).toVar(),p=Ha(h,m).toVar(),g=t.sub(s).toVar(),f=Ha(d,g).toVar(),_=Ha(h,g).toVar(),y=t.sub(n).toVar(),x=Ha(d,y).toVar(),v=Ha(h,y).toVar(),b=de(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();he(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=R(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=Ha(V,V).toVar();he(M.lessThan(l),()=>{l.assign(M);let e=ya(d,h),t=Ha(V,e).greaterThanEqual(0).select(R(1),R(-1));u.assign(fa(M).mul(t))})});let d=It(n.x,It(n.y,n.z));Ra(a,at(e.add(s)),pe(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=!am&&i,l=n&&!rm&&e.ultraFieldResolution>0,o=l&&!dm&&(um||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&&!hm,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,gm),Math.max(e.geometry.drawRange.count,this.capacityHint,l?Math.max(function(e){return Math.max(gm,192*Math.ceil(16*e*e/192))}(e.ultraFieldResolution),this._ultraWantedCapacity):gm)),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=ve(this._marchCapacity,"uint")),u&&null===this._vertexBuffers&&(this._vertexBuffers={positions:ve(64*h,"vec4"),normals:ve(64*h,"vec4"),colors:ve(64*h,"vec4")}),this._ultra=Uh({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=om&&t>=128&&!u?t/2:0;r&&(!i||0===l)&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),l>0&&(this._ultraDrag=Uh({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={}),sm.includes("nomat")||(i.defines.SHAPEBLEND=e.resolutionLevel),sm.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&&!lm&&!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,pm.refines++,void this._runUltra(e,t,!1,this._ultra);if(l&&cm&&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,pm.regathers++;let a=t;return a.compute(this._ultra.kernels.zero),im||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 pm.skips++;if(l)return void(this._ultraReadbackPending||this._runUltraReadback(e,t))}if(this._passesRenderer=t,sm.includes("none")&&pm.readbacksResolved>0)return void(this._computeDirty=!1);let T=t.getRenderTarget(),w=t.getMRT(),S=t.autoClear;if(t.setMRT(null),t.autoClear=!1,pm.lastPass="spatial",t.setRenderTarget(f),Kh.material=this.spatialMaterial,Kh.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"===sm&&pm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(pm.lastPass="potential",t.setRenderTarget(_.potential),Kh.material=this.potentialMaterial,Kh.render(t),"potential"===sm&&pm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(pm.lastPass="voxel",t.setRenderTarget(_.voxel),Kh.material=this.voxelMaterial,Kh.render(t),"voxel"===sm&&pm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(pm.lastPass="pyramid",this._renderPyramid(e,t,_.voxel,_.pyramid),t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),pm.lastPass="march",n&&(null===this._computeNode&&(this._computeNode=function(e,t,a){let r=Rh(e);return le(()=>{let{position:e,normal:a,color:s}=r(fe.toFloat());t.positions.element(fe).assign(pe(e,1)),t.normals.element(fe).assign(pe(a,0)),t.colors.element(fe).assign(s)})().compute(a)}(this._marchResources(e),this._marchBuffers,this._marchCapacity)),t.compute(this._computeNode),pm.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=Gh(s);if(null!==l)return a.setTriangles(l.data,l.triCount),a.uniforms.slotOrigin.value.copy(Wh(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 cm&&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;pm.lastPass="ultra-kernels",pm.lastDispatchRes=r.resolution,pm.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=nm?1e30:(3*Math.sqrt(3)+4)*l+.25*e._maxBlendK;let o=r.meshlet&&!mm;r.meshlet&&(r.uniforms.adaptCos.value=o?fm: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,pm.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 pm.fieldsFull++;pm.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),im||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),pm.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,pm.readbackPending=!0,r.getArrayBufferAsync(a.counterAttribute).then(r=>{if(this._ultraReadbackPending=!1,pm.readbackPending=!1,this.retired)return;this._disposeRetired();let s=new Uint32Array(r),i=a.meshlet?Math.floor(s[3]/3):s[0];if(pm.readbacksResolved++,pm.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(()=>{pm.readbackErrors++,this._ultraReadbackPending=!1,pm.readbackPending=!1})}_renderPyramid(e,t,a,r){let s=e.pyramidLevelSizes,i=s.length-1-1;Zh.value=0,Yh.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];$h.value=o.textures.length>1?o.textures[1]:o.texture,Xh.value=o.width,Qh.value=o.height;let u=s[n];2===n&&e.resolutionLevel%2!=0&&(u=3),Jh.value=u,l.viewport.set(Yh.value,0,u,u),t.setRenderTarget(l),Kh.material=tm(),Kh.render(t),l.viewport.set(0,0,l.width,l.height);let d=Zh.value;Zh.value=Yh.value,Yh.value=d,n<i&&(Yh.value+=s[n+1])}pm.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];pm.readbacksResolved++,pm.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}},xm=new WeakMap,vm=new WeakMap,bm=[];i(function(e){if(e.cached)return function(e){let t=()=>e.drawIndex?e.drawIndex.element(Me):Me;return{position:le(a=>{let r=e.positions.element(t()).xyz.toVar();return zh(a,r),r})(),normal:ke(e.normals.element(t()).xyz),color:ke(e.colors.element(t()))}}(e.cached);let t=Rh(e),a=ae("vec3","vShapeBlendNormal"),r=ae("vec4","vShapeBlendColor");return{position:le(e=>{let{position:s,normal:i,color:n}=t(Me.toFloat());return a.assign(i),r.assign(n),zh(e,s),s})(),normal:a,color:r}}),l(e=>function(e){let t=xm.get(e);if(t?.wantsReplacement){let a=vm.get(e);vm.set(e,t),t.retired=!0;let r=new ym(t.capacityHint,t.poolHint,t.vertHint);t.transferSettleQueue(r),a&&r.runWhenSettled(()=>a.dispose()),t=r,xm.set(e,t)}return t||(t=new ym,xm.set(e,t)),t}(e)),u({release:e=>function(e){let t=xm.get(e),a=vm.get(e);xm.delete(e),vm.delete(e),a&&bm.push(a),t&&(t.retired=!0,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 Tm=[64,1,1],wm=gr,Sm=wm-1,Vm=(e,t)=>void 0!==t?N(e,t):N(e),Mm=(e,t)=>{let a=e.xyz,r=ya(a,t),s=ya(a,r);return t.add(r.mul(e.w).mul(2)).add(s.mul(2))},Cm=le(([e,t])=>{let a=e,r=t,s=Ha(a,r).add(1).toVar(),i=de(0).toVar();return he(s.lessThan(1e-7),()=>{s.assign(0),he(Be(a.x).greaterThan(Be(a.z)),()=>{i.assign(de(a.y.negate(),a.x,0))}).Else(()=>{i.assign(de(0,a.z.negate(),a.y))})}).Else(()=>{i.assign(ya(a,r))}),(e=>{let t=Ha(e,e);return t.lessThan(1e-10).select(pe(0,0,0,1),e.mul(Le(It(t,1e-20))))})(pe(i,s))}),Rm=e=>(e=>e.sub(P(e.mul(1/289)).mul(289)))(e.mul(34).add(10).mul(e)),zm=le(([e])=>{let t=e,a=1/6,r=1/3,s=P(t.add(Ha(t,de(r)))).toVar(),i=t.sub(s).add(Ha(s,de(a))).toVar(),n=va(i.yzx,i.xyz).toVar(),l=de(1).sub(n).toVar(),o=Ht(n,l.zxy).toVar(),u=It(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(P(e.mul(1/289)).mul(289)))(s));let c=Rm(Rm(Rm(pe(0,o.z,u.z,1).add(s.z)).add(s.y).add(pe(0,o.y,u.y,1))).add(s.x).add(pe(0,o.x,u.x,1))).toVar(),p=.142857142857,g=2*p,f=.5*p-1,_=p,y=c.sub(P(c.mul(_*_)).mul(49)).toVar(),x=P(y.mul(_)).toVar(),v=P(y.sub(x.mul(7))).toVar(),b=x.mul(g).add(f).toVar(),T=v.mul(g).add(f).toVar(),w=pe(1).sub(Be(b)).sub(Be(T)).toVar(),S=pe(b.xy,T.xy).toVar(),V=pe(b.zw,T.zw).toVar(),M=P(S).mul(2).add(1).toVar(),C=P(V).mul(2).add(1).toVar(),R=va(w,pe(0)).negate().toVar(),z=S.xzyw.add(M.xzyw.mul(R.xxyy)).toVar(),k=V.xzyw.add(C.xzyw.mul(R.zzww)).toVar(),A=de(z.xy,w.x).toVar(),E=de(z.zw,w.y).toVar(),N=de(k.xy,w.z).toVar(),B=de(k.zw,w.w).toVar(),L=(e=>pe(1.79284291400159).sub(e.mul(.85373472095314)))(pe(Ha(A,A),Ha(E,E),Ha(N,N),Ha(B,B))).toVar();A.assign(A.mul(L.x)),E.assign(E.mul(L.y)),N.assign(N.mul(L.z)),B.assign(B.mul(L.w));let I=It(pe(.5).sub(pe(Ha(i,i),Ha(d,d),Ha(h,h),Ha(m,m))),pe(0)).toVar();return I.assign(I.mul(I)),Ha(I.mul(I),pe(Ha(A,i),Ha(E,d),Ha(N,h),Ha(B,m))).mul(105)}),km=class extends Kt{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=or(Lt.mul(pe(this.tangentWorld,0)).xyz),i=t,n=ze,l=or(i.add(n)),o=It(it(ya(s,i)),0),u=It(it(ya(s,l)),0);r.directDiffuse.addAssign(a.mul(o).mul(this.diffuseIntensity).mul(Da.rgb)),r.directSpecular.addAssign(a.mul(Ie(u,this.specularPower)).mul(this.specularIntensity).mul(de(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(Da.rgb)),r.indirectDiffuse.mulAssign(a)}},Am=class extends Kt{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=t,i=Qa,n=ze,l=or(s.add(n)),o=Ha(i,s).clamp(),u=Ha(i,l).clamp();r.directDiffuse.addAssign(a.mul(o).mul(.85).mul(Da.rgb)),r.directSpecular.addAssign(a.mul(Ie(u,60)).mul(.3).mul(de(.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(Da.rgb)),r.indirectDiffuse.mulAssign(a)}},Pm=class extends Ct{constructor(e){super(),this.model=e,this.lights=!0}setupLightingModel(){return this.model}},Em=new hs,Nm=new hs,Bm=new ms,Lm=class{constructor(){this.uNumStrands=Vm(0,"int"),this.uNumVerts=Vm(0,"int"),this.uDamping=Vm(.03),this.uLocalStiffness=Vm(.67),this.uGlobalStiffness=Vm(.5),this.uGlobalRange=Vm(.15),this.uStiffnessFalloff=Vm(.1),this.uGravity=Vm(0),this.uVspCoeff=Vm(.01),this.uVspThreshold=Vm(50),this.uKink=Vm(0),this.uKinkFreq=Vm(0),this.uUnitScale=Vm(100),this.uClumpStrength=Vm(0),this.uClumpSize=Vm(32,"int"),this.uClumpTipScale=Vm(1.5),this.uReset=Vm(1),this.uHasWind=Vm(0),this.uWind0=Vm(new ms),this.uWind1=Vm(new ms),this.uWind2=Vm(new ms),this.uWind3=Vm(new ms),this.uBoneQuat=Vm(new xs(0,0,0,1)),this.uBoneTrans=Vm(new ms),this.uDeltaQuat=Vm(new xs(0,0,0,1)),this.uPrevBoneTrans=Vm(new ms),this.uHairRoot=Vm(new Ms),this.uHairMid=Vm(new Ms),this.uHairTip=Vm(new Ms),this.uHeadColor=Vm(new Ms),this.uNoiseA=Vm(new Ms),this.uNoiseB=Vm(new Ms),this.uNoiseC=Vm(new Ms),this.uNoiseD=Vm(new Ms),this.uNoiseScale=Vm(.018),this.uNoiseMixHair=Vm(0),this.uNoiseMixHead=Vm(0),this.uWidth=Vm(.525),this.uSpecPow=Vm(40),this.uSpecInt=Vm(.4),this.uDiffInt=Vm(.6),this.uAmbInt=Vm(.25),this.uOpacity=Vm(1),this.uTipFade=Vm(.4),this.uColorSource=Vm(0),this.uShadeRoot=Vm(.6),this.uShadeTip=Vm(1.15),this.uShadowTexelWorld=Vm(0),this._armed=!1,this._uploadedGeneration=-1,this._prevBoneQuat=new hs,this._prevBonePos=new ms,this._hasPrevBone=!1,this._renderer=null,this.initialPos=ve(_r,"vec4"),this.rootColors=ve(fr,"vec4"),this.positions=ve(_r,"vec4"),this.positionsPrev=ve(_r,"vec4"),this.positionsPrevPrev=ve(_r,"vec4"),this.tangents=ve(_r,"vec4"),this.restLengths=ve(_r,"float"),this.vspQuats=ve(fr,"vec4"),this.vspTrans=ve(fr,"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 le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumVerts),()=>{Ae()});let t=e.div(wm).toVar(),a=e.sub(t.mul(wm)).toVar(),r=this.boneQuatNode(),s=this.boneTransNode(),i=this.initialPos.element(e).toVar(),n=pe(Mm(r,i.xyz).add(s),i.w).toVar(),l=this.positions.element(e).toVar(),o=this.positionsPrev.element(e).toVar(),u=o.toVar();he(this.uReset.greaterThan(.5),()=>{l.assign(n),u.assign(n)});let d=n.toVar();he(l.w.greaterThan(0),()=>{let e=R(xr),t=Ja(this.uDamping.negate().mul(e).mul(60)),a=l.xyz.add(l.xyz.sub(u.xyz).mul(t)).add(de(0,-1,0).mul(this.uGravity).mul(e).mul(e));d.assign(pe(a,l.w))}),he(this.uGlobalStiffness.greaterThan(0).and(this.uGlobalRange.greaterThan(0)).and(d.w.greaterThan(0)).and(a.toFloat().lessThan(this.uGlobalRange.mul(wm))),()=>{let t=e.sub(a),s=this.initialPos.element(t),i=or(Mm(r,s.xyz)).y.mul(.5).add(.5),l=this.uGlobalStiffness.mul(Ie(It(i,0),this.uStiffnessFalloff)),o=n.xyz.sub(d.xyz).mul(l);d.assign(pe(d.xyz.add(o),d.w))}),he(this.uKink.greaterThan(0).and(d.w.greaterThan(0)),()=>{let e=a.toFloat().div(wm),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=or(n.xyz.sub(s)).toVar(),u=de(0).toVar();he(Be(o.y).lessThan(.99),()=>{u.assign(or(ya(o,de(0,1,0))))}).Else(()=>{u.assign(or(ya(o,de(1,0,0))))});let h=or(ya(o,u)),m=u.mul(ea(i)).mul(l).add(h.mul(pa(i.mul(1.3).add(r))).mul(l).mul(.7));d.assign(pe(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(Tm[0],Tm)}_buildStrandLevel(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=e.mul(wm).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(It(it(l),1e-7)),d=o.div(It(it(o),1e-7)),h=Cm(u,d).toVar(),m=i.xyz.sub(Mm(h,r.xyz)),c=this.uVspCoeff.toVar(),p=it(n.xyz.sub(s.xyz.mul(2)).add(a.xyz));he(p.greaterThan(this.uVspThreshold),()=>{c.assign(1)}),this.vspQuats.element(e).assign(h),this.vspTrans.element(e).assign(pe(m,c))})().compute(Tm[0],Tm)}_buildVsp(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumVerts),()=>{Ae()});let t=e.div(wm).toVar(),a=e.sub(t.mul(wm)).toVar();he(a.lessThan(2),()=>{Ae()});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=>pe(e.xyz.mul(R(1).sub(i)).add(Mm(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(Tm[0],Tm)}_buildLocalShape(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=e.mul(wm).toVar(),a=Ht(this.uLocalStiffness,.95).mul(.5),r=this.boneQuatNode();ge(Sm-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=Mm(r,this.initialPos.element(s).xyz),u=Mm(r,this.initialPos.element(s.add(1)).xyz),d=Mm(r,this.initialPos.element(s.sub(1)).xyz),h=i.xyz.sub(l.xyz),m=u.sub(o),c=o.sub(d),p=Cm(c.div(It(it(c),1e-7)),h.div(It(it(h),1e-7))),g=Mm(p,m).add(i.xyz).sub(n.xyz).mul(a);he(i.w.greaterThan(0),()=>{i.assign(pe(i.xyz.sub(g),i.w))}),he(n.w.greaterThan(0),()=>{n.assign(pe(n.xyz.add(g),n.w))}),this.positions.element(s).assign(i),this.positions.element(s.add(1)).assign(n)})})().compute(Tm[0],Tm)}_buildLengthWind(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=e.mul(wm).toVar();he(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(R(1).sub(a))).add(this.uWind2.mul(a)).add(this.uWind3.mul(R(1).sub(a))).toVar();ge(Sm-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=ya(ya(n,r),n).negate();s.assign(pe(s.xyz.add(l.mul(xr).mul(.1)),s.w)),this.positions.element(a).assign(s)})}),ge(5,()=>{ge(Sm,({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=It(it(n),1e-7),o=R(1).sub(i.div(l)),u=n.mul(o),d=r.w.greaterThan(0),h=s.w.greaterThan(0),m=d.select(h.select(R(.5),R(1)),R(0)),c=h.select(d.select(R(.5),R(1)),R(0));r.assign(pe(r.xyz.add(u.mul(m)),r.w)),s.assign(pe(s.xyz.sub(u.mul(c)),s.w)),this.positions.element(a).assign(r),this.positions.element(a.add(1)).assign(s)})}),ge(Sm,({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=It(it(i),1e-7),l=this.restLengths.element(a.sub(1));he(n.greaterThan(l),()=>{s.assign(pe(r.xyz.add(i.div(n).mul(l)),s.w)),this.positions.element(a).assign(s)})}),ge(wm,({i:e})=>{let a=t.add(e).toVar(),r=e.equal(wm-1).select(a.sub(1),a).toVar(),s=or(this.positions.element(r.add(1)).xyz.sub(this.positions.element(r).xyz));this.tangents.element(a).assign(pe(s,0))})})().compute(Tm[0],Tm)}_buildClump(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=this.uClumpSize.toVar(),a=e.div(t).mul(t).toVar();he(e.equal(a),()=>{Ae()}),he(a.greaterThanEqual(this.uNumStrands),()=>{Ae()});let r=e.mul(wm).toVar(),s=a.mul(wm).toVar();ge(Sm,({i:e})=>{let t=e.add(1).toVar(),a=t.toFloat().div(Sm),i=this.uClumpStrength.mul(Ie(a,R(1).div(It(this.uClumpTipScale,.5)))),n=r.add(t).toVar(),l=this.positions.element(n).toVar(),o=this.positions.element(s.add(t));l.assign(pe(Xt(l.xyz,o.xyz,i),l.w)),this.positions.element(n).assign(l)})})().compute(Tm[0],Tm)}_buildRigidFollow(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumVerts),()=>{Ae()});let t=this.uDeltaQuat,a=this.uPrevBoneTrans,r=this.boneTransNode(),s=s=>{let i=s.element(e).toVar();i.assign(pe(Mm(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(pe(Mm(t,i.xyz),0)),this.tangents.element(e).assign(i)})().compute(Tm[0],Tm)}pastelNoise(e){let t=e.sub(this.boneTransNode()).mul(this.uNoiseScale),a=zm(t).mul(.5).add(.5),r=zm(t.add(de(31.7,17.3,53.1))).mul(.5).add(.5),s=zm(t.mul(.7).add(de(71.9,11.2,43.8))).mul(.5).add(.5),i=Xt(this.uNoiseA,this.uNoiseB,a);return i=Xt(i,this.uNoiseC,r.mul(.6)),i=Xt(i,this.uNoiseD,s.mul(.25)),i}_buildRibbonMaterial(){let e=ae("vec3","vHairTangent"),t=ae("vec3","vHairNormal"),a=ae("vec2","vHairUv"),r=ae("float","vHairRand"),s=ae("vec3","vHairInherit"),i=new Pm(new km(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=Fs;let n=i=>le(()=>{let n=Pe(fe).toVar(),l=n.div(Sm).toVar(),o=n.sub(l.mul(Sm)).toVar(),u=l.mul(wm).add(o).toVar(),d=Pe(Me).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,_=Xt(c,p,m).toVar(),y=Xt(g,f,m).toVar(),x=or(St.sub(_)),v=ya(y,x).toVar(),b=it(v).toVar();v.assign(b.greaterThan(1e-7).select(v.div(b),de(1,0,0)));let T=o.toFloat().div(Sm),w=o.add(1).toFloat().div(Sm),S=Xt(T,w,m).toVar(),V=this.uWidth.mul(R(1).sub(S.mul(this.uTipFade))).toVar(),M=i?(()=>{let e=this.uShadowTexelWorld,t=e.greaterThan(0).select(e.mul(1.5).clamp(R(2),R(8)),R(0));return It(t.sub(V),0).toVar()})():null;M&&V.addAssign(M);let C=h.mul(2).sub(1),z=_.add(v.mul(V).mul(C)).toVar();M&&z.assign(z.sub(x.mul(M)));let k=this.positionsPrev.element(u).xyz,A=this.positionsPrev.element(u.add(1)).xyz;be.assign(Xt(k,A,m).add(v.mul(V).mul(C)));let P=U(ea(l.toFloat().mul(12.9898)).mul(43758.5453));return r.assign(P),s.assign(this.rootColors.element(l).xyz),e.assign(y),t.assign(or(x.sub(y.mul(Ha(y,x))))),a.assign(ne(h,S)),z}),l=le(()=>{let e=a.y,t=Xt(this.uHairRoot,this.uHairMid,Ht(e.mul(2),1)),i=e.lessThan(.5).select(t,Xt(this.uHairMid,this.uHairTip,e.sub(.5).mul(2))).toVar(),n=s.mul(Xt(this.uShadeRoot,this.uShadeTip,e));i.assign(this.uColorSource.greaterThan(.5).select(n,i)),i.assign(Xt(i,this.pastelNoise(Ee),this.uNoiseMixHair));let l=R(1).sub(Be(a.x.sub(.5)).mul(2));return R(1).sub(e.mul(this.uTipFade)).mul(Ie(It(l,0),.5)).toVar().lessThan(.25).discard(),r.greaterThanEqual(this.uOpacity).discard(),pe(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 Pm(new Am);e.name="SplineHairScalp";let t=le(()=>{let e=Xt(this.uHeadColor,this.pastelNoise(Ee),this.uNoiseMixHead);return pe(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*wm;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*Sm,e.resetRequested=!0),this._syncUniforms(e),e.boneTransform(Em,Bm),this.uBoneQuat.value.set(Em.x,Em.y,Em.z,Em.w),this.uBoneTrans.value.copy(Bm);let i=this._hasPrevBone&&(Math.abs(this._prevBoneQuat.dot(Em))<.9999995||this._prevBonePos.distanceToSquared(Bm)>1e-8),n=Math.floor(e.pendingSimSeconds/xr);n>vr&&(n=vr),e.pendingSimSeconds=Math.max(0,Math.min(e.pendingSimSeconds-n*xr,xr)),e.resetRequested&&n<1&&(n=1),n<1&&i&&(Nm.copy(this._prevBoneQuat).invert().premultiply(Em),this.uDeltaQuat.value.set(Nm.x,Nm.y,Nm.z,Nm.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+=xr,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(Em),this._prevBonePos.copy(Bm),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*wm,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,gs)};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*yr*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}},Im=new WeakMap,Dm=[];hr(e=>function(e){let t=Im.get(e);return void 0===t&&(t=new Lm,Im.set(e,t)),t}(e)),cr({release:e=>function(e){let t=Im.get(e);void 0!==t&&(Im.delete(e),Dm.push(t))}(e),drainRetired:function(){let e=Dm.length;if(e>0){for(let e of Dm)e.dispose();Dm.length=0}return e}});var Fm="\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",Um=e=>`\n${Fm}\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`,Om=Um("\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",Gm=Um("\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",qm=Um("\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",Wm=Um("\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",Hm=Um("\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",jm=Um("\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 Km(e){let t=e.backend.device;if(!t)throw new Error("[spline/sky] WebGPU device unavailable for LUT precompute");return t}function $m(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 Xm(e,t,a,r){let s=new H(e,t);return s.type=a,s.minFilter=js,s.magFilter=js,s.generateMipmaps=!1,s.mipmapsAutoUpdate=!1,s.name=r,s}function Qm(e,t,a,r,s,i){let n=new X(e,t,a);return n.type=r,n.minFilter=i,n.magFilter=i,n.generateMipmaps=!1,n.mipmapsAutoUpdate=!1,n.name=s,n}var Zm=256,Ym={transmittance:{code:Om,entries:[{storage:"2d",format:"rgba32float"}]},directIrradiance:{code:Gm,entries:[{sampled:"2d"},{storage:"2d",format:"rgba32float"},{storage:"2d",format:"rgba32float"},{sampled:"2d"}]},singleScattering:{code:qm,entries:[{storage:"3d",format:"rgba32float"},{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"}]},scatteringDensity:{code:Wm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"2d"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"},{sampled:"2d"}]},indirectIrradiance:{code:Hm,entries:[{storage:"2d",format:"rgba32float"},{sampled:"2d"},{storage:"2d",format:"rgba32float"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"}]},multipleScattering:{code:jm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"},{sampled:"3d"}]}};async function Jm(e,t,a,r,s,i){let n=Km(e),l=$m(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]=ec(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 ec(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 tc(e,t){return.5/t+e*(1-1/t)}function ac(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 rc(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 ac(t,256,64,tc((n-l)/(i+s-l),256),tc(o,64))}(e,t,a,r);return[l[0]*n,l[1]*n,l[2]*n]}function sc(e){return.2126*e[0]+.7152*e[1]+.0722*e[2]}function ic(e,t,a,r){let s=rc(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 nc(e,t,a,r){let s=function(e,t,a,r){let s=(a-e.bottomRadius)/(e.topRadius-e.bottomRadius);return ac(t,64,16,tc(.5*r+.5,64),tc(s,16))}(e,t.irradiance,a,r),i=e.skySpectralRadianceToLuminance;return[s[0]*i[0],s[1]*i[1],s[2]*i[2]]}var lc="6.0e4",oc="\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",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\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(${lc})), 1.0);\n`,dc="\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",hc=`\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(${lc})), cloud.a);\n`,mc=`\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(${lc})) * (1.0 - cloud.a) +\n\t\tmin(cloud.rgb, vec3f(${lc}));\n\tcolor = Hable(color, exposure, WHITE_POINT);\n\tcolor = pow(color, vec3f(1.0 / gamma));\n\n\treturn vec4f(color, 1.0);\n`,cc="\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",pc=`\n${dc}\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`,gc=`\n${dc}\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`,fc=Math.fround,_c=360,yc=.5*Math.PI/180,xc=1e3,vc=[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],bc=[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],Tc=[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],wc=[3.2406,-1.5372,-.4986,-.9689,1.8758,.0415,.0557,-.204,1.057],Sc={maxOzoneNumberDensity:5374e15,rayleigh:124062e-11,rayleighScaleHeight:8e3,mieScaleHeight:1200,mieAngstromAlpha:0,mieAngstromBeta:.005328,mieSingleScatteringAlbedo:.9,miePhaseFunctionG:.9,groundAlbedo:.1,numScatteringOrders:4};function Vc(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 Mc(e,t){if(e<=_c||e>=830)return 0;let a=(e-_c)/5,r=Math.floor(a);return a-=r,Tc[4*r+t]*(1-a)+Tc[4*(r+1)+t]*a}function Cc(e,t,a){let r=0,s=0,i=0,n=Vc(e,t,680),l=Vc(e,t,550),o=Vc(e,t,440);for(let u=_c;u<830;u+=1){let d=Mc(u,1),h=Mc(u,2),m=Mc(u,3),c=wc[0]*d+wc[1]*h+wc[2]*m,p=wc[3]*d+wc[4]*h+wc[5]*m,g=wc[6]*d+wc[7]*h+wc[8]*m,f=Vc(e,t,u);r+=c*f/n*Math.pow(fc(u/680),a),s+=p*f/l*Math.pow(fc(u/550),a),i+=g*f/o*Math.pow(fc(u/440),a)}return r*=683,s*=683,i*=683,[r,s,i]}var Rc=Math.PI/180;function zc(e,t,a,r,s){return[fc(e/xc),fc(t),fc(a*xc),fc(r*xc),fc(s)]}function kc(e){return new Float32Array([...e,...e])}var Ac=fc(Rc),Pc=fc(Math.PI),Ec=fc(2*Math.PI);function Nc(e,t=80){let a=fc(52*Ac),r=fc(fc(23.44)*Ac),s=fc(e%86400/86400),i=fc(r*Math.sin(fc(fc(fc(2*Pc)*(t-80))/365))),n=fc(fc(s-.5)*Ec),l=fc(Math.sin(a)*Math.sin(i)+Math.cos(a)*Math.cos(i)*Math.cos(n)),o=fc(1-fc(l*l)),u=fc(Math.sqrt(o>0?o:0));return[fc(u*Math.sin(n)),l,fc(u*Math.cos(n))]}var Bc=Math.fround,Lc=256;function Ic(e){return Bc(e-Math.floor(e))}function Dc(e,t,a){e=Bc(e+a),t=Bc(t+a);let r=Bc(Bc(e*Bc(127.1))+Bc(t*Bc(311.7))),s=Bc(Bc(e*Bc(269.5))+Bc(t*Bc(183.3)));return[Ic(Bc(Bc(Math.sin(r))*Bc(43758.5453123))),Ic(Bc(Bc(Math.sin(s))*Bc(43758.5453123)))]}function Fc(e,t,a){return Bc(Bc(Bc(Bc(Bc(t-e)*Bc(3-Bc(2*a)))*a)*a)+e)}var Uc=Bc(Bc(3.14159265)/2147483648);function Oc(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=Bc(Bc(r)*Uc);return[Bc(Math.sin(i)),Bc(Math.cos(i))]}(e,t,s),l=Bc(a-e),o=Bc(r-t);return Bc(Bc(l*i)+Bc(o*n))}function Gc(e,t,a=0){let r=Math.trunc(e),s=Math.trunc(t),i=r+1,n=s+1,l=Bc(e-r),o=Bc(t-s),u=Oc(r,s,e,t,a),d=Oc(i,s,e,t,a),h=Fc(u,d,l);u=Oc(r,n,e,t,a),d=Oc(i,n,e,t,a);let m=Fc(u,d,l);return Fc(h,m,o)}function qc(e,t,a,r=1,s=1,i=0){let n=0,l=0;for(let o=0;o<e;o++)n=Bc(n+Bc(s*Gc(Bc(t*r),Bc(a*r),i))),l=Bc(l+s),s=Bc(.5*s),r=Bc(2*r);return Bc(n/l)}function Wc(e,t,a,r=0){let s=Math.floor(e),i=Math.floor(t),n=Bc(e-s),l=Bc(t-i),o=1e9;for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let u=Bc(Bc(Bc(s+t)+a)%a),d=Bc(Bc(Bc(i+e)+a)%a),[h,m]=Dc(u,d,r),c=Bc(h+t),p=Bc(m+e),g=Bc(c-n),f=Bc(p-l),_=Bc(Math.sqrt(Bc(Bc(g*g)+Bc(f*f))));_<o&&(o=_)}return o}function Hc(e,t,a){let r=Bc(Bc(a-e)/Bc(t-e));return r<0&&(r=0),r>1&&(r=1),Bc(Bc(r*r)*Bc(3-Bc(2*r)))}function jc(e,t,a){return Bc(Bc(e*Bc(1-a))+Bc(t*a))}function Kc(e){return Math.trunc(e)>>>0}var $c=new Float32Array(1),Xc=new Uint32Array($c.buffer);function Qc(e){$c[0]=e;let t=Xc[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 Zc=new Map;function Yc(e,t){let a=`${e}|${Bc(t)}`,r=Zc.get(a);if(void 0!==r)return Zc.delete(a),Zc.set(a,r),r;let s=function(e){let t=new Uint16Array(262144);for(let a=0;a<65536;a++)t[4*a+0]=Qc(e[3*a+0]),t[4*a+1]=Qc(e[3*a+1]),t[4*a+2]=Qc(e[3*a+2]),t[4*a+3]=15360;return t}(function(e,t){switch(t=Bc(t),e){case"clear":return new Float32Array(196608);case"mostlyClear":return function(e){let t=new Float32Array(196608),a=Kc(e);for(let e=0;e<Lc;e++)for(let r=0;r<Lc;r++){let s=Bc(e/Lc),i=Bc(r/Lc),n=3*(r*Lc+e),l=Bc(Bc(.5*qc(3,s,i,24,1,a))+.5);t[n+0]=Bc(Hc(Bc(.45),Bc(.8),l)*Bc(.7)),t[n+1]=0,t[n+2]=Bc(.3)}return t}(t);case"partlyCloudy":return function(e){let t=new Float32Array(196608),a=Bc(Math.max(1,Kc(e)));for(let r=0;r<Lc;r++)for(let s=0;s<Lc;s++){let i=Bc(r/Lc),n=Bc(s/Lc),l=3*(s*Lc+r),o=Bc(1-Wc(Bc(24*i),Bc(24*n),24,e)),u=Bc(Bc(.5*qc(3,i,n,16,a,0))+.5),d=Bc(u*Hc(Bc(.3),1,o)),h=Bc(jc(0,Bc(.35),Hc(Bc(.1),Bc(.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=Bc(Math.max(1,Kc(e)));for(let r=0;r<Lc;r++)for(let s=0;s<Lc;s++){let i=Bc(r/Lc),n=Bc(s/Lc),l=3*(s*Lc+r),o=Bc(1-Wc(Bc(32*i),Bc(32*n),32,e)),u=Bc(Bc(.5*qc(3,i,n,16,a,0))+.5),d=Bc(u*Hc(0,Bc(.9),o)),h=Bc(jc(0,Bc(.6),Hc(Bc(.1),Bc(.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=Kc(e);for(let e=0;e<Lc;e++)for(let r=0;r<Lc;r++){let s=Bc(e/Lc),i=Bc(r/Lc),n=3*(r*Lc+e),l=Bc(Bc(.5*qc(3,s,i,16,1,a))+.5);t[n+0]=Hc(Bc(.2),1,l),t[n+1]=Bc(.3),t[n+2]=Bc(.8)}return t}(t);case"storm":return function(e){let t=new Float32Array(196608),a=Kc(e);for(let e=0;e<Lc;e++)for(let r=0;r<Lc;r++){let s=Bc(e/Lc),i=Bc(r/Lc),n=3*(r*Lc+e),l=Bc(Bc(.5*qc(3,s,i,16,1,a))+.5);t[n+0]=Hc(Bc(.1),1,l),t[n+1]=Bc(Bc(.5*qc(2,s,i,8,1,a))+.5),t[n+2]=1}return t}(t)}}(e,t));return Zc.size>=8&&Zc.delete(Zc.keys().next().value),Zc.set(a,s),s}var Jc={cirrus:"sky-cirrus.png",alto:"sky-alto.png"};async function ep(e){let t=ts(Jc[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 tp(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 ap="\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",rp=64,sp=32;function ip(e){return Math.pow(e/255,2.2)}var np=class{constructor(e,t){this._uRotation=N(new ms),this._uBlurAngle=N(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(Gr(e)){let{data:a,width:r,height:s}=e;t=(e,t)=>{let i=Math.min(r-1,Math.floor((e+.5)/rp*r)),n=Math.min(s-1,Math.floor((t+.5)/sp*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=rp,a.height=sp;let r,s=a.getContext("2d",{willReadFrequently:!0});if(null===s)return null;try{s.drawImage(e,0,0,rp,sp),r=s.getImageData(0,0,rp,sp).data}catch{return null}t=(e,t)=>{let a=4*(t*rp+e);return[ip(r[a]),ip(r[a+1]),ip(r[a+2])]}}let a=e=>.2126*e[0]+.7152*e[1]+.0722*e[2],r=(e,t)=>{let a=(t+.5)/sp*Math.PI,r=Math.PI-(e+.5)/rp*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<sp;e++){let r=Math.sin((e+.5)/sp*Math.PI),u=e<16;for(let d=0;d<rp;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<sp;e++){let s=Math.sin((e+.5)/sp*Math.PI);for(let i=0;i<rp;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=Gr(e.image)?qr(e.image):new fs(e.image);t.name="sky-hdri-source",t.wrapS=Ds,t.wrapT=Us,t.minFilter=ti,t.magFilter=Ys,t.generateMipmaps=!0,t.flipY=!Gr(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 De("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}",[Ne(ap)])({uv:kt,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:qa(e),envSamp:yt(e)})}_ensureBackgroundMesh(e){if(this.backgroundMesh)return this.backgroundMesh;let t=new Es;t.setAttribute("position",new zs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let a=new Ct;a.name="SplineSkyHdriBackground",a.lights=!1,a.depthWrite=!1,a.depthTest=!1,a.colorNode=this._buildBackgroundNode(e);let r=De("fn hdriBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");a.vertexNode=r({position:ce});let s=new Os(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=De("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}",[Ne(ap)])({uv:$(),rotation:this._uRotation,blurAngle:this._uBlurAngle,envTex:qa(e),envSamp:yt(e)});if(null===this._envQuad){let e=new Ct;e.name="SplineSkyHdriEnvironmentPass",e.lights=!1,e.fragmentNode=t,this._envQuad=new $a(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 vs(256,128,{type:rs,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-hdri-environment",e.generateMipmaps=!0,e.minFilter=ti,e.magFilter=Ys,e.wrapS=Ds}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}},lp=new Ms,op=new ds,up=new xs,dp=new xs,hp={maxDistance:128,sigmaS:10,sigmaA:0,cloudLayerThickness:4,cloudLayerBottom:2,highCloudsHeight:8,highCloudsScale:32,weatherMapScale:128,baseNoiseScale:25,detailNoiseScale:1.5},mp=.3,cp=.3,pp={clear:[0,0],mostlyClear:[mp,cp],partlyCloudy:[mp,cp],mostlyCloudy:[mp,cp],overcast:[mp,cp],storm:[mp,cp]},gp=null;try{let e=new URLSearchParams(window.location.search).get("dbgskystep");null!==e&&""!==e&&Number.isFinite(Number(e))&&(gp=Math.max(0,Number(e)))}catch{}var fp=.62,_p={clear:1,mostlyClear:.95,partlyCloudy:.9,mostlyCloudy:.8,overcast:.6,storm:.5},yp={clear:1,mostlyClear:.92,partlyCloudy:.8,mostlyCloudy:.55,overcast:.3,storm:.15},xp={clear:1,mostlyClear:.97,partlyCloudy:.92,mostlyCloudy:.8,overcast:.65,storm:.5},vp="\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",bp=`${vp},\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`,Tp=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=N(new ms),this._uRay10=N(new ms),this._uRay01=N(new ms),this._uRay11=N(new ms),this._uCameraPos=N(new ms(0,.1,0)),this._uSunDir=N(new ms(0,1,0)),this._uCloudsParamsC=N(new xs(hp.baseNoiseScale,hp.detailNoiseScale,mp,cp)),this._uCloudsParamsD=N(new xs(0,1,0,0)),this._uExposure=N(5e-4),this._uGamma=N(2.2),this._uEnvCloudsOn=N(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._lightingOn=!1,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=_c;o<=830;o+=10){let u=.001*o,d=e.mieAngstromBeta/e.mieScaleHeight*Math.pow(u,-e.mieAngstromAlpha);t.push(o),a.push(vc[(o-_c)/10]),r.push(e.rayleigh*Math.pow(u,-4)),s.push(d*e.mieSingleScatteringAlbedo),i.push(d),n.push(e.maxOzoneNumberDensity*bc[(o-_c)/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=Cc(a,t.solarIrradiance,-3),s=Cc(a,t.solarIrradiance,0),i=(e,t)=>[fc(Vc(a,e,680)*t),fc(Vc(a,e,550)*t),fc(Vc(a,e,440)*t)];return{solarIrradiance:i(t.solarIrradiance,1),rayleighScattering:i(t.rayleighScattering,xc),mieScattering:i(t.mieScattering,xc),mieExtinction:i(t.mieExtinction,xc),absorptionExtinction:i(t.absorptionExtinction,xc),groundAlbedo:i(t.groundAlbedo,1),skySpectralRadianceToLuminance:[fc(r[0]),fc(r[1]),fc(r[2])],sunSpectralRadianceToLuminance:[fc(s[0]),fc(s[1]),fc(s[2])],bottomRadius:6360,topRadius:6420,muSMin:fc(Math.cos(120*Rc)),sunAngularRadius:fc(yc),miePhaseG:fc(e.miePhaseFunctionG),rayleighDensity:kc(zc(0,1,-1/e.rayleighScaleHeight,0,0)),mieDensity:kc(zc(0,1,-1/e.mieScaleHeight,0,0)),absorptionDensity:new Float32Array([...zc(25e3,0,0,1/15e3,-2/3),...zc(0,0,0,-1/15e3,8/3)]),luminanceFromRadiance:new Float32Array([1,0,0,0,1,0,0,0,1])}}(Sc);let t=e=>{let t=new Ks(new Uint16Array(262144),Lc,Lc,_s,rs);return t.wrapS=Ds,t.wrapT=Ds,t.minFilter=Ys,t.magFilter=Ys,t.name=e,t.needsUpdate=!0,t};this._weatherCur=t("sky-weather-current"),this._weatherNext=t("sky-weather-next"),this._highClouds=new Ks(new Uint8Array(524288),512,512,ws,ri),this._highClouds.wrapS=Ds,this._highClouds.wrapT=Ds,this._highClouds.minFilter=Ys,this._highClouds.magFilter=Ys,this._highClouds.name="sky-high-clouds",this._highClouds.needsUpdate=!0,this.assetsReady=async function(){let[e,t]=await Promise.all([ep("cirrus").then(tp),ep("alto").then(tp)]),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=>{this._highClouds.image.data.set(e),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?Jm(this._renderer,t.transmittance,256,64,1,!1):"irradiance"===e?Jm(this._renderer,t.irradiance,64,16,1,!1):Jm(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 Jm(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 this._lightingOn?!0===this._hdri?.active?this._iblHdriTexture:this._envTarget?.texture??null: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=Km(e),s=Xm(256,64,as,"sky-lut-transmittance"),i=[Xm(64,16,as,"sky-lut-irradiance-a"),Xm(64,16,as,"sky-lut-irradiance-b")],n=[Qm(256,128,32,rs,"sky-lut-scattering-a",Ys),Qm(256,128,32,rs,"sky-lut-scattering-b",Ys)],l=Xm(64,16,as,"sky-delta-irradiance"),o=Qm(256,128,32,as,"sky-delta-rayleigh",js),u=Qm(256,128,32,as,"sky-delta-mie",js),d=Qm(256,128,32,as,"sky-delta-density",js),h={transmittance:$m(e,s),irr:i.map(t=>$m(e,t)),scat:n.map(t=>$m(e,t)),deltaIrradiance:$m(e,l),deltaRayleigh:$m(e,o),deltaMie:$m(e,u),deltaDensity:$m(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)*Zm),_=new Map;for(let[e,t]of Object.entries(Ym)){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*Zm/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*Zm/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:Zm}}];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],C=n[v],R=[i[1-x],n[1-v],l,o,u,d];for(let e of R)e.dispose();return p.destroy(),w.destroy(),{transmittance:s,scattering:C,irradiance:M,dispose(){s.dispose(),C.dispose(),M.dispose()}}}(this._renderer,this._atmosphereUniforms,this.numScatteringOrdersOverride??Sc.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 X(e,e,e);return a.type=rs,a.minFilter=Ys,a.magFilter=Ys,a.wrapS=Ds,a.wrapT=Ds,a.wrapR=Ds,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(pc,this._baseNoise,128),a(gc,this._detailNoise,32)}_atmArgs(){let e=this._atmosphereUniforms;return{solarIrradiance:N(new ms(...e.solarIrradiance)),rayleighScattering:N(new ms(...e.rayleighScattering)),mieScattering:N(new ms(...e.mieScattering)),skySrtl:N(new ms(...e.skySpectralRadianceToLuminance)),sunSrtl:N(new ms(...e.sunSpectralRadianceToLuminance)),atmScalars:N(new xs(e.sunAngularRadius,e.bottomRadius,e.topRadius,e.miePhaseG)),muSMin:N(e.muSMin)}}_ensurePasses(){if(this._skyQuad)return;this._ensureLuts(),this._ensureNoise();let e=this._luts,t={uv:$(),ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11,cameraPos:this._uCameraPos,sunDir:this._uSunDir,...this._atmArgs(),transmittanceTex:qa(e.transmittance),scatteringTex:Ka(e.scattering),scatteringSamp:yt(e.scattering)},a=Ne(Fm+oc),r=De(`fn skyPass(${vp}) -> vec4f {${uc}}`,[a]),s=new Ct;s.name="SplineSkyPass",s.lights=!1,s.fragmentNode=r(t),this._skyQuad=new $a(s);let i=Ne(Fm+oc+"\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=De(`fn cloudsPass(${bp}) -> vec4f {${hc}}`,[i]),l=hp,o={...t,irradianceTex:qa(e.irradiance),baseNoiseTex:Ka(this._baseNoise),noiseSamp:yt(this._baseNoise),detailNoiseTex:Ka(this._detailNoise),weatherCurTex:qa(this._weatherCur),weatherSamp:yt(this._weatherCur),weatherNextTex:qa(this._weatherNext),highCloudsTex:qa(this._highClouds),cloudsParamsA:N(new xs(l.maxDistance,l.sigmaS,l.sigmaA,l.cloudLayerThickness)),cloudsParamsB:N(new xs(l.cloudLayerBottom,l.highCloudsHeight,l.highCloudsScale,l.weatherMapScale)),cloudsParamsC:this._uCloudsParamsC,cloudsParamsD:this._uCloudsParamsD},u=new Ct;u.name="SplineSkyCloudsPass",u.lights=!1,u.fragmentNode=n(o),this._cloudsQuad=new $a(u),this._cloudsArgs=o,this._cloudsLib=i}_ensureEnvPass(){if(this._envQuad)return;this._ensurePasses();let e=De(`fn skyEnvPass(${bp},\n\texposure: f32, gamma: f32, cloudsOn: f32) -> vec4f {${mc}}`,[Ne(cc),this._cloudsLib]),t=new Ct;t.name="SplineSkyEnvironmentPass",t.lights=!1,t.fragmentNode=e({...this._cloudsArgs,exposure:this._uExposure,gamma:this._uGamma,cloudsOn:this._uEnvCloudsOn}),this._envQuad=new $a(t)}_ensureBackgroundMesh(e,t){if(this.backgroundMesh)return this.backgroundMesh;let a=new Es;a.setAttribute("position",new zs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let r=new Ct;r.name="SplineSkyBackground",r.lights=!1,r.depthWrite=!1,r.depthTest=!1,r.colorNode=this._buildComposeNode(e,t);let s=De("fn skyBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");r.vertexNode=s({position:ce});let i=new Os(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=Yc(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=up.set(e,t,-1,1).applyMatrix4(a.projectionMatrixInverse);return this._eyeRayToWorld(s.x,s.y,a,r)}_eyeRayToWorld(e,t,a,r){let s=dp.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),this._windOffsetKm%=9600);let n=this.fixedTimeSeconds??3600*a.timeOfDay,l=Nc(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??gp??.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=pp[this._presetFrom],m=pp[this._presetTo];this._uCloudsParamsC.value.set(hp.baseNoiseScale,hp.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),this._lightingOn=!0===a.lighting,!0===a.lighting?(this._ensureLightingLuts(),this._updateLighting(e,o,a.exposure,a.lightingIntensity??1)):null!==this._lightingPage&&this._teardownLighting();let c=this._renderer.getDrawingBufferSize(op);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 vs(t,a,{type:rs,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,C=this._uRay01.value,R=this._uRay11.value,z=`${n}|${V.x},${V.y},${V.z}|${M.x},${M.y},${M.z}|${C.x},${C.y},${C.z}|${R.x},${R.y},${R.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(lp),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 vs(256,128,{type:rs,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-environment",e.generateMipmaps=!0,e.minFilter=ti,e.magFilter=Ys,e.wrapS=Ds}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(op);this._updateCornerRays(t,r.y>0?r.x/r.y:1),null===this._hdri&&(this._hdri=new np(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,this._lightingOn=!0===a.lighting&&null!==i;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 ns(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 Pi(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):fp;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([Jm(this._renderer,e.transmittance,256,64,1,!1),Jm(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=Nc(43200)[1],i=ic(a,this._lightingLuts,r,s);this._noonSunRgb=[i[0],i[1],i[2]],this._noonSunLum=sc(i),this._noonSkyLum=sc(nc(a,this._lightingLuts,r,s))},()=>{this._lightingLutsRequested=!1})}_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=sc(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(_p),c=ic(n,s,l,u),p=sc(c),g=this._sunLight;if(null===g&&(g=new ns(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(yp)*a*r;let f=e.ambientLight;null!=f&&(null!==f.parent&&f.removeFromParent(),this._userAmbientSuppressed=!0);let _=this._skyHemi;null===_&&(_=new Pi(16777215,8947848,0),_.name="SplineSkyAmbient",_.layers.enable(3),_.raycast=()=>{},this._skyHemi=_),_.parent!==e&&e.add(_);let y=nc(n,s,l,u),x=sc(y),[v,b,T]=h(y,m);_.color.setRGB(v,b,T),_.groundColor.setRGB(v*fp,b*fp,T*fp),_.intensity=.75*Math.PI*(x/this._noonSkyLum)*d(xp)*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 De("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}",[Ne(cc)])({uv:kt,skyTex:qa(e),skySamp:yt(e),cloudsTex:qa(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(),this._lightingOn=!1}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}};kl=e=>new Tp(e);var wp=e=>e,Sp=ae("vec4","vSplatColor"),Vp=ae("vec2","vSplatPosition");function Mp(e,t,a){return e.element(t).element(a)}var Cp=class extends Ct{constructor(e){super(),this.uniformsNeedUpdate=!1,this._covariancesTex=qa(new fs),this._centersColorsTex=qa(new fs),this._meshMatrixWorldsTex=qa(new fs),this._focal=N(new ds),this._viewport=N(new ds),this._basisViewport=N(new ds),this._covariancesTextureSize=N(new ds(1024,1024)),this._centersColorsTextureSize=N(new ds(1024,1024)),this._orthoZoom=N(-1),this._velocityMRT=Ca({velocity:pe(0)}),this.name="WebGPUSplatMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.side=Fs,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 Ms)},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=le(()=>{let u=dt("splatIndex","uint"),d=(e,t,a)=>{let r=u.mul(k(e)).add(k(t)).toFloat().div(a.x);return ne(U(r),P(r).div(a.y))},h=a.sample(d(1,0,l)).toVar(),m=ct(Y(h.y,h.z,h.w),"vec3").toVar(),c=h.x;Sp.assign(pe(c.bitAnd(k(255)).toFloat(),c.shiftRight(k(8)).bitAnd(k(255)).toFloat(),c.shiftRight(k(16)).bitAnd(k(255)).toFloat(),c.shiftRight(k(24)).bitAnd(k(255)).toFloat()).mul(1/255));let p=dt("position","vec3").xy.mul(2).toVar();Vp.assign(p);let g=R(0);for(let t=1;t<e.length-1;t++)g=wp(g.add(u.greaterThanEqual(k(e[t])).select(R(1),R(0))));let f=g.mul(4).toVar(),_=e=>r.sample(ne(f.add(e).div(1024),0)),y=Vt(_(0),_(1),_(2),_(3)),x=Lt.mul(y).toVar(),v=x.mul(pe(m,1)).toVar(),b=Rt.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,C=w.x,z=w.y,A=S.x,E=S.y,N=bt(V,M,C,M,z,A,C,A,E),B=R(1).div(v.z.mul(v.z)).toVar(),L=x,I=bt(L.element(0).xyz,L.element(1).xyz,L.element(2).xyz).transpose(),D=bt(s.x.div(v.z),0,s.x.mul(v.x).negate().mul(B),0,s.y.div(v.z),s.y.mul(v.y).negate().mul(B),0,0,0),F=e=>{let t=e.transpose().mul(N).mul(e);return pe(Mp(t,0,0).add(.3),Mp(t,0,1),Mp(t,1,1).add(.3),0).xyz},O=o.greaterThan(0),G=O.select(F(I),F(I.mul(D))).toVar(),q=b.xyz.div(b.w).toVar(),W=G.x,H=G.z,j=G.y,K=W.mul(H).sub(j.mul(j)),$=W.add(H),X=$.mul(.5),Q=fa(It($.mul($).div(4).sub(K),0)).toVar(),Z=X.add(Q).toVar(),J=It(X.sub(Q),0).toVar(),ee=or(ne(j,Z.sub(W))).toVar(),te=ne(ee.y,ee.x.negate()).toVar(),ae=ee.mul(Ht(fa(Z.mul(2)),1024)).toVar(),re=te.mul(Ht(fa(J.mul(2)),1024)).toVar(),se=ae.mul(p.x).add(re.mul(p.y)).mul(i).toVar();return se.assign(O.select(se.mul(o),se)),pe(q.xy.add(se),q.z,1)}),d=le(()=>{let e=Vp.dot(Vp).negate().toVar();e.lessThan(-4).discard();let t=Ja(e).mul(Sp.w);return pe(Sp.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 Rp(){let e=N(1),t=N(.6),a=N(1),r=N(1),s=N(new Ms(16603997)),i=N(new Ms(2857471)),n=N(new Ms(3728051)),l=N(9),o=N(new ds),u=new Ct;u.name="EditorGridNodeMaterial",u.transparent=!0,u.lights=!1,u.fog=!1;let d=Nt(l.equal(10),n,i),h=Nt(l.equal(8),n,s),m=Nt(_e.x.equal(o.x),d,Nt(_e.z.equal(o.y),h,de(.5)));u.colorNode=m;let c=Ve.z.negate(),p=sa(a.mul(500),a.mul(4500),c).mul(r);u.opacityNode=Xt(e.mul(t),R(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 zp(){return typeof navigator<"u"&&void 0!==navigator.gpu}Tr({createSplatMaterial:e=>new Cp(e)}),Pr({createRootMaterial:(e,t)=>new uh(e,t),createSharedMaterial:(e,t,a)=>new dh(e,t,a)}),Nr({tsl:nr,NodeMaterial:Ct,MeshBasicNodeMaterial:Zt,MeshStandardNodeMaterial:ba,MeshPhysicalNodeMaterial:Va,MeshPhongNodeMaterial:ua,MeshLambertNodeMaterial:ia,MeshToonNodeMaterial:za,MeshMatcapNodeMaterial:Ea,MeshNormalNodeMaterial:qt,SpriteNodeMaterial:Ia,PointsNodeMaterial:Ua,LineBasicNodeMaterial:At,LineDashedNodeMaterial:Bt,Color:Ms,Vector2:ds,Vector3:ms,Vector4:xs,Matrix3:cs,Matrix4:Ss,Texture:fs,CanvasTexture:is,DataTexture:Ks,VideoTexture:ii,FrontSide:Ls,BackSide:Is,DoubleSide:Fs,NormalBlending:Hs,AdditiveBlending:$s,MultiplyBlending:Zs,SubtractiveBlending:Xs,RepeatWrapping:Ds,ClampToEdgeWrapping:Us,MirroredRepeatWrapping:qs,NearestFilter:js,LinearFilter:Ys,LinearMipmapLinearFilter:ti,SRGBColorSpace:gs,LinearSRGBColorSpace:ys}),Er(()=>{let e=new Wa;return e.depthWrite=!1,e.opacity=.5,e});var kp=["maxUniformBuffersPerShaderStage","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageBufferBindingSize","maxBufferSize","maxVertexBuffers","maxVertexAttributes","maxUniformBufferBindingSize","maxColorAttachmentBytesPerSample"];async function Ap(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 kp){let t=r[e];"number"==typeof t&&Number.isFinite(t)&&(a[e]=t)}return a}catch{return}}(e),r=new Vo({...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{Oo as SPE_BLENDING_MULTIPLY,Uo as SPE_BLENDING_NORMAL,qo as SPE_BLENDING_OVERLAY,Go as SPE_BLENDING_SCREEN,Io as TSLLayerParams,uh as TSLRootMaterial,dh as TSLSharedMaterial,ji as WebGPUPostPipeline,Vo as WebGPUSplineRenderer,Rp as createEditorGridNodeMaterial,Ap as createWebGPUSplineRenderer,Qo as getTSLLayerBuilder,Zo as hasTSLLayerBuilder,zp as isWebGPUSupported,Bo as ownUniformValue,Xo as registerTSLLayer,Lo as setRenderUniformValue,Fo as simpleCalpha,Ho as speBlend,Ao as speObjectNormal,ko as speObjectPosition,No as splitUniformValueSlots,Do as standardCalpha,$o as unsupportedTSLLayerBuilder,w as webgpuGlobals};
1
+ import{a as e,b as t,c as a,d as r}from"./runtime-chunk-VL5YASFE.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-74ERBJIJ.js";import{b as g}from"./runtime-chunk-CVUJ3GMH.js";import"./runtime-chunk-437VKY6M.js";import"./runtime-chunk-DMKAUMD7.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-XEXAWJME.js";import{$ as S,$a as V,$b as M,A as C,Aa as R,Ab as z,Ac as k,B as A,Ba as P,Bb as E,Bc as N,C as B,Ca as L,Cb as I,Cc as D,D as F,Da as U,Db as O,E as G,Ea 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 Ce,Oa as Re,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,Rb as Oe,Rc as Ge,S as qe,Sa as We,Sb as He,Sc as je,T as Ke,Ta as $e,Tc as Xe,U as Qe,Ua as Ze,V as Ye,Va as Je,Vb as et,W as tt,Wa as at,Wb as rt,X as st,Xa as it,Xb as nt,Y as lt,Ya as ot,Yb as ut,Z as dt,Za as ht,Zb as mt,_ as ct,_a as pt,_b as gt,aa as ft,ab as _t,ac as yt,b as xt,ba as vt,bb as bt,bc as Tt,c as wt,ca as St,cb as Vt,cc as Mt,d as Ct,da as Rt,db as zt,dc as kt,e as At,ea as Pt,eb as Et,ec as Nt,f as Bt,fa as Lt,fb as It,fc as Dt,g as Ft,ga as Ut,gb as Ot,gc as Gt,h as qt,ha as Wt,hb as Ht,hc as jt,i as Kt,ia as $t,ib as Xt,ic as Qt,j as Zt,ja as Yt,jb as Jt,jc as ea,k as ta,ka as aa,kb as ra,kc as sa,l as ia,la as na,lb as la,lc as oa,m as ua,ma as da,mb as ha,mc as ma,n as ca,na as pa,nb as ga,nc as fa,o as _a,oa as ya,ob as xa,oc as va,p as ba,pa as Ta,pb as wa,pc as Sa,q as Va,qa as Ma,qb as Ca,qc as Ra,r as za,ra as ka,rb as Aa,rc as Pa,s as Ea,sa as Na,sb as Ba,sc as La,t as Ia,ta as Da,tc as Fa,u as Ua,ua as Oa,ub as Ga,uc as qa,v as Wa,va as Ha,vb as ja,vc as Ka,w as $a,wa as Xa,wb as Qa,wc as Za,x as Ya,xa as Ja,xb as er,xc as tr,y as ar,ya as rr,yb as sr,yc as ir,z as nr,za as lr,zb as or,zc as ur}from"./runtime-chunk-GNCRONVM.js";import{a as dr}from"./runtime-chunk-GFTBNL2W.js";import{a as hr,b as mr,c as cr,d as pr,e as gr,f as fr,g as _r,h as yr,i as xr,j as vr}from"./runtime-chunk-NGTED3QN.js";import{a as br,b as Tr,e as wr,f as Sr}from"./runtime-chunk-KXSZSGYQ.js";import{a as Vr}from"./runtime-chunk-VHW3GBX4.js";import"./runtime-chunk-FVHYKE4I.js";import{a as Mr,b as Cr,c as Rr}from"./runtime-chunk-AIQQJ76T.js";import{a as zr,b as kr}from"./runtime-chunk-SOAE4CUG.js";import"./runtime-chunk-Q4ZYC44D.js";import"./runtime-chunk-TU4KDRKR.js";import"./runtime-chunk-QKE6PC2U.js";import{a as Ar}from"./runtime-chunk-NKMEWBWN.js";import"./runtime-chunk-OT65D5VY.js";import"./runtime-chunk-52ZGPCUJ.js";import"./runtime-chunk-GG5DCHW5.js";import"./runtime-chunk-PF6CS4BQ.js";import"./runtime-chunk-TUJ7GIEW.js";import{L as Pr,O as Er,Q as Nr,U as Br,V as Lr,W as Ir,Y as Dr,Z as Fr,_ as Ur,h as Or,k as Gr,l as qr,m as Wr}from"./runtime-chunk-QSE6KN7A.js";import"./runtime-chunk-4YV3EXSU.js";import"./runtime-chunk-NSD7DU3P.js";import"./runtime-chunk-OIFXPS5S.js";import"./runtime-chunk-RTLL6WIB.js";import"./runtime-chunk-2PT2WH66.js";import"./runtime-chunk-C6JZPJNZ.js";import"./runtime-chunk-TZCHGFVF.js";import{U as Hr,ca as jr,da as Kr,oa as $r,pa as Xr,qa as Qr,ra as Zr,w as Yr}from"./runtime-chunk-WKTS4T2Q.js";import{e as Jr,f as es}from"./runtime-chunk-EOV2DL2V.js";import{b as ts}from"./runtime-chunk-Y3BMDVJ7.js";import{Aa as as,Ba as rs,Bc as ss,Bd as is,Be as ns,Cc as ls,Cd as os,D as us,Dc as ds,Ec as hs,Fc as ms,Gc as cs,Hc as ps,Ib as gs,Ic as fs,Ja as _s,Jb as ys,Jc as xs,Kc as vs,Ma as bs,Me as Ts,Oa as ws,Oc as Ss,Pc as Vs,Tc as Ms,Y as Cs,Yc as Rs,Zc as zs,aa as ks,ca as As,da as Ps,dd as Es,g as Ns,id as Bs,j as Ls,k as Is,ka as Ds,l as Fs,la as Us,ld as Os,m as Gs,ma as qs,mc as Ws,n as Hs,na as js,nd as Ks,o as $s,p as Xs,pd as Qs,q as Zs,qa as Ys,r as Js,rd as ei,sa as ti,t as ai,ua as ri,ve as si,yd as ii,ye as ni,z as li,ze as oi}from"./runtime-chunk-BVVSZMXD.js";import"./runtime-chunk-ML3Z74BL.js";var ui=[[.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]],di=N(new Ms(1,1,1)).setGroup(mt),hi=N(.1).setGroup(mt),mi=N(2e3).setGroup(mt),ci=N(0).setGroup(mt),pi=N(new ms(.005,.01,0)).setGroup(mt),gi=le(([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=Nt(o.greaterThanEqual(0),R(1),R(-1)).mul(o.abs().max(1e-4));return l.mul(t).mul(R(1).sub(u.negate().exp())).div(u).max(0).negate().exp().oneMinus()}),fi=le(()=>{let e=Ee.sub(St).toVar(),t=e.length().max(1e-6);return gi(e,t,St,pi)}),_i=(()=>{let e=R(1).sub(va(.5,ci)).add(va(1.5,ci)),t=va(.5,ci),a=R(1).sub(R(1).sub(rt(hi,mi).mul(e)).mul(R(1).sub(fi().mul(t))));return L(di,a)})();function yi(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=_i);di.value.copy(a.color),hi.value=a.near,mi.value=a.far,ci.value=$r.getModeIndex({mode:e.fogMode}),pi.value.set(e.fogDensity??$r.getDensity({}),e.fogHeightFalloff??$r.getHeightFalloff({}),e.fogHeightBase??$r.getHeightBase({}))}else if(null===t)for(let e of r)e?.fogNode&&(e.fogNode=null)}var xi=e=>e,vi=e=>e,bi=e=>e,Ti=(e,t,a)=>P(e.add(.5).mul(t)).add(.5).div(a),wi=new $a,Si=new Ms,Vi=class{constructor(){this._gBuffer=null,this._aoBuffer=null,this._hbaoMaterial=null,this._resolveMaterial=null,this._boundBlueNoise=null,this._frameIndex=0,this._projectionMatrixInverse=N(new Ss),this._isOrtho=N(0),this._resolution=N(new ds(1,1)),this._fullResolution=N(new ds(1,1)),this._radiusOfInfluence=N(128),this._radiusInScreenSpace=N(1),this._exponent=N(1),this._aoColor=N(new Ms(0,0,0)),this._bias=N(.5),this._frame=N(0),this._fogEnabled=N(0),this._fogNear=N(1),this._fogFar=N(1e3),this._fogMode=N(0),this._fogHeightParams=N(new ms(.005,.01,0)),this._cameraWorldMatrix=N(new Ss);let e=new Ct;e.name="SplineHBAO.gbuffer",e.side=Fs,e.fragmentNode=pe(Qa.mul(lr),1),e.lights=!1,e.blending=Gs,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=qa(this._gBuffer.depthTexture),r=qa(this._gBuffer.texture),s=qa(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)=>se(e,t,i),S=e=>w(e,T(e)),V=le(()=>{let e=$().toVar(),t=l,a=o,i=P(e.mul(t)).toVar(),V=a.div(t).toVar(),C=Ti(i,V,a).toVar(),z=T(C).toVar(),k=w(C,z).toVar(),A=or(r.sample(C).xyz).toVar(),E=It(d.div(Xt(k.z.negate(),R(1),n)),R(5)).toVar(),N=Je(Pe(Mt.xy.x).bitAnd(Pe(127)),Pe(Mt.xy.y).bitAnd(Pe(127))),B=s.load(N).xyz.x,L=U(B.add(R(.61803398875).mul(p))).mul(6.283),I=pa(L).toVar(),D=ea(L).toVar(),F=E.div(5).toVar(),O=R(0).toVar();for(let e=0;e<4;e++){let t=F.add(1).toVar();for(let r=0;r<4;r++){let[s,n]=ui[4*e+r],l=ne(I.mul(s).sub(D.mul(n)),D.mul(s).add(I.mul(n))),o=vi(i.add(M(l.mul(t)))).toVar(),d=bi(S(Ti(o,V,a))).toVar();t.addAssign(F);let h=bi(d.sub(k)).toVar(),m=xi(h.dot(h)).toVar(),p=fa(m),g=xi(A.dot(h)).div(It(p,R(1e-4))),f=m.mul(R(-1).div(u.mul(u))).add(1);O.addAssign(Wt(g.sub(c),0,1).mul(Wt(f,0,1)))}}let G=R(1).div(R(1).sub(c));O.mulAssign(G.div(16));let q=Wt(R(1).sub(O.mul(2)),0,1),W=Ie(q,h).toVar(),H=b?z.lessThanEqual(0):z.greaterThanEqual(1);W.assign(H.select(R(1),W));let j=de(Xt(m,de(1),W)).toVar(),K=sa(f,_,k.z.negate()),X=v.mul(pe(k,1)).xyz,Q=v.mul(pe(0,0,0,1)).xyz,Z=X.sub(Q).toVar(),Y=gi(Z,Z.length().max(1e-6),Q,x),J=y,ee=R(1).sub(va(.5,J)).add(va(1.5,J)),te=va(.5,J),ae=R(1).sub(R(1).sub(K.mul(ee)).mul(R(1).sub(Y.mul(te)))).mul(g);return j.assign(Xt(j,de(1),ae)),pe(j,1)}),C=new Ct;return C.name="SplineHBAO.hbao",C.colorNode=V(),C.depthTest=!1,C.depthWrite=!1,C.blending=Gs,C.needsUpdate=!0,C}_buildResolveMaterial(){let e=qa(this._aoBuffer.texture),t=qa(this._gBuffer.depthTexture),a=this._resolution,r=this._fullResolution,s=le(()=>{let s=$().toVar(),i=a,n=r,l=ne(R(1).div(i.x),R(1).div(i.y)).toVar(),o=s.sub(l.mul(.5)).toVar(),u=o.add(ne(l.x,0)).toVar(),d=o.add(ne(0,l.y)).toVar(),h=o.add(l).toVar(),m=t.sample(s).toVar(),c=n.div(i).toVar(),p=e=>t.sample(Ti(e,c,n)),g=P(o.mul(i)).toVar(),f=m.sub(p(g)).abs().toVar(),_=m.sub(p(g.add(ne(1,0)))).abs().toVar(),y=m.sub(p(g.add(ne(0,1)))).abs().toVar(),x=m.sub(p(g.add(ne(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 Ct;return i.name="SplineHBAO.resolve",i.colorNode=s(),i.depthTest=!1,i.depthWrite=!1,i.blending=Gs,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 vs(n,l,{type:rs,depthTexture:new os(n,l),minFilter:Ys,magFilter:Ys}));if(this._gBuffer=c.target,m=m||c.changed,o){let e=this._ensureTarget(this._aoBuffer,d,h,()=>new vs(d,h,{minFilter:Ys,magFilter:Ys,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(Si),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,wi.material=this._hbaoMaterial,wi.name="SplineHBAO.hbao",y.setRenderTarget(o?this._aoBuffer:i),wi.render(e),o&&(wi.material=this._resolveMaterial,wi.name="SplineHBAO.resolve",y.setRenderTarget(i),wi.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}},Mi={texture:null,version:0,rotation:new Vs,quality:"full"},Ci=new Set;function Ri(e){let t=Mi.texture,a=e.lights&&"physical"===e.category&&null!==t&&("full"===Mi.quality||!1!==e.envReflectiveInLow?.()),r=e.envNode instanceof Ai;a?(!r||e.envNode.sourceTexture!==t)&&(e.envNode=new Ai(t),e.needsUpdate=!0):r&&(e.envNode=null,e.needsUpdate=!0)}var zi=new WeakMap;function ki(e,t){let a=null;return{getUV:()=>{if(null===a){let r=ze.negate().reflect(t);r=He(e).mix(r,t),r=r.normalize(),a=r.transformDirection(Ut)}return a},getTextureLevel:()=>e}}var Ai=class extends _a{constructor(e){super(null),this.sourceTexture=e}static get type(){return"SplineEnvironmentNode"}setup(e){let t=function(e){let t=zi.get(e);return void 0===t&&(t=ue(e),zi.set(e,t)),t}(this.sourceTexture),a=e.context,r=t.context(ki(gt,Qa)).mul(Et);a.radiance.addAssign(new wt(r));let s=t.context({getUV:()=>er,getTextureLevel:()=>R(1)}).mul(Math.PI).mul(Et);a.iblIrradiance.addAssign(new wt(s));let i=a.lightingModel?.clearcoatRadiance;if(i){let e=t.context(ki(aa,Yt)).mul(Et);i.addAssign(new wt(e))}return null}},Pi=class extends si{},Ei=class extends A{static get type(){return"SplineSkyHemisphereLightNode"}setup(e){return e.material?.envNode instanceof Ai?null:super.setup(e)}},Ni=e=>e,Bi=e=>e,Li=e=>e,Ii=e=>e,Di=.25,Fi=256/(2*Math.PI),Ui=(e,t,a,r,s)=>{let i=de(0).toVar();return he(r.lessThan(.5),()=>{i.assign(e.sample(t).level(s).rgb)}).Else(()=>{let r=de(0).toVar(),n=R(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=Li(Ii(e.sample(ne(Ni(t.x).add(a.mul(u)),Ni(t.y).add(a.mul(d)))).level(s)).rgb);r.addAssign(m.mul(h)),n.addAssign(R(h))}i.assign(r.div(n))}),i},Oi=(e,t,a,r)=>{let s=pe(t.mul(2).sub(1),R(1).sub(a).mul(2).sub(1),r,1),i=e.mul(s).toVar();return i.xyz.div(i.w)},Gi=(e,t,a,r)=>{let s=w.reflectionEnvEnabled,i=w.reflectionMissColor,n=a.greaterThan(.05),l=r??Nt(n,R(.6),R(1)),o=Qe(t.z,t.x).div(2*Math.PI).add(.5),u=Ke(Wt(t.y,R(-1),R(1))).div(Math.PI).add(.5),d=Ht(V(a.mul(l).mul(Di*Fi).add(1)),R(8)),h=e.sample(ne(o,u)).level(d).rgb;return Nt(s.greaterThan(.5),h,i)},qi=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=Nt(y,de(0,0,-1),or(a.originView)).toVar(),v=a.normalV.toVar(),b=nt(x,v).toVar(),T=Wt(i.mul(.1),R(0),R(1)).toVar(),S=w.resolution,M=T.greaterThan(.05),C=e.singleRay?R(1):Nt(M,R(.6),R(1)),z=(e,t,s,i)=>{let l=or(ir(e,r.worldMatrix)).toVar(),h=R(1).sub(sa(R(.85),R(.99),e.z)).toVar(),x=a.originView.toVar(),b=x.z.negate().max(r.near).toVar(),w=R(b.mul(10)).toVar();he(e.z.greaterThan(1e-5),()=>{let t=r.near.negate().sub(x.z).div(e.z);w.assign(Ht(w,t.mul(.95).max(1e-4)))});let M,z=x.add(e.mul(w)).toVar(),k=de(a.screenUv,a.fragWindowZ).toVar(),A=(e=>{let t=r.projectionMatrix.mul(pe(e,1)).toVar(),a=t.xyz.div(t.w);return de(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5),a.z)})(z).toVar(),P=T.mul(S.y).mul(.075).toVar();if(i){let e=P.mul(g.y.div(S.y)).toVar(),t=Ht(R(.8),R(12).div(e.max(.001))).toVar();i.assign(e.mul(t)),M=R(1).sub(t.mul(t)).max(0).sqrt().toVar()}let E=A.sub(k).toVar(),N=It(E.xy.length(),R(1e-5)).toVar(),B=R(0).toVar(),L=de(0).toVar(),I=()=>{let e=f.sub(1).toVar(),a=Pe(1).toVar(),r=Pe(0).toVar(),s=(e,t)=>Ht(e,t),i=E,l=i.div(i.z).toVar(),o=de(k).toVar(),u=ne(Nt(i.x.greaterThanEqual(0),R(1),R(-1)),Nt(i.y.greaterThanEqual(0),R(1),R(-1))).toVar(),d=u.mul(1e-5).toVar();u.assign(Wt(u,ne(0),ne(1)));let h=e=>ne(Za(m,e)),c=(e,t)=>e.mul(t).floor(),p=(e,t,a)=>{let r=ne(1).div(a),s=t.div(a).add(r.mul(u)).sub(e.xy).div(i.xy).toVar(),n=e.add(i.mul(Ht(s.x,s.y))).toVar();return n.xy.addAssign(Nt(s.x.lessThan(s.y),ne(d.x,0),ne(0,d.y))),n},y=h(a),x=c(o.xy,y);o.assign(p(o,x,y)),ge(256,()=>{he(a.lessThan(Pe(0)).or(r.greaterThanEqual(t)),()=>{J()});let u=h(a).toVar(),d=c(o.xy,u).toVar(),m=_(Je(Pe(d.x),Pe(d.y)),a).toVar(),g=de(o).toVar();he(i.z.greaterThan(0),()=>{let t=m.sub(o.z).toVar();he(t.greaterThan(0),()=>{g.assign(o.add(l.mul(t)))});let r=c(g.xy,u).toVar();he(((e,t)=>Pe(e.x).notEqual(Pe(t.x)).or(Pe(e.y).notEqual(Pe(t.y))))(d,r),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Pe(2))))}).Else(()=>{he(a.equal(Pe(1)).and(t.abs().greaterThan(n)),()=>{g.assign(p(o,d,u)),a.assign(Pe(2))})})}).Else(()=>{he(o.z.lessThan(m),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Pe(2))))})}),o.assign(g),a.subAssign(Pe(1)),r.addAssign(Pe(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));he(a.lessThan(Pe(0)).and(r.lessThan(t)).and(v),()=>{B.assign(1),L.assign(o);let e=o.xy.sub(k.xy).length().div(N).clamp(0,1),t=e.sub(R(2).div(g.y).div(N)).max(0),a=de(k.add(E.mul(t))).toVar(),r=de(k.add(E.mul(e))).toVar(),s=de(r).toVar();for(let e=0;e<4;e++){s.assign(Xt(a,r,.5));let e=Ni(_(Je(Bi(s.xy).mul(g)),Pe(0)));he(s.z.sub(e).greaterThan(0),()=>{r.assign(s)}).Else(()=>{a.assign(s)})}L.assign(s)})},D=()=>{let e=It(o,R(1e-4)),a=R(e).toVar(),r=de(k).toVar(),s=de(k).toVar(),i=R(-1).toVar();ge(256,({i:l})=>{he(l.greaterThanEqual(t),()=>{J()});let o=R(l).mul(a).div(N).toVar();he(o.greaterThan(1),()=>{J()}),s.assign(E.mul(o).add(k));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));he(u,()=>{J()});let d=_(Je(s.xy.mul(g)),Pe(0)).toVar(),h=s.z.sub(d).toVar();he(i.lessThanEqual(0).and(h.greaterThan(0)),()=>{let e=de(r).toVar(),t=de(s).toVar(),a=de(s).toVar(),i=R(h).toVar();for(let r=0;r<4;r++){a.assign(Xt(e,t,.5));let r=Ni(_(Je(Bi(a.xy).mul(g)),Pe(0)));i.assign(a.z.sub(r)),he(i.greaterThan(0),()=>{t.assign(a)}).Else(()=>{e.assign(a)})}he(i.abs().lessThan(n),()=>{B.assign(1),L.assign(a),J()})}),i.assign(h),r.assign(s),a.addAssign(e.div(2))})};he(h.greaterThan(0).and(p.not()),()=>{"number"==typeof u?1===u?I():D():he(u.greaterThan(.5),()=>{I()}).Else(()=>{D()})});let F=Gi(c,l,T,M).toVar(),U=de(F).toVar();return he(B.greaterThan(.5),()=>{let t=L.xy.sub(k.xy).length().div(N).clamp(0,1).toVar(),a=x.z.negate().max(1e-4).toVar(),n=z.z.negate().max(1e-4).toVar(),l=Xt(R(1).div(a),R(1).div(n),t).toVar(),o=Xt(x.div(a),z.div(n),t).div(l),u=Xt(x,z,t),m=Nt(y,u,o).toVar(),c=m.sub(x).length().toVar(),p=r.projectionMatrix.element(1).y.mul(S.y).mul(.5),w=Nt(y,R(1),m.z.abs().max(1e-4)),M=T.mul(C).mul(Di).mul(c).mul(p).div(w),A=It(M,P).toVar(),E=A.mul(g.y.div(S.y)).toVar(),B=E.toVar(),I=A.toVar();if(i){let e=Ht(R(.8),R(12).div(E.max(.001))).toVar();i.assign(E.mul(e)),B.assign(E.mul(R(1).sub(e.mul(e)).max(0).sqrt())),I.assign(B.mul(S.y.div(g.y)))}let D=R(f.sub(1)),O=Ht(V(B.add(1)),D),G=s?Ui(d,L.xy,I.mul(.75).div(S.y),B.mul(.75),O.sub(1).max(0).floor()).toVar():d.sample(L.xy).level(O).rgb.toVar(),q=e=>sa(R(0),R(.07),e).mul(sa(R(0),R(.07),R(1).sub(e))),W=q(L.x).mul(q(L.y)),H=L.xy.mul(g),j=_(Je(H),Pe(0)),K=Oi(r.projectionMatrixInverse,L.x,L.y,j).toVar(),$=Ha(K.sub(x),v),X=sa(b.mul(-.05),b.mul(-.005),$),Q=R(1).div(g.x),Z=R(1).div(g.y),Y=_(Je(H.sub(ne(1,0))),Pe(0)),J=_(Je(H.add(ne(1,0))),Pe(0)),ee=_(Je(H.sub(ne(0,1))),Pe(0)),te=_(Je(H.add(ne(0,1))),Pe(0)),ae=Oi(r.projectionMatrixInverse,L.x.sub(Q),L.y,Y),re=Oi(r.projectionMatrixInverse,L.x.add(Q),L.y,J),se=Oi(r.projectionMatrixInverse,L.x,L.y.sub(Z),ee),ie=Oi(r.projectionMatrixInverse,L.x,L.y.add(Z),te),le=or(ya(re.sub(ae),ie.sub(se))).toVar(),oe=Nt(le.z.lessThan(0),le.negate(),le),ue=sa(R(.02),R(.12),Ha(oe,e).negate()),de=h.mul(W).mul(X).mul(ue);U.assign(Xt(F,G,de))}),U};if(e.singleRay)return z(b,l,!0,e.singleRay.footprintOut).toVar();let k=e.noisePixel,A=U(R(52.9829189).mul(U(k.x.mul(.06711056).add(k.y.mul(.00583715))))).mul(2*Math.PI).toVar(),P=Nt(b.y.abs().greaterThan(.99),de(1,0,0),de(0,1,0)),E=or(ya(P,b)).toVar(),N=ya(b,E).toVar(),B=(e,t=4)=>{let a=T.mul(Di*Math.sqrt((e+.5)/t)),r=A.add(2.399963229728653*e);return or(b.mul(pa(a)).add(E.mul(pa(r)).add(N.mul(ea(r))).mul(ea(a)))).toVar()},L=M.and(p.not()),I=Nt(L,B(0),b).toVar(),D=de(0).toVar();D.addAssign(z(I,l,!0));let F=R(1).toVar();return he(L,()=>{D.addAssign(z(B(2),l,!1)),F.assign(2),he(T.greaterThan(.35),()=>{D.addAssign(z(B(1),l,!1)),D.addAssign(z(B(3),l,!1)),F.assign(4)})}),D.div(F).toVar()},Wi=new ds,Hi=class extends ss{constructor(e){super(),this.postprocessingState=Qr.defaultData,this.sceneTransitionPass={uniforms:{mixRatio:N(0),uDPR:{value:1},uResolution:{value:new ds}}},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 Ks,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 Ks(e,128,128);t.wrapS=Ds,t.wrapT=Ds,t.minFilter=js,t.magFilter=js,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=Hi.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=Hi._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(Wi);let e=Math.max(1,Math.round(Wi.x)),t=Math.max(1,Math.round(Wi.y));null===this._rt?this._rt=new vs(e,t,{depthBuffer:!0}):(this._rt.width!==e||this._rt.height!==t)&&(this._rt.dispose(),this._rt=new vs(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":null!==this.sceneTransitionFromTexture&&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),null!==this._chainTransitionTexture&&null===this.sceneTransitionFromTexture&&(this.sceneTransitionPass.uniforms.mixRatio.value=1);let e=a.temporalAAEnabled?a.taaHistory:null;e&&(a.getDrawingBufferSize(Wi),e.beginJitter(t,Wi.x,Wi.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 xs?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 xs?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()}},ji=Hi;ji.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 Ki=(()=>{try{return"1"===new URLSearchParams(window.location.search).get("dbgdestroys")}catch{return!1}})(),$i=[],Xi=6,Qi=()=>-1,Zi=!1,Yi=null;function Ji(e,t,a){$i.push({t:Math.round(performance.now()),frame:Qi(),kind:e,label:t||"(unlabeled)",size:a,stack:((new Error).stack??"").split("\n").slice(2,9).join("\n")}),$i.length>32&&$i.shift()}var en=(e,t)=>({start:Pe(0),end:Pe(t),type:"int",condition:"<",name:e}),tn=Wt;function an(e,t){let a=new vs(e,t,{depthBuffer:!1,type:as,format:ws});return a.texture.generateMipmaps=!1,a.texture.minFilter=js,a.texture.magFilter=js,a}var rn=null;function sn(){return null===rn&&((rn=an(64,8)).texture.name="SplinePCSSPyramidAtlas"),rn.texture}function nn(e,t,a,r,s,i){let n=new Ct,l=qa(t),o=le(()=>{let e=Mt,t=0!==i?e.x.sub(i):e.x,n=Pe(t).mul(a).toVar(),o=Pe(e.y).mul(a).toVar(),u=R(1e9).toVar(),d=R(-1e9).toVar();return ge(en("ly",a),en("lx",a),e=>{let{lx:t,ly:a}=e,i=tn(n.add(t),Pe(0),Pe(r)),h=tn(o.add(a),Pe(0),Pe(r)),m=l.load(Je(i,h));u.assign(Ht(u,m.x)),d.assign(It(d,s?m.y:m.x))}),pe(u,d,0,1)})();return n.fragmentNode=o,n.name=e,n.lights=!1,n.blending=Gs,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,n}var ln=new Set;function on(e){let t=e;if(!t.__spePcssPyramid){t.__spePcssPyramid={fresh:!1,slot:-1,passKey:"",mid:null,small:null,toMid:null,toSmall:null};for(let e of ln)void 0===e.deref()&&ln.delete(e);ln.add(new WeakRef(t.__spePcssPyramid))}return t.__spePcssPyramid}var un=new Array(8).fill(null);function dn(e){return!0===e.__spePcssPyramid?.fresh}function hn(e){return e.__spePcssPyramid?.slot??-1}var mn=!1;var cn=new ms,pn=e=>e,gn=e=>e,fn=e=>e,_n=!0,yn=!0,xn=!0,vn=!0;try{let e=new URLSearchParams(window.location.search),t=e.get("dbgpcss");"classic"===t||"0"===t?(_n=!1,yn=!1,xn=!1,vn=!1):(_n="0"!==e.get("dbgpcsssplit"),yn="0"!==e.get("dbgpcsshw"),xn="0"!==e.get("dbgpcsshiz"),vn="0"!==e.get("dbgshadowmask"))}catch{}var bn=!1,Tn=()=>yn&&bn,wn=()=>xn&&bn,Sn=()=>vn&&bn,Vn=()=>wn(),Mn=()=>Sn(),Cn=[[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 zn(e){let t=e;return t.__spePcssKnobs||(t.__spePcssKnobs={mapSize:N(2048),radius:N(1),penumbraSize:N(.5),depthEps:N(1e-4),penumbraFrameScale:N(1),penumbraFrameOffset:N(0),pyramidEnabled:N(0),pyramidSlot:N(0),maskChannel:N(new xs(0,0,0,0)),planeNormalMat:N((new cs).set(0,0,0,0,0,0,0,0,0))}),t.__spePcssKnobs}function kn(e,t){zn(e).maskChannel.value.set(0===t?1:0,1===t?1:0,2===t?1:0,3===t?1:0)}function An(e,t,a){let r=e,s=zn(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&&wn()){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 Pn(e,t){let a=e.planeNormalMat.mul(t).toVar(),r=a.z,s=Qt(r).add(va(Be(r),R(0))).mul(It(Be(r),R(1e-4)));return ne(a.x.negate().div(s),a.y.div(s)).toVar()}var En=(e,t)=>Wt(Ha(e,t),R(-.05),R(.05));function Nn(e,t,a,r,s,i,n){let l=Tn()?Math.max(4,Rn>>1):Rn,o=_n?Math.max(4,Rn>>1):Rn,u=Tn(),d=zn(t),h=d.mapSize,m=ne(h,h),c=d.radius,p=d.penumbraSize,g=qa(e),f=e=>g.load(Je(Wt(e,ne(0),ne(1)).mul(m))).x,_=R(1).div(m.x).toVar(),y=R(80).div(_.mul(1024)).toVar(),x=d.depthEps,v=Pn(d,n),b=()=>{let t=R(0).toVar(),n=R(0).toVar();for(let e=0;e<o;e++){let i=gn(ee(Pe(e),Pe(o),s)).mul(_).mul(y),l=f(gn(a.add(i))).toVar();he(l.lessThan(r.add(En(v,i)).add(x)),()=>{t.addAssign(l),n.addAssign(1)})}let h=R(0).toVar();he(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(Wt(i.mul(i).mul(200).mul(p),R(0),R(1)))});let m=R(0).toVar();for(let t=0;t<l;t++){let i=gn(ee(Pe(t),Pe(l),s)).mul(_),n=gn(i.mul(c.mul(2)).add(i.mul(h.mul(y)))),o=pn(r.add(En(v,n)));u?m.addAssign(pn(qa(e,gn(a.add(n))).compare(o))):m.addAssign(va(o,f(gn(a.add(n)))))}i.assign(m.div(l))};if(wn()){let e=qa(sn()),t=d.pyramidEnabled,s=d.pyramidSlot,n=R(8),l=R(0).toVar();he(t.greaterThan(.5),()=>{let t=Wt(a,ne(0),ne(1)),i=t.x.mul(n).toVar(),o=t.y.mul(n).toVar(),u=s.mul(n),d=R(1e9).toVar(),h=R(-1e9).toVar();for(let t=-1;t<=1;t++)for(let a=-1;a<=1;a++){let r=Wt(i.add(R(a)),R(0),n.sub(1)),s=Wt(o.add(R(t)),R(0),n.sub(1)),l=gn(ne(r.add(u),s)),m=e.load(Je(l));d.assign(Ht(d,pn(m.x))),h.assign(It(h,pn(m.y)))}let m=_.mul(c.mul(2).add(y)),p=Ht(it(v).mul(m),R(.05)).toVar();he(d.greaterThanEqual(r.add(x).add(p)),()=>{l.assign(1)}).ElseIf(h.lessThan(r.sub(p)),()=>{l.assign(2)})}),he(l.equal(1),()=>{i.assign(1)}).ElseIf(l.equal(2),()=>{i.assign(0)}).Else(b)}else b()}var Bn=le(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=zn(r),i=a.xy.toVar(),n=a.z.toVar(),l=er.toVar(),o=w.pcssHalton,u=Q(Mt.xy.add(o)).mul(6.28318530718).toVar(),d=R(1).toVar();if(Sn()){let e=s.maskChannel,a=w.shadowMaskEnabled,o=w.shadowMaskGBuffer,h=w.shadowMaskTexture,m=R(0).toVar(),c=R(1).toVar();he(a.greaterThan(.5).and(Ha(e,pe(1,1,1,1)).greaterThan(.5)),()=>{let t=kt,a=w.shadowMaskResolution,r=w.shadowMaskFullResolution,s=Ve.z,i=t.mul(a).sub(ne(.5,.5)).toVar(),n=P(i).toVar(),l=i.sub(n).toVar(),u=It(Be(s).mul(.02),R(.05)),d=R(0).toVar(),p=R(0).toVar();for(let t=0;t<=1;t++)for(let i=0;i<=1;i++){let m=gn(Wt(n.add(ne(i,t)),ne(0,0),a.sub(ne(1,1)))),c=gn(m.add(ne(.5,.5)).div(a)),g=gn(P(c.mul(r)).add(ne(.5,.5)).div(r)),f=pn(o.sample(g).w),_=pn(Ha(h.sample(c),e)),y=pn(0===i?R(1).sub(l.x):pn(l.x)),x=pn(0===t?R(1).sub(l.y):pn(l.y)),v=pn(va(Be(f.sub(s)),u)),b=pn(y.mul(x).mul(v)).toVar();d.addAssign(b),p.addAssign(_.mul(b))}he(d.greaterThan(.001),()=>{m.assign(1),c.assign(p.div(d))})}),he(m.greaterThan(.5),()=>{d.assign(c)}).Else(()=>{Nn(t,r,i,n,u,d,l)})}else Nn(t,r,i,n,u,d,l);return d}),Ln=le(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=zn(r),i=a.xy.toVar(),n=a.z.toVar(),l=Pn(s,er.toVar()),o=s.mapSize,u=s.radius.mul(R(1).div(o)).toVar(),d=Q(Mt.xy).mul(6.28318530718).toVar(),h=R(0).toVar();for(let e=0;e<5;e++){let a=gn(ee(Pe(e),Pe(5),d)).mul(u).toVar();h.addAssign(pn(qa(t,gn(i.add(a))).compare(n.add(En(l,a)))))}return h.mul(.2)}),In=le(e=>{let{depthTexture:t,bd3D:a,dp:r,shadow:s}=e,i=Rn,n=zn(s),l=n.mapSize,o=n.radius,u=R(1).div(l).toVar(),d=w.pcssHalton,h=Q(Mt.xy.add(d)).mul(6.28318530718).toVar(),m=o.add(5).toVar(),c=R(0).toVar();for(let e=0;e<i;e++){let s=gn(ee(Pe(e),Pe(i),h)).mul(u).toVar(),n=fn(de(s.x,s.y,pn(s.x).negate()).mul(m)),l=fn(a.add(n));c.addAssign(pn(Ta(t,l).compare(r)))}return c.div(i)});function Dn(e,t){let a=t;return a.isPointLight?(T.pcssHookServes++,Hn):a.isSpotLight||a.isDirectionalLight?(T.pcssHookServes++,Wn):null}var Fn=N(1);function Un(e){Fn.value=e?1:0}var On=(e,t)=>e(t),Gn=["depthTexture","shadowCoord","shadow","depthLayer","bd3D","dp"];function qn(e,t){return a=>{let r=function(e){let t=e,a={};if(null==t)return a;for(let e of Gn){let r=t[e];void 0!==r&&(a[e]=r)}return a}(a),s=On(e,r),i=On(t,r);return le(()=>{let e=R(1).toVar();return he(Fn.greaterThan(.5),()=>{e.assign(s)}).Else(()=>{e.assign(i)}),e})()}}var Wn=qn(Bn,Ln),Hn=qn(In,Ce),jn=new $a,Kn=new Ms,$n=new ds,Xn=class{constructor(){this._gBuffer=null,this._maskTarget=null,this._resolveMaterial=null,this._resolveKey="",this._cameraWorld=N(new Ss),this._projInv=N(new Ss),this._lightRows=[];let e=new Ct;e.name="SplineShadowMask.gbuffer",e.fragmentNode=pe(Qa,Ve.z),e.lights=!1,e.blending=Gs,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 Ct;t.name="SplineShadowMask.resolve";let a=qa(this._gBuffer.depthTexture),r=qa(this._gBuffer.texture),s=this._cameraWorld,i=this._projInv,n=this._gBuffer.width,l=this._gBuffer.height;this._lightRows=e.map(()=>({matrix:N(new Ss),bias:N(0),normalBias:N(0)}));let o=this._lightRows,u=le(()=>{let t=$(),u=P(t.mul(ne(n,l))).add(ne(.5,.5)).div(ne(n,l)).toVar(),d=a.sample(u),h=se(u,d,i).toVar(),m=r.sample(u).toVar(),c=s,p=c.mul(pe(h,1)).xyz.toVar(),g=or(c.mul(pe(m.xyz,0)).xyz).toVar(),f=w.pcssHalton,_=Q(Mt.xy.add(f)).mul(6.28318530718).toVar(),y=[R(1).toVar(),R(1).toVar(),R(1).toVar(),R(1).toVar()];return e.forEach((e,t)=>{let a=o[t],r=p.add(g.mul(a.normalBias)),s=a.matrix.mul(pe(r,1)).toVar(),i=s.xyz.div(s.w),n=de(i.x,R(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));he(u,()=>{Nn(e.shadow.map.depthTexture,e.shadow,n.xy,l,_,y[t],g)})}),pe(y[0],y[1],y[2],y[3])})();return t.fragmentNode=u,t.lights=!1,t.blending=Gs,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,t}render(e,t,a,r,s){let i=s??e.getDrawingBufferSize($n),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 vs(n,l,{type:rs,depthTexture:new os(n,l),minFilter:Ys,magFilter:Ys});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 vs(o,u,{depthBuffer:!1,minFilter:Ys,magFilter:Ys});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(Kn),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 jn.material=this._resolveMaterial,jn.name="SplineShadowMask.resolve",e.setRenderTarget(this._maskTarget),jn.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)=>{kn(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=""}},Qn=e=>e,Zn=e=>e,Yn=new $a,Jn=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 el(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 tl=Array.from({length:16},(e,t)=>[el(t+1,2),el(t+1,3)]),al="h16";try{let e=new URLSearchParams(window.location.search).get("dbgjitseq");("r2"===e||"h64"===e||"white"===e||"half"===e)&&(al=e)}catch{}function rl(e){return de(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 sl(e,t=!0){let a=de(e.x.add(e.y).sub(e.z),e.x.add(e.z),e.x.sub(e.y).sub(e.z));return t?Wt(a,de(0),de(1)):It(a,de(0))}var il=class extends xt{constructor(e,t,a,r,s=!1){super("vec4"),this._resolution=N(new ds(1,1)),this._historyValid=N(0),this._jitterUV=N(new ds(0,0)),this._resolveMaterials=null,this._rebuildResolveMaterials=null,this.beautyNode=e,this.depthNode=t,this.velocityNode=a,this._hdr=s,this._history=r??nl(),this._ownsHistory=void 0===r,this._outputTexNode=qa(this._history.rtA.texture)}static get type(){return"SplineTAANode"}get outputTextureNode(){return this._outputTexNode}renderResolve(e){ye.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&&(Yn.material=n,Yn.name="SplineTAA.resolve",Yn.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 pe(rl(t.rgb),t.a)},v=e=>{let c=le(()=>{let c=$().toVar();if(h)return pe(y.x.mul(400).add(.5),y.y.mul(400).add(.5),R(.5),R(1));let v=c,b=ne(R(1).div(f.x),R(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(ne(b.x.mul(e),b.y.mul(t))).toVar()),S=T,V=R(t?-1e3:1e3).toVar(),M=ne(T[4]).toVar();for(let e=0;e<9;e++){let a=Qn(g.load(Je(T[e].mul(Zn(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 C=p.load(Je(M.mul(f))).xy.mul(ne(.5,-.5)).toVar();s&&C.assign(ne(0,0));let z=c.sub(C).toVar(),k=a?ne(z.x,R(1).sub(z.y)).toVar():z,A=x(v).toVar();if(r)return pe(C.x.mul(20).add(.5),C.y.mul(20).add(.5),_,R(1));if(o){let e=new Ks(new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]),2,2);return e.needsUpdate=!0,qa(e).sample(c)}if(l){let t=a?ne(c.x,R(1).sub(c.y)):c;return e.sample(t)}if(n){let t=a?ne(c.x,R(1).sub(c.y)):c,r=e.sample(k),s=e.sample(t),i=A.x,n=e=>rl(e.rgb).x;return pe(n(r).sub(i).abs().mul(8),n(s).sub(i).abs().mul(8),R(0),R(1))}let E=k.mul(f).toVar(),N=P(E.sub(.5)).add(.5).toVar(),B=E.sub(N).toVar(),L=B.mul(B.mul(B.mul(-.5).add(1)).add(-.5)).toVar(),I=B.mul(B).mul(B.mul(1.5).add(-2.5)).add(1).toVar(),D=B.mul(B.mul(B.mul(-1.5).add(2)).add(.5)).toVar(),F=B.mul(B).mul(B.mul(.5).add(-.5)).toVar(),U=I.add(D).toVar(),O=D.div(U).toVar(),G=N.sub(1).div(f).toVar(),q=N.add(2).div(f).toVar(),W=N.add(O).div(f).toVar(),H=pe(0).toVar();H.addAssign(e.sample(ne(W.x,G.y)).mul(U.x.mul(L.y))),H.addAssign(e.sample(ne(G.x,W.y)).mul(L.x.mul(U.y))),H.addAssign(e.sample(ne(W.x,W.y)).mul(U.x.mul(U.y))),H.addAssign(e.sample(ne(q.x,W.y)).mul(F.x.mul(U.y))),H.addAssign(e.sample(ne(W.x,q.y)).mul(U.x.mul(F.y)));let j=pe(rl(H.rgb),H.a).toVar();if(m)return pe(sl(j.rgb).mul(de(1,.55,.55)),H.a);let K=x(S[0]).toVar(),X=x(S[1]).toVar(),Q=x(S[2]).toVar(),Z=x(S[3]).toVar(),Y=x(S[4]).toVar(),J=x(S[5]).toVar(),ee=x(S[6]).toVar(),te=x(S[7]).toVar(),ae=x(S[8]).toVar(),re=pe(Ht(K,Ht(X,Ht(Q,Ht(Z,Ht(Y,Ht(J,Ht(ee,Ht(te,ae))))))))).toVar(),se=pe(It(K,It(X,It(Q,It(Z,It(Y,It(J,It(ee,It(te,ae))))))))).toVar(),ie=pe(Ht(X,Ht(Z,Ht(Y,Ht(J,te))))).toVar(),le=pe(It(X,It(Z,It(Y,It(J,te))))).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=pe(i?j:Wt(j,re,se)).toVar(),me=d||i?R(.9):R(.9).mul(_),ce=pe(Xt(A,he,me)).toVar(),ge=w.tapAngle,fe=et(c.mul(f).add(ne(ge.mul(127.1),ge.mul(311.7)))).sub(.5).mul(1/255);return pe(sl(ce.rgb,!this._hdr).add(de(fe)),ce.a)}),v=new Ct;return v.name="SplineTAA.resolve",v.colorNode=c(),v.depthTest=!1,v.depthWrite=!1,v.blending=Gs,v.needsUpdate=!0,v};return this._rebuildResolveMaterials=()=>{this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose()),this._resolveMaterials=[v(qa(this._history.rtB.texture)),v(qa(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),ye.setProjectionMatrix(null)}};function nl(){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 vs(e,t,{minFilter:Ys,magFilter:Ys,depthBuffer:!1});return a()?s.texture.type=rs: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 Ss,jitterOffsetUV:new ds(0,0),beginJitter(e,t,a){if(l)return;let r,s;if(l=!0,(null===n||n.cam!==e)&&(n?.clearViewOffset(),n=new Jn(e)),this.unjitteredProjection.copy(e.projectionMatrix),w.unjitteredProjection.value.copy(e.projectionMatrix),"r2"===al){let e=++this.jitterIndex;r=(.5+.7548776662466927*e)%1,s=(.5+.5698402909980532*e)%1}else if("white"===al)this.jitterIndex++,r=Math.random(),s=Math.random();else if("h64"===al)r=el(this.jitterIndex%64+1,2),s=el(this.jitterIndex%64+1,3),this.jitterIndex=(this.jitterIndex+1)%64;else if("half"===al){let[e,t]=tl[this.jitterIndex];r=.5+.5*(e-.5),s=.5+.5*(t-.5),this.jitterIndex=(this.jitterIndex+1)%tl.length}else[r,s]=tl[this.jitterIndex],this.jitterIndex=(this.jitterIndex+1)%tl.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 ll,ol=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}},ul=new $a,dl=new ds,hl=class extends xt{static get type(){return"SMAANode"}constructor(e){super("vec4"),this.textureNode=e,this.updateBeforeType=xe.FRAME,this._renderTargetEdges=new vs(1,1,{depthBuffer:!1,type:rs}),this._renderTargetEdges.texture.name="SMAANode.edges",this._renderTargetWeights=new vs(1,1,{depthBuffer:!1,type:rs}),this._renderTargetWeights.texture.name="SMAANode.weights",this._renderTargetBlend=new vs(1,1,{depthBuffer:!1,type:rs}),this._renderTargetBlend.texture.name="SMAANode.blend";let t=this,a=new Image;a.crossOrigin="anonymous",a.src=ts("smaa-node-area.png"),a.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new fs,this._areaTexture.name="SMAANode.area",this._areaTexture.image=a,this._areaTexture.minFilter=Ys,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;let r=new Image;r.crossOrigin="anonymous",r.src=ts("smaa-node-search.png"),r.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new fs,this._searchTexture.name="SMAANode.search",this._searchTexture.image=r,this._searchTexture.magFilter=js,this._searchTexture.minFilter=js,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._invSize=N(new ds),this._areaTextureUniform=qa(this._areaTexture),this._searchTextureUniform=qa(this._searchTexture),this._edgesTextureUniform=qa(this._renderTargetEdges.texture),this._weightsTextureUniform=qa(this._renderTargetWeights.texture),this._materialEdges=new Ct,this._materialEdges.name="SMAANode.edges",this._materialWeights=new Ct,this._materialWeights.name="SMAANode.weights",this._materialBlend=new Ct,this._materialBlend.name="SMAANode.blend",this._textureNode=te(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;ll=Ya.resetRendererState(t,ll);let a=t.getDrawingBufferSize(dl);this.setSize(a.width,a.height),t.setRenderTarget(this._renderTargetEdges),ul.material=this._materialEdges,ul.render(t),t.setRenderTarget(this._renderTargetWeights),ul.material=this._materialWeights,ul.render(t),t.setRenderTarget(this._renderTargetBlend),ul.material=this._materialBlend,ul.render(t),Ya.restoreRendererState(t,ll)}setup(e){let t=ne(.00625,.0017857142857142857),a=1/7,r=this.textureNode.uvNode||$(),s=le(()=>{let e=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-1,0,0,-1))),t=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(1,0,0,1))),a=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-2,0,0,-2)));return ae("vec4","vOffset0").assign(e),ae("vec4","vOffset1").assign(t),ae("vec4","vOffset2").assign(a),ga}),i=le(()=>{let e=ae("vec4","vOffset0"),t=ae("vec4","vOffset1"),a=ae("vec4","vOffset2"),s=ne(.1,.1),i=pe().toVar(),n=this.textureNode.sample(r).rgb.toVar(),l=this.textureNode.sample(e.xy).rgb.toVar(),o=Be(n.sub(l));i.x=It(o.r,o.g,o.b);let u=this.textureNode.sample(e.zw).rgb.toVar();o=Be(n.sub(u)),i.y=It(o.r,o.g,o.b);let d=va(s,i.xy).toVar();Ha(d,ne(1,1)).equal(0).discard();let h=this.textureNode.sample(t.xy).rgb.toVar();o=Be(n.sub(h)),i.z=It(o.r,o.g,o.b);let m=this.textureNode.sample(t.zw).rgb.toVar();o=Be(n.sub(m)),i.w=It(o.r,o.g,o.b);let c=It(i.x,i.y,i.z,i.w).toVar(),p=this.textureNode.sample(a.xy).rgb.toVar();o=Be(n.sub(p)),i.z=It(o.r,o.g,o.b);let g=this.textureNode.sample(a.zw).rgb.toVar();return o=Be(n.sub(g)),i.w=It(o.r,o.g,o.b),c=It(c,i.z,i.w),d.xy.mulAssign(ne(va(R(.5).mul(c),i.xy))),pe(d,0,0)}),n=le(([e,t,a,r])=>{let s=ne(t).toVar();return s.r=a.add(s.r.mul(r)),R(255).mul(e.sample(s)).r}),l=le(([e,r,s,i,n])=>{let l=R(16).mul(R(4).mul(ne(s,i)).round()).add(r);return l=t.mul(l).add(R(.5).mul(t)),l.y.addAssign(R(a).mul(n)),e.sample(l).rg}),o=le(([e,t,a,r])=>{let s=ne(0,1).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(ne(2,0).mul(this._invSize)),he(i.x.lessThanEqual(r).or(s.g.lessThanEqual(R(.8281)).or(s.r.notEqual(R(0)))),()=>{J()})}),i.x.addAssign(R(.25).mul(this._invSize.x)),i.x.addAssign(this._invSize.x),i.x.addAssign(R(2).mul(this._invSize.x)),i.x.subAssign(this._invSize.x.mul(n(t,s,0,.5))),i.x}),u=le(([e,t,a,r])=>{let s=ne(0,1).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(ne(2,0).mul(this._invSize)),he(i.x.greaterThanEqual(r).or(s.g.lessThanEqual(R(.8281)).or(s.r.notEqual(R(0)))),()=>{J()})}),i.x.subAssign(R(.25).mul(this._invSize.x)),i.x.subAssign(this._invSize.x),i.x.subAssign(R(2).mul(this._invSize.x)),i.x.addAssign(this._invSize.x.mul(n(t,s,.5,.5))),i.x}),d=le(([e,t,a,r])=>{let s=ne(1,0).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(ne(0,-2).mul(this._invSize)),he(i.y.lessThanEqual(r).or(s.r.lessThanEqual(R(.8281)).or(s.g.notEqual(R(0)))),()=>{J()})}),i.y.addAssign(R(.25).mul(this._invSize.y)),i.y.addAssign(this._invSize.y),i.y.addAssign(R(2).mul(this._invSize.y)),i.y.subAssign(this._invSize.y.mul(n(t,s.gr,0,.5))),i.y}),h=le(([e,t,a,r])=>{let s=ne(1,0).toVar(),i=ne(a).toVar();return ge({start:Pe(0),end:Pe(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(ne(0,-2).mul(this._invSize)),he(i.y.greaterThanEqual(r).or(s.r.lessThanEqual(R(.8281)).or(s.g.notEqual(R(0)))),()=>{J()})}),i.y.subAssign(R(.25).mul(this._invSize.y)),i.y.subAssign(this._invSize.y),i.y.subAssign(R(2).mul(this._invSize.y)),i.y.addAssign(this._invSize.y.mul(n(t,s.gr,.5,.5))),i.y}),m=le(()=>{let e=r.xy.div(this._invSize),t=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-.25,-.125,1.25,-.125))).toVar(),a=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(-.125,-.25,-.125,1.25))).toVar(),s=pe(t.xz,a.yw).add(pe(-2,2,-2,2).mul(pe(this._invSize.xx,this._invSize.yy)).mul(R(8))).toVar();return ae("vec2","vPixcoord").assign(e),ae("vec4","vOffset0").assign(t),ae("vec4","vOffset1").assign(a),ae("vec4","vOffset2").assign(s),ga}),c=le(()=>{let e=ae("vec2","vPixcoord"),t=ae("vec4","vOffset0"),a=ae("vec4","vOffset1"),s=ae("vec4","vOffset2"),i=pe(0,0,0,0).toVar(),n=pe(0,0,0,0).toVar(),m=this._edgesTextureUniform.sample(r).rg.toVar();return he(m.g.greaterThan(R(0)),()=>{let r=ne().toVar(),d=ne().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=ne().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=fa(Be(r)),p=this._edgesTextureUniform.sample(m.add(ne(1,0).mul(this._invSize))).r.toVar();i.r=p,i.rg=l(this._areaTextureUniform,c,h,p,R(n.y))}),he(m.r.greaterThan(R(0)),()=>{let r=ne().toVar(),o=ne().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=ne().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=fa(Be(r)),p=this._edgesTextureUniform.sample(m.add(ne(0,1).mul(this._invSize))).g.toVar();i.ba=l(this._areaTextureUniform,c,u,p,R(n.x))}),i}),p=le(()=>{let e=pe(r.xy,r.xy).add(pe(this._invSize.xy,this._invSize.xy).mul(pe(1,0,0,1)));return ae("vec4","vOffset1").assign(e),ga}),g=le(()=>{let e=ae("vec4","vOffset1"),t=pe().toVar(),a=pe().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,he(Ha(a,pe(1)).lessThan(1e-5),()=>{t.assign(this.textureNode.sample(r))}).Else(()=>{let e=ne().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()),he(Be(e.x).greaterThan(Be(e.y)),()=>{e.y.assign(0)}).Else(()=>{e.x.assign(0)});let s=this.textureNode.sample(r).toVar(),i=ne(r).toVar();i.addAssign(Qt(e).mul(this._invSize));let n=this.textureNode.sample(i).toVar(),l=Be(e.x).greaterThan(Be(e.y)).select(Be(e.x),Be(e.y)).toVar(),o=Xt(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""}},ml=new ds,cl=new Ms,pl=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 vs(e,t,{depthBuffer:!0,stencilBuffer:!1,samples:0});a.texture.name="SplineHelperOverlay.color",this._rt=a}if(null===this._texNode){this._texNode=qa(this._rt.texture),this._smaaNode=(r=this._texNode,new hl(da(r)));let e=new Ct;e.name="SplineHelperOverlayComposite",e.fragmentNode=this._smaaNode,e.transparent=!0,e.blending=Js,e.blendEquation=ai,e.blendSrc=li,e.blendDst=us,e.blendSrcAlpha=li,e.blendDstAlpha=us,e.depthTest=!1,e.depthWrite=!1,this._material=e,this._quad=new $a(e);let t=new Ct;t.name="SplineHelperOverlayDepthSeed",this._depthTexNode=qa(a),t.depthNode=this._depthTexNode.x,t.fragmentNode=pe(0),t.colorWrite=!1,t.depthTest=!1,t.depthWrite=!0,this._seedMaterial=t,this._seedQuad=new $a(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(ml);let i=this._ensureTarget(ml.x,ml.y,s),n=e.getRenderTarget(),l=e.autoClear;e.getClearColor(cl);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(cl,o),b()){let t=e.toneMapping,a=e.outputColorSpace;e.toneMapping=Cs,e.outputColorSpace=ps.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()}},gl=new WeakMap,fl=new Set,_l=0;var yl=new WeakMap,xl=new Set,vl=0;function bl(e){let t=e.parent?.selectedTexture;return t&&!0===t.isTexture?t:null}function Tl(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 wl=new WeakMap;function Sl(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=R(1).sub(R(1).sub(e).mul(R(1).sub(t))).toVec3();return Xt(e,a,s)}case 10:return Xt(e,e.mul(t),s);default:return Xt(e,t,s)}}var Vl=null;function Ml(){return null===Vl&&(Vl=Ca({output:O,velocity:ye})),Vl}var Cl=le(e=>{let t=e.lightDistance,a=e.cutoffDistance,r=e.decayExponent,s=a.greaterThan(0).and(r.greaterThan(0));return Nt(s,t.div(a).oneMinus().clamp().pow(r),R(1))}),Rl=class extends ar{static get type(){return"SplinePointLightNode"}setupDirect(e){let t=this.getLightVector(e),a=t.normalize(),r=Cl({lightDistance:t.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode});return{lightColor:this.colorNode.mul(r),lightDirection:a}}},zl=class extends B{static get type(){return"SplineSpotLightNode"}setupDirect(e){let t,a,r=this.light,s=this.getLightVector(e),i=s.normalize(),n=i.dot(ot(r)),l=this.getSpotAttenuation(e,n),o=Cl({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=qa(d.map,a.xy).onRenderUpdate(()=>d.map)),t&&a){let e=a.mul(2).sub(1).abs().lessThan(1).all();u=Nt(e,u.mul(t),u)}return{lightColor:u,lightDirection:i}}},kl=null,Al=new ms,Pl=new ms,El=new Ms,Nl=new Ms,Bl=new Ms,Ll=new ms,Il=new ms,Dl=new ds,Fl=new ms(1,0,0),Ul=new ms(0,1,0),Ol=new ms(0,0,1),Gl=new ms,ql=new ms,Wl=new ms,Hl=new ms,jl=new Ss,Kl=new ms,$l=new ms,Xl=new ei,Ql=new xs,Zl=new xs,Yl=new ds,Jl=new ds,eo=new ms,to=new ms,ao=new ms,ro=new ms,so=new ms,io=[],no=!1,lo=!1,oo=!1,uo="full",ho="g16",mo=!1,co=!1,po=!1,go="default",fo=!1,_o=!0,yo=!0,xo=!0,vo=!0,bo=!0,To=br;try{let e=new URLSearchParams(window.location.search),t=e.get("instancing");if(null!==t)if("off"===t||"0"===t||"false"===t||"no"===t)bo=!1;else{let e=Number.parseInt(t,10);Number.isFinite(e)&&e>1&&(To=e)}no="0"===e.get("dbgao"),lo="0"===e.get("dbgshadow"),oo="1"===e.get("dbgfp16"),mo="0"===e.get("dbgsky"),co="0"===e.get("dbgssr"),po="0"===e.get("dbgibl");let a=e.get("pbrcolor");"0"===a?go="off":("linear"===a||"aces"===a||"agx"===a||"neutral"===a)&&(go=a),fo="0"===e.get("dbgplanar"),_o="0"!==e.get("dbgplanarpyr"),yo="0"!==e.get("dbgssrpyr"),xo="0"!==e.get("dbgssrhalf"),vo="0"!==e.get("dbgssrresolve");let r=e.get("dbgprefilter");"0"===r?uo="off":"base"===r?uo="base":"k4"===r&&(ho="k4")}catch{}function wo(){return"function"!=typeof requestAnimationFrame||typeof document<"u"&&!0===document.hidden?Promise.resolve():new Promise(e=>{let t=!1,a=()=>{t||(t=!0,clearTimeout(r),e())},r=setTimeout(a,250);requestAnimationFrame(a)})}var So=class extends F{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:oo?rs:ri,asyncCompilation:!0===e.asyncCompilation||"load"===e.asyncCompilation}),this.viewportWidth=1,this.viewportHeight=1,this.resolution=new ds,this.dummyCamera=new Ar,this.sceneTransitionDuration=0,this.sceneTransitionTimeRemaining=-1,this.manageShadowUpdates=!1,this.forceShadowUpdates=!1,this._shadowMapMissingAtSync=!1,this._shadowSyncPromotions=-1,this._lightShadowStateDirty=!1,this._lightShadowSignatures=new WeakMap,this._shadowMapIds=new WeakMap,this._shadowMapIdSeq=0,this.temporalAAEnabled=!0,this.hdrChainActive=!1,this.isWebGPUSplineRenderer=!0,this.shadowFilterHook=Dn,this._gaugeSnapshot="",this._gaugeChangedAt=0,this._gaugeStallWarned=!1,this._skipStalls=new ol,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.suppressShadowMask=!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(),Ki&&function(){if(!Zi){if(Zi=!0,Qi=()=>w.frameIndex.value,typeof GPUBuffer<"u"){let e=GPUBuffer.prototype.destroy;GPUBuffer.prototype.destroy=function(){return Ji("buffer",this.label,this.size),e.call(this)}}if(typeof GPUTexture<"u"){let e=GPUTexture.prototype.destroy;GPUTexture.prototype.destroy=function(){return Ji("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 ji(this),this.library.addLight(Ei,Pi),this.shadowMap.enabled=!0,this.shadowMap.type=Ns,t=!0===this.backend?.isWebGPUBackend,bn=t,this._deferGpuBufferDestruction(),this.outputColorSpace=ys,this.toneMapping=Cs,function(e){let t=e.library;t.addLight(Rl,Vr),t.addLight(zl,kr),t.addLight(C,zr),t.lightNodes.delete(oi),t.lightNodes.delete(ni),t.addLight(Rl,oi),t.addLight(zl,ni)}(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>So._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 ${So._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=nl()),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 vs(2,2,{count:2});e.textures[0].name="output",e.textures[0].type=ri,e.textures[1].name="velocity",e.textures[1].type=rs;let t=new os(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 Sr?e.activePage:e;Un(Zr.isSoft(t?.data?.shadow)),t&&yi(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(Ml())),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(Ml())),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 Sr?e:e.scene;if(!0!==a.needsTransmission?.()&&!0!==a.needsReflection?.())return null;if(null===this._grabWarmupTarget){let e=new vs(2,2);e.texture.type=ri;let t=new os(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=yl.get(e);return a&&(a.epoch!==vl||a.srcMaterial!==t||a.geometry!==e.geometry||a.position.src!==e.geometry.getAttribute("position")||a.map!==t.map||a.selectedMap!==bl(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=bl(e),o=new Qs(r.array,3);o.setUsage(Ws);let u={src:r,attr:o,version:r.version},d=[],h=e=>{let t=new Qs(new Float32Array(e.count),1);t.setUsage(Ws);let a={src:e,attr:t,version:e.version};return Tl(a),d.push(a),a},m=s?h(s):null,c=i?h(i):null,p=new Ua;p.name=`SplinePointsTwin(${t.name||t.type})`,p.positionNode=Se(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?Se(m.attr,"float"):null,f=c?Se(c.attr,"float"):null;p.colorNode=le(()=>{null!==f?re(f.lessThan(.5)):null!==g&&re(g.greaterThan(.5));let e=null!==n?qa(n,$()):pe(1);return(null!==g&&null!==n&&null!==l?Xt(e,qa(l,$()),g):e).mul(pe(zt,1))})();let _=new Bs(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:vl};return xl.add(new WeakRef(y)),y}(e,t),yl.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&&(Tl(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=wl.get(e);return a&&(a.epoch!==vl||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 Qs(new Float32Array(e.count*t),t);a.setUsage(Ws);let r={src:e,attr:a,version:e.version};return Tl(r),r},i=s(a.getAttribute("position"),3),n=s(a.getAttribute("hover"),1),l=s(a.getAttribute("selected"),1),o=N(r.pointSize.value),u=N((new Ms).fromArray(r.color.value)),d=new Ua;d.name=`SplinePointsTwin(${t.name||t.type})`,d.positionNode=Se(i.attr,"vec3");let h=Se(n.attr,"float"),m=Se(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=le(()=>{let e=it($().mul(2).sub(1)).toVar();re(e.greaterThan(1));let t=Nt(m.equal(1),de(.22,.9,.7),u.add(h.mul(.25)));return pe(Nt(e.greaterThan(.75),de(1),t),1)})();let c=new Bs(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:vl};return xl.add(new WeakRef(p)),p}(e,t),wl.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&&(Tl(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=gl.get(e);if(!t||t.epoch!==_l){let a=new Ft;a.name=`SplineHelperTwin(${e.name||e.type})`,a.worldUnits=!1,t={twin:a,epoch:_l},gl.set(e,t),fl.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 pl),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=Z(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(Ml()),o=function(e,t,a,r,s=!1){return new il(e,t,a,r,s)}(n,s.getTextureNode("depth"),s.getTextureNode("velocity"),e.taaHistory,i),l=o,s.getTexture("velocity").type=rs;try{if("1"===new URLSearchParams(window.location.search).get("dbgvel")){let e=s.getTextureNode("velocity");l=pe(e.x.mul(20).add(.5),e.y.mul(20).add(.5),R(.5),R(1))}}catch{}}i?s.getTexture("output").type=rs:v()&&(s.getTexture("output").internalFormat="rgba8unorm-srgb");let u=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,d={bloomIntensity:N(1),caOffset:N(new ds(0,0)),vignetteOffset:N(0),vignetteDarkness:N(0),hue:N(0),saturationPlus1:N(1),brightness:N(0),bcContrastScale:N(1),dofFocusDistance:N(0),dofFocalLength:N(0),dofBokehScale:N(1),dofCameraNear:N(50),dofCameraFar:N(1e4),dofOrtho:N(0),pixelCells:N(new ds(1,1)),bloomOpacity:N(1),caOpacity:N(1),vignetteOpacity:N(1),noiseOpacity:N(1),hueSaturationOpacity:N(1),brightnessContrastOpacity:N(1),dofOpacity:N(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);let r=Math.min(u(e.brightnessContrast.contrast,0),.9999);d.bcContrastScale.value=r>0?1/(1-r):1+r,d.brightnessContrastOpacity.value=u(e.brightnessContrast.opacity,1);let s=t.camera,i=!0===s?.isPerspectiveCamera,n=u(s?.near,50),l=u(s?.far,1e4),o=l-n,h=u(e.depthOfField.focusDistance,0),m=i?h/2e3:(h+992)/2e3;d.dofFocusDistance.value=n+m*o,d.dofFocalLength.value=u(e.depthOfField.focalLength,0)/2e3*o,d.dofBokehScale.value=u(e.depthOfField.bokehScale,1),d.dofOpacity.value=u(e.depthOfField.opacity,1),d.dofCameraNear.value=n,d.dofCameraFar.value=l,d.dofOrtho.value=i?0:1;let c=a.resolution.x?a.resolution:new ds(a.viewportWidth*a.getPixelRatio(),a.viewportHeight*a.getPixelRatio()),p=Math.floor(u(e.pixelation.granularity,30));p%2>0&&(p+=1);let g=p>0;d.pixelCells.value.set(g?c.x/p:c.x,g?c.y/p:c.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(_($()));c=Xt(c,e.rgb,1),p=Xt(p,e.a,1)}let x=null;if(r&&a.bloom.enabled){let e=Jr("bloom");if(e){let t=a.bloom;x=e(o?o.outputTextureNode:n,{kernelSize:Xr(t.kernelSize),blurScale:u(t.blurScale,1),luminanceThreshold:u(t.luminanceThreshold,.9),luminanceSmoothing:u(t.luminanceSmoothing,.025)});let r=Wt(x.mul(d.bloomIntensity),0,1);c=Sl(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=R(1).sub(R(1).sub(e).mul(R(1).sub(t)));return Xt(e,a,s)}case 10:return Xt(e,e.mul(t),s);default:return Xt(e,t,s)}}(p,r.a,t.blendFunction,d.bloomOpacity)}else es("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=$().sub(.5),l=r.sample(s($().add(i.mul(t)))).r,o=r.sample(s($())).g,u=r.sample(s($().sub(i.mul(t)))).b;c=Sl(c,de(l,o,u),e.blendFunction,d.caOpacity)}if(r&&a.vignette.enabled){let e=a.vignette,t=it($().sub(.5)),r=sa(R(.8).mul(d.vignetteOffset),d.vignetteOffset.add(.799),t.mul(d.vignetteDarkness));c=Sl(c,c.mul(r.oneMinus()),e.blendFunction,d.vignetteOpacity)}if(r&&a.noise.enabled){let e=a.noise,t=U(ea(Ha($().add(U(tr)),ne(12.9898,78.233))).mul(43758.5453));c=Sl(c,de(t),e.blendFunction,d.noiseOpacity)}if(r&&a.hueSaturation.enabled){let e=a.hueSaturation,t=me(c,d.hue);t=Tt(t,d.saturationPlus1),c=Sl(c,t,e.blendFunction,d.hueSaturationOpacity)}if(r&&a.brightnessContrast.enabled){let e=a.brightnessContrast,t=c.add(de(d.brightness));t=t.sub(.5).mul(d.bcContrastScale).add(.5),c=Sl(c,t.min(1),e.blendFunction,d.brightnessContrastOpacity).max(0)}if(r&&a.depthOfField.enabled){let e=Jr("depthOfField");if(e){let t=a.depthOfField,r=s.getTextureNode("depth"),i=Xt(ie(r,d.dofCameraNear,d.dofCameraFar),I(r,d.dofCameraNear,d.dofCameraFar),d.dofOrtho);c=Sl(c,e(pe(c,p),i,d.dofFocusDistance,d.dofFocalLength,d.dofBokehScale).rgb,t.blendFunction,d.dofOpacity)}else es("depthOfField","webgpu")}let b=pe(c,p);if(t.uiOverlayEnabled&&t.uiCanvasTexture){let e=qa(t.uiCanvasTexture,$().flipY()),a=Xt(b.rgb,e.rgb,e.a),r=Wt(b.a.add(e.a),0,1);b=pe(a,r)}let T=t.sceneTransitionFromTexture;if(T){let e=qa(T,$()),a=t.sceneTransitionPass.uniforms.mixRatio;b=Xt(e,b,a)}let w=t.watermarkTexture;if(w){let t=w.image,a=t?.width||128,r=t?.height||32,s=new ds(e.viewportWidth*e.getPixelRatio(),e.viewportHeight*e.getPixelRatio()),i=12*e.getPixelRatio(),n=.5*a*e.getPixelRatio(),l=.5*r*e.getPixelRatio(),o=ne((s.x-n-i)/s.x,i/s.y),u=ne(n/s.x,l/s.y),d=$().flipY().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=Wt(d,0,1),c=qa(w,m),p=c.a.mul(h.select(R(1),R(0)));b=pe(Xt(b.rgb,c.rgb,p),Wt(b.a.add(p),0,1))}let S=new G(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(),(pr()?.drainRetired()??0)+(d()?.drainRetired()??0)>0&&this._retireBundleRecords(),Ki&&function(e){if(null==e||e===Yi)return;let t=e;"function"==typeof t.addEventListener&&(Yi=e,t.addEventListener("uncapturederror",e=>{let t=e?.error?.message??"";!t.toLowerCase().includes("destroyed")||Xi<=0||(Xi--,console.warn(`[spline/webgpu][dbgdestroys] submit rejected at frame ${Qi()} (t=${Math.round(performance.now())}ms):\n${t.slice(0,400)}\n— last ${$i.length} destroy() calls, newest last (a stack WITHOUT _disposeRetiredGrabTargets bypassed the deferral):`,$i.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 Sr?a.activePage:a,u=l.visible;l.visible=!0;let h=l.scene;if(yi(l),this.renderStarted=!0,bo&&a instanceof Sr){let e=a.updateInstanceGroups(l,To);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=mo?null:l.skyState;if(!0===m?.enabled){if(this.skyEnvironmentNeeded=!co&&(h.needsReflectionDirty||h.needsReflection())||!po&&!0===m.lighting,null===this._skySystem){let e=kl;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;!po&&!0===m?.enabled&&this._skySystem&&(c=this._skySystem.iblTexture??null,p=this._skySystem.iblRotationY??0),function(e){if(Mi.quality===e)return!1;Mi.quality=e;for(let e of Ci)Ri(e)}("low"===m?.lightingQuality?"low":"full"),function(e){if(Mi.texture===e)return!1;Mi.texture=e,Mi.version++;for(let e of Ci)Ri(e)}(c),Mi.rotation.set(0,-p,0),l.environmentIntensity=!0===m?.enabled?m.lightingIntensity??1:1;{let e="off"===go?null:l.gradingState,t="default"!==go&&"off"!==go,a=t||"linear"===e?.pipeline,r=t?"linear"===go?"none":go:e?.toneMapping??"aces";this.toneMapping=a?"aces"===r?ks:"agx"===r?As:"neutral"===r?Ps:Cs:Cs,this.toneMappingExposure=a?e?.exposure??1:1,this.outputColorSpace=a?gs:ys,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 _=Cn[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),this.sceneBundlesEnabled&&this._lightShadowStateDirty&&(this._lightShadowStateDirty=!1,this._updateSceneBundle(l,r)),w.unjitteredProjection.value.copy(r.projectionMatrix);let y=this.temporalAAEnabled?this.taaHistory:null;if(y){let e=this.getDrawingBufferSize(Jl);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?mr():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?wr:null,r.layers.enable(3),r.layers.enable(8),r.layers.enable(4);let b=l.data.ao,S=b.occlusion&&!no&&!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(!co&&h.needsReflection()?(this._renderReflectionPass(l,r),fo?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);if(this.pipeline.postprocessingState!==V&&this.pipeline.updatePostprocessing(V),this.pipeline.render(),y?.endJitter(),T.outputInterpositions=this._frameBufferTargets?.size??0,this.manageShadowUpdates){let e=(this._skippedAsyncDraws??0)>0&&!this._skipStalls.stalled,t=this.info.asyncCompilation?.promotions??0,a=t!==this._shadowSyncPromotions;this._shadowSyncPromotions=t,h.shadowsDirty=this._shadowMapMissingAtSync||this._warmupInFlight||e||a}r instanceof Ar&&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,ao.setFromMatrixPosition(e.matrixWorld),e.target?(e.target.updateMatrixWorld(),ro.setFromMatrixPosition(e.target.matrixWorld)):ro.set(0,0,0),so.subVectors(ro,ao),so.lengthSq()<1e-10)return;so.normalize();let l=1/0,o=-1/0;for(let e=0;e<a;e++){let a=4*e,r=(t[a]-ao.x)*so.x+(t[a+1]-ao.y)*so.y+(t[a+2]-ao.z)*so.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){a.getShadowBoundsCenter?a.getShadowBoundsCenter(eo):eo.setFromMatrixPosition(a.matrixWorld);let r=4*t;io[r]=eo.x,io[r+1]=eo.y,io[r+2]=eo.z,io[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;eo.copy(r.center).applyMatrix4(a.matrixWorld),to.setFromMatrixScale(a.matrixWorld);let i=r.radius*Math.max(Math.abs(to.x),Math.abs(to.y),Math.abs(to.z)),n=4*t;io[n]=eo.x,io[n+1]=eo.y,io[n+2]=eo.z,io[n+3]=i,t++}),t}_syncLightState(e){let t=Zr.isSoft(e.data.shadow);Un(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&&Vn()&&(mn||(this.initTexture?.(sn()),mn=!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;let u=-2128831035,d=e=>{u^=0|e,u=Math.imul(u,16777619)};e.traverseVisible(u=>{let h=u;if(a(h)&&(e.scene.shadowsDirty=!0),l&&(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&h.shadow&&(h.shadow.autoUpdate=o,o&&!0===h.castShadow&&null==h.shadow.map&&(this._shadowMapMissingAtSync=!0)),lo&&(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&h.castShadow&&(h.castShadow=!1),(h.isPointLight||h.isSpotLight||h.isDirectionalLight)&&(d(u.id),d(!0===h.castShadow?1:0),d(this._shadowMapId(h.shadow?.map))),h.isPointLight&&h.castShadow&&h.shadow&&(function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Hn&&T.pcssForeignFilter++:(e.filterNode=Hn,T.pcssInstalled++)}(h.shadow),An(h.shadow),T.pcssLights++),(h.isSpotLight||h.isDirectionalLight)&&h.castShadow&&h.shadow){h.isDirectionalLight&&(r<0&&(r=this._gatherShadowBounds(e)),this._fitDirectionalShadowRange(h,io,r)),function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Wn&&T.pcssForeignFilter++:(Object.defineProperty(e,"penumbraSize",{get:()=>h.data?.penumbraSize??.5,configurable:!0}),e.filterNode=Wn,T.pcssInstalled++)}(h.shadow);let a,i=!l||o||!0===h.shadow.needsUpdate;if(t&&Vn()&&(i?function(e){let t=e;t.__spePcssPyramid&&(t.__spePcssPyramid.fresh=!1)}(h.shadow):dn(h.shadow)||function(e,t){let a=t,r=a.map?.depthTexture??null;if(null==r)return!1;let s=on(t);if(function(e){let t=on(e);if(t.slot>=0)return t.slot;for(let a=0;a<8;a++){let r=un[a];if(null===r||void 0===r.deref())return un[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=an(64,64),s.mid.texture.name="SplinePCSSPyramidMid"),null===s.small&&(s.small=an(8,8),s.small.texture.name="SplinePCSSPyramidSmall"),s.toMid=new $a(nn(`SplinePCSSPyramidToMid${i}`,r,Math.ceil(i/64),i-1,!1,0)),s.toSmall=new $a(nn("SplinePCSSPyramidToSmall",s.mid.texture,8,63,!0,0)),s.passKey=l),sn();let o=e.getRenderTarget();e.setRenderTarget(s.mid),s.toMid.render(e),e.setRenderTarget(s.small),s.toSmall.render(e),e.setRenderTarget(o),cn.set(n,0,0),e.copyTextureToTexture(s.small.texture,rn.texture,null,cn),s.fresh=!0,T.pcssPyramidBuilds++}(this,h.shadow),a={slot:hn(h.shadow),fresh:dn(h.shadow)}),t&&Mn()&&(kn(h.shadow,-1),this._maskLights.push({light:h,shadow:h.shadow}),(i||null==h.shadow.map)&&(this._maskBlocked=!0)),An(h.shadow,h.data?.penumbraSize??.5,a)&&T.pcssPyramidActive++,!s){s=!0;let e=h.shadow;T.pcssRadius0=e.radius??-1,T.pcssPenumbra0=e.penumbraSize??-1}T.pcssLights++}if(!(n>=f))if(h.isPointLight||h.isSpotLight)Pl.setFromMatrixPosition(h.matrixWorld),i[n].set(Pl.x,Pl.y,Pl.z,0),n++;else if(h.isDirectionalLight&&h.target){h.target.updateMatrixWorld();let e=Pl;e.setFromMatrixPosition(h.matrixWorld),e.sub(Al.setFromMatrixPosition(h.target.matrixWorld)).normalize(),i[n].set(e.x,e.y,e.z,1),n++}}),w.toonLightCount.value=n;let h=this._lightShadowSignatures.get(e);this._lightShadowSignatures.set(e,u),this._lightShadowStateDirty=void 0!==h&&h!==u}_shadowMapId(e){if(null==e)return 0;let t=this._shadowMapIds.get(e);return void 0===t&&(t=++this._shadowMapIdSeq,this._shadowMapIds.set(e,t)),t}_renderShadowMaskPass(e,t){let a=0;if(Mn()&&!this.suppressShadowMask&&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 Xn);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(Jl),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 vs(s,i,{depthBuffer:!1})),w.aoRenderTarget.value=this._aoRenderTarget.texture,this._hbao||(this._hbao=new Vi);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:$r.getModeIndex({mode:e.fogMode}),fogDensity:e.fogDensity??$r.getDensity({}),fogHeightFalloff:e.fogHeightFalloff??$r.getHeightFalloff({}),fogHeightBase:e.fogHeightBase??$r.getHeightBase({})},this.pipeline.blueNoiseTexture,this._aoRenderTarget)}_renderNormalPass(e,t,a){let r=a.outline&&a.cavity?"both":a.cavity?"normals":"hash",s=this.getDrawingBufferSize(Jl),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 vs(i,n,{count:"both"===r?2:1,type:"normals"===r?rs:as,depthTexture:new os(i,n)});"both"===r&&(e.textures[0].name="g0",e.textures[1].name="g1",e.textures[1].type=rs);for(let t of e.textures)t.minFilter=js,t.magFilter=js;return e});let l=this._encodeMaterials[r];if(void 0===l){this._depthContrastUniform??(this._depthContrastUniform=N(1));let e=new Ct;e.name=`SplineNormalPassEncode_${r}`;let t=dt("randomColor","vec3"),a=()=>{let e=or(er),a=Na.sub(.5).mul(this._depthContrastUniform).add(.5),r=Xt(Xt(t,e,.2),de(a),.4);return pe(r,t.x)},s=()=>{let e=or(Qa),a=Nt(q,e,e.negate());return pe(a,t.x)};e.fragmentNode="both"===r?Ca({g0:a(),g1:s()}):"normals"===r?s():a(),e.lights=!1,e.blending=Gs,e.needsUpdate=!0,this._encodeMaterials[r]=e,l=e}this._depthContrastUniform.value=t instanceof Ar?(t.far-t.near)/1e4:1;let o=e.overrideMaterial,u=this.getRenderTarget(),d=this.getClearColor(El),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=qa(_),t=new Ct;t.name="SplineUICanvasBlit",t.fragmentNode=e.sample($()),t.lights=!1,t.blending=Gs,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,a={quad:new $a(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=qa(_),r=N(new ds(1,0)),s=new Ct;s.name="SplineTransmissionPrefilter";let i=$(),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=pe(o,1),s.lights=!1,s.blending=Gs,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,t={quad:new $a(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(ho,"SplineTransmissionDownsample"),this._downsamplePasses[e]=t,t)}_buildDownsamplePassEntry(e,t){let a=qa(_),r=N(new ds(1,1)),s=new Ct;s.name=t;let i=$(),n=r,l=(e,t)=>a.sample(i.add(ne(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=pe(o,1),s.lights=!1,s.blending=Gs,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,{quad:new $a(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(Jl),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?uo:"off";this._transmissionTarget=this._reallocGrabTarget(this._transmissionTarget,s,i,()=>{let e=new vs(s,i,{depthBuffer:!0}),t=e.texture;return"off"===n?(t.generateMipmaps=!0,t.minFilter=ti):(t.generateMipmaps=!1,t.minFilter=Ys),t.magFilter=Ys,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 vs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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 vs(s,i,{depthBuffer:!1}),a=e.texture;return a.minFilter=ti,a.magFilter=Ys,"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 Ct;e.name="SplineReflectionDepthBlit";let t=qa(this._reflectionTarget.depthTexture);e.fragmentNode=pe(de(t.sample($())),1),e.lights=!1,e.blending=Gs,e.depthTest=!1,e.depthWrite=!1,e.needsUpdate=!0,r.push({quad:new $a(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 Ct;n.name=`SplineReflectionDepthMin${s}`;let l=qa(this._reflectionDepthChain[s-1].texture),o=Mt,u=Pe(o.x).mul(2),d=Pe(o.y).mul(2),h=(e,t)=>l.load(Je(u.add(e),d.add(t))).x,m=(e,t)=>Ht(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=pe(de(c),1),n.lights=!1,n.blending=Gs,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,r.push({quad:new $a(n)})}this._reflectionDepthPasses=r}_renderReflectionPass(e,t){let a=this.getDrawingBufferSize(Jl),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=Cr(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(xo&&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&&yo;this._reflectionTarget=this._reallocGrabTarget(this._reflectionTarget,l,o,()=>{let e=new vs(l,o,{depthTexture:new os(l,o)});return d?(e.texture.generateMipmaps=!1,e.texture.minFilter=Ys):(e.texture.generateMipmaps=!0,e.texture.minFilter=ti),e.texture.magFilter=Ys,e});let h=(e,t)=>{let a=new vs(e,t,{depthBuffer:!1,type:as,format:bs});return a.texture.generateMipmaps=!1,a.texture.minFilter=js,a.texture.magFilter=js,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(Nl);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 vs(l,o,{depthBuffer:!1}),t=e.texture;return t.minFilter=ti,t.magFilter=Ys,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 vs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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;Ll.copy(s.center).applyMatrix4(e.matrixWorld);let o=t.projectionMatrix.elements[5]*a/2,u=1;!0===t.isPerspectiveCamera&&(Il.setFromMatrixPosition(t.matrixWorld),u=Math.max(Ll.distanceTo(Il),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&&vo&&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(Dl).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 vs(e,t,{type:rs,depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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 vs(l,o,{count:2,type:rs,depthTexture:new os(l,o)});for(let t of e.textures)t.generateMipmaps=!1,t.minFilter=js,t.magFilter=js;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 Ct;e.name="SplineReflectionGBuffer";let t=W("__splinePlanarMirror","float"),a=w.reflectionPlanarEnabled.greaterThan(.5),r=W("__srMode","float"),s=Nt(t.greaterThan(.5).and(a),R(0),r);e.fragmentNode=Ca({g0:pe(or(Qa),s),g1:pe(W("__srBlur","float"),W("__srThickness","float"),W("__srStepSize","float"),W("__srSteps","float"))}),e.lights=!1,e.blending=Gs,e.needsUpdate=!0,this._reflectionGBufferMaterial=e}let u=this._skippedAsyncDraws??0,d=e.overrideMaterial,h=this.getRenderTarget(),m=this.getClearColor(Bl),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=N(new Ss),i=N(new Ss),n=N(new Ss),l=N(.1),o=this._reflectionGBufferTarget,u=qa(o.textures[0]),d=qa(o.textures[1]),h=qa(o.depthTexture),m=qa(e),c=qa(this._reflectionDepthPyramid.texture),p=qa(t),g=new Ct;g.name="SplineReflectionResolve";let f=le(()=>{let e=Mt,t=Je(Pe(e.x),Pe(e.y)),a=$(),r=u.load(t).toVar(),o=h.sample(a).toVar(),g=pe(0).toVar(),f=R(0).toVar();return he(r.w.greaterThan(.5),()=>{let e=d.load(t).toVar(),u=Oi(i,a.x,a.y,o),h=qi({dials:{blur:e.x,thickness:e.y,stepSize:e.z,steps:Pe(e.w),tracingMode:r.w.sub(1)},surface:{originView:u,normalV:or(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:S(!1),noisePixel:ne(t),singleRay:{footprintOut:f}});g.assign(pe(h,f.add(1)))}),g});g.fragmentNode=f(),g.lights=!1,g.blending=Gs,g.depthTest=!1,g.depthWrite=!1,g.needsUpdate=!0,this._reflectionResolveMarch={quad:new $a(g),proj:s,projInv:i,camWorld:n,near:l};let _=qa(this._reflectionResolveMarchTarget.texture),y=qa(this._reflectionResolveBlurTmp.texture),x=e=>{let t=new Ct;t.name=`SplineReflectionResolveBlur${e.toUpperCase()}`;let s="x"===e?_:y,i="x"===e?1/a:1/r,n=le(()=>{let t=$(),a=_.sample(t).toVar().w.sub(1).max(0).clamp(.5,12).toVar(),r=pe(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?ne(a.mul(l/6*i),0):ne(0,a.mul(l/6*i)),d=s.sample(t.add(u)).toVar(),h="x"===e?d.w.min(1):d.w;r.addAssign(pe(d.rgb,h).mul(o))}return r.div(n)});return t.fragmentNode=n(),t.lights=!1,t.blending=Gs,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,new $a(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&&Mr(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=Fl,i=o*m*(u*c)):o<=l&&o<=u?(s=Ul,i=l*h*(u*c)):(s=Ol,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(Gl.copy(a.normalAxis).transformDirection(s),ql.setFromMatrixPosition(s),Wl.setFromMatrixPosition(t.matrixWorld),Hl.subVectors(ql,Wl),Hl.dot(Gl)>0&&Gl.negate(),Hl.dot(Gl)>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(Hl.subVectors(ql,Wl),Hl.reflect(Gl).negate(),Hl.add(ql),jl.extractRotation(t.matrixWorld),Kl.set(0,0,-1).applyMatrix4(jl).add(Wl),$l.subVectors(ql,Kl),$l.reflect(Gl).negate(),$l.add(ql),i.position.copy(Hl),i.up.set(0,1,0).applyMatrix4(jl),i.up.reflect(Gl),i.lookAt($l),i.updateMatrixWorld(),i.projectionMatrix.copy(t.projectionMatrix),i.projectionMatrixInverse.copy(i.projectionMatrix).invert(),!0===t.isPerspectiveCamera){Xl.setFromNormalAndCoplanarPoint(Gl,ql),Xl.applyMatrix4(i.matrixWorldInverse),Ql.set(Xl.normal.x,Xl.normal.y,Xl.normal.z,Xl.constant);let e=i.projectionMatrix.elements;Zl.x=(Math.sign(Ql.x)+e[8])/e[0],Zl.y=(Math.sign(Ql.y)+e[9])/e[5],Zl.z=-1,Zl.w=(1+e[10])/e[14],Ql.multiplyScalar(1/Ql.dot(Zl)),e[2]=Ql.x,e[6]=Ql.y,e[10]=Ql.z,e[14]=Ql.w}let n=this.getDrawingBufferSize(Yl),l=Math.max(1,Math.round(n.x)),o=Math.max(1,Math.round(n.y)),u=!0===this.backend?.isWebGPUBackend&&_o;this._planarTarget=this._reallocGrabTarget(this._planarTarget,l,o,()=>{let e=new vs(l,o);return u?(e.texture.generateMipmaps=!1,e.texture.minFilter=Ys):(e.texture.generateMipmaps=!0,e.texture.minFilter=ti),e.texture.magFilter=Ys,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 vs(l,o,{depthBuffer:!1}),a=t.texture;return a.minFilter=ti,a.magFilter=Ys,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 vs(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ys,a.texture.magFilter=Ys,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(Jl),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 vs(s,i,{depthBuffer:!0}));let n=this.getRenderTarget();this.setRenderTarget(this._transitionCaptureTarget);try{this.renderSplineScene(e,t)}finally{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,settleFrames:a=0}={}){if(!0===this.xr?.isPresenting)return null;let r=this._frameSerial,s=this.getRenderTarget(),i=this.pipeline.renderToScreen,n=this.pipeline.helpersEnabled,l=this.suppressShadowMask;this.suppressShadowMask=!0,t||this.pipeline.disableHelpers(),this.pipeline.renderToScreen=!1,this.setRenderTarget(null);try{for(let t=0;t<a;t++)e(),await wo();e()}finally{this.suppressShadowMask=l,this.pipeline.renderToScreen=i,this.setRenderTarget(s),n&&this.pipeline.enableHelpers()}if(this._frameSerial===r||this.lastFrameIncomplete)return null;let o=this.pipeline.lastOutputTarget;if(!o||!this.backend.get(o.textures[0])?.textureDescriptorGPU)return null;let u=o.width,d=o.height,h=this,m=new Uint8Array(u*d*4),c=4*u,p=256*Math.ceil(c/256),g=Math.max(1,Math.min(d,Math.floor((1<<20)/p)));for(let e=0;e<d;e+=g){let t=Math.min(g,d-e),a=await h.readRenderTargetPixelsAsync(o,0,e,u,t);if(p===c)m.set(a.subarray(0,t*c),e*c);else for(let r=0;r<t;r++){let t=r*p;m.set(a.subarray(t,t+c),(e+r)*c)}}return{pixels:m,width:u,height:d}}_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 vs(e,t,{depthBuffer:!0})):(this._ciOffscreenTarget=new vs(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(),pr()?.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 ln){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)}ln.clear(),un.fill(null),rn?.dispose(),rn=null,mn=!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 fl)e.deref()?.dispose();fl.clear(),_l++}(),function(){for(let e of xl){let t=e.deref();void 0!==t&&(t.sprite.removeFromParent(),t.material.dispose())}xl.clear(),vl++}(),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}},Vo=So;Vo._GAUGE_STALL_MS=3e3;var Mo=(e,t)=>e.element(t);function Co(e){let t=e;return null!=t&&!0===t.isInstancedMesh&&null!=t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute}var Ro=new WeakMap;function zo(e){return xa.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 Mo(Sa(r,"mat4",s),fe);if(16*s*4<=e.getUniformBufferLimit())return Mo(ft(r.array,"mat4",s),fe);let i=Ro.get(r);void 0===i&&(i=new Ts(r.array,16,1),Ro.set(r,i));let n=r.usage===Ws?Re:Se;return Vt(n(i,"vec4",16,0),n(i,"vec4",16,4),n(i,"vec4",16,8),n(i,"vec4",16,12))}(e))}var ko=le(e=>Co(e.object)?ce:_e).once()().toVar("speObjectPosition"),Ao=le(e=>{let t=e.material?.shapeBlendObjectNormal;return t||(Co(e.object)?e.geometry.hasAttribute("normal")?Ga:de(0,1,0):ja)}).once()().toVar("speObjectNormal"),Po=(le(e=>Co(e.object)?zo(e):xa).once()(),le(e=>{if(!Co(e.object))return la;let t=zo(e),a=e=>Mo(t,e).xyz;return de(a(0).length(),a(1).length(),a(2).length()).toVarying("v_speModelScale")}).once()().toVar("speModelScale")),Eo=(le(e=>Co(e.object)?bt(zo(e)).inverse().transpose():ra).once()(),le(e=>Co(e.object)?zo(e).inverse():wa).once()(),new WeakMap);function No(e){if(Eo.has(e))return;let t={own:e.value,render:e.value};Eo.set(e,t),Object.defineProperty(e,"value",{configurable:!0,enumerable:!0,get:()=>t.render,set:e=>{t.render=e,t.own=e}})}function Bo(e){let t=Eo.get(e);return void 0!==t?t.own:e.value}function Lo(e,t){let a=Eo.get(e);void 0!==a?a.render=t:e.value=t}var Io=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:Bo(t)}getLiveValue(e){return this.liveValues.get(e)}getNodeValue(e){let t=this.byName.get(e);return void 0===t?void 0:Bo(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 Do(e,t,a){let r=R(e).toVar(),s=R(Xt(r.div(Wt(r.add(t.accumAlpha),R(1e-5),R(1))),r,a)).toVar();return t.accumAlpha.addAssign(E(t.accumAlpha).mul(r).mul(E(a))),s}function Fo(e,t){let a=R(e).toVar(),r=R(a.div(Wt(a.add(t.accumAlpha),R(1e-5),R(1)))).toVar();return t.accumAlpha.addAssign(E(t.accumAlpha).mul(a)),r}var Uo=0,Oo=1,Go=2,qo=3,Wo=le(e=>{let t=e.a.toVar(),a=e.b.toVar(),r=e.alpha.toVar(),s=e.mode,i=de(1).toVar();return he(s.equal(Pe(0)),()=>{i.assign(Xt(t,a,r))}).ElseIf(s.equal(Pe(1)),()=>{i.assign(Xt(t,t.mul(a),r))}).ElseIf(s.equal(Pe(2)),()=>{i.assign(Xt(t,E(E(t).mul(E(a))),r))}).ElseIf(s.equal(Pe(3)),()=>{let e=va(t,de(.5)),s=Xt(E(E(t).mul(E(a)).mul(2)),t.mul(a).mul(2),e);i.assign(Xt(t,s,r).clamp(0,1))}),i});function Ho(e,t,a,r){return Wo({a:e,b:t,alpha:a,mode:r})}var jo=new Map,Ko=new Set,$o=(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:de(1,0,0),calpha:Fo(r,a)}};function Xo(e,t){jo.set(e,t)}function Qo(e){let t=jo.get(e);return void 0!==t?t:(Ko.has(e)||(Ko.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.`)),$o)}function Zo(e){return jo.has(e)}var{diffuseContribution:Yo,specularColorBlended:Jo}=nr,eu=le(e=>{let t=Qa.dot(e.lightDirection),a=ne(t.mul(.5).add(.5),0),r=a.fwidth().mul(.5);return Xt(de(.7),de(1),sa(R(.7).sub(r.x),R(.7).add(r.x),a.x))}),tu=le(e=>{let t=e.lightDirection.add(ze).normalize(),a=Qa.dot(t).clamp(),r=ze.dot(t).clamp(),s=r.mul(-5.55473).sub(6.98316).mul(r).exp2(),i=oa.mul(s.oneMinus()).add(s),n=R(.25),l=jt.mul(.5).add(1).mul(1/Math.PI).mul(a.pow(jt));return i.mul(n).mul(l)});function au(e){let t=w.aoRenderTarget.sample(kt).rgb,a=w.aoEnabledUniform;return null!==e&&(a=a.mul(Nt(e,R(1),R(0)))),Xt(de(1),t,a)}var ru,su=(ru=class extends ta{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=eu({lightDirection:t}).mul(a);r.directDiffuse.addAssign(s.mul(Da.rgb.mul(1/Math.PI))),r.directSpecular.addAssign(s.mul(tu({lightDirection:t})))}},class extends ru{constructor(){super(...arguments),this.aoOcclusionGate=null}finish(e,...t){super.finish?.call(this,e,...t);let{reflectedLight:a,outgoingLight:r}=e.context,s=au(this.aoOcclusionGate),i=a.directDiffuse.add(a.indirectDiffuse);r.subAssign(i.mul(E(s)))}}),iu=class extends ca{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=Qa.dot(a.lightDirection).clamp().mul(a.lightColor),t=nr.BRDF_Lambert({diffuseColor:Yo});return void a.reflectedLight.directDiffuse.addAssign(e.mul(t))}super.direct(e,t)}},nu=e=>e,lu=[{a:"y",b:"z",pole:"x"},{a:"z",b:"x",pole:"y"},{a:"x",b:"y",pole:"z"}];function ou(e,t){return"x"===t?e.x:"y"===t?e.y:e.z}function uu(e,t){return Aa(e,de(t,1)).div(2).add(.5).xy}function du(e,t,a){let r=R(e.div(Wt(e.add(t.accumAlpha),R(1e-5),R(1)))).toVar();return t.accumAlpha.addAssign(E(t.accumAlpha).mul(e).mul(E(a))),r}function hu(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=ko,t=0===r?e.zy:1===r?e.xz:e.xy,a=ne(t.add(1).div(2)).toVar();return{uvs:[ne(uu(n,a.mul(2).sub(1).div(l.mul(.5)))).toVar()],weights:null}}if(2===t){let e=de(or(ko)).toVar(),{a:t,b:a,pole:r}=lu[i],s=R(Qe(ou(e,t),ou(e,a)).div(6.283).add(.5)).toVar(),l=R(Ke(ou(e,r)).div(3.1415).add(.5)).toVar(),o=ne(s,l).toVar();return{uvs:[ne(uu(n,o.mul(2).sub(1))).toVar()],weights:null}}if(3===t){let e=de(or(ko)).toVar(),{a:t,b:a,pole:r}=lu[i],s=R(Qe(ou(e,t),ou(e,a)).div(6.283).add(.5)).toVar(),o=R(ou(ko,r).div(l.y.mul(.5))).toVar(),u=R(o.div(2).add(.5)).toVar(),d=ne(s,u).toVar();return{uvs:[ne(uu(n,d.mul(2).sub(1))).toVar()],weights:null}}if(4===t){let t=e.getFloat("blending"),a=de(ko).toVar(),r=ne(a.xy.add(1).div(2)).toVar(),s=ne(a.zy.add(1).div(2)).toVar(),i=ne(a.xz.add(1).div(2)).toVar();for(let e of[r,s,i])e.assign(uu(n,nu(e.mul(2).sub(1).div(l.mul(.5)))));let o=R(E(t).mul(125).add(3)).toVar(),u=de(Ao).toVar(),d=de(Be(or(u))).toVar();return d.assign(Ie(d,de(o))),d.divAssign(Ha(d,de(1))),{uvs:[r,s,i],weights:d}}return{uvs:[ne(uu(n,$().mul(2).sub(1))).toVar()],weights:null}}var mu=(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}=hu(e),m=[...d],c=null;if(1===s){if(r=o.sample(d[0]),2!==l){let e=0===n?de(1,0,0):1===n?de(0,1,0):de(0,0,1),t=Ha(Ao,e);c=va(R(0),1===l?t.mul(-1):t)}}else if(2===s||3===s)r=function(e,t){if(e.value.minFilter===js&&e.value.magFilter===js)return e.sample(t);let a=ne(Ma(t)).toVar(),r=ne(ka(t)).toVar();return a.x.subAssign(P(a.x.add(.5))),r.x.subAssign(P(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"):R(1),g=pe(Xt(pe(0,0,0,1),r,p)).toVar(),f=de(g.rgb).toVar(),_=R(t.alpha.mul(g.a)).toVar();return null!==c&&_.mulAssign(c),function(e,t,a){he(e.greaterThan(.5),()=>{for(let e of a)he(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:du(_,a,t.isMask)}};function cu(e,t,a){let r=ne(t).toVar(),s=ne(Ma(r)).toVar(),i=ne(ka(r)).toVar(),n=t=>a.mul(_t(e.sample(t).rgb)),l=R(n(r)).toVar(),o=R(n(r.add(s)).sub(l)).toVar(),u=R(n(r.add(i)).sub(l)).toVar();return ne(o,u)}function pu(e,t,a){let r=de(Ma(e)).toVar(),s=de(ka(e)).toVar(),i=de(or(t)).toVar(),n=de(or(ya(s,i))).toVar(),l=de(or(ya(i,r))).toVar(),o=R(Ha(r,n).mul(lr)).toVar(),u=de(Qt(o).mul(a.x.mul(n).add(a.y.mul(l)))).toVar();return or(Be(o).mul(i).sub(u))}function gu(e,t){let a,r=e.get("texture"),s=e.has("loaded")?e.getFloat("loaded"):R(1),i=e=>{let a=r.sample(e),s="luminance"===t?_t(a.rgb):a[t];return R(s).toVar()},{uvs:n,weights:l}=hu(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 Xt(R(1),a,s)}Xo("texture",mu),Xo("video",mu);var fu=z,_u=ge,yu=.1666667,xu=le(e=>{let t=e.c,a=ea(Ha(t,de(17,59.4,15))).mul(4096),r=U(a.mul(512)),s=a.mul(.125),i=U(s.mul(512)),n=s.mul(.125),l=U(n.mul(512));return de(i,l,r).sub(.5)}).setLayout({name:"spe_random3",type:"vec3",inputs:[{name:"c",type:"vec3"}]});function vu(e){return xu({c:e})}var bu=le(e=>{let t=e.p,a=P(t.add(Ha(t,de(.3333333)))).toVar(),r=t.sub(a).add(Ha(a,de(yu))).toVar(),s=va(de(0),r.sub(r.yzx)).toVar(),i=s.mul(E(s.zxy)).toVar(),n=E(s.zxy.mul(E(s))).toVar(),l=r.sub(i).add(yu).toVar(),o=r.sub(n).add(2*yu).toVar(),u=r.sub(1).add(3*yu).toVar(),d=pe(Ha(r,r),Ha(l,l),Ha(o,o),Ha(u,u)).toVar();d.assign(pe(.6).sub(d).max(0));let h=pe(Ha(vu(a),r),Ha(vu(a.add(i)),l),Ha(vu(a.add(n)),o),Ha(vu(a.add(1)),u)).toVar();return d.mulAssign(d),d.mulAssign(d),h.mulAssign(d),Ha(h,pe(52))}).setLayout({name:"spe_simplexFast",type:"float",inputs:[{name:"p",type:"vec3"}]});function Tu(e){return bu({p:e})}var wu=le(e=>{let t=e.m,a=bt(de(-.37,.36,.85),de(-.14,-.93,.34),de(.92,.01,.4)),r=bt(de(-.55,-.39,.74),de(.33,-.91,-.24),de(.77,.12,.63)),s=bt(de(-.71,.52,-.47),de(-.08,-.72,-.68),de(-.7,-.45,.56));return Tu(t.mul(a)).mul(.5333333).add(Tu(t.mul(2).mul(r)).mul(.2666667)).add(Tu(t.mul(4).mul(s)).mul(.1333333)).add(Tu(t.mul(8)).mul(.0666667))}).setLayout({name:"spe_simplexFractal",type:"float",inputs:[{name:"m",type:"vec3"}]}),Su=le(e=>{let t=e.x;return Jt(t.mul(34).add(1).mul(t),289)}).setLayout({name:"spe_permute",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function Vu(e){return Su({x:e})}var Mu=le(e=>Pa(1.79284291400159,e.r.mul(.85373472095314))).setLayout({name:"spe_taylorInvSqrt",type:"vec4",inputs:[{name:"r",type:"vec4"}]});function Cu(e){return Mu({r:e})}var Ru=le(e=>{let t=e.v,a=ne(1/6,1/3),r=pe(0,.5,1,2),s=P(t.add(Ha(t,a.yyy))).toVar(),i=t.sub(s).add(Ha(s,a.xxx)).toVar(),n=va(i.yzx,i.xyz).toVar(),l=E(n).toVar(),o=Ht(n.xyz,l.zxy).toVar(),u=It(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(Jt(s,289));let c=Vu(Vu(Vu(s.z.add(pe(0,o.z,u.z,1))).add(s.y).add(pe(0,o.y,u.y,1))).add(s.x).add(pe(0,o.x,u.x,1))).toVar(),p=r.wyz.mul(1/7).sub(r.xzx).toVar(),g=c.sub(P(c.mul(p.z).mul(p.z)).mul(49)).toVar(),f=P(g.mul(p.z)).toVar(),_=P(g.sub(f.mul(7))).toVar(),y=f.mul(p.x).add(p.yyyy).toVar(),x=_.mul(p.x).add(p.yyyy).toVar(),v=Pa(1,Be(y)).sub(Be(x)).toVar(),b=pe(y.xy,x.xy).toVar(),T=pe(y.zw,x.zw).toVar(),w=P(b).mul(2).add(1).toVar(),S=P(T).mul(2).add(1).toVar(),V=va(v,pe(0)).negate().toVar(),M=b.xzyw.add(w.xzyw.mul(V.xxyy)).toVar(),C=T.xzyw.add(S.xzyw.mul(V.zzww)).toVar(),R=de(M.xy,v.x).toVar(),z=de(M.zw,v.y).toVar(),k=de(C.xy,v.z).toVar(),A=de(C.zw,v.w).toVar(),N=Cu(pe(Ha(R,R),Ha(z,z),Ha(k,k),Ha(A,A))).toVar();R.mulAssign(N.x),z.mulAssign(N.y),k.mulAssign(N.z),A.mulAssign(N.w);let B=It(Pa(.6,pe(Ha(i,i),Ha(d,d),Ha(h,h),Ha(m,m))),0).toVar();return B.mulAssign(B),Ha(B.mul(B),pe(Ha(R,i),Ha(z,d),Ha(k,h),Ha(A,m))).mul(42)}).setLayout({name:"spe_simplexAshima",type:"float",inputs:[{name:"v",type:"vec3"}]});function zu(e){return Ru({v:e})}var ku=le(e=>{let t=e.x;return t.sub(P(t.mul(1/289)).mul(289))}).setLayout({name:"spe_mod289",type:"vec4",inputs:[{name:"x",type:"vec4"}]}),Au=le(e=>{let t=e.x;return ku({x:t.mul(34).add(1).mul(t)})}).setLayout({name:"spe_perm",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function Pu(e){return Au({x:e})}var Eu=le(e=>{let t=e.p,a=P(t).toVar(),r=t.sub(a).toVar();r.assign(r.mul(r).mul(Pa(3,r.mul(2))));let s=a.xxyy.add(pe(0,1,0,1)).toVar(),i=Pu(s.xyxy).toVar(),n=Pu(i.xyxy.add(s.zzww)).toVar().add(a.zzzz).toVar(),l=Pu(n).toVar(),o=Pu(n.add(1)).toVar(),u=U(l.mul(1/41)).toVar(),d=U(o.mul(1/41)).toVar().mul(r.z).add(u.mul(E(r.z))).toVar(),h=d.yw.mul(r.x).add(d.xz.mul(E(r.x))).toVar();return h.y.mul(r.y).add(h.x.mul(E(r.y)))}).setLayout({name:"spe_valueNoise",type:"float",inputs:[{name:"p",type:"vec3"}]}),Nu=le(e=>{let t=de(e.x).toVar(),a=R(0).toVar(),r=R(.5).toVar(),s=de(100).toVar();return ge(5,()=>{a.addAssign(r.mul(function(e){return Eu({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"}]}),Bu=le(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"}]}),Lu=le(e=>{let t=e.P,a=P(t).toVar(),r=a.add(de(1)).toVar();a.assign(Jt(a,289)),r.assign(Jt(r,289));let s=U(t).toVar(),i=s.sub(de(1)).toVar(),n=pe(a.x,r.x,a.x,r.x).toVar(),l=pe(a.yy,r.yy).toVar(),o=pe(a.zzzz).toVar(),u=pe(r.zzzz).toVar(),d=Vu(Vu(n).add(l)).toVar(),h=Vu(d.add(o)).toVar(),m=Vu(d.add(u)).toVar(),c=h.div(7).toVar(),p=U(P(c).div(7)).sub(.5).toVar();c.assign(U(c));let g=pe(.5).sub(Be(c)).sub(Be(p)).toVar(),f=va(g,pe(0)).toVar();c.subAssign(f.mul(va(0,c).sub(.5))),p.subAssign(f.mul(va(0,p).sub(.5)));let _=m.div(7).toVar(),y=U(P(_).div(7)).sub(.5).toVar();_.assign(U(_));let x=pe(.5).sub(Be(_)).sub(Be(y)).toVar(),v=va(x,pe(0)).toVar();_.subAssign(v.mul(va(0,_).sub(.5))),y.subAssign(v.mul(va(0,y).sub(.5)));let b=de(c.x,p.x,g.x).toVar(),T=de(c.y,p.y,g.y).toVar(),w=de(c.z,p.z,g.z).toVar(),S=de(c.w,p.w,g.w).toVar(),V=de(_.x,y.x,x.x).toVar(),M=de(_.y,y.y,x.y).toVar(),C=de(_.z,y.z,x.z).toVar(),R=de(_.w,y.w,x.w).toVar(),z=Cu(pe(Ha(b,b),Ha(w,w),Ha(T,T),Ha(S,S))).toVar();b.mulAssign(z.x),w.mulAssign(z.y),T.mulAssign(z.z),S.mulAssign(z.w);let k=Cu(pe(Ha(V,V),Ha(C,C),Ha(M,M),Ha(R,R))).toVar();V.mulAssign(k.x),C.mulAssign(k.y),M.mulAssign(k.z),R.mulAssign(k.w);let A=Ha(b,s).toVar(),E=Ha(T,de(i.x,s.yz)).toVar(),N=Ha(w,de(s.x,i.y,s.z)).toVar(),B=Ha(S,de(i.xy,s.z)).toVar(),L=Ha(V,de(s.xy,i.z)).toVar(),I=Ha(M,de(i.x,s.y,i.z)).toVar(),D=Ha(C,de(s.x,i.yz)).toVar(),F=Ha(R,i).toVar(),O=function(e){return Bu({t:e})}(s).toVar(),G=Xt(pe(A,E,N,B),pe(L,I,D,F),O.z).toVar(),q=Xt(G.xy,G.zw,O.y).toVar();return Xt(q.x,q.y,O.x).toVar().mul(2.2)}).setLayout({name:"spe_perlin",type:"float",inputs:[{name:"P",type:"vec3"}]});function Iu(e){return Lu({P:e})}var Du=le(e=>{let t=U(e.p3.mul(.1031)).toVar();return t.addAssign(Ha(t,t.yzx.add(33.33))),U(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_hashwithoutsine13",type:"float",inputs:[{name:"p3",type:"vec3"}]}),Fu=le(e=>{let t=U(e.p3.mul(de(.1031,.103,.0973))).toVar();return t.addAssign(Ha(t,t.yxz.add(33.33))),U(t.xxy.add(t.yxx).mul(t.zyx))}).setLayout({name:"spe_hashwithoutsine33",type:"vec3",inputs:[{name:"p3",type:"vec3"}]});function Uu(e){return Fu({p3:e})}var Ou=le(e=>{let{a:t,b:a,k:r}=e,s=sa(0,1,a.sub(t).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(E(s)).toVar();return Xt(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 Gu(e,t,a){return Ou({a:e,b:t,k:a})}var qu=le(e=>{let{a:t,b:a,k:r}=e,s=sa(1,0,t.sub(a).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(E(s)).toVar();return Xt(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 Wu(e,t,a){return qu({a:e,b:t,k:a})}var Hu=le(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 ju(e,t,a,r,s){return Hu({value:e,input_min:t,input_max:a,output_min:r,output_max:s})}var Ku=le(e=>{let{x:t,style:a,smoothness:r,seed:s,quality:i}=e,n=at(P(t)).toVar(),l=U(t).toVar(),o=R(8).toVar(),u=R(8).toVar(),d=R(8).toVar(),h=R(8).toVar(),m=R(8).toVar(),c=R(8).toVar(),p=at(0).toVar(),g=de(0).toVar(),f=Pe(i).toVar(),_=()=>({start:f.negate(),end:f,condition:"<=",type:"int"});_u(_(),_(),_(),({i:e,j:t,k:a})=>{let i=at(e,t,a).toVar(),d=de(i).add(Uu(de(n.add(i)).add(s))).sub(l).toVar(),m=it(d).toVar();o.assign(Gu(m,o,r)),he(m.lessThan(u),()=>{h.assign(u),u.assign(m),p.assign(at(e,t,a)),g.assign(d)}).ElseIf(m.lessThan(h),()=>{h.assign(m)})}),he(a.notEqual(Pe(0)).and(a.notEqual(Pe(5))).and(a.notEqual(Pe(7))),()=>{_u(_(),_(),_(),({i:e,j:t,k:a})=>{let i=p.add(at(e,t,a)).toVar(),o=de(i).add(Uu(de(n.add(i)).add(s))).sub(l).toVar(),u=Ha(g.add(o).mul(.5),o.sub(g)).toVar(),h=Ha(g.add(o).mul(.5),or(o.sub(g))).toVar();m.assign(Gu(u,m,r)),c.assign(Ht(c,h));let f=at(e,t,a).toVar();he(qe(fu(f,p)),()=>{let e=de(f).add(Uu(de(n.add(f)).add(s))).sub(l).toVar(),t=it(e).toVar();d.assign(Gu(t,d,r))})})});let y=R(0).toVar();return he(a.equal(Pe(0)),()=>{y.assign(o)}).ElseIf(a.equal(Pe(1)),()=>{y.assign(d)}).ElseIf(a.equal(Pe(2)),()=>{y.assign(d.sub(o))}).ElseIf(a.equal(Pe(3)),()=>{let e=R(3).toVar(),t=It(e.sub(Be(u.sub(h))),0).div(e).toVar();y.assign(Ht(u,h).sub(t.mul(t).mul(e).mul(1/4)))}).ElseIf(a.equal(Pe(4)),()=>{y.assign(Ja(m.mul(5)))}).ElseIf(a.equal(Pe(5)),()=>{y.assign(Ie(o,3))}).ElseIf(a.equal(Pe(6)),()=>{let e=r.mul(.25).add(.0125).toVar(),t=Ie(r,3).mul(.25).add(.0125).toVar();y.assign(sa(e.sub(e.mul(t)),e.add(e.mul(t)),c))}).ElseIf(a.equal(Pe(7)),()=>{y.assign(function(e){return Du({p3:e})}(de(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 $u(e,t,a,r,s){return Ku({x:e,style:t,smoothness:a,seed:r,quality:s})}var Xu=[Tu,function(e){return wu({m:e})},zu,function(e){return Nu({x:e})},Iu],Qu=e=>e,Zu=le(e=>{let t=e.v;return or(Nt(Be(t.x).greaterThan(Be(t.z)),de(t.y.negate(),t.x,0),de(0,t.z.negate(),t.y)))}).setLayout({name:"spe_displaceOrthogonal",type:"vec3",inputs:[{name:"v",type:"vec3"}]});function Yu(e,t,a,r){return e.add(t).mul(a).mul(.001).add(1e-4).add(r.mul(.1))}var Ju=new Map,ed=le(e=>{let{n:t,scale:a,intensity:r,offset:s,movement:i,smoothness:n}=e,l=e.p,o=R($u(Yu(l,s,a,i),e.voronoiStyle,n,e.seed,e.quality)).toVar();return o.assign(ju(o,e.lowCut,e.highCut,R(0),R(1))),o.assign(Wu(o,R(0),n.mul(.25))),o.assign(Gu(o,R(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 td(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=>ed({...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=Ju.get(e);if(void 0===t){let a=Xu[e]??Xu[0];t=le(e=>{let{n:t,scale:r,intensity:s,offset:i,movement:n}=e,l=e.p;return l.add(t.mul(a(Yu(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"}]}),Ju.set(e,t)}return t}(a);return e=>s({...r,p:e})}(e,a),s=de(r(t)).toVar(),i=de(function(e){return Zu({v:e})}(a)).toVar(),n=or(ya(a,i)).toVar(),l=de(r(t.add(i))).toVar(),o=de(r(t.add(n))).toVar();return{position:s,normal:or(ya(l.sub(s),o.sub(s)))}}Xo("color",(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:e.getColor("color"),calpha:Fo(r,a)}});var ad=e=>e,rd=e=>e;Xo("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?Ee:ko;if(u){let s=or(e.getVec3("direction"));r=Ha(s,a.sub(t))}else r=it(a.sub(t))}else r=it(Ee.sub(St));let c=r.sub(h).div(m.sub(h)).toVar(),p=pe(s.element(0)).toVar();for(let e=1;e<n;e++){let t=ad(i.element(e-1)),a=ad(i.element(e)),r=Wt(c.sub(t).div(a.sub(t)),R(0),R(1)),n=l?sa(R(0),R(1),r):r;p.assign(Xt(p,rd(s.element(e)),n))}let g=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Do(g,a,t.isMask)}}),Xo("cavity",(e,t,a)=>{let r=Wt(e.getFloat("ridge"),0,2),s=Wt(e.getFloat("valley"),0,2),i=w.normalViewRenderTarget,n=w.resolution,l=dt("randomColor","vec3").x.toVar(),o=kt.toVar(),u=ne(R(1).div(n.x),R(1).div(n.y)).toVar(),d=(e,t)=>i.sample(o.add(ne(e,t)).toVar()).toVar(),h=d(R(0),u.y.negate()),m=d(R(0),u.y),c=d(u.x.negate(),R(0)),p=d(u.x,R(0)),g=e=>e.a.equal(l).and(Ha(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=R(.5).div(It(r.mul(r),R(1e-4))).toVar(),x=R(.7).div(It(s.mul(s),R(1e-4))).toVar(),v=(e,t)=>Nt(e.lessThan(R(.5).div(t)),e.mul(R(1).sub(e.mul(t))),R(.25).div(t)),b=Nt(f,Nt(_.greaterThan(0),v(_,y).mul(2),v(_.negate(),x).mul(-2)),R(0)).toVar(),T=Nt(b.abs().lessThan(.001),R(0),b).toVar(),S=de(Wt(T.mul(.5).add(.5),0,1)),V=Nt(T.notEqual(0),R(1),R(0)),M=Nt(t.isMask,R(1),V);return{color:S,calpha:Do(t.alpha.mul(t.mask).mul(M),a,t.isMask)}});var sd=le(e=>{let t=e.material?.vertexObjectNormal??null;return t?ur(t).transformNormalByInverseViewMatrix(Lt).normalize():sr}).once()().toVar("speVertexNormalWorld");Xo("dust",(e,t,a)=>{let r=e.getFloat("coverage"),s=e.getFloat("softness"),i=e.getFloat("noiseStrength"),n=e.getFloat("noiseScale"),l=Ha(or(sd),de(0,1,0)),o=R(0).toVar();he(i.notEqual(0),()=>{let e=Tu(ko.div(n).toVar().add(de(1.7,9.2,1)));o.assign(e.mul(i))});let u=It(s,1e-4).toVar(),d=Xt(u.add(1),u.add(1).negate(),Wt(r,0,1)).toVar(),h=sa(d.sub(u),d.add(u),l.add(o)).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Do(h,a,t.isMask)}});var id=(e,t)=>e.element(t);Xo("fresnel",(e,t,a)=>{let r=id(Rt,2).w.equal(-1),s=de(id(Lt,0).z,id(Lt,1).z,id(Lt,2).z).negate(),i=Ee.sub(St),n=Nt(r,i,s),l=e.getFloat("bias").add(e.getFloat("scale").mul(Ie(Be(e.getFloat("factor").add(Ha(or(n),or(sd)))),e.getFloat("intensity")))),o=Wt(l,0,1).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Do(o,a,t.isMask)}});var nd=e=>e,ld=e=>e;Xo("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=$(),p=pe(r.element(0)).toVar(),g=ne(h.div(c)).toVar(),f=ne(R(.5).add(g.x),g.y).toVar(),_=ne(pa(m).mul(f.x).sub(ea(m).mul(f.y)),ea(m).mul(f.x).add(pa(m).mul(f.y))).toVar(),y=ne(c.sub(.5).add(d).div(2).add(_.div(2))),x=R(Ha(y,_).div(Ha(_,_))).toVar();he(o.equal(Pe(1)),()=>{x.assign(Oa(c.add(h).mul(3),c.add(d).add(1)).add(m))}).ElseIf(o.equal(Pe(2)),()=>{let e=Qe(c.x.add(h.x).sub(.5).add(d.x),c.y.add(h.y).sub(.5).add(d.y)).mul(-1);x.assign(U(m.div(we).div(-2).add(e.div(we).mul(.5))))});for(let e=1;e<l;e++){let t=nd(s.element(e-1)),a=nd(s.element(e)),i=Wt(x.sub(t).div(a.sub(t)),R(0),R(1)),n=nd(Nt(u,sa(R(0),R(1),i),i));p.assign(Xt(p,ld(r.element(e)),n))}let v=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Do(v,a,t.isMask)}}),Xo("matcap",(e,t,a)=>{let r=e.getFloat("rotation"),s=or(Ve.negate()),i=or(de(s.z,0,s.x.negate())),n=ya(s,i),l=ne(Ha(i,Qa),Ha(n,Qa)),o=pa(r),u=ea(r),d=ne(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:Do(m,a,t.isMask)}}),Xo("noise",(e,t,a)=>{try{if("0"===new URLSearchParams(window.location.search).get("dbgnoise"))return{color:de(0),calpha:R(0)}}catch{}let r=Math.trunc(e.getValue("noiseType")??0),s=R(It(Be(e.getFloat("scale")),.001)).toVar(),i=de(ko.div(e.getVec3("size"))).toVar();i.divAssign(s);let n=e.getFloat("move"),l=e.getVec4("colorA"),o=e.getVec4("colorC"),u=pe(0).toVar();if(5===r){let t=e.getFloat("smoothness"),a=R($u(i.add(n),e.getInt("voronoiStyle"),t,e.getFloat("seed"),e.getInt("quality"))).toVar();a.assign(ju(a,e.getFloat("lowCut"),e.getFloat("highCut"),R(0),R(1))),a.assign(Wu(a,R(0),t.mul(.25))),a.assign(Gu(a,R(1),t.mul(.25))),u.assign(Xt(l,o,a))}else{let t=Xu[r]??Xu[0],a=e.getVec4("colorB"),s=e.getVec4("colorD"),d=de(e.getVec2("distortion"),1).toVar(),h=de(e.getVec2("fA"),1).toVar(),m=de(e.getVec2("fB"),1).toVar(),c=de(t(i),t(i.add(de(1))),t(i.add(de(1)))).toVar(),p=de(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=R(t(i.add(p))).toVar();u.assign(Xt(l,a,Wt(g.mul(g).mul(4),R(0),R(1)))),u.assign(Xt(u,o,Wt(it(c),R(0),R(1)))),u.assign(Xt(u,s,Wt(it(p.x),R(0),R(1))))}let d=t.alpha.mul(u.a).mul(t.mask);return{color:Wt(u,R(0),R(1)).rgb,calpha:Do(d,a,t.isMask)}}),Xo("normal",(e,t,a)=>({color:K(or(Qa)).mul(va(de(.5),e.getVec3("cnormal"))),calpha:Fo(t.alpha.mul(t.mask),a)}));var od=2*Math.PI,ud=Math.PI/180,dd=le(e=>{let t=U(e.p.xyx.mul(.1031)).toVar();return t.addAssign(Ha(t,t.yzx.add(33.33))),U(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_pattern_hash12",type:"float",inputs:[{name:"p",type:"vec2"}]});function hd(e){return dd({p:e})}var md=le(e=>{let t=e.uv,a=.5,r=R(e.a.mul(ud)).toVar(),s=ne(pa(r).mul(t.x.sub(a)).add(ea(r).mul(t.y.sub(a))).add(a),pa(r).mul(t.y.sub(a)).sub(ea(r).mul(t.x.sub(a))).add(a));return U(s)}).setLayout({name:"spe_pattern_rotate_uv",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"a",type:"float"}]});function cd(e,t){return md({uv:e,a:t})}var pd=le(e=>{let t=ne(e.uv.mul(e.frequency)).toVar(),a=ne(P(t)).toVar(),r=R(Jt(a.y,2)).toVar();t.x.addAssign(r.mul(e.zigzag));let s=ne(U(t)).toVar();s.assign(s.mul(2).sub(1)),a.assign(P(t));let i=R(hd(a).mul(5).add(1)).toVar(),n=R(Xt(R(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 gd(e,t,a,r,s){return pd({uv:e,frequency:t,variation:a,zigzag:r,rotation:s})}var fd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,it(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"}]}),_d=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar(),a=R(it(t)).toVar(),r=R(sa(e.smoothness.negate(),e.smoothness,a.sub(e.size))).toVar(),s=R(sa(e.smoothness.negate(),e.smoothness,a.sub(e.size.mul(.5)))).toVar();return r.add(E(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"}]}),yd=le(e=>{let t=R(R(od).div(R(e.n))).toVar(),a=R(e.r.mul(Fa(t.mul(.5)))).toVar(),r=ne(e.p.yx.negate()).toVar(),s=R(t.mul(P(Qe(r.y,r.x).add(t.mul(.5)).div(t)))).toVar(),i=ne(pa(s),ea(s)).toVar();return r.assign(ne(i.x.mul(r.x).add(i.y.mul(r.y)),i.y.negate().mul(r.x).add(i.x.mul(r.y)))),it(r.sub(ne(e.r,Wt(r.y,a.negate(),a)))).mul(Qt(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"}]}),xd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,yd({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"}]}),vd=le(e=>{let t=e.b,a=ne(Be(e.p)).toVar();a.assign(Nt(a.y.greaterThan(a.x),a.yx,a.xy));let r=ne(a.sub(t)).toVar(),s=R(It(r.y,r.x)).toVar(),i=ne(Nt(s.greaterThan(0),r,ne(t.y.sub(a.x),s.negate()))).toVar();return Qt(s).mul(it(It(i,ne(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"}]}),bd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,vd({p:t,b:ne(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"}]}),Td=le(e=>{let t=e.b,a=ne(Be(e.p)).toVar(),r=ne(t.sub(a.mul(2))).toVar(),s=r.x.mul(t.x).sub(r.y.mul(t.y)),i=R(Wt(s.div(Ha(t,t)),R(-1),R(1))).toVar();return R(it(a.sub(t.mul(.5).mul(ne(E(i),i.add(1)))))).toVar().mul(Qt(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"}]}),wd=le(e=>{let t=ne(gd(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return sa(e.smoothness.negate(),e.smoothness,Td({p:t,b:ne(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"}]}),Sd=le(e=>{let t=ne(e.uv.mul(e.frequency)).toVar(),a=ne(P(t)).toVar(),r=R(Jt(a.y,2)).toVar();t.x.addAssign(r.add(e.zigzag.mul(r)));let s=R(P(t.x)).toVar();return Jt(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"}]}),Vd=le(e=>{let t=ne(gd(e.uv,e.frequency,R(0),e.zigzag,e.rotation)).toVar(),a=R(P(e.uv.mul(e.frequency)).y).toVar(),r=R(hd(ne(a))).toVar(),s=R(Xt(e.size,e.size.mul(r),e.variation)).toVar();return sa(s.sub(e.smoothness),s.add(e.smoothness),Be(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"}]}),Md=le(e=>{let{a:t,b:a,c:r,d:s}=e,i=ne(e.p.sub(ne(s,t)).mul(r)).toVar();i.x.assign(Jt(i.x,od)),he(i.x.greaterThan(Math.PI),()=>{i.x.assign(R(od).sub(i.x))});let n=R(0).toVar(),l=R(od).toVar();ge(24,()=>{let e=R(n.add(l).mul(.5)).toVar(),t=R(e.sub(i.x).add(a.mul(r).mul(ea(e)).mul(i.y.sub(a.mul(r).mul(pa(e)))))).toVar();he(t.lessThan(0),()=>{n.assign(e)}).Else(()=>{l.assign(e)})});let o=R(n.add(l).mul(.5)).toVar(),u=ne(o,a.mul(r).mul(pa(o))).toVar();return it(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"}]}),Cd=le(e=>{let t=R(e.frequency.x).toVar(),a=ne(e.uv.mul(t)).toVar(),r=ne(P(a)).toVar(),s=R(Jt(r.y,2)).toVar();a.x.addAssign(s.mul(e.zigzag));let i=ne(a.x,U(a.y)).toVar(),n=R(e.frequency.y.mul(.1)).toVar(),l=R(Md({p:i,a:R(.5),b:R(.125),c:n.mul(od),d:R(0)})).toVar(),o=R(hd(ne(r.y))).toVar(),u=R(Xt(e.size,e.size.mul(o),e.variation)).toVar();return sa(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 Rd(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 _d(a);case 2:return xd({...a,sides:t.sides});case 3:return bd(a);case 4:return wd(a);case 5:return Sd(a);case 6:return Vd(a);case 7:return Cd(a);default:return fd(a)}}Xo("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:R(Ie(g,5)).toVar(),zigzag:f,rotation:_,sides:v};if(4===n){let e=de(ko).toVar(),t=R(.0125).toVar(),a=ne(U(e.xy.mul(t))).toVar(),n=ne(U(e.zy.mul(t))).toVar(),l=ne(U(e.xz.mul(t))).toVar();a.assign(cd(a.add(u),_)),n.assign(cd(n.add(u),_)),l.assign(cd(l.add(u),_));let d=R(Rd(i,{uv:a,...b})).toVar(),h=R(Rd(i,{uv:n,...b})).toVar(),m=R(Rd(i,{uv:l,...b})).toVar(),c=R(E(o).mul(125).add(3)).toVar(),p=de(Ao).toVar(),g=de(Be(or(p))).toVar();g.assign(Ie(g,de(c))),g.divAssign(Ha(g,de(1))),d.mulAssign(g.z),h.mulAssign(g.x),m.mulAssign(g.y),r=R(d.add(h).add(m)).toVar(),s=ne(a.mul(g.z).add(n.mul(g.x)).add(l.mul(g.y))).toVar()}else{let e=ne(0).toVar();if(0===n)e.assign($());else if(2===n){let t,a,r=de(ko).toVar(),s=R(it(r)).toVar();0===l?(t=R(Qe(r.y,r.z)).toVar(),a=R(Fe(r.x.div(s))).toVar()):1===l?(t=R(Qe(r.x,r.z)).toVar(),a=R(Fe(r.y.div(s))).toVar()):(t=R(Qe(r.y,r.x)).toVar(),a=R(Fe(r.z.div(s))).toVar()),e.assign(ne(t,a).div(Math.PI))}e.addAssign(u),e.assign(U(e)),e.assign(cd(e,_)),r=Rd(i,{uv:e,...b}),s=e}let T=pe(Xt(d,h,r)).toVar();T.a.assign(Wt(T.a,R(0),R(1))),T.a.mulAssign(va(y.x,s.y).mul(va(s.y,y.y))),T.a.mulAssign(va(x.x,Be(s.x)).mul(va(Be(s.x),x.y)));let w=t.alpha.mul(Wt(T.a,R(0),R(1))).mul(t.mask);return{color:Wt(T,pe(0),pe(1)).rgb,calpha:Do(w,a,t.isMask)}});var zd=(e,t)=>e.element(t);Xo("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=R(0).toVar();!1!==t.noiseCompiledIn&&he(n.notEqual(0),()=>{let e=ko.div(l).toVar(),t=Tu(e.mul(1.6).add(de(1.8,1.5,1.9).mul(Tu(e))).add(de(1.7,9.2,1)));u.assign(t.mul(n))});let d=i.mul(de(1,.8,.6)).add(1),h=zd(Rt,2).w.equal(-1),m=de(zd(Lt,0).z,zd(Lt,1).z,zd(Lt,2).z).negate(),c=Ee.sub(St),p=Nt(h,c,m),g=Ha(or(p.add(o.mul(-.001))),or(sd)),f=pa(r.add(u).div(d).mul(g).add(s)).mul(.5).add(.5),_=de(Wt(f,0,2)).toVar(),y=Wt(_.r.add(_.g).add(_.b),0,1);return{color:_,calpha:Do(t.alpha.mul(y).mul(t.mask),a,t.isMask)}});var kd=e=>e,Ad=e=>e,Pd=ge,Ed=ge,Nd=le(e=>{let t=e.x,a=de(Ha(t,de(127.1,311.7,74.7)),Ha(t,de(269.5,183.3,246.1)),Ha(t,de(113.5,271.9,124.6)));return U(ea(a).mul(43758.5453123))}).setLayout({name:"spe_toonHash3",type:"vec3",inputs:[{name:"x",type:"vec3"}]}),Bd=le(e=>{let t=e.x,a=P(t).toVar(),r=U(t).toVar(),s=R(100).toVar(),i=()=>({start:Pe(-1),end:Pe(1),condition:"<=",type:"int"});return Ed(i(),i(),i(),({i:e,j:t,k:i})=>{let n=de(e,t,i).toVar(),l=n.sub(r).add(function(e){return Nd({x:e})}(a.add(n))).toVar(),o=Ha(l,l).toVar();he(o.lessThan(s),()=>{s.assign(o)})}),s.sqrt()}).setLayout({name:"spe_toonVoronoiF1",type:"float",inputs:[{name:"x",type:"vec3"}]});Xo("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=or(sd).toVar(),c=R(0).toVar();!0===a.lightsAvailable&&he(r.equal(Pe(0)),()=>{Pd({start:Pe(0),end:w.toonLightCount,condition:"<",type:"int"},({i:e})=>{let t=w.toonLightData.element(e).toVar(),a=t.xyz,r=t.w,s=Nt(r.greaterThan(.5),or(a),or(a.sub(Ee))),i=Ha(s,m).mul(.5).add(.5);c.assign(It(c,i))}),c.assign(Wt(c,0,1))}),he(r.equal(Pe(1)),()=>{let e=Xt(ko,Ee,Nt(l,R(1),R(0))),t=or(n.sub(e));c.assign(Ha(t,m).mul(.5).add(.5))}).ElseIf(r.equal(Pe(2)),()=>{let e=St.sub(h),t=or(e.sub(Ee));c.assign(Ha(t,m).mul(.5).add(.5))}),he(o.greaterThan(0),()=>{let e=ko.div(u),t=R(1).sub(Bd({x:e}));c.addAssign(t.mul(o))}),c.assign(Wt(c,0,1));let p=(e.getValue("colors")??s.array).length,g=(e.getValue("steps")??i.array).length,f=Math.min(10,p,g),_=pe(s.element(0)).toVar();for(let e=1;e<f;e++){let t=kd(i.element(e-1)),a=kd(i.element(e)),r=Wt(c.sub(t).div(a.sub(t)),R(0),R(1));_.assign(Xt(_,Ad(s.element(e)),sa(0,1,r)))}!0===a.lightsAvailable&&he(r.equal(Pe(0)),()=>{let e=R(1),t=Xt(_.rgb,d.rgb,d.a);_.rgb.assign(Xt(t,_.rgb,e))});let y=t.alpha.mul(_.a).mul(t.mask);return{color:_.rgb,calpha:Fo(y,a)}});var Ld=e=>e,Id=e=>e,Dd=e=>e,Fd=e=>e;Xo("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)=>Lt.element(t))(0,e),u=or(de(o(0).z.negate(),o(1).z.negate(),o(2).z.negate())),d=or(Ee.sub(St)),h=w.orthographicUniform,m=Nt(h.greaterThan(.5),u,d).toVar(),c=or(sd).toVar(),p=ut(m,c,R(1).div(s)).toVar(),g=or(p).mul(r).mul(Po).toVar(),f=e=>{let t=w.unjitteredProjection.mul(Lt).mul(pe(e,1)),a=t.xy.div(t.w);return ne(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5))},_=f(Ee.add(g).toVar()).toVar(),y=(f(Ee).toVar(),i.mul(Wt(s.mul(2).sub(2),R(0),R(1))).toVar()),x=V(l.x).mul(y).toVar(),v=y,b=Ht(x.div(5.5),R(8.5)).toVar(),T=null,S="fit",M=!0,C=!1,z=12,k="white",A=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))&&(A=Math.max(0,Number(r))),"6"===a&&(S="ring",z=6),"0"===e.get("dbgwarp")&&(M=!1),"1"===e.get("dbgdither")&&(C=!0);let s=e.get("dbgangle");("classic"===s||"0"===s)&&(k=s)}catch{}null!==T&&Number.isFinite(T)&&b.assign(R(T));let E,N=(()=>{if("singlewide"===S)return Ht(b.add(1),R(8.5)).toVar();if("fit"!==S)return b;let e=w.transmissionActualSize.x.div(w.resolution.x),t=v.mul(b).mul(5*A).mul(e).toVar();return Ht(V(rr(b.mul(2)).add(t.mul(t).mul(3))).mul(.5),R(8.5)).toVar()})(),B=e=>n.sample(M?(e=>{let t=w.transmissionActualSize.div(rr(P(N))),a=e.mul(t).sub(.5),r=P(a),s=a.sub(r),i=s.mul(s).mul(ne(3,3).sub(s.mul(2)));return r.add(.5).add(i).div(t)})(e):e).level(N).rgb,L="r50"===S?.5:"r75"===S?.75:1;if("single"===S||"singlewide"===S||"fit"===S)if("fit"===S){let e=P(N).toVar(),t=N.sub(e).toVar(),a=fa(rr(t.mul(2)).sub(1)).mul(1.1547).toVar(),r=ne(rr(e)).div(w.transmissionActualSize).mul(a).toVar(),s=de(0).toVar(),i=12;for(let t=0;t<i;t++){let a=Id(ee(t,i,R(0))),l=Id(_.add(a.mul(r)));s.addAssign(Dd(Fd(n.sample(l).level(e)).rgb))}E=s.div(i).toVar()}else E=B(_).toVar();else{let e=ne(R(1).div(w.resolution.x),R(1).div(w.resolution.y)).toVar(),t=Q("classic"===k?Mt.xy.add(w.cameraJitterPx):Mt.xy).mul(6.28318530718);"white"===k&&(t=t.add(w.tapAngle));let a=t.toVar(),r=w.tapAngle.mul(13.7).toVar(),s=w.tapAngle2.mul(5.3).toVar(),i=ne(rr(P(N).add(1))).div(w.transmissionActualSize).toVar(),n=Q(Mt.xy.add(ne(r,s))).toVar(),l=Q(Mt.xy.add(ne(s.mul(1.71),r.mul(2.39)))).toVar(),o=de(0).toVar();for(let t=0;t<z;t++){let r=Id(ee(t,z,a)).mul(e).mul(v).mul(b.mul(10)).mul(L),s=Id(_.add(r));if(C){let e=Ld(U(n.add(.7548776662*t))),a=Ld(U(l.add(.5698402911*t))),r=Id(ne(e.sub(.5),a.sub(.5)).mul(i));s=Id(s.add(r))}o.addAssign(B(s))}E=o.div(z).toVar()}if(e.has("attenuationDistance")){let t=e.getFloat("attenuationDistance"),a=de(e.getColor("attenuationColor")).toVar();he(t.greaterThan(0),()=>{let e=Ie(It(a,de(1e-4)),de(r.div(t)));E.mulAssign(e)})}let I=t.alpha.mul(t.mask).toVar(),D=I.div(Wt(I.add(a.accumAlpha),R(1e-5),R(1))).toVar();return a.accumAlpha.addAssign(R(1).sub(a.accumAlpha).mul(t.alpha)),{color:E,calpha:D}}),Xo("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=W("__splinePlanarMirror","float"),f=p.greaterThan(.5).and(g.greaterThan(.5)),_=w.reflectionResolveTarget,y=w.reflectionResolveEnabled,x=w.orthographicUniform.greaterThan(.5),v=Nt(x,de(0,0,-1),or(Ve)).toVar(),b=or(Qa).toVar(),T=nt(v,b).toVar(),S=Wt(r.mul(.1),R(0),R(1)).toVar(),M=w.resolution,C=de(0).toVar(),z=y.greaterThan(.5).and(S.greaterThan(.05)).and(f.not()),k=or(ir(T,Ut)).toVar(),A=Gi(m,k,S).toVar(),P=_.sample(kt).level(R(0)).toVar();he(z,()=>{let e=P.a.toVar();C.assign(Xt(A,P.rgb.div(e.max(1e-4)),Wt(e.mul(2),R(0),R(1))))}).Else(()=>{C.assign(qi({dials:{blur:r,thickness:s,steps:i,stepSize:n,tracingMode:l},surface:{originView:Ve,normalV:b,screenUv:kt,fragWindowZ:Na},camera:{projectionMatrix:Rt,projectionMatrixInverse:Pt,worldMatrix:Ut,near:vt},resources:{colorMap:o,depthPyramid:u,depthPyramidNode:d,envMap:m},usePlanar:f,noisePixel:kt.mul(M).floor()}))}),he(f,()=>{let e=ne(R(1).sub(kt.x),kt.y).toVar(),t=R(h.sub(1)),a=Ht(V(S.mul(M.y).mul(.075).add(1)),t).toVar(),r=a.sub(1).max(0).floor().toVar(),s=R(2).pow(a).sub(1).max(0).toVar(),i=s.mul(.75).div(M.y).toVar();C.assign(Ui(c,e,i,s.mul(.75),r))});let E=t.alpha.mul(t.mask).toVar(),N=E.div(Wt(E.add(a.accumAlpha),R(1e-5),R(1))).toVar();return a.accumAlpha.addAssign(R(1).sub(a.accumAlpha).mul(E)),{color:C,calpha:N}});var Ud=e=>e,Od=e=>e;function Gd(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=Fr[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(";")}Xo("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=dt("randomColor","vec3").x.toVar(),x=Na.toVar(),v=kt.toVar(),b=ne(R(1).div(f.x),R(1).div(f.y)).toVar(),T=w.pcssHalton,S=Q(Mt.xy.add(T)).mul(6.28318530718).toVar(),V=c.select(i.div(2),i),M=b.mul(V).mul(_).toVar(),C=[[-1,-1],[0,-1],[1,-1],[-1,0],[0,0],[1,0],[-1,1],[0,1],[1,1]],z=e=>ee(e,9,S).mul(b),k=[],A=R(0).toVar();for(let e=0;e<9;e++){let[t,a]=C[e],r=4===e?v:Ud(v.add(ne(M.x.mul(t),M.y.mul(a))).add(z(e))),s=Ud(r).toVar(),i=Od(p.sample(s)).toVar();k.push(i),he(i.a.notEqual(y).and(i.a.notEqual(0)),()=>{let e=g.sample(s).r.add(1e-4);he(x.greaterThan(e),()=>{A.assign(1)})})}let P=k[2].rgb.add(k[5].rgb.mul(2)).add(k[8].rgb).sub(k[0].rgb.add(k[3].rgb.mul(2)).add(k[6].rgb)),E=k[0].rgb.add(k[1].rgb.mul(2)).add(k[2].rgb).sub(k[6].rgb.add(k[7].rgb.mul(2)).add(k[8].rgb)),N=fa(Ha(P,P).add(Ha(E,E))).mul(A.oneMinus()).toVar(),B=de(r).toVar(),L=sa(l.sub(u),l.add(u),N).toVar(),I=or(sd).toVar(),D=R(1).sub(o).toVar();he(m,()=>{let e=ko.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=U(t.mul(d).mul(.01)),r=j(t.mul(d)),i=sa(r.mul(n.mul(.01)),r.mul(n.mul(.02)),a).toVar();he(i.lessThan(1).and(L.equal(0)),()=>{B.assign(s),L.assign(1)})}).Else(()=>{let e=I.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=j(t.mul(o)).toVar(),r=ea(t.mul(d)).toVar(),i=sa(R(0),a.mul(n),R(1).sub(r)).toVar();he(a.greaterThan(D.mul(.5)).and(i.lessThan(1)).and(L.equal(0)),()=>{B.assign(s),L.assign(R(1).sub(i))})});let F=t.alpha.mul(L).mul(t.mask).toVar(),O=F.div(Wt(F.add(a.accumAlpha),R(1e-5),R(1))).toVar();return a.accumAlpha.addAssign(R(1).sub(a.accumAlpha).mul(F)),{color:B,calpha:O}}),Xo("vertexColor",(e,t,a)=>{let r=Te(),s=t.alpha.mul(t.mask).mul(r.a);return{color:r.rgb,calpha:Fo(s,a)}});var qd=e=>e,Wd=e=>e;function Hd(e,t=1){let a=new Ms(e);return new Or(a.r,a.g,a.b,t)}function jd(e,t){if(e instanceof Or)return e;if(e instanceof Ms)return new Or(e.r,e.g,e.b,1);if("number"==typeof e)return Hd(e);if("object"==typeof e&&null!==e&&"r"in e&&"g"in e&&"b"in e){let t=e;return new Or(t.r,t.g,t.b,t.a??1)}return t()}function Kd(){let e=new Array(10).fill(new xs(0,0,0,1)).map(e=>e.clone());return e[1]=new xs(1,1,1,1),e}function $d(){let e=new Array(10).fill(1);return e[0]=0,e}var Xd={color:{color:{kind:"color",def:()=>Hd(Yr)}},vertexColor:{},cavity:{ridge:{kind:"float",def:()=>1},valley:{kind:"float",def:()=>1}},fresnel:{color:{kind:"color",def:()=>Hd(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:()=>Hd(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 ms},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},offset:{kind:"vec3",def:()=>new ms}},transmission:{thickness:{kind:"float",def:()=>10},ior:{kind:"float",def:()=>1.5},roughness:{kind:"float",def:()=>.5},attenuationColor:{kind:"color",def:()=>Hd(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:Kd},steps:{kind:"floatArray",def:$d},source:{kind:"vec3",def:()=>new ms},isWorldSpace:{kind:"bool",def:()=>!0},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},shadowColor:{kind:"colorVec4",def:()=>new Or(0,0,0,0)},offset:{kind:"vec3",def:()=>new ms}},outline:{outlineColor:{kind:"color",def:()=>Hd(16777215)},contourColor:{kind:"color",def:()=>Hd(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 ms(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 ms},direction:{kind:"vec3",def:()=>new ms(1,0,0)},colors:{kind:"vec4array",def:()=>[new xs(0,0,0,1),new xs(1,1,1,1)]},steps:{kind:"floatArray",def:()=>[0,1]}},noise:{scale:{kind:"float",def:()=>1},size:{kind:"vec3",def:()=>new ms(100,100,100)},move:{kind:"float",def:()=>1},fA:{kind:"vec2",def:()=>new ds(1.7,9.2)},fB:{kind:"vec2",def:()=>new ds(8.3,2.8)},distortion:{kind:"vec2",def:()=>new ds(1,1)},colorA:{kind:"colorVec4",def:()=>new Or(.4,.4,.4,1)},colorB:{kind:"colorVec4",def:()=>new Or(.4,.4,.4,1)},colorC:{kind:"colorVec4",def:()=>new Or(1,1,1,1)},colorD:{kind:"colorVec4",def:()=>new Or(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 ms(1,1,1)}},gradient:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},colors:{kind:"vec4array",def:Kd},steps:{kind:"floatArray",def:$d},offset:{kind:"vec2",def:()=>new ds},morph:{kind:"vec2",def:()=>new ds},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 ds},colorA:{kind:"colorVec4",def:()=>new Or(0,0,0,1)},colorB:{kind:"colorVec4",def:()=>new Or(1,1,1,1)},frequency:{kind:"vec2",def:()=>new ds(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 ds(0,1)},horizontal:{kind:"vec2",def:()=>new ds(0,1)},sides:{kind:"int",def:()=>6}}},Qd=new xs;function Zd(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 Yd(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 Jd(e,t,a,r){let s,i,n=e.params;switch(a){case"float":s=N(Number(r??0));break;case"int":s=N(Number(r??0),"int");break;case"axis":s=N(["x","y","z"].indexOf(String(r)),"int");break;case"bool":s=N(!!r);break;case"vec2":s=N(r instanceof ds?r:new ds);break;case"vec3":s=N(r instanceof ms?r:new ms);break;case"vec4":s=N(r instanceof xs?r:new xs);break;case"color":{let e=jd(r,()=>Hd(16777215));s=N(e),i=e;break}case"colorVec4":{let a=jd(r,()=>new Or(1,1,1,1)),n=new xs(a.r,a.g,a.b,a.a),l=N(n);l.onObjectUpdate(r=>{let s=Zd(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=Yd(t,s),n=r.get(i);if(void 0===n){let s=N(a[i]??new xs);s.onObjectUpdate(r=>(Zd(r,e).params.getValue(t)??a)[i]??Qd),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 xs]),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=Yd(t,s),n=r.get(i);if(void 0===n){let s=N(a[i]??0);s.onObjectUpdate(r=>{let s=Zd(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&&(No(s),s.onObjectUpdate(a=>{let r=Zd(a,e).params.getValue(t);void 0!==r&&Lo(s,r)})),n.set(t,s,i),e.uniformKinds.set(t,a)}var eh=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 cs).makeRotation(this.rotation*ls.DEG2RAD))}},th=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 Io(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 Wr||e.deref();this.holders.length=0}},ah=class extends th{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 rh(e,t){let a=e.data;"displace"!==a.type?("alpha"in a&&e.params.has("alpha")&&e.params.setValue("alpha",Lr(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",(Ir(a.intensity,t)??1)*(a.visible?1:0))}function sh(e,t){Jd(e,"alpha","float",t.alpha??1),Jd(e,"mode","int",t.mode??0),Jd(e,"isMask","float",t.isMask?1:0)}function ih(e,t,a,r){let s=new ah(e,t,a),i=a;if(Jd(s,"alpha","float",Lr(i.alpha,r)),Jd(s,"mode","int",i.mode??0),Jd(s,"bumpMapIntensity","float",i.bumpMapIntensity??5),Jd(s,"alphaOverride","float",Lr(i.alphaOverride,r)),a.visible)if("lambert"===i.category)Jd(s,"emissive","color",r.color(i.emissive)??Hd(0)),Jd(s,"occlusion","bool",i.occlusion??!0);else if("toon"===i.category)Jd(s,"shininess","float",i.shininess??30),Jd(s,"specular","color",r.color(i.specular)??Hd(1118481));else if("physical"===i.category){Jd(s,"roughness","float",i.roughness??.3),Jd(s,"metalness","float",i.metalness??0),Jd(s,"reflectivity","float",i.reflectivity??.5),Jd(s,"occlusion","bool",i.occlusion??!0),Jd(s,"normalScale","float",i.normalScale??1),Jd(s,"aoMapIntensity","float",i.aoMapIntensity??1),Jd(s,"emissive","color",void 0!==i.emissive?r.color(i.emissive)??Hd(0):Hd(0)),Jd(s,"emissiveIntensity","float",i.emissiveIntensity??1);let e=i;void 0!==e.clearcoat&&(Jd(s,"clearcoat","float",e.clearcoat),Jd(s,"clearcoatRoughness","float",e.clearcoatRoughness??.1)),void 0!==e.sheen&&(Jd(s,"sheen","float",e.sheen),Jd(s,"sheenColor","color",void 0!==e.sheenColor?r.color(e.sheenColor)??Hd(16777215):Hd(16777215)),Jd(s,"sheenRoughness","float",e.sheenRoughness??.5)),void 0!==e.ior&&(Jd(s,"ior","float",e.ior),Jd(s,"specularIntensity","float",e.specularIntensity??1),Jd(s,"specularColor","color",void 0!==e.specularColor?r.color(e.specularColor)??Hd(16777215):Hd(16777215))),void 0!==e.iridescence&&(Jd(s,"iridescence","float",e.iridescence),Jd(s,"iridescenceIOR","float",e.iridescenceIOR??1.3),Jd(s,"iridescenceThickness","float",e.iridescenceThickness??400))}else Jd(s,"shininess","float",i.shininess??30),Jd(s,"specular","color",void 0!==i.specular?r.color(i.specular)??Hd(1118481):Hd(1118481)),Jd(s,"occlusion","bool",i.occlusion??!0);return s.node.alphaOverride=s.params.get("alphaOverride"),rh(s,r),s}function nh(e,t,a,r){let s=new th("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=qa(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=Ir(a.texture.rotation??0,r)??0;if("matcap"===a.type)Jd(s,"rotation","float",o*ls.DEG2RAD);else{let e=N(new ds(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=N(i.loaded||i.isBuffer?1:0);t.onRenderUpdate(()=>i.loaded||i.isBuffer?1:0),s.params.set("loaded",t),s.uniformKinds.set("loaded","float"),Jd(s,"crop","float",a.crop?1:0),Jd(s,"projection","int",a.projection??0),Jd(s,"axis","axis",a.axis),Jd(s,"projectionAxis","axis",a.projectionAxis),Jd(s,"side","int",a.side??0);let l=a.size?new ds(Ir(a.size[0],r)??0,Ir(a.size[1],r)??0):new ds(100,100);Jd(s,"size","vec2",l),Jd(s,"blending","float",a.blending??0);let u=new cs,d=new eh([Ir(a.texture.repeat?.[0]??1,r)??1,Ir(a.texture.repeat?.[1]??1,r)??1],[Ir(a.texture.offset?.[0]??0,r)??0,Ir(a.texture.offset?.[1]??0,r)??0],o,u),h=N(u);No(h),h.onObjectUpdate(e=>{let t=Zd(e,s).params.getNodeValue("mat");void 0!==t&&Lo(h,t)}),s.params.set("mat",h,d)}return sh(s,{alpha:Lr(a.alpha,r),mode:a.mode??0,isMask:a.isMask??!1}),rh(s,r),s}function lh(e,t,a,s){if("light"===a.type)return ih(e,t,a,s);if("texture"===a.type||"video"===a.type||"matcap"===a.type)return nh(e,t,a,s);if("displace"===a.type)return function(e,t,a,r){if("noise"!==a.displacementType)throw new Error;let s=new th("vertex",e,t,a),i=(e,t)=>Ir(e,r)??t;return Jd(s,"offset","vec3",new ms(...a.offset.map(e=>i(e,0)))),Jd(s,"scale","float",i(a.scale,10)),Jd(s,"intensity","float",i(a.intensity,8)),Jd(s,"movement","float",i(a.movement,1)),Jd(s,"noiseType","int",a.noiseType??0),Jd(s,"voronoiStyle","int",a.voronoiStyle??0),Jd(s,"smoothness","float",i(a.smoothness,.5)),Jd(s,"seed","float",i(a.seed,0)),Jd(s,"highCut","float",i(a.highCut,1)),Jd(s,"lowCut","float",i(a.lowCut,0)),Jd(s,"quality","int",Ir(a.quality,r)??1),rh(s,r),s}(e,t,a,s);let i=new th("fragment",e,t,a),n=r(a,s),l=Xd[a.type]??Xd.color;for(let[e,t]of Object.entries(l))Jd(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;Jd(i,"aspectRatio","vec2",e>=t?new ds(t/e,1):new ds(1,e/t))}return sh(i,n),rh(i,s),i}var oh={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"]}]},uh=class extends Ct{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=Mi.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){Ci.add(e)}(this),this.addEventListener("dispose",()=>function(e){Ci.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(${Gd(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(Gd(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 Ai?Mi.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 vertexObjectNormal(){return this.shapeBlendObjectNormal??this.root.displacedObjectNormal}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??Kr.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=lh(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 ah);if(void 0===s&&(s=ih(0,"",{...jr.defaultData("light","phong"),visible:!1},t.shared)),this.lightLayer=s,this.lights=!!this.lightLayer.data.visible,this.ctx={accumAlpha:R(0).toVar("accumAlpha"),lightsAvailable:this.lights&&("phong"===this.category||"lambert"===this.category||"physical"===this.category)},this.colorNode=le(()=>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=le(()=>{let t=de(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"):R(1),{uvs:s,weights:i}=hu(e);if(null!==i){let e=de(a.sample(s[0]).rgb).toVar(),r=de(a.sample(s[1]).rgb).toVar(),n=de(a.sample(s[2]).rgb).toVar();t=e.mul(i.z).add(r.mul(i.x)).add(n.mul(i.y))}else t=de(a.sample(s[0]).rgb);return Xt(de(0),t,r)}(a.params))),t})()}let a=this.findTextureMapLayer(t.aoMap);null!==a&&(this.aoNode=le(()=>Xt(R(1),gu(a.params,t.aoMapChannel??"r"),e.getFloat("aoMapIntensity")))())}this.transparent=Br(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 uh(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(Ba(ur(t.normal))),this.castShadowPositionNode=t.position,this.shapeBlendOptions.useChildrenColors&&(this._shapeBlendColorNode=t.color,this.colorNode=le(()=>this.buildColorStack())()),this.needsUpdate=!0}lightLayerIndex(){return this.layers.findIndex(e=>e instanceof ah)}findTextureMapLayer(e){if(!e)return null;if("string"!=typeof e)return Hr.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=jr.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=nh(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 le(()=>function(e,t,a){let r=de(a??Qa).toVar(),s=Ve,i=e.get("texture"),n=e.has("loaded")?e.getFloat("loaded"):R(1),l=e=>{let a=ne(e).toVar(),l=de(i.sample(a).rgb.mul(2).sub(1)).toVar(),o=de(Xt(de(0,0,1),l,n)).toVar();o.xy.mulAssign(t);let u=de(Ma(s)).toVar(),d=de(ka(s)).toVar(),h=ne(Ma(a)).toVar(),m=ne(ka(a)).toVar(),c=de(or(r)).toVar(),p=de(ya(d,c)).toVar(),g=de(ya(c,u)).toVar(),f=de(p.mul(h.x).add(g.mul(m.x))).toVar(),_=de(p.mul(h.y).add(g.mul(m.y))).toVar(),y=R(It(Ha(f,f),Ha(_,_))).toVar(),x=R(Nt(y.equal(0),R(0),lr.mul(Le(y)))).toVar();return or(f.mul(o.x.mul(x)).add(_.mul(o.y.mul(x))).add(c.mul(o.z)))},{uvs:o,weights:u}=hu(e);if(null!==u){let e=l(o[0]),t=l(o[1]),a=l(o[2]);return or(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 le(()=>function(e,t,a){let r=de(a??Qa).toVar(),s=Ve,i=e.get("texture"),{uvs:n,weights:l}=hu(e);if(null!==l){let e=pu(s,r,cu(i,n[0],t)),a=pu(s,r,cu(i,n[1],t)),o=pu(s,r,cu(i,n[2],t));return or(e.mul(l.z).add(a.mul(l.x)).add(o.mul(l.y)))}return pu(s,r,cu(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=ae("vec3","vDisplacedNormal");return{position:le(a=>{let r=_e,s=ja;for(let t=0;t<e.length;t++){let a=td(e[t],Qu(_e),s);r=0===t?a.position:Qu(r.add(a.position).mul(.5)),s=a.normal}let i=de(r).toVar();return t.assign(s),!0===a.needsPreviousData?.()&&be.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:Ba(ur(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=R(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=Qo(e.type)(e.params,s,this.ctx);return a?.color?{...i,color:a.color}:i}evaluateMask(e){let t=this.runLayerBuilder(e,null);return _t(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=Wd(this.runLayerBuilder(t,this.maskSourceFor(e),r?{color:Wd(r.rgb),alpha:qd(r.w)}:void 0).color);continue}if(t.isMaskEnabled)continue;let r=this.runLayerBuilder(t,this.maskSourceFor(e));a=Ho(a,r.color,r.calpha,t.modeNode)}return a??na(Yr)}setup(e){e.context.setupClearcoatNormal=()=>La(Qa,"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 iu(!0===a?.clearcoat,!0===a?.sheen,!0===a?.iridescence,!1,!1,!1);return e.envIrradianceActive=r,e}case"lambert":return new ta(!1);case"toon":{let e=new su;return e.aoOcclusionGate=t,e}default:return new ta}}(this.category,e,this.physicalLobes(),this.envNode instanceof Ai)}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=le(()=>gu(r.params,e.roughnessMapChannel??"luminance"))());let s=this.findTextureMapLayer(e.metalnessMap);null!==s&&(a=le(()=>gu(s.params,e.metalnessMapChannel??"b"))())}!function(e,t,a=null,r=null){if("phong"===e||"toon"===e)jt.assign(t.getFloat("shininess").max(1e-4)),oa.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=Wt(r.mul(e),R(0),R(1))),Ot.assign(e),gt.assign(Wt(s,R(.0525),R(1))),t.has("ior")){let a=t.getFloat("ior"),r=t.has("specularColor")?de(t.getColor("specularColor")):de(1),s=t.has("specularIntensity")?t.getFloat("specularIntensity"):R(1);Ue.assign(a),oa.assign(Ht(Oe(Ue.sub(1).div(Ue.add(1))).mul(r),de(1)).mul(s)),Jo.assign(Xt(oa,Da.rgb,e)),ma.assign(Xt(s,R(1),e))}else{let t=de(i.pow(2).mul(.16));oa.assign(t),Jo.assign(Xt(t,Da.rgb,e)),ma.assign(R(1))}if(Yo.assign(Da.rgb.mul(E(e))),t.has("clearcoat")&&($t.assign(t.getFloat("clearcoat")),aa.assign(Wt(t.getFloat("clearcoatRoughness"),R(.0525),R(1)))),t.has("sheen")){let e=t.has("sheenColor")?de(t.getColor("sheenColor")):de(1);Dt.assign(e.mul(t.getFloat("sheen"))),Gt.assign(Wt(t.getFloat("sheenRoughness"),R(.07),R(1)))}t.has("iridescence")&&(We.assign(t.getFloat("iridescence")),$e.assign(t.getFloat("iridescenceIOR")),Ze.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?de(0):Da.rgb,i=de(0),n=de(0);if(r&&(a.length>0||r.getScope().hasLights)){let e=this.setupLightingModel()||null,t=ht(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&&(Xa.assign(de(this.emissiveNode)),s=s.add(Xa)),le(()=>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=R(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=de(t).toVar();return he(qe(z(u,Da.rgb)),()=>{let e=Wt(it(a.add(r)),R(0),R(1));o.accumAlpha.addAssign(E(o.accumAlpha).mul(s).mul(n).mul(e)),u.assign(Ho(Da.rgb,u,s.mul(n),i)),u.mulAssign(au(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=de(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=Ho(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"):R(1),m=i?s:s.mul(o);if(Da.a.assign(m.mul(h)),Da.a.lessThanEqual(R(0)).discard(),this.dithering){let e=et(Mt.xy),t=de(.25/255,-.25/255,.25/255),a=Xt(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||Dr(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)&&!Dr(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(Br(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||uh.hasVariableString(s[e])||uh.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)*ls.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||Dr(r))!==e.noiseCompiledIn)return!0}let r=Fr[e.type];if(void 0!==r&&r.includes(t))return!0;let i=Ur[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)&&(rh(e,r),"intensity"!==t||"displace"===e.type))return;if("alphaOverride"===t&&e instanceof ah)return void e.setValue("alphaOverride",Lr(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):jd(n,()=>a??new Or(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(Br(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(Br(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 fs||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=oh[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()}},dh=class extends uh{constructor(e,t,a){super(e,t,!1),this.isTSLSharedMaterial=!0,this.uuid=a,this.allowVariableSaves=!0,this.saveVariableLocations(t)}};function hh(e,t){let a=e.xyz;return t.add(ya(a,ya(a,t).add(t.mul(e.w))).mul(2))}function mh(e){let t=zu(e),a=zu(de(e.y.sub(19.1),e.z.add(33.4),e.x.add(47.2))),r=zu(de(e.z.add(74.2),e.x.sub(124.5),e.y.add(99.4)));return de(t,a,r)}var ch=le(e=>{let t=e.p.add(e.seed).toVar(),a=de(.1,0,0),r=de(0,.1,0),s=de(0,0,.1),i=mh(t.sub(a)).toVar(),n=mh(t.add(a)).toVar(),l=mh(t.sub(r)).toVar(),o=mh(t.add(r)).toVar(),u=mh(t.sub(s)).toVar(),d=mh(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 or(de(h,m,c).mul(5))});function ph(e,t){return ch({p:e,seed:t})}function gh(e,t,a){return de(Iu(e.add(de(a)).mul(t)),Iu(e.add(de(a.add(20))).mul(t)),Iu(e.add(de(a.sub(30))).mul(t)))}function fh(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 _h(e,t){switch(e){case"position":return function(e){let t=fh(e.registry);return le(()=>{let a=$(),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=va(.5,p),_=R(3).mul(f),y=c.mul(R(1).add(_)),x=c.mul(Ht(t.f("uFPSRatio",1),R(5)));n.addAssign(Xt(x,y,f));let v=hh(t.v4("uWorldQuaternion"),h).add(t.v3("uWorldOffset"));n.assign(Xt(n,v,o)),d.assign(Xt(d,t.f("uTime"),o));let b=It(g.sub(t.f("uTime").sub(d)),R(0)).div(g);return Xt(pe(0),pe(n,b),u)})()}(t);case"velocity":return function(e){let t=fh(e.registry),a=e.features;return le(()=>{let r=$(),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=R(1).sub(t.f("uRandomMassFactor").mul(function(e){return e.dot(ne(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");he(c.equal(1),()=>{a.USE_CURL_NOISE&&(he(y.greaterThan(0),()=>{d.assign(ph(l.mul(y).mul(.002),x).mul(_.add(1)).mul(.05).mul(f))}),he(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(ph(l,x).mul(_).mul(.05).mul(f))})),a.USE_SIMPLEX_NOISE&&(he(y.greaterThan(0),()=>{d.assign(de(zu(l.mul(y).mul(.001)).mul(_.add(1)).mul(.1)).mul(f))}),he(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(de(zu(l.mul(_).mul(.001)).mul(.05)).mul(f))})),a.USE_FBM_NOISE&&(he(y.greaterThan(0),()=>{d.assign(gh(l.mul(y).mul(.001),_.add(1),x).mul(f))}),he(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(gh(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=It(t.f("uBounce").mul(2),R(.01)).toVar(),n=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),l=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar().div(e).toVar(),o=it(l).toVar();he(o.lessThanEqual(R(1).add(n.div(it(e)))).and(s.equal(0)),()=>{let a=l.mul(R(1).add(n.div(it(e)))),o=or(a.div(e.mul(e)));o=hh(t.v4("uColliderQuaternion"),o),r.assign(nt(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=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),o=Be(l).sub(e).toVar(),u=It(o.x,It(o.y,o.z)).toVar();he(u.lessThanEqual(n.mul(.5)).and(s.equal(0)),()=>{let e=de(0).toVar();he(o.x.greaterThan(o.y).and(o.x.greaterThan(o.z)),()=>{e.assign(de(Qt(l.x),0,0))}).ElseIf(o.y.greaterThan(o.z),()=>{e.assign(de(0,Qt(l.y),0))}).Else(()=>{e.assign(de(0,0,Qt(l.z)))});let a=hh(t.v4("uColliderQuaternion"),e);r.assign(nt(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=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos")));n=it(r.div(e)).toVar(),l=R(1)}else{let e=t.v3("uColliderSize").div(2),r=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))),s=Be(r).sub(e);n=It(s.x,It(s.y,s.z)).toVar(),l=o}he(n.lessThanEqual(l),()=>{let o=e.features.USE_SPHERE_COLLIDER?R(1).sub(n).mul(s):It(R(1).sub(l.div(n)),R(0)).mul(s),u=a.sub(t.v3("uColliderPos")),d=or(u).mul(o);r.subAssign(d),r.mulAssign(i)})}else{let e=a.sub(t.v3("uColliderPos")),n=or(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=hh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),d=Be(u).sub(o).toVar(),h=It(d.x,It(d.y,d.z)).toVar();he(h.lessThanEqual(l),()=>{let e=t.f("uForceIntensity"),l=t.v3("uColliderPos").add(hh(t.v4("uColliderQuaternion"),de(0))).sub(a).toVar(),o=de(0,1,.01),u=or(ya(o,hh(t.v4("uColliderQuaternion"),l))).toVar(),d=it(l.mul(e).mul(3)).toVar();r.assign(u.mul(d).mul(.005));let h=hh(t.v4("uWorldQuaternion"),s);r.addAssign(h.mul(n).mul(R(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(Xt(d,hh(t.v4("uWorldQuaternion"),v).mul(f),m)),d.addAssign(t.v3("uGravity").div(g.mul(.5)).mul(R(1).sub(p))),pe(d,p)})()}(t);case"emissionRate":return function(e){let t=fh(e.registry);return le(()=>{let a=$(),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=va(o,s),h=va(s,o.add(u).sub(1)),m=d.mul(h);return l.assign(Xt(l,t.f("uTime"),m)),pe(m,Xt(n,R(1),m),l,1)})()}(t)}}var yh=class{constructor(){this.nodes=new Map,this.textureNodes=new Map}getUniform(e,t){let a=this.nodes.get(e);return a||(a=N(t),this.nodes.set(e,a)),a}getTexture(e,t){let a=this.textureNodes.get(e);return a||(a=qa(t??new fs),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 fs||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}}})}}}},xh=class{constructor(e,t,a,r){this.name=e,this.kind=t,this.initialTexture=a,this.currentIndex=0,this.registry=new yh,this.depTextureNodes=new Map,this.dependencies=[],this.nodeMaterial=null,this._uniformsStore={};let s=()=>new vs(r,r,{type:as,minFilter:js,magFilter:js,wrapS:Us,wrapT:Us,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()}},vh=new $a,bh=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=qa(new fs)}addVariable(e,t,a){let r=new xh(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,qa(a.currentRenderTarget.texture))}init(){if(!this._copyMaterial){let e=new Ct;e.name="WebGPUComputation.copy",e.fragmentNode=pe(this._copyTextureNode),e.depthTest=!1,e.depthWrite=!1,e.blending=Gs,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 Ct;t.name=`WebGPUComputation.${e.kind}`,t.fragmentNode=_h(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 ds(this.sizeX,this.sizeY)}),t.depthTest=!1,t.depthWrite=!1,t.blending=Gs,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),vh.material=e,vh.render(a),a.setRenderTarget(r),a.setMRT(s)}dispose(){for(let e of this.variables)e.dispose();this._copyMaterial?.dispose()}};function Th(e,t){switch(e){case"linearFadeOut":return R(1).sub(t);case"linearInOut":return t.lessThan(.5).select(t,R(1).sub(t));case"exponentialInOut":return t.lessThan(.4).select(t.div(.4),t.greaterThan(.6).select(R(1).sub(t.sub(.6).div(.4)),R(1)));case"constant":return R(1);default:return t}}function wh(e){return e.dot(ne(12.9898,78.233)).sin().mul(43758.5453).fract()}var Sh=class extends Ct{constructor(e,t){super(),this.easeOpacity="linearFadeIn",this.easeSize="linearFadeIn",this.useSizeEnd=!1,this.isColoringRandom=!1,this._uniformsStore={},this._uPosition=qa(new fs),this._uTexture=qa(new fs),this._uColor=N(new xs(1,1,1,1)),this._uColor2=N(new xs(1,1,1,1)),this._uSize=N(1),this._uSizeEnd=N(1),this._uWorldOffset=N(new ms),this._uWorldQuaternion=N(new xs(0,0,0,1)),this._uRotation=N(0),this._uRotationEnd=N(0),this._center=N(new ds(.5,.5)),this._uRandScaleFactor=N(0),this._uRandRotationFactor=N(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=dt("particleRef","vec2"),t=this._uPosition,a=le(()=>{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=dt("position","vec3"),n=R(1).sub(r),l=this.useSizeEnd?i.mul(de(Xt(this._uSize,this._uSizeEnd,n))):i.mul(de(this._uSize.mul(Th(this.easeSize,n)))),o=xa,u=o.element(0).xyz.length(),d=o.element(1).xyz.length(),h=wh(e).toVar(),m=R(1).sub(this._uRandScaleFactor.mul(h)),c=ne(u,d).mul(m).toVar(),p=2*Math.PI,g=h.mul(this._uRandRotationFactor).mul(p),f=R(1).sub(this._uRotation).mul(p),_=R(1).sub(this._uRotationEnd).mul(p),y=Xt(f.add(g),_.add(g),r).toVar(),x=this._center,v=l.xy.sub(x.sub(ne(.5))).mul(c).toVar(),b=ne(pa(y).mul(v.x).sub(ea(y).mul(v.y)),ea(y).mul(v.x).add(pa(y).mul(v.y))).toVar(),T=ha.mul(pe(s,1)).toVar();return T.xy.addAssign(b),Rt.mul(T)}),r=le(()=>{let a=t.sample(e).w.toVar();a.lessThanEqual(.005).discard();let r=R(1).sub(a),s=this.isColoringRandom?wh(e):r,i=Xt(this._uColor,this._uColor2,s).toVar(),n=Th(this.easeOpacity,r).toVar(),l=this._uTexture.sample($()).toVar();return pe(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 Vh(e,t){return(a,r,s,i)=>{let n=s.mod(t).add(a.add(.5).div(e)).div(t),l=P(s.div(t)).add(r.add(.5).div(e)).div(t);return i.sample(ne(n,l))}}dr({createComputation:(e,t,a,r)=>new bh(e,t,a,r),createMaterial:(e,t)=>new Sh(e,t)});var Mh=[[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 Ch(e){let t=k(e.x.mul(65535).add(.5)),a=t.bitAnd(k(255)).toFloat().mul(.00392156862),r=t.shiftRight(k(8)).bitAnd(k(255)).toFloat().mul(.00392156862);return pe(r,a,e.y,e.z)}function Rh(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=Vh(l,o),d=e.pyramid1Size.width,h=e.pyramid1Size.height,m=e.pyramid2Size.width,c=e.pyramid2Size.height,p=D(Mh.map(([e,t,a])=>new ms(e,t,a)));return s=>{let g=de(0).toVar(),f=de(0,0,1).toVar(),_=pe(0).toVar(),y=s.toVar(),x=P(y.div(3)).toVar(),v=(e,t)=>ne(e.x.add(t).add(.5).div(d),e.y.add(.5).div(h)),b=(e,t)=>ne(e.x.add(t).add(.5).div(m),e.y.add(.5).div(c)),T=d-2,w=m-1,S=ne(0,0).toVar(),V=e.pyramid2.sample(b(S,w)).toVar();return he(x.lessThan(V.x),()=>{let s=R(0).toVar(),d=e=>{let t=V.add(pe(s)).toVar(),a=pe(t.yzw,s),r=pe(pe(x).greaterThanEqual(a)).mul(pe(pe(x).lessThan(t))).toVar();S.mulAssign(2),S.addAssign(ne(0,1).mul(r.x).add(ne(1,1).mul(r.y)).add(ne(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=P(S.x.div(l)).add(P(S.y.div(l)).mul(o)).toVar(),M=y.sub(s.mul(3)).mul(.0625).add(.03125),C=u(h,m,c,e.voxel).toVar().w.add(.5).mul(.00390625),z=e.triTable.sample(ne(M,C)).x.mul(2).toInt().toVar(),k=de(h,m,c).add(p.element(z)).toVar(),A=de(h,m,c).add(p.element(z.add(1))).toVar(),E=u(k.x,k.y,k.z,e.potential).toVar(),N=u(A.x,A.y,A.z,e.potential).toVar(),B=E.x.div(E.x.sub(N.x));_.assign(Xt(Ch(E.yzw),Ch(N.yzw),B)),g.assign(k.add(A.sub(k).mul(B)).sub(de(r)).mul(a));let L=u(k.x,k.y,k.z,e.voxel),I=u(A.x,A.y,A.z,e.voxel);f.assign(or(Xt(L.xyz,I.xyz,B)))}),{position:g,normal:f,color:_}}}function zh(e,t){!0===e.needsPreviousData?.()&&be.assign(t)}var kh=e=>e,Ah=e=>e,Ph=h,Eh=m;function Nh(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}function Bh(e,t,a,r){let s=Wt(e,-1,1),i=e.sub(s).mul(2).add(1),n=Wt(R(.5).add(s.mul(.5).mul(t.sub(s.mul(i).mul(a))).div(r)),0,1);return Xt(t,s.mul(i).mul(a),n).sub(s.mul(r).mul(n).mul(R(1).sub(n)))}function Lh(e,t,a,r,s){let i=R(0).toVar(),n=a.y,l=a.z,o=a.w,u=he(e.lessThan(.5),()=>{i.assign(it(t).sub(n))}).ElseIf(e.lessThan(1.5),()=>{let e=de(n,l,o),a=it(t.div(e)),r=it(t.div(e.mul(e)));i.assign(a.mul(a.sub(1)).div(r))}).ElseIf(e.lessThan(2.5),()=>{let e=de(n,l,o),a=Be(t).sub(e).toVar();i.assign(it(It(a,de(0))).add(Ht(It(a.x,It(a.y,a.z)),0)))}).ElseIf(e.lessThan(3.5),()=>{let e=Be(ne(it(t.xz),t.y)).sub(ne(l,n)).toVar();i.assign(Ht(It(e.x,e.y),0).add(it(It(e,ne(0)))))}).ElseIf(e.lessThan(4.5),()=>{let e=n,a=l,r=o,s=ne(it(t.xz),t.y).toVar(),u=ne(r,e),d=ne(r.sub(a),e.mul(2)),h=ne(s.x.sub(Ht(s.x,s.y.lessThan(0).select(a,r))),Be(s.y).sub(e)).toVar(),m=s.sub(u).add(d.mul(Wt(Ha(u.sub(s),d).div(Ha(d,d)),0,1))).toVar(),c=m.x.lessThan(0).and(h.y.lessThan(0)).select(R(-1),R(1));i.assign(c.mul(fa(Ht(Ha(h,h),Ha(m,m)))))}).ElseIf(e.lessThan(5.5),()=>{let e=ne(it(t.xy).sub(n),t.z);i.assign(it(e).sub(l))}),d=()=>{let e=Be(t.x).toVar(),a=ne(n,l),s=o,u=r.w,d=a.y.mul(e).greaterThan(a.x.mul(t.y)).select(Ha(ne(e,t.y),a),it(ne(e,t.y))),h=de(e,t.y,t.z);i.assign(fa(Ha(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 Ih(e,t=!0){let a=e.spatialDivisions,r=e.spatialn;return(s,i)=>{let n=t?pe(0).toVar():pe(0),l=R(1e3).toVar(),o=t?R(0).toVar():R(0),u=t?R(0).toVar():R(0),d=i.y.add(i.z.mul(a)).add(.5).div(a*a),h=(a,r)=>{let i=r.toVar();ge(Ph,({i:r})=>{he(i.lessThan(1),()=>{J()}),i.mulAssign(.5),he(U(i).greaterThanEqual(.5),()=>{let i=R(r).add(a).add(.5).mul(1/Eh),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=Nh(h,s.sub(d.xyz)).div(c.z).toVar(),g=Lh(m.x,p,m,c,e.meshSdf).sub(c.y).mul(c.z).toVar(),f=c.x.toVar(),_=d.w;if(l.assign(Bh(_,l,g,f)),t){let t=va(-1.5,_).mul(va(_,-.5)),a=sa(u,0,g.negate()),r=Xt(R(1),a,t);n.mulAssign(r),o.mulAssign(r),u.assign(It(u,f)),f.addAssign(e.colorKBump);let s=e.shapeRow(i,4).toVar(),l=sa(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*Ph).toVar(),n=e.spatialTex.sample(ne(i.x.mul(r).add(t).add(.5).div(r*a),d)).toVar();h(s,n.x),h(s.add(Ph),n.y),h(s.add(2*Ph),n.z),h(s.add(3*Ph),n.w)};return 1===r?m(R(0)):ge(r,({i:e})=>{m(R(e).toVar())}),t&&n.divAssign(o),{sdf:Xt(l,R(0),va(1e20,l)).toVar(),color:n,colorDivisor:o}}}var Dh=[4,4,4],Fh=(e,t)=>Ge(e,t);function Uh(e){let t=e.resolution,a=t-1,r=e.colorResolution,s=e.capacity,i=t/4,n=i-1,l=N(e.bboxHalf),o=N(e.bboxOffset),u=N(1e30),d=N(new ms(0,0,0)),h=N(new ms(i,i,i)),m=e.env.spatialDivisions,c=R(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 X(e,t,a);return s.format=bs,s.type=as,s.minFilter=js,s.magFilter=js,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=bs,T.type=as,T.minFilter=js,T.magFilter=js;let w=e.reuseTextures?.colorTexture??new X(r,r,r);w.name="SplineShapeBlend.ultraColor";let S=e.reuseTextures?.coarseTexture??new X(i,i,i);S.format=bs,S.type=as,S.minFilter=js,S.magFilter=js,S.name="SplineShapeBlend.ultraCoarse";let V=ve(8,"uint").toAtomic(),M=(e=0)=>V.element(e),C=p?ve(_?12:4,"int").toAtomic():null,z=e=>C.element(e),A=p?ve(Math.max(g,1),"float"):null,E=i*i*i,B=p?ve(E*(_?4:1),"float"):null,L=e=>Pe(e.x.add(e.y.mul(i)).add(e.z.mul(i*i))),I=e=>B.element(L(e)),F=e=>B.element(L(e).add(Pe(E))),U=e=>B.element(L(e).add(Pe(2*E))),O=e=>B.element(L(e).add(Pe(3*E))),G=e=>B.element(e.add(Pe(3*E))),q=p?ve(Math.max(g,1),"float"):null,W=_?ve(3*Math.max(x,1),"float"):null,H=e=>W.element(e),j=e=>H(Pe(e)),K=e=>H(Pe(e.add(x))),$=e=>H(e.add(Pe(2*x))),Q=_?ve(Math.max(v,1),"float"):null,Z=e=>Q.element(e),Y=_?ve(24*Math.max(x,1),"uint"):null,ee=e=>Y.element(e),te=_?N(0):null,ae=_?N(new Ss):null,re=_?N(2):null,se=D(Array.from(e.numTrisTable)),ie=D(Mh.map(([e,t,a])=>new ms(e,t,a))),ue=Ih(e.env,!1),me=Ih(e.env),ce=(e,t)=>e.div(t).mul(2).sub(1),_e=(e,t)=>e.div(t).mul(m-1).floor(),ye=le(()=>{for(let e=0;e<8;e++)st(M(e),k(0))})(),xe=le(()=>{he(Pe(fe).greaterThanEqual(Pe(s)),()=>{Ae()}),e.buffers.positions.element(Pe(fe)).assign(pe(0))})(),be=_?le(()=>{he(Pe(fe).greaterThanEqual(Pe(s)),()=>{Ae()}),y.element(Pe(fe)).assign(k(c))})():null,Te=Ka(S),we=e=>Te.load(at(Wt(e,de(0),de(n)))).x,Se=e=>I(Wt(e,de(0),de(n))),Ve=(e,t)=>{let a=It(e,0),r=P(a.div(4096)),s=a.sub(r.mul(4096)),i=P(s.div(64)),n=s.sub(i.mul(64));return de(n,i,r).mul(4).add(t)},Me=le(()=>{let t=de(oe).add(d).toVar();he(t.x.greaterThan(n).or(t.y.greaterThan(n)).or(t.z.greaterThan(n)),()=>{Ae()});let r=t.mul(4).add(de(1.5)),s=(t=>{let a=R(1e3).toVar();return ge(Eh,({i:r})=>{he(R(r).greaterThanEqual(e.npart),()=>{J()});let s=R(r).add(.5).mul(1/Eh),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=Nh(n,t.sub(i.xyz)).div(o.z).toVar(),d=Lh(l.x,u,l,o,e.env.meshSdf).sub(o.y).mul(o.z).toVar();a.assign(Bh(i.w,a,d,o.x))}),a})(ce(r,a));Ra(S,at(t),pe(s.add(c),0,0,0)).toStack()})(),Ce=e=>{he(e.x.greaterThan(n).or(e.y.greaterThan(n)).or(e.z.greaterThan(n)),()=>{Ae()})},Re=p?le(()=>{let e=de(oe).toVar();Ce(e),I(e).assign(R(-1).add(c)),_&&(F(e).assign(R(-1).add(c)),U(e).assign(R(-1).add(c)))})():null,ze=p?le(()=>{let e=de(oe).add(d).toVar();Ce(e);let t=we(e).toVar(),a=Se(e).toVar();he(Be(t).greaterThan(u).and(a.greaterThan(-.5)),()=>{let t=Ye(z(1),Pe(1)).toVar();A.element(t).assign(a),I(e).assign(R(-1).add(c))})})():null,ke=p?le(()=>{let e=de(oe).add(d).toVar();Ce(e);let t=we(e).toVar(),a=Se(e).toVar();he(Be(t).lessThanEqual(u).and(a.lessThan(-.5)),()=>{let t=R(-1).toVar(),a=lt(z(1),Pe(1)).toVar();he(a.greaterThanEqual(1),()=>{t.assign(A.element(a.sub(1)))}).Else(()=>{Ye(z(1),Pe(1));let e=Ye(z(0),Pe(1)).toVar();he(e.lessThan(Pe(g)),()=>{t.assign(e.toFloat())}).Else(()=>{st(z(2),Pe(1))})}),he(t.greaterThan(-.5),()=>{q.element(Pe(t)).assign((e=>e.x.add(e.y.mul(256)).add(e.z.mul(65536)))(e)),I(e).assign(t.add(c))})})})():null,Ee=p?le(()=>{let e=tt(z(0)).toVar(),t=tt(z(2)).toVar();if(st(M(1),k(e)),st(M(2),k(t)),st(z(2),Pe(0)),_){let e=tt(z(3)).toVar(),t=tt(z(5)).toVar();st(M(4),k(e)),st(M(5),k(t)),st(z(5),Pe(0));let a=tt(z(6)).toVar(),r=tt(z(8)).toVar();st(M(6),k(a)),st(M(7),k(r)),st(z(8),Pe(0))}})():null,Ne=_?le(()=>{let e=de(oe).toVar();he(e.x.greaterThanEqual(h.x).or(e.y.greaterThanEqual(h.y)).or(e.z.greaterThanEqual(h.z)),()=>{Ae()});let t=e.add(d).toVar();Ce(t);let a=U(t).toVar();he(a.greaterThan(-.5),()=>{let e=Ye(z(7),Pe(1)).toVar();Z(e).assign(a),U(t).assign(R(-1).add(c))});let r=F(t).toVar();he(r.lessThan(-.5),()=>{Ae()}),F(t).assign(R(-1).add(c)),ge(48,()=>{he(r.lessThan(-.5),()=>{J()});let e=Ye(z(4),Pe(1)).toVar();$(e).assign(r),r.assign(j(r))})})():null,Le=_?le(()=>{let e=de(oe).add(d).toVar();Ce(e);let t=R(0).toVar();he(Se(e).greaterThan(-.5),()=>{let a=e.mul(4).toVar(),r=Je.map(([e,t,r])=>He(de(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=or(s).toVar(),n=Ha(r[0],i);for(let e=1;e<8;e++)n=Ht(n,Ha(r[e],i));he(n.greaterThan(re),()=>{t.assign(R(1))})}),O(e).assign(t.add(c))})():null,Ie=Math.min(4096,Math.max(g,1)),De=()=>{let e=de(oe).toVar(),t=P(e.x.mul(.25)).toVar(),a=P(e.y.mul(.25)).toVar();return{slot:a.mul(Ie).add(t).toVar(),local:de(e.x.sub(t.mul(4)),e.y.sub(a.mul(4)),e.z).toVar()}},Fe=e=>(e=>{let t=P(e.div(65536)),a=e.sub(t.mul(65536)),r=P(a.div(256)),s=a.sub(r.mul(256));return de(s,r,t)})(q.element(Pe(e))),Ue=p?le(()=>{let e=de(oe).add(d.mul(4)).toVar(),t=e.mul(.25).floor().toVar(),r=Se(t).toVar();he(r.lessThan(-.5),()=>{Ae()});let{sdf:s}=ue(ce(e,a),_e(e,a));Ra(T,at(Ve(r,e.sub(t.mul(4)))),pe(s.add(c),0,0,0)).toStack()})():null,Oe=p?le(()=>{let{slot:e,local:t}=De();he(e.greaterThanEqual(g),()=>{Ae()});let r=Fe(e).toVar();he(Se(r).notEqual(e),()=>{Ae()});let s=r.mul(4).add(t).toVar(),{sdf:i}=ue(ce(s,a),_e(s,a));Ra(T,at(Ve(e,t)),pe(i.add(c),0,0,0)).toStack()})():le(()=>{let e=de(oe).add(d.mul(4)).toVar(),t=we(e.mul(.25).floor()).toVar();he(Be(t).greaterThan(u),()=>{Ra(T,at(e),pe(t.add(c),0,0,0)).toStack(),Ae()});let{sdf:r}=ue(ce(e,a),_e(e,a));Ra(T,at(e),pe(r.add(c),0,0,0)).toStack()})(),Ge=le(()=>{let e=de(oe).add(d.mul(2)).toVar();he(e.x.greaterThan(r-1).or(e.y.greaterThan(r-1)).or(e.z.greaterThan(r-1)),()=>{Ae()}),he(Be(we(e.mul(.5).floor())).greaterThan(u),()=>{Ae()});let{color:t,colorDivisor:a}=me(ce(e,r-1),_e(e,r-1)),s=a.greaterThan(0).select(t,pe(0));Ra(w,at(e),Wt(s.add(c),pe(0),pe(1))).toStack()})(),qe=Ka(T),We=p?(e,t,r)=>{let s=Wt(de(e,t,r),de(0),de(a)),i=s.mul(.25).floor(),n=Se(i),l=qe.load(at(Ve(n,s.sub(i.mul(4))))).x;return n.lessThan(-.5).select(we(i),l)}:(e,t,r)=>qe.load(at(Wt(de(e,t,r),de(0),de(a)))).x,He=e=>{let t=e.x,a=e.y,r=e.z,s=We(t.add(1),a,r).sub(We(t.sub(1),a,r)),i=We(t,a.add(1),r).sub(We(t,a.sub(1),r)),n=We(t,a,r.add(1)).sub(We(t,a,r.sub(1)));return s.equal(0).and(i.equal(0)).and(n.equal(0)).select(de(.199,.299,.399),or(de(s,i,n)))},Ke=(t,r,i)=>{let n=((e,t,a)=>{let r=(r,s,i,n)=>We(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=se.element(Pe(n)).toVar();he(u.lessThan(.5),()=>{Ae()});let d=Ye(M(),k(u)).toVar();he(R(d).add(u).mul(3).lessThanEqual(s),()=>{let s=n.add(.5).mul(.00390625);ge(5,({i:n})=>{he(R(n).greaterThanEqual(u),()=>{J()});let h=R(n).toVar();ge(3,({i:n})=>{let u=R(n).toVar();((t,r,s,i,n,u)=>{let d=n.mul(.0625).add(.03125),h=e.triTable.sample(ne(d,i)).x.mul(2).toInt().toVar(),m=de(t,r,s).add(ie.element(h)).toVar(),c=de(t,r,s).add(ie.element(h.add(1))).toVar(),p=We(m.x,m.y,m.z).toVar(),g=We(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(de(o)),x=or(Xt(He(m),He(c),f)),v=_.add(1).mul(.5),b=Ka(w,v,Pe(0)),T=u.toVar();e.buffers.positions.element(T).assign(pe(y,1)),e.buffers.normals.element(T).assign(pe(x,0)),e.buffers.colors.element(T).assign(b)})(t,r,i,s,h.mul(3).add(u),Pe(d).add(Pe(h)).mul(3).add(Pe(u)))})})})},$e=p?le(()=>{let{slot:e,local:t}=De();he(e.greaterThanEqual(g),()=>{Ae()});let r=Fe(e).toVar();he(Se(r).notEqual(e),()=>{Ae()});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();he(s.greaterThanEqual(a).or(i.greaterThanEqual(a)).or(n.greaterThanEqual(a)),()=>{Ae()}),Ke(s,i,n)})():le(()=>{let e=de(oe).x.toVar(),t=de(oe).y.toVar(),r=de(oe).z.toVar();he(e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a)),()=>{Ae()}),he(Be(we(de(e,t,r).mul(.25).floor())).greaterThan(u),()=>{Ae()}),Ke(e,t,r)})(),Qe=()=>{let e=de(Xe).toVar(),t=e.y.mul(Ie).add(e.x).toVar(),a=de(0).toVar(),r=R(0).toVar();return he(t.lessThan(g),()=>{a.assign(Fe(t)),he(Se(a).equal(t),()=>{r.assign(R(1))})}),{brick:a,valid:r}},Ze=()=>{let e=de(Xe).add(d).toVar(),t=R(0).toVar();return he(e.x.lessThanEqual(n).and(e.y.lessThanEqual(n)).and(e.z.lessThanEqual(n)),()=>{he(Se(e).greaterThan(-.5),()=>{t.assign(R(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]],et=[[0,1],[2,3],[4,5],[6,7],[0,2],[1,3],[4,6],[5,7],[0,4],[1,5],[2,6],[3,7]],rt=t=>le(()=>{let r=Fh("float",64),s=Fh("float",1),i=de(pt).toVar(),n=Pe(i.x.add(i.y.mul(4)).add(i.z.mul(16))).toVar(),{brick:u,valid:d}=t(),h=O(u).toVar(),m=R(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])=>We(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=R(0).toVar();he(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(R(1))}),r.element(n).assign(S.add(c)),je(),he(n.equal(Pe(0)).and(d.greaterThan(.5)),()=>{let e=R(0).toVar();ge(64,({i:t})=>{e.addAssign(r.element(t))});let t=R(-1).toVar();he(e.greaterThan(.5),()=>{let e=lt(z(7),Pe(1)).toVar();he(e.greaterThanEqual(1),()=>{t.assign(Z(e.sub(1)))}).Else(()=>{Ye(z(7),Pe(1));let e=Ye(z(6),Pe(1)).toVar();he(e.lessThan(Pe(v)),()=>{t.assign(e.toFloat())}).Else(()=>{st(z(8),Pe(1))})}),he(t.greaterThan(-.5),()=>{U(u).assign(t.add(c))})}),s.element(Pe(0)).assign(t)}),je();let V=s.element(Pe(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)));he(M.and(V.greaterThan(-.5)),()=>{let t=de(0).toVar(),r=R(0).toVar();for(let[e,a]of et)he(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(de(i,n,l).add(de(o-i,u-n,d-l).mul(s)).mul(m)),r.addAssign(1)});let s=t.div(It(r,1)).toVar();he(r.lessThan(.5),()=>{s.assign(de(m.mul(.5)))});let u=de(f,_,y).add(s).toVar().div(a).mul(2).sub(1).toVar(),d=u.mul(l).add(de(o)),h=de(0).toVar(),c=s.div(m).toVar();for(let e=0;e<8;e++){let[t,a,r]=Je[e],s=t?kh(c.x):R(1).sub(kh(c.x)),i=a?kh(c.y):R(1).sub(kh(c.y)),n=r?kh(c.z):R(1).sub(kh(c.z));h.addAssign(He(Ah(de(f.add(m.mul(t)),_.add(m.mul(a)),y.add(m.mul(r))))).mul(s.mul(i).mul(n)))}let g=or(h),v=u.add(1).mul(.5),b=Ka(w,v,Pe(0)),T=Pe(p.select(i.x.add(i.y.mul(2)).add(i.z.mul(4)),R(n))).toVar(),S=Pe(V.mul(64)).add(T).toVar();e.buffers.positions.element(S).assign(pe(d,1)),e.buffers.normals.element(S).assign(pe(g,0)),e.buffers.colors.element(S).assign(b)})})(),it=_?rt(Qe):null,nt=_?rt(Ze):null,ot=e=>le(()=>{let t=Fh("float",64),r=Fh("float",64),s=Fh("float",48),n=de(pt).toVar(),l=Pe(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=We(d,h,m).lessThan(0).toFloat().toVar(),g=(e,t,a)=>G(Pe(P(e.mul(.25))).add(Pe(P(t.mul(.25))).mul(i)).add(Pe(P(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=R(0).toVar(),v=R(0).toVar(),b=R(0).toVar(),T=R(1).toVar(),w=R(1).toVar(),S=R(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=We(d.add(r),h.add(s),m.add(i)).lessThan(0).toFloat(),v=We(d.add(2*r),h.add(2*s),m.add(2*i)).lessThan(0).toFloat();he(u.greaterThan(.5).and(y.not()).and(o.add(1).lessThanEqual(a)).and(_(n,R(1))).and(_(l,R(1))).and(p.notEqual(x)),()=>{e.assign(R(1)),t.assign(R(1))}),he(u.greaterThan(.5).and(y).and(f(d)).and(f(h)).and(f(m)).and(o.add(2).lessThanEqual(a)).and(_(n,R(2))).and(_(l,R(2))).and(p.notEqual(v)),()=>{e.assign(R(1)),t.assign(R(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 C=y.add(v).add(b).mul(2).toVar();t.element(l).assign(C.add(c)),je(),he(l.equal(Pe(0)).and(u.greaterThan(.5)),()=>{let e=R(0).toVar();ge(64,({i:a})=>{r.element(a).assign(e),e.addAssign(t.element(a))}),Ye(M(0),k(e));let a=P(e.add(7).mul(1/8)).toVar(),i=R(-1).toVar(),n=R(-1).toVar();ge(48,({i:t})=>{he(R(t).greaterThanEqual(a),()=>{J()});let r=R(t).toVar(),l=R(-1).toVar(),o=lt(z(4),Pe(1)).toVar();he(o.greaterThanEqual(1),()=>{l.assign($(o.sub(1)))}).Else(()=>{Ye(z(4),Pe(1));let e=Ye(z(3),Pe(1)).toVar();he(e.lessThan(Pe(x)),()=>{l.assign(e.toFloat())}).Else(()=>{st(z(5),Pe(1))})}),s.element(Pe(r)).assign(l),he(l.greaterThan(-.5),()=>{K(l).assign(Ht(e.sub(r.mul(8)),8)),j(l).assign(R(-1)),he(n.greaterThan(-.5),()=>{j(n).assign(l)}).Else(()=>{i.assign(l)}),n.assign(l)})}),F(o).assign(i)}),je(),he(C.greaterThan(.5),()=>{let e=(e,t,a)=>{let r=P(e.mul(.25)),s=P(t.mul(.25)),n=P(a.mul(.25)),l=Pe(r).add(Pe(s).mul(i)).add(Pe(n).mul(i*i)),o=Pe(e.sub(r.mul(4))).add(Pe(t.sub(s.mul(4))).mul(4)).add(Pe(a.sub(n.mul(4))).mul(16));return k(l.mul(64).add(o))},t=r.element(l).toVar(),a=(e,a,r)=>{let i=s.element(Pe(P(t.mul(1/8)))).toVar();he(i.greaterThan(-.5),()=>{let s=t.sub(P(t.mul(1/8)).mul(8)),n=Pe(i.mul(24).add(s.mul(3))).toVar();ee(n).assign(e),ee(n.add(Pe(1))).assign(a),ee(n.add(Pe(2))).assign(r)}),t.addAssign(1)},n=(t,r)=>{he(t.greaterThan(.5),()=>{let t=e(...r[0]).toVar(),s=e(...r[1]).toVar(),i=e(...r[2]).toVar(),n=e(...r[3]).toVar();he(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]])})})(),ut=_?ot(Qe):null,dt=_?ot(Ze):null,ht=_?le(()=>{let e=Fh("float",48),t=Fh("float",2),r=de(pt).toVar(),s=Pe(r.x.add(r.y.mul(4)).add(r.z.mul(16))).toVar(),i=de(Xe).toVar(),n=i.y.mul(Ie).add(i.x).toVar();he(s.equal(Pe(0)),()=>{let r=R(0).toVar();he(n.lessThan(g),()=>{let t=Fe(n).toVar();he(Se(t).equal(n),()=>{let s=R(0).toVar();he(te.greaterThan(.5),()=>{let e=de(0).toVar(),r=de(0).toVar();for(let s=0;s<8;s++){let i=Ah(t.mul(4).add(de(4*(1&s),4*(s>>1&1),4*(s>>2&1)))),n=Ah(i.div(a).mul(2).sub(1)).mul(l).add(de(o)),u=ae.mul(pe(n,1)).toVar(),d=kh(u.w);e.addAssign(de(kh(u.x).lessThan(d.negate()).toFloat(),kh(u.y).lessThan(d.negate()).toFloat(),kh(u.z).lessThan(0).toFloat())),r.addAssign(de(kh(u.x).greaterThan(d).toFloat(),kh(u.y).greaterThan(d).toFloat(),kh(u.z).greaterThan(d).toFloat()))}he(It(It(e.x,It(e.y,e.z)),It(r.x,It(r.y,r.z))).greaterThan(7.5),()=>{s.assign(R(1))})}),he(s.lessThan(.5),()=>{let a=F(t).toVar();ge(48,({i:t})=>{he(a.lessThan(-.5),()=>{J()}),e.element(t).assign(a),r.addAssign(K(a)),a.assign(j(a))})})})});let s=R(0).toVar();he(r.greaterThan(.5),()=>{let e=Ye(M(3),k(r.mul(3))).toVar();s.assign(R(e))}),t.element(Pe(0)).assign(s.add(c)),t.element(Pe(1)).assign(r)}),je();let u=t.element(Pe(1)).toVar(),d=t.element(Pe(0)).toVar(),h=R(s).toVar();ge(6,()=>{he(h.greaterThanEqual(u),()=>{J()});let t=e.element(Pe(P(h.mul(1/8)))).toVar(),a=h.sub(P(h.mul(1/8)).mul(8)),r=Pe(t.mul(24).add(a.mul(3))).toVar(),s=Pe(d.add(h.mul(3))).toVar(),i=e=>{let t=ee(0===e?r:r.add(Pe(e))).toVar(),a=Pe(t.shiftRight(k(6))).toVar(),s=Pe(t.bitAnd(k(63))).toVar(),i=(e=>B.element(e.add(Pe(2*E))))(a).toVar(),n=G(a),l=s.bitAnd(Pe(3)),o=s.shiftRight(Pe(2)).bitAnd(Pe(3)),u=s.shiftRight(Pe(4)).bitAnd(Pe(3)),d=l.shiftRight(Pe(1)).add(o.shiftRight(Pe(1)).mul(Pe(2))).add(u.shiftRight(Pe(1)).mul(Pe(4)));return{blockF:i,li:Pe(n.greaterThan(.5).select(d,s)).toVar()}},n=i(0),l=i(1),o=i(2);he(n.blockF.greaterThan(-.5).and(l.blockF.greaterThan(-.5)).and(o.blockF.greaterThan(-.5)),()=>{let e=e=>k(Pe(e.blockF.mul(64)).add(e.li));y.element(s).assign(e(n)),y.element(s.add(Pe(1))).assign(e(l)),y.element(s.add(Pe(2))).assign(e(o))}).Else(()=>{y.element(s).assign(k(0)),y.element(s.add(Pe(1))).assign(k(0)),y.element(s.add(Pe(2))).assign(k(0))}),h.addAssign(64)})})():null,mt=Math.ceil(t/Dh[0]),ct=Math.ceil(r/Dh[0]),gt=Math.ceil(i/Dh[0]),ft=(e,t)=>e.compute(t,Array.isArray(t)?Dh:void 0),_t=[Ie,Math.max(1,Math.ceil(g/Ie)),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,C,A,B,q,W,Q,Y].filter(e=>null!==e).map(e=>e.value),uniforms:{bboxHalf:l,bboxOffset:o,activeThreshold:u,windowOrigin:d,..._?{windowSize:h,cullEnabled:te,cullMVP:ae,adaptCos:re}:{}},kernels:{zero:ft(ye,1),clear:xe.compute([Math.ceil(s/256),1,1],[256,1,1]),coarse:ft(Me,[gt,gt,gt]),...Re?{init:ft(Re,[gt,gt,gt])}:{},...ze?{release:ft(ze,[gt,gt,gt])}:{},...ke?{alloc:ft(ke,[gt,gt,gt])}:{},...Ee?{stats:ft(Ee,1)}:{},sdf:ft(Oe,p?_t:[mt,mt,mt]),...Ue?{sdfWindow:ft(Ue,[mt,mt,mt])}:{},color:ft(Ge,[ct,ct,ct]),extract:_?ft(ut,_t):ft($e,p?_t:[mt,mt,mt]),..._?{clearDraw:be.compute([Math.ceil(s/256),1,1],[256,1,1]),meshRelease:ft(Ne,[gt,gt,gt]),verts:ft(it,_t),vertsWindow:ft(nt,[i,i,i]),extractWindow:ft(dt,[i,i,i]),classify:ft(Le,[gt,gt,gt]),gather:ft(ht,_t)}:{}}}}var Oh=24576;function Gh(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/Oh));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 ms(0,0,0),o=new ms,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 qh(e){let t=Ka(e);return(e,a,r)=>{let s=It(de(a.z,a.w,r.w),de(1e-5)).toVar(),i=a.y,n=de(i.mod(4).mul(48),P(i.div(4)).mul(48),0).toVar(),l=Wt(e.div(s).mul(.5).add(.5),de(0),de(1)).mul(47).toVar(),o=Ht(P(l),de(46)).toVar(),u=l.sub(o).toVar(),d=n.add(o).toVar(),h=(e,a,r)=>t.load(at(d.add(de(e,a,r)))).x,m=u.x,c=u.y,p=u.z,g=Xt(h(0,0,0),h(1,0,0),m),f=Xt(h(0,1,0),h(1,1,0),m),_=Xt(h(0,0,1),h(1,0,1),m),y=Xt(h(0,1,1),h(1,1,1),m),x=Xt(Xt(g,f,c),Xt(_,y,c),p),v=It(s.x,It(s.y,s.z)),b=Be(e).sub(s),T=it(It(b,de(0)));return x.mul(v).add(T)}}function Wh(e){return new ms(e%4*48,48*Math.floor(e/4),0)}var Hh=e=>e,jh=e=>e,Kh=new $a,$h=qa(new fs),Xh=N(1),Qh=N(1),Zh=N(0),Yh=N(0),Jh=N(1),em=null;function tm(){if(null!==em)return em;let e=le(()=>{let e=ne(Xh,Qh),t=ne(1).div(e),a=$().mul(Jh).sub(ne(.5)).mul(2).add(ne(.5)).toVar();a.x.addAssign(Zh);let r=a.div(e).toVar(),s=$h.sample(r).x.toVar();r.x.addAssign(t.x);let i=$h.sample(r).x.toVar();r.y.addAssign(t.y);let n=$h.sample(r).x.toVar();r.x.subAssign(t.x);let l=$h.sample(r).x.toVar(),o=s,u=o.add(i),d=u.add(n),h=d.add(l);return pe(h,d,u,o)})(),t=new Ct;return t.name="SplineShapeBlend.pyramid",t.fragmentNode=e,t.depthTest=!1,t.depthWrite=!1,t.blending=Gs,t.needsUpdate=!0,em=t,t}var am=!1,rm=!1,sm="",im=!1,nm=!1,lm=!1,om=!1,um=!1,dm=!1,hm=!1,mm=!1,cm=!1;try{let e=new URLSearchParams(window.location.search);am="vertex"===e.get("dbgsbmarch"),rm="0"===e.get("dbgsbultra"),sm=e.get("dbgsbchain")??"",im="1"===e.get("dbgsbnoclear"),nm="0"===e.get("dbgsbsparse"),lm="0"===e.get("dbgsbincr"),om="1"===e.get("dbgsblod"),um="1"===e.get("dbgsbpool"),dm="0"===e.get("dbgsbpool"),hm="0"===e.get("dbgsbmesh"),mm="0"===e.get("dbgsbadapt"),cm="1"===e.get("dbgsbcull")}catch{}var pm={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},gm=24576,fm=Math.cos(8*Math.PI/180);function _m(e,t,a=1){return new vs(e,t,{count:a,format:_s,type:as,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:js,magFilter:js,wrapS:Us,wrapT:Us})}var ym=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 Ss,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=qa(new fs),this.spatialTexNode=qa(new fs),this.potentialTexNode=qa(new fs),this.voxelTexNode=qa(new fs),this.pyramid1TexNode=qa(new fs),this.pyramid2TexNode=qa(new fs),this.npartUniform=N(0),this.spatialnUniform=N(1),this.spanUniform=N(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 Ks(r.triTable,16,256,bs,as);i.needsUpdate=!0;let n=new Ks(r.numTrisTable,256,1,bs,as);n.needsUpdate=!0,this.triTableTexNode=qa(i),this.numTrisTableTexNode=qa(n)}shapeRow(e,t){return this.shapesTex.sample(ne(e,(t+.5)/5))}_quadMaterial(e,t){let a=new Ct;return a.name=e,a.fragmentNode=t,a.depthTest=!1,a.depthWrite=!1,a.blending=Gs,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=le(()=>{let e=ne(t*l,t**2),o=P($().mul(e)).toVar(),u=o.y.toVar(),d=u.sub(P(u.div(t)).mul(t)).toVar();u.assign(P(u.div(t)));let h=u,m=o.x.toVar(),c=m.sub(P(m.div(i)).mul(i)).toVar().mul(4*a).toVar();m.assign(P(m.div(i)));let p=de(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=R(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=jh(l.xyz),u=Hh(l.w);t.mulAssign(2);let d=Hh(g.x).lessThan(Hh(o.x)).and(Hh(o.x).lessThan(Hh(f.x))).and(Hh(g.y).lessThan(Hh(o.y))).and(Hh(o.y).lessThan(Hh(f.y))).and(Hh(g.z).lessThan(Hh(o.z))).and(Hh(o.z).lessThan(Hh(f.z))).and(a.lessThan(Hh(s))).or(u.equal(-2));t.addAssign(d.select(R(1),R(0)))}return t};return pe(_(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?qh(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=Ih(this._fieldEnv(e,2*s)),o=le(()=>{let e=P($().mul(ne(n,n))).toVar(),o=e.x.mod(a),u=e.y.mod(a),d=P(e.x.mul(s)).add(P(e.y.mul(s)).mul(i)),h=de(o,u,d),m=h.div(r).mul(2).sub(1).toVar(),c=P(h.div(r).mul(t-1)).toVar(),{sdf:p,color:g}=l(m,c),f=k(g.x.mul(255)),_=k(g.y.mul(255)),y=f.shiftLeft(k(8)).bitOr(_);return pe(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=Vh(t,s),l=this.potentialTexNode,o=()=>{let e=P($().mul(ne(i,i))).toVar();return{xi:e.x.mod(t).toVar(),yi:e.y.mod(t).toVar(),zi:P(e.x.mul(r)).add(P(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=le(()=>{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(de(.199,.299,.399),or(de(r,s,i)))})(e,t,r).toVar(),i=pe(s,0).toVar(),d=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return he(d.not(),()=>{i.assign(pe(s,u(e,t,r)))}),i})(),h=le(()=>{let{xi:e,yi:t,zi:r}=o(),s=pe(0).toVar(),i=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return he(i.not(),()=>{let a=u(e,t,r);s.assign(this.numTrisTableTexNode.sample(ne(a.add(.5).div(256),.5)))}),s})();return this._quadMaterial("SplineShapeBlend.voxel",Ca({output:d,numTris:h}))}_spatialTargetFor(e){let t=e.resolutionLevel,a=this.spatialTargets[t];return a||(a=_m(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=_m(e.basePyramidSize,e.basePyramidSize),this.potentialTargets[t]=r);let s=this.voxelTargets[t];s||(s=_m(e.basePyramidSize,e.basePyramidSize,2),s.textures[0].name="output",s.textures[1].name="numTris",s.textures[1].format=bs,this.voxelTargets[t]=s);let i=this.pyramidTargets[t];return i||(i=[_m(e.pyramidTexture1Width,e.pyramidTexture1Height),_m(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,gm),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:ve(a,"vec4"),normals:ve(a,"vec4"),colors:ve(a,"vec4")},this._marchCapacity=a,this._computeNode=null,!0}update(e,t,a){if(pm.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 X(192,48*Math.ceil(4),48);a.format=bs,a.type=as,a.minFilter=js,a.magFilter=js,a.name="SplineShapeBlend.meshSdfAtlas";let r=R(t).mul(0),s=N(new ms(0,0,0)),i=N(0),n=N(new ms(1,1,1)),l=ve(3*Oh,"vec4"),o=e=>l.element(e),u=le(()=>{let e=de(oe).toVar();he(e.x.greaterThanEqual(48).or(e.y.greaterThanEqual(48)).or(e.z.greaterThanEqual(48)),()=>{Ae()});let t=e.div(47).mul(2).sub(1).mul(n).toVar(),l=R(1e30).toVar(),u=R(1e15).toVar();ge(Oh,({i:e})=>{he(R(e).greaterThanEqual(i),()=>{J()});let a=Pe(R(e).toVar()).mul(3).toVar(),r=o(a).xyz.toVar(),s=o(a.add(Pe(1))).xyz.toVar(),n=o(a.add(Pe(2))).xyz.toVar(),d=s.sub(r).toVar(),h=n.sub(r).toVar(),m=t.sub(r).toVar(),c=Ha(d,m).toVar(),p=Ha(h,m).toVar(),g=t.sub(s).toVar(),f=Ha(d,g).toVar(),_=Ha(h,g).toVar(),y=t.sub(n).toVar(),x=Ha(d,y).toVar(),v=Ha(h,y).toVar(),b=de(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();he(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=R(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=Ha(V,V).toVar();he(M.lessThan(l),()=>{l.assign(M);let e=ya(d,h),t=Ha(V,e).greaterThanEqual(0).select(R(1),R(-1));u.assign(fa(M).mul(t))})});let d=It(n.x,It(n.y,n.z));Ra(a,at(e.add(s)),pe(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=!am&&i,l=n&&!rm&&e.ultraFieldResolution>0,o=l&&!dm&&(um||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&&!hm,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,gm),Math.max(e.geometry.drawRange.count,this.capacityHint,l?Math.max(function(e){return Math.max(gm,192*Math.ceil(16*e*e/192))}(e.ultraFieldResolution),this._ultraWantedCapacity):gm)),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=ve(this._marchCapacity,"uint")),u&&null===this._vertexBuffers&&(this._vertexBuffers={positions:ve(64*h,"vec4"),normals:ve(64*h,"vec4"),colors:ve(64*h,"vec4")}),this._ultra=Uh({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=om&&t>=128&&!u?t/2:0;r&&(!i||0===l)&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),l>0&&(this._ultraDrag=Uh({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={}),sm.includes("nomat")||(i.defines.SHAPEBLEND=e.resolutionLevel),sm.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&&!lm&&!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,pm.refines++,void this._runUltra(e,t,!1,this._ultra);if(l&&cm&&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,pm.regathers++;let a=t;return a.compute(this._ultra.kernels.zero),im||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 pm.skips++;if(l)return void(this._ultraReadbackPending||this._runUltraReadback(e,t))}if(this._passesRenderer=t,sm.includes("none")&&pm.readbacksResolved>0)return void(this._computeDirty=!1);let T=t.getRenderTarget(),w=t.getMRT(),S=t.autoClear;if(t.setMRT(null),t.autoClear=!1,pm.lastPass="spatial",t.setRenderTarget(f),Kh.material=this.spatialMaterial,Kh.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"===sm&&pm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(pm.lastPass="potential",t.setRenderTarget(_.potential),Kh.material=this.potentialMaterial,Kh.render(t),"potential"===sm&&pm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(pm.lastPass="voxel",t.setRenderTarget(_.voxel),Kh.material=this.voxelMaterial,Kh.render(t),"voxel"===sm&&pm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(pm.lastPass="pyramid",this._renderPyramid(e,t,_.voxel,_.pyramid),t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),pm.lastPass="march",n&&(null===this._computeNode&&(this._computeNode=function(e,t,a){let r=Rh(e);return le(()=>{let{position:e,normal:a,color:s}=r(fe.toFloat());t.positions.element(fe).assign(pe(e,1)),t.normals.element(fe).assign(pe(a,0)),t.colors.element(fe).assign(s)})().compute(a)}(this._marchResources(e),this._marchBuffers,this._marchCapacity)),t.compute(this._computeNode),pm.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=Gh(s);if(null!==l)return a.setTriangles(l.data,l.triCount),a.uniforms.slotOrigin.value.copy(Wh(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 cm&&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;pm.lastPass="ultra-kernels",pm.lastDispatchRes=r.resolution,pm.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=nm?1e30:(3*Math.sqrt(3)+4)*l+.25*e._maxBlendK;let o=r.meshlet&&!mm;r.meshlet&&(r.uniforms.adaptCos.value=o?fm: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,pm.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 pm.fieldsFull++;pm.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),im||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),pm.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,pm.readbackPending=!0,r.getArrayBufferAsync(a.counterAttribute).then(r=>{if(this._ultraReadbackPending=!1,pm.readbackPending=!1,this.retired)return;this._disposeRetired();let s=new Uint32Array(r),i=a.meshlet?Math.floor(s[3]/3):s[0];if(pm.readbacksResolved++,pm.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(()=>{pm.readbackErrors++,this._ultraReadbackPending=!1,pm.readbackPending=!1})}_renderPyramid(e,t,a,r){let s=e.pyramidLevelSizes,i=s.length-1-1;Zh.value=0,Yh.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];$h.value=o.textures.length>1?o.textures[1]:o.texture,Xh.value=o.width,Qh.value=o.height;let u=s[n];2===n&&e.resolutionLevel%2!=0&&(u=3),Jh.value=u,l.viewport.set(Yh.value,0,u,u),t.setRenderTarget(l),Kh.material=tm(),Kh.render(t),l.viewport.set(0,0,l.width,l.height);let d=Zh.value;Zh.value=Yh.value,Yh.value=d,n<i&&(Yh.value+=s[n+1])}pm.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];pm.readbacksResolved++,pm.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}},xm=new WeakMap,vm=new WeakMap,bm=[];i(function(e){if(e.cached)return function(e){let t=()=>e.drawIndex?e.drawIndex.element(Me):Me;return{position:le(a=>{let r=e.positions.element(t()).xyz.toVar();return zh(a,r),r})(),normal:ke(e.normals.element(t()).xyz),color:ke(e.colors.element(t()))}}(e.cached);let t=Rh(e),a=ae("vec3","vShapeBlendNormal"),r=ae("vec4","vShapeBlendColor");return{position:le(e=>{let{position:s,normal:i,color:n}=t(Me.toFloat());return a.assign(i),r.assign(n),zh(e,s),s})(),normal:a,color:r}}),l(e=>function(e){let t=xm.get(e);if(t?.wantsReplacement){let a=vm.get(e);vm.set(e,t),t.retired=!0;let r=new ym(t.capacityHint,t.poolHint,t.vertHint);t.transferSettleQueue(r),a&&r.runWhenSettled(()=>a.dispose()),t=r,xm.set(e,t)}return t||(t=new ym,xm.set(e,t)),t}(e)),u({release:e=>function(e){let t=xm.get(e),a=vm.get(e);xm.delete(e),vm.delete(e),a&&bm.push(a),t&&(t.retired=!0,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 Tm=[64,1,1],wm=gr,Sm=wm-1,Vm=(e,t)=>void 0!==t?N(e,t):N(e),Mm=(e,t)=>{let a=e.xyz,r=ya(a,t),s=ya(a,r);return t.add(r.mul(e.w).mul(2)).add(s.mul(2))},Cm=le(([e,t])=>{let a=e,r=t,s=Ha(a,r).add(1).toVar(),i=de(0).toVar();return he(s.lessThan(1e-7),()=>{s.assign(0),he(Be(a.x).greaterThan(Be(a.z)),()=>{i.assign(de(a.y.negate(),a.x,0))}).Else(()=>{i.assign(de(0,a.z.negate(),a.y))})}).Else(()=>{i.assign(ya(a,r))}),(e=>{let t=Ha(e,e);return t.lessThan(1e-10).select(pe(0,0,0,1),e.mul(Le(It(t,1e-20))))})(pe(i,s))}),Rm=e=>(e=>e.sub(P(e.mul(1/289)).mul(289)))(e.mul(34).add(10).mul(e)),zm=le(([e])=>{let t=e,a=1/6,r=1/3,s=P(t.add(Ha(t,de(r)))).toVar(),i=t.sub(s).add(Ha(s,de(a))).toVar(),n=va(i.yzx,i.xyz).toVar(),l=de(1).sub(n).toVar(),o=Ht(n,l.zxy).toVar(),u=It(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(P(e.mul(1/289)).mul(289)))(s));let c=Rm(Rm(Rm(pe(0,o.z,u.z,1).add(s.z)).add(s.y).add(pe(0,o.y,u.y,1))).add(s.x).add(pe(0,o.x,u.x,1))).toVar(),p=.142857142857,g=2*p,f=.5*p-1,_=p,y=c.sub(P(c.mul(_*_)).mul(49)).toVar(),x=P(y.mul(_)).toVar(),v=P(y.sub(x.mul(7))).toVar(),b=x.mul(g).add(f).toVar(),T=v.mul(g).add(f).toVar(),w=pe(1).sub(Be(b)).sub(Be(T)).toVar(),S=pe(b.xy,T.xy).toVar(),V=pe(b.zw,T.zw).toVar(),M=P(S).mul(2).add(1).toVar(),C=P(V).mul(2).add(1).toVar(),R=va(w,pe(0)).negate().toVar(),z=S.xzyw.add(M.xzyw.mul(R.xxyy)).toVar(),k=V.xzyw.add(C.xzyw.mul(R.zzww)).toVar(),A=de(z.xy,w.x).toVar(),E=de(z.zw,w.y).toVar(),N=de(k.xy,w.z).toVar(),B=de(k.zw,w.w).toVar(),L=(e=>pe(1.79284291400159).sub(e.mul(.85373472095314)))(pe(Ha(A,A),Ha(E,E),Ha(N,N),Ha(B,B))).toVar();A.assign(A.mul(L.x)),E.assign(E.mul(L.y)),N.assign(N.mul(L.z)),B.assign(B.mul(L.w));let I=It(pe(.5).sub(pe(Ha(i,i),Ha(d,d),Ha(h,h),Ha(m,m))),pe(0)).toVar();return I.assign(I.mul(I)),Ha(I.mul(I),pe(Ha(A,i),Ha(E,d),Ha(N,h),Ha(B,m))).mul(105)}),km=class extends Kt{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=or(Lt.mul(pe(this.tangentWorld,0)).xyz),i=t,n=ze,l=or(i.add(n)),o=It(it(ya(s,i)),0),u=It(it(ya(s,l)),0);r.directDiffuse.addAssign(a.mul(o).mul(this.diffuseIntensity).mul(Da.rgb)),r.directSpecular.addAssign(a.mul(Ie(u,this.specularPower)).mul(this.specularIntensity).mul(de(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(Da.rgb)),r.indirectDiffuse.mulAssign(a)}},Am=class extends Kt{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=t,i=Qa,n=ze,l=or(s.add(n)),o=Ha(i,s).clamp(),u=Ha(i,l).clamp();r.directDiffuse.addAssign(a.mul(o).mul(.85).mul(Da.rgb)),r.directSpecular.addAssign(a.mul(Ie(u,60)).mul(.3).mul(de(.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(Da.rgb)),r.indirectDiffuse.mulAssign(a)}},Pm=class extends Ct{constructor(e){super(),this.model=e,this.lights=!0}setupLightingModel(){return this.model}},Em=new hs,Nm=new hs,Bm=new ms,Lm=class{constructor(){this.uNumStrands=Vm(0,"int"),this.uNumVerts=Vm(0,"int"),this.uDamping=Vm(.03),this.uLocalStiffness=Vm(.67),this.uGlobalStiffness=Vm(.5),this.uGlobalRange=Vm(.15),this.uStiffnessFalloff=Vm(.1),this.uGravity=Vm(0),this.uVspCoeff=Vm(.01),this.uVspThreshold=Vm(50),this.uKink=Vm(0),this.uKinkFreq=Vm(0),this.uUnitScale=Vm(100),this.uClumpStrength=Vm(0),this.uClumpSize=Vm(32,"int"),this.uClumpTipScale=Vm(1.5),this.uReset=Vm(1),this.uHasWind=Vm(0),this.uWind0=Vm(new ms),this.uWind1=Vm(new ms),this.uWind2=Vm(new ms),this.uWind3=Vm(new ms),this.uBoneQuat=Vm(new xs(0,0,0,1)),this.uBoneTrans=Vm(new ms),this.uDeltaQuat=Vm(new xs(0,0,0,1)),this.uPrevBoneTrans=Vm(new ms),this.uHairRoot=Vm(new Ms),this.uHairMid=Vm(new Ms),this.uHairTip=Vm(new Ms),this.uHeadColor=Vm(new Ms),this.uNoiseA=Vm(new Ms),this.uNoiseB=Vm(new Ms),this.uNoiseC=Vm(new Ms),this.uNoiseD=Vm(new Ms),this.uNoiseScale=Vm(.018),this.uNoiseMixHair=Vm(0),this.uNoiseMixHead=Vm(0),this.uWidth=Vm(.525),this.uSpecPow=Vm(40),this.uSpecInt=Vm(.4),this.uDiffInt=Vm(.6),this.uAmbInt=Vm(.25),this.uOpacity=Vm(1),this.uTipFade=Vm(.4),this.uColorSource=Vm(0),this.uShadeRoot=Vm(.6),this.uShadeTip=Vm(1.15),this.uShadowTexelWorld=Vm(0),this._armed=!1,this._uploadedGeneration=-1,this._prevBoneQuat=new hs,this._prevBonePos=new ms,this._hasPrevBone=!1,this._renderer=null,this.initialPos=ve(_r,"vec4"),this.rootColors=ve(fr,"vec4"),this.positions=ve(_r,"vec4"),this.positionsPrev=ve(_r,"vec4"),this.positionsPrevPrev=ve(_r,"vec4"),this.tangents=ve(_r,"vec4"),this.restLengths=ve(_r,"float"),this.vspQuats=ve(fr,"vec4"),this.vspTrans=ve(fr,"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 le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumVerts),()=>{Ae()});let t=e.div(wm).toVar(),a=e.sub(t.mul(wm)).toVar(),r=this.boneQuatNode(),s=this.boneTransNode(),i=this.initialPos.element(e).toVar(),n=pe(Mm(r,i.xyz).add(s),i.w).toVar(),l=this.positions.element(e).toVar(),o=this.positionsPrev.element(e).toVar(),u=o.toVar();he(this.uReset.greaterThan(.5),()=>{l.assign(n),u.assign(n)});let d=n.toVar();he(l.w.greaterThan(0),()=>{let e=R(xr),t=Ja(this.uDamping.negate().mul(e).mul(60)),a=l.xyz.add(l.xyz.sub(u.xyz).mul(t)).add(de(0,-1,0).mul(this.uGravity).mul(e).mul(e));d.assign(pe(a,l.w))}),he(this.uGlobalStiffness.greaterThan(0).and(this.uGlobalRange.greaterThan(0)).and(d.w.greaterThan(0)).and(a.toFloat().lessThan(this.uGlobalRange.mul(wm))),()=>{let t=e.sub(a),s=this.initialPos.element(t),i=or(Mm(r,s.xyz)).y.mul(.5).add(.5),l=this.uGlobalStiffness.mul(Ie(It(i,0),this.uStiffnessFalloff)),o=n.xyz.sub(d.xyz).mul(l);d.assign(pe(d.xyz.add(o),d.w))}),he(this.uKink.greaterThan(0).and(d.w.greaterThan(0)),()=>{let e=a.toFloat().div(wm),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=or(n.xyz.sub(s)).toVar(),u=de(0).toVar();he(Be(o.y).lessThan(.99),()=>{u.assign(or(ya(o,de(0,1,0))))}).Else(()=>{u.assign(or(ya(o,de(1,0,0))))});let h=or(ya(o,u)),m=u.mul(ea(i)).mul(l).add(h.mul(pa(i.mul(1.3).add(r))).mul(l).mul(.7));d.assign(pe(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(Tm[0],Tm)}_buildStrandLevel(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=e.mul(wm).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(It(it(l),1e-7)),d=o.div(It(it(o),1e-7)),h=Cm(u,d).toVar(),m=i.xyz.sub(Mm(h,r.xyz)),c=this.uVspCoeff.toVar(),p=it(n.xyz.sub(s.xyz.mul(2)).add(a.xyz));he(p.greaterThan(this.uVspThreshold),()=>{c.assign(1)}),this.vspQuats.element(e).assign(h),this.vspTrans.element(e).assign(pe(m,c))})().compute(Tm[0],Tm)}_buildVsp(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumVerts),()=>{Ae()});let t=e.div(wm).toVar(),a=e.sub(t.mul(wm)).toVar();he(a.lessThan(2),()=>{Ae()});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=>pe(e.xyz.mul(R(1).sub(i)).add(Mm(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(Tm[0],Tm)}_buildLocalShape(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=e.mul(wm).toVar(),a=Ht(this.uLocalStiffness,.95).mul(.5),r=this.boneQuatNode();ge(Sm-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=Mm(r,this.initialPos.element(s).xyz),u=Mm(r,this.initialPos.element(s.add(1)).xyz),d=Mm(r,this.initialPos.element(s.sub(1)).xyz),h=i.xyz.sub(l.xyz),m=u.sub(o),c=o.sub(d),p=Cm(c.div(It(it(c),1e-7)),h.div(It(it(h),1e-7))),g=Mm(p,m).add(i.xyz).sub(n.xyz).mul(a);he(i.w.greaterThan(0),()=>{i.assign(pe(i.xyz.sub(g),i.w))}),he(n.w.greaterThan(0),()=>{n.assign(pe(n.xyz.add(g),n.w))}),this.positions.element(s).assign(i),this.positions.element(s.add(1)).assign(n)})})().compute(Tm[0],Tm)}_buildLengthWind(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=e.mul(wm).toVar();he(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(R(1).sub(a))).add(this.uWind2.mul(a)).add(this.uWind3.mul(R(1).sub(a))).toVar();ge(Sm-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=ya(ya(n,r),n).negate();s.assign(pe(s.xyz.add(l.mul(xr).mul(.1)),s.w)),this.positions.element(a).assign(s)})}),ge(5,()=>{ge(Sm,({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=It(it(n),1e-7),o=R(1).sub(i.div(l)),u=n.mul(o),d=r.w.greaterThan(0),h=s.w.greaterThan(0),m=d.select(h.select(R(.5),R(1)),R(0)),c=h.select(d.select(R(.5),R(1)),R(0));r.assign(pe(r.xyz.add(u.mul(m)),r.w)),s.assign(pe(s.xyz.sub(u.mul(c)),s.w)),this.positions.element(a).assign(r),this.positions.element(a.add(1)).assign(s)})}),ge(Sm,({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=It(it(i),1e-7),l=this.restLengths.element(a.sub(1));he(n.greaterThan(l),()=>{s.assign(pe(r.xyz.add(i.div(n).mul(l)),s.w)),this.positions.element(a).assign(s)})}),ge(wm,({i:e})=>{let a=t.add(e).toVar(),r=e.equal(wm-1).select(a.sub(1),a).toVar(),s=or(this.positions.element(r.add(1)).xyz.sub(this.positions.element(r).xyz));this.tangents.element(a).assign(pe(s,0))})})().compute(Tm[0],Tm)}_buildClump(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumStrands),()=>{Ae()});let t=this.uClumpSize.toVar(),a=e.div(t).mul(t).toVar();he(e.equal(a),()=>{Ae()}),he(a.greaterThanEqual(this.uNumStrands),()=>{Ae()});let r=e.mul(wm).toVar(),s=a.mul(wm).toVar();ge(Sm,({i:e})=>{let t=e.add(1).toVar(),a=t.toFloat().div(Sm),i=this.uClumpStrength.mul(Ie(a,R(1).div(It(this.uClumpTipScale,.5)))),n=r.add(t).toVar(),l=this.positions.element(n).toVar(),o=this.positions.element(s.add(t));l.assign(pe(Xt(l.xyz,o.xyz,i),l.w)),this.positions.element(n).assign(l)})})().compute(Tm[0],Tm)}_buildRigidFollow(){return le(()=>{let e=Pe(fe).toVar();he(e.greaterThanEqual(this.uNumVerts),()=>{Ae()});let t=this.uDeltaQuat,a=this.uPrevBoneTrans,r=this.boneTransNode(),s=s=>{let i=s.element(e).toVar();i.assign(pe(Mm(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(pe(Mm(t,i.xyz),0)),this.tangents.element(e).assign(i)})().compute(Tm[0],Tm)}pastelNoise(e){let t=e.sub(this.boneTransNode()).mul(this.uNoiseScale),a=zm(t).mul(.5).add(.5),r=zm(t.add(de(31.7,17.3,53.1))).mul(.5).add(.5),s=zm(t.mul(.7).add(de(71.9,11.2,43.8))).mul(.5).add(.5),i=Xt(this.uNoiseA,this.uNoiseB,a);return i=Xt(i,this.uNoiseC,r.mul(.6)),i=Xt(i,this.uNoiseD,s.mul(.25)),i}_buildRibbonMaterial(){let e=ae("vec3","vHairTangent"),t=ae("vec3","vHairNormal"),a=ae("vec2","vHairUv"),r=ae("float","vHairRand"),s=ae("vec3","vHairInherit"),i=new Pm(new km(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=Fs;let n=i=>le(()=>{let n=Pe(fe).toVar(),l=n.div(Sm).toVar(),o=n.sub(l.mul(Sm)).toVar(),u=l.mul(wm).add(o).toVar(),d=Pe(Me).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,_=Xt(c,p,m).toVar(),y=Xt(g,f,m).toVar(),x=or(St.sub(_)),v=ya(y,x).toVar(),b=it(v).toVar();v.assign(b.greaterThan(1e-7).select(v.div(b),de(1,0,0)));let T=o.toFloat().div(Sm),w=o.add(1).toFloat().div(Sm),S=Xt(T,w,m).toVar(),V=this.uWidth.mul(R(1).sub(S.mul(this.uTipFade))).toVar(),M=i?(()=>{let e=this.uShadowTexelWorld,t=e.greaterThan(0).select(e.mul(1.5).clamp(R(2),R(8)),R(0));return It(t.sub(V),0).toVar()})():null;M&&V.addAssign(M);let C=h.mul(2).sub(1),z=_.add(v.mul(V).mul(C)).toVar();M&&z.assign(z.sub(x.mul(M)));let k=this.positionsPrev.element(u).xyz,A=this.positionsPrev.element(u.add(1)).xyz;be.assign(Xt(k,A,m).add(v.mul(V).mul(C)));let P=U(ea(l.toFloat().mul(12.9898)).mul(43758.5453));return r.assign(P),s.assign(this.rootColors.element(l).xyz),e.assign(y),t.assign(or(x.sub(y.mul(Ha(y,x))))),a.assign(ne(h,S)),z}),l=le(()=>{let e=a.y,t=Xt(this.uHairRoot,this.uHairMid,Ht(e.mul(2),1)),i=e.lessThan(.5).select(t,Xt(this.uHairMid,this.uHairTip,e.sub(.5).mul(2))).toVar(),n=s.mul(Xt(this.uShadeRoot,this.uShadeTip,e));i.assign(this.uColorSource.greaterThan(.5).select(n,i)),i.assign(Xt(i,this.pastelNoise(Ee),this.uNoiseMixHair));let l=R(1).sub(Be(a.x.sub(.5)).mul(2));return R(1).sub(e.mul(this.uTipFade)).mul(Ie(It(l,0),.5)).toVar().lessThan(.25).discard(),r.greaterThanEqual(this.uOpacity).discard(),pe(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 Pm(new Am);e.name="SplineHairScalp";let t=le(()=>{let e=Xt(this.uHeadColor,this.pastelNoise(Ee),this.uNoiseMixHead);return pe(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*wm;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*Sm,e.resetRequested=!0),this._syncUniforms(e),e.boneTransform(Em,Bm),this.uBoneQuat.value.set(Em.x,Em.y,Em.z,Em.w),this.uBoneTrans.value.copy(Bm);let i=this._hasPrevBone&&(Math.abs(this._prevBoneQuat.dot(Em))<.9999995||this._prevBonePos.distanceToSquared(Bm)>1e-8),n=Math.floor(e.pendingSimSeconds/xr);n>vr&&(n=vr),e.pendingSimSeconds=Math.max(0,Math.min(e.pendingSimSeconds-n*xr,xr)),e.resetRequested&&n<1&&(n=1),n<1&&i&&(Nm.copy(this._prevBoneQuat).invert().premultiply(Em),this.uDeltaQuat.value.set(Nm.x,Nm.y,Nm.z,Nm.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+=xr,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(Em),this._prevBonePos.copy(Bm),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*wm,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,gs)};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*yr*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}},Im=new WeakMap,Dm=[];hr(e=>function(e){let t=Im.get(e);return void 0===t&&(t=new Lm,Im.set(e,t)),t}(e)),cr({release:e=>function(e){let t=Im.get(e);void 0!==t&&(Im.delete(e),Dm.push(t))}(e),drainRetired:function(){let e=Dm.length;if(e>0){for(let e of Dm)e.dispose();Dm.length=0}return e}});var Fm="\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",Um=e=>`\n${Fm}\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`,Om=Um("\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",Gm=Um("\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",qm=Um("\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",Wm=Um("\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",Hm=Um("\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",jm=Um("\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 Km(e){let t=e.backend.device;if(!t)throw new Error("[spline/sky] WebGPU device unavailable for LUT precompute");return t}function $m(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 Xm(e,t,a,r){let s=new H(e,t);return s.type=a,s.minFilter=js,s.magFilter=js,s.generateMipmaps=!1,s.mipmapsAutoUpdate=!1,s.name=r,s}function Qm(e,t,a,r,s,i){let n=new X(e,t,a);return n.type=r,n.minFilter=i,n.magFilter=i,n.generateMipmaps=!1,n.mipmapsAutoUpdate=!1,n.name=s,n}var Zm=256,Ym={transmittance:{code:Om,entries:[{storage:"2d",format:"rgba32float"}]},directIrradiance:{code:Gm,entries:[{sampled:"2d"},{storage:"2d",format:"rgba32float"},{storage:"2d",format:"rgba32float"},{sampled:"2d"}]},singleScattering:{code:qm,entries:[{storage:"3d",format:"rgba32float"},{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"}]},scatteringDensity:{code:Wm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"2d"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"},{sampled:"2d"}]},indirectIrradiance:{code:Hm,entries:[{storage:"2d",format:"rgba32float"},{sampled:"2d"},{storage:"2d",format:"rgba32float"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"}]},multipleScattering:{code:jm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"},{sampled:"3d"}]}};async function Jm(e,t,a,r,s,i){let n=Km(e),l=$m(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]=ec(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 ec(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 tc(e,t){return.5/t+e*(1-1/t)}function ac(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 rc(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 ac(t,256,64,tc((n-l)/(i+s-l),256),tc(o,64))}(e,t,a,r);return[l[0]*n,l[1]*n,l[2]*n]}function sc(e){return.2126*e[0]+.7152*e[1]+.0722*e[2]}function ic(e,t,a,r){let s=rc(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 nc(e,t,a,r){let s=function(e,t,a,r){let s=(a-e.bottomRadius)/(e.topRadius-e.bottomRadius);return ac(t,64,16,tc(.5*r+.5,64),tc(s,16))}(e,t.irradiance,a,r),i=e.skySpectralRadianceToLuminance;return[s[0]*i[0],s[1]*i[1],s[2]*i[2]]}var lc="6.0e4",oc="\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",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\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(${lc})), 1.0);\n`,dc="\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",hc=`\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(${lc})), cloud.a);\n`,mc=`\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(${lc})) * (1.0 - cloud.a) +\n\t\tmin(cloud.rgb, vec3f(${lc}));\n\tcolor = Hable(color, exposure, WHITE_POINT);\n\tcolor = pow(color, vec3f(1.0 / gamma));\n\n\treturn vec4f(color, 1.0);\n`,cc="\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",pc=`\n${dc}\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`,gc=`\n${dc}\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`,fc=Math.fround,_c=360,yc=.5*Math.PI/180,xc=1e3,vc=[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],bc=[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],Tc=[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],wc=[3.2406,-1.5372,-.4986,-.9689,1.8758,.0415,.0557,-.204,1.057],Sc={maxOzoneNumberDensity:5374e15,rayleigh:124062e-11,rayleighScaleHeight:8e3,mieScaleHeight:1200,mieAngstromAlpha:0,mieAngstromBeta:.005328,mieSingleScatteringAlbedo:.9,miePhaseFunctionG:.9,groundAlbedo:.1,numScatteringOrders:4};function Vc(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 Mc(e,t){if(e<=_c||e>=830)return 0;let a=(e-_c)/5,r=Math.floor(a);return a-=r,Tc[4*r+t]*(1-a)+Tc[4*(r+1)+t]*a}function Cc(e,t,a){let r=0,s=0,i=0,n=Vc(e,t,680),l=Vc(e,t,550),o=Vc(e,t,440);for(let u=_c;u<830;u+=1){let d=Mc(u,1),h=Mc(u,2),m=Mc(u,3),c=wc[0]*d+wc[1]*h+wc[2]*m,p=wc[3]*d+wc[4]*h+wc[5]*m,g=wc[6]*d+wc[7]*h+wc[8]*m,f=Vc(e,t,u);r+=c*f/n*Math.pow(fc(u/680),a),s+=p*f/l*Math.pow(fc(u/550),a),i+=g*f/o*Math.pow(fc(u/440),a)}return r*=683,s*=683,i*=683,[r,s,i]}var Rc=Math.PI/180;function zc(e,t,a,r,s){return[fc(e/xc),fc(t),fc(a*xc),fc(r*xc),fc(s)]}function kc(e){return new Float32Array([...e,...e])}var Ac=fc(Rc),Pc=fc(Math.PI),Ec=fc(2*Math.PI);function Nc(e,t=80){let a=fc(52*Ac),r=fc(fc(23.44)*Ac),s=fc(e%86400/86400),i=fc(r*Math.sin(fc(fc(fc(2*Pc)*(t-80))/365))),n=fc(fc(s-.5)*Ec),l=fc(Math.sin(a)*Math.sin(i)+Math.cos(a)*Math.cos(i)*Math.cos(n)),o=fc(1-fc(l*l)),u=fc(Math.sqrt(o>0?o:0));return[fc(u*Math.sin(n)),l,fc(u*Math.cos(n))]}var Bc=Math.fround,Lc=256;function Ic(e){return Bc(e-Math.floor(e))}function Dc(e,t,a){e=Bc(e+a),t=Bc(t+a);let r=Bc(Bc(e*Bc(127.1))+Bc(t*Bc(311.7))),s=Bc(Bc(e*Bc(269.5))+Bc(t*Bc(183.3)));return[Ic(Bc(Bc(Math.sin(r))*Bc(43758.5453123))),Ic(Bc(Bc(Math.sin(s))*Bc(43758.5453123)))]}function Fc(e,t,a){return Bc(Bc(Bc(Bc(Bc(t-e)*Bc(3-Bc(2*a)))*a)*a)+e)}var Uc=Bc(Bc(3.14159265)/2147483648);function Oc(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=Bc(Bc(r)*Uc);return[Bc(Math.sin(i)),Bc(Math.cos(i))]}(e,t,s),l=Bc(a-e),o=Bc(r-t);return Bc(Bc(l*i)+Bc(o*n))}function Gc(e,t,a=0){let r=Math.trunc(e),s=Math.trunc(t),i=r+1,n=s+1,l=Bc(e-r),o=Bc(t-s),u=Oc(r,s,e,t,a),d=Oc(i,s,e,t,a),h=Fc(u,d,l);u=Oc(r,n,e,t,a),d=Oc(i,n,e,t,a);let m=Fc(u,d,l);return Fc(h,m,o)}function qc(e,t,a,r=1,s=1,i=0){let n=0,l=0;for(let o=0;o<e;o++)n=Bc(n+Bc(s*Gc(Bc(t*r),Bc(a*r),i))),l=Bc(l+s),s=Bc(.5*s),r=Bc(2*r);return Bc(n/l)}function Wc(e,t,a,r=0){let s=Math.floor(e),i=Math.floor(t),n=Bc(e-s),l=Bc(t-i),o=1e9;for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let u=Bc(Bc(Bc(s+t)+a)%a),d=Bc(Bc(Bc(i+e)+a)%a),[h,m]=Dc(u,d,r),c=Bc(h+t),p=Bc(m+e),g=Bc(c-n),f=Bc(p-l),_=Bc(Math.sqrt(Bc(Bc(g*g)+Bc(f*f))));_<o&&(o=_)}return o}function Hc(e,t,a){let r=Bc(Bc(a-e)/Bc(t-e));return r<0&&(r=0),r>1&&(r=1),Bc(Bc(r*r)*Bc(3-Bc(2*r)))}function jc(e,t,a){return Bc(Bc(e*Bc(1-a))+Bc(t*a))}function Kc(e){return Math.trunc(e)>>>0}var $c=new Float32Array(1),Xc=new Uint32Array($c.buffer);function Qc(e){$c[0]=e;let t=Xc[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 Zc=new Map;function Yc(e,t){let a=`${e}|${Bc(t)}`,r=Zc.get(a);if(void 0!==r)return Zc.delete(a),Zc.set(a,r),r;let s=function(e){let t=new Uint16Array(262144);for(let a=0;a<65536;a++)t[4*a+0]=Qc(e[3*a+0]),t[4*a+1]=Qc(e[3*a+1]),t[4*a+2]=Qc(e[3*a+2]),t[4*a+3]=15360;return t}(function(e,t){switch(t=Bc(t),e){case"clear":return new Float32Array(196608);case"mostlyClear":return function(e){let t=new Float32Array(196608),a=Kc(e);for(let e=0;e<Lc;e++)for(let r=0;r<Lc;r++){let s=Bc(e/Lc),i=Bc(r/Lc),n=3*(r*Lc+e),l=Bc(Bc(.5*qc(3,s,i,24,1,a))+.5);t[n+0]=Bc(Hc(Bc(.45),Bc(.8),l)*Bc(.7)),t[n+1]=0,t[n+2]=Bc(.3)}return t}(t);case"partlyCloudy":return function(e){let t=new Float32Array(196608),a=Bc(Math.max(1,Kc(e)));for(let r=0;r<Lc;r++)for(let s=0;s<Lc;s++){let i=Bc(r/Lc),n=Bc(s/Lc),l=3*(s*Lc+r),o=Bc(1-Wc(Bc(24*i),Bc(24*n),24,e)),u=Bc(Bc(.5*qc(3,i,n,16,a,0))+.5),d=Bc(u*Hc(Bc(.3),1,o)),h=Bc(jc(0,Bc(.35),Hc(Bc(.1),Bc(.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=Bc(Math.max(1,Kc(e)));for(let r=0;r<Lc;r++)for(let s=0;s<Lc;s++){let i=Bc(r/Lc),n=Bc(s/Lc),l=3*(s*Lc+r),o=Bc(1-Wc(Bc(32*i),Bc(32*n),32,e)),u=Bc(Bc(.5*qc(3,i,n,16,a,0))+.5),d=Bc(u*Hc(0,Bc(.9),o)),h=Bc(jc(0,Bc(.6),Hc(Bc(.1),Bc(.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=Kc(e);for(let e=0;e<Lc;e++)for(let r=0;r<Lc;r++){let s=Bc(e/Lc),i=Bc(r/Lc),n=3*(r*Lc+e),l=Bc(Bc(.5*qc(3,s,i,16,1,a))+.5);t[n+0]=Hc(Bc(.2),1,l),t[n+1]=Bc(.3),t[n+2]=Bc(.8)}return t}(t);case"storm":return function(e){let t=new Float32Array(196608),a=Kc(e);for(let e=0;e<Lc;e++)for(let r=0;r<Lc;r++){let s=Bc(e/Lc),i=Bc(r/Lc),n=3*(r*Lc+e),l=Bc(Bc(.5*qc(3,s,i,16,1,a))+.5);t[n+0]=Hc(Bc(.1),1,l),t[n+1]=Bc(Bc(.5*qc(2,s,i,8,1,a))+.5),t[n+2]=1}return t}(t)}}(e,t));return Zc.size>=8&&Zc.delete(Zc.keys().next().value),Zc.set(a,s),s}var Jc={cirrus:"sky-cirrus.png",alto:"sky-alto.png"};async function ep(e){let t=ts(Jc[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 tp(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 ap="\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",rp=64,sp=32;function ip(e){return Math.pow(e/255,2.2)}var np=class{constructor(e,t){this._uRotation=N(new ms),this._uBlurAngle=N(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(Gr(e)){let{data:a,width:r,height:s}=e;t=(e,t)=>{let i=Math.min(r-1,Math.floor((e+.5)/rp*r)),n=Math.min(s-1,Math.floor((t+.5)/sp*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=rp,a.height=sp;let r,s=a.getContext("2d",{willReadFrequently:!0});if(null===s)return null;try{s.drawImage(e,0,0,rp,sp),r=s.getImageData(0,0,rp,sp).data}catch{return null}t=(e,t)=>{let a=4*(t*rp+e);return[ip(r[a]),ip(r[a+1]),ip(r[a+2])]}}let a=e=>.2126*e[0]+.7152*e[1]+.0722*e[2],r=(e,t)=>{let a=(t+.5)/sp*Math.PI,r=Math.PI-(e+.5)/rp*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<sp;e++){let r=Math.sin((e+.5)/sp*Math.PI),u=e<16;for(let d=0;d<rp;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<sp;e++){let s=Math.sin((e+.5)/sp*Math.PI);for(let i=0;i<rp;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=Gr(e.image)?qr(e.image):new fs(e.image);t.name="sky-hdri-source",t.wrapS=Ds,t.wrapT=Us,t.minFilter=ti,t.magFilter=Ys,t.generateMipmaps=!0,t.flipY=!Gr(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 De("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}",[Ne(ap)])({uv:kt,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:qa(e),envSamp:yt(e)})}_ensureBackgroundMesh(e){if(this.backgroundMesh)return this.backgroundMesh;let t=new Es;t.setAttribute("position",new zs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let a=new Ct;a.name="SplineSkyHdriBackground",a.lights=!1,a.depthWrite=!1,a.depthTest=!1,a.colorNode=this._buildBackgroundNode(e);let r=De("fn hdriBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");a.vertexNode=r({position:ce});let s=new Os(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=De("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}",[Ne(ap)])({uv:$(),rotation:this._uRotation,blurAngle:this._uBlurAngle,envTex:qa(e),envSamp:yt(e)});if(null===this._envQuad){let e=new Ct;e.name="SplineSkyHdriEnvironmentPass",e.lights=!1,e.fragmentNode=t,this._envQuad=new $a(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 vs(256,128,{type:rs,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-hdri-environment",e.generateMipmaps=!0,e.minFilter=ti,e.magFilter=Ys,e.wrapS=Ds}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}},lp=new Ms,op=new ds,up=new xs,dp=new xs,hp={maxDistance:128,sigmaS:10,sigmaA:0,cloudLayerThickness:4,cloudLayerBottom:2,highCloudsHeight:8,highCloudsScale:32,weatherMapScale:128,baseNoiseScale:25,detailNoiseScale:1.5},mp=.3,cp=.3,pp={clear:[0,0],mostlyClear:[mp,cp],partlyCloudy:[mp,cp],mostlyCloudy:[mp,cp],overcast:[mp,cp],storm:[mp,cp]},gp=null;try{let e=new URLSearchParams(window.location.search).get("dbgskystep");null!==e&&""!==e&&Number.isFinite(Number(e))&&(gp=Math.max(0,Number(e)))}catch{}var fp=.62,_p={clear:1,mostlyClear:.95,partlyCloudy:.9,mostlyCloudy:.8,overcast:.6,storm:.5},yp={clear:1,mostlyClear:.92,partlyCloudy:.8,mostlyCloudy:.55,overcast:.3,storm:.15},xp={clear:1,mostlyClear:.97,partlyCloudy:.92,mostlyCloudy:.8,overcast:.65,storm:.5},vp="\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",bp=`${vp},\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`,Tp=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=N(new ms),this._uRay10=N(new ms),this._uRay01=N(new ms),this._uRay11=N(new ms),this._uCameraPos=N(new ms(0,.1,0)),this._uSunDir=N(new ms(0,1,0)),this._uCloudsParamsC=N(new xs(hp.baseNoiseScale,hp.detailNoiseScale,mp,cp)),this._uCloudsParamsD=N(new xs(0,1,0,0)),this._uExposure=N(5e-4),this._uGamma=N(2.2),this._uEnvCloudsOn=N(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._lightingOn=!1,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=_c;o<=830;o+=10){let u=.001*o,d=e.mieAngstromBeta/e.mieScaleHeight*Math.pow(u,-e.mieAngstromAlpha);t.push(o),a.push(vc[(o-_c)/10]),r.push(e.rayleigh*Math.pow(u,-4)),s.push(d*e.mieSingleScatteringAlbedo),i.push(d),n.push(e.maxOzoneNumberDensity*bc[(o-_c)/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=Cc(a,t.solarIrradiance,-3),s=Cc(a,t.solarIrradiance,0),i=(e,t)=>[fc(Vc(a,e,680)*t),fc(Vc(a,e,550)*t),fc(Vc(a,e,440)*t)];return{solarIrradiance:i(t.solarIrradiance,1),rayleighScattering:i(t.rayleighScattering,xc),mieScattering:i(t.mieScattering,xc),mieExtinction:i(t.mieExtinction,xc),absorptionExtinction:i(t.absorptionExtinction,xc),groundAlbedo:i(t.groundAlbedo,1),skySpectralRadianceToLuminance:[fc(r[0]),fc(r[1]),fc(r[2])],sunSpectralRadianceToLuminance:[fc(s[0]),fc(s[1]),fc(s[2])],bottomRadius:6360,topRadius:6420,muSMin:fc(Math.cos(120*Rc)),sunAngularRadius:fc(yc),miePhaseG:fc(e.miePhaseFunctionG),rayleighDensity:kc(zc(0,1,-1/e.rayleighScaleHeight,0,0)),mieDensity:kc(zc(0,1,-1/e.mieScaleHeight,0,0)),absorptionDensity:new Float32Array([...zc(25e3,0,0,1/15e3,-2/3),...zc(0,0,0,-1/15e3,8/3)]),luminanceFromRadiance:new Float32Array([1,0,0,0,1,0,0,0,1])}}(Sc);let t=e=>{let t=new Ks(new Uint16Array(262144),Lc,Lc,_s,rs);return t.wrapS=Ds,t.wrapT=Ds,t.minFilter=Ys,t.magFilter=Ys,t.name=e,t.needsUpdate=!0,t};this._weatherCur=t("sky-weather-current"),this._weatherNext=t("sky-weather-next"),this._highClouds=new Ks(new Uint8Array(524288),512,512,ws,ri),this._highClouds.wrapS=Ds,this._highClouds.wrapT=Ds,this._highClouds.minFilter=Ys,this._highClouds.magFilter=Ys,this._highClouds.name="sky-high-clouds",this._highClouds.needsUpdate=!0,this.assetsReady=async function(){let[e,t]=await Promise.all([ep("cirrus").then(tp),ep("alto").then(tp)]),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=>{this._highClouds.image.data.set(e),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?Jm(this._renderer,t.transmittance,256,64,1,!1):"irradiance"===e?Jm(this._renderer,t.irradiance,64,16,1,!1):Jm(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 Jm(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 this._lightingOn?!0===this._hdri?.active?this._iblHdriTexture:this._envTarget?.texture??null: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=Km(e),s=Xm(256,64,as,"sky-lut-transmittance"),i=[Xm(64,16,as,"sky-lut-irradiance-a"),Xm(64,16,as,"sky-lut-irradiance-b")],n=[Qm(256,128,32,rs,"sky-lut-scattering-a",Ys),Qm(256,128,32,rs,"sky-lut-scattering-b",Ys)],l=Xm(64,16,as,"sky-delta-irradiance"),o=Qm(256,128,32,as,"sky-delta-rayleigh",js),u=Qm(256,128,32,as,"sky-delta-mie",js),d=Qm(256,128,32,as,"sky-delta-density",js),h={transmittance:$m(e,s),irr:i.map(t=>$m(e,t)),scat:n.map(t=>$m(e,t)),deltaIrradiance:$m(e,l),deltaRayleigh:$m(e,o),deltaMie:$m(e,u),deltaDensity:$m(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)*Zm),_=new Map;for(let[e,t]of Object.entries(Ym)){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*Zm/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*Zm/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:Zm}}];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],C=n[v],R=[i[1-x],n[1-v],l,o,u,d];for(let e of R)e.dispose();return p.destroy(),w.destroy(),{transmittance:s,scattering:C,irradiance:M,dispose(){s.dispose(),C.dispose(),M.dispose()}}}(this._renderer,this._atmosphereUniforms,this.numScatteringOrdersOverride??Sc.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 X(e,e,e);return a.type=rs,a.minFilter=Ys,a.magFilter=Ys,a.wrapS=Ds,a.wrapT=Ds,a.wrapR=Ds,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(pc,this._baseNoise,128),a(gc,this._detailNoise,32)}_atmArgs(){let e=this._atmosphereUniforms;return{solarIrradiance:N(new ms(...e.solarIrradiance)),rayleighScattering:N(new ms(...e.rayleighScattering)),mieScattering:N(new ms(...e.mieScattering)),skySrtl:N(new ms(...e.skySpectralRadianceToLuminance)),sunSrtl:N(new ms(...e.sunSpectralRadianceToLuminance)),atmScalars:N(new xs(e.sunAngularRadius,e.bottomRadius,e.topRadius,e.miePhaseG)),muSMin:N(e.muSMin)}}_ensurePasses(){if(this._skyQuad)return;this._ensureLuts(),this._ensureNoise();let e=this._luts,t={uv:$(),ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11,cameraPos:this._uCameraPos,sunDir:this._uSunDir,...this._atmArgs(),transmittanceTex:qa(e.transmittance),scatteringTex:Ka(e.scattering),scatteringSamp:yt(e.scattering)},a=Ne(Fm+oc),r=De(`fn skyPass(${vp}) -> vec4f {${uc}}`,[a]),s=new Ct;s.name="SplineSkyPass",s.lights=!1,s.fragmentNode=r(t),this._skyQuad=new $a(s);let i=Ne(Fm+oc+"\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=De(`fn cloudsPass(${bp}) -> vec4f {${hc}}`,[i]),l=hp,o={...t,irradianceTex:qa(e.irradiance),baseNoiseTex:Ka(this._baseNoise),noiseSamp:yt(this._baseNoise),detailNoiseTex:Ka(this._detailNoise),weatherCurTex:qa(this._weatherCur),weatherSamp:yt(this._weatherCur),weatherNextTex:qa(this._weatherNext),highCloudsTex:qa(this._highClouds),cloudsParamsA:N(new xs(l.maxDistance,l.sigmaS,l.sigmaA,l.cloudLayerThickness)),cloudsParamsB:N(new xs(l.cloudLayerBottom,l.highCloudsHeight,l.highCloudsScale,l.weatherMapScale)),cloudsParamsC:this._uCloudsParamsC,cloudsParamsD:this._uCloudsParamsD},u=new Ct;u.name="SplineSkyCloudsPass",u.lights=!1,u.fragmentNode=n(o),this._cloudsQuad=new $a(u),this._cloudsArgs=o,this._cloudsLib=i}_ensureEnvPass(){if(this._envQuad)return;this._ensurePasses();let e=De(`fn skyEnvPass(${bp},\n\texposure: f32, gamma: f32, cloudsOn: f32) -> vec4f {${mc}}`,[Ne(cc),this._cloudsLib]),t=new Ct;t.name="SplineSkyEnvironmentPass",t.lights=!1,t.fragmentNode=e({...this._cloudsArgs,exposure:this._uExposure,gamma:this._uGamma,cloudsOn:this._uEnvCloudsOn}),this._envQuad=new $a(t)}_ensureBackgroundMesh(e,t){if(this.backgroundMesh)return this.backgroundMesh;let a=new Es;a.setAttribute("position",new zs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let r=new Ct;r.name="SplineSkyBackground",r.lights=!1,r.depthWrite=!1,r.depthTest=!1,r.colorNode=this._buildComposeNode(e,t);let s=De("fn skyBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");r.vertexNode=s({position:ce});let i=new Os(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=Yc(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=up.set(e,t,-1,1).applyMatrix4(a.projectionMatrixInverse);return this._eyeRayToWorld(s.x,s.y,a,r)}_eyeRayToWorld(e,t,a,r){let s=dp.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),this._windOffsetKm%=9600);let n=this.fixedTimeSeconds??3600*a.timeOfDay,l=Nc(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??gp??.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=pp[this._presetFrom],m=pp[this._presetTo];this._uCloudsParamsC.value.set(hp.baseNoiseScale,hp.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),this._lightingOn=!0===a.lighting,!0===a.lighting?(this._ensureLightingLuts(),this._updateLighting(e,o,a.exposure,a.lightingIntensity??1)):null!==this._lightingPage&&this._teardownLighting();let c=this._renderer.getDrawingBufferSize(op);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 vs(t,a,{type:rs,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,C=this._uRay01.value,R=this._uRay11.value,z=`${n}|${V.x},${V.y},${V.z}|${M.x},${M.y},${M.z}|${C.x},${C.y},${C.z}|${R.x},${R.y},${R.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(lp),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 vs(256,128,{type:rs,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-environment",e.generateMipmaps=!0,e.minFilter=ti,e.magFilter=Ys,e.wrapS=Ds}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(op);this._updateCornerRays(t,r.y>0?r.x/r.y:1),null===this._hdri&&(this._hdri=new np(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,this._lightingOn=!0===a.lighting&&null!==i;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 ns(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 Pi(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):fp;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([Jm(this._renderer,e.transmittance,256,64,1,!1),Jm(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=Nc(43200)[1],i=ic(a,this._lightingLuts,r,s);this._noonSunRgb=[i[0],i[1],i[2]],this._noonSunLum=sc(i),this._noonSkyLum=sc(nc(a,this._lightingLuts,r,s))},()=>{this._lightingLutsRequested=!1})}_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=sc(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(_p),c=ic(n,s,l,u),p=sc(c),g=this._sunLight;if(null===g&&(g=new ns(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(yp)*a*r;let f=e.ambientLight;null!=f&&(null!==f.parent&&f.removeFromParent(),this._userAmbientSuppressed=!0);let _=this._skyHemi;null===_&&(_=new Pi(16777215,8947848,0),_.name="SplineSkyAmbient",_.layers.enable(3),_.raycast=()=>{},this._skyHemi=_),_.parent!==e&&e.add(_);let y=nc(n,s,l,u),x=sc(y),[v,b,T]=h(y,m);_.color.setRGB(v,b,T),_.groundColor.setRGB(v*fp,b*fp,T*fp),_.intensity=.75*Math.PI*(x/this._noonSkyLum)*d(xp)*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 De("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}",[Ne(cc)])({uv:kt,skyTex:qa(e),skySamp:yt(e),cloudsTex:qa(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(),this._lightingOn=!1}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}};kl=e=>new Tp(e);var wp=e=>e,Sp=ae("vec4","vSplatColor"),Vp=ae("vec2","vSplatPosition");function Mp(e,t,a){return e.element(t).element(a)}var Cp=class extends Ct{constructor(e){super(),this.uniformsNeedUpdate=!1,this._covariancesTex=qa(new fs),this._centersColorsTex=qa(new fs),this._meshMatrixWorldsTex=qa(new fs),this._focal=N(new ds),this._viewport=N(new ds),this._basisViewport=N(new ds),this._covariancesTextureSize=N(new ds(1024,1024)),this._centersColorsTextureSize=N(new ds(1024,1024)),this._orthoZoom=N(-1),this._velocityMRT=Ca({velocity:pe(0)}),this.name="WebGPUSplatMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.side=Fs,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 Ms)},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=le(()=>{let u=dt("splatIndex","uint"),d=(e,t,a)=>{let r=u.mul(k(e)).add(k(t)).toFloat().div(a.x);return ne(U(r),P(r).div(a.y))},h=a.sample(d(1,0,l)).toVar(),m=ct(Y(h.y,h.z,h.w),"vec3").toVar(),c=h.x;Sp.assign(pe(c.bitAnd(k(255)).toFloat(),c.shiftRight(k(8)).bitAnd(k(255)).toFloat(),c.shiftRight(k(16)).bitAnd(k(255)).toFloat(),c.shiftRight(k(24)).bitAnd(k(255)).toFloat()).mul(1/255));let p=dt("position","vec3").xy.mul(2).toVar();Vp.assign(p);let g=R(0);for(let t=1;t<e.length-1;t++)g=wp(g.add(u.greaterThanEqual(k(e[t])).select(R(1),R(0))));let f=g.mul(4).toVar(),_=e=>r.sample(ne(f.add(e).div(1024),0)),y=Vt(_(0),_(1),_(2),_(3)),x=Lt.mul(y).toVar(),v=x.mul(pe(m,1)).toVar(),b=Rt.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,C=w.x,z=w.y,A=S.x,E=S.y,N=bt(V,M,C,M,z,A,C,A,E),B=R(1).div(v.z.mul(v.z)).toVar(),L=x,I=bt(L.element(0).xyz,L.element(1).xyz,L.element(2).xyz).transpose(),D=bt(s.x.div(v.z),0,s.x.mul(v.x).negate().mul(B),0,s.y.div(v.z),s.y.mul(v.y).negate().mul(B),0,0,0),F=e=>{let t=e.transpose().mul(N).mul(e);return pe(Mp(t,0,0).add(.3),Mp(t,0,1),Mp(t,1,1).add(.3),0).xyz},O=o.greaterThan(0),G=O.select(F(I),F(I.mul(D))).toVar(),q=b.xyz.div(b.w).toVar(),W=G.x,H=G.z,j=G.y,K=W.mul(H).sub(j.mul(j)),$=W.add(H),X=$.mul(.5),Q=fa(It($.mul($).div(4).sub(K),0)).toVar(),Z=X.add(Q).toVar(),J=It(X.sub(Q),0).toVar(),ee=or(ne(j,Z.sub(W))).toVar(),te=ne(ee.y,ee.x.negate()).toVar(),ae=ee.mul(Ht(fa(Z.mul(2)),1024)).toVar(),re=te.mul(Ht(fa(J.mul(2)),1024)).toVar(),se=ae.mul(p.x).add(re.mul(p.y)).mul(i).toVar();return se.assign(O.select(se.mul(o),se)),pe(q.xy.add(se),q.z,1)}),d=le(()=>{let e=Vp.dot(Vp).negate().toVar();e.lessThan(-4).discard();let t=Ja(e).mul(Sp.w);return pe(Sp.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 Rp(){let e=N(1),t=N(.6),a=N(1),r=N(1),s=N(new Ms(16603997)),i=N(new Ms(2857471)),n=N(new Ms(3728051)),l=N(9),o=N(new ds),u=new Ct;u.name="EditorGridNodeMaterial",u.transparent=!0,u.lights=!1,u.fog=!1;let d=Nt(l.equal(10),n,i),h=Nt(l.equal(8),n,s),m=Nt(_e.x.equal(o.x),d,Nt(_e.z.equal(o.y),h,de(.5)));u.colorNode=m;let c=Ve.z.negate(),p=sa(a.mul(500),a.mul(4500),c).mul(r);u.opacityNode=Xt(e.mul(t),R(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 zp(){return typeof navigator<"u"&&void 0!==navigator.gpu}Tr({createSplatMaterial:e=>new Cp(e)}),Pr({createRootMaterial:(e,t)=>new uh(e,t),createSharedMaterial:(e,t,a)=>new dh(e,t,a)}),Nr({tsl:nr,NodeMaterial:Ct,MeshBasicNodeMaterial:Zt,MeshStandardNodeMaterial:ba,MeshPhysicalNodeMaterial:Va,MeshPhongNodeMaterial:ua,MeshLambertNodeMaterial:ia,MeshToonNodeMaterial:za,MeshMatcapNodeMaterial:Ea,MeshNormalNodeMaterial:qt,SpriteNodeMaterial:Ia,PointsNodeMaterial:Ua,LineBasicNodeMaterial:At,LineDashedNodeMaterial:Bt,Color:Ms,Vector2:ds,Vector3:ms,Vector4:xs,Matrix3:cs,Matrix4:Ss,Texture:fs,CanvasTexture:is,DataTexture:Ks,VideoTexture:ii,FrontSide:Ls,BackSide:Is,DoubleSide:Fs,NormalBlending:Hs,AdditiveBlending:$s,MultiplyBlending:Zs,SubtractiveBlending:Xs,RepeatWrapping:Ds,ClampToEdgeWrapping:Us,MirroredRepeatWrapping:qs,NearestFilter:js,LinearFilter:Ys,LinearMipmapLinearFilter:ti,SRGBColorSpace:gs,LinearSRGBColorSpace:ys}),Er(()=>{let e=new Wa;return e.depthWrite=!1,e.opacity=.5,e});var kp=["maxUniformBuffersPerShaderStage","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageBufferBindingSize","maxBufferSize","maxVertexBuffers","maxVertexAttributes","maxUniformBufferBindingSize","maxColorAttachmentBytesPerSample"];async function Ap(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 kp){let t=r[e];"number"==typeof t&&Number.isFinite(t)&&(a[e]=t)}return a}catch{return}}(e),r=new Vo({...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{Oo as SPE_BLENDING_MULTIPLY,Uo as SPE_BLENDING_NORMAL,qo as SPE_BLENDING_OVERLAY,Go as SPE_BLENDING_SCREEN,Io as TSLLayerParams,uh as TSLRootMaterial,dh as TSLSharedMaterial,ji as WebGPUPostPipeline,Vo as WebGPUSplineRenderer,Rp as createEditorGridNodeMaterial,Ap as createWebGPUSplineRenderer,Qo as getTSLLayerBuilder,Zo as hasTSLLayerBuilder,zp as isWebGPUSupported,Bo as ownUniformValue,Xo as registerTSLLayer,Lo as setRenderUniformValue,Fo as simpleCalpha,Ho as speBlend,Ao as speObjectNormal,ko as speObjectPosition,No as splitUniformValueSlots,Do as standardCalpha,$o as unsupportedTSLLayerBuilder,w as webgpuGlobals};