@splinetool/runtime 2.0.8 → 2.0.10

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 (279) hide show
  1. package/build/hana-ui.js +122 -42
  2. package/build/hana-ui.js.br +0 -0
  3. package/build/hana-ui.js.gz +0 -0
  4. package/build/hana-ui.wasm +0 -0
  5. package/build/hana-ui.wasm.br +0 -0
  6. package/build/hana-ui.wasm.gz +0 -0
  7. package/build/{runtime-chunk-PDASWDVC.js → runtime-chunk-4LKRNVPP.js} +1 -1
  8. package/build/{runtime-chunk-PDASWDVC.js.br → runtime-chunk-4LKRNVPP.js.br} +0 -0
  9. package/build/runtime-chunk-4LKRNVPP.js.gz +0 -0
  10. package/build/{runtime-chunk-DK66VKWP.js → runtime-chunk-7FDJ7IIR.js} +1 -1
  11. package/build/runtime-chunk-7FDJ7IIR.js.br +0 -0
  12. package/build/runtime-chunk-7FDJ7IIR.js.gz +0 -0
  13. package/build/{runtime-chunk-23QXG35G.js → runtime-chunk-BLFFIB2B.js} +1 -1
  14. package/build/runtime-chunk-BLFFIB2B.js.br +0 -0
  15. package/build/runtime-chunk-BLFFIB2B.js.gz +0 -0
  16. package/build/{runtime-chunk-DHWGP6NU.js → runtime-chunk-CDR3AZNB.js} +1 -1
  17. package/build/runtime-chunk-CDR3AZNB.js.br +0 -0
  18. package/build/runtime-chunk-CDR3AZNB.js.gz +0 -0
  19. package/build/{runtime-chunk-HZ6FL5GH.js → runtime-chunk-CDYE22J6.js} +1 -1
  20. package/build/runtime-chunk-CDYE22J6.js.br +0 -0
  21. package/build/runtime-chunk-CDYE22J6.js.gz +0 -0
  22. package/build/runtime-chunk-DZIH7EMN.js +1 -0
  23. package/build/runtime-chunk-DZIH7EMN.js.br +0 -0
  24. package/build/runtime-chunk-DZIH7EMN.js.gz +0 -0
  25. package/build/{runtime-chunk-TAY7IXEZ.js → runtime-chunk-FN2C54JM.js} +1 -1
  26. package/build/runtime-chunk-FN2C54JM.js.br +0 -0
  27. package/build/runtime-chunk-FN2C54JM.js.gz +0 -0
  28. package/build/runtime-chunk-I6B5A36U.js +1 -0
  29. package/build/runtime-chunk-I6B5A36U.js.br +0 -0
  30. package/build/runtime-chunk-I6B5A36U.js.gz +0 -0
  31. package/build/{runtime-chunk-E3IEBR27.js → runtime-chunk-JSRKKIOS.js} +1 -1
  32. package/build/runtime-chunk-JSRKKIOS.js.br +0 -0
  33. package/build/runtime-chunk-JSRKKIOS.js.gz +0 -0
  34. package/build/{runtime-chunk-BMA5KYBS.js → runtime-chunk-KKDM5MC5.js} +1 -1
  35. package/build/runtime-chunk-KKDM5MC5.js.br +0 -0
  36. package/build/runtime-chunk-KKDM5MC5.js.gz +0 -0
  37. package/build/{runtime-chunk-3GRN37GY.js → runtime-chunk-L2C7JGYG.js} +1 -1
  38. package/build/runtime-chunk-L2C7JGYG.js.br +0 -0
  39. package/build/runtime-chunk-L2C7JGYG.js.gz +0 -0
  40. package/build/{runtime-chunk-GZ7C2GJM.js → runtime-chunk-LQL2PJVX.js} +1 -1
  41. package/build/runtime-chunk-LQL2PJVX.js.br +0 -0
  42. package/build/runtime-chunk-LQL2PJVX.js.gz +0 -0
  43. package/build/{runtime-chunk-EJJZJ5MV.js → runtime-chunk-M4BPCY7K.js} +1 -1
  44. package/build/runtime-chunk-M4BPCY7K.js.br +0 -0
  45. package/build/runtime-chunk-M4BPCY7K.js.gz +0 -0
  46. package/build/{runtime-chunk-CKT62HES.js → runtime-chunk-MOZWC42D.js} +1 -1
  47. package/build/runtime-chunk-MOZWC42D.js.br +0 -0
  48. package/build/runtime-chunk-MOZWC42D.js.gz +0 -0
  49. package/build/{runtime-chunk-RLYG5YBB.js → runtime-chunk-MVJAFW5H.js} +1 -1
  50. package/build/runtime-chunk-MVJAFW5H.js.br +1 -0
  51. package/build/runtime-chunk-MVJAFW5H.js.gz +0 -0
  52. package/build/{runtime-chunk-USGQ26QU.js → runtime-chunk-QSJVWNNM.js} +1 -1
  53. package/build/runtime-chunk-QSJVWNNM.js.br +0 -0
  54. package/build/runtime-chunk-QSJVWNNM.js.gz +0 -0
  55. package/build/{runtime-chunk-F3ZACLZW.js → runtime-chunk-RTRWO43P.js} +1 -1
  56. package/build/runtime-chunk-RTRWO43P.js.br +0 -0
  57. package/build/runtime-chunk-RTRWO43P.js.gz +0 -0
  58. package/build/{runtime-chunk-HK23JJVH.js → runtime-chunk-RX3SW5K2.js} +1 -1
  59. package/build/runtime-chunk-RX3SW5K2.js.br +0 -0
  60. package/build/runtime-chunk-RX3SW5K2.js.gz +0 -0
  61. package/build/{runtime-chunk-5RXW5MNJ.js → runtime-chunk-UHCXLQHA.js} +1 -1
  62. package/build/runtime-chunk-UHCXLQHA.js.br +0 -0
  63. package/build/runtime-chunk-UHCXLQHA.js.gz +0 -0
  64. package/build/{runtime-chunk-AELTGHV2.js → runtime-chunk-VNO2DW74.js} +1 -1
  65. package/build/{runtime-chunk-AELTGHV2.js.br → runtime-chunk-VNO2DW74.js.br} +0 -0
  66. package/build/runtime-chunk-VNO2DW74.js.gz +0 -0
  67. package/build/{runtime-chunk-UIM3XKIT.js → runtime-chunk-WQ2NXI3U.js} +1 -1
  68. package/build/runtime-chunk-WQ2NXI3U.js.br +0 -0
  69. package/build/runtime-chunk-WQ2NXI3U.js.gz +0 -0
  70. package/build/{runtime-chunk-557KVSJL.js → runtime-chunk-YO3XFDZF.js} +1 -1
  71. package/build/runtime-chunk-YO3XFDZF.js.br +0 -0
  72. package/build/runtime-chunk-YO3XFDZF.js.gz +0 -0
  73. package/build/{runtime-chunk-32KZP4YN.js → runtime-chunk-YS7K3AW3.js} +1 -1
  74. package/build/runtime-chunk-YS7K3AW3.js.br +0 -0
  75. package/build/runtime-chunk-YS7K3AW3.js.gz +0 -0
  76. package/build/{runtime-chunk-YULW5JRE.js → runtime-chunk-ZASM3KKC.js} +1 -1
  77. package/build/runtime-chunk-ZASM3KKC.js.br +0 -0
  78. package/build/runtime-chunk-ZASM3KKC.js.gz +0 -0
  79. package/build/{runtime-chunk-OUXEWX5Z.js → runtime-chunk-ZLOMOV3N.js} +1 -1
  80. package/build/runtime-chunk-ZLOMOV3N.js.br +0 -0
  81. package/build/runtime-chunk-ZLOMOV3N.js.gz +0 -0
  82. package/build/{runtime-chunk-5JEZ42OM.js → runtime-chunk-ZM7N5SZG.js} +1 -1
  83. package/build/runtime-chunk-ZM7N5SZG.js.br +0 -0
  84. package/build/runtime-chunk-ZM7N5SZG.js.gz +0 -0
  85. package/build/{runtime-classicRuntime-U672GAGM.js → runtime-classicRuntime-A3DEJ3YH.js} +1 -1
  86. package/build/runtime-classicRuntime-A3DEJ3YH.js.br +0 -0
  87. package/build/runtime-classicRuntime-A3DEJ3YH.js.gz +0 -0
  88. package/build/{runtime-cloners-2AC7OZRC.js → runtime-cloners-UFF7A36S.js} +1 -1
  89. package/build/runtime-cloners-UFF7A36S.js.br +1 -0
  90. package/build/runtime-cloners-UFF7A36S.js.gz +0 -0
  91. package/build/{runtime-components-L63NUGAO.js → runtime-components-EESAIEPO.js} +1 -1
  92. package/build/runtime-components-EESAIEPO.js.br +0 -0
  93. package/build/runtime-components-EESAIEPO.js.gz +0 -0
  94. package/build/{runtime-createDestroy-QHHQ6LYS.js → runtime-createDestroy-WBIIVRMC.js} +1 -1
  95. package/build/runtime-createDestroy-WBIIVRMC.js.br +0 -0
  96. package/build/runtime-createDestroy-WBIIVRMC.js.gz +0 -0
  97. package/build/{runtime-dragDrop-YBSWK3ET.js → runtime-dragDrop-D45J5GQ5.js} +1 -1
  98. package/build/runtime-dragDrop-D45J5GQ5.js.br +0 -0
  99. package/build/runtime-dragDrop-D45J5GQ5.js.gz +0 -0
  100. package/build/{runtime-gameControls-DSJRSTW5.js → runtime-gameControls-GNLQ3FT6.js} +1 -1
  101. package/build/runtime-gameControls-GNLQ3FT6.js.br +0 -0
  102. package/build/runtime-gameControls-GNLQ3FT6.js.gz +0 -0
  103. package/build/{runtime-hair-V4RTCES2.js → runtime-hair-55OFZZFY.js} +1 -1
  104. package/build/runtime-hair-55OFZZFY.js.br +1 -0
  105. package/build/runtime-hair-55OFZZFY.js.gz +0 -0
  106. package/build/{runtime-mergeStaticGeometries-VXENKMD4.js → runtime-mergeStaticGeometries-NLUOSGZB.js} +1 -1
  107. package/build/runtime-mergeStaticGeometries-NLUOSGZB.js.br +0 -0
  108. package/build/runtime-mergeStaticGeometries-NLUOSGZB.js.gz +0 -0
  109. package/build/{runtime-miscActions-RPUPHHGJ.js → runtime-miscActions-5YY5ARQT.js} +1 -1
  110. package/build/runtime-miscActions-5YY5ARQT.js.br +0 -0
  111. package/build/runtime-miscActions-5YY5ARQT.js.gz +0 -0
  112. package/build/{runtime-mouseHover-HG6AHA2L.js → runtime-mouseHover-MTTJI6DT.js} +1 -1
  113. package/build/runtime-mouseHover-MTTJI6DT.js.br +0 -0
  114. package/build/runtime-mouseHover-MTTJI6DT.js.gz +0 -0
  115. package/build/{runtime-particles-ZHE2MC33.js → runtime-particles-VZVZJ35I.js} +1 -1
  116. package/build/runtime-particles-VZVZJ35I.js.br +0 -0
  117. package/build/runtime-particles-VZVZJ35I.js.gz +0 -0
  118. package/build/{runtime-paths-GN6E6ZYL.js → runtime-paths-4UDUBYZN.js} +1 -1
  119. package/build/runtime-paths-4UDUBYZN.js.br +0 -0
  120. package/build/runtime-paths-4UDUBYZN.js.gz +0 -0
  121. package/build/{runtime-resize-LACR4RFK.js → runtime-resize-QYCZUOPF.js} +1 -1
  122. package/build/runtime-resize-QYCZUOPF.js.br +0 -0
  123. package/build/runtime-resize-QYCZUOPF.js.gz +0 -0
  124. package/build/{runtime-sceneTransition-QLPFYHHY.js → runtime-sceneTransition-FC5TQNCH.js} +1 -1
  125. package/build/runtime-sceneTransition-FC5TQNCH.js.br +0 -0
  126. package/build/runtime-sceneTransition-FC5TQNCH.js.gz +0 -0
  127. package/build/{runtime-scroll-WZZBT2XR.js → runtime-scroll-VKMCDMAZ.js} +1 -1
  128. package/build/runtime-scroll-VKMCDMAZ.js.br +0 -0
  129. package/build/runtime-scroll-VKMCDMAZ.js.gz +0 -0
  130. package/build/runtime-shapeBlends-3QLNRN2O.js +1 -0
  131. package/build/runtime-shapeBlends-3QLNRN2O.js.br +4 -0
  132. package/build/runtime-shapeBlends-3QLNRN2O.js.gz +0 -0
  133. package/build/{runtime-text-UADJSRL4.js → runtime-text-IYCY3PFB.js} +1 -1
  134. package/build/runtime-text-IYCY3PFB.js.br +0 -0
  135. package/build/runtime-text-IYCY3PFB.js.gz +0 -0
  136. package/build/{runtime-textInputs-7U3TTJ4X.js → runtime-textInputs-LFDWIRLC.js} +1 -1
  137. package/build/runtime-textInputs-LFDWIRLC.js.br +0 -0
  138. package/build/runtime-textInputs-LFDWIRLC.js.gz +0 -0
  139. package/build/runtime-timeline-WNUPRRKW.js +1 -0
  140. package/build/runtime-timeline-WNUPRRKW.js.br +0 -0
  141. package/build/runtime-timeline-WNUPRRKW.js.gz +0 -0
  142. package/build/{runtime-tracking-MC74576T.js → runtime-tracking-HMTCBZ7J.js} +1 -1
  143. package/build/runtime-tracking-HMTCBZ7J.js.br +0 -0
  144. package/build/runtime-tracking-HMTCBZ7J.js.gz +0 -0
  145. package/build/{runtime-transitions-S22YS7E6.js → runtime-transitions-NPD3CNKU.js} +1 -1
  146. package/build/runtime-transitions-NPD3CNKU.js.br +0 -0
  147. package/build/runtime-transitions-NPD3CNKU.js.gz +0 -0
  148. package/build/{runtime-ui2d-EX3RBXPP.js → runtime-ui2d-NZTQW5UJ.js} +1 -1
  149. package/build/runtime-ui2d-NZTQW5UJ.js.br +0 -0
  150. package/build/runtime-ui2d-NZTQW5UJ.js.gz +0 -0
  151. package/build/{runtime-vectorShapes-J5Y3LMND.js → runtime-vectorShapes-26IDV3ZL.js} +1 -1
  152. package/build/runtime-vectorShapes-26IDV3ZL.js.br +0 -0
  153. package/build/runtime-vectorShapes-26IDV3ZL.js.gz +0 -0
  154. package/build/{runtime-webgpu-LDZ3N2D5.js → runtime-webgpu-CDBERG7X.js} +1 -1
  155. package/build/runtime-webgpu-CDBERG7X.js.br +0 -0
  156. package/build/runtime-webgpu-CDBERG7X.js.gz +0 -0
  157. package/build/runtime.cjs +5 -5
  158. package/build/runtime.js +1 -1
  159. package/build/runtime.js.br +0 -0
  160. package/build/runtime.js.gz +0 -0
  161. package/build/runtime.standalone.js +1 -1
  162. package/build/runtime.standalone.js.br +0 -0
  163. package/build/runtime.standalone.js.gz +0 -0
  164. package/build/runtime.standalone.webgl.js +1 -1
  165. package/build/runtime.standalone.webgl.js.br +0 -0
  166. package/build/runtime.standalone.webgl.js.gz +0 -0
  167. package/build/runtime.standalone.webgpu.js +1 -1
  168. package/build/runtime.standalone.webgpu.js.br +0 -0
  169. package/build/runtime.standalone.webgpu.js.gz +0 -0
  170. package/build/runtime.standalone.webgpu.micro.js +1 -1
  171. package/build/runtime.standalone.webgpu.micro.js.br +0 -0
  172. package/build/runtime.standalone.webgpu.micro.js.gz +0 -0
  173. package/build/runtime.standalone.webgpu.min.js +1 -1
  174. package/build/runtime.standalone.webgpu.min.js.br +0 -0
  175. package/build/runtime.standalone.webgpu.min.js.gz +0 -0
  176. package/build/snippets/hana-82e9eb82a79dead4/js-imports.js +204 -77
  177. package/package.json +1 -1
  178. package/build/runtime-chunk-23QXG35G.js.br +0 -0
  179. package/build/runtime-chunk-23QXG35G.js.gz +0 -0
  180. package/build/runtime-chunk-32KZP4YN.js.br +0 -0
  181. package/build/runtime-chunk-32KZP4YN.js.gz +0 -0
  182. package/build/runtime-chunk-3GRN37GY.js.br +0 -0
  183. package/build/runtime-chunk-3GRN37GY.js.gz +0 -0
  184. package/build/runtime-chunk-557KVSJL.js.br +0 -0
  185. package/build/runtime-chunk-557KVSJL.js.gz +0 -0
  186. package/build/runtime-chunk-5JEZ42OM.js.br +0 -0
  187. package/build/runtime-chunk-5JEZ42OM.js.gz +0 -0
  188. package/build/runtime-chunk-5RXW5MNJ.js.br +0 -0
  189. package/build/runtime-chunk-5RXW5MNJ.js.gz +0 -0
  190. package/build/runtime-chunk-AELTGHV2.js.gz +0 -0
  191. package/build/runtime-chunk-BMA5KYBS.js.br +0 -0
  192. package/build/runtime-chunk-BMA5KYBS.js.gz +0 -0
  193. package/build/runtime-chunk-CKT62HES.js.br +0 -0
  194. package/build/runtime-chunk-CKT62HES.js.gz +0 -0
  195. package/build/runtime-chunk-DHWGP6NU.js.br +0 -0
  196. package/build/runtime-chunk-DHWGP6NU.js.gz +0 -0
  197. package/build/runtime-chunk-DK66VKWP.js.br +0 -0
  198. package/build/runtime-chunk-DK66VKWP.js.gz +0 -0
  199. package/build/runtime-chunk-E3IEBR27.js.br +0 -0
  200. package/build/runtime-chunk-E3IEBR27.js.gz +0 -0
  201. package/build/runtime-chunk-EJJZJ5MV.js.br +0 -0
  202. package/build/runtime-chunk-EJJZJ5MV.js.gz +0 -0
  203. package/build/runtime-chunk-F3ZACLZW.js.br +0 -0
  204. package/build/runtime-chunk-F3ZACLZW.js.gz +0 -0
  205. package/build/runtime-chunk-GZ7C2GJM.js.br +0 -0
  206. package/build/runtime-chunk-GZ7C2GJM.js.gz +0 -0
  207. package/build/runtime-chunk-HK23JJVH.js.br +0 -0
  208. package/build/runtime-chunk-HK23JJVH.js.gz +0 -0
  209. package/build/runtime-chunk-HZ6FL5GH.js.br +0 -0
  210. package/build/runtime-chunk-HZ6FL5GH.js.gz +0 -0
  211. package/build/runtime-chunk-KE6HNYUL.js +0 -1
  212. package/build/runtime-chunk-KE6HNYUL.js.br +0 -0
  213. package/build/runtime-chunk-KE6HNYUL.js.gz +0 -0
  214. package/build/runtime-chunk-KNL33WN7.js +0 -1
  215. package/build/runtime-chunk-KNL33WN7.js.br +0 -0
  216. package/build/runtime-chunk-KNL33WN7.js.gz +0 -0
  217. package/build/runtime-chunk-OUXEWX5Z.js.br +0 -0
  218. package/build/runtime-chunk-OUXEWX5Z.js.gz +0 -0
  219. package/build/runtime-chunk-PDASWDVC.js.gz +0 -0
  220. package/build/runtime-chunk-RLYG5YBB.js.br +0 -1
  221. package/build/runtime-chunk-RLYG5YBB.js.gz +0 -0
  222. package/build/runtime-chunk-TAY7IXEZ.js.br +0 -0
  223. package/build/runtime-chunk-TAY7IXEZ.js.gz +0 -0
  224. package/build/runtime-chunk-UIM3XKIT.js.br +0 -0
  225. package/build/runtime-chunk-UIM3XKIT.js.gz +0 -0
  226. package/build/runtime-chunk-USGQ26QU.js.br +0 -0
  227. package/build/runtime-chunk-USGQ26QU.js.gz +0 -0
  228. package/build/runtime-chunk-YULW5JRE.js.br +0 -0
  229. package/build/runtime-chunk-YULW5JRE.js.gz +0 -0
  230. package/build/runtime-classicRuntime-U672GAGM.js.br +0 -0
  231. package/build/runtime-classicRuntime-U672GAGM.js.gz +0 -0
  232. package/build/runtime-cloners-2AC7OZRC.js.br +0 -0
  233. package/build/runtime-cloners-2AC7OZRC.js.gz +0 -0
  234. package/build/runtime-components-L63NUGAO.js.br +0 -0
  235. package/build/runtime-components-L63NUGAO.js.gz +0 -0
  236. package/build/runtime-createDestroy-QHHQ6LYS.js.br +0 -0
  237. package/build/runtime-createDestroy-QHHQ6LYS.js.gz +0 -0
  238. package/build/runtime-dragDrop-YBSWK3ET.js.br +0 -0
  239. package/build/runtime-dragDrop-YBSWK3ET.js.gz +0 -0
  240. package/build/runtime-gameControls-DSJRSTW5.js.br +0 -0
  241. package/build/runtime-gameControls-DSJRSTW5.js.gz +0 -0
  242. package/build/runtime-hair-V4RTCES2.js.br +0 -2
  243. package/build/runtime-hair-V4RTCES2.js.gz +0 -0
  244. package/build/runtime-mergeStaticGeometries-VXENKMD4.js.br +0 -0
  245. package/build/runtime-mergeStaticGeometries-VXENKMD4.js.gz +0 -0
  246. package/build/runtime-miscActions-RPUPHHGJ.js.br +0 -0
  247. package/build/runtime-miscActions-RPUPHHGJ.js.gz +0 -0
  248. package/build/runtime-mouseHover-HG6AHA2L.js.br +0 -0
  249. package/build/runtime-mouseHover-HG6AHA2L.js.gz +0 -0
  250. package/build/runtime-particles-ZHE2MC33.js.br +0 -0
  251. package/build/runtime-particles-ZHE2MC33.js.gz +0 -0
  252. package/build/runtime-paths-GN6E6ZYL.js.br +0 -0
  253. package/build/runtime-paths-GN6E6ZYL.js.gz +0 -0
  254. package/build/runtime-resize-LACR4RFK.js.br +0 -0
  255. package/build/runtime-resize-LACR4RFK.js.gz +0 -0
  256. package/build/runtime-sceneTransition-QLPFYHHY.js.br +0 -0
  257. package/build/runtime-sceneTransition-QLPFYHHY.js.gz +0 -0
  258. package/build/runtime-scroll-WZZBT2XR.js.br +0 -0
  259. package/build/runtime-scroll-WZZBT2XR.js.gz +0 -0
  260. package/build/runtime-shapeBlends-O6ATLCCA.js +0 -1
  261. package/build/runtime-shapeBlends-O6ATLCCA.js.br +0 -0
  262. package/build/runtime-shapeBlends-O6ATLCCA.js.gz +0 -0
  263. package/build/runtime-text-UADJSRL4.js.br +0 -0
  264. package/build/runtime-text-UADJSRL4.js.gz +0 -0
  265. package/build/runtime-textInputs-7U3TTJ4X.js.br +0 -0
  266. package/build/runtime-textInputs-7U3TTJ4X.js.gz +0 -0
  267. package/build/runtime-timeline-JXKHKUAC.js +0 -1
  268. package/build/runtime-timeline-JXKHKUAC.js.br +0 -0
  269. package/build/runtime-timeline-JXKHKUAC.js.gz +0 -0
  270. package/build/runtime-tracking-MC74576T.js.br +0 -0
  271. package/build/runtime-tracking-MC74576T.js.gz +0 -0
  272. package/build/runtime-transitions-S22YS7E6.js.br +0 -0
  273. package/build/runtime-transitions-S22YS7E6.js.gz +0 -0
  274. package/build/runtime-ui2d-EX3RBXPP.js.br +0 -0
  275. package/build/runtime-ui2d-EX3RBXPP.js.gz +0 -0
  276. package/build/runtime-vectorShapes-J5Y3LMND.js.br +0 -0
  277. package/build/runtime-vectorShapes-J5Y3LMND.js.gz +0 -0
  278. package/build/runtime-webgpu-LDZ3N2D5.js.br +0 -0
  279. package/build/runtime-webgpu-LDZ3N2D5.js.gz +0 -0
@@ -1 +1 @@
1
- import{a as e,b as t,c as a,d as r}from"./runtime-chunk-TAY7IXEZ.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-HK23JJVH.js";import{b as g}from"./runtime-chunk-CVUJ3GMH.js";import"./runtime-chunk-GZ7C2GJM.js";import"./runtime-chunk-PDASWDVC.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-M3ZKF7PK.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,C as N,Ca as B,Cc as L,D as I,Da as F,Db as D,Dc as U,E as O,Ea as G,Eb as q,Ec as W,F as H,Fa as j,Fb as K,Fc as $,G as X,Ga as Q,Gb as Z,Gc as Y,H as J,Ha as ee,Hb as te,Hc as ae,I as re,Ia as se,Ib as ie,Ic as ne,J as le,Ja as oe,Jb as ue,Jc as de,K as he,Ka as me,Kb as ce,Kc as pe,L as ge,La as fe,Lb as _e,Lc as ye,M as xe,Ma as ve,Mb as be,Mc as Te,N as we,Na as Se,Nb as Ve,Nc as Me,O as 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 Fe,R as De,Ra as Ue,Rc as Oe,S as Ge,Sa as qe,T as We,Ta as He,Tb as je,U as Ke,Ua as $e,Ub as Xe,V as Qe,Va as Ze,Vb as Ye,W as Je,Wa as et,Wb as tt,X as at,Xa as rt,Xb as st,Y as it,Ya as nt,Yb as lt,Z as ot,Za as ut,Zb as dt,_ as ht,_a as mt,_b as ct,aa as pt,ab as gt,ac as ft,b as _t,ba as yt,bb as xt,bc as vt,c as bt,ca as Tt,cb as wt,cc as St,d as Vt,da as Mt,db as Ct,dc as Rt,e as zt,ea as kt,eb as At,ec as Pt,f as Et,fa as Nt,fb as Bt,fc as Lt,g as It,ga as Ft,gb as Dt,gc as Ut,h as Ot,ha as Gt,hb as qt,hc as Wt,i as Ht,ia as jt,ib as Kt,ic as $t,j as Xt,ja as Qt,jb as Zt,jc as Yt,k as Jt,ka as ea,kb as ta,kc as aa,l as ra,la as sa,lb as ia,lc as na,m as la,ma as oa,mb as ua,mc as da,n as ha,na as ma,nb as ca,nc as pa,o as ga,oa as fa,ob as _a,oc as ya,p as xa,pa as va,pb as ba,pc as Ta,q as wa,qa as Sa,qb as Va,qc as Ma,r as Ca,ra as Ra,rb as za,rc as ka,s as Aa,sa as Pa,sc as Ea,t as Na,ta as Ba,tb as La,tc as Ia,u as Fa,ua as Da,ub as Ua,uc as Oa,v as Ga,va as qa,vb as Wa,vc as Ha,w as ja,wa as Ka,wb as $a,wc as Xa,x as Qa,xa as Za,xb as Ya,xc as Ja,y as er,ya as tr,yb as ar,yc as rr,z as sr,za as ir,zb as nr,zc as lr}from"./runtime-chunk-5H2Z5KYI.js";import{a as or}from"./runtime-chunk-GFTBNL2W.js";import{a as ur,b as dr,c as hr,d as mr,e as cr,f as pr,g as gr,h as fr,i as _r,j as yr}from"./runtime-chunk-23QXG35G.js";import{a as xr,b as vr,e as br,f as Tr}from"./runtime-chunk-BMA5KYBS.js";import{a as wr}from"./runtime-chunk-5JEZ42OM.js";import"./runtime-chunk-5RXW5MNJ.js";import{a as Sr,b as Vr,c as Mr}from"./runtime-chunk-HZ6FL5GH.js";import{a as Cr,b as Rr}from"./runtime-chunk-F3ZACLZW.js";import"./runtime-chunk-YULW5JRE.js";import"./runtime-chunk-TU4KDRKR.js";import"./runtime-chunk-UIM3XKIT.js";import{a as zr}from"./runtime-chunk-32KZP4YN.js";import"./runtime-chunk-RLYG5YBB.js";import"./runtime-chunk-E3IEBR27.js";import"./runtime-chunk-EJJZJ5MV.js";import"./runtime-chunk-USGQ26QU.js";import"./runtime-chunk-AELTGHV2.js";import{L as kr,O as Ar,Q as Pr,U as Er,V as Nr,W as Br,Y as Lr,Z as Ir,_ as Fr,h as Dr,k as Ur,l as Or,m as Gr}from"./runtime-chunk-DK66VKWP.js";import"./runtime-chunk-4YV3EXSU.js";import"./runtime-chunk-NSD7DU3P.js";import"./runtime-chunk-CKT62HES.js";import"./runtime-chunk-2PT2WH66.js";import"./runtime-chunk-4KZXQGUQ.js";import"./runtime-chunk-U4QOT2PX.js";import"./runtime-chunk-TZCHGFVF.js";import{W as qr,ea as Wr,fa as Hr,qa as jr,ra as Kr,sa as $r,ta as Xr,x as Qr}from"./runtime-chunk-VPEJ5BFD.js";import{e as Zr,f as Yr}from"./runtime-chunk-EOV2DL2V.js";import{b as Jr}from"./runtime-chunk-Y3BMDVJ7.js";import{Aa as es,Ba as ts,Bc as as,Bd as rs,Be as ss,Cc as is,Cd as ns,D as ls,Dc as os,Ec as us,Fc as ds,Gc as hs,Hc as ms,Ib as cs,Ic as ps,Ja as gs,Jb as fs,Jc as _s,Kc as ys,Ma as xs,Me as vs,Oa as bs,Oc as Ts,Pc as ws,Tc as Ss,Y as Vs,Yc as Ms,Zc as Cs,aa as Rs,ca as zs,da as ks,dd as As,g as Ps,id as Es,j as Ns,k as Bs,ka as Ls,l as Is,la as Fs,ld as Ds,m as Us,ma as Os,mc as Gs,n as qs,na as Ws,nd as Hs,o as js,p as Ks,pd as $s,q as Xs,qa as Qs,r as Zs,rd as Ys,sa as Js,t as ei,ua as ti,ve as ai,yd as ri,ye as si,z as ii,ze as ni}from"./runtime-chunk-VGN7YHB7.js";import"./runtime-chunk-ML3Z74BL.js";var li=[[.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]],oi=lr(new Ss(1,1,1)).setGroup(st),ui=lr(.1).setGroup(st),di=lr(2e3).setGroup(st),hi=lr(0).setGroup(st),mi=lr(new ds(.005,.01,0)).setGroup(st),ci=re(([e,t,a,r])=>{let s=r.x,i=r.y,n=a.y.sub(r.z),l=s.mul(i.mul(n).negate().clamp(-60,60).exp()),o=i.mul(e.y).clamp(-60,60).toVar(),u=St(o.greaterThanEqual(0),ir(1),ir(-1)).mul(o.abs().max(1e-4));return l.mul(t).mul(ir(1).sub(u.negate().exp())).div(u).max(0).negate().exp().oneMinus()}),pi=re(()=>{let e=Ve.sub(yt).toVar(),t=e.length().max(1e-6);return ci(e,t,yt,mi)}),gi=(()=>{let e=ir(1).sub(da(.5,hi)).add(da(1.5,hi)),t=da(.5,hi),a=ir(1).sub(ir(1).sub(Xe(ui,di).mul(e)).mul(ir(1).sub(pi().mul(t))));return P(oi,a)})();function fi(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=gi);oi.value.copy(a.color),ui.value=a.near,di.value=a.far,hi.value=jr.getModeIndex({mode:e.fogMode}),mi.value.set(e.fogDensity??jr.getDensity({}),e.fogHeightFalloff??jr.getHeightFalloff({}),e.fogHeightBase??jr.getHeightBase({}))}else if(null===t)for(let e of r)e?.fogNode&&(e.fogNode=null)}var _i=e=>e,yi=e=>e,xi=e=>e,vi=(e,t,a)=>R(e.add(.5).mul(t)).add(.5).div(a),bi=new Ga,Ti=new Ss,wi=class{constructor(){this._gBuffer=null,this._aoBuffer=null,this._hbaoMaterial=null,this._resolveMaterial=null,this._boundBlueNoise=null,this._frameIndex=0,this._projectionMatrixInverse=lr(new Ts),this._isOrtho=lr(0),this._resolution=lr(new os(1,1)),this._fullResolution=lr(new os(1,1)),this._radiusOfInfluence=lr(128),this._radiusInScreenSpace=lr(1),this._exponent=lr(1),this._aoColor=lr(new Ss(0,0,0)),this._bias=lr(.5),this._frame=lr(0),this._fogEnabled=lr(0),this._fogNear=lr(1),this._fogFar=lr(1e3),this._fogMode=lr(0),this._fogHeightParams=lr(new ds(.005,.01,0)),this._cameraWorldMatrix=lr(new Ts);let e=new bt;e.name="SplineHBAO.gbuffer",e.side=Is,e.fragmentNode=ne(Wa.mul(tr),1),e.lights=!1,e.blending=Us,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=Ea(this._gBuffer.depthTexture),r=Ea(this._gBuffer.texture),s=Ea(t),i=this._projectionMatrixInverse,n=this._isOrtho,l=this._resolution,o=this._fullResolution,u=this._radiusOfInfluence,d=this._radiusInScreenSpace,h=this._exponent,m=this._aoColor,c=this._bias,p=this._frame,g=this._fogEnabled,f=this._fogNear,_=this._fogFar,y=this._fogMode,x=this._fogHeightParams,v=this._cameraWorldMatrix,b=!0===e.reversedDepthBuffer,T=e=>a.sample(e),w=(e,t)=>ee(e,t,i),S=e=>w(e,T(e)),V=re(()=>{let e=U().toVar(),t=l,a=o,i=R(e.mul(t)).toVar(),V=a.div(t).toVar(),M=vi(i,V,a).toVar(),C=T(M).toVar(),z=w(M,C).toVar(),k=Ya(r.sample(M).xyz).toVar(),A=At(d.div(qt(z.z.negate(),ir(1),n)),ir(5)).toVar(),P=$e(Re(ft.xy.x).bitAnd(Re(127)),Re(ft.xy.y).bitAnd(Re(127))),E=s.load(P).xyz.x,N=B(E.add(ir(.61803398875).mul(p))).mul(6.283),L=oa(N).toVar(),I=Wt(N).toVar(),F=A.div(5).toVar(),D=ir(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]=li[4*e+r],l=Y(L.mul(s).sub(I.mul(n)),I.mul(s).add(L.mul(n))),o=yi(i.add(dt(l.mul(t)))).toVar(),d=xi(S(vi(o,V,a))).toVar();t.addAssign(F);let h=xi(d.sub(z)).toVar(),m=_i(h.dot(h)).toVar(),p=na(m),g=_i(k.dot(h)).div(At(p,ir(1e-4))),f=m.mul(ir(-1).div(u.mul(u))).add(1);D.addAssign(Ft(g.sub(c),0,1).mul(Ft(f,0,1)))}}let O=ir(1).div(ir(1).sub(c));D.mulAssign(O.div(16));let G=Ft(ir(1).sub(D.mul(2)),0,1),q=ze(G,h).toVar(),W=b?C.lessThanEqual(0):C.greaterThanEqual(1);q.assign(W.select(ir(1),q));let H=ae(qt(m,ae(1),q)).toVar(),j=$t(f,_,z.z.negate()),K=v.mul(ne(z,1)).xyz,$=v.mul(ne(0,0,0,1)).xyz,X=K.sub($).toVar(),Q=ci(X,X.length().max(1e-6),$,x),Z=y,J=ir(1).sub(da(.5,Z)).add(da(1.5,Z)),ee=da(.5,Z),te=ir(1).sub(ir(1).sub(j.mul(J)).mul(ir(1).sub(Q.mul(ee)))).mul(g);return H.assign(qt(H,ae(1),te)),ne(H,1)}),M=new bt;return M.name="SplineHBAO.hbao",M.colorNode=V(),M.depthTest=!1,M.depthWrite=!1,M.blending=Us,M.needsUpdate=!0,M}_buildResolveMaterial(){let e=Ea(this._aoBuffer.texture),t=Ea(this._gBuffer.depthTexture),a=this._resolution,r=this._fullResolution,s=re(()=>{let s=U().toVar(),i=a,n=r,l=Y(ir(1).div(i.x),ir(1).div(i.y)).toVar(),o=s.sub(l.mul(.5)).toVar(),u=o.add(Y(l.x,0)).toVar(),d=o.add(Y(0,l.y)).toVar(),h=o.add(l).toVar(),m=t.sample(s).toVar(),c=n.div(i).toVar(),p=e=>t.sample(vi(e,c,n)),g=R(o.mul(i)).toVar(),f=m.sub(p(g)).abs().toVar(),_=m.sub(p(g.add(Y(1,0)))).abs().toVar(),y=m.sub(p(g.add(Y(0,1)))).abs().toVar(),x=m.sub(p(g.add(Y(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 bt;return i.name="SplineHBAO.resolve",i.colorNode=s(),i.depthTest=!1,i.depthWrite=!1,i.blending=Us,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 ys(n,l,{type:ts,depthTexture:new ns(n,l),minFilter:Qs,magFilter:Qs}));if(this._gBuffer=c.target,m=m||c.changed,o){let e=this._ensureTarget(this._aoBuffer,d,h,()=>new ys(d,h,{minFilter:Qs,magFilter:Qs,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(Ti),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,bi.material=this._hbaoMaterial,bi.name="SplineHBAO.hbao",y.setRenderTarget(o?this._aoBuffer:i),bi.render(e),o&&(bi.material=this._resolveMaterial,bi.name="SplineHBAO.resolve",y.setRenderTarget(i),bi.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}},Si={texture:null,version:0,rotation:new ws,quality:"full"},Vi=new Set;function Mi(e){let t=Si.texture,a=e.lights&&"physical"===e.category&&null!==t&&("full"===Si.quality||!1!==e.envReflectiveInLow?.()),r=e.envNode instanceof zi;a?(!r||e.envNode.sourceTexture!==t)&&(e.envNode=new zi(t),e.needsUpdate=!0):r&&(e.envNode=null,e.needsUpdate=!0)}var Ci=new WeakMap;function Ri(e,t){let a=null;return{getUV:()=>{if(null===a){let r=be.negate().reflect(t);r=Ie(e).mix(r,t),r=r.normalize(),a=r.transformDirection(Nt)}return a},getTextureLevel:()=>e}}var zi=class extends ha{constructor(e){super(null),this.sourceTexture=e}static get type(){return"SplineEnvironmentNode"}setup(e){let t=function(e){let t=Ci.get(e);return void 0===t&&(t=te(e),Ci.set(e,t)),t}(this.sourceTexture),a=e.context,r=t.context(Ri(lt,Wa)).mul(Ct);a.radiance.addAssign(r);let s=t.context({getUV:()=>$a,getTextureLevel:()=>ir(1)}).mul(Math.PI).mul(Ct);a.iblIrradiance.addAssign(s);let i=a.lightingModel?.clearcoatRadiance;if(i){let e=t.context(Ri(Qt,jt)).mul(Ct);i.addAssign(e)}return null}},ki=class extends ai{},Ai=class extends C{static get type(){return"SplineSkyHemisphereLightNode"}setup(e){return e.material?.envNode instanceof zi?null:super.setup(e)}},Pi=e=>e,Ei=e=>e,Ni=e=>e,Bi=e=>e,Li=.25,Ii=256/(2*Math.PI),Fi=(e,t,a,r,s)=>{let i=ae(0).toVar();return le(r.lessThan(.5),()=>{i.assign(e.sample(t).level(s).rgb)}).Else(()=>{let r=ae(0).toVar(),n=ir(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=Ni(Bi(e.sample(Y(Pi(t.x).add(a.mul(u)),Pi(t.y).add(a.mul(d)))).level(s)).rgb);r.addAssign(m.mul(h)),n.addAssign(ir(h))}i.assign(r.div(n))}),i},Di=(e,t,a,r)=>{let s=ne(t.mul(2).sub(1),ir(1).sub(a).mul(2).sub(1),r,1),i=e.mul(s).toVar();return i.xyz.div(i.w)},Ui=(e,t,a,r)=>{let s=w.reflectionEnvEnabled,i=w.reflectionMissColor,n=a.greaterThan(.05),l=r??St(n,ir(.6),ir(1)),o=We(t.z,t.x).div(2*Math.PI).add(.5),u=Ge(Ft(t.y,ir(-1),ir(1))).div(Math.PI).add(.5),d=Dt(mt(a.mul(l).mul(Li*Ii).add(1)),ir(8)),h=e.sample(Y(o,u)).level(d).rgb;return St(s.greaterThan(.5),h,i)},Oi=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=St(y,ae(0,0,-1),Ya(a.originView)).toVar(),v=a.normalV.toVar(),b=Ye(x,v).toVar(),T=Ft(i.mul(.1),ir(0),ir(1)).toVar(),S=w.resolution,V=T.greaterThan(.05),M=e.singleRay?ir(1):St(V,ir(.6),ir(1)),C=(e,t,s,i)=>{let l=Ya(Xa(e,r.worldMatrix)).toVar(),h=ir(1).sub($t(ir(.85),ir(.99),e.z)).toVar(),x=a.originView.toVar(),b=x.z.negate().max(r.near).toVar(),w=ir(b.mul(10)).toVar();le(e.z.greaterThan(1e-5),()=>{let t=r.near.negate().sub(x.z).div(e.z);w.assign(Dt(w,t.mul(.95).max(1e-4)))});let V,C=x.add(e.mul(w)).toVar(),R=ae(a.screenUv,a.fragWindowZ).toVar(),z=(e=>{let t=r.projectionMatrix.mul(ne(e,1)).toVar(),a=t.xyz.div(t.w);return ae(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5),a.z)})(C).toVar(),k=T.mul(S.y).mul(.075).toVar();if(i){let e=k.mul(g.y.div(S.y)).toVar(),t=Dt(ir(.8),ir(12).div(e.max(.001))).toVar();i.assign(e.mul(t)),V=ir(1).sub(t.mul(t)).max(0).sqrt().toVar()}let A=z.sub(R).toVar(),P=At(A.xy.length(),ir(1e-5)).toVar(),E=ir(0).toVar(),N=ae(0).toVar(),B=()=>{let e=f.sub(1).toVar(),a=Re(1).toVar(),r=Re(0).toVar(),s=(e,t)=>Dt(e,t),i=A,l=i.div(i.z).toVar(),o=ae(R).toVar(),u=Y(St(i.x.greaterThanEqual(0),ir(1),ir(-1)),St(i.y.greaterThanEqual(0),ir(1),ir(-1))).toVar(),d=u.mul(1e-5).toVar();u.assign(Ft(u,Y(0),Y(1)));let h=e=>Y(Oa(m,e)),c=(e,t)=>e.mul(t).floor(),p=(e,t,a)=>{let r=Y(1).div(a),s=t.div(a).add(r.mul(u)).sub(e.xy).div(i.xy).toVar(),n=e.add(i.mul(Dt(s.x,s.y))).toVar();return n.xy.addAssign(St(s.x.lessThan(s.y),Y(d.x,0),Y(0,d.y))),n},y=h(a),x=c(o.xy,y);o.assign(p(o,x,y)),he(256,()=>{le(a.lessThan(Re(0)).or(r.greaterThanEqual(t)),()=>{X()});let u=h(a).toVar(),d=c(o.xy,u).toVar(),m=_($e(Re(d.x),Re(d.y)),a).toVar(),g=ae(o).toVar();le(i.z.greaterThan(0),()=>{let t=m.sub(o.z).toVar();le(t.greaterThan(0),()=>{g.assign(o.add(l.mul(t)))});let r=c(g.xy,u).toVar();le(((e,t)=>Re(e.x).notEqual(Re(t.x)).or(Re(e.y).notEqual(Re(t.y))))(d,r),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Re(2))))}).Else(()=>{le(a.equal(Re(1)).and(t.abs().greaterThan(n)),()=>{g.assign(p(o,d,u)),a.assign(Re(2))})})}).Else(()=>{le(o.z.lessThan(m),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Re(2))))})}),o.assign(g),a.subAssign(Re(1)),r.addAssign(Re(1))});let v=o.x.greaterThan(0).and(o.x.lessThan(1)).and(o.y.greaterThan(0)).and(o.y.lessThan(1)).and(o.z.greaterThan(0)).and(o.z.lessThan(1));le(a.lessThan(Re(0)).and(r.lessThan(t)).and(v),()=>{E.assign(1),N.assign(o);let e=o.xy.sub(R.xy).length().div(P).clamp(0,1),t=e.sub(ir(2).div(g.y).div(P)).max(0),a=ae(R.add(A.mul(t))).toVar(),r=ae(R.add(A.mul(e))).toVar(),s=ae(r).toVar();for(let e=0;e<4;e++){s.assign(qt(a,r,.5));let e=Pi(_($e(Ei(s.xy).mul(g)),Re(0)));le(s.z.sub(e).greaterThan(0),()=>{r.assign(s)}).Else(()=>{a.assign(s)})}N.assign(s)})},L=()=>{let e=At(o,ir(1e-4)),a=ir(e).toVar(),r=ae(R).toVar(),s=ae(R).toVar(),i=ir(-1).toVar();he(256,({i:l})=>{le(l.greaterThanEqual(t),()=>{X()});let o=ir(l).mul(a).div(P).toVar();le(o.greaterThan(1),()=>{X()}),s.assign(A.mul(o).add(R));let u=s.x.lessThan(0).or(s.x.greaterThan(1)).or(s.y.lessThan(0)).or(s.y.greaterThan(1)).or(s.z.lessThan(0)).or(s.z.greaterThan(1));le(u,()=>{X()});let d=_($e(s.xy.mul(g)),Re(0)).toVar(),h=s.z.sub(d).toVar();le(i.lessThanEqual(0).and(h.greaterThan(0)),()=>{let e=ae(r).toVar(),t=ae(s).toVar(),a=ae(s).toVar(),i=ir(h).toVar();for(let r=0;r<4;r++){a.assign(qt(e,t,.5));let r=Pi(_($e(Ei(a.xy).mul(g)),Re(0)));i.assign(a.z.sub(r)),le(i.greaterThan(0),()=>{t.assign(a)}).Else(()=>{e.assign(a)})}le(i.abs().lessThan(n),()=>{E.assign(1),N.assign(a),X()})}),i.assign(h),r.assign(s),a.addAssign(e.div(2))})};le(h.greaterThan(0).and(p.not()),()=>{"number"==typeof u?1===u?B():L():le(u.greaterThan(.5),()=>{B()}).Else(()=>{L()})});let I=Ui(c,l,T,V).toVar(),F=ae(I).toVar();return le(E.greaterThan(.5),()=>{let t=N.xy.sub(R.xy).length().div(P).clamp(0,1).toVar(),a=x.z.negate().max(1e-4).toVar(),n=C.z.negate().max(1e-4).toVar(),l=qt(ir(1).div(a),ir(1).div(n),t).toVar(),o=qt(x.div(a),C.div(n),t).div(l),u=qt(x,C,t),m=St(y,u,o).toVar(),c=m.sub(x).length().toVar(),p=r.projectionMatrix.element(1).y.mul(S.y).mul(.5),w=St(y,ir(1),m.z.abs().max(1e-4)),V=T.mul(M).mul(Li).mul(c).mul(p).div(w),z=At(V,k).toVar(),A=z.mul(g.y.div(S.y)).toVar(),E=A.toVar(),B=z.toVar();if(i){let e=Dt(ir(.8),ir(12).div(A.max(.001))).toVar();i.assign(A.mul(e)),E.assign(A.mul(ir(1).sub(e.mul(e)).max(0).sqrt())),B.assign(E.mul(S.y.div(g.y)))}let L=ir(f.sub(1)),D=Dt(mt(E.add(1)),L),U=s?Fi(d,N.xy,B.mul(.75).div(S.y),E.mul(.75),D.sub(1).max(0).floor()).toVar():d.sample(N.xy).level(D).rgb.toVar(),O=e=>$t(ir(0),ir(.07),e).mul($t(ir(0),ir(.07),ir(1).sub(e))),G=O(N.x).mul(O(N.y)),q=N.xy.mul(g),W=_($e(q),Re(0)),H=Di(r.projectionMatrixInverse,N.x,N.y,W).toVar(),j=Da(H.sub(x),v),K=$t(b.mul(-.05),b.mul(-.005),j),$=ir(1).div(g.x),X=ir(1).div(g.y),Q=_($e(q.sub(Y(1,0))),Re(0)),Z=_($e(q.add(Y(1,0))),Re(0)),J=_($e(q.sub(Y(0,1))),Re(0)),ee=_($e(q.add(Y(0,1))),Re(0)),te=Di(r.projectionMatrixInverse,N.x.sub($),N.y,Q),ae=Di(r.projectionMatrixInverse,N.x.add($),N.y,Z),re=Di(r.projectionMatrixInverse,N.x,N.y.sub(X),J),se=Di(r.projectionMatrixInverse,N.x,N.y.add(X),ee),ie=Ya(ma(ae.sub(te),se.sub(re))).toVar(),ne=St(ie.z.lessThan(0),ie.negate(),ie),le=$t(ir(.02),ir(.12),Da(ne,e).negate()),oe=h.mul(G).mul(K).mul(le);F.assign(qt(I,U,oe))}),F};if(e.singleRay)return C(b,l,!0,e.singleRay.footprintOut).toVar();let R=e.noisePixel,z=B(ir(52.9829189).mul(B(R.x.mul(.06711056).add(R.y.mul(.00583715))))).mul(2*Math.PI).toVar(),k=St(b.y.abs().greaterThan(.99),ae(1,0,0),ae(0,1,0)),A=Ya(ma(k,b)).toVar(),P=ma(b,A).toVar(),E=(e,t=4)=>{let a=T.mul(Li*Math.sqrt((e+.5)/t)),r=z.add(2.399963229728653*e);return Ya(b.mul(oa(a)).add(A.mul(oa(r)).add(P.mul(Wt(r))).mul(Wt(a)))).toVar()},N=V.and(p.not()),L=St(N,E(0),b).toVar(),I=ae(0).toVar();I.addAssign(C(L,l,!0));let F=ir(1).toVar();return le(N,()=>{I.addAssign(C(E(2),l,!1)),F.assign(2),le(T.greaterThan(.35),()=>{I.addAssign(C(E(1),l,!1)),I.addAssign(C(E(3),l,!1)),F.assign(4)})}),I.div(F).toVar()},Gi=new os,qi=class extends as{constructor(e){super(),this.postprocessingState=$r.defaultData,this.sceneTransitionPass={uniforms:{mixRatio:lr(0),uDPR:{value:1},uResolution:{value:new os}}},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 Hs,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 Hs(e,128,128);t.wrapS=Ls,t.wrapT=Ls,t.minFilter=Ws,t.magFilter=Ws,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=qi.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=qi._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(Gi);let e=Math.max(1,Math.round(Gi.x)),t=Math.max(1,Math.round(Gi.y));null===this._rt?this._rt=new ys(e,t,{depthBuffer:!0}):(this._rt.width!==e||this._rt.height!==t)&&(this._rt.dispose(),this._rt=new ys(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(Gi),e.beginJitter(t,Gi.x,Gi.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 _s?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 _s?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()}},Wi=qi;Wi.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 Hi=(()=>{try{return"1"===new URLSearchParams(window.location.search).get("dbgdestroys")}catch{return!1}})(),ji=[],Ki=6,$i=()=>-1,Xi=!1,Qi=null;function Zi(e,t,a){ji.push({t:Math.round(performance.now()),frame:$i(),kind:e,label:t||"(unlabeled)",size:a,stack:((new Error).stack??"").split("\n").slice(2,9).join("\n")}),ji.length>32&&ji.shift()}var Yi=(e,t)=>({start:Re(0),end:Re(t),type:"int",condition:"<",name:e}),Ji=Ft;function en(e,t){let a=new ys(e,t,{depthBuffer:!1,type:es,format:bs});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ws,a.texture.magFilter=Ws,a}var tn=null;function an(){return null===tn&&((tn=en(64,8)).texture.name="SplinePCSSPyramidAtlas"),tn.texture}function rn(e,t,a,r,s,i){let n=new bt,l=Ea(t),o=re(()=>{let e=ft,t=0!==i?e.x.sub(i):e.x,n=Re(t).mul(a).toVar(),o=Re(e.y).mul(a).toVar(),u=ir(1e9).toVar(),d=ir(-1e9).toVar();return he(Yi("ly",a),Yi("lx",a),e=>{let{lx:t,ly:a}=e,i=Ji(n.add(t),Re(0),Re(r)),h=Ji(o.add(a),Re(0),Re(r)),m=l.load($e(i,h));u.assign(Dt(u,m.x)),d.assign(At(d,s?m.y:m.x))}),ne(u,d,0,1)})();return n.fragmentNode=o,n.name=e,n.lights=!1,n.blending=Us,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,n}var sn=new Set;function nn(e){let t=e;return t.__spePcssPyramid||(t.__spePcssPyramid={fresh:!1,slot:-1,passKey:"",mid:null,small:null,toMid:null,toSmall:null},sn.add(new WeakRef(t.__spePcssPyramid))),t.__spePcssPyramid}var ln=new Array(8).fill(null);function on(e){return!0===e.__spePcssPyramid?.fresh}function un(e){return e.__spePcssPyramid?.slot??-1}var dn=!1;var hn=new ds,mn=e=>e,cn=e=>e,pn=e=>e,gn=!0,fn=!0,_n=!0,yn=!0;try{let e=new URLSearchParams(window.location.search),t=e.get("dbgpcss");"classic"===t||"0"===t?(gn=!1,fn=!1,_n=!1,yn=!1):(gn="0"!==e.get("dbgpcsssplit"),fn="0"!==e.get("dbgpcsshw"),_n="0"!==e.get("dbgpcsshiz"),yn="0"!==e.get("dbgshadowmask"))}catch{}var xn=!1,vn=()=>fn&&xn,bn=()=>_n&&xn,Tn=()=>yn&&xn,wn=()=>bn(),Sn=()=>Tn(),Vn=[[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]],Mn=16;function Cn(e){let t=e;return t.__spePcssKnobs||(t.__spePcssKnobs={mapSize:lr(2048),radius:lr(1),penumbraSize:lr(.5),depthEps:lr(1e-4),penumbraFrameScale:lr(1),penumbraFrameOffset:lr(0),pyramidEnabled:lr(0),pyramidSlot:lr(0),maskChannel:lr(new _s(0,0,0,0)),planeNormalMat:lr((new hs).set(0,0,0,0,0,0,0,0,0))}),t.__spePcssKnobs}function Rn(e,t){Cn(e).maskChannel.value.set(0===t?1:0,1===t?1:0,2===t?1:0,3===t?1:0)}function zn(e,t,a){let r=e,s=Cn(e);s.mapSize.value=r.mapSize?.x??2048,s.radius.value=r.radius??1,s.penumbraSize.value=t??r.penumbraSize??.5,r.camera?.isOrthographicCamera&&r.matrix?s.planeNormalMat.value.getNormalMatrix(r.matrix):s.planeNormalMat.value.set(0,0,0,0,0,0,0,0,0);let i="number"==typeof r.camera?.far&&"number"==typeof r.camera?.near?r.camera.far-r.camera.near:0;s.depthEps.value=i>.001?1.25/i:1e-4;let n=e.__speRangeEnvelope,l=n?n.far-n.near:0;n&&l>.001&&i>.001&&r.camera?(s.penumbraFrameScale.value=i/l,s.penumbraFrameOffset.value=(r.camera.near-n.near)/l):(s.penumbraFrameScale.value=1,s.penumbraFrameOffset.value=0);let o=0;if(a&&a.fresh&&a.slot>=0&&bn()){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 kn(e,t){let a=e.planeNormalMat.mul(t).toVar(),r=a.z,s=Ut(r).add(da(Ae(r),ir(0))).mul(At(Ae(r),ir(1e-4)));return Y(a.x.negate().div(s),a.y.div(s)).toVar()}var An=(e,t)=>Ft(Da(e,t),ir(-.05),ir(.05));function Pn(e,t,a,r,s,i,n){let l=vn()?Math.max(4,Mn>>1):Mn,o=gn?Math.max(4,Mn>>1):Mn,u=vn(),d=Cn(t),h=d.mapSize,m=Y(h,h),c=d.radius,p=d.penumbraSize,g=Ea(e),f=e=>g.load($e(Ft(e,Y(0),Y(1)).mul(m))).x,_=ir(1).div(m.x).toVar(),y=ir(80).div(_.mul(1024)).toVar(),x=d.depthEps,v=kn(d,n),b=()=>{let t=ir(0).toVar(),n=ir(0).toVar();for(let e=0;e<o;e++){let i=cn(Q(Re(e),Re(o),s)).mul(_).mul(y),l=f(cn(a.add(i))).toVar();le(l.lessThan(r.add(An(v,i)).add(x)),()=>{t.addAssign(l),n.addAssign(1)})}let h=ir(0).toVar();le(n.greaterThan(0),()=>{let e=t.div(n).toVar(),a=d.penumbraFrameScale,s=d.penumbraFrameOffset,i=r.sub(e).mul(a).div(e.mul(a).add(s)).toVar();h.assign(Ft(i.mul(i).mul(200).mul(p),ir(0),ir(1)))});let m=ir(0).toVar();for(let t=0;t<l;t++){let i=cn(Q(Re(t),Re(l),s)).mul(_),n=cn(i.mul(c.mul(2)).add(i.mul(h.mul(y)))),o=mn(r.add(An(v,n)));u?m.addAssign(mn(Ea(e,cn(a.add(n))).compare(o))):m.addAssign(da(o,f(cn(a.add(n)))))}i.assign(m.div(l))};if(bn()){let e=Ea(an()),t=d.pyramidEnabled,s=d.pyramidSlot,n=ir(8),l=ir(0).toVar();le(t.greaterThan(.5),()=>{let t=Ft(a,Y(0),Y(1)),i=t.x.mul(n).toVar(),o=t.y.mul(n).toVar(),u=s.mul(n),d=ir(1e9).toVar(),h=ir(-1e9).toVar();for(let t=-1;t<=1;t++)for(let a=-1;a<=1;a++){let r=Ft(i.add(ir(a)),ir(0),n.sub(1)),s=Ft(o.add(ir(t)),ir(0),n.sub(1)),l=cn(Y(r.add(u),s)),m=e.load($e(l));d.assign(Dt(d,mn(m.x))),h.assign(At(h,mn(m.y)))}let m=_.mul(c.mul(2).add(y)),p=Dt(et(v).mul(m),ir(.05)).toVar();le(d.greaterThanEqual(r.add(x).add(p)),()=>{l.assign(1)}).ElseIf(h.lessThan(r.sub(p)),()=>{l.assign(2)})}),le(l.equal(1),()=>{i.assign(1)}).ElseIf(l.equal(2),()=>{i.assign(0)}).Else(b)}else b()}var En=re(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=Cn(r),i=a.xy.toVar(),n=a.z.toVar(),l=$a.toVar(),o=w.pcssHalton,u=j(ft.xy.add(o)).mul(6.28318530718).toVar(),d=ir(1).toVar();if(Tn()){let e=s.maskChannel,a=w.shadowMaskEnabled,o=w.shadowMaskGBuffer,h=w.shadowMaskTexture,m=ir(0).toVar(),c=ir(1).toVar();le(a.greaterThan(.5).and(Da(e,ne(1,1,1,1)).greaterThan(.5)),()=>{let t=vt,a=w.shadowMaskResolution,r=w.shadowMaskFullResolution,s=_e.z,i=t.mul(a).sub(Y(.5,.5)).toVar(),n=R(i).toVar(),l=i.sub(n).toVar(),u=At(Ae(s).mul(.02),ir(.05)),d=ir(0).toVar(),p=ir(0).toVar();for(let t=0;t<=1;t++)for(let i=0;i<=1;i++){let m=cn(Ft(n.add(Y(i,t)),Y(0,0),a.sub(Y(1,1)))),c=cn(m.add(Y(.5,.5)).div(a)),g=cn(R(c.mul(r)).add(Y(.5,.5)).div(r)),f=mn(o.sample(g).w),_=mn(Da(h.sample(c),e)),y=mn(0===i?ir(1).sub(l.x):mn(l.x)),x=mn(0===t?ir(1).sub(l.y):mn(l.y)),v=mn(da(Ae(f.sub(s)),u)),b=mn(y.mul(x).mul(v)).toVar();d.addAssign(b),p.addAssign(_.mul(b))}le(d.greaterThan(.001),()=>{m.assign(1),c.assign(p.div(d))})}),le(m.greaterThan(.5),()=>{d.assign(c)}).Else(()=>{Pn(t,r,i,n,u,d,l)})}else Pn(t,r,i,n,u,d,l);return d}),Nn=re(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=Cn(r),i=a.xy.toVar(),n=a.z.toVar(),l=kn(s,$a.toVar()),o=s.mapSize,u=s.radius.mul(ir(1).div(o)).toVar(),d=j(ft.xy).mul(6.28318530718).toVar(),h=ir(0).toVar();for(let e=0;e<5;e++){let a=cn(Q(Re(e),Re(5),d)).mul(u).toVar();h.addAssign(mn(Ea(t,cn(i.add(a))).compare(n.add(An(l,a)))))}return h.mul(.2)}),Bn=re(e=>{let{depthTexture:t,bd3D:a,dp:r,shadow:s}=e,i=Mn,n=Cn(s),l=n.mapSize,o=n.radius,u=ir(1).div(l).toVar(),d=w.pcssHalton,h=j(ft.xy.add(d)).mul(6.28318530718).toVar(),m=o.add(5).toVar(),c=ir(0).toVar();for(let e=0;e<i;e++){let s=cn(Q(Re(e),Re(i),h)).mul(u).toVar(),n=pn(ae(s.x,s.y,mn(s.x).negate()).mul(m)),l=pn(a.add(n));c.addAssign(mn(fa(t,l).compare(r)))}return c.div(i)});function Ln(e,t){let a=t;return a.isPointLight?(T.pcssHookServes++,qn):a.isSpotLight||a.isDirectionalLight?(T.pcssHookServes++,Gn):null}var In=lr(1);function Fn(e){In.value=e?1:0}var Dn=(e,t)=>e(t),Un=["depthTexture","shadowCoord","shadow","depthLayer","bd3D","dp"];function On(e,t){return a=>{let r=function(e){let t=e,a={};if(null==t)return a;for(let e of Un){let r=t[e];void 0!==r&&(a[e]=r)}return a}(a),s=Dn(e,r),i=Dn(t,r);return re(()=>{let e=ir(1).toVar();return le(In.greaterThan(.5),()=>{e.assign(s)}).Else(()=>{e.assign(i)}),e})()}}var Gn=On(En,Nn),qn=On(Bn,we),Wn=new Ga,Hn=new Ss,jn=new os,Kn=class{constructor(){this._gBuffer=null,this._maskTarget=null,this._resolveMaterial=null,this._resolveKey="",this._cameraWorld=lr(new Ts),this._projInv=lr(new Ts),this._lightRows=[];let e=new bt;e.name="SplineShadowMask.gbuffer",e.fragmentNode=ne(Wa,_e.z),e.lights=!1,e.blending=Us,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 bt;t.name="SplineShadowMask.resolve";let a=Ea(this._gBuffer.depthTexture),r=Ea(this._gBuffer.texture),s=this._cameraWorld,i=this._projInv,n=this._gBuffer.width,l=this._gBuffer.height;this._lightRows=e.map(()=>({matrix:lr(new Ts),bias:lr(0),normalBias:lr(0)}));let o=this._lightRows,u=re(()=>{let t=U(),u=R(t.mul(Y(n,l))).add(Y(.5,.5)).div(Y(n,l)).toVar(),d=a.sample(u),h=ee(u,d,i).toVar(),m=r.sample(u).toVar(),c=s,p=c.mul(ne(h,1)).xyz.toVar(),g=Ya(c.mul(ne(m.xyz,0)).xyz).toVar(),f=w.pcssHalton,_=j(ft.xy.add(f)).mul(6.28318530718).toVar(),y=[ir(1).toVar(),ir(1).toVar(),ir(1).toVar(),ir(1).toVar()];return e.forEach((e,t)=>{let a=o[t],r=p.add(g.mul(a.normalBias)),s=a.matrix.mul(ne(r,1)).toVar(),i=s.xyz.div(s.w),n=ae(i.x,ir(1).sub(i.y),i.z).toVar(),l=n.z.add(a.bias).toVar(),u=n.x.greaterThanEqual(0).and(n.x.lessThanEqual(1)).and(n.y.greaterThanEqual(0)).and(n.y.lessThanEqual(1)).and(l.lessThanEqual(1));le(u,()=>{Pn(e.shadow.map.depthTexture,e.shadow,n.xy,l,_,y[t],g)})}),ne(y[0],y[1],y[2],y[3])})();return t.fragmentNode=u,t.lights=!1,t.blending=Us,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,t}render(e,t,a,r,s){let i=s??e.getDrawingBufferSize(jn),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 ys(n,l,{type:ts,depthTexture:new ns(n,l),minFilter:Qs,magFilter:Qs});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 ys(o,u,{depthBuffer:!1,minFilter:Qs,magFilter:Qs});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(Hn),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 Wn.material=this._resolveMaterial,Wn.name="SplineShadowMask.resolve",e.setRenderTarget(this._maskTarget),Wn.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)=>{Rn(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=""}},$n=e=>e,Xn=e=>e,Qn=new Ga,Zn=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 Yn(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 Jn=Array.from({length:16},(e,t)=>[Yn(t+1,2),Yn(t+1,3)]),el="h16";try{let e=new URLSearchParams(window.location.search).get("dbgjitseq");("r2"===e||"h64"===e||"white"===e||"half"===e)&&(el=e)}catch{}function tl(e){return ae(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 al(e,t=!0){let a=ae(e.x.add(e.y).sub(e.z),e.x.add(e.z),e.x.sub(e.y).sub(e.z));return t?Ft(a,ae(0),ae(1)):At(a,ae(0))}var rl=class extends _t{constructor(e,t,a,r,s=!1){super("vec4"),this._resolution=lr(new os(1,1)),this._historyValid=lr(0),this._jitterUV=lr(new os(0,0)),this._resolveMaterials=null,this._rebuildResolveMaterials=null,this.beautyNode=e,this.depthNode=t,this.velocityNode=a,this._hdr=s,this._history=r??sl(),this._ownsHistory=void 0===r,this._outputTexNode=Ea(this._history.rtA.texture)}static get type(){return"SplineTAANode"}get outputTextureNode(){return this._outputTexNode}renderResolve(e){de.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&&(Qn.material=n,Qn.name="SplineTAA.resolve",Qn.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 ne(tl(t.rgb),t.a)},v=e=>{let c=re(()=>{let c=U().toVar();if(h)return ne(y.x.mul(400).add(.5),y.y.mul(400).add(.5),ir(.5),ir(1));let v=c,b=Y(ir(1).div(f.x),ir(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(Y(b.x.mul(e),b.y.mul(t))).toVar()),S=T,V=ir(t?-1e3:1e3).toVar(),M=Y(T[4]).toVar();for(let e=0;e<9;e++){let a=$n(g.load($e(T[e].mul(Xn(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($e(M.mul(f))).xy.mul(Y(.5,-.5)).toVar();s&&C.assign(Y(0,0));let z=c.sub(C).toVar(),k=a?Y(z.x,ir(1).sub(z.y)).toVar():z,A=x(v).toVar();if(r)return ne(C.x.mul(20).add(.5),C.y.mul(20).add(.5),_,ir(1));if(o){let e=new Hs(new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]),2,2);return e.needsUpdate=!0,Ea(e).sample(c)}if(l){let t=a?Y(c.x,ir(1).sub(c.y)):c;return e.sample(t)}if(n){let t=a?Y(c.x,ir(1).sub(c.y)):c,r=e.sample(k),s=e.sample(t),i=A.x,n=e=>tl(e.rgb).x;return ne(n(r).sub(i).abs().mul(8),n(s).sub(i).abs().mul(8),ir(0),ir(1))}let P=k.mul(f).toVar(),E=R(P.sub(.5)).add(.5).toVar(),N=P.sub(E).toVar(),B=N.mul(N.mul(N.mul(-.5).add(1)).add(-.5)).toVar(),L=N.mul(N).mul(N.mul(1.5).add(-2.5)).add(1).toVar(),I=N.mul(N.mul(N.mul(-1.5).add(2)).add(.5)).toVar(),F=N.mul(N).mul(N.mul(.5).add(-.5)).toVar(),D=L.add(I).toVar(),O=I.div(D).toVar(),G=E.sub(1).div(f).toVar(),q=E.add(2).div(f).toVar(),W=E.add(O).div(f).toVar(),H=ne(0).toVar();H.addAssign(e.sample(Y(W.x,G.y)).mul(D.x.mul(B.y))),H.addAssign(e.sample(Y(G.x,W.y)).mul(B.x.mul(D.y))),H.addAssign(e.sample(Y(W.x,W.y)).mul(D.x.mul(D.y))),H.addAssign(e.sample(Y(q.x,W.y)).mul(F.x.mul(D.y))),H.addAssign(e.sample(Y(W.x,q.y)).mul(D.x.mul(F.y)));let j=ne(tl(H.rgb),H.a).toVar();if(m)return ne(al(j.rgb).mul(ae(1,.55,.55)),H.a);let K=x(S[0]).toVar(),$=x(S[1]).toVar(),X=x(S[2]).toVar(),Q=x(S[3]).toVar(),Z=x(S[4]).toVar(),J=x(S[5]).toVar(),ee=x(S[6]).toVar(),te=x(S[7]).toVar(),re=x(S[8]).toVar(),se=ne(Dt(K,Dt($,Dt(X,Dt(Q,Dt(Z,Dt(J,Dt(ee,Dt(te,re))))))))).toVar(),ie=ne(At(K,At($,At(X,At(Q,At(Z,At(J,At(ee,At(te,re))))))))).toVar(),le=ne(Dt($,Dt(Q,Dt(Z,Dt(J,te))))).toVar(),oe=ne(At($,At(Q,At(Z,At(J,te))))).toVar();se.assign(se.add(le).mul(.5)),ie.assign(ie.add(oe).mul(.5));let ue=ie.r.sub(se.r).mul(.25).mul(.5).toVar(),de=A.gb.toVar();u||(se.y.assign(de.x.sub(ue)),se.z.assign(de.y.sub(ue)),ie.y.assign(de.x.add(ue)),ie.z.assign(de.y.add(ue)));let he=ne(i?j:Ft(j,se,ie)).toVar(),me=d||i?ir(.9):ir(.9).mul(_),ce=ne(qt(A,he,me)).toVar(),pe=w.tapAngle,ge=je(c.mul(f).add(Y(pe.mul(127.1),pe.mul(311.7)))).sub(.5).mul(1/255);return ne(al(ce.rgb,!this._hdr).add(ae(ge)),ce.a)}),v=new bt;return v.name="SplineTAA.resolve",v.colorNode=c(),v.depthTest=!1,v.depthWrite=!1,v.blending=Us,v.needsUpdate=!0,v};return this._rebuildResolveMaterials=()=>{this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose()),this._resolveMaterials=[v(Ea(this._history.rtB.texture)),v(Ea(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),de.setProjectionMatrix(null)}};function sl(){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 ys(e,t,{minFilter:Qs,magFilter:Qs,depthBuffer:!1});return a()?s.texture.type=ts: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 Ts,jitterOffsetUV:new os(0,0),beginJitter(e,t,a){if(l)return;let r,s;if(l=!0,(null===n||n.cam!==e)&&(n?.clearViewOffset(),n=new Zn(e)),this.unjitteredProjection.copy(e.projectionMatrix),w.unjitteredProjection.value.copy(e.projectionMatrix),"r2"===el){let e=++this.jitterIndex;r=(.5+.7548776662466927*e)%1,s=(.5+.5698402909980532*e)%1}else if("white"===el)this.jitterIndex++,r=Math.random(),s=Math.random();else if("h64"===el)r=Yn(this.jitterIndex%64+1,2),s=Yn(this.jitterIndex%64+1,3),this.jitterIndex=(this.jitterIndex+1)%64;else if("half"===el){let[e,t]=Jn[this.jitterIndex];r=.5+.5*(e-.5),s=.5+.5*(t-.5),this.jitterIndex=(this.jitterIndex+1)%Jn.length}else[r,s]=Jn[this.jitterIndex],this.jitterIndex=(this.jitterIndex+1)%Jn.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 il,nl=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}},ll=new Ga,ol=new os,ul=class extends _t{static get type(){return"SMAANode"}constructor(e){super("vec4"),this.textureNode=e,this.updateBeforeType=ge.FRAME,this._renderTargetEdges=new ys(1,1,{depthBuffer:!1,type:ts}),this._renderTargetEdges.texture.name="SMAANode.edges",this._renderTargetWeights=new ys(1,1,{depthBuffer:!1,type:ts}),this._renderTargetWeights.texture.name="SMAANode.weights",this._renderTargetBlend=new ys(1,1,{depthBuffer:!1,type:ts}),this._renderTargetBlend.texture.name="SMAANode.blend";let t=this,a=new Image;a.crossOrigin="anonymous",a.src=Jr("smaa-node-area.png"),a.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new ps,this._areaTexture.name="SMAANode.area",this._areaTexture.image=a,this._areaTexture.minFilter=Qs,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;let r=new Image;r.crossOrigin="anonymous",r.src=Jr("smaa-node-search.png"),r.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new ps,this._searchTexture.name="SMAANode.search",this._searchTexture.image=r,this._searchTexture.magFilter=Ws,this._searchTexture.minFilter=Ws,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._invSize=lr(new os),this._areaTextureUniform=Ea(this._areaTexture),this._searchTextureUniform=Ea(this._searchTexture),this._edgesTextureUniform=Ea(this._renderTargetEdges.texture),this._weightsTextureUniform=Ea(this._renderTargetWeights.texture),this._materialEdges=new bt,this._materialEdges.name="SMAANode.edges",this._materialWeights=new bt,this._materialWeights.name="SMAANode.weights",this._materialBlend=new bt,this._materialBlend.name="SMAANode.blend",this._textureNode=K(this,this._renderTargetBlend.texture)}getTextureNode(){return this._textureNode}setSize(e,t){this._invSize.value.set(1/e,1/t),this._renderTargetEdges.setSize(e,t),this._renderTargetWeights.setSize(e,t),this._renderTargetBlend.setSize(e,t)}updateBefore(e){let{renderer:t}=e;il=ja.resetRendererState(t,il);let a=t.getDrawingBufferSize(ol);this.setSize(a.width,a.height),t.setRenderTarget(this._renderTargetEdges),ll.material=this._materialEdges,ll.render(t),t.setRenderTarget(this._renderTargetWeights),ll.material=this._materialWeights,ll.render(t),t.setRenderTarget(this._renderTargetBlend),ll.material=this._materialBlend,ll.render(t),ja.restoreRendererState(t,il)}setup(e){let t=Y(.00625,.0017857142857142857),a=1/7,r=this.textureNode.uvNode||U(),s=re(()=>{let e=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-1,0,0,-1))),t=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(1,0,0,1))),a=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-2,0,0,-2)));return $("vec4","vOffset0").assign(e),$("vec4","vOffset1").assign(t),$("vec4","vOffset2").assign(a),ua}),i=re(()=>{let e=$("vec4","vOffset0"),t=$("vec4","vOffset1"),a=$("vec4","vOffset2"),s=Y(.1,.1),i=ne().toVar(),n=this.textureNode.sample(r).rgb.toVar(),l=this.textureNode.sample(e.xy).rgb.toVar(),o=Ae(n.sub(l));i.x=At(o.r,o.g,o.b);let u=this.textureNode.sample(e.zw).rgb.toVar();o=Ae(n.sub(u)),i.y=At(o.r,o.g,o.b);let d=da(s,i.xy).toVar();Da(d,Y(1,1)).equal(0).discard();let h=this.textureNode.sample(t.xy).rgb.toVar();o=Ae(n.sub(h)),i.z=At(o.r,o.g,o.b);let m=this.textureNode.sample(t.zw).rgb.toVar();o=Ae(n.sub(m)),i.w=At(o.r,o.g,o.b);let c=At(i.x,i.y,i.z,i.w).toVar(),p=this.textureNode.sample(a.xy).rgb.toVar();o=Ae(n.sub(p)),i.z=At(o.r,o.g,o.b);let g=this.textureNode.sample(a.zw).rgb.toVar();return o=Ae(n.sub(g)),i.w=At(o.r,o.g,o.b),c=At(c,i.z,i.w),d.xy.mulAssign(Y(da(ir(.5).mul(c),i.xy))),ne(d,0,0)}),n=re(([e,t,a,r])=>{let s=Y(t).toVar();return s.r=a.add(s.r.mul(r)),ir(255).mul(e.sample(s)).r}),l=re(([e,r,s,i,n])=>{let l=ir(16).mul(ir(4).mul(Y(s,i)).round()).add(r);return l=t.mul(l).add(ir(.5).mul(t)),l.y.addAssign(ir(a).mul(n)),e.sample(l).rg}),o=re(([e,t,a,r])=>{let s=Y(0,1).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(Y(2,0).mul(this._invSize)),le(i.x.lessThanEqual(r).or(s.g.lessThanEqual(ir(.8281)).or(s.r.notEqual(ir(0)))),()=>{X()})}),i.x.addAssign(ir(.25).mul(this._invSize.x)),i.x.addAssign(this._invSize.x),i.x.addAssign(ir(2).mul(this._invSize.x)),i.x.subAssign(this._invSize.x.mul(n(t,s,0,.5))),i.x}),u=re(([e,t,a,r])=>{let s=Y(0,1).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(Y(2,0).mul(this._invSize)),le(i.x.greaterThanEqual(r).or(s.g.lessThanEqual(ir(.8281)).or(s.r.notEqual(ir(0)))),()=>{X()})}),i.x.subAssign(ir(.25).mul(this._invSize.x)),i.x.subAssign(this._invSize.x),i.x.subAssign(ir(2).mul(this._invSize.x)),i.x.addAssign(this._invSize.x.mul(n(t,s,.5,.5))),i.x}),d=re(([e,t,a,r])=>{let s=Y(1,0).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(Y(0,-2).mul(this._invSize)),le(i.y.lessThanEqual(r).or(s.r.lessThanEqual(ir(.8281)).or(s.g.notEqual(ir(0)))),()=>{X()})}),i.y.addAssign(ir(.25).mul(this._invSize.y)),i.y.addAssign(this._invSize.y),i.y.addAssign(ir(2).mul(this._invSize.y)),i.y.subAssign(this._invSize.y.mul(n(t,s.gr,0,.5))),i.y}),h=re(([e,t,a,r])=>{let s=Y(1,0).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(Y(0,-2).mul(this._invSize)),le(i.y.greaterThanEqual(r).or(s.r.lessThanEqual(ir(.8281)).or(s.g.notEqual(ir(0)))),()=>{X()})}),i.y.subAssign(ir(.25).mul(this._invSize.y)),i.y.subAssign(this._invSize.y),i.y.subAssign(ir(2).mul(this._invSize.y)),i.y.addAssign(this._invSize.y.mul(n(t,s.gr,.5,.5))),i.y}),m=re(()=>{let e=r.xy.div(this._invSize),t=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-.25,-.125,1.25,-.125))).toVar(),a=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-.125,-.25,-.125,1.25))).toVar(),s=ne(t.xz,a.yw).add(ne(-2,2,-2,2).mul(ne(this._invSize.xx,this._invSize.yy)).mul(ir(8))).toVar();return $("vec2","vPixcoord").assign(e),$("vec4","vOffset0").assign(t),$("vec4","vOffset1").assign(a),$("vec4","vOffset2").assign(s),ua}),c=re(()=>{let e=$("vec2","vPixcoord"),t=$("vec4","vOffset0"),a=$("vec4","vOffset1"),s=$("vec4","vOffset2"),i=ne(0,0,0,0).toVar(),n=ne(0,0,0,0).toVar(),m=this._edgesTextureUniform.sample(r).rg.toVar();return le(m.g.greaterThan(ir(0)),()=>{let r=Y().toVar(),d=Y().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=Y().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=na(Ae(r)),p=this._edgesTextureUniform.sample(m.add(Y(1,0).mul(this._invSize))).r.toVar();i.r=p,i.rg=l(this._areaTextureUniform,c,h,p,ir(n.y))}),le(m.r.greaterThan(ir(0)),()=>{let r=Y().toVar(),o=Y().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=Y().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=na(Ae(r)),p=this._edgesTextureUniform.sample(m.add(Y(0,1).mul(this._invSize))).g.toVar();i.ba=l(this._areaTextureUniform,c,u,p,ir(n.x))}),i}),p=re(()=>{let e=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(1,0,0,1)));return $("vec4","vOffset1").assign(e),ua}),g=re(()=>{let e=$("vec4","vOffset1"),t=ne().toVar(),a=ne().toVar();return a.xz=this._weightsTextureUniform.sample(r).xz,a.y=this._weightsTextureUniform.sample(e.zw).g,a.w=this._weightsTextureUniform.sample(e.xy).a,le(Da(a,ne(1)).lessThan(1e-5),()=>{t.assign(this.textureNode.sample(r))}).Else(()=>{let e=Y().toVar();e.x=a.a.greaterThan(a.b).select(a.a,a.b.negate()),e.y=a.g.greaterThan(a.r).select(a.g,a.r.negate()),le(Ae(e.x).greaterThan(Ae(e.y)),()=>{e.y.assign(0)}).Else(()=>{e.x.assign(0)});let s=this.textureNode.sample(r).toVar(),i=Y(r).toVar();i.addAssign(Ut(e).mul(this._invSize));let n=this.textureNode.sample(i).toVar(),l=Ae(e.x).greaterThan(Ae(e.y)).select(Ae(e.x),Ae(e.y)).toVar(),o=qt(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""}},dl=new os,hl=new Ss,ml=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 ys(e,t,{depthBuffer:!0,stencilBuffer:!1,samples:0});a.texture.name="SplineHelperOverlay.color",this._rt=a}if(null===this._texNode){this._texNode=Ea(this._rt.texture),this._smaaNode=(r=this._texNode,new ul(sa(r)));let e=new bt;e.name="SplineHelperOverlayComposite",e.fragmentNode=this._smaaNode,e.transparent=!0,e.blending=Zs,e.blendEquation=ei,e.blendSrc=ii,e.blendDst=ls,e.blendSrcAlpha=ii,e.blendDstAlpha=ls,e.depthTest=!1,e.depthWrite=!1,this._material=e,this._quad=new Ga(e);let t=new bt;t.name="SplineHelperOverlayDepthSeed",this._depthTexNode=Ea(a),t.depthNode=this._depthTexNode.x,t.fragmentNode=ne(0),t.colorWrite=!1,t.depthTest=!1,t.depthWrite=!0,this._seedMaterial=t,this._seedQuad=new Ga(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(dl);let i=this._ensureTarget(dl.x,dl.y,s),n=e.getRenderTarget(),l=e.autoClear;e.getClearColor(hl);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(hl,o),b()){let t=e.toneMapping,a=e.outputColorSpace;e.toneMapping=Vs,e.outputColorSpace=ms.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()}},cl=new WeakMap,pl=new Set,gl=0;var fl=new WeakMap,_l=new Set,yl=0;function xl(e){let t=e.parent?.selectedTexture;return t&&!0===t.isTexture?t:null}function vl(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 bl=new WeakMap;function Tl(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=ir(1).sub(ir(1).sub(e).mul(ir(1).sub(t))).toVec3();return qt(e,a,s)}case 10:return qt(e,e.mul(t),s);default:return qt(e,t,s)}}var wl=null;function Sl(){return null===wl&&(wl=ba({output:E,velocity:de})),wl}var Vl=re(e=>{let t=e.lightDistance,a=e.cutoffDistance,r=e.decayExponent,s=a.greaterThan(0).and(r.greaterThan(0));return St(s,t.div(a).oneMinus().clamp().pow(r),ir(1))}),Ml=class extends Qa{static get type(){return"SplinePointLightNode"}setupDirect(e){let t=this.getLightVector(e),a=t.normalize(),r=Vl({lightDistance:t.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode});return{lightColor:this.colorNode.mul(r),lightDirection:a}}},Cl=class extends A{static get type(){return"SplineSpotLightNode"}setupDirect(e){let t,a,r=this.light,s=this.getLightVector(e),i=s.normalize(),n=i.dot(rt(r)),l=this.getSpotAttenuation(e,n),o=Vl({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=Ea(d.map,a.xy).onRenderUpdate(()=>d.map)),t&&a){let e=a.mul(2).sub(1).abs().lessThan(1).all();u=St(e,u.mul(t),u)}return{lightColor:u,lightDirection:i}}},Rl=null,zl=new ds,kl=new ds,Al=new Ss,Pl=new Ss,El=new Ss,Nl=new ds,Bl=new ds,Ll=new os,Il=new ds(1,0,0),Fl=new ds(0,1,0),Dl=new ds(0,0,1),Ul=new ds,Ol=new ds,Gl=new ds,ql=new ds,Wl=new Ts,Hl=new ds,jl=new ds,Kl=new Ys,$l=new _s,Xl=new _s,Ql=new os,Zl=new os,Yl=new ds,Jl=new ds,eo=new ds,to=new ds,ao=new ds,ro=[],so=!1,io=!1,no=!1,lo="full",oo="g16",uo=!1,ho=!1,mo=!1,co="default",po=!1,go=!0,fo=!0,_o=!0,yo=!0,xo=!0,vo=xr;try{let e=new URLSearchParams(window.location.search),t=e.get("instancing");if(null!==t)if("off"===t||"0"===t||"false"===t||"no"===t)xo=!1;else{let e=Number.parseInt(t,10);Number.isFinite(e)&&e>1&&(vo=e)}so="0"===e.get("dbgao"),io="0"===e.get("dbgshadow"),no="1"===e.get("dbgfp16"),uo="0"===e.get("dbgsky"),ho="0"===e.get("dbgssr"),mo="0"===e.get("dbgibl");let a=e.get("pbrcolor");"0"===a?co="off":("linear"===a||"aces"===a||"agx"===a||"neutral"===a)&&(co=a),po="0"===e.get("dbgplanar"),go="0"!==e.get("dbgplanarpyr"),fo="0"!==e.get("dbgssrpyr"),_o="0"!==e.get("dbgssrhalf"),yo="0"!==e.get("dbgssrresolve");let r=e.get("dbgprefilter");"0"===r?lo="off":"base"===r?lo="base":"k4"===r&&(oo="k4")}catch{}function bo(){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 To=class extends N{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:no?ts:ti,asyncCompilation:!0===e.asyncCompilation||"load"===e.asyncCompilation}),this.viewportWidth=1,this.viewportHeight=1,this.resolution=new os,this.dummyCamera=new zr,this.sceneTransitionDuration=0,this.sceneTransitionTimeRemaining=-1,this.manageShadowUpdates=!1,this.forceShadowUpdates=!1,this._shadowMapMissingAtSync=!1,this.temporalAAEnabled=!0,this.hdrChainActive=!1,this.isWebGPUSplineRenderer=!0,this.shadowFilterHook=Ln,this._gaugeSnapshot="",this._gaugeChangedAt=0,this._gaugeStallWarned=!1,this._skipStalls=new nl,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(),Hi&&function(){if(!Xi){if(Xi=!0,$i=()=>w.frameIndex.value,typeof GPUBuffer<"u"){let e=GPUBuffer.prototype.destroy;GPUBuffer.prototype.destroy=function(){return Zi("buffer",this.label,this.size),e.call(this)}}if(typeof GPUTexture<"u"){let e=GPUTexture.prototype.destroy;GPUTexture.prototype.destroy=function(){return Zi("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 Wi(this),this.library.addLight(Ai,ki),this.shadowMap.enabled=!0,this.shadowMap.type=Ps,t=!0===this.backend?.isWebGPUBackend,xn=t,this._deferGpuBufferDestruction(),this.outputColorSpace=fs,this.toneMapping=Vs,function(e){let t=e.library;t.addLight(Ml,wr),t.addLight(Cl,Rr),t.addLight(sr,Cr),t.lightNodes.delete(ni),t.lightNodes.delete(si),t.addLight(Ml,ni),t.addLight(Cl,si)}(this),this.sceneBundlesEnabled=!0===e.sceneBundles||"rerecord"===e.sceneBundles,this.sceneBundlesForceRerecord="rerecord"===e.sceneBundles,this.domElement.removeAttribute?.("data-engine")}get lastFrameIncomplete(){return!!(this._warmupInFlight||this._compilationHasWork&&!this._gaugesStalled)||0!==(this._skippedAsyncDraws??0)&&!this._skipStalls.stalled}get _gaugesStalled(){return this._gaugeChangedAt>0&&performance.now()-this._gaugeChangedAt>To._GAUGE_STALL_MS}_trackGaugeStall(){let e=this._asyncCompilationGauges,t=void 0!==e&&(e.queued>0||e.pipelines>0),a=t?`${e.queued}/${e.pipelines}`:"";return t?a!==this._gaugeSnapshot?(this._gaugeSnapshot=a,void(this._gaugeChangedAt=performance.now())):void(this._gaugesStalled&&!this._gaugeStallWarned&&(this._gaugeStallWarned=!0,console.warn(`[spline/webgpu] async pipeline driver stalled (${a} in flight, no movement for ${To._GAUGE_STALL_MS}ms) — treating frames as final so screenshots, thumbnails and the on-demand render loop keep working.`))):(this._gaugeSnapshot="",void(this._gaugeChangedAt=0))}_trackStalledSkips(e){let t=this._compilationHasWork&&!this._gaugesStalled;this._skipStalls.update(e,t),T.stalledSkipFrames=this._skipStalls.frames,this._skipStalls.stalled&&!this._stallWarned&&(this._stallWarned=!0,console.warn(`[spline/webgpu] ${e} draw(s) are permanently skipped — their render pipelines never became ready (look for "pipeline creation failed" above). Those objects will not appear; the frame is treated as final so screenshots, thumbnails and the on-demand render loop keep working.`))}get _asyncCompilationGauges(){return this.info.asyncCompilation}get _compilationHasWork(){let e=this._asyncCompilationGauges;return void 0!==e&&(e.queued>0||e.pipelines>0)}get asyncCompilationEnabled(){return!0===this._asyncCompilation}get taaHistory(){return this._taaHistory||(this._taaHistory=sl()),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 ys(2,2,{count:2});e.textures[0].name="output",e.textures[0].type=ti,e.textures[1].name="velocity",e.textures[1].type=ts;let t=new ns(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 Tr?e.activePage:e;Fn(Xr.isSoft(t?.data?.shadow)),t&&fi(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(Sl())),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(Sl())),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 Tr?e:e.scene;if(!0!==a.needsTransmission?.()&&!0!==a.needsReflection?.())return null;if(null===this._grabWarmupTarget){let e=new ys(2,2);e.texture.type=ti;let t=new ns(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=fl.get(e);return a&&(a.epoch!==yl||a.srcMaterial!==t||a.geometry!==e.geometry||a.position.src!==e.geometry.getAttribute("position")||a.map!==t.map||a.selectedMap!==xl(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=xl(e),o=new $s(r.array,3);o.setUsage(Gs);let u={src:r,attr:o,version:r.version},d=[],h=e=>{let t=new $s(new Float32Array(e.count),1);t.setUsage(Gs);let a={src:e,attr:t,version:e.version};return vl(a),d.push(a),a},m=s?h(s):null,c=i?h(i):null,p=new Na;p.name=`SplinePointsTwin(${t.name||t.type})`,p.positionNode=ve(u.attr,"vec3"),p.size=t.size,p.sizeAttenuation=t.sizeAttenuation,p.transparent=t.transparent,p.depthTest=t.depthTest,p.depthWrite=t.depthWrite,p.blending=t.blending,p.fog=!1;let g=m?ve(m.attr,"float"):null,f=c?ve(c.attr,"float"):null;p.colorNode=re(()=>{null!==f?J(f.lessThan(.5)):null!==g&&J(g.greaterThan(.5));let e=null!==n?Ea(n,U()):ne(1);return(null!==g&&null!==n&&null!==l?qt(e,Ea(l,U()),g):e).mul(ne(wt,1))})();let _=new Es(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:yl};return _l.add(new WeakRef(y)),y}(e,t),fl.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&&(vl(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=bl.get(e);return a&&(a.epoch!==yl||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 $s(new Float32Array(e.count*t),t);a.setUsage(Gs);let r={src:e,attr:a,version:e.version};return vl(r),r},i=s(a.getAttribute("position"),3),n=s(a.getAttribute("hover"),1),l=s(a.getAttribute("selected"),1),o=lr(r.pointSize.value),u=lr((new Ss).fromArray(r.color.value)),d=new Na;d.name=`SplinePointsTwin(${t.name||t.type})`,d.positionNode=ve(i.attr,"vec3");let h=ve(n.attr,"float"),m=ve(l.attr,"float");d.sizeNode=o.add(h.mul(4)),d.sizeAttenuation=!1,d.transparent=t.transparent,d.depthTest=t.depthTest,d.depthWrite=t.depthWrite,d.blending=t.blending,d.fog=!1,d.colorNode=re(()=>{let e=et(U().mul(2).sub(1)).toVar();J(e.greaterThan(1));let t=St(m.equal(1),ae(.22,.9,.7),u.add(h.mul(.25)));return ne(St(e.greaterThan(.75),ae(1),t),1)})();let c=new Es(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:yl};return _l.add(new WeakRef(p)),p}(e,t),bl.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&&(vl(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=cl.get(e);if(!t||t.epoch!==gl){let a=new Et;a.name=`SplineHelperTwin(${e.name||e.type})`,a.worldUnits=!1,t={twin:a,epoch:gl},cl.set(e,t),pl.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 ml),this._helperOverlay.render(this,e,t,a,r),T.helperOverlayMode="smaa";else{let r=this.autoClear;this.autoClear=!1,e&&this.render(e,a),t&&(this.clearDepth(),this.render(t,a)),this.autoClear=r,T.helperOverlayMode="direct"}for(let e of i)e.object.material=e.original;for(let e of s)e.visible=!0}createEffectChain(){return function(e){let t=e.pipeline,a=t.postprocessingState,r=!0===a.enabled,s=q(t.scene,t.camera),i=e.hdrChainActive;try{let e=new URLSearchParams(window.location.search).get("dbgfp16");("scene"===e||"st"===e)&&(i=!0)}catch{}let n=s.getTextureNode(),l=n,o=null;if(e.temporalAAEnabled){s.setMRT(Sl()),o=function(e,t,a,r,s=!1){return new rl(e,t,a,r,s)}(n,s.getTextureNode("depth"),s.getTextureNode("velocity"),e.taaHistory,i),l=o,s.getTexture("velocity").type=ts;try{if("1"===new URLSearchParams(window.location.search).get("dbgvel")){let e=s.getTextureNode("velocity");l=ne(e.x.mul(20).add(.5),e.y.mul(20).add(.5),ir(.5),ir(1))}}catch{}}i?s.getTexture("output").type=ts:v()&&(s.getTexture("output").internalFormat="rgba8unorm-srgb");let u=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,d={bloomIntensity:lr(1),caOffset:lr(new os(0,0)),vignetteOffset:lr(0),vignetteDarkness:lr(0),hue:lr(0),saturationPlus1:lr(1),brightness:lr(0),bcContrastScale:lr(1),dofFocusDistance:lr(0),dofFocalLength:lr(0),dofBokehScale:lr(1),dofCameraNear:lr(50),dofCameraFar:lr(1e4),dofOrtho:lr(0),pixelCells:lr(new os(1,1)),bloomOpacity:lr(1),caOpacity:lr(1),vignetteOpacity:lr(1),noiseOpacity:lr(1),hueSaturationOpacity:lr(1),brightnessContrastOpacity:lr(1),dofOpacity:lr(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 os(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(_(U()));c=qt(c,e.rgb,1),p=qt(p,e.a,1)}let x=null;if(r&&a.bloom.enabled){let e=Zr("bloom");if(e){let t=a.bloom;x=e(o?o.outputTextureNode:n,{kernelSize:Kr(t.kernelSize),blurScale:u(t.blurScale,1),luminanceThreshold:u(t.luminanceThreshold,.9),luminanceSmoothing:u(t.luminanceSmoothing,.025)});let r=Ft(x.mul(d.bloomIntensity),0,1);c=Tl(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=ir(1).sub(ir(1).sub(e).mul(ir(1).sub(t)));return qt(e,a,s)}case 10:return qt(e,e.mul(t),s);default:return qt(e,t,s)}}(p,r.a,t.blendFunction,d.bloomOpacity)}else Yr("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=U().sub(.5),l=r.sample(s(U().add(i.mul(t)))).r,o=r.sample(s(U())).g,u=r.sample(s(U().sub(i.mul(t)))).b;c=Tl(c,ae(l,o,u),e.blendFunction,d.caOpacity)}if(r&&a.vignette.enabled){let e=a.vignette,t=et(U().sub(.5)),r=$t(ir(.8).mul(d.vignetteOffset),d.vignetteOffset.add(.799),t.mul(d.vignetteDarkness));c=Tl(c,c.mul(r.oneMinus()),e.blendFunction,d.vignetteOpacity)}if(r&&a.noise.enabled){let e=a.noise,t=B(Wt(Da(U().add(B(Ha)),Y(12.9898,78.233))).mul(43758.5453));c=Tl(c,ae(t),e.blendFunction,d.noiseOpacity)}if(r&&a.hueSaturation.enabled){let e=a.hueSaturation,t=oe(c,d.hue);t=M(t,d.saturationPlus1),c=Tl(c,t,e.blendFunction,d.hueSaturationOpacity)}if(r&&a.brightnessContrast.enabled){let e=a.brightnessContrast,t=c.add(ae(d.brightness));t=t.sub(.5).mul(d.bcContrastScale).add(.5),c=Tl(c,t.min(1),e.blendFunction,d.brightnessContrastOpacity).max(0)}if(r&&a.depthOfField.enabled){let e=Zr("depthOfField");if(e){let t=a.depthOfField,r=s.getTextureNode("depth"),i=qt(Z(r,d.dofCameraNear,d.dofCameraFar),z(r,d.dofCameraNear,d.dofCameraFar),d.dofOrtho);c=Tl(c,e(ne(c,p),i,d.dofFocusDistance,d.dofFocalLength,d.dofBokehScale).rgb,t.blendFunction,d.dofOpacity)}else Yr("depthOfField","webgpu")}let b=ne(c,p);if(t.uiOverlayEnabled&&t.uiCanvasTexture){let e=Ea(t.uiCanvasTexture,U().flipY()),a=qt(b.rgb,e.rgb,e.a),r=Ft(b.a.add(e.a),0,1);b=ne(a,r)}let T=t.sceneTransitionFromTexture;if(T){let e=Ea(T,U()),a=t.sceneTransitionPass.uniforms.mixRatio;b=qt(e,b,a)}let w=t.watermarkTexture;if(w){let t=w.image,a=t?.width||128,r=t?.height||32,s=new os(e.viewportWidth*e.getPixelRatio(),e.viewportHeight*e.getPixelRatio()),i=12*e.getPixelRatio(),n=.5*a*e.getPixelRatio(),l=.5*r*e.getPixelRatio(),o=Y((s.x-n-i)/s.x,i/s.y),u=Y(n/s.x,l/s.y),d=U().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=Ft(d,0,1),c=Ea(w,m),p=c.a.mul(h.select(ir(1),ir(0)));b=ne(qt(b.rgb,c.rgb,p),Ft(b.a.add(p),0,1))}let S=new I(e,b);return{syncValues:h,render(){s.scene=t.scene,s.camera=t.camera,S.render()},renderTAAResolve:o?e=>{s.scene=t.scene,s.camera=t.camera,o.renderResolve(e)}:null,renderBloomPasses:x?e=>{s.scene=t.scene,s.camera=t.camera,x.renderBloom(e)}:null,resize(){},sceneDepthTexture:()=>s.renderTarget?.depthTexture??null,dispose(){o?.dispose(),x?.dispose(),s.dispose(),S.dispose()}}}(this)}renderSplineSceneWithDummyCamera(e,t,a=1){this.dummyCamera.updateCameraState(t.dataPatched),this.dummyCamera.matrix.copy(t.matrixWorld);let r=t.height,s=t.width,i=this.viewportWidth/this.viewportHeight;s<r?s=r*i:r=s/i,this.dummyCamera.setViewplaneSize(s,r);for(let t=0;t<a;t++)this.renderSplineScene(e,this.dummyCamera)}renderSplineScene(a,r,{sceneHelpers:s=this.sceneHelpers,sceneHelpersOnTop:i=this.sceneHelpersOnTop}={}){if(this._warmupInFlight)return;this._maybeCloseAsyncLoadWindow(),this._frameSerial++,this._disposeRetiredGrabTargets(),(mr()?.drainRetired()??0)+(d()?.drainRetired()??0)>0&&this._retireBundleRecords(),Hi&&function(e){if(null==e||e===Qi)return;let t=e;"function"==typeof t.addEventListener&&(Qi=e,t.addEventListener("uncapturederror",e=>{let t=e?.error?.message??"";!t.toLowerCase().includes("destroyed")||Ki<=0||(Ki--,console.warn(`[spline/webgpu][dbgdestroys] submit rejected at frame ${$i()} (t=${Math.round(performance.now())}ms):\n${t.slice(0,400)}\n— last ${ji.length} destroy() calls, newest last (a stack WITHOUT _disposeRetiredGrabTargets bypassed the deferral):`,ji.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 Tr?a.activePage:a,u=l.visible;l.visible=!0;let h=l.scene;if(fi(l),this.renderStarted=!0,xo&&a instanceof Tr){let e=a.updateInstanceGroups(l,vo);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=uo?null:l.skyState;if(!0===m?.enabled){if(this.skyEnvironmentNeeded=!ho&&(h.needsReflectionDirty||h.needsReflection())||!mo&&!0===m.lighting,null===this._skySystem){let e=Rl;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;!mo&&!0===m?.enabled&&this._skySystem&&(c=this._skySystem.iblTexture??null,p=this._skySystem.iblRotationY??0),function(e){if(Si.quality===e)return!1;Si.quality=e;for(let e of Vi)Mi(e)}("low"===m?.lightingQuality?"low":"full"),function(e){if(Si.texture===e)return!1;Si.texture=e,Si.version++;for(let e of Vi)Mi(e)}(c),Si.rotation.set(0,-p,0),l.environmentIntensity=!0===m?.enabled?m.lightingIntensity??1:1;{let e="off"===co?null:l.gradingState,t="default"!==co&&"off"!==co,a=t||"linear"===e?.pipeline,r=t?"linear"===co?"none":co:e?.toneMapping??"aces";this.toneMapping=a?"aces"===r?Rs:"agx"===r?zs:"neutral"===r?ks:Vs:Vs,this.toneMappingExposure=a?e?.exposure??1:1,this.outputColorSpace=a?cs:fs,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 _=Vn[f];w.pcssHalton.value.set(_[0],_[1]),w.tapAngle.value=Math.random()*Math.PI*2,w.tapAngle2.value=Math.random()*Math.PI*2,this._syncLightState(l),w.unjitteredProjection.value.copy(r.projectionMatrix);let y=this.temporalAAEnabled?this.taaHistory:null;if(y){let e=this.getDrawingBufferSize(Zl);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?dr():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?br:null,r.layers.enable(3),r.layers.enable(8),r.layers.enable(4);let b=l.data.ao,S=b.occlusion&&!so&&!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(!ho&&h.needsReflection()?(this._renderReflectionPass(l,r),po?w.reflectionPlanarEnabled.value=0:this._renderPlanarReflectionPass(l,r),this._renderReflectionResolvePass(l,r)):w.reflectionResolveEnabled.value=0,this.sceneBundlesEnabled&&this._updateSceneBundle(l,r),this.pipeline.isUIOverlayEnabled&&l.uiCanvas?.enabled&&l.uiCanvas.texture&&l.uiCanvas.texture.image.width>0){let e=this.getPixelRatio();(l.uiCanvas.width!==this.viewportWidth||l.uiCanvas.height!==this.viewportHeight||l.uiCanvas.dpr!==e)&&l.uiCanvas.applySize({width:this.viewportWidth,height:this.viewportHeight},e),l.uiCanvas.render(this),this.pipeline.uiCanvasTexture=l.uiCanvas.texture,this.pipeline.uiOverlayEnabled=!0}else this.pipeline.uiOverlayEnabled=!1;this.pipeline.sceneHelpers=s,this.pipeline.sceneHelpersOnTop=i,this.pipeline.scene=l,this.pipeline.camera=r;let V=t(l.postprocessing);this.pipeline.postprocessingState!==V&&this.pipeline.updatePostprocessing(V),this.pipeline.render(),y?.endJitter(),T.outputInterpositions=this._frameBufferTargets?.size??0,this.manageShadowUpdates&&(h.shadowsDirty=this._shadowMapMissingAtSync||this.lastFrameIncomplete),r instanceof zr&&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,eo.setFromMatrixPosition(e.matrixWorld),e.target?(e.target.updateMatrixWorld(),to.setFromMatrixPosition(e.target.matrixWorld)):to.set(0,0,0),ao.subVectors(to,eo),ao.lengthSq()<1e-10)return;ao.normalize();let l=1/0,o=-1/0;for(let e=0;e<a;e++){let a=4*e,r=(t[a]-eo.x)*ao.x+(t[a+1]-eo.y)*ao.y+(t[a+2]-eo.z)*ao.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(Yl):Yl.setFromMatrixPosition(a.matrixWorld);let r=4*t;ro[r]=Yl.x,ro[r+1]=Yl.y,ro[r+2]=Yl.z,ro[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;Yl.copy(r.center).applyMatrix4(a.matrixWorld),Jl.setFromMatrixScale(a.matrixWorld);let i=r.radius*Math.max(Math.abs(Jl.x),Math.abs(Jl.y),Math.abs(Jl.z)),n=4*t;ro[n]=Yl.x,ro[n+1]=Yl.y,ro[n+2]=Yl.z,ro[n+3]=i,t++}),t}_syncLightState(e){let t=Xr.isSoft(e.data.shadow);Fn(t),T.shadowTypeSoft=t,function(e){switch(e){case"low":Mn=8;break;case"high":Mn=32;break;default:Mn=16}}(e.data.shadow?.softShadowQuality),t&&wn()&&(dn||(this.initTexture?.(an()),dn=!0));let r=-1;T.pcssLights=0,T.pcssPyramidActive=0,this._maskLights.length=0,this._maskBlocked=!1,T.nodeResurrections=this._nodes?._spResurrections??0;let s=!1,i=w.toonLightData.array,n=0,l=this.manageShadowUpdates,o=e.scene.shadowsDirty||this.forceShadowUpdates;this._shadowMapMissingAtSync=!1,e.traverseVisible(u=>{let d=u;if(a(d)&&(e.scene.shadowsDirty=!0),l&&(d.isPointLight||d.isSpotLight||d.isDirectionalLight)&&d.shadow&&(d.shadow.autoUpdate=o,o&&!0===d.castShadow&&null==d.shadow.map&&(this._shadowMapMissingAtSync=!0)),io&&(d.isPointLight||d.isSpotLight||d.isDirectionalLight)&&d.castShadow&&(d.castShadow=!1),d.isPointLight&&d.castShadow&&d.shadow&&(function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==qn&&T.pcssForeignFilter++:(e.filterNode=qn,T.pcssInstalled++)}(d.shadow),zn(d.shadow),T.pcssLights++),(d.isSpotLight||d.isDirectionalLight)&&d.castShadow&&d.shadow){d.isDirectionalLight&&(r<0&&(r=this._gatherShadowBounds(e)),this._fitDirectionalShadowRange(d,ro,r)),function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Gn&&T.pcssForeignFilter++:(Object.defineProperty(e,"penumbraSize",{get:()=>d.data?.penumbraSize??.5,configurable:!0}),e.filterNode=Gn,T.pcssInstalled++)}(d.shadow);let a,i=!l||o||!0===d.shadow.needsUpdate;if(t&&wn()&&(i?function(e){let t=e;t.__spePcssPyramid&&(t.__spePcssPyramid.fresh=!1)}(d.shadow):on(d.shadow)||function(e,t){let a=t,r=a.map?.depthTexture??null;if(null==r)return!1;let s=nn(t);if(function(e){let t=nn(e);if(t.slot>=0)return t.slot;for(let a=0;a<8;a++){let r=ln[a];if(null===r||void 0===r.deref())return ln[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=en(64,64),s.mid.texture.name="SplinePCSSPyramidMid"),null===s.small&&(s.small=en(8,8),s.small.texture.name="SplinePCSSPyramidSmall"),s.toMid=new Ga(rn(`SplinePCSSPyramidToMid${i}`,r,Math.ceil(i/64),i-1,!1,0)),s.toSmall=new Ga(rn("SplinePCSSPyramidToSmall",s.mid.texture,8,63,!0,0)),s.passKey=l),an();let o=e.getRenderTarget();e.setRenderTarget(s.mid),s.toMid.render(e),e.setRenderTarget(s.small),s.toSmall.render(e),e.setRenderTarget(o),hn.set(n,0,0),e.copyTextureToTexture(s.small.texture,tn.texture,null,hn),s.fresh=!0,T.pcssPyramidBuilds++}(this,d.shadow),a={slot:un(d.shadow),fresh:on(d.shadow)}),t&&Sn()&&(Rn(d.shadow,-1),this._maskLights.push({light:d,shadow:d.shadow}),(i||null==d.shadow.map)&&(this._maskBlocked=!0)),zn(d.shadow,d.data?.penumbraSize??.5,a)&&T.pcssPyramidActive++,!s){s=!0;let e=d.shadow;T.pcssRadius0=e.radius??-1,T.pcssPenumbra0=e.penumbraSize??-1}T.pcssLights++}if(!(n>=f))if(d.isPointLight||d.isSpotLight)kl.setFromMatrixPosition(d.matrixWorld),i[n].set(kl.x,kl.y,kl.z,0),n++;else if(d.isDirectionalLight&&d.target){d.target.updateMatrixWorld();let e=kl;e.setFromMatrixPosition(d.matrixWorld),e.sub(zl.setFromMatrixPosition(d.target.matrixWorld)).normalize(),i[n].set(e.x,e.y,e.z,1),n++}}),w.toonLightCount.value=n}_renderShadowMaskPass(e,t){let a=0;if(Sn()&&!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 Kn);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(Zl),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 ys(s,i,{depthBuffer:!1})),w.aoRenderTarget.value=this._aoRenderTarget.texture,this._hbao||(this._hbao=new wi);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:jr.getModeIndex({mode:e.fogMode}),fogDensity:e.fogDensity??jr.getDensity({}),fogHeightFalloff:e.fogHeightFalloff??jr.getHeightFalloff({}),fogHeightBase:e.fogHeightBase??jr.getHeightBase({})},this.pipeline.blueNoiseTexture,this._aoRenderTarget)}_renderNormalPass(e,t,a){let r=a.outline&&a.cavity?"both":a.cavity?"normals":"hash",s=this.getDrawingBufferSize(Zl),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 ys(i,n,{count:"both"===r?2:1,type:"normals"===r?ts:es,depthTexture:new ns(i,n)});"both"===r&&(e.textures[0].name="g0",e.textures[1].name="g1",e.textures[1].type=ts);for(let t of e.textures)t.minFilter=Ws,t.magFilter=Ws;return e});let l=this._encodeMaterials[r];if(void 0===l){this._depthContrastUniform??(this._depthContrastUniform=lr(1));let e=new bt;e.name=`SplineNormalPassEncode_${r}`;let t=it("randomColor","vec3"),a=()=>{let e=Ya($a),a=Ra.sub(.5).mul(this._depthContrastUniform).add(.5),r=qt(qt(t,e,.2),ae(a),.4);return ne(r,t.x)},s=()=>{let e=Ya(Wa),a=St(F,e,e.negate());return ne(a,t.x)};e.fragmentNode="both"===r?ba({g0:a(),g1:s()}):"normals"===r?s():a(),e.lights=!1,e.blending=Us,e.needsUpdate=!0,this._encodeMaterials[r]=e,l=e}this._depthContrastUniform.value=t instanceof zr?(t.far-t.near)/1e4:1;let o=e.overrideMaterial,u=this.getRenderTarget(),d=this.getClearColor(Al),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=Ea(_),t=new bt;t.name="SplineUICanvasBlit",t.fragmentNode=e.sample(U()),t.lights=!1,t.blending=Us,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,a={quad:new Ga(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=Ea(_),r=lr(new os(1,0)),s=new bt;s.name="SplineTransmissionPrefilter";let i=U(),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=ne(o,1),s.lights=!1,s.blending=Us,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,t={quad:new Ga(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(oo,"SplineTransmissionDownsample"),this._downsamplePasses[e]=t,t)}_buildDownsamplePassEntry(e,t){let a=Ea(_),r=lr(new os(1,1)),s=new bt;s.name=t;let i=U(),n=r,l=(e,t)=>a.sample(i.add(Y(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=ne(o,1),s.lights=!1,s.blending=Us,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,{quad:new Ga(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(Zl),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?lo:"off";this._transmissionTarget=this._reallocGrabTarget(this._transmissionTarget,s,i,()=>{let e=new ys(s,i,{depthBuffer:!0}),t=e.texture;return"off"===n?(t.generateMipmaps=!0,t.minFilter=Js):(t.generateMipmaps=!1,t.minFilter=Qs),t.magFilter=Qs,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 ys(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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 ys(s,i,{depthBuffer:!1}),a=e.texture;return a.minFilter=Js,a.magFilter=Qs,"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 bt;e.name="SplineReflectionDepthBlit";let t=Ea(this._reflectionTarget.depthTexture);e.fragmentNode=ne(ae(t.sample(U())),1),e.lights=!1,e.blending=Us,e.depthTest=!1,e.depthWrite=!1,e.needsUpdate=!0,r.push({quad:new Ga(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 bt;n.name=`SplineReflectionDepthMin${s}`;let l=Ea(this._reflectionDepthChain[s-1].texture),o=ft,u=Re(o.x).mul(2),d=Re(o.y).mul(2),h=(e,t)=>l.load($e(u.add(e),d.add(t))).x,m=(e,t)=>Dt(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=ne(ae(c),1),n.lights=!1,n.blending=Us,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,r.push({quad:new Ga(n)})}this._reflectionDepthPasses=r}_renderReflectionPass(e,t){let a=this.getDrawingBufferSize(Zl),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=Vr(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(_o&&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&&fo;this._reflectionTarget=this._reallocGrabTarget(this._reflectionTarget,l,o,()=>{let e=new ys(l,o,{depthTexture:new ns(l,o)});return d?(e.texture.generateMipmaps=!1,e.texture.minFilter=Qs):(e.texture.generateMipmaps=!0,e.texture.minFilter=Js),e.texture.magFilter=Qs,e});let h=(e,t)=>{let a=new ys(e,t,{depthBuffer:!1,type:es,format:xs});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ws,a.texture.magFilter=Ws,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(Pl);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 ys(l,o,{depthBuffer:!1}),t=e.texture;return t.minFilter=Js,t.magFilter=Qs,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 ys(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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;Nl.copy(s.center).applyMatrix4(e.matrixWorld);let o=t.projectionMatrix.elements[5]*a/2,u=1;!0===t.isPerspectiveCamera&&(Bl.setFromMatrixPosition(t.matrixWorld),u=Math.max(Nl.distanceTo(Bl),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&&yo&&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=Mr(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(Ll).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 ys(e,t,{type:ts,depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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 ys(l,o,{count:2,type:ts,depthTexture:new ns(l,o)});for(let t of e.textures)t.generateMipmaps=!1,t.minFilter=Ws,t.magFilter=Ws;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 bt;e.name="SplineReflectionGBuffer";let t=L("__splinePlanarMirror","float"),a=w.reflectionPlanarEnabled.greaterThan(.5),r=L("__srMode","float"),s=St(t.greaterThan(.5).and(a),ir(0),r);e.fragmentNode=ba({g0:ne(Ya(Wa),s),g1:ne(L("__srBlur","float"),L("__srThickness","float"),L("__srStepSize","float"),L("__srSteps","float"))}),e.lights=!1,e.blending=Us,e.needsUpdate=!0,this._reflectionGBufferMaterial=e}let u=this._skippedAsyncDraws??0,d=e.overrideMaterial,h=this.getRenderTarget(),m=this.getClearColor(El),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=lr(new Ts),i=lr(new Ts),n=lr(new Ts),l=lr(.1),o=this._reflectionGBufferTarget,u=Ea(o.textures[0]),d=Ea(o.textures[1]),h=Ea(o.depthTexture),m=Ea(e),c=Ea(this._reflectionDepthPyramid.texture),p=Ea(t),g=new bt;g.name="SplineReflectionResolve";let f=re(()=>{let e=ft,t=$e(Re(e.x),Re(e.y)),a=U(),r=u.load(t).toVar(),o=h.sample(a).toVar(),g=ne(0).toVar(),f=ir(0).toVar();return le(r.w.greaterThan(.5),()=>{let e=d.load(t).toVar(),u=Di(i,a.x,a.y,o),h=Oi({dials:{blur:e.x,thickness:e.y,stepSize:e.z,steps:Re(e.w),tracingMode:r.w.sub(1)},surface:{originView:u,normalV:Ya(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:ht(!1),noisePixel:Y(t),singleRay:{footprintOut:f}});g.assign(ne(h,f.add(1)))}),g});g.fragmentNode=f(),g.lights=!1,g.blending=Us,g.depthTest=!1,g.depthWrite=!1,g.needsUpdate=!0,this._reflectionResolveMarch={quad:new Ga(g),proj:s,projInv:i,camWorld:n,near:l};let _=Ea(this._reflectionResolveMarchTarget.texture),y=Ea(this._reflectionResolveBlurTmp.texture),x=e=>{let t=new bt;t.name=`SplineReflectionResolveBlur${e.toUpperCase()}`;let s="x"===e?_:y,i="x"===e?1/a:1/r,n=re(()=>{let t=U(),a=_.sample(t).toVar().w.sub(1).max(0).clamp(.5,12).toVar(),r=ne(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?Y(a.mul(l/6*i),0):Y(0,a.mul(l/6*i)),d=s.sample(t.add(u)).toVar(),h="x"===e?d.w.min(1):d.w;r.addAssign(ne(d.rgb,h).mul(o))}return r.div(n)});return t.fragmentNode=n(),t.lights=!1,t.blending=Us,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,new Ga(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&&Sr(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=Il,i=o*m*(u*c)):o<=l&&o<=u?(s=Fl,i=l*h*(u*c)):(s=Dl,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(Ul.copy(a.normalAxis).transformDirection(s),Ol.setFromMatrixPosition(s),Gl.setFromMatrixPosition(t.matrixWorld),ql.subVectors(Ol,Gl),ql.dot(Ul)>0&&Ul.negate(),ql.dot(Ul)>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(ql.subVectors(Ol,Gl),ql.reflect(Ul).negate(),ql.add(Ol),Wl.extractRotation(t.matrixWorld),Hl.set(0,0,-1).applyMatrix4(Wl).add(Gl),jl.subVectors(Ol,Hl),jl.reflect(Ul).negate(),jl.add(Ol),i.position.copy(ql),i.up.set(0,1,0).applyMatrix4(Wl),i.up.reflect(Ul),i.lookAt(jl),i.updateMatrixWorld(),i.projectionMatrix.copy(t.projectionMatrix),i.projectionMatrixInverse.copy(i.projectionMatrix).invert(),!0===t.isPerspectiveCamera){Kl.setFromNormalAndCoplanarPoint(Ul,Ol),Kl.applyMatrix4(i.matrixWorldInverse),$l.set(Kl.normal.x,Kl.normal.y,Kl.normal.z,Kl.constant);let e=i.projectionMatrix.elements;Xl.x=(Math.sign($l.x)+e[8])/e[0],Xl.y=(Math.sign($l.y)+e[9])/e[5],Xl.z=-1,Xl.w=(1+e[10])/e[14],$l.multiplyScalar(1/$l.dot(Xl)),e[2]=$l.x,e[6]=$l.y,e[10]=$l.z,e[14]=$l.w}let n=this.getDrawingBufferSize(Ql),l=Math.max(1,Math.round(n.x)),o=Math.max(1,Math.round(n.y)),u=!0===this.backend?.isWebGPUBackend&&go;this._planarTarget=this._reallocGrabTarget(this._planarTarget,l,o,()=>{let e=new ys(l,o);return u?(e.texture.generateMipmaps=!1,e.texture.minFilter=Qs):(e.texture.generateMipmaps=!0,e.texture.minFilter=Js),e.texture.magFilter=Qs,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 ys(l,o,{depthBuffer:!1}),a=t.texture;return a.minFilter=Js,a.magFilter=Qs,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 ys(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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(Zl),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 ys(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 bo();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 ys(e,t,{depthBuffer:!0})):(this._ciOffscreenTarget=new ys(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(),mr()?.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 sn){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)}sn.clear(),ln.fill(null),tn?.dispose(),tn=null,dn=!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 pl)e.deref()?.dispose();pl.clear(),gl++}(),function(){for(let e of _l){let t=e.deref();void 0!==t&&(t.sprite.removeFromParent(),t.material.dispose())}_l.clear(),yl++}(),this._taaHistory?.dispose(),this._taaHistory=void 0;for(let e of Object.values(this._encodeMaterials))e?.dispose();this._encodeMaterials={},this._bundledPages.clear(),this.pipeline.dispose(),this.dummyCamera.dispose(),super.dispose(),this._disposeRetiredGrabTargets(),w.transmissionRenderTarget.value=_,w.normalRenderTarget.value=_,w.aoRenderTarget.value=_,w.reflectionRenderTarget.value=y,w.reflectionDepthPyramid.value=y,w.reflectionEnvMap.value=y,w.reflectionPlanarTarget.value=y,w.reflectionPlanarEnabled.value=0,w.reflectionResolveTarget.value=x,w.reflectionResolveEnabled.value=0}},wo=To;wo._GAUGE_STALL_MS=3e3;var So=(e,t)=>e.element(t);function Vo(e){let t=e;return null!=t&&!0===t.isInstancedMesh&&null!=t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute}var Mo=new WeakMap;function Co(e){return ca.mul(function(e){let t=e.spInstanceMatrixNode;if(void 0!==t)return t;let a=e.object,r=a.instanceMatrix,s=Math.max(a.count??1,1);if(!0===r.isStorageInstancedBufferAttribute)return So(pa(r,"mat4",s),me);if(16*s*4<=e.getUniformBufferLimit())return So(S(r.array,"mat4",s),me);let i=Mo.get(r);void 0===i&&(i=new vs(r.array,16,1),Mo.set(r,i));let n=r.usage===Gs?Se:ve;return xt(n(i,"vec4",16,0),n(i,"vec4",16,4),n(i,"vec4",16,8),n(i,"vec4",16,12))}(e))}var Ro=re(e=>Vo(e.object)?ie:ue).once()().toVar("speObjectPosition"),zo=re(e=>{let t=e.material?.shapeBlendObjectNormal;return t||(Vo(e.object)?e.geometry.hasAttribute("normal")?La:ae(0,1,0):Ua)}).once()().toVar("speObjectNormal"),ko=(re(e=>Vo(e.object)?Co(e):ca).once()(),re(e=>{if(!Vo(e.object))return ta;let t=Co(e),a=e=>So(t,e).xyz;return ae(a(0).length(),a(1).length(),a(2).length()).toVarying("v_speModelScale")}).once()().toVar("speModelScale")),Ao=(re(e=>Vo(e.object)?gt(Co(e)).inverse().transpose():Zt).once()(),re(e=>Vo(e.object)?Co(e).inverse():_a).once()(),new WeakMap);function Po(e){if(Ao.has(e))return;let t={own:e.value,render:e.value};Ao.set(e,t),Object.defineProperty(e,"value",{configurable:!0,enumerable:!0,get:()=>t.render,set:e=>{t.render=e,t.own=e}})}function Eo(e){let t=Ao.get(e);return void 0!==t?t.own:e.value}function No(e,t){let a=Ao.get(e);void 0!==a?a.render=t:e.value=t}var Bo=class{constructor(e){this.layerId=e,this.uniforms={},this.byName=new Map,this.liveValues=new Map}set(e,t,a){return this.byName.set(e,t),this.uniforms[`f${this.layerId}_${e}`]=t,void 0!==a&&this.liveValues.set(e,a),this}has(e){return this.byName.has(e)}names(){return[...this.byName.keys()]}get(e){let t=this.byName.get(e);if(void 0===t)throw new Error(`TSLLayerParams: unknown param "${e}" (layer f${this.layerId})`);return t}getFloat(e){return this.get(e)}getInt(e){return this.get(e)}getBool(e){return this.get(e)}getVec2(e){return this.get(e)}getVec3(e){return this.get(e)}getVec4(e){return this.get(e)}getColor(e){return this.get(e)}getValue(e){if(this.liveValues.has(e))return this.liveValues.get(e);let t=this.byName.get(e);return void 0===t?void 0:Eo(t)}getLiveValue(e){return this.liveValues.get(e)}getNodeValue(e){let t=this.byName.get(e);return void 0===t?void 0:Eo(t)}setValue(e,t){let a=this.byName.get(e);void 0===a||void 0===t||(this.liveValues.has(e)&&this.liveValues.set(e,t),a.value=t)}};function Lo(e,t,a){let r=ir(e).toVar(),s=ir(qt(r.div(Ft(r.add(t.accumAlpha),ir(1e-5),ir(1))),r,a)).toVar();return t.accumAlpha.addAssign(nr(t.accumAlpha).mul(r).mul(nr(a))),s}function Io(e,t){let a=ir(e).toVar(),r=ir(a.div(Ft(a.add(t.accumAlpha),ir(1e-5),ir(1)))).toVar();return t.accumAlpha.addAssign(nr(t.accumAlpha).mul(a)),r}var Fo=0,Do=1,Uo=2,Oo=3,Go=re(e=>{let t=e.a.toVar(),a=e.b.toVar(),r=e.alpha.toVar(),s=e.mode,i=ae(1).toVar();return le(s.equal(Re(0)),()=>{i.assign(qt(t,a,r))}).ElseIf(s.equal(Re(1)),()=>{i.assign(qt(t,t.mul(a),r))}).ElseIf(s.equal(Re(2)),()=>{i.assign(qt(t,nr(nr(t).mul(nr(a))),r))}).ElseIf(s.equal(Re(3)),()=>{let e=da(t,ae(.5)),s=qt(nr(nr(t).mul(nr(a)).mul(2)),t.mul(a).mul(2),e);i.assign(qt(t,s,r).clamp(0,1))}),i});function qo(e,t,a,r){return Go({a:e,b:t,alpha:a,mode:r})}var Wo=new Map,Ho=new Set,jo=(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:ae(1,0,0),calpha:Io(r,a)}};function Ko(e,t){Wo.set(e,t)}function $o(e){let t=Wo.get(e);return void 0!==t?t:(Ho.has(e)||(Ho.add(e),console.warn(`[spe] Material layer type "${e}" is not available in this runtime build (no WebGPU port, or compiled out) — rendering flat red.`)),jo)}function Xo(e){return Wo.has(e)}var{diffuseContribution:Qo,specularColorBlended:Zo}=er,Yo=re(e=>{let t=Wa.dot(e.lightDirection),a=Y(t.mul(.5).add(.5),0),r=a.fwidth().mul(.5);return qt(ae(.7),ae(1),$t(ir(.7).sub(r.x),ir(.7).add(r.x),a.x))}),Jo=re(e=>{let t=e.lightDirection.add(be).normalize(),a=Wa.dot(t).clamp(),r=be.dot(t).clamp(),s=r.mul(-5.55473).sub(6.98316).mul(r).exp2(),i=Yt.mul(s.oneMinus()).add(s),n=ir(.25),l=Lt.mul(.5).add(1).mul(1/Math.PI).mul(a.pow(Lt));return i.mul(n).mul(l)});function eu(e){let t=w.aoRenderTarget.sample(vt).rgb,a=w.aoEnabledUniform;return null!==e&&(a=a.mul(St(e,ir(1),ir(0)))),qt(ae(1),t,a)}var tu,au=(tu=class extends Xt{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=Yo({lightDirection:t}).mul(a);r.directDiffuse.addAssign(s.mul(Pa.rgb.mul(1/Math.PI))),r.directSpecular.addAssign(s.mul(Jo({lightDirection:t})))}},class extends tu{constructor(){super(...arguments),this.aoOcclusionGate=null}finish(e,...t){super.finish?.call(this,e,...t);let{reflectedLight:a,outgoingLight:r}=e.context,s=eu(this.aoOcclusionGate),i=a.directDiffuse.add(a.indirectDiffuse);r.subAssign(i.mul(nr(s)))}}),ru=class extends la{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=Wa.dot(a.lightDirection).clamp().mul(a.lightColor),t=er.BRDF_Lambert({diffuseColor:Qo});return void a.reflectedLight.directDiffuse.addAssign(e.mul(t))}super.direct(e,t)}},su=e=>e,iu=[{a:"y",b:"z",pole:"x"},{a:"z",b:"x",pole:"y"},{a:"x",b:"y",pole:"z"}];function nu(e,t){return"x"===t?e.x:"y"===t?e.y:e.z}function lu(e,t){return Va(e,ae(t,1)).div(2).add(.5).xy}function ou(e,t,a){let r=ir(e.div(Ft(e.add(t.accumAlpha),ir(1e-5),ir(1)))).toVar();return t.accumAlpha.addAssign(nr(t.accumAlpha).mul(e).mul(nr(a))),r}function uu(e){let t=e.getValue("projection")??0,a=e.getValue("axis")??0,r=a>=0&&a<=2?a:0,s=e.getValue("projectionAxis")??-1,i=s>=0&&s<=2?s:1,n=e.get("mat"),l=e.getVec2("size");if(1===t){let e=Ro,t=0===r?e.zy:1===r?e.xz:e.xy,a=Y(t.add(1).div(2)).toVar();return{uvs:[Y(lu(n,a.mul(2).sub(1).div(l.mul(.5)))).toVar()],weights:null}}if(2===t){let e=ae(Ya(Ro)).toVar(),{a:t,b:a,pole:r}=iu[i],s=ir(We(nu(e,t),nu(e,a)).div(6.283).add(.5)).toVar(),l=ir(Ge(nu(e,r)).div(3.1415).add(.5)).toVar(),o=Y(s,l).toVar();return{uvs:[Y(lu(n,o.mul(2).sub(1))).toVar()],weights:null}}if(3===t){let e=ae(Ya(Ro)).toVar(),{a:t,b:a,pole:r}=iu[i],s=ir(We(nu(e,t),nu(e,a)).div(6.283).add(.5)).toVar(),o=ir(nu(Ro,r).div(l.y.mul(.5))).toVar(),u=ir(o.div(2).add(.5)).toVar(),d=Y(s,u).toVar();return{uvs:[Y(lu(n,d.mul(2).sub(1))).toVar()],weights:null}}if(4===t){let t=e.getFloat("blending"),a=ae(Ro).toVar(),r=Y(a.xy.add(1).div(2)).toVar(),s=Y(a.zy.add(1).div(2)).toVar(),i=Y(a.xz.add(1).div(2)).toVar();for(let e of[r,s,i])e.assign(lu(n,su(e.mul(2).sub(1).div(l.mul(.5)))));let o=ir(nr(t).mul(125).add(3)).toVar(),u=ae(zo).toVar(),d=ae(Ae(Ya(u))).toVar();return d.assign(ze(d,ae(o))),d.divAssign(Da(d,ae(1))),{uvs:[r,s,i],weights:d}}return{uvs:[Y(lu(n,U().mul(2).sub(1))).toVar()],weights:null}}var du=(e,t,a)=>{let r,s=e.getValue("projection")??0,i=e.getValue("axis")??0,n=i>=0&&i<=2?i:0,l=e.getValue("side")??0,o=e.get("texture"),u=e.getFloat("crop"),{uvs:d,weights:h}=uu(e),m=[...d],c=null;if(1===s){if(r=o.sample(d[0]),2!==l){let e=0===n?ae(1,0,0):1===n?ae(0,1,0):ae(0,0,1),t=Da(zo,e);c=da(ir(0),1===l?t.mul(-1):t)}}else if(2===s||3===s)r=function(e,t){if(e.value.minFilter===Ws&&e.value.magFilter===Ws)return e.sample(t);let a=Y(va(t)).toVar(),r=Y(Sa(t)).toVar();return a.x.subAssign(R(a.x.add(.5))),r.x.subAssign(R(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"):ir(1),g=ne(qt(ne(0,0,0,1),r,p)).toVar(),f=ae(g.rgb).toVar(),_=ir(t.alpha.mul(g.a)).toVar();return null!==c&&_.mulAssign(c),function(e,t,a){le(e.greaterThan(.5),()=>{for(let e of a)le(e.x.lessThan(0).or(e.x.greaterThan(1)).or(e.y.lessThan(0)).or(e.y.greaterThan(1)),()=>{t.assign(0)})})}(u,_,m),_.mulAssign(t.mask),{color:f,calpha:ou(_,a,t.isMask)}};function hu(e,t,a){let r=Y(t).toVar(),s=Y(va(r)).toVar(),i=Y(Sa(r)).toVar(),n=t=>a.mul(V(e.sample(t).rgb)),l=ir(n(r)).toVar(),o=ir(n(r.add(s)).sub(l)).toVar(),u=ir(n(r.add(i)).sub(l)).toVar();return Y(o,u)}function mu(e,t,a){let r=ae(va(e)).toVar(),s=ae(Sa(e)).toVar(),i=ae(Ya(t)).toVar(),n=ae(Ya(ma(s,i))).toVar(),l=ae(Ya(ma(i,r))).toVar(),o=ir(Da(r,n).mul(tr)).toVar(),u=ae(Ut(o).mul(a.x.mul(n).add(a.y.mul(l)))).toVar();return Ya(Ae(o).mul(i).sub(u))}function cu(e,t){let a,r=e.get("texture"),s=e.has("loaded")?e.getFloat("loaded"):ir(1),i=e=>{let a=r.sample(e),s="luminance"===t?V(a.rgb):a[t];return ir(s).toVar()},{uvs:n,weights:l}=uu(e);if(null!==l){let e=i(n[0]),t=i(n[1]),r=i(n[2]);a=e.mul(l.z).add(t.mul(l.x)).add(r.mul(l.y))}else a=i(n[0]);return qt(ir(1),a,s)}Ko("texture",du),Ko("video",du);var pu=ar,gu=he,fu=.1666667,_u=re(e=>{let t=e.c,a=Wt(Da(t,ae(17,59.4,15))).mul(4096),r=B(a.mul(512)),s=a.mul(.125),i=B(s.mul(512)),n=s.mul(.125),l=B(n.mul(512));return ae(i,l,r).sub(.5)}).setLayout({name:"spe_random3",type:"vec3",inputs:[{name:"c",type:"vec3"}]});function yu(e){return _u({c:e})}var xu=re(e=>{let t=e.p,a=R(t.add(Da(t,ae(.3333333)))).toVar(),r=t.sub(a).add(Da(a,ae(fu))).toVar(),s=da(ae(0),r.sub(r.yzx)).toVar(),i=s.mul(nr(s.zxy)).toVar(),n=nr(s.zxy.mul(nr(s))).toVar(),l=r.sub(i).add(fu).toVar(),o=r.sub(n).add(2*fu).toVar(),u=r.sub(1).add(3*fu).toVar(),d=ne(Da(r,r),Da(l,l),Da(o,o),Da(u,u)).toVar();d.assign(ne(.6).sub(d).max(0));let h=ne(Da(yu(a),r),Da(yu(a.add(i)),l),Da(yu(a.add(n)),o),Da(yu(a.add(1)),u)).toVar();return d.mulAssign(d),d.mulAssign(d),h.mulAssign(d),Da(h,ne(52))}).setLayout({name:"spe_simplexFast",type:"float",inputs:[{name:"p",type:"vec3"}]});function vu(e){return xu({p:e})}var bu=re(e=>{let t=e.m,a=gt(ae(-.37,.36,.85),ae(-.14,-.93,.34),ae(.92,.01,.4)),r=gt(ae(-.55,-.39,.74),ae(.33,-.91,-.24),ae(.77,.12,.63)),s=gt(ae(-.71,.52,-.47),ae(-.08,-.72,-.68),ae(-.7,-.45,.56));return vu(t.mul(a)).mul(.5333333).add(vu(t.mul(2).mul(r)).mul(.2666667)).add(vu(t.mul(4).mul(s)).mul(.1333333)).add(vu(t.mul(8)).mul(.0666667))}).setLayout({name:"spe_simplexFractal",type:"float",inputs:[{name:"m",type:"vec3"}]}),Tu=re(e=>{let t=e.x;return Kt(t.mul(34).add(1).mul(t),289)}).setLayout({name:"spe_permute",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function wu(e){return Tu({x:e})}var Su=re(e=>Ta(1.79284291400159,e.r.mul(.85373472095314))).setLayout({name:"spe_taylorInvSqrt",type:"vec4",inputs:[{name:"r",type:"vec4"}]});function Vu(e){return Su({r:e})}var Mu=re(e=>{let t=e.v,a=Y(1/6,1/3),r=ne(0,.5,1,2),s=R(t.add(Da(t,a.yyy))).toVar(),i=t.sub(s).add(Da(s,a.xxx)).toVar(),n=da(i.yzx,i.xyz).toVar(),l=nr(n).toVar(),o=Dt(n.xyz,l.zxy).toVar(),u=At(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(Kt(s,289));let c=wu(wu(wu(s.z.add(ne(0,o.z,u.z,1))).add(s.y).add(ne(0,o.y,u.y,1))).add(s.x).add(ne(0,o.x,u.x,1))).toVar(),p=r.wyz.mul(1/7).sub(r.xzx).toVar(),g=c.sub(R(c.mul(p.z).mul(p.z)).mul(49)).toVar(),f=R(g.mul(p.z)).toVar(),_=R(g.sub(f.mul(7))).toVar(),y=f.mul(p.x).add(p.yyyy).toVar(),x=_.mul(p.x).add(p.yyyy).toVar(),v=Ta(1,Ae(y)).sub(Ae(x)).toVar(),b=ne(y.xy,x.xy).toVar(),T=ne(y.zw,x.zw).toVar(),w=R(b).mul(2).add(1).toVar(),S=R(T).mul(2).add(1).toVar(),V=da(v,ne(0)).negate().toVar(),M=b.xzyw.add(w.xzyw.mul(V.xxyy)).toVar(),C=T.xzyw.add(S.xzyw.mul(V.zzww)).toVar(),z=ae(M.xy,v.x).toVar(),k=ae(M.zw,v.y).toVar(),A=ae(C.xy,v.z).toVar(),P=ae(C.zw,v.w).toVar(),E=Vu(ne(Da(z,z),Da(k,k),Da(A,A),Da(P,P))).toVar();z.mulAssign(E.x),k.mulAssign(E.y),A.mulAssign(E.z),P.mulAssign(E.w);let N=At(Ta(.6,ne(Da(i,i),Da(d,d),Da(h,h),Da(m,m))),0).toVar();return N.mulAssign(N),Da(N.mul(N),ne(Da(z,i),Da(k,d),Da(A,h),Da(P,m))).mul(42)}).setLayout({name:"spe_simplexAshima",type:"float",inputs:[{name:"v",type:"vec3"}]});function Cu(e){return Mu({v:e})}var Ru=re(e=>{let t=e.x;return t.sub(R(t.mul(1/289)).mul(289))}).setLayout({name:"spe_mod289",type:"vec4",inputs:[{name:"x",type:"vec4"}]}),zu=re(e=>{let t=e.x;return Ru({x:t.mul(34).add(1).mul(t)})}).setLayout({name:"spe_perm",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function ku(e){return zu({x:e})}var Au=re(e=>{let t=e.p,a=R(t).toVar(),r=t.sub(a).toVar();r.assign(r.mul(r).mul(Ta(3,r.mul(2))));let s=a.xxyy.add(ne(0,1,0,1)).toVar(),i=ku(s.xyxy).toVar(),n=ku(i.xyxy.add(s.zzww)).toVar().add(a.zzzz).toVar(),l=ku(n).toVar(),o=ku(n.add(1)).toVar(),u=B(l.mul(1/41)).toVar(),d=B(o.mul(1/41)).toVar().mul(r.z).add(u.mul(nr(r.z))).toVar(),h=d.yw.mul(r.x).add(d.xz.mul(nr(r.x))).toVar();return h.y.mul(r.y).add(h.x.mul(nr(r.y)))}).setLayout({name:"spe_valueNoise",type:"float",inputs:[{name:"p",type:"vec3"}]}),Pu=re(e=>{let t=ae(e.x).toVar(),a=ir(0).toVar(),r=ir(.5).toVar(),s=ae(100).toVar();return he(5,()=>{a.addAssign(r.mul(function(e){return Au({p:e})}(t))),t.assign(t.mul(2).add(s)),r.mulAssign(.5)}),a}).setLayout({name:"spe_fbm",type:"float",inputs:[{name:"x",type:"vec3"}]}),Eu=re(e=>{let t=e.t;return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"spe_fade",type:"vec3",inputs:[{name:"t",type:"vec3"}]}),Nu=re(e=>{let t=e.P,a=R(t).toVar(),r=a.add(ae(1)).toVar();a.assign(Kt(a,289)),r.assign(Kt(r,289));let s=B(t).toVar(),i=s.sub(ae(1)).toVar(),n=ne(a.x,r.x,a.x,r.x).toVar(),l=ne(a.yy,r.yy).toVar(),o=ne(a.zzzz).toVar(),u=ne(r.zzzz).toVar(),d=wu(wu(n).add(l)).toVar(),h=wu(d.add(o)).toVar(),m=wu(d.add(u)).toVar(),c=h.div(7).toVar(),p=B(R(c).div(7)).sub(.5).toVar();c.assign(B(c));let g=ne(.5).sub(Ae(c)).sub(Ae(p)).toVar(),f=da(g,ne(0)).toVar();c.subAssign(f.mul(da(0,c).sub(.5))),p.subAssign(f.mul(da(0,p).sub(.5)));let _=m.div(7).toVar(),y=B(R(_).div(7)).sub(.5).toVar();_.assign(B(_));let x=ne(.5).sub(Ae(_)).sub(Ae(y)).toVar(),v=da(x,ne(0)).toVar();_.subAssign(v.mul(da(0,_).sub(.5))),y.subAssign(v.mul(da(0,y).sub(.5)));let b=ae(c.x,p.x,g.x).toVar(),T=ae(c.y,p.y,g.y).toVar(),w=ae(c.z,p.z,g.z).toVar(),S=ae(c.w,p.w,g.w).toVar(),V=ae(_.x,y.x,x.x).toVar(),M=ae(_.y,y.y,x.y).toVar(),C=ae(_.z,y.z,x.z).toVar(),z=ae(_.w,y.w,x.w).toVar(),k=Vu(ne(Da(b,b),Da(w,w),Da(T,T),Da(S,S))).toVar();b.mulAssign(k.x),w.mulAssign(k.y),T.mulAssign(k.z),S.mulAssign(k.w);let A=Vu(ne(Da(V,V),Da(C,C),Da(M,M),Da(z,z))).toVar();V.mulAssign(A.x),C.mulAssign(A.y),M.mulAssign(A.z),z.mulAssign(A.w);let P=Da(b,s).toVar(),E=Da(T,ae(i.x,s.yz)).toVar(),N=Da(w,ae(s.x,i.y,s.z)).toVar(),L=Da(S,ae(i.xy,s.z)).toVar(),I=Da(V,ae(s.xy,i.z)).toVar(),F=Da(M,ae(i.x,s.y,i.z)).toVar(),D=Da(C,ae(s.x,i.yz)).toVar(),U=Da(z,i).toVar(),O=function(e){return Eu({t:e})}(s).toVar(),G=qt(ne(P,E,N,L),ne(I,F,D,U),O.z).toVar(),q=qt(G.xy,G.zw,O.y).toVar();return qt(q.x,q.y,O.x).toVar().mul(2.2)}).setLayout({name:"spe_perlin",type:"float",inputs:[{name:"P",type:"vec3"}]});function Bu(e){return Nu({P:e})}var Lu=re(e=>{let t=B(e.p3.mul(.1031)).toVar();return t.addAssign(Da(t,t.yzx.add(33.33))),B(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_hashwithoutsine13",type:"float",inputs:[{name:"p3",type:"vec3"}]}),Iu=re(e=>{let t=B(e.p3.mul(ae(.1031,.103,.0973))).toVar();return t.addAssign(Da(t,t.yxz.add(33.33))),B(t.xxy.add(t.yxx).mul(t.zyx))}).setLayout({name:"spe_hashwithoutsine33",type:"vec3",inputs:[{name:"p3",type:"vec3"}]});function Fu(e){return Iu({p3:e})}var Du=re(e=>{let{a:t,b:a,k:r}=e,s=$t(0,1,a.sub(t).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(nr(s)).toVar();return qt(a,t,s).sub(i)}).setLayout({name:"spe_smin",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Uu(e,t,a){return Du({a:e,b:t,k:a})}var Ou=re(e=>{let{a:t,b:a,k:r}=e,s=$t(1,0,t.sub(a).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(nr(s)).toVar();return qt(t,a,s).add(i)}).setLayout({name:"spe_smax",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Gu(e,t,a){return Ou({a:e,b:t,k:a})}var qu=re(e=>{let{value:t,input_min:a,input_max:r,output_min:s,output_max:i}=e,n=r.sub(a).toVar(),l=i.sub(s).toVar(),o=t.sub(a).div(n).toVar();return s.add(o.mul(l))}).setLayout({name:"spe_remap",type:"float",inputs:[{name:"value",type:"float"},{name:"input_min",type:"float"},{name:"input_max",type:"float"},{name:"output_min",type:"float"},{name:"output_max",type:"float"}]});function Wu(e,t,a,r,s){return qu({value:e,input_min:t,input_max:a,output_min:r,output_max:s})}var Hu=re(e=>{let{x:t,style:a,smoothness:r,seed:s,quality:i}=e,n=Ze(R(t)).toVar(),l=B(t).toVar(),o=ir(8).toVar(),u=ir(8).toVar(),d=ir(8).toVar(),h=ir(8).toVar(),m=ir(8).toVar(),c=ir(8).toVar(),p=Ze(0).toVar(),g=ae(0).toVar(),f=Re(i).toVar(),_=()=>({start:f.negate(),end:f,condition:"<=",type:"int"});gu(_(),_(),_(),({i:e,j:t,k:a})=>{let i=Ze(e,t,a).toVar(),d=ae(i).add(Fu(ae(n.add(i)).add(s))).sub(l).toVar(),m=et(d).toVar();o.assign(Uu(m,o,r)),le(m.lessThan(u),()=>{h.assign(u),u.assign(m),p.assign(Ze(e,t,a)),g.assign(d)}).ElseIf(m.lessThan(h),()=>{h.assign(m)})}),le(a.notEqual(Re(0)).and(a.notEqual(Re(5))).and(a.notEqual(Re(7))),()=>{gu(_(),_(),_(),({i:e,j:t,k:a})=>{let i=p.add(Ze(e,t,a)).toVar(),o=ae(i).add(Fu(ae(n.add(i)).add(s))).sub(l).toVar(),u=Da(g.add(o).mul(.5),o.sub(g)).toVar(),h=Da(g.add(o).mul(.5),Ya(o.sub(g))).toVar();m.assign(Uu(u,m,r)),c.assign(Dt(c,h));let f=Ze(e,t,a).toVar();le(De(pu(f,p)),()=>{let e=ae(f).add(Fu(ae(n.add(f)).add(s))).sub(l).toVar(),t=et(e).toVar();d.assign(Uu(t,d,r))})})});let y=ir(0).toVar();return le(a.equal(Re(0)),()=>{y.assign(o)}).ElseIf(a.equal(Re(1)),()=>{y.assign(d)}).ElseIf(a.equal(Re(2)),()=>{y.assign(d.sub(o))}).ElseIf(a.equal(Re(3)),()=>{let e=ir(3).toVar(),t=At(e.sub(Ae(u.sub(h))),0).div(e).toVar();y.assign(Dt(u,h).sub(t.mul(t).mul(e).mul(1/4)))}).ElseIf(a.equal(Re(4)),()=>{y.assign(Ka(m.mul(5)))}).ElseIf(a.equal(Re(5)),()=>{y.assign(ze(o,3))}).ElseIf(a.equal(Re(6)),()=>{let e=r.mul(.25).add(.0125).toVar(),t=ze(r,3).mul(.25).add(.0125).toVar();y.assign($t(e.sub(e.mul(t)),e.add(e.mul(t)),c))}).ElseIf(a.equal(Re(7)),()=>{y.assign(function(e){return Lu({p3:e})}(ae(n.add(p)).add(s)))}),y}).setLayout({name:"spe_voronoi",type:"float",inputs:[{name:"x",type:"vec3"},{name:"style",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"quality",type:"int"}]});function ju(e,t,a,r,s){return Hu({x:e,style:t,smoothness:a,seed:r,quality:s})}var Ku=[vu,function(e){return bu({m:e})},Cu,function(e){return Pu({x:e})},Bu],$u=e=>e,Xu=re(e=>{let t=e.v;return Ya(St(Ae(t.x).greaterThan(Ae(t.z)),ae(t.y.negate(),t.x,0),ae(0,t.z.negate(),t.y)))}).setLayout({name:"spe_displaceOrthogonal",type:"vec3",inputs:[{name:"v",type:"vec3"}]});function Qu(e,t,a,r){return e.add(t).mul(a).mul(.001).add(1e-4).add(r.mul(.1))}var Zu=new Map,Yu=re(e=>{let{n:t,scale:a,intensity:r,offset:s,movement:i,smoothness:n}=e,l=e.p,o=ir(ju(Qu(l,s,a,i),e.voronoiStyle,n,e.seed,e.quality)).toVar();return o.assign(Wu(o,e.lowCut,e.highCut,ir(0),ir(1))),o.assign(Gu(o,ir(0),n.mul(.25))),o.assign(Uu(o,ir(1),n.mul(.25))),l.add(t.mul(o).mul(r))}).setLayout({name:"spe_displaceVoronoi",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"},{name:"voronoiStyle",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"highCut",type:"float"},{name:"lowCut",type:"float"},{name:"quality",type:"int"}]});function Ju(e,t,a){let r=function(e,t){let a=Math.trunc(e.getValue("noiseType")??0),r={n:t,scale:e.getFloat("scale"),intensity:e.getFloat("intensity"),offset:e.getVec3("offset"),movement:e.getFloat("movement")};if(5===a)return t=>Yu({...r,p:t,voronoiStyle:e.getInt("voronoiStyle"),smoothness:e.getFloat("smoothness"),seed:e.getFloat("seed"),highCut:e.getFloat("highCut"),lowCut:e.getFloat("lowCut"),quality:e.getInt("quality")});let s=function(e){let t=Zu.get(e);if(void 0===t){let a=Ku[e]??Ku[0];t=re(e=>{let{n:t,scale:r,intensity:s,offset:i,movement:n}=e,l=e.p;return l.add(t.mul(a(Qu(l,i,r,n))).mul(s))}).setLayout({name:`spe_displaceScalar${e}`,type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"}]}),Zu.set(e,t)}return t}(a);return e=>s({...r,p:e})}(e,a),s=ae(r(t)).toVar(),i=ae(function(e){return Xu({v:e})}(a)).toVar(),n=Ya(ma(a,i)).toVar(),l=ae(r(t.add(i))).toVar(),o=ae(r(t.add(n))).toVar();return{position:s,normal:Ya(ma(l.sub(s),o.sub(s)))}}Ko("color",(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:e.getColor("color"),calpha:Io(r,a)}});var ed=e=>e,td=e=>e;Ko("depth",(e,t,a)=>{let r,s=e.get("colors"),i=e.get("steps"),n=(e.getValue("colors")??s.array).length,l=!0===e.getValue("smooth"),o=(e.getValue("isVector")??1)>.5,u=0===(e.getValue("gradientType")??0),d=(e.getValue("isWorldSpace")??0)>.5,h=e.getFloat("near"),m=e.getFloat("far");if(o){let t=e.getVec3("origin"),a=d?Ve:Ro;if(u){let s=Ya(e.getVec3("direction"));r=Da(s,a.sub(t))}else r=et(a.sub(t))}else r=et(Ve.sub(yt));let c=r.sub(h).div(m.sub(h)).toVar(),p=ne(s.element(0)).toVar();for(let e=1;e<n;e++){let t=ed(i.element(e-1)),a=ed(i.element(e)),r=Ft(c.sub(t).div(a.sub(t)),ir(0),ir(1)),n=l?$t(ir(0),ir(1),r):r;p.assign(qt(p,td(s.element(e)),n))}let g=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Lo(g,a,t.isMask)}}),Ko("cavity",(e,t,a)=>{let r=Ft(e.getFloat("ridge"),0,2),s=Ft(e.getFloat("valley"),0,2),i=w.normalViewRenderTarget,n=w.resolution,l=it("randomColor","vec3").x.toVar(),o=vt.toVar(),u=Y(ir(1).div(n.x),ir(1).div(n.y)).toVar(),d=(e,t)=>i.sample(o.add(Y(e,t)).toVar()).toVar(),h=d(ir(0),u.y.negate()),m=d(ir(0),u.y),c=d(u.x.negate(),ir(0)),p=d(u.x,ir(0)),g=e=>e.a.equal(l).and(Da(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=ir(.5).div(At(r.mul(r),ir(1e-4))).toVar(),x=ir(.7).div(At(s.mul(s),ir(1e-4))).toVar(),v=(e,t)=>St(e.lessThan(ir(.5).div(t)),e.mul(ir(1).sub(e.mul(t))),ir(.25).div(t)),b=St(f,St(_.greaterThan(0),v(_,y).mul(2),v(_.negate(),x).mul(-2)),ir(0)).toVar(),T=St(b.abs().lessThan(.001),ir(0),b).toVar(),S=ae(Ft(T.mul(.5).add(.5),0,1)),V=St(T.notEqual(0),ir(1),ir(0)),M=St(t.isMask,ir(1),V);return{color:S,calpha:Lo(t.alpha.mul(t.mask).mul(M),a,t.isMask)}}),Ko("dust",(e,t,a)=>{let r=e.getFloat("coverage"),s=e.getFloat("softness"),i=e.getFloat("noiseStrength"),n=e.getFloat("noiseScale"),l=Da(Ya($a),ae(0,1,0)),o=ir(0).toVar();le(i.notEqual(0),()=>{let e=vu(Ro.div(n).toVar().add(ae(1.7,9.2,1)));o.assign(e.mul(i))});let u=At(s,1e-4).toVar(),d=qt(u.add(1),u.add(1).negate(),Ft(r,0,1)).toVar(),h=$t(d.sub(u),d.add(u),l.add(o)).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Lo(h,a,t.isMask)}});var ad=(e,t)=>e.element(t);Ko("fresnel",(e,t,a)=>{let r=ad(Tt,2).w.equal(-1),s=ae(ad(kt,0).z,ad(kt,1).z,ad(kt,2).z).negate(),i=Ve.sub(yt),n=St(r,i,s),l=e.getFloat("bias").add(e.getFloat("scale").mul(ze(Ae(e.getFloat("factor").add(Da(Ya(n),Ya($a)))),e.getFloat("intensity")))),o=Ft(l,0,1).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Lo(o,a,t.isMask)}});var rd=e=>e,sd=e=>e;Ko("gradient",(e,t,a)=>{let r=e.get("colors"),s=e.get("steps"),i=(e.getValue("colors")??r.array).length,n=(e.getValue("steps")??s.array).length,l=Math.min(10,i,n),o=e.getInt("gradientType"),u=e.getBool("smooth"),d=e.getVec2("offset"),h=e.getVec2("morph"),m=e.getFloat("angle"),c=U(),p=ne(r.element(0)).toVar(),g=Y(h.div(c)).toVar(),f=Y(ir(.5).add(g.x),g.y).toVar(),_=Y(oa(m).mul(f.x).sub(Wt(m).mul(f.y)),Wt(m).mul(f.x).add(oa(m).mul(f.y))).toVar(),y=Y(c.sub(.5).add(d).div(2).add(_.div(2))),x=ir(Da(y,_).div(Da(_,_))).toVar();le(o.equal(Re(1)),()=>{x.assign(Ba(c.add(h).mul(3),c.add(d).add(1)).add(m))}).ElseIf(o.equal(Re(2)),()=>{let e=We(c.x.add(h.x).sub(.5).add(d.x),c.y.add(h.y).sub(.5).add(d.y)).mul(-1);x.assign(B(m.div(xe).div(-2).add(e.div(xe).mul(.5))))});for(let e=1;e<l;e++){let t=rd(s.element(e-1)),a=rd(s.element(e)),i=Ft(x.sub(t).div(a.sub(t)),ir(0),ir(1)),n=rd(St(u,$t(ir(0),ir(1),i),i));p.assign(qt(p,sd(r.element(e)),n))}let v=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Lo(v,a,t.isMask)}}),Ko("matcap",(e,t,a)=>{let r=e.getFloat("rotation"),s=Ya(_e.negate()),i=Ya(ae(s.z,0,s.x.negate())),n=ma(s,i),l=Y(Da(i,Wa),Da(n,Wa)),o=oa(r),u=Wt(r),d=Y(o.mul(l.x).sub(u.mul(l.y)),u.mul(l.x).add(o.mul(l.y))).mul(.495).add(.5),h=e.get("texture").sample(d),m=t.alpha.mul(t.mask);return{color:h.rgb,calpha:Lo(m,a,t.isMask)}}),Ko("noise",(e,t,a)=>{try{if("0"===new URLSearchParams(window.location.search).get("dbgnoise"))return{color:ae(0),calpha:ir(0)}}catch{}let r=Math.trunc(e.getValue("noiseType")??0),s=ir(At(Ae(e.getFloat("scale")),.001)).toVar(),i=ae(Ro.div(e.getVec3("size"))).toVar();i.divAssign(s);let n=e.getFloat("move"),l=e.getVec4("colorA"),o=e.getVec4("colorC"),u=ne(0).toVar();if(5===r){let t=e.getFloat("smoothness"),a=ir(ju(i.add(n),e.getInt("voronoiStyle"),t,e.getFloat("seed"),e.getInt("quality"))).toVar();a.assign(Wu(a,e.getFloat("lowCut"),e.getFloat("highCut"),ir(0),ir(1))),a.assign(Gu(a,ir(0),t.mul(.25))),a.assign(Uu(a,ir(1),t.mul(.25))),u.assign(qt(l,o,a))}else{let t=Ku[r]??Ku[0],a=e.getVec4("colorB"),s=e.getVec4("colorD"),d=ae(e.getVec2("distortion"),1).toVar(),h=ae(e.getVec2("fA"),1).toVar(),m=ae(e.getVec2("fB"),1).toVar(),c=ae(t(i),t(i.add(ae(1))),t(i.add(ae(1)))).toVar(),p=ae(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=ir(t(i.add(p))).toVar();u.assign(qt(l,a,Ft(g.mul(g).mul(4),ir(0),ir(1)))),u.assign(qt(u,o,Ft(et(c),ir(0),ir(1)))),u.assign(qt(u,s,Ft(et(p.x),ir(0),ir(1))))}let d=t.alpha.mul(u.a).mul(t.mask);return{color:Ft(u,ir(0),ir(1)).rgb,calpha:Lo(d,a,t.isMask)}}),Ko("normal",(e,t,a)=>({color:D(Ya(Wa)).mul(da(ae(.5),e.getVec3("cnormal"))),calpha:Io(t.alpha.mul(t.mask),a)}));var id=2*Math.PI,nd=Math.PI/180,ld=re(e=>{let t=B(e.p.xyx.mul(.1031)).toVar();return t.addAssign(Da(t,t.yzx.add(33.33))),B(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_pattern_hash12",type:"float",inputs:[{name:"p",type:"vec2"}]});function od(e){return ld({p:e})}var ud=re(e=>{let t=e.uv,a=.5,r=ir(e.a.mul(nd)).toVar(),s=Y(oa(r).mul(t.x.sub(a)).add(Wt(r).mul(t.y.sub(a))).add(a),oa(r).mul(t.y.sub(a)).sub(Wt(r).mul(t.x.sub(a))).add(a));return B(s)}).setLayout({name:"spe_pattern_rotate_uv",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"a",type:"float"}]});function dd(e,t){return ud({uv:e,a:t})}var hd=re(e=>{let t=Y(e.uv.mul(e.frequency)).toVar(),a=Y(R(t)).toVar(),r=ir(Kt(a.y,2)).toVar();t.x.addAssign(r.mul(e.zigzag));let s=Y(B(t)).toVar();s.assign(s.mul(2).sub(1)),a.assign(R(t));let i=ir(od(a).mul(5).add(1)).toVar(),n=ir(qt(ir(1),i,e.variation)).toVar();return s.mulAssign(n),s}).setLayout({name:"spe_pattern_tile_and_center",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"variation",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function md(e,t,a,r,s){return hd({uv:e,frequency:t,variation:a,zigzag:r,rotation:s})}var cd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,et(t).sub(e.size))}).setLayout({name:"spe_pattern_circle",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),pd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar(),a=ir(et(t)).toVar(),r=ir($t(e.smoothness.negate(),e.smoothness,a.sub(e.size))).toVar(),s=ir($t(e.smoothness.negate(),e.smoothness,a.sub(e.size.mul(.5)))).toVar();return r.add(nr(s))}).setLayout({name:"spe_pattern_ring",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),gd=re(e=>{let t=ir(ir(id).div(ir(e.n))).toVar(),a=ir(e.r.mul(ka(t.mul(.5)))).toVar(),r=Y(e.p.yx.negate()).toVar(),s=ir(t.mul(R(We(r.y,r.x).add(t.mul(.5)).div(t)))).toVar(),i=Y(oa(s),Wt(s)).toVar();return r.assign(Y(i.x.mul(r.x).add(i.y.mul(r.y)),i.y.negate().mul(r.x).add(i.x.mul(r.y)))),et(r.sub(Y(e.r,Ft(r.y,a.negate(),a)))).mul(Ut(r.x.sub(e.r)))}).setLayout({name:"spe_pattern_sdf_ngon",type:"float",inputs:[{name:"p",type:"vec2"},{name:"r",type:"float"},{name:"n",type:"int"}]}),fd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,gd({p:t,r:e.size,n:e.sides}))}).setLayout({name:"spe_pattern_polygon",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"},{name:"sides",type:"int"}]}),_d=re(e=>{let t=e.b,a=Y(Ae(e.p)).toVar();a.assign(St(a.y.greaterThan(a.x),a.yx,a.xy));let r=Y(a.sub(t)).toVar(),s=ir(At(r.y,r.x)).toVar(),i=Y(St(s.greaterThan(0),r,Y(t.y.sub(a.x),s.negate()))).toVar();return Ut(s).mul(et(At(i,Y(0)))).add(e.r)}).setLayout({name:"spe_pattern_sdf_cross",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"},{name:"r",type:"float"}]}),yd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,_d({p:t,b:Y(e.size,e.size.mul(.25)),r:e.smoothness}))}).setLayout({name:"spe_pattern_xcross",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),xd=re(e=>{let t=e.b,a=Y(Ae(e.p)).toVar(),r=Y(t.sub(a.mul(2))).toVar(),s=r.x.mul(t.x).sub(r.y.mul(t.y)),i=ir(Ft(s.div(Da(t,t)),ir(-1),ir(1))).toVar();return ir(et(a.sub(t.mul(.5).mul(Y(nr(i),i.add(1)))))).toVar().mul(Ut(a.x.mul(t.y).add(a.y.mul(t.x)).sub(t.x.mul(t.y))))}).setLayout({name:"spe_pattern_sdf_diamond",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"}]}),vd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,xd({p:t,b:Y(e.size)}))}).setLayout({name:"spe_pattern_diamond",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),bd=re(e=>{let t=Y(e.uv.mul(e.frequency)).toVar(),a=Y(R(t)).toVar(),r=ir(Kt(a.y,2)).toVar();t.x.addAssign(r.add(e.zigzag.mul(r)));let s=ir(R(t.x)).toVar();return Kt(s,2)}).setLayout({name:"spe_pattern_checkerboard",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Td=re(e=>{let t=Y(md(e.uv,e.frequency,ir(0),e.zigzag,e.rotation)).toVar(),a=ir(R(e.uv.mul(e.frequency)).y).toVar(),r=ir(od(Y(a))).toVar(),s=ir(qt(e.size,e.size.mul(r),e.variation)).toVar();return $t(s.sub(e.smoothness),s.add(e.smoothness),Ae(t.y))}).setLayout({name:"spe_pattern_line",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),wd=re(e=>{let{a:t,b:a,c:r,d:s}=e,i=Y(e.p.sub(Y(s,t)).mul(r)).toVar();i.x.assign(Kt(i.x,id)),le(i.x.greaterThan(Math.PI),()=>{i.x.assign(ir(id).sub(i.x))});let n=ir(0).toVar(),l=ir(id).toVar();he(24,()=>{let e=ir(n.add(l).mul(.5)).toVar(),t=ir(e.sub(i.x).add(a.mul(r).mul(Wt(e)).mul(i.y.sub(a.mul(r).mul(oa(e)))))).toVar();le(t.lessThan(0),()=>{n.assign(e)}).Else(()=>{l.assign(e)})});let o=ir(n.add(l).mul(.5)).toVar(),u=Y(o,a.mul(r).mul(oa(o))).toVar();return et(i.sub(u)).div(r)}).setLayout({name:"spe_pattern_udf_cos",type:"float",inputs:[{name:"p",type:"vec2"},{name:"a",type:"float"},{name:"b",type:"float"},{name:"c",type:"float"},{name:"d",type:"float"}]}),Sd=re(e=>{let t=ir(e.frequency.x).toVar(),a=Y(e.uv.mul(t)).toVar(),r=Y(R(a)).toVar(),s=ir(Kt(r.y,2)).toVar();a.x.addAssign(s.mul(e.zigzag));let i=Y(a.x,B(a.y)).toVar(),n=ir(e.frequency.y.mul(.1)).toVar(),l=ir(wd({p:i,a:ir(.5),b:ir(.125),c:n.mul(id),d:ir(0)})).toVar(),o=ir(od(Y(r.y))).toVar(),u=ir(qt(e.size,e.size.mul(o),e.variation)).toVar();return $t(e.smoothness.negate(),e.smoothness,l.sub(u.mul(.5)))}).setLayout({name:"spe_pattern_wave",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function Vd(e,t){let a={uv:t.uv,frequency:t.frequency,size:t.size,variation:t.variation,smoothness:t.smoothness,zigzag:t.zigzag,rotation:t.rotation};switch(e){case 1:return pd(a);case 2:return fd({...a,sides:t.sides});case 3:return yd(a);case 4:return vd(a);case 5:return bd(a);case 6:return Td(a);case 7:return Sd(a);default:return cd(a)}}Ko("pattern",(e,t,a)=>{let r,s,i=e.getValue("style")??0,n=e.getValue("projection")??0,l=e.getValue("axis")??0,o=e.getFloat("blending"),u=e.getVec2("offset"),d=e.getVec4("colorA"),h=e.getVec4("colorB"),m=e.getVec2("frequency"),c=e.getFloat("size"),p=e.getFloat("variation"),g=e.getFloat("smoothness"),f=e.getFloat("zigzag"),_=e.getFloat("rotation"),y=e.getVec2("vertical"),x=e.getVec2("horizontal"),v=e.getInt("sides"),b={frequency:m,size:c,variation:p,smoothness:ir(ze(g,5)).toVar(),zigzag:f,rotation:_,sides:v};if(4===n){let e=ae(Ro).toVar(),t=ir(.0125).toVar(),a=Y(B(e.xy.mul(t))).toVar(),n=Y(B(e.zy.mul(t))).toVar(),l=Y(B(e.xz.mul(t))).toVar();a.assign(dd(a.add(u),_)),n.assign(dd(n.add(u),_)),l.assign(dd(l.add(u),_));let d=ir(Vd(i,{uv:a,...b})).toVar(),h=ir(Vd(i,{uv:n,...b})).toVar(),m=ir(Vd(i,{uv:l,...b})).toVar(),c=ir(nr(o).mul(125).add(3)).toVar(),p=ae(zo).toVar(),g=ae(Ae(Ya(p))).toVar();g.assign(ze(g,ae(c))),g.divAssign(Da(g,ae(1))),d.mulAssign(g.z),h.mulAssign(g.x),m.mulAssign(g.y),r=ir(d.add(h).add(m)).toVar(),s=Y(a.mul(g.z).add(n.mul(g.x)).add(l.mul(g.y))).toVar()}else{let e=Y(0).toVar();if(0===n)e.assign(U());else if(2===n){let t,a,r=ae(Ro).toVar(),s=ir(et(r)).toVar();0===l?(t=ir(We(r.y,r.z)).toVar(),a=ir(Be(r.x.div(s))).toVar()):1===l?(t=ir(We(r.x,r.z)).toVar(),a=ir(Be(r.y.div(s))).toVar()):(t=ir(We(r.y,r.x)).toVar(),a=ir(Be(r.z.div(s))).toVar()),e.assign(Y(t,a).div(Math.PI))}e.addAssign(u),e.assign(B(e)),e.assign(dd(e,_)),r=Vd(i,{uv:e,...b}),s=e}let T=ne(qt(d,h,r)).toVar();T.a.assign(Ft(T.a,ir(0),ir(1))),T.a.mulAssign(da(y.x,s.y).mul(da(s.y,y.y))),T.a.mulAssign(da(x.x,Ae(s.x)).mul(da(Ae(s.x),x.y)));let w=t.alpha.mul(Ft(T.a,ir(0),ir(1))).mul(t.mask);return{color:Ft(T,ne(0),ne(1)).rgb,calpha:Lo(w,a,t.isMask)}});var Md=(e,t)=>e.element(t);Ko("rainbow",(e,t,a)=>{let r=e.getFloat("filmThickness"),s=e.getFloat("movement"),i=e.getVec3("wavelengths"),n=e.getFloat("noiseStrength"),l=e.getFloat("noiseScale"),o=e.getVec3("offset"),u=ir(0).toVar();!1!==t.noiseCompiledIn&&le(n.notEqual(0),()=>{let e=Ro.div(l).toVar(),t=vu(e.mul(1.6).add(ae(1.8,1.5,1.9).mul(vu(e))).add(ae(1.7,9.2,1)));u.assign(t.mul(n))});let d=i.mul(ae(1,.8,.6)).add(1),h=Md(Tt,2).w.equal(-1),m=ae(Md(kt,0).z,Md(kt,1).z,Md(kt,2).z).negate(),c=Ve.sub(yt),p=St(h,c,m),g=Da(Ya(p.add(o.mul(-.001))),Ya($a)),f=oa(r.add(u).div(d).mul(g).add(s)).mul(.5).add(.5),_=ae(Ft(f,0,2)).toVar(),y=Ft(_.r.add(_.g).add(_.b),0,1);return{color:_,calpha:Lo(t.alpha.mul(y).mul(t.mask),a,t.isMask)}});var Cd=e=>e,Rd=e=>e,zd=he,kd=he,Ad=re(e=>{let t=e.x,a=ae(Da(t,ae(127.1,311.7,74.7)),Da(t,ae(269.5,183.3,246.1)),Da(t,ae(113.5,271.9,124.6)));return B(Wt(a).mul(43758.5453123))}).setLayout({name:"spe_toonHash3",type:"vec3",inputs:[{name:"x",type:"vec3"}]}),Pd=re(e=>{let t=e.x,a=R(t).toVar(),r=B(t).toVar(),s=ir(100).toVar(),i=()=>({start:Re(-1),end:Re(1),condition:"<=",type:"int"});return kd(i(),i(),i(),({i:e,j:t,k:i})=>{let n=ae(e,t,i).toVar(),l=n.sub(r).add(function(e){return Ad({x:e})}(a.add(n))).toVar(),o=Da(l,l).toVar();le(o.lessThan(s),()=>{s.assign(o)})}),s.sqrt()}).setLayout({name:"spe_toonVoronoiF1",type:"float",inputs:[{name:"x",type:"vec3"}]});Ko("toon",(e,t,a)=>{let r=e.getInt("positioning"),s=e.get("colors"),i=e.get("steps"),n=e.getVec3("source"),l=e.getBool("isWorldSpace"),o=e.getFloat("noiseStrength"),u=e.getFloat("noiseScale"),d=e.getVec4("shadowColor"),h=e.getVec3("offset"),m=Ya($a).toVar(),c=ir(0).toVar();!0===a.lightsAvailable&&le(r.equal(Re(0)),()=>{zd({start:Re(0),end:w.toonLightCount,condition:"<",type:"int"},({i:e})=>{let t=w.toonLightData.element(e).toVar(),a=t.xyz,r=t.w,s=St(r.greaterThan(.5),Ya(a),Ya(a.sub(Ve))),i=Da(s,m).mul(.5).add(.5);c.assign(At(c,i))}),c.assign(Ft(c,0,1))}),le(r.equal(Re(1)),()=>{let e=qt(Ro,Ve,St(l,ir(1),ir(0))),t=Ya(n.sub(e));c.assign(Da(t,m).mul(.5).add(.5))}).ElseIf(r.equal(Re(2)),()=>{let e=yt.sub(h),t=Ya(e.sub(Ve));c.assign(Da(t,m).mul(.5).add(.5))}),le(o.greaterThan(0),()=>{let e=Ro.div(u),t=ir(1).sub(Pd({x:e}));c.addAssign(t.mul(o))}),c.assign(Ft(c,0,1));let p=(e.getValue("colors")??s.array).length,g=(e.getValue("steps")??i.array).length,f=Math.min(10,p,g),_=ne(s.element(0)).toVar();for(let e=1;e<f;e++){let t=Cd(i.element(e-1)),a=Cd(i.element(e)),r=Ft(c.sub(t).div(a.sub(t)),ir(0),ir(1));_.assign(qt(_,Rd(s.element(e)),$t(0,1,r)))}!0===a.lightsAvailable&&le(r.equal(Re(0)),()=>{let e=ir(1),t=qt(_.rgb,d.rgb,d.a);_.rgb.assign(qt(t,_.rgb,e))});let y=t.alpha.mul(_.a).mul(t.mask);return{color:_.rgb,calpha:Io(y,a)}});var Ed=e=>e,Nd=e=>e,Bd=e=>e,Ld=e=>e;Ko("transmission",(e,t,a)=>{let r=e.getFloat("thickness"),s=e.getFloat("ior"),i=e.getFloat("roughness"),n=w.transmissionRenderTarget,l=w.transmissionSamplerSize,o=e=>((e,t)=>kt.element(t))(0,e),u=Ya(ae(o(0).z.negate(),o(1).z.negate(),o(2).z.negate())),d=Ya(Ve.sub(yt)),h=w.orthographicUniform,m=St(h.greaterThan(.5),u,d).toVar(),c=Ya($a).toVar(),p=tt(m,c,ir(1).div(s)).toVar(),g=Ya(p).mul(r).mul(ko).toVar(),f=e=>{let t=w.unjitteredProjection.mul(kt).mul(ne(e,1)),a=t.xy.div(t.w);return Y(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5))},_=f(Ve.add(g).toVar()).toVar(),y=(f(Ve).toVar(),i.mul(Ft(s.mul(2).sub(2),ir(0),ir(1))).toVar()),x=mt(l.x).mul(y).toVar(),v=y,b=Dt(x.div(5.5),ir(8.5)).toVar(),T=null,S="fit",V=!0,M=!1,C=12,z="white",k=1;try{let e=new URLSearchParams(window.location.search),t=e.get("dbglod");null!==t&&(T=Number(t));let a=e.get("dbgtap");"ring"===a&&(S="ring"),("single"===a||"1"===a)&&(S="single"),("r50"===a||"r75"===a||"full"===a)&&(S=a),"singlewide"===a&&(S="singlewide"),("fit"===a||"singlefit"===a)&&(S="fit");let r=e.get("dbgwidth");null!==r&&Number.isFinite(Number(r))&&(k=Math.max(0,Number(r))),"6"===a&&(S="ring",C=6),"0"===e.get("dbgwarp")&&(V=!1),"1"===e.get("dbgdither")&&(M=!0);let s=e.get("dbgangle");("classic"===s||"0"===s)&&(z=s)}catch{}null!==T&&Number.isFinite(T)&&b.assign(ir(T));let A,P=(()=>{if("singlewide"===S)return Dt(b.add(1),ir(8.5)).toVar();if("fit"!==S)return b;let e=w.transmissionActualSize.x.div(w.resolution.x),t=v.mul(b).mul(5*k).mul(e).toVar();return Dt(mt(Za(b.mul(2)).add(t.mul(t).mul(3))).mul(.5),ir(8.5)).toVar()})(),E=e=>n.sample(V?(e=>{let t=w.transmissionActualSize.div(Za(R(P))),a=e.mul(t).sub(.5),r=R(a),s=a.sub(r),i=s.mul(s).mul(Y(3,3).sub(s.mul(2)));return r.add(.5).add(i).div(t)})(e):e).level(P).rgb,N="r50"===S?.5:"r75"===S?.75:1;if("single"===S||"singlewide"===S||"fit"===S)if("fit"===S){let e=R(P).toVar(),t=P.sub(e).toVar(),a=na(Za(t.mul(2)).sub(1)).mul(1.1547).toVar(),r=Y(Za(e)).div(w.transmissionActualSize).mul(a).toVar(),s=ae(0).toVar(),i=12;for(let t=0;t<i;t++){let a=Nd(Q(t,i,ir(0))),l=Nd(_.add(a.mul(r)));s.addAssign(Bd(Ld(n.sample(l).level(e)).rgb))}A=s.div(i).toVar()}else A=E(_).toVar();else{let e=Y(ir(1).div(w.resolution.x),ir(1).div(w.resolution.y)).toVar(),t=j("classic"===z?ft.xy.add(w.cameraJitterPx):ft.xy).mul(6.28318530718);"white"===z&&(t=t.add(w.tapAngle));let a=t.toVar(),r=w.tapAngle.mul(13.7).toVar(),s=w.tapAngle2.mul(5.3).toVar(),i=Y(Za(R(P).add(1))).div(w.transmissionActualSize).toVar(),n=j(ft.xy.add(Y(r,s))).toVar(),l=j(ft.xy.add(Y(s.mul(1.71),r.mul(2.39)))).toVar(),o=ae(0).toVar();for(let t=0;t<C;t++){let r=Nd(Q(t,C,a)).mul(e).mul(v).mul(b.mul(10)).mul(N),s=Nd(_.add(r));if(M){let e=Ed(B(n.add(.7548776662*t))),a=Ed(B(l.add(.5698402911*t))),r=Nd(Y(e.sub(.5),a.sub(.5)).mul(i));s=Nd(s.add(r))}o.addAssign(E(s))}A=o.div(C).toVar()}if(e.has("attenuationDistance")){let t=e.getFloat("attenuationDistance"),a=ae(e.getColor("attenuationColor")).toVar();le(t.greaterThan(0),()=>{let e=ze(At(a,ae(1e-4)),ae(r.div(t)));A.mulAssign(e)})}let L=t.alpha.mul(t.mask).toVar(),I=L.div(Ft(L.add(a.accumAlpha),ir(1e-5),ir(1))).toVar();return a.accumAlpha.addAssign(ir(1).sub(a.accumAlpha).mul(t.alpha)),{color:A,calpha:I}}),Ko("reflection",(e,t,a)=>{let r=e.getFloat("blur"),s=e.getFloat("thickness"),i=e.getInt("steps"),n=e.getFloat("stepSize"),l=e.getValue("tracingMode")??0,o=w.reflectionRenderTarget,u=w.reflectionDepthPyramid,d=w.reflectionDepthPyramid,h=w.reflectionDepthLevels,m=w.reflectionEnvMap,c=w.reflectionPlanarTarget,p=w.reflectionPlanarEnabled,g=L("__splinePlanarMirror","float"),f=p.greaterThan(.5).and(g.greaterThan(.5)),_=w.reflectionResolveTarget,y=w.reflectionResolveEnabled,x=w.orthographicUniform.greaterThan(.5),v=St(x,ae(0,0,-1),Ya(_e)).toVar(),b=Ya(Wa).toVar(),T=Ye(v,b).toVar(),S=Ft(r.mul(.1),ir(0),ir(1)).toVar(),V=w.resolution,M=ae(0).toVar(),C=y.greaterThan(.5).and(S.greaterThan(.05)).and(f.not()),R=Ya(Xa(T,Nt)).toVar(),z=Ui(m,R,S).toVar(),k=_.sample(vt).level(ir(0)).toVar();le(C,()=>{let e=k.a.toVar();M.assign(qt(z,k.rgb.div(e.max(1e-4)),Ft(e.mul(2),ir(0),ir(1))))}).Else(()=>{M.assign(Oi({dials:{blur:r,thickness:s,steps:i,stepSize:n,tracingMode:l},surface:{originView:_e,normalV:b,screenUv:vt,fragWindowZ:Ra},camera:{projectionMatrix:Tt,projectionMatrixInverse:Mt,worldMatrix:Nt,near:pt},resources:{colorMap:o,depthPyramid:u,depthPyramidNode:d,envMap:m},usePlanar:f,noisePixel:vt.mul(V).floor()}))}),le(f,()=>{let e=Y(ir(1).sub(vt.x),vt.y).toVar(),t=ir(h.sub(1)),a=Dt(mt(S.mul(V.y).mul(.075).add(1)),t).toVar(),r=a.sub(1).max(0).floor().toVar(),s=ir(2).pow(a).sub(1).max(0).toVar(),i=s.mul(.75).div(V.y).toVar();M.assign(Fi(c,e,i,s.mul(.75),r))});let A=t.alpha.mul(t.mask).toVar(),P=A.div(Ft(A.add(a.accumAlpha),ir(1e-5),ir(1))).toVar();return a.accumAlpha.addAssign(ir(1).sub(a.accumAlpha).mul(A)),{color:M,calpha:P}});var Id=e=>e,Fd=e=>e;function Dd(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=Ir[e.type];if(void 0!==r)for(let e of r)a.push(`${e}=${String(t[e])}`)}for(let[t,r]of e.uniformKinds)("vec4array"===r||"floatArray"===r)&&a.push(`${t}#${(e.params.getValue(t)??[]).length}`);if("rainbow"===e.type&&a.push(`noise=${!1!==e.noiseCompiledIn}`,`forced=${!0===e.noiseForced}`),"displace"===e.type&&a.push(`dt=${String(t.displacementType)}`),"texture"===e.type||"video"===e.type||"matcap"===e.type){if(0===e.holders.length)throw new Error(`structuralKey: ${e.type} layer has no holder`);let r=t.texture??{};a.push(`holder=${e.holders.map(e=>e.instanceId).join(",")}`,`wrap=${String(r.wrapping)}`,`min=${String(r.minFilter)}`,`mag=${String(r.magFilter)}`)}return a.join(";")}Ko("outline",(e,t,a)=>{let r=e.getColor("outlineColor"),s=e.getColor("contourColor"),i=e.getFloat("outlineWidth"),n=e.getFloat("contourWidth"),l=e.getFloat("outlineThreshold"),o=e.getFloat("contourThreshold"),u=e.getFloat("outlineSmoothing"),d=e.getFloat("contourFrequency"),h=e.getVec3("contourDirection"),m=e.getBool("positionalLines"),c=e.getBool("compensation"),p=w.normalRenderTarget,g=w.normalRenderTargetDepth,f=w.resolution,_=w.pixelRatio,y=it("randomColor","vec3").x.toVar(),x=Ra.toVar(),v=vt.toVar(),b=Y(ir(1).div(f.x),ir(1).div(f.y)).toVar(),T=w.pcssHalton,S=j(ft.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]],R=e=>Q(e,9,S).mul(b),z=[],k=ir(0).toVar();for(let e=0;e<9;e++){let[t,a]=C[e],r=4===e?v:Id(v.add(Y(M.x.mul(t),M.y.mul(a))).add(R(e))),s=Id(r).toVar(),i=Fd(p.sample(s)).toVar();z.push(i),le(i.a.notEqual(y).and(i.a.notEqual(0)),()=>{let e=g.sample(s).r.add(1e-4);le(x.greaterThan(e),()=>{k.assign(1)})})}let A=z[2].rgb.add(z[5].rgb.mul(2)).add(z[8].rgb).sub(z[0].rgb.add(z[3].rgb.mul(2)).add(z[6].rgb)),P=z[0].rgb.add(z[1].rgb.mul(2)).add(z[2].rgb).sub(z[6].rgb.add(z[7].rgb.mul(2)).add(z[8].rgb)),E=na(Da(A,A).add(Da(P,P))).mul(k.oneMinus()).toVar(),N=ae(r).toVar(),L=$t(l.sub(u),l.add(u),E).toVar(),I=Ya($a).toVar(),F=ir(1).sub(o).toVar();le(m,()=>{let e=Ro.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=B(t.mul(d).mul(.01)),r=G(t.mul(d)),i=$t(r.mul(n.mul(.01)),r.mul(n.mul(.02)),a).toVar();le(i.lessThan(1).and(L.equal(0)),()=>{N.assign(s),L.assign(1)})}).Else(()=>{let e=I.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=G(t.mul(o)).toVar(),r=Wt(t.mul(d)).toVar(),i=$t(ir(0),a.mul(n),ir(1).sub(r)).toVar();le(a.greaterThan(F.mul(.5)).and(i.lessThan(1)).and(L.equal(0)),()=>{N.assign(s),L.assign(ir(1).sub(i))})});let D=t.alpha.mul(L).mul(t.mask).toVar(),U=D.div(Ft(D.add(a.accumAlpha),ir(1e-5),ir(1))).toVar();return a.accumAlpha.addAssign(ir(1).sub(a.accumAlpha).mul(D)),{color:N,calpha:U}}),Ko("vertexColor",(e,t,a)=>{let r=pe(),s=t.alpha.mul(t.mask).mul(r.a);return{color:r.rgb,calpha:Io(s,a)}});var Ud=e=>e,Od=e=>e;function Gd(e,t=1){let a=new Ss(e);return new Dr(a.r,a.g,a.b,t)}function qd(e,t){if(e instanceof Dr)return e;if(e instanceof Ss)return new Dr(e.r,e.g,e.b,1);if("number"==typeof e)return Gd(e);if("object"==typeof e&&null!==e&&"r"in e&&"g"in e&&"b"in e){let t=e;return new Dr(t.r,t.g,t.b,t.a??1)}return t()}function Wd(){let e=new Array(10).fill(new _s(0,0,0,1)).map(e=>e.clone());return e[1]=new _s(1,1,1,1),e}function Hd(){let e=new Array(10).fill(1);return e[0]=0,e}var jd={color:{color:{kind:"color",def:()=>Gd(Qr)}},vertexColor:{},cavity:{ridge:{kind:"float",def:()=>1},valley:{kind:"float",def:()=>1}},fresnel:{color:{kind:"color",def:()=>Gd(16777215)},bias:{kind:"float",def:()=>.1},scale:{kind:"float",def:()=>1},intensity:{kind:"float",def:()=>2},factor:{kind:"float",def:()=>1}},dust:{color:{kind:"color",def:()=>Gd(10323813)},coverage:{kind:"float",def:()=>.2},softness:{kind:"float",def:()=>.2},noiseStrength:{kind:"float",def:()=>.2},noiseScale:{kind:"float",def:()=>1}},rainbow:{filmThickness:{kind:"float",def:()=>30},movement:{kind:"float",def:()=>0},wavelengths:{kind:"vec3",def:()=>new ds},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},offset:{kind:"vec3",def:()=>new ds}},transmission:{thickness:{kind:"float",def:()=>10},ior:{kind:"float",def:()=>1.5},roughness:{kind:"float",def:()=>.5},attenuationColor:{kind:"color",def:()=>Gd(16777215)},attenuationDistance:{kind:"float",def:()=>0}},reflection:{blur:{kind:"float",def:()=>0},thickness:{kind:"float",def:()=>.001},steps:{kind:"int",def:()=>60},stepSize:{kind:"float",def:()=>.005},tracingMode:{kind:"int",def:()=>1}},toon:{positioning:{kind:"int",def:()=>0},colors:{kind:"vec4array",def:Wd},steps:{kind:"floatArray",def:Hd},source:{kind:"vec3",def:()=>new ds},isWorldSpace:{kind:"bool",def:()=>!0},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},shadowColor:{kind:"colorVec4",def:()=>new Dr(0,0,0,0)},offset:{kind:"vec3",def:()=>new ds}},outline:{outlineColor:{kind:"color",def:()=>Gd(16777215)},contourColor:{kind:"color",def:()=>Gd(16777215)},outlineWidth:{kind:"float",def:()=>.1},contourWidth:{kind:"float",def:()=>.1},outlineThreshold:{kind:"float",def:()=>.1},contourThreshold:{kind:"float",def:()=>.1},outlineSmoothing:{kind:"float",def:()=>.1},contourFrequency:{kind:"float",def:()=>.1},contourDirection:{kind:"vec3",def:()=>new ds(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 ds},direction:{kind:"vec3",def:()=>new ds(1,0,0)},colors:{kind:"vec4array",def:()=>[new _s(0,0,0,1),new _s(1,1,1,1)]},steps:{kind:"floatArray",def:()=>[0,1]}},noise:{scale:{kind:"float",def:()=>1},size:{kind:"vec3",def:()=>new ds(100,100,100)},move:{kind:"float",def:()=>1},fA:{kind:"vec2",def:()=>new os(1.7,9.2)},fB:{kind:"vec2",def:()=>new os(8.3,2.8)},distortion:{kind:"vec2",def:()=>new os(1,1)},colorA:{kind:"colorVec4",def:()=>new Dr(.4,.4,.4,1)},colorB:{kind:"colorVec4",def:()=>new Dr(.4,.4,.4,1)},colorC:{kind:"colorVec4",def:()=>new Dr(1,1,1,1)},colorD:{kind:"colorVec4",def:()=>new Dr(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 ds(1,1,1)}},gradient:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},colors:{kind:"vec4array",def:Wd},steps:{kind:"floatArray",def:Hd},offset:{kind:"vec2",def:()=>new os},morph:{kind:"vec2",def:()=>new os},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 os},colorA:{kind:"colorVec4",def:()=>new Dr(0,0,0,1)},colorB:{kind:"colorVec4",def:()=>new Dr(1,1,1,1)},frequency:{kind:"vec2",def:()=>new os(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 os(0,1)},horizontal:{kind:"vec2",def:()=>new os(0,1)},sides:{kind:"int",def:()=>6}}},Kd=new _s;function $d(e,t){let a=e.material;if((null==a||!0!==a.isTSLNodeMaterial)&&(a=e.object?.material,null==a||!0!==a.isTSLNodeMaterial))return t;if("light"===t.kind){let e=a.lightLayer;if(null==e)return t;let r=e.data?.category,s=t.data?.category;return r===s?e:t}let r=a.layers?.[t.structIndex];return void 0!==r&&r.type===t.type?r:t}function Xd(e,t){if("number"!=typeof t||!Number.isInteger(t)||t<0)throw new Error(`[spe] ${e}.element() needs a build-time constant index (got ${String(t)}). Array params are inlined as per-slot uniforms; a dynamic index needs a real uniformArray.`);return t}function Qd(e,t,a,r){let s,i,n=e.params;switch(a){case"float":s=lr(Number(r??0));break;case"int":s=lr(Number(r??0),"int");break;case"axis":s=lr(["x","y","z"].indexOf(String(r)),"int");break;case"bool":s=lr(!!r);break;case"vec2":s=lr(r instanceof os?r:new os);break;case"vec3":s=lr(r instanceof ds?r:new ds);break;case"vec4":s=lr(r instanceof _s?r:new _s);break;case"color":{let e=qd(r,()=>Gd(16777215));s=lr(e),i=e;break}case"colorVec4":{let a=qd(r,()=>new Dr(1,1,1,1)),n=new _s(a.r,a.g,a.b,a.a),l=lr(n);l.onObjectUpdate(r=>{let s=$d(r,e).params.getLiveValue(t)??a;n.set(s.r,s.g,s.b,s.a)}),s=l,i=a;break}case"vec4array":{let a=Array.isArray(r)?r:[];s=function(e,t,a){let r=new Map;return{element(s){let i=Xd(t,s),n=r.get(i);if(void 0===n){let s=lr(a[i]??new _s);s.onObjectUpdate(r=>($d(r,e).params.getValue(t)??a)[i]??Kd),n=s,r.set(i,n)}return n},array:a,get value(){return a},set value(e){if(Array.isArray(e))for(let t=0;t<Math.min(a.length,e.length);t++){let r=e[t];Array.isArray(r)?a[t].set(r[0]??0,r[1]??0,r[2]??0,r[3]??1):r&&"object"==typeof r&&a[t].set(r.x??0,r.y??0,r.z??0,r.w??1)}}}}(e,t,a.length>0?a:[new _s]),i=a;break}case"floatArray":{let a=Array.isArray(r)?r:[0];s=function(e,t,a){let r=new Map;return{element(s){let i=Xd(t,s),n=r.get(i);if(void 0===n){let s=lr(a[i]??0);s.onObjectUpdate(r=>{let s=$d(r,e).params.getValue(t);return Number((s??a)[i]??0)}),n=s,r.set(i,n)}return n},array:a,get value(){return a},set value(e){if(Array.isArray(e))for(let t=0;t<Math.min(a.length,e.length);t++)a[t]=Number(e[t])}}}(e,t,a.length>0?a:[0]),i=a;break}}"vec4array"!==a&&"floatArray"!==a&&"colorVec4"!==a&&(Po(s),s.onObjectUpdate(a=>{let r=$d(a,e).params.getValue(t);void 0!==r&&No(s,r)})),n.set(t,s,i),e.uniformKinds.set(t,a)}var Zd=class{constructor(e,t,a,r){this.repeat=e,this.offset=t,this.rotation=a,this.target=r,this.updateMatrix()}updateMatrix(){this.target.setUvTransform(this.offset[0],this.offset[1],this.repeat[0],this.repeat[1],0,0,0).premultiply((new hs).makeRotation(this.rotation*is.DEG2RAD))}},Yd=class{constructor(e,t,a,r){this.kind=e,this.id=t,this.uuid=a,this.data=r,this.uniformKinds=new Map,this.holders=[],this.structIndex=-1,this.params=new Bo(t)}get type(){return this.data.type}get uniforms(){return this.params.uniforms}get alphaNode(){return this.params.getFloat("alpha")}get modeNode(){return this.params.getInt("mode")}get isMaskNode(){return this.params.getFloat("isMask")}get isMaskEnabled(){return"isMask"in this.data&&!!this.data.isMask}hasValue(e){return this.params.has(e)}setValue(e,t){if("noiseStrength"===e&&!1===this.noiseCompiledIn&&"number"==typeof t&&0!==t&&void 0!==this.onNoiseMismatch){let a=this.onNoiseMismatch;return this.onNoiseMismatch=void 0,this.params.setValue(e,t),void(a(t)&&(this.noiseCompiledIn=!0))}this.params.setValue(e,t)}getNode(e){return this.params.has(e)?this.params.get(e):void 0}getValue(e){return this.params.getValue(e)}getName(e){let t=/f\d+_(.*)/.exec(e);if(t&&t.length>1)return t[1];console.log(`Layer.getName: error ${e}`)}getNames(){return this.params.names()}get assetsLoaded(){return this.holders.every(e=>e.loaded)}dispose(){for(let e of this.holders)e instanceof Gr||e.deref();this.holders.length=0}},Jd=class extends Yd{constructor(e,t,a){super("light",e,t,a),this.node={alphaOverride:void 0,alpha:{value:1}}}get lightData(){return this.data}get category(){return this.lightData.category??"phong"}};function eh(e,t){let a=e.data;"displace"!==a.type?("alpha"in a&&e.params.has("alpha")&&e.params.setValue("alpha",Nr(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",(Br(a.intensity,t)??1)*(a.visible?1:0))}function th(e,t){Qd(e,"alpha","float",t.alpha??1),Qd(e,"mode","int",t.mode??0),Qd(e,"isMask","float",t.isMask?1:0)}function ah(e,t,a,r){let s=new Jd(e,t,a),i=a;if(Qd(s,"alpha","float",Nr(i.alpha,r)),Qd(s,"mode","int",i.mode??0),Qd(s,"bumpMapIntensity","float",i.bumpMapIntensity??5),Qd(s,"alphaOverride","float",Nr(i.alphaOverride,r)),a.visible)if("lambert"===i.category)Qd(s,"emissive","color",r.color(i.emissive)??Gd(0)),Qd(s,"occlusion","bool",i.occlusion??!0);else if("toon"===i.category)Qd(s,"shininess","float",i.shininess??30),Qd(s,"specular","color",r.color(i.specular)??Gd(1118481));else if("physical"===i.category){Qd(s,"roughness","float",i.roughness??.3),Qd(s,"metalness","float",i.metalness??0),Qd(s,"reflectivity","float",i.reflectivity??.5),Qd(s,"occlusion","bool",i.occlusion??!0),Qd(s,"normalScale","float",i.normalScale??1),Qd(s,"aoMapIntensity","float",i.aoMapIntensity??1),Qd(s,"emissive","color",void 0!==i.emissive?r.color(i.emissive)??Gd(0):Gd(0)),Qd(s,"emissiveIntensity","float",i.emissiveIntensity??1);let e=i;void 0!==e.clearcoat&&(Qd(s,"clearcoat","float",e.clearcoat),Qd(s,"clearcoatRoughness","float",e.clearcoatRoughness??.1)),void 0!==e.sheen&&(Qd(s,"sheen","float",e.sheen),Qd(s,"sheenColor","color",void 0!==e.sheenColor?r.color(e.sheenColor)??Gd(16777215):Gd(16777215)),Qd(s,"sheenRoughness","float",e.sheenRoughness??.5)),void 0!==e.ior&&(Qd(s,"ior","float",e.ior),Qd(s,"specularIntensity","float",e.specularIntensity??1),Qd(s,"specularColor","color",void 0!==e.specularColor?r.color(e.specularColor)??Gd(16777215):Gd(16777215))),void 0!==e.iridescence&&(Qd(s,"iridescence","float",e.iridescence),Qd(s,"iridescenceIOR","float",e.iridescenceIOR??1.3),Qd(s,"iridescenceThickness","float",e.iridescenceThickness??400))}else Qd(s,"shininess","float",i.shininess??30),Qd(s,"specular","color",void 0!==i.specular?r.color(i.specular)??Gd(1118481):Gd(1118481)),Qd(s,"occlusion","bool",i.occlusion??!0);return s.node.alphaOverride=s.params.get("alphaOverride"),eh(s,r),s}function rh(e,t,a,r){let s=new Yd("fragment",e,t,a),i="texture"===a.type?null!=a.texture.image?r.uiBuffer(a.texture.image)??r.image(a.texture.image):r.getImage(""):"video"===a.type?r.video(a.texture.video):null!=a.texture.image?r.image(a.texture.image):r.getImage("");s.holders.push(i);let n=a.texture.wrapping??("texture"===a.type?1e3:1001),l=function(e,t,a,r){let s=Ea(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=Br(a.texture.rotation??0,r)??0;if("matcap"===a.type)Qd(s,"rotation","float",o*is.DEG2RAD);else{let e=lr(new os(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=lr(i.loaded||i.isBuffer?1:0);t.onRenderUpdate(()=>i.loaded||i.isBuffer?1:0),s.params.set("loaded",t),s.uniformKinds.set("loaded","float"),Qd(s,"crop","float",a.crop?1:0),Qd(s,"projection","int",a.projection??0),Qd(s,"axis","axis",a.axis),Qd(s,"projectionAxis","axis",a.projectionAxis),Qd(s,"side","int",a.side??0);let l=a.size?new os(Br(a.size[0],r)??0,Br(a.size[1],r)??0):new os(100,100);Qd(s,"size","vec2",l),Qd(s,"blending","float",a.blending??0);let u=new hs,d=new Zd([Br(a.texture.repeat?.[0]??1,r)??1,Br(a.texture.repeat?.[1]??1,r)??1],[Br(a.texture.offset?.[0]??0,r)??0,Br(a.texture.offset?.[1]??0,r)??0],o,u),h=lr(u);Po(h),h.onObjectUpdate(e=>{let t=$d(e,s).params.getNodeValue("mat");void 0!==t&&No(h,t)}),s.params.set("mat",h,d)}return th(s,{alpha:Nr(a.alpha,r),mode:a.mode??0,isMask:a.isMask??!1}),eh(s,r),s}function sh(e,t,a,s){if("light"===a.type)return ah(e,t,a,s);if("texture"===a.type||"video"===a.type||"matcap"===a.type)return rh(e,t,a,s);if("displace"===a.type)return function(e,t,a,r){if("noise"!==a.displacementType)throw new Error;let s=new Yd("vertex",e,t,a),i=(e,t)=>Br(e,r)??t;return Qd(s,"offset","vec3",new ds(...a.offset.map(e=>i(e,0)))),Qd(s,"scale","float",i(a.scale,10)),Qd(s,"intensity","float",i(a.intensity,8)),Qd(s,"movement","float",i(a.movement,1)),Qd(s,"noiseType","int",a.noiseType??0),Qd(s,"voronoiStyle","int",a.voronoiStyle??0),Qd(s,"smoothness","float",i(a.smoothness,.5)),Qd(s,"seed","float",i(a.seed,0)),Qd(s,"highCut","float",i(a.highCut,1)),Qd(s,"lowCut","float",i(a.lowCut,0)),Qd(s,"quality","int",Br(a.quality,r)??1),eh(s,r),s}(e,t,a,s);let i=new Yd("fragment",e,t,a),n=r(a,s),l=jd[a.type]??jd.color;for(let[e,t]of Object.entries(l))Qd(i,e,t.kind,n[e]??t.def());if("transmission"===a.type){let e=typeof window<"u"?window.innerWidth:1,t=typeof window<"u"?window.innerHeight:1;Qd(i,"aspectRatio","vec2",e>=t?new os(t/e,1):new os(1,e/t))}return th(i,n),eh(i,s),i}var ih={displace_noise:[{nums:["intensity","scale","movement","smoothness","seed","highCut","lowCut"],vecs:["offset"]}],displace_map:[{nums:["intensity"],vecs:[]}],depth:[{nums:["near","far"],vecs:["origin","direction"]}],cavity:[{nums:["ridge","valley"],vecs:[]}],fresnel:[{nums:["bias","scale","intensity","factor"],vecs:[]}],dust:[{nums:["coverage","softness","noiseStrength","noiseScale"],vecs:[]}],rainbow:[{nums:["filmThickness","movement","noiseStrength","noiseScale"],vecs:["offset","wavelengths"]}],noise:[{nums:["scale","move","seed","highCut","lowCut","smoothness"],vecs:["size","distortion","fA","fB"]}],pattern:[{nums:["blending","size","variation","smoothness","zigzag","rotation"],vecs:["offset","frequency","vertical","horizontal"]}],outline:[{nums:["outlineWidth","contourWidth","outlineThreshold","contourThreshold","outlineSmoothing","contourFrequency"],vecs:["contourDirection"]}],toon:[{nums:["noiseStrength","noiseScale"],vecs:["offset","source"]}],transmission:[{nums:["roughness","thickness","ior"],vecs:[]}],reflection:[{nums:["blur","thickness","steps","stepSize"],vecs:[]}],texture:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],video:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],gradient:[{nums:["angle"],vecs:["offset","morph"]}],matcap:[{nums:["rotation"],vecs:[],path:["texture"]}]},nh=class extends bt{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=Si.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){Vi.add(e)}(this),this.addEventListener("dispose",()=>function(e){Vi.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(${Dd(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(Dd(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 zi?Si.version:0,a=this.physicalLobes();return`${e}|env${t}|lobes${(a.clearcoat?1:0)|(a.sheen?2:0)|(a.iridescence?4:0)}`}get isRoot(){return this.root===this}get category(){return this.lightLayer.category}envReflectiveInLow(){let e=!1;for(let t of this.layers){let a=t.data;if("physical"===a?.category&&(e=!0,void 0!==a.roughnessMap||void 0!==a.metalnessMap||"number"!=typeof a.roughness||"number"!=typeof a.metalness||void 0!==a.clearcoat||void 0!==a.sheen||void 0!==a.iridescence||void 0!==a.ior||a.metalness>.3||a.roughness<.4))return!0}return!e}get hasAO(){return this.lightLayer.getValue("occlusion")??!1}get fragment(){}reset(e,t,a=!1){(this.data!==e||a)&&this.reset0(e,t)}reset0(e,t){this.lastContext=t,this.data=e;let a=e.layers??Hr.defaultTwoLayerData("phong").layers;for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear();let r=[];for(let e of a)try{let a=sh(this.layerIdGen++,e.id,e.data,t.shared);"rainbow"===a.type&&this.armRainbowNoiseSpecialization(a),r.push(a)}catch(t){console.warn(`[spe] material layer '${e.data.type}' (${e.id}) failed to build — skipping this layer`,t)}this.layers=r,this.layers.reverse();for(let e=0;e<this.layers.length;e++)this.layers[e].structIndex=e;this.name=e.name??"Untitled Material";let s=this.layers.find(e=>e instanceof Jd);if(void 0===s&&(s=ah(0,"",{...Wr.defaultData("light","phong"),visible:!1},t.shared)),this.lightLayer=s,this.lights=!!this.lightLayer.data.visible,this.ctx={accumAlpha:ir(0).toVar("accumAlpha"),lightsAvailable:this.lights&&("phong"===this.category||"lambert"===this.category||"physical"===this.category)},this.colorNode=re(()=>this.buildColorStack())(),this.buildVertexStack(),this.normalNode=this.buildNormalNode(this.displacedNormalView()),this.emissiveNode=this.lights&&"lambert"===this.category&&this.lightLayer.params.has("emissive")?this.lightLayer.params.get("emissive"):null,this.aoNode=null,this.lights&&"physical"===this.category){let e=this.lightLayer.params,t=this.lightLayer.lightData;if(e.has("emissive")){let a=this.findTextureMapLayer(t.emissiveMap);this.emissiveNode=re(()=>{let t=ae(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"):ir(1),{uvs:s,weights:i}=uu(e);if(null!==i){let e=ae(a.sample(s[0]).rgb).toVar(),r=ae(a.sample(s[1]).rgb).toVar(),n=ae(a.sample(s[2]).rgb).toVar();t=e.mul(i.z).add(r.mul(i.x)).add(n.mul(i.y))}else t=ae(a.sample(s[0]).rgb);return qt(ae(0),t,r)}(a.params))),t})()}let a=this.findTextureMapLayer(t.aoMap);null!==a&&(this.aoNode=re(()=>qt(ir(1),cu(a.params,t.aoMapChannel??"r"),e.getFloat("aoMapIntensity")))())}this.transparent=Er(e,t.shared),Mi(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(),Mi(this),this.needsUpdate=!0}getFlavor(e,t,a,r){if(!this.isRoot)return this.root.getFlavor(e,t,a,r);let s=a?6:(e?3:0)+t;if(s+=7*((r?.resolutionLevel??0)-(r?.useChildrenColors?4:0)),0===s)return this;s-=1;let i=this.flavors[s];return void 0===i&&(i=new nh(this.data,this.lastContext,this.allowVariableSaves,this),i.flatShading=e,i.side=t,i.wireframe=a,r&&(i.shapeBlendOptions={...r},i.defines={SHAPEBLEND:r.resolutionLevel,SHAPEBLEND_C:r.useChildrenColors?1:0},i._invalidateStructuralKey()),this.flavors[s]=i),i}getShapeBlendBaseColor(){let e=this.layers.find(e=>"fragment"===e.kind&&"color"===e.type),t=e?.getValue("color"),a=e?.getValue("alpha");return{r:t?.r??1,g:t?.g??1,b:t?.b??1,a:a??1}}setShapeBlendResources(e){this._shapeBlendResources=e,this._applyShapeBlendGraph()}_applyShapeBlendGraph(){if(!this.shapeBlendOptions||!this._shapeBlendResources)return;let e=n();if(null===e)return;let t=e(this._shapeBlendResources);this.positionNode=t.position,this.shapeBlendObjectNormal=t.normal,this.normalNode=this.buildNormalNode(za(Ja(t.normal))),this.castShadowPositionNode=t.position,this.shapeBlendOptions.useChildrenColors&&(this._shapeBlendColorNode=t.color,this.colorNode=re(()=>this.buildColorStack())()),this.needsUpdate=!0}lightLayerIndex(){return this.layers.findIndex(e=>e instanceof Jd)}findTextureMapLayer(e){if(!e)return null;if("string"!=typeof e)return qr.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=Wr.defaultData("texture"),a={...t,visible:!1,texture:{...t.texture,image:e.image,wrapping:e.wrapping??1e3,offset:e.offset??[0,0],repeat:e.repeat??[1,1],minFilter:e.minFilter??1008,magFilter:e.magFilter??1006}},r=rh(this.layerIdGen++,`mapImage${this.layerIdGen}`,a,this.lastContext.shared);return this.syntheticMapLayers.set(e,r),r}catch(e){return console.warn("[spe] light-layer map image failed to build — skipped",e),null}}buildNormalNode(e){if(this.lights&&"physical"===this.category&&!this.wireframe){let t=this.lightLayer.lightData,a=this.findTextureMapLayer(t.normalMap);if(null!==a){let t=this.lightLayer.params.getFloat("normalScale");return re(()=>function(e,t,a){let r=ae(a??Wa).toVar(),s=_e,i=e.get("texture"),n=e.has("loaded")?e.getFloat("loaded"):ir(1),l=e=>{let a=Y(e).toVar(),l=ae(i.sample(a).rgb.mul(2).sub(1)).toVar(),o=ae(qt(ae(0,0,1),l,n)).toVar();o.xy.mulAssign(t);let u=ae(va(s)).toVar(),d=ae(Sa(s)).toVar(),h=Y(va(a)).toVar(),m=Y(Sa(a)).toVar(),c=ae(Ya(r)).toVar(),p=ae(ma(d,c)).toVar(),g=ae(ma(c,u)).toVar(),f=ae(p.mul(h.x).add(g.mul(m.x))).toVar(),_=ae(p.mul(h.y).add(g.mul(m.y))).toVar(),y=ir(At(Da(f,f),Da(_,_))).toVar(),x=ir(St(y.equal(0),ir(0),tr.mul(Pe(y)))).toVar();return Ya(f.mul(o.x.mul(x)).add(_.mul(o.y.mul(x))).add(c.mul(o.z)))},{uvs:o,weights:u}=uu(e);if(null!==u){let e=l(o[0]),t=l(o[1]),a=l(o[2]);return Ya(e.mul(u.z).add(t.mul(u.x)).add(a.mul(u.y)))}return l(o[0])}(a.params,t,e))()}}let t=this.findTextureMapLayer(this.lightLayer.lightData.bumpMap),a=this.lights&&"lambert"!==this.category;if(null===t||!a||this.wireframe)return e;let r=this.lightLayer.params.getFloat("bumpMapIntensity");return re(()=>function(e,t,a){let r=ae(a??Wa).toVar(),s=_e,i=e.get("texture"),{uvs:n,weights:l}=uu(e);if(null!==l){let e=mu(s,r,hu(i,n[0],t)),a=mu(s,r,hu(i,n[1],t)),o=mu(s,r,hu(i,n[2],t));return Ya(e.mul(l.z).add(a.mul(l.x)).add(o.mul(l.y)))}return mu(s,r,hu(i,n[0],t))}(t.params,r,e))()}buildVertexStack(){let e=this.layers.filter(e=>"vertex"===e.kind);if(0===e.length)return this.positionNode=null,void(this.displacedObjectNormal=null);let t=function(e){let t=$("vec3","vDisplacedNormal");return{position:re(a=>{let r=ue,s=Ua;for(let t=0;t<e.length;t++){let a=Ju(e[t],$u(ue),s);r=0===t?a.position:$u(r.add(a.position).mul(.5)),s=a.normal}let i=ae(r).toVar();return t.assign(s),!0===a.needsPreviousData?.()&&ce.assign(i),i})(),normal:t}}(e.map(e=>e.params));this.positionNode=t.position,this.displacedObjectNormal=t.normal}displacedNormalView(){let e=this.root.displacedObjectNormal;return null===e?null:za(Ja(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=ir(1);null!==t&&(r=this.evaluateMask(t));let s={alpha:a?.alpha??e.alphaNode,isMask:e.isMaskNode,mask:r,mode:e.modeNode,noiseCompiledIn:e.noiseCompiledIn},i=$o(e.type)(e.params,s,this.ctx);return a?.color?{...i,color:a.color}:i}evaluateMask(e){let t=this.runLayerBuilder(e,null);return V(t.color.mul(t.calpha))}buildColorStack(){let e=this.lightLayerIndex(),t=-1===e?0:e,a=null;for(let e=0;e<t;e++){let t=this.layers[e];if("fragment"!==t.kind)continue;if(null===a){let r=this._shapeBlendColorNode;a=Od(this.runLayerBuilder(t,this.maskSourceFor(e),r?{color:Od(r.rgb),alpha:Ud(r.w)}:void 0).color);continue}if(t.isMaskEnabled)continue;let r=this.runLayerBuilder(t,this.maskSourceFor(e));a=qo(a,r.color,r.calpha,t.modeNode)}return a??ea(Qr)}setup(e){e.context.setupClearcoatNormal=()=>Ma(Wa,"NORMAL","vec3"),super.setup(e)}setupLightingModel(){let e=this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null;return function(e,t=null,a=null,r=!1){switch(e){case"physical":{let e=new ru(!0===a?.clearcoat,!0===a?.sheen,!0===a?.iridescence,!1,!1,!1);return e.envIrradianceActive=r,e}case"lambert":return new Xt(!1);case"toon":{let e=new au;return e.aoOcclusionGate=t,e}default:return new Xt}}(this.category,e,this.physicalLobes(),this.envNode instanceof zi)}physicalLobes(){let e=this.lightLayer.params;return{clearcoat:e.has("clearcoat"),sheen:e.has("sheen"),iridescence:e.has("iridescence")}}setupVariants(e){if(!this.lights)return;let t=null,a=null;if("physical"===this.category){let e=this.lightLayer.lightData,r=this.findTextureMapLayer(e.roughnessMap);null!==r&&(t=re(()=>cu(r.params,e.roughnessMapChannel??"luminance"))());let s=this.findTextureMapLayer(e.metalnessMap);null!==s&&(a=re(()=>cu(s.params,e.metalnessMapChannel??"b"))())}!function(e,t,a=null,r=null){if("phong"===e||"toon"===e)Lt.assign(t.getFloat("shininess").max(1e-4)),Yt.assign(t.getColor("specular"));else if("physical"===e){let e=t.getFloat("metalness"),s=t.getFloat("roughness"),i=t.getFloat("reflectivity");if(null!==a&&(s=a.mul(s)),null!==r&&(e=Ft(r.mul(e),ir(0),ir(1))),Bt.assign(e),lt.assign(Ft(s,ir(.0525),ir(1))),t.has("ior")){let a=t.getFloat("ior"),r=t.has("specularColor")?ae(t.getColor("specularColor")):ae(1),s=t.has("specularIntensity")?t.getFloat("specularIntensity"):ir(1);Le.assign(a),Yt.assign(Dt(Ee(Le.sub(1).div(Le.add(1))).mul(r),ae(1)).mul(s)),Zo.assign(qt(Yt,Pa.rgb,e)),aa.assign(qt(s,ir(1),e))}else{let t=ae(i.pow(2).mul(.16));Yt.assign(t),Zo.assign(qt(t,Pa.rgb,e)),aa.assign(ir(1))}if(Qo.assign(Pa.rgb.mul(nr(e))),t.has("clearcoat")&&(Gt.assign(t.getFloat("clearcoat")),Qt.assign(Ft(t.getFloat("clearcoatRoughness"),ir(.0525),ir(1)))),t.has("sheen")){let e=t.has("sheenColor")?ae(t.getColor("sheenColor")):ae(1);Rt.assign(e.mul(t.getFloat("sheen"))),Pt.assign(Ft(t.getFloat("sheenRoughness"),ir(.07),ir(1)))}t.has("iridescence")&&(Ue.assign(t.getFloat("iridescence")),qe.assign(t.getFloat("iridescenceIOR")),He.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?ae(0):Pa.rgb,i=ae(0),n=ae(0);if(r&&(a.length>0||r.getScope().hasLights)){let e=this.setupLightingModel()||null,t=nt(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&&(qa.assign(ae(this.emissiveNode)),s=s.add(qa)),re(()=>this.applyPostLighting(s,i,n))()}applyPostLighting(e,t,a){let r,s=this.ctx.accumAlpha,i=!0===this.lights,n=this.lightLayerIndex(),l=-1===n?0:n+1,o=ir(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=ae(t).toVar();return le(De(ar(u,Pa.rgb)),()=>{let e=Ft(et(a.add(r)),ir(0),ir(1));o.accumAlpha.addAssign(nr(o.accumAlpha).mul(s).mul(n).mul(e)),u.assign(qo(Pa.rgb,u,s.mul(n),i)),u.mulAssign(eu(l))}),u}({outgoing:e,directSpecular:t,indirectSpecular:a,shadingAlpha:this.lightLayer.alphaNode,shadingBlend:this.lightLayer.modeNode,mask:o,occlusion:this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null,ctx:this.ctx})}else r=ae(e).toVar();let u=r,d=!1;for(let e=l;e<this.layers.length;e++){let t=this.layers[e];if("fragment"!==t.kind||t.isMaskEnabled)continue;let a=this.runLayerBuilder(t,this.maskSourceFor(e));u=qo(u,a.color,a.calpha,t.modeNode),d=!0}if(d&&r.assign(u),!i){let e=-1===n?null:this.maskSourceFor(n);null!==e&&(o=this.evaluateMask(e))}let h=this.lightLayer.params.has("alphaOverride")?this.lightLayer.params.getFloat("alphaOverride"):ir(1),m=i?s:s.mul(o);if(Pa.a.assign(m.mul(h)),Pa.a.lessThanEqual(ir(0)).discard(),this.dithering){let e=je(ft.xy),t=ae(.25/255,-.25/255,.25/255),a=qt(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||Lr(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)&&!Lr(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(Er(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):Mi(this)}else this.reset0(t,a);else this.root.updateByOp(e,t,a)}static hasVariableString(e){return"string"==typeof e||Array.isArray(e)&&e.some(e=>"string"==typeof e)}updateLayerTextureByOp(e,t,a){if(1!==t.path.length||0!==t.type)return!0;let r=t.props,s=a.texture;if(!s)return!0;let i=e.data.texture;for(let e of Object.keys(r))if("repeat"!==e&&"offset"!==e&&"rotation"!==e||nh.hasVariableString(s[e])||nh.hasVariableString(i?.[e]))return!0;if("matcap"===e.type)return"repeat"in r||"offset"in r||(e.data=a,e.setValue("rotation",(s.rotation??0)*is.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||Lr(r))!==e.noiseCompiledIn)return!0}let r=Ir[e.type];if(void 0!==r&&r.includes(t))return!0;let i=Fr[e.type];if(void 0!==i&&i.includes(t)){let a=e.getValue(t),r=s[t];if(Array.isArray(a)&&Array.isArray(r)&&a.length!==r.length)return!0}let n=a[t],l=e.data[t];if("axis"!==t&&("string"==typeof n||"string"==typeof l)||Array.isArray(n)&&n.some(e=>"string"==typeof e)||Array.isArray(l)&&l.some(e=>"string"==typeof e))return!0}e.data=a;for(let t of Object.keys(s))this.applyLayerValue(e,t,a,r.shared);return!1}applyLayerValue(e,t,a,r){let s=a;if(("alpha"===t||"visible"===t||"intensity"===t)&&(eh(e,r),"intensity"!==t||"displace"===e.type))return;if("alphaOverride"===t&&e instanceof Jd)return void e.setValue("alphaOverride",Nr(s[t],r));if(!e.hasValue(t))return;let i=e.uniformKinds.get(t),n=s[t];switch(i){case"color":case"colorVec4":{let a=e.getValue(t),s="string"==typeof n?r.color(n):qd(n,()=>a??new Dr(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(Er(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(Er(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 ps||i.setValue(s,t)}saveVariableLocations(e){if(!this.allowVariableSaves)return;let t=this.data.layers?.find(e=>"light"===e.data.type);t&&e.shared.getVariable(t.data.alphaOverride,["material",this.uuid,"alphaOverride"]),this.data.layers?.forEach(t=>{let a=t.data;"alpha"in a&&"string"==typeof a.alpha&&e.shared.getVariable(a.alpha,["material",this.uuid,"layer",t.id,"alpha"]);let r="displace"===t.data.type?"noise"===a.displacementType?"displace_noise":"displace_map":t.data.type,s=ih[r];if(s)for(let r of s){let s=a;for(let e of r.path??[])e in s&&(s=s[e]);for(let a of r.nums)a in s&&e.shared.getVariable(s[a],["material",this.uuid,"layer",t.id,...r.path??[],a]);for(let a of r.vecs)a in s&&s[a].forEach((s,i)=>{e.shared.getVariable(s,["material",this.uuid,"layer",t.id,...r.path??[],a,0===i?"x":1===i?"y":"z"])})}})}clampUniformsForPreview(e,t){let a=(e,t,a)=>Math.min(Math.max(e,t),a);for(let r of this.layers)if("displace"===r.type){let s=r.uniforms[`f${r.id}_intensity`];s.value=a(s.value,e,t)}}updateFrame(){}assetsLoaded(){if(!this.layers.every(e=>e.assetsLoaded))return!1;for(let e of this.root.syntheticMapLayers.values())if(!e.assetsLoaded)return!1;return!0}nodeMaterialDispose(){if(this.isRoot){for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear()}this.dispose();for(let e of this.flavors)e?.dispose()}},lh=class extends nh{constructor(e,t,a){super(e,t,!1),this.isTSLSharedMaterial=!0,this.uuid=a,this.allowVariableSaves=!0,this.saveVariableLocations(t)}};function oh(e,t){let a=e.xyz;return t.add(ma(a,ma(a,t).add(t.mul(e.w))).mul(2))}function uh(e){let t=Cu(e),a=Cu(ae(e.y.sub(19.1),e.z.add(33.4),e.x.add(47.2))),r=Cu(ae(e.z.add(74.2),e.x.sub(124.5),e.y.add(99.4)));return ae(t,a,r)}var dh=re(e=>{let t=e.p.add(e.seed).toVar(),a=ae(.1,0,0),r=ae(0,.1,0),s=ae(0,0,.1),i=uh(t.sub(a)).toVar(),n=uh(t.add(a)).toVar(),l=uh(t.sub(r)).toVar(),o=uh(t.add(r)).toVar(),u=uh(t.sub(s)).toVar(),d=uh(t.add(s)).toVar(),h=o.z.sub(l.z).sub(d.y).add(u.y),m=d.x.sub(u.x).sub(n.z).add(i.z),c=n.y.sub(i.y).sub(o.x).add(l.x);return Ya(ae(h,m,c).mul(5))});function hh(e,t){return dh({p:e,seed:t})}function mh(e,t,a){return ae(Bu(e.add(ae(a)).mul(t)),Bu(e.add(ae(a.add(20))).mul(t)),Bu(e.add(ae(a.sub(30))).mul(t)))}function ch(e){return{f:(t,a=0)=>e.node(t)??e.getUniform(t,a),v3:t=>e.node(t)??e.getUniform(t,null),v4:t=>e.node(t)??e.getUniform(t,null),tex:t=>e.node(t)??e.getTexture(t,null)}}function ph(e,t){switch(e){case"position":return function(e){let t=ch(e.registry);return re(()=>{let a=U(),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=da(.5,p),_=ir(3).mul(f),y=c.mul(ir(1).add(_)),x=c.mul(Dt(t.f("uFPSRatio",1),ir(5)));n.addAssign(qt(x,y,f));let v=oh(t.v4("uWorldQuaternion"),h).add(t.v3("uWorldOffset"));n.assign(qt(n,v,o)),d.assign(qt(d,t.f("uTime"),o));let b=At(g.sub(t.f("uTime").sub(d)),ir(0)).div(g);return qt(ne(0),ne(n,b),u)})()}(t);case"velocity":return function(e){let t=ch(e.registry),a=e.features;return re(()=>{let r=U(),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=ir(1).sub(t.f("uRandomMassFactor").mul(function(e){return e.dot(Y(12.9898,78.233)).sin().mul(43758.5453).fract()}(function(e){return e.xy}(o)).mul(.5).add(.5))).toVar(),f=t.f("uSpeed",1),_=t.f("uNoiseStrength"),y=t.f("uNoiseScale"),x=t.f("uNoiseSeed");le(c.equal(1),()=>{a.USE_CURL_NOISE&&(le(y.greaterThan(0),()=>{d.assign(hh(l.mul(y).mul(.002),x).mul(_.add(1)).mul(.05).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(hh(l,x).mul(_).mul(.05).mul(f))})),a.USE_SIMPLEX_NOISE&&(le(y.greaterThan(0),()=>{d.assign(ae(Cu(l.mul(y).mul(.001)).mul(_.add(1)).mul(.1)).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(ae(Cu(l.mul(_).mul(.001)).mul(.05)).mul(f))})),a.USE_FBM_NOISE&&(le(y.greaterThan(0),()=>{d.assign(mh(l.mul(y).mul(.001),_.add(1),x).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(mh(l.mul(_).mul(.001),_.add(1),x).mul(.1).mul(f))})),function(e,t,a,r,s){if(!e.features.USE_COLLIDER)return;let i=At(t.f("uBounce").mul(2),ir(.01)).toVar(),n=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),l=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar().div(e).toVar(),o=et(l).toVar();le(o.lessThanEqual(ir(1).add(n.div(et(e)))).and(s.equal(0)),()=>{let a=l.mul(ir(1).add(n.div(et(e)))),o=Ya(a.div(e.mul(e)));o=oh(t.v4("uColliderQuaternion"),o),r.assign(Ye(r,o).mul(i)),s.assign(1)}).Else(()=>{s.assign(0)})}if(e.features.USE_BOX_COLLIDER){let e=t.v3("uColliderSize").div(2),l=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),o=Ae(l).sub(e).toVar(),u=At(o.x,At(o.y,o.z)).toVar();le(u.lessThanEqual(n.mul(.5)).and(s.equal(0)),()=>{let e=ae(0).toVar();le(o.x.greaterThan(o.y).and(o.x.greaterThan(o.z)),()=>{e.assign(ae(Ut(l.x),0,0))}).ElseIf(o.y.greaterThan(o.z),()=>{e.assign(ae(0,Ut(l.y),0))}).Else(()=>{e.assign(ae(0,0,Ut(l.z)))});let a=oh(t.v4("uColliderQuaternion"),e);r.assign(Ye(r,a).mul(i)),s.assign(1)}).Else(()=>{s.assign(0)})}}(e,t,l,d,p),function(e,t,a,r){if(!e.features.USE_ATTRACTOR)return;let s=t.f("uForceIntensity"),i=t.f("uForceDamping");if(e.features.USE_FORCE_LOCAL_SPACE){let n,l,o=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),r=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos")));n=et(r.div(e)).toVar(),l=ir(1)}else{let e=t.v3("uColliderSize").div(2),r=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))),s=Ae(r).sub(e);n=At(s.x,At(s.y,s.z)).toVar(),l=o}le(n.lessThanEqual(l),()=>{let o=e.features.USE_SPHERE_COLLIDER?ir(1).sub(n).mul(s):At(ir(1).sub(l.div(n)),ir(0)).mul(s),u=a.sub(t.v3("uColliderPos")),d=Ya(u).mul(o);r.subAssign(d),r.mulAssign(i)})}else{let e=a.sub(t.v3("uColliderPos")),n=Ya(e).mul(s);r.subAssign(n),r.mulAssign(i)}}(e,t,l,d),function(e,t,a,r,s,i,n){if(!e.features.USE_VORTEX)return;let l=t.f("particleSize"),o=t.v3("uColliderSize").div(2),u=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),d=Ae(u).sub(o).toVar(),h=At(d.x,At(d.y,d.z)).toVar();le(h.lessThanEqual(l),()=>{let e=t.f("uForceIntensity"),l=t.v3("uColliderPos").add(oh(t.v4("uColliderQuaternion"),ae(0))).sub(a).toVar(),o=ae(0,1,.01),u=Ya(ma(o,oh(t.v4("uColliderQuaternion"),l))).toVar(),d=et(l.mul(e).mul(3)).toVar();r.assign(u.mul(d).mul(.005));let h=oh(t.v4("uWorldQuaternion"),s);r.addAssign(h.mul(n).mul(ir(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(qt(d,oh(t.v4("uWorldQuaternion"),v).mul(f),m)),d.addAssign(t.v3("uGravity").div(g.mul(.5)).mul(ir(1).sub(p))),ne(d,p)})()}(t);case"emissionRate":return function(e){let t=ch(e.registry);return re(()=>{let a=U(),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=da(o,s),h=da(s,o.add(u).sub(1)),m=d.mul(h);return l.assign(qt(l,t.f("uTime"),m)),ne(m,qt(n,ir(1),m),l,1)})()}(t)}}var gh=class{constructor(){this.nodes=new Map,this.textureNodes=new Map}getUniform(e,t){let a=this.nodes.get(e);return a||(a=lr(t),this.nodes.set(e,a)),a}getTexture(e,t){let a=this.textureNodes.get(e);return a||(a=Ea(t??new ps),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 ps||a&&"object"==typeof a&&a.isTexture){let r=this.getTexture(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(e){r.value=e}}})}else{let r=this.getUniform(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(e){r.value=e}}})}}}},fh=class{constructor(e,t,a,r){this.name=e,this.kind=t,this.initialTexture=a,this.currentIndex=0,this.registry=new gh,this.depTextureNodes=new Map,this.dependencies=[],this.nodeMaterial=null,this._uniformsStore={};let s=()=>new ys(r,r,{type:es,minFilter:Ws,magFilter:Ws,wrapS:Fs,wrapT:Fs,depthBuffer:!1});this.renderTargets=[s(),s()],this.material=Object.defineProperty({},"uniforms",{get:()=>this._uniformsStore,set:e=>{this.registry.adopt(e),this._uniformsStore=e}})}get currentRenderTarget(){return this.renderTargets[this.currentIndex]}get nextRenderTarget(){return this.renderTargets[1-this.currentIndex]}advance(){this.currentIndex=1-this.currentIndex}dispose(){this.renderTargets[0].dispose(),this.renderTargets[1].dispose(),this.nodeMaterial?.dispose()}},_h=new Ga,yh=class{constructor(e,t,a,r){this.sizeX=e,this.sizeY=t,this.renderer=a,this.features=r,this.variables=[],this._copyMaterial=null,this._copyTextureNode=Ea(new ps)}addVariable(e,t,a){let r=new fh(e,"uCurrentPosition"===e?"position":"uCurrentVelocity"===e?"velocity":"emissionRate",a,this.sizeX);return this.variables.push(r),r}setVariableDependencies(e,t){e.dependencies=t;for(let a of t)e.depTextureNodes.has(a.name)||e.depTextureNodes.set(a.name,Ea(a.currentRenderTarget.texture))}init(){if(!this._copyMaterial){let e=new bt;e.name="WebGPUComputation.copy",e.fragmentNode=ne(this._copyTextureNode),e.depthTest=!1,e.depthWrite=!1,e.blending=Us,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 bt;t.name=`WebGPUComputation.${e.kind}`,t.fragmentNode=ph(e.kind,{features:this.features,registry:e.registry,depTexture:t=>{let a=e.depTextureNodes.get(t);if(!a)throw new Error(`WebGPUComputationRenderer: variable "${e.name}" reads undeclared dependency "${t}"`);return a},resolution:new os(this.sizeX,this.sizeY)}),t.depthTest=!1,t.depthWrite=!1,t.blending=Us,t.needsUpdate=!0,e.nodeMaterial=t}}compute(){for(let e of this.variables)if(e.nodeMaterial){for(let t of e.dependencies)e.depTextureNodes.get(t.name).value=t.currentRenderTarget.texture;this._renderQuad(e.nodeMaterial,e.nextRenderTarget)}for(let e of this.variables)e.advance()}getCurrentRenderTarget(e){return e.currentRenderTarget}_renderQuad(e,t){let a=this.renderer,r=a.getRenderTarget(),s=a.getMRT();a.setMRT(null),a.setRenderTarget(t),_h.material=e,_h.render(a),a.setRenderTarget(r),a.setMRT(s)}dispose(){for(let e of this.variables)e.dispose();this._copyMaterial?.dispose()}};function xh(e,t){switch(e){case"linearFadeOut":return ir(1).sub(t);case"linearInOut":return t.lessThan(.5).select(t,ir(1).sub(t));case"exponentialInOut":return t.lessThan(.4).select(t.div(.4),t.greaterThan(.6).select(ir(1).sub(t.sub(.6).div(.4)),ir(1)));case"constant":return ir(1);default:return t}}function vh(e){return e.dot(Y(12.9898,78.233)).sin().mul(43758.5453).fract()}var bh=class extends bt{constructor(e,t){super(),this.easeOpacity="linearFadeIn",this.easeSize="linearFadeIn",this.useSizeEnd=!1,this.isColoringRandom=!1,this._uniformsStore={},this._uPosition=Ea(new ps),this._uTexture=Ea(new ps),this._uColor=lr(new _s(1,1,1,1)),this._uColor2=lr(new _s(1,1,1,1)),this._uSize=lr(1),this._uSizeEnd=lr(1),this._uWorldOffset=lr(new ds),this._uWorldQuaternion=lr(new _s(0,0,0,1)),this._uRotation=lr(0),this._uRotationEnd=lr(0),this._center=lr(new os(.5,.5)),this._uRandScaleFactor=lr(0),this._uRandRotationFactor=lr(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=it("particleRef","vec2"),t=this._uPosition,a=re(()=>{let a=t.sample(e).toVar(),r=a.w.toVar(),s=a.xyz.sub(this._uWorldOffset);s=function(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}(this._uWorldQuaternion,s);let i=it("position","vec3"),n=ir(1).sub(r),l=this.useSizeEnd?i.mul(ae(qt(this._uSize,this._uSizeEnd,n))):i.mul(ae(this._uSize.mul(xh(this.easeSize,n)))),o=ca,u=o.element(0).xyz.length(),d=o.element(1).xyz.length(),h=vh(e).toVar(),m=ir(1).sub(this._uRandScaleFactor.mul(h)),c=Y(u,d).mul(m).toVar(),p=2*Math.PI,g=h.mul(this._uRandRotationFactor).mul(p),f=ir(1).sub(this._uRotation).mul(p),_=ir(1).sub(this._uRotationEnd).mul(p),y=qt(f.add(g),_.add(g),r).toVar(),x=this._center,v=l.xy.sub(x.sub(Y(.5))).mul(c).toVar(),b=Y(oa(y).mul(v.x).sub(Wt(y).mul(v.y)),Wt(y).mul(v.x).add(oa(y).mul(v.y))).toVar(),T=ia.mul(ne(s,1)).toVar();return T.xy.addAssign(b),Tt.mul(T)}),r=re(()=>{let a=t.sample(e).w.toVar();a.lessThanEqual(.005).discard();let r=ir(1).sub(a),s=this.isColoringRandom?vh(e):r,i=qt(this._uColor,this._uColor2,s).toVar(),n=xh(this.easeOpacity,r).toVar(),l=this._uTexture.sample(U()).toVar();return ne(l.rgb.mul(i.rgb),i.a.mul(l.a).mul(n))});this.vertexNode=a(),this.colorNode=r(),this.needsUpdate=!0}nodeMaterialDispose(){this.dispose()}};function Th(e,t){return(a,r,s,i)=>{let n=s.mod(t).add(a.add(.5).div(e)).div(t),l=R(s.div(t)).add(r.add(.5).div(e)).div(t);return i.sample(Y(n,l))}}or({createComputation:(e,t,a,r)=>new yh(e,t,a,r),createMaterial:(e,t)=>new bh(e,t)});var wh=[[0,0,0],[1,0,0],[1,0,0],[1,1,0],[0,1,0],[1,1,0],[0,0,0],[0,1,0],[0,0,1],[1,0,1],[1,0,1],[1,1,1],[0,1,1],[1,1,1],[0,0,1],[0,1,1],[0,0,0],[0,0,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1],[0,1,0],[0,1,1]];function Sh(e){let t=rr(e.x.mul(65535).add(.5)),a=t.bitAnd(rr(255)).toFloat().mul(.00392156862),r=t.shiftRight(rr(8)).bitAnd(rr(255)).toFloat().mul(.00392156862);return ne(r,a,e.y,e.z)}function Vh(e){let{levelShiftX:t,scale:a,originOffset:r}=function(e){switch(e){case 5:return{levelShiftX:[4,6,12,24,48,96,192],scale:16,originOffset:16};case 7:return{levelShiftX:[4,6,12,24,48,96,192,384,768,1536],scale:4,originOffset:64};case 8:return{levelShiftX:[4,8,16,32,64,128,256,512,1024,2048,4096],scale:2,originOffset:128};default:return{levelShiftX:[4,8,16,32,64,128,256,512],scale:8,originOffset:32}}}(e.resolutionLevel),s=e.pyramidLevelSizes.length,i=s%2==0?s-3:s-2,n=s%2==0,l=Math.pow(2,e.resolutionLevel),o=e.pyramidLevelSizes[s-1]/l,u=Th(l,o),d=e.pyramid1Size.width,h=e.pyramid1Size.height,m=e.pyramid2Size.width,c=e.pyramid2Size.height,p=k(wh.map(([e,t,a])=>new ds(e,t,a)));return s=>{let g=ae(0).toVar(),f=ae(0,0,1).toVar(),_=ne(0).toVar(),y=s.toVar(),x=R(y.div(3)).toVar(),v=(e,t)=>Y(e.x.add(t).add(.5).div(d),e.y.add(.5).div(h)),b=(e,t)=>Y(e.x.add(t).add(.5).div(m),e.y.add(.5).div(c)),T=d-2,w=m-1,S=Y(0,0).toVar(),V=e.pyramid2.sample(b(S,w)).toVar();return le(x.lessThan(V.x),()=>{let s=ir(0).toVar(),d=e=>{let t=V.add(ne(s)).toVar(),a=ne(t.yzw,s),r=ne(ne(x).greaterThanEqual(a)).mul(ne(ne(x).lessThan(t))).toVar();S.mulAssign(2),S.addAssign(Y(0,1).mul(r.x).add(Y(1,1).mul(r.y)).add(Y(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=R(S.x.div(l)).add(R(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(Y(M,C)).x.mul(2).toInt().toVar(),k=ae(h,m,c).add(p.element(z)).toVar(),A=ae(h,m,c).add(p.element(z.add(1))).toVar(),P=u(k.x,k.y,k.z,e.potential).toVar(),E=u(A.x,A.y,A.z,e.potential).toVar(),N=P.x.div(P.x.sub(E.x));_.assign(qt(Sh(P.yzw),Sh(E.yzw),N)),g.assign(k.add(A.sub(k).mul(N)).sub(ae(r)).mul(a));let B=u(k.x,k.y,k.z,e.voxel),L=u(A.x,A.y,A.z,e.voxel);f.assign(Ya(qt(B.xyz,L.xyz,N)))}),{position:g,normal:f,color:_}}}function Mh(e,t){!0===e.needsPreviousData?.()&&ce.assign(t)}var Ch=e=>e,Rh=e=>e,zh=h,kh=m;function Ah(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}function Ph(e,t,a,r){let s=Ft(e,-1,1),i=e.sub(s).mul(2).add(1),n=Ft(ir(.5).add(s.mul(.5).mul(t.sub(s.mul(i).mul(a))).div(r)),0,1);return qt(t,s.mul(i).mul(a),n).sub(s.mul(r).mul(n).mul(ir(1).sub(n)))}function Eh(e,t,a,r,s){let i=ir(0).toVar(),n=a.y,l=a.z,o=a.w,u=le(e.lessThan(.5),()=>{i.assign(et(t).sub(n))}).ElseIf(e.lessThan(1.5),()=>{let e=ae(n,l,o),a=et(t.div(e)),r=et(t.div(e.mul(e)));i.assign(a.mul(a.sub(1)).div(r))}).ElseIf(e.lessThan(2.5),()=>{let e=ae(n,l,o),a=Ae(t).sub(e).toVar();i.assign(et(At(a,ae(0))).add(Dt(At(a.x,At(a.y,a.z)),0)))}).ElseIf(e.lessThan(3.5),()=>{let e=Ae(Y(et(t.xz),t.y)).sub(Y(l,n)).toVar();i.assign(Dt(At(e.x,e.y),0).add(et(At(e,Y(0)))))}).ElseIf(e.lessThan(4.5),()=>{let e=n,a=l,r=o,s=Y(et(t.xz),t.y).toVar(),u=Y(r,e),d=Y(r.sub(a),e.mul(2)),h=Y(s.x.sub(Dt(s.x,s.y.lessThan(0).select(a,r))),Ae(s.y).sub(e)).toVar(),m=s.sub(u).add(d.mul(Ft(Da(u.sub(s),d).div(Da(d,d)),0,1))).toVar(),c=m.x.lessThan(0).and(h.y.lessThan(0)).select(ir(-1),ir(1));i.assign(c.mul(na(Dt(Da(h,h),Da(m,m)))))}).ElseIf(e.lessThan(5.5),()=>{let e=Y(et(t.xy).sub(n),t.z);i.assign(et(e).sub(l))}),d=()=>{let e=Ae(t.x).toVar(),a=Y(n,l),s=o,u=r.w,d=a.y.mul(e).greaterThan(a.x.mul(t.y)).select(Da(Y(e,t.y),a),et(Y(e,t.y))),h=ae(e,t.y,t.z);i.assign(na(Da(h,h).add(s.mul(s)).sub(s.mul(d).mul(2))).sub(u))};return s?u.ElseIf(e.lessThan(6.5),d).Else(()=>{i.assign(s(t,a,r))}):u.Else(d),i}function Nh(e,t=!0){let a=e.spatialDivisions,r=e.spatialn;return(s,i)=>{let n=t?ne(0).toVar():ne(0),l=ir(1e3).toVar(),o=t?ir(0).toVar():ir(0),u=t?ir(0).toVar():ir(0),d=i.y.add(i.z.mul(a)).add(.5).div(a*a),h=(a,r)=>{let i=r.toVar();he(zh,({i:r})=>{le(i.lessThan(1),()=>{X()}),i.mulAssign(.5),le(B(i).greaterThanEqual(.5),()=>{let i=ir(r).add(a).add(.5).mul(1/kh),d=e.shapeRow(i,0).toVar(),h=e.shapeRow(i,1).toVar(),m=e.shapeRow(i,2).toVar(),c=e.shapeRow(i,3).toVar(),p=Ah(h,s.sub(d.xyz)).div(c.z).toVar(),g=Eh(m.x,p,m,c,e.meshSdf).sub(c.y).mul(c.z).toVar(),f=c.x.toVar(),_=d.w;if(l.assign(Ph(_,l,g,f)),t){let t=da(-1.5,_).mul(da(_,-.5)),a=$t(u,0,g.negate()),r=qt(ir(1),a,t);n.mulAssign(r),o.mulAssign(r),u.assign(At(u,f)),f.addAssign(e.colorKBump);let s=e.shapeRow(i,4).toVar(),l=$t(f,0,g).mul(s.a.greaterThanEqual(0).toFloat()).toVar();o.addAssign(l),n.addAssign(s.mul(l))}})})},m=t=>{let s=t.mul(4*zh).toVar(),n=e.spatialTex.sample(Y(i.x.mul(r).add(t).add(.5).div(r*a),d)).toVar();h(s,n.x),h(s.add(zh),n.y),h(s.add(2*zh),n.z),h(s.add(3*zh),n.w)};return 1===r?m(ir(0)):he(r,({i:e})=>{m(ir(e).toVar())}),t&&n.divAssign(o),{sdf:qt(l,ir(0),da(1e20,l)).toVar(),color:n,colorDivisor:o}}}var Bh=[4,4,4],Lh=(e,t)=>Ne(e,t);function Ih(e){let t=e.resolution,a=t-1,r=e.colorResolution,s=e.capacity,i=t/4,n=i-1,l=lr(e.bboxHalf),o=lr(e.bboxOffset),u=lr(1e30),d=lr(new ds(0,0,0)),h=lr(new ds(i,i,i)),m=e.env.spatialDivisions,c=ir(e.buildSeq).mul(0),p=e.sparseStorage??null,g=p?p.poolBricks:0,f=p?Math.ceil(g/4096):0,_=p?.meshlet??null,y=_?_.drawIndex:null,x=_?Math.floor(s/24):0,v=_?_.vertexBlocks:0,b=(e,t,a,r)=>{let s=new H(e,t,a);return s.format=xs,s.type=es,s.minFilter=Ws,s.magFilter=Ws,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=xs,T.type=es,T.minFilter=Ws,T.magFilter=Ws;let w=e.reuseTextures?.colorTexture??new H(r,r,r);w.name="SplineShapeBlend.ultraColor";let S=e.reuseTextures?.coarseTexture??new H(i,i,i);S.format=xs,S.type=es,S.minFilter=Ws,S.magFilter=Ws,S.name="SplineShapeBlend.ultraCoarse";let V=fe(8,"uint").toAtomic(),M=(e=0)=>V.element(e),C=p?fe(_?12:4,"int").toAtomic():null,z=e=>C.element(e),A=p?fe(Math.max(g,1),"float"):null,P=i*i*i,E=p?fe(P*(_?4:1),"float"):null,N=e=>Re(e.x.add(e.y.mul(i)).add(e.z.mul(i*i))),B=e=>E.element(N(e)),L=e=>E.element(N(e).add(Re(P))),I=e=>E.element(N(e).add(Re(2*P))),F=e=>E.element(N(e).add(Re(3*P))),D=e=>E.element(e.add(Re(3*P))),U=p?fe(Math.max(g,1),"float"):null,O=_?fe(3*Math.max(x,1),"float"):null,G=e=>O.element(e),q=e=>G(Re(e)),W=e=>G(Re(e.add(x))),j=e=>G(e.add(Re(2*x))),K=_?fe(Math.max(v,1),"float"):null,$=e=>K.element(e),Q=_?fe(24*Math.max(x,1),"uint"):null,Z=e=>Q.element(e),J=_?lr(0):null,ee=_?lr(new Ts):null,te=_?lr(2):null,ie=k(Array.from(e.numTrisTable)),oe=k(wh.map(([e,t,a])=>new ds(e,t,a))),ue=Nh(e.env,!1),de=Nh(e.env),ce=(e,t)=>e.div(t).mul(2).sub(1),pe=(e,t)=>e.div(t).mul(m-1).floor(),ge=re(()=>{for(let e=0;e<8;e++)Je(M(e),rr(0))})(),_e=re(()=>{le(Re(me).greaterThanEqual(Re(s)),()=>{Ce()}),e.buffers.positions.element(Re(me)).assign(ne(0))})(),ye=_?re(()=>{le(Re(me).greaterThanEqual(Re(s)),()=>{Ce()}),y.element(Re(me)).assign(rr(c))})():null,xe=Ia(S),ve=e=>xe.load(Ze(Ft(e,ae(0),ae(n)))).x,be=e=>B(Ft(e,ae(0),ae(n))),Te=(e,t)=>{let a=At(e,0),r=R(a.div(4096)),s=a.sub(r.mul(4096)),i=R(s.div(64)),n=s.sub(i.mul(64));return ae(n,i,r).mul(4).add(t)},we=re(()=>{let t=ae(se).add(d).toVar();le(t.x.greaterThan(n).or(t.y.greaterThan(n)).or(t.z.greaterThan(n)),()=>{Ce()});let r=t.mul(4).add(ae(1.5)),s=(t=>{let a=ir(1e3).toVar();return he(kh,({i:r})=>{le(ir(r).greaterThanEqual(e.npart),()=>{X()});let s=ir(r).add(.5).mul(1/kh),i=e.env.shapeRow(s,0).toVar(),n=e.env.shapeRow(s,1).toVar(),l=e.env.shapeRow(s,2).toVar(),o=e.env.shapeRow(s,3).toVar(),u=Ah(n,t.sub(i.xyz)).div(o.z).toVar(),d=Eh(l.x,u,l,o,e.env.meshSdf).sub(o.y).mul(o.z).toVar();a.assign(Ph(i.w,a,d,o.x))}),a})(ce(r,a));ya(S,Ze(t),ne(s.add(c),0,0,0)).toStack()})(),Se=e=>{le(e.x.greaterThan(n).or(e.y.greaterThan(n)).or(e.z.greaterThan(n)),()=>{Ce()})},Ve=p?re(()=>{let e=ae(se).toVar();Se(e),B(e).assign(ir(-1).add(c)),_&&(L(e).assign(ir(-1).add(c)),I(e).assign(ir(-1).add(c)))})():null,Me=p?re(()=>{let e=ae(se).add(d).toVar();Se(e);let t=ve(e).toVar(),a=be(e).toVar();le(Ae(t).greaterThan(u).and(a.greaterThan(-.5)),()=>{let t=Ke(z(1),Re(1)).toVar();A.element(t).assign(a),B(e).assign(ir(-1).add(c))})})():null,ze=p?re(()=>{let e=ae(se).add(d).toVar();Se(e);let t=ve(e).toVar(),a=be(e).toVar();le(Ae(t).lessThanEqual(u).and(a.lessThan(-.5)),()=>{let t=ir(-1).toVar(),a=at(z(1),Re(1)).toVar();le(a.greaterThanEqual(1),()=>{t.assign(A.element(a.sub(1)))}).Else(()=>{Ke(z(1),Re(1));let e=Ke(z(0),Re(1)).toVar();le(e.lessThan(Re(g)),()=>{t.assign(e.toFloat())}).Else(()=>{Je(z(2),Re(1))})}),le(t.greaterThan(-.5),()=>{U.element(Re(t)).assign((e=>e.x.add(e.y.mul(256)).add(e.z.mul(65536)))(e)),B(e).assign(t.add(c))})})})():null,ke=p?re(()=>{let e=Qe(z(0)).toVar(),t=Qe(z(2)).toVar();if(Je(M(1),rr(e)),Je(M(2),rr(t)),Je(z(2),Re(0)),_){let e=Qe(z(3)).toVar(),t=Qe(z(5)).toVar();Je(M(4),rr(e)),Je(M(5),rr(t)),Je(z(5),Re(0));let a=Qe(z(6)).toVar(),r=Qe(z(8)).toVar();Je(M(6),rr(a)),Je(M(7),rr(r)),Je(z(8),Re(0))}})():null,Pe=_?re(()=>{let e=ae(se).toVar();le(e.x.greaterThanEqual(h.x).or(e.y.greaterThanEqual(h.y)).or(e.z.greaterThanEqual(h.z)),()=>{Ce()});let t=e.add(d).toVar();Se(t);let a=I(t).toVar();le(a.greaterThan(-.5),()=>{let e=Ke(z(7),Re(1)).toVar();$(e).assign(a),I(t).assign(ir(-1).add(c))});let r=L(t).toVar();le(r.lessThan(-.5),()=>{Ce()}),L(t).assign(ir(-1).add(c)),he(48,()=>{le(r.lessThan(-.5),()=>{X()});let e=Ke(z(4),Re(1)).toVar();j(e).assign(r),r.assign(q(r))})})():null,Ee=_?re(()=>{let e=ae(se).add(d).toVar();Se(e);let t=ir(0).toVar();le(be(e).greaterThan(-.5),()=>{let a=e.mul(4).toVar(),r=Ye.map(([e,t,r])=>We(ae(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=Ya(s).toVar(),n=Da(r[0],i);for(let e=1;e<8;e++)n=Dt(n,Da(r[e],i));le(n.greaterThan(te),()=>{t.assign(ir(1))})}),F(e).assign(t.add(c))})():null,Ne=Math.min(4096,Math.max(g,1)),Be=()=>{let e=ae(se).toVar(),t=R(e.x.mul(.25)).toVar(),a=R(e.y.mul(.25)).toVar();return{slot:a.mul(Ne).add(t).toVar(),local:ae(e.x.sub(t.mul(4)),e.y.sub(a.mul(4)),e.z).toVar()}},Le=e=>(e=>{let t=R(e.div(65536)),a=e.sub(t.mul(65536)),r=R(a.div(256)),s=a.sub(r.mul(256));return ae(s,r,t)})(U.element(Re(e))),Ie=p?re(()=>{let e=ae(se).add(d.mul(4)).toVar(),t=e.mul(.25).floor().toVar(),r=be(t).toVar();le(r.lessThan(-.5),()=>{Ce()});let{sdf:s}=ue(ce(e,a),pe(e,a));ya(T,Ze(Te(r,e.sub(t.mul(4)))),ne(s.add(c),0,0,0)).toStack()})():null,De=p?re(()=>{let{slot:e,local:t}=Be();le(e.greaterThanEqual(g),()=>{Ce()});let r=Le(e).toVar();le(be(r).notEqual(e),()=>{Ce()});let s=r.mul(4).add(t).toVar(),{sdf:i}=ue(ce(s,a),pe(s,a));ya(T,Ze(Te(e,t)),ne(i.add(c),0,0,0)).toStack()})():re(()=>{let e=ae(se).add(d.mul(4)).toVar(),t=ve(e.mul(.25).floor()).toVar();le(Ae(t).greaterThan(u),()=>{ya(T,Ze(e),ne(t.add(c),0,0,0)).toStack(),Ce()});let{sdf:r}=ue(ce(e,a),pe(e,a));ya(T,Ze(e),ne(r.add(c),0,0,0)).toStack()})(),Ue=re(()=>{let e=ae(se).add(d.mul(2)).toVar();le(e.x.greaterThan(r-1).or(e.y.greaterThan(r-1)).or(e.z.greaterThan(r-1)),()=>{Ce()}),le(Ae(ve(e.mul(.5).floor())).greaterThan(u),()=>{Ce()});let{color:t,colorDivisor:a}=de(ce(e,r-1),pe(e,r-1)),s=a.greaterThan(0).select(t,ne(0));ya(w,Ze(e),Ft(s.add(c),ne(0),ne(1))).toStack()})(),Ge=Ia(T),qe=p?(e,t,r)=>{let s=Ft(ae(e,t,r),ae(0),ae(a)),i=s.mul(.25).floor(),n=be(i),l=Ge.load(Ze(Te(n,s.sub(i.mul(4))))).x;return n.lessThan(-.5).select(ve(i),l)}:(e,t,r)=>Ge.load(Ze(Ft(ae(e,t,r),ae(0),ae(a)))).x,We=e=>{let t=e.x,a=e.y,r=e.z,s=qe(t.add(1),a,r).sub(qe(t.sub(1),a,r)),i=qe(t,a.add(1),r).sub(qe(t,a.sub(1),r)),n=qe(t,a,r.add(1)).sub(qe(t,a,r.sub(1)));return s.equal(0).and(i.equal(0)).and(n.equal(0)).select(ae(.199,.299,.399),Ya(ae(s,i,n)))},He=(t,r,i)=>{let n=((e,t,a)=>{let r=(r,s,i,n)=>qe(e.add(r),t.add(s),a.add(i)).lessThan(0).toFloat().mul(n);return r(0,0,0,1).add(r(1,0,0,2)).add(r(0,1,0,8)).add(r(1,1,0,4)).add(r(0,0,1,16)).add(r(1,0,1,32)).add(r(0,1,1,128)).add(r(1,1,1,64))})(t,r,i).toVar(),u=ie.element(Re(n)).toVar();le(u.lessThan(.5),()=>{Ce()});let d=Ke(M(),rr(u)).toVar();le(ir(d).add(u).mul(3).lessThanEqual(s),()=>{let s=n.add(.5).mul(.00390625);he(5,({i:n})=>{le(ir(n).greaterThanEqual(u),()=>{X()});let h=ir(n).toVar();he(3,({i:n})=>{let u=ir(n).toVar();((t,r,s,i,n,u)=>{let d=n.mul(.0625).add(.03125),h=e.triTable.sample(Y(d,i)).x.mul(2).toInt().toVar(),m=ae(t,r,s).add(oe.element(h)).toVar(),c=ae(t,r,s).add(oe.element(h.add(1))).toVar(),p=qe(m.x,m.y,m.z).toVar(),g=qe(c.x,c.y,c.z).toVar(),f=p.div(p.sub(g)).toVar(),_=m.add(c.sub(m).mul(f)).toVar().div(a).mul(2).sub(1).toVar(),y=_.mul(l).add(ae(o)),x=Ya(qt(We(m),We(c),f)),v=_.add(1).mul(.5),b=Ia(w,v,Re(0)),T=u.toVar();e.buffers.positions.element(T).assign(ne(y,1)),e.buffers.normals.element(T).assign(ne(x,0)),e.buffers.colors.element(T).assign(b)})(t,r,i,s,h.mul(3).add(u),Re(d).add(Re(h)).mul(3).add(Re(u)))})})})},je=p?re(()=>{let{slot:e,local:t}=Be();le(e.greaterThanEqual(g),()=>{Ce()});let r=Le(e).toVar();le(be(r).notEqual(e),()=>{Ce()});let s=r.x.mul(4).add(t.x).toVar(),i=r.y.mul(4).add(t.y).toVar(),n=r.z.mul(4).add(t.z).toVar();le(s.greaterThanEqual(a).or(i.greaterThanEqual(a)).or(n.greaterThanEqual(a)),()=>{Ce()}),He(s,i,n)})():re(()=>{let e=ae(se).x.toVar(),t=ae(se).y.toVar(),r=ae(se).z.toVar();le(e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a)),()=>{Ce()}),le(Ae(ve(ae(e,t,r).mul(.25).floor())).greaterThan(u),()=>{Ce()}),He(e,t,r)})(),$e=()=>{let e=ae(Oe).toVar(),t=e.y.mul(Ne).add(e.x).toVar(),a=ae(0).toVar(),r=ir(0).toVar();return le(t.lessThan(g),()=>{a.assign(Le(t)),le(be(a).equal(t),()=>{r.assign(ir(1))})}),{brick:a,valid:r}},Xe=()=>{let e=ae(Oe).add(d).toVar(),t=ir(0).toVar();return le(e.x.lessThanEqual(n).and(e.y.lessThanEqual(n)).and(e.z.lessThanEqual(n)),()=>{le(be(e).greaterThan(-.5),()=>{t.assign(ir(1))})}),{brick:e,valid:t}},Ye=[[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]],tt=t=>re(()=>{let r=Lh("float",64),s=Lh("float",1),i=ae(ut).toVar(),n=Re(i.x.add(i.y.mul(4)).add(i.z.mul(16))).toVar(),{brick:u,valid:d}=t(),h=F(u).toVar(),m=ir(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=Ye.map(([e,t,a])=>qe(f.add(m.mul(e)),_.add(m.mul(t)),y.add(m.mul(a))).toVar()),b=x[0].lessThan(0).toFloat();for(let e=1;e<8;e++)b=b.add(x[e].lessThan(0).toFloat());let T=b.toVar(),S=ir(0).toVar();le(d.greaterThan(.5).and(g).and(f.add(m).lessThanEqual(a)).and(_.add(m).lessThanEqual(a)).and(y.add(m).lessThanEqual(a)).and(T.greaterThan(.5)).and(T.lessThan(7.5)),()=>{S.assign(ir(1))}),r.element(n).assign(S.add(c)),Fe(),le(n.equal(Re(0)).and(d.greaterThan(.5)),()=>{let e=ir(0).toVar();he(64,({i:t})=>{e.addAssign(r.element(t))});let t=ir(-1).toVar();le(e.greaterThan(.5),()=>{let e=at(z(7),Re(1)).toVar();le(e.greaterThanEqual(1),()=>{t.assign($(e.sub(1)))}).Else(()=>{Ke(z(7),Re(1));let e=Ke(z(6),Re(1)).toVar();le(e.lessThan(Re(v)),()=>{t.assign(e.toFloat())}).Else(()=>{Je(z(8),Re(1))})}),le(t.greaterThan(-.5),()=>{I(u).assign(t.add(c))})}),s.element(Re(0)).assign(t)}),Fe();let V=s.element(Re(0)).toVar(),M=S.greaterThan(.5).or(p.and(g).and(d.greaterThan(.5)).and(f.add(m).lessThanEqual(a)).and(_.add(m).lessThanEqual(a)).and(y.add(m).lessThanEqual(a)));le(M.and(V.greaterThan(-.5)),()=>{let t=ae(0).toVar(),r=ir(0).toVar();for(let[e,a]of et)le(x[e].lessThan(0).toFloat().notEqual(x[a].lessThan(0).toFloat()),()=>{let s=x[e].div(x[e].sub(x[a])),[i,n,l]=Ye[e],[o,u,d]=Ye[a];t.addAssign(ae(i,n,l).add(ae(o-i,u-n,d-l).mul(s)).mul(m)),r.addAssign(1)});let s=t.div(At(r,1)).toVar();le(r.lessThan(.5),()=>{s.assign(ae(m.mul(.5)))});let u=ae(f,_,y).add(s).toVar().div(a).mul(2).sub(1).toVar(),d=u.mul(l).add(ae(o)),h=ae(0).toVar(),c=s.div(m).toVar();for(let e=0;e<8;e++){let[t,a,r]=Ye[e],s=t?Ch(c.x):ir(1).sub(Ch(c.x)),i=a?Ch(c.y):ir(1).sub(Ch(c.y)),n=r?Ch(c.z):ir(1).sub(Ch(c.z));h.addAssign(We(Rh(ae(f.add(m.mul(t)),_.add(m.mul(a)),y.add(m.mul(r))))).mul(s.mul(i).mul(n)))}let g=Ya(h),v=u.add(1).mul(.5),b=Ia(w,v,Re(0)),T=Re(p.select(i.x.add(i.y.mul(2)).add(i.z.mul(4)),ir(n))).toVar(),S=Re(V.mul(64)).add(T).toVar();e.buffers.positions.element(S).assign(ne(d,1)),e.buffers.normals.element(S).assign(ne(g,0)),e.buffers.colors.element(S).assign(b)})})(),rt=_?tt($e):null,st=_?tt(Xe):null,it=e=>re(()=>{let t=Lh("float",64),r=Lh("float",64),s=Lh("float",48),n=ae(ut).toVar(),l=Re(n.x.add(n.y.mul(4)).add(n.z.mul(16))).toVar(),{brick:o,valid:u}=e(),d=o.x.mul(4).add(n.x).toVar(),h=o.y.mul(4).add(n.y).toVar(),m=o.z.mul(4).add(n.z).toVar(),p=qe(d,h,m).lessThan(0).toFloat().toVar(),g=(e,t,a)=>D(Re(R(e.mul(.25))).add(Re(R(t.mul(.25))).mul(i)).add(Re(R(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=ir(0).toVar(),v=ir(0).toVar(),b=ir(0).toVar(),T=ir(1).toVar(),w=ir(1).toVar(),S=ir(1).toVar(),V=(e,t,r,s,i,n,l,o,c)=>{let y=g(...c[0]).add(g(...c[1])).add(g(...c[2])).add(g(...c[3])).greaterThan(3.5).toVar(),x=qe(d.add(r),h.add(s),m.add(i)).lessThan(0).toFloat(),v=qe(d.add(2*r),h.add(2*s),m.add(2*i)).lessThan(0).toFloat();le(u.greaterThan(.5).and(y.not()).and(o.add(1).lessThanEqual(a)).and(_(n,ir(1))).and(_(l,ir(1))).and(p.notEqual(x)),()=>{e.assign(ir(1)),t.assign(ir(1))}),le(u.greaterThan(.5).and(y).and(f(d)).and(f(h)).and(f(m)).and(o.add(2).lessThanEqual(a)).and(_(n,ir(2))).and(_(l,ir(2))).and(p.notEqual(v)),()=>{e.assign(ir(1)),t.assign(ir(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)),Fe(),le(l.equal(Re(0)).and(u.greaterThan(.5)),()=>{let e=ir(0).toVar();he(64,({i:a})=>{r.element(a).assign(e),e.addAssign(t.element(a))}),Ke(M(0),rr(e));let a=R(e.add(7).mul(1/8)).toVar(),i=ir(-1).toVar(),n=ir(-1).toVar();he(48,({i:t})=>{le(ir(t).greaterThanEqual(a),()=>{X()});let r=ir(t).toVar(),l=ir(-1).toVar(),o=at(z(4),Re(1)).toVar();le(o.greaterThanEqual(1),()=>{l.assign(j(o.sub(1)))}).Else(()=>{Ke(z(4),Re(1));let e=Ke(z(3),Re(1)).toVar();le(e.lessThan(Re(x)),()=>{l.assign(e.toFloat())}).Else(()=>{Je(z(5),Re(1))})}),s.element(Re(r)).assign(l),le(l.greaterThan(-.5),()=>{W(l).assign(Dt(e.sub(r.mul(8)),8)),q(l).assign(ir(-1)),le(n.greaterThan(-.5),()=>{q(n).assign(l)}).Else(()=>{i.assign(l)}),n.assign(l)})}),L(o).assign(i)}),Fe(),le(C.greaterThan(.5),()=>{let e=(e,t,a)=>{let r=R(e.mul(.25)),s=R(t.mul(.25)),n=R(a.mul(.25)),l=Re(r).add(Re(s).mul(i)).add(Re(n).mul(i*i)),o=Re(e.sub(r.mul(4))).add(Re(t.sub(s.mul(4))).mul(4)).add(Re(a.sub(n.mul(4))).mul(16));return rr(l.mul(64).add(o))},t=r.element(l).toVar(),a=(e,a,r)=>{let i=s.element(Re(R(t.mul(1/8)))).toVar();le(i.greaterThan(-.5),()=>{let s=t.sub(R(t.mul(1/8)).mul(8)),n=Re(i.mul(24).add(s.mul(3))).toVar();Z(n).assign(e),Z(n.add(Re(1))).assign(a),Z(n.add(Re(2))).assign(r)}),t.addAssign(1)},n=(t,r)=>{le(t.greaterThan(.5),()=>{let t=e(...r[0]).toVar(),s=e(...r[1]).toVar(),i=e(...r[2]).toVar(),n=e(...r[3]).toVar();le(p.greaterThan(.5),()=>{a(t,s,i),a(t,i,n)}).Else(()=>{a(t,n,i),a(t,i,s)})})};n(y,[[d,h.sub(T),m.sub(T)],[d,h,m.sub(T)],[d,h,m],[d,h.sub(T),m]]),n(v,[[d.sub(w),h,m.sub(w)],[d.sub(w),h,m],[d,h,m],[d,h,m.sub(w)]]),n(b,[[d.sub(S),h.sub(S),m],[d,h.sub(S),m],[d,h,m],[d.sub(S),h,m]])})})(),nt=_?it($e):null,lt=_?it(Xe):null,ot=_?re(()=>{let e=Lh("float",48),t=Lh("float",2),r=ae(ut).toVar(),s=Re(r.x.add(r.y.mul(4)).add(r.z.mul(16))).toVar(),i=ae(Oe).toVar(),n=i.y.mul(Ne).add(i.x).toVar();le(s.equal(Re(0)),()=>{let r=ir(0).toVar();le(n.lessThan(g),()=>{let t=Le(n).toVar();le(be(t).equal(n),()=>{let s=ir(0).toVar();le(J.greaterThan(.5),()=>{let e=ae(0).toVar(),r=ae(0).toVar();for(let s=0;s<8;s++){let i=Rh(t.mul(4).add(ae(4*(1&s),4*(s>>1&1),4*(s>>2&1)))),n=Rh(i.div(a).mul(2).sub(1)).mul(l).add(ae(o)),u=ee.mul(ne(n,1)).toVar(),d=Ch(u.w);e.addAssign(ae(Ch(u.x).lessThan(d.negate()).toFloat(),Ch(u.y).lessThan(d.negate()).toFloat(),Ch(u.z).lessThan(0).toFloat())),r.addAssign(ae(Ch(u.x).greaterThan(d).toFloat(),Ch(u.y).greaterThan(d).toFloat(),Ch(u.z).greaterThan(d).toFloat()))}le(At(At(e.x,At(e.y,e.z)),At(r.x,At(r.y,r.z))).greaterThan(7.5),()=>{s.assign(ir(1))})}),le(s.lessThan(.5),()=>{let a=L(t).toVar();he(48,({i:t})=>{le(a.lessThan(-.5),()=>{X()}),e.element(t).assign(a),r.addAssign(W(a)),a.assign(q(a))})})})});let s=ir(0).toVar();le(r.greaterThan(.5),()=>{let e=Ke(M(3),rr(r.mul(3))).toVar();s.assign(ir(e))}),t.element(Re(0)).assign(s.add(c)),t.element(Re(1)).assign(r)}),Fe();let u=t.element(Re(1)).toVar(),d=t.element(Re(0)).toVar(),h=ir(s).toVar();he(6,()=>{le(h.greaterThanEqual(u),()=>{X()});let t=e.element(Re(R(h.mul(1/8)))).toVar(),a=h.sub(R(h.mul(1/8)).mul(8)),r=Re(t.mul(24).add(a.mul(3))).toVar(),s=Re(d.add(h.mul(3))).toVar(),i=e=>{let t=Z(0===e?r:r.add(Re(e))).toVar(),a=Re(t.shiftRight(rr(6))).toVar(),s=Re(t.bitAnd(rr(63))).toVar(),i=(e=>E.element(e.add(Re(2*P))))(a).toVar(),n=D(a),l=s.bitAnd(Re(3)),o=s.shiftRight(Re(2)).bitAnd(Re(3)),u=s.shiftRight(Re(4)).bitAnd(Re(3)),d=l.shiftRight(Re(1)).add(o.shiftRight(Re(1)).mul(Re(2))).add(u.shiftRight(Re(1)).mul(Re(4)));return{blockF:i,li:Re(n.greaterThan(.5).select(d,s)).toVar()}},n=i(0),l=i(1),o=i(2);le(n.blockF.greaterThan(-.5).and(l.blockF.greaterThan(-.5)).and(o.blockF.greaterThan(-.5)),()=>{let e=e=>rr(Re(e.blockF.mul(64)).add(e.li));y.element(s).assign(e(n)),y.element(s.add(Re(1))).assign(e(l)),y.element(s.add(Re(2))).assign(e(o))}).Else(()=>{y.element(s).assign(rr(0)),y.element(s.add(Re(1))).assign(rr(0)),y.element(s.add(Re(2))).assign(rr(0))}),h.addAssign(64)})})():null,dt=Math.ceil(t/Bh[0]),ht=Math.ceil(r/Bh[0]),mt=Math.ceil(i/Bh[0]),ct=(e,t)=>e.compute(t,Array.isArray(t)?Bh:void 0),pt=[Ne,Math.max(1,Math.ceil(g/Ne)),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,E,U,O,K,Q].filter(e=>null!==e).map(e=>e.value),uniforms:{bboxHalf:l,bboxOffset:o,activeThreshold:u,windowOrigin:d,..._?{windowSize:h,cullEnabled:J,cullMVP:ee,adaptCos:te}:{}},kernels:{zero:ct(ge,1),clear:_e.compute([Math.ceil(s/256),1,1],[256,1,1]),coarse:ct(we,[mt,mt,mt]),...Ve?{init:ct(Ve,[mt,mt,mt])}:{},...Me?{release:ct(Me,[mt,mt,mt])}:{},...ze?{alloc:ct(ze,[mt,mt,mt])}:{},...ke?{stats:ct(ke,1)}:{},sdf:ct(De,p?pt:[dt,dt,dt]),...Ie?{sdfWindow:ct(Ie,[dt,dt,dt])}:{},color:ct(Ue,[ht,ht,ht]),extract:_?ct(nt,pt):ct(je,p?pt:[dt,dt,dt]),..._?{clearDraw:ye.compute([Math.ceil(s/256),1,1],[256,1,1]),meshRelease:ct(Pe,[mt,mt,mt]),verts:ct(rt,pt),vertsWindow:ct(st,[i,i,i]),extractWindow:ct(lt,[i,i,i]),classify:ct(Ee,[mt,mt,mt]),gather:ct(ot,pt)}:{}}}}var Fh=24576;function Dh(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/Fh));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 ds(0,0,0),o=new ds,u=0;for(let e=0;e<i;e++){let r=e*s*3;for(let e=0;e<3;e++){let s=a?a.getX(r+e):r+e;o.fromBufferAttribute(t,s),n[u++]=o.x,n[u++]=o.y,n[u++]=o.z,n[u++]=0,l.x=Math.max(l.x,Math.abs(o.x)),l.y=Math.max(l.y,Math.abs(o.y)),l.z=Math.max(l.z,Math.abs(o.z))}}if(0===l.x&&0===l.y&&0===l.z)return null;let d=Math.max(l.x,l.y,l.z);return l.x=1.08*Math.max(l.x,.05*d),l.y=1.08*Math.max(l.y,.05*d),l.z=1.08*Math.max(l.z,.05*d),{data:n,triCount:i,boxHalf:l}}function Uh(e){let t=Ia(e);return(e,a,r)=>{let s=At(ae(a.z,a.w,r.w),ae(1e-5)).toVar(),i=a.y,n=ae(i.mod(4).mul(48),R(i.div(4)).mul(48),0).toVar(),l=Ft(e.div(s).mul(.5).add(.5),ae(0),ae(1)).mul(47).toVar(),o=Dt(R(l),ae(46)).toVar(),u=l.sub(o).toVar(),d=n.add(o).toVar(),h=(e,a,r)=>t.load(Ze(d.add(ae(e,a,r)))).x,m=u.x,c=u.y,p=u.z,g=qt(h(0,0,0),h(1,0,0),m),f=qt(h(0,1,0),h(1,1,0),m),_=qt(h(0,0,1),h(1,0,1),m),y=qt(h(0,1,1),h(1,1,1),m),x=qt(qt(g,f,c),qt(_,y,c),p),v=At(s.x,At(s.y,s.z)),b=Ae(e).sub(s),T=et(At(b,ae(0)));return x.mul(v).add(T)}}function Oh(e){return new ds(e%4*48,48*Math.floor(e/4),0)}var Gh=e=>e,qh=e=>e,Wh=new Ga,Hh=Ea(new ps),jh=lr(1),Kh=lr(1),$h=lr(0),Xh=lr(0),Qh=lr(1),Zh=null;function Yh(){if(null!==Zh)return Zh;let e=re(()=>{let e=Y(jh,Kh),t=Y(1).div(e),a=U().mul(Qh).sub(Y(.5)).mul(2).add(Y(.5)).toVar();a.x.addAssign($h);let r=a.div(e).toVar(),s=Hh.sample(r).x.toVar();r.x.addAssign(t.x);let i=Hh.sample(r).x.toVar();r.y.addAssign(t.y);let n=Hh.sample(r).x.toVar();r.x.subAssign(t.x);let l=Hh.sample(r).x.toVar(),o=s,u=o.add(i),d=u.add(n),h=d.add(l);return ne(h,d,u,o)})(),t=new bt;return t.name="SplineShapeBlend.pyramid",t.fragmentNode=e,t.depthTest=!1,t.depthWrite=!1,t.blending=Us,t.needsUpdate=!0,Zh=t,t}var Jh=!1,em=!1,tm="",am=!1,rm=!1,sm=!1,im=!1,nm=!1,lm=!1,om=!1,um=!1,dm=!1;try{let e=new URLSearchParams(window.location.search);Jh="vertex"===e.get("dbgsbmarch"),em="0"===e.get("dbgsbultra"),tm=e.get("dbgsbchain")??"",am="1"===e.get("dbgsbnoclear"),rm="0"===e.get("dbgsbsparse"),sm="0"===e.get("dbgsbincr"),im="1"===e.get("dbgsblod"),nm="1"===e.get("dbgsbpool"),lm="0"===e.get("dbgsbpool"),om="0"===e.get("dbgsbmesh"),um="0"===e.get("dbgsbadapt"),dm="1"===e.get("dbgsbcull")}catch{}var hm={updates:0,skips:0,computes:0,readbacksResolved:0,readbackErrors:0,fieldsFull:0,fieldsWindowed:0,lastWindowBricks:0,refines:0,lastDispatchRes:0,regathers:0,readbackPending:!1,lastTotal:-1,lastPass:"",staleConfigSkips:0,marchPositions:null},mm=24576,cm=Math.cos(8*Math.PI/180);function pm(e,t,a=1){return new ys(e,t,{count:a,format:gs,type:es,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:Ws,magFilter:Ws,wrapS:Fs,wrapT:Fs})}var gm=class{constructor(e=0,t=0,a=0){this.wantsReplacement=!1,this.capacityHint=0,this._builtOnce=!1,this.level=-1,this.spatialnAtBuild=-1,this._passesRenderer=null,this._marchCapacity=0,this._marchBuffers=null,this._computeNode=null,this._computeNodeKey="",this._legacyMaterialsLevel=-1,this._computeDirty=!1,this._cachedAtBuild=!1,this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,this._lastFieldChangeMs=0,this._ultraResAtBuild=0,this._ultraReadbackPending=!1,this._ultraReadbackQueued=!1,this._ultraWantedCapacity=0,this._poolAtBuild=0,this._ultraWantedPoolBricks=0,this.poolHint=0,this._drawIndex=null,this._vertexBuffers=null,this._vertBlocksAtBuild=0,this._ultraWantedVertexBlocks=0,this.vertHint=0,this._cullCamera=null,this._lastGatherMVP=new Ts,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=Ea(new ps),this.spatialTexNode=Ea(new ps),this.potentialTexNode=Ea(new ps),this.voxelTexNode=Ea(new ps),this.pyramid1TexNode=Ea(new ps),this.pyramid2TexNode=Ea(new ps),this.npartUniform=lr(0),this.spatialnUniform=lr(1),this.spanUniform=lr(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 Hs(r.triTable,16,256,xs,es);i.needsUpdate=!0;let n=new Hs(r.numTrisTable,256,1,xs,es);n.needsUpdate=!0,this.triTableTexNode=Ea(i),this.numTrisTableTexNode=Ea(n)}shapeRow(e,t){return this.shapesTex.sample(Y(e,(t+.5)/5))}_quadMaterial(e,t){let a=new bt;return a.name=e,a.fragmentNode=t,a.depthTest=!1,a.depthWrite=!1,a.blending=Us,a.needsUpdate=!0,a}_buildSpatialMaterial(e){let t=e.spatialDivisions,a=h,r=m,s=this.npartUniform,i=this.spatialnUniform,n=this.spanUniform,l=e.spatialn,o=re(()=>{let e=Y(t*l,t**2),o=R(U().mul(e)).toVar(),u=o.y.toVar(),d=u.sub(R(u.div(t)).mul(t)).toVar();u.assign(R(u.div(t)));let h=u,m=o.x.toVar(),c=m.sub(R(m.div(i)).mul(i)).toVar().mul(4*a).toVar();m.assign(R(m.div(i)));let p=ae(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=ir(0).toVar();for(let i=a-1;i>=0;i--){let a=e.add(i),n=a.add(.5).div(r),l=this.shapeRow(n,0),o=qh(l.xyz),u=Gh(l.w);t.mulAssign(2);let d=Gh(g.x).lessThan(Gh(o.x)).and(Gh(o.x).lessThan(Gh(f.x))).and(Gh(g.y).lessThan(Gh(o.y))).and(Gh(o.y).lessThan(Gh(f.y))).and(Gh(g.z).lessThan(Gh(o.z))).and(Gh(o.z).lessThan(Gh(f.z))).and(a.lessThan(Gh(s))).or(u.equal(-2));t.addAssign(d.select(ir(1),ir(0)))}return t};return ne(_(c),_(c.add(a)),_(c.add(2*a)),_(c.add(3*a)))})();return this._quadMaterial("SplineShapeBlend.spatial",o)}_fieldEnv(e,t){return{shapeRow:(e,t)=>this.shapeRow(e,t),spatialTex:this.spatialTexNode,spatialDivisions:e.spatialDivisions,spatialn:e.spatialn,colorKBump:t,meshSdf:this._meshBaker?Uh(this._meshBaker.atlas):void 0}}_buildPotentialMaterial(e){let t=e.spatialDivisions,a=e.resolution,r=a-1,s=1/a,i=e.zLayersPerRow,n=e.basePyramidSize,l=Nh(this._fieldEnv(e,2*s)),o=re(()=>{let e=R(U().mul(Y(n,n))).toVar(),o=e.x.mod(a),u=e.y.mod(a),d=R(e.x.mul(s)).add(R(e.y.mul(s)).mul(i)),h=ae(o,u,d),m=h.div(r).mul(2).sub(1).toVar(),c=R(h.div(r).mul(t-1)).toVar(),{sdf:p,color:g}=l(m,c),f=rr(g.x.mul(255)),_=rr(g.y.mul(255)),y=f.shiftLeft(rr(8)).bitOr(_);return ne(p,y.toFloat().mul(1525902e-11),g.z,g.w)})();return this._quadMaterial("SplineShapeBlend.potential",o)}_buildVoxelMaterial(e){let t=e.resolution,a=t-1,r=1/t,s=e.zLayersPerRow,i=e.basePyramidSize,n=Th(t,s),l=this.potentialTexNode,o=()=>{let e=R(U().mul(Y(i,i))).toVar();return{xi:e.x.mod(t).toVar(),yi:e.y.mod(t).toVar(),zi:R(e.x.mul(r)).add(R(e.y.mul(r)).mul(s)).toVar()}},u=(e,t,a)=>{let r=(r,s,i,o)=>n(e.add(r),t.add(s),a.add(i),l).x.lessThan(0).toFloat().mul(o);return r(0,0,0,1).add(r(1,0,0,2)).add(r(0,1,0,8)).add(r(1,1,0,4)).add(r(0,0,1,16)).add(r(1,0,1,32)).add(r(0,1,1,128)).add(r(1,1,1,64))},d=re(()=>{let{xi:e,yi:t,zi:r}=o(),s=((e,t,a)=>{let r=n(e.add(1),t,a,l).x.sub(n(e.sub(1),t,a,l).x),s=n(e,t.add(1),a,l).x.sub(n(e,t.sub(1),a,l).x),i=n(e,t,a.add(1),l).x.sub(n(e,t,a.sub(1),l).x);return r.equal(0).and(s.equal(0)).and(i.equal(0)).select(ae(.199,.299,.399),Ya(ae(r,s,i)))})(e,t,r).toVar(),i=ne(s,0).toVar(),d=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return le(d.not(),()=>{i.assign(ne(s,u(e,t,r)))}),i})(),h=re(()=>{let{xi:e,yi:t,zi:r}=o(),s=ne(0).toVar(),i=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return le(i.not(),()=>{let a=u(e,t,r);s.assign(this.numTrisTableTexNode.sample(Y(a.add(.5).div(256),.5)))}),s})();return this._quadMaterial("SplineShapeBlend.voxel",ba({output:d,numTris:h}))}_spatialTargetFor(e){let t=e.resolutionLevel,a=this.spatialTargets[t];return a||(a=pm(e.spatialDivisions*e.spatialn,e.spatialDivisions**2),this.spatialTargets[t]=a),a}_targetsFor(e){let t=e.resolutionLevel,a=this._spatialTargetFor(e),r=this.potentialTargets[t];r||(r=pm(e.basePyramidSize,e.basePyramidSize),this.potentialTargets[t]=r);let s=this.voxelTargets[t];s||(s=pm(e.basePyramidSize,e.basePyramidSize,2),s.textures[0].name="output",s.textures[1].name="numTris",s.textures[1].format=xs,this.voxelTargets[t]=s);let i=this.pyramidTargets[t];return i||(i=[pm(e.pyramidTexture1Width,e.pyramidTexture1Height),pm(e.pyramidTexture2Width,e.pyramidTexture2Height)],this.pyramidTargets[t]=i),{spatial:a,potential:r,voxel:s,pyramid:i}}_marchResources(e){let t=this._targetsFor(e),a=e.pyramidLevelSizes.length%2==0?0:1,r=1-a;return{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:t.pyramid[r].width,height:t.pyramid[r].height},pyramid2Size:{width:t.pyramid[a].width,height:t.pyramid[a].height}}}_maxMarchSlots(e){let t=e.backend?.device?.limits,a=Math.min(t?.maxStorageBufferBindingSize??134217728,t?.maxBufferSize??268435456);return 192*Math.floor(a/16/192)}_ensureMarchCapacity(e,t){if(null!==this._marchBuffers&&e<=this._marchCapacity)return!1;let a=Math.min(Math.max(t,mm),192*Math.ceil(1.5*e/192));if(null!==this._marchBuffers&&a<=this._marchCapacity)return!1;if(null!==this._marchBuffers)for(let e of[this._marchBuffers.positions,this._marchBuffers.normals,this._marchBuffers.colors]){let t=e.value;t&&this._retiredStorage.push(t)}return this._marchBuffers={positions:fe(a,"vec4"),normals:fe(a,"vec4"),colors:fe(a,"vec4")},this._marchCapacity=a,this._computeNode=null,!0}update(e,t,a){if(hm.updates++,this._lastRenderer=t,void 0!==a&&(this._cullCamera=a),e._meshSdfBaked.size>0)for(let[t,a]of e._meshSdfBaked)a.owner!==this&&e._meshSdfBaked.delete(t);let r=p(e),i=!0===t.backend?.isWebGPUBackend;if(i&&e._meshSdfWanted.size>0&&null===this._meshBaker&&(this._meshBaker=function(e,t){let a=new H(192,48*Math.ceil(4),48);a.format=xs,a.type=es,a.minFilter=Ws,a.magFilter=Ws,a.name="SplineShapeBlend.meshSdfAtlas";let r=ir(t).mul(0),s=lr(new ds(0,0,0)),i=lr(0),n=lr(new ds(1,1,1)),l=fe(3*Fh,"vec4"),o=e=>l.element(e),u=re(()=>{let e=ae(se).toVar();le(e.x.greaterThanEqual(48).or(e.y.greaterThanEqual(48)).or(e.z.greaterThanEqual(48)),()=>{Ce()});let t=e.div(47).mul(2).sub(1).mul(n).toVar(),l=ir(1e30).toVar(),u=ir(1e15).toVar();he(Fh,({i:e})=>{le(ir(e).greaterThanEqual(i),()=>{X()});let a=Re(ir(e).toVar()).mul(3).toVar(),r=o(a).xyz.toVar(),s=o(a.add(Re(1))).xyz.toVar(),n=o(a.add(Re(2))).xyz.toVar(),d=s.sub(r).toVar(),h=n.sub(r).toVar(),m=t.sub(r).toVar(),c=Da(d,m).toVar(),p=Da(h,m).toVar(),g=t.sub(s).toVar(),f=Da(d,g).toVar(),_=Da(h,g).toVar(),y=t.sub(n).toVar(),x=Da(d,y).toVar(),v=Da(h,y).toVar(),b=ae(0).toVar(),T=f.mul(v).sub(x.mul(_)).toVar(),w=x.mul(p).sub(c.mul(v)).toVar(),S=c.mul(_).sub(f.mul(p)).toVar();le(c.lessThanEqual(0).and(p.lessThanEqual(0)),()=>{b.assign(r)}).ElseIf(f.greaterThanEqual(0).and(_.lessThanEqual(f)),()=>{b.assign(s)}).ElseIf(v.greaterThanEqual(0).and(x.lessThanEqual(v)),()=>{b.assign(n)}).ElseIf(S.lessThanEqual(0).and(c.greaterThanEqual(0)).and(f.lessThanEqual(0)),()=>{let e=c.div(c.sub(f));b.assign(r.add(d.mul(e)))}).ElseIf(w.lessThanEqual(0).and(p.greaterThanEqual(0)).and(v.lessThanEqual(0)),()=>{let e=p.div(p.sub(v));b.assign(r.add(h.mul(e)))}).ElseIf(T.lessThanEqual(0).and(_.sub(f).greaterThanEqual(0)).and(x.sub(v).greaterThanEqual(0)),()=>{let e=_.sub(f).div(_.sub(f).add(x.sub(v)));b.assign(s.add(n.sub(s).mul(e)))}).Else(()=>{let e=ir(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=Da(V,V).toVar();le(M.lessThan(l),()=>{l.assign(M);let e=ma(d,h),t=Da(V,e).greaterThanEqual(0).select(ir(1),ir(-1));u.assign(na(M).mul(t))})});let d=At(n.x,At(n.y,n.z));ya(a,Ze(e.add(s)),ne(u.div(d).add(r),0,0,0)).toStack()})(),d=Math.ceil(12),h=u.compute([d,d,d],[4,4,4]);return{atlas:a,slots:16,kernel:h,uniforms:{slotOrigin:s,triCount:i,boxHalf:n},setTriangles(e,t){let a=l.value;a.array.set(e.subarray(0,12*t)),a.needsUpdate=!0}}}(0,++this._ultraBuildSeq)),0===e.npart)return null!==this._meshBaker&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t),void(e.geometry.drawRange.count=0);this.npartUniform.value=e.npart,this.spatialnUniform.value=e.spatialn,this.spanUniform.value=e.spatialPassUniforms.span.value,e.shapesDataTexture.value&&(this.shapesTex.value=e.shapesDataTexture.value);let n=!Jh&&i,l=n&&!em&&e.ultraFieldResolution>0,o=l&&!lm&&(nm||e.ultraFieldResolution>=512)?Math.min(Math.pow(e.ultraFieldResolution/4,3),Math.max(function(e){let t=e/4;return Math.min(t*t*t,Math.max(8192,16*t*t))}(e.ultraFieldResolution),this._ultraWantedPoolBricks,this.poolHint)):0,u=o>0&&!om,d=this._maxMarchSlots(t),h=u?Math.min(Math.floor(d/64),Math.max(function(e){let t=e/4;return Math.min(262144,Math.max(2048,2*t*t))}(e.ultraFieldResolution),this._ultraWantedVertexBlocks,this.vertHint)):0,m=null!==this._meshBaker,c=e.needsRebuild||this.level!==e.resolutionLevel||this.spatialnAtBuild!==e.spatialn||this._cachedAtBuild!==n||this._ultraResAtBuild!==(l?e.ultraFieldResolution:0)||this._poolAtBuild!==o||this._vertBlocksAtBuild!==h||this._meshAtBuild!==m;if(c&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let g=n&&this._ensureMarchCapacity(Math.min(Math.max(d,mm),Math.max(e.geometry.drawRange.count,this.capacityHint,l?Math.max(function(e){return Math.max(mm,192*Math.ceil(16*e*e/192))}(e.ultraFieldResolution),this._ultraWantedCapacity):mm)),d);if(g&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let f=this._spatialTargetFor(e),_=l?null:this._targetsFor(e),y=c||g,x=l&&null!==this._ultra&&this._ultraResAtBuild===e.ultraFieldResolution&&!g&&this.level===e.resolutionLevel&&this.spatialnAtBuild===e.spatialn&&this._cachedAtBuild===n;if(y&&x)e.needsRebuild=!1,this._ultra.uniforms.bboxHalf.value=e.bboxSize/2,this._ultra.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag&&(this._ultraDrag.uniforms.bboxHalf.value=e.bboxSize/2,this._ultraDrag.uniforms.bboxOffset.value=e.bboxOffset);else if(y){e.needsRebuild=!1;let t=this.spatialnAtBuild!==e.spatialn;this.level=e.resolutionLevel,this.spatialnAtBuild=e.spatialn,this._meshAtBuild=m,(t||null===this.spatialMaterial)&&(this.spatialMaterial?.dispose(),this.spatialMaterial=this._buildSpatialMaterial(e)),this.spatialTexNode.value=f.texture;let a=this._ultra,r=this._ultraDrag;if(this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,l){let t=e.ultraFieldResolution,i=null!==a&&this._ultraResAtBuild===t;if(i&&!g)this._ultra=a,a.uniforms.bboxHalf.value=e.bboxSize/2,a.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag=r,r&&(r.uniforms.bboxHalf.value=e.bboxSize/2,r.uniforms.bboxOffset.value=e.bboxOffset);else{let n=i&&0===o&&!a.sparse;a&&!n&&this._ultraRetired.push(a.sdfTexture,a.colorTexture,a.coarseTexture),u&&null===this._drawIndex&&(this._drawIndex=fe(this._marchCapacity,"uint")),u&&null===this._vertexBuffers&&(this._vertexBuffers={positions:fe(64*h,"vec4"),normals:fe(64*h,"vec4"),colors:fe(64*h,"vec4")}),this._ultra=Ih({resolution:t,colorResolution:t/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(t/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:s().numTrisTable,buffers:u?this._vertexBuffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,sparseStorage:o>0?{poolBricks:o,meshlet:u?{drawIndex:this._drawIndex,vertexBlocks:h}:void 0}:void 0,reuseTextures:n?{sdfTexture:a.sdfTexture,colorTexture:a.colorTexture,coarseTexture:a.coarseTexture}:void 0}),this._poolAtBuild=o,this._vertBlocksAtBuild=h;let l=im&&t>=128&&!u?t/2:0;r&&(!i||0===l)&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),l>0&&(this._ultraDrag=Ih({resolution:l,colorResolution:l/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(l/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:s().numTrisTable,buffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,reuseTextures:i&&r?{sdfTexture:r.sdfTexture,colorTexture:r.colorTexture,coarseTexture:r.coarseTexture}:void 0}))}this._ultraResAtBuild=t}else{a&&this._ultraRetired.push(a.sdfTexture,a.colorTexture,a.coarseTexture),r&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),(this._legacyMaterialsLevel!==e.resolutionLevel||t||null===this.potentialMaterial||null===this.voxelMaterial)&&(this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose(),this.potentialMaterial=this._buildPotentialMaterial(e),this.voxelMaterial=this._buildVoxelMaterial(e),this._legacyMaterialsLevel=e.resolutionLevel),this.potentialTexNode.value=_.potential.texture,this.voxelTexNode.value=_.voxel.textures[0];let s=e.pyramidLevelSizes.length%2==0?0:1,i=1-s;this.pyramid1TexNode.value=_.pyramid[i].texture,this.pyramid2TexNode.value=_.pyramid[s].texture,this._ultraResAtBuild=0}let i=e.material;void 0===i.defines&&(i.defines={}),tm.includes("nomat")||(i.defines.SHAPEBLEND=e.resolutionLevel),tm.includes("nomat")||i.setShapeBlendResources?.(l?{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:1,height:1},pyramid2Size:{width:1,height:1},cached:u?{...this._vertexBuffers,drawIndex:this._drawIndex}:this._marchBuffers}:{...this._marchResources(e),cached:n?this._marchBuffers:void 0}),this._cachedAtBuild=n;let d=`${e.resolutionLevel}:${this._marchCapacity}`;this._computeNodeKey!==d&&(this._computeNode=null,this._computeNodeKey=d)}if(y)return this._builtOnce=!0,void(this._computeDirty=!0);null!==this._meshBaker&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t);let v=this._passesRenderer!==t,b=r&&!sm&&!this._computeDirty&&!v&&!e._fieldDirtyFull;if(!(r||this._computeDirty||v)){if(l&&this._refinePending&&null!==this._ultra&&performance.now()-this._lastFieldChangeMs>250)return this._refinePending=!1,this._passesRenderer=t,hm.refines++,void this._runUltra(e,t,!1,this._ultra);if(l&&dm&&null!==this._ultra&&this._ultra.meshlet&&this._lastDispatched===this._ultra&&!this._ultraReadbackPending&&this._updateCullUniforms(e,this._ultra)&&(!this._hasGatherMVP||!this._lastGatherMVP.equals(this._ultra.uniforms.cullMVP.value))){this._lastGatherMVP.copy(this._ultra.uniforms.cullMVP.value),this._hasGatherMVP=!0,hm.regathers++;let a=t;return a.compute(this._ultra.kernels.zero),am||a.compute(this._ultra.kernels.clearDraw),a.compute(this._ultra.kernels.gather),this._ultra.kernels.stats&&a.compute(this._ultra.kernels.stats),void this._runUltraReadback(e,t)}if(!e.drawRangeNeedsForceUpdate)return void hm.skips++;if(l)return void(this._ultraReadbackPending||this._runUltraReadback(e,t))}if(this._passesRenderer=t,tm.includes("none")&&hm.readbacksResolved>0)return void(this._computeDirty=!1);let T=t.getRenderTarget(),w=t.getMRT(),S=t.autoClear;if(t.setMRT(null),t.autoClear=!1,hm.lastPass="spatial",t.setRenderTarget(f),Wh.material=this.spatialMaterial,Wh.render(t),l){t.autoClear=S,t.setRenderTarget(T),t.setMRT(w);let a=null!==this._ultraDrag&&r&&!this._computeDirty;return this._refinePending=a,this._lastFieldChangeMs=performance.now(),this._runUltra(e,t,b,a?this._ultraDrag:this._ultra),void(this._computeDirty=!1)}return"spatial"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="potential",t.setRenderTarget(_.potential),Wh.material=this.potentialMaterial,Wh.render(t),"potential"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="voxel",t.setRenderTarget(_.voxel),Wh.material=this.voxelMaterial,Wh.render(t),"voxel"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="pyramid",this._renderPyramid(e,t,_.voxel,_.pyramid),t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),hm.lastPass="march",n&&(null===this._computeNode&&(this._computeNode=function(e,t,a){let r=Vh(e);return re(()=>{let{position:e,normal:a,color:s}=r(me.toFloat());t.positions.element(me).assign(ne(e,1)),t.normals.element(me).assign(ne(a,0)),t.colors.element(me).assign(s)})().compute(a)}(this._marchResources(e),this._marchBuffers,this._marchCapacity)),t.compute(this._computeNode),hm.computes++),void(this._computeDirty=!1))))}_bakeNextMeshChild(e,t){let a=this._meshBaker;for(let[r,s]of e._meshSdfWanted){let i=c(s);if(this._meshBakeFailed.get(r)===i)continue;let n=this._meshSlots.get(r);if(void 0===n){if(this._meshSlots.size>=a.slots)for(let t of this._meshSlots.keys())!e._meshSdfBaked.has(t)&&!e._meshSdfWanted.has(t)&&(this._meshSlots.delete(t),this._meshBakeFailed.delete(t));if(this._meshSlots.size>=a.slots){this._meshWarnedFull||(this._meshWarnedFull=!0,console.warn(`Spline shape blend: more than ${a.slots} distinct mesh children — the extra meshes are left out of the blend.`));continue}let t=new Set(this._meshSlots.values());for(n=0;t.has(n);)n++;this._meshSlots.set(r,n)}let l=Dh(s);if(null!==l)return a.setTriangles(l.data,l.triCount),a.uniforms.slotOrigin.value.copy(Oh(n)),a.uniforms.triCount.value=l.triCount,a.uniforms.boxHalf.value.copy(l.boxHalf),t.compute(a.kernel),e._meshSdfBaked.set(r,{slot:n,boxHalf:l.boxHalf.clone(),posVersion:i,owner:this}),void e._meshSdfWanted.delete(r);this._meshBakeFailed.set(r,i)}}_updateCullUniforms(e,t){if(!t.meshlet)return!1;let a=this._cullCamera;return dm&&a&&void 0!==a.projectionMatrix&&void 0!==a.matrixWorldInverse?(t.uniforms.cullMVP.value.multiplyMatrices(w.unjitteredProjection.value,a.matrixWorldInverse).multiply(e.matrixWorld),t.uniforms.cullEnabled.value=1,!0):(t.uniforms.cullEnabled.value=0,!1)}_runUltra(e,t,a,r){let s=t;hm.lastPass="ultra-kernels",hm.lastDispatchRes=r.resolution,hm.marchPositions=(r.meshlet?this._vertexBuffers:this._marchBuffers).positions.value,this._lastDispatched=r;let i=r.resolution,n=i/4,l=2/(i-1);r.uniforms.activeThreshold.value=rm?1e30:(3*Math.sqrt(3)+4)*l+.25*e._maxBlendK;let o=r.meshlet&&!um;r.meshlet&&(r.uniforms.adaptCos.value=o?cm:2);let u=0,d=0,h=0,m=n,c=n,p=n;if(a){let t=r.uniforms.activeThreshold.value+2/(e.spatialDivisions-1)+4/(i-1),a=e=>Math.floor(.5*(e+1)*(i-1)/4),s=e=>Math.min(n-1,Math.max(0,a(e))),l=e=>Math.min(n,Math.max(1,a(e)+1));if(u=s(e._fieldDirtyMin.x-t),d=s(e._fieldDirtyMin.y-t),h=s(e._fieldDirtyMin.z-t),m=l(e._fieldDirtyMax.x+t)-u,c=l(e._fieldDirtyMax.y+t)-d,p=l(e._fieldDirtyMax.z+t)-h,hm.fieldsWindowed++,o){let e=Math.min(n,u+m+1),t=Math.min(n,d+c+1),a=Math.min(n,h+p+1);u=Math.max(0,u-1),d=Math.max(0,d-1),h=Math.max(0,h-1),m=e-u,c=t-d,p=a-h}}else hm.fieldsFull++;hm.lastWindowBricks=m*c*p,r.uniforms.windowOrigin.value.set(u,d,h),r.uniforms.windowSize?.value.set(m,c,p);let g=0===u&&0===d&&0===h&&m===n&&c===n&&p===n,f=[Math.ceil(m/4),Math.ceil(c/4),Math.ceil(p/4)];r.meshlet&&this._updateCullUniforms(e,r)&&(this._lastGatherMVP.copy(r.uniforms.cullMVP.value),this._hasGatherMVP=!0),s.compute(r.kernels.zero),am||s.compute(r.meshlet?r.kernels.clearDraw:r.kernels.clear),r.needsInit&&r.kernels.init&&(s.compute(r.kernels.init),r.needsInit=!1),s.compute(r.kernels.coarse,f),r.kernels.release&&s.compute(r.kernels.release,f),r.kernels.alloc&&s.compute(r.kernels.alloc,f),r.kernels.meshRelease&&s.compute(r.kernels.meshRelease,f),r.sparse?g?s.compute(r.kernels.sdf):s.compute(r.kernels.sdfWindow,[m,c,p]):s.compute(r.kernels.sdf,[m,c,p]),r.kernels.classify&&s.compute(r.kernels.classify,f),s.compute(r.kernels.color,[Math.ceil(m/2),Math.ceil(c/2),Math.ceil(p/2)]),r.meshlet?(g?(s.compute(r.kernels.verts),s.compute(r.kernels.extract)):(s.compute(r.kernels.vertsWindow,[m,c,p]),s.compute(r.kernels.extractWindow,[m,c,p])),s.compute(r.kernels.gather)):s.compute(r.kernels.extract),r.kernels.stats&&s.compute(r.kernels.stats),hm.computes++,this._ultraReadbackPending?this._ultraReadbackQueued=!0:this._runUltraReadback(e,t)}_disposeRetired(){for(let e of this._ultraRetired)e.dispose();if(this._ultraRetired.length=0,this._retiredStorage.length>0){let e=this._lastRenderer?.backend?.attributeUtils;if(e)for(let t of this._retiredStorage)e.destroyAttribute(t);this._retiredStorage.length=0}for(let e of this._onSettled)e();this._onSettled.length=0}runWhenSettled(e){this._onSettled.push(e)}transferSettleQueue(e){e._onSettled.push(...this._onSettled),this._onSettled.length=0}_runUltraReadback(e,t){let a=this._lastDispatched??this._ultra,r=t;this._ultraReadbackPending=!0,hm.readbackPending=!0,r.getArrayBufferAsync(a.counterAttribute).then(r=>{if(this._ultraReadbackPending=!1,hm.readbackPending=!1,this.retired)return;this._disposeRetired();let s=new Uint32Array(r),i=a.meshlet?Math.floor(s[3]/3):s[0];if(hm.readbacksResolved++,hm.lastTotal=i,a.sparse&&s.length>2&&s[2]>0&&(this._ultraWantedPoolBricks=Math.ceil(1.5*Math.max(s[1],a.poolBricks)),this._computeDirty=!0),a.meshlet&&s.length>5&&s[5]>0){let e=Math.min(24*s[4],this._maxMarchSlots(t));e>this._marchCapacity&&(this._ultraWantedCapacity=Math.max(this._ultraWantedCapacity,e),this._computeDirty=!0)}if(a.meshlet&&s.length>7&&s[7]>0){let e=Math.min(Math.ceil(1.5*s[6]),Math.floor(this._maxMarchSlots(t)/64));e>a.vertexBlocks&&(this._ultraWantedVertexBlocks=Math.max(this._ultraWantedVertexBlocks,e),this._computeDirty=!0)}let n=Math.floor(this._marchCapacity/3);if(e.geometry.drawRange.count=3*Math.min(Math.ceil(1.25*i),n),e.markSceneShadowsDirty(),e.drawRangeNeedsForceUpdate=!1,this._ultraReadbackQueued&&(this._ultraReadbackQueued=!1,this._runUltraReadback(e,t)),i>n){let e=Math.min(3*i,this._maxMarchSlots(t));e>this._marchCapacity&&(this._ultraWantedCapacity=e,this._computeDirty=!0)}}).catch(()=>{hm.readbackErrors++,this._ultraReadbackPending=!1,hm.readbackPending=!1})}_renderPyramid(e,t,a,r){let s=e.pyramidLevelSizes,i=s.length-1-1;$h.value=0,Xh.value=0;for(let n=i;n>=0;n--){let l=n%2==i%2?r[0]:r[1],o=n===i?a:n%2==i%2?r[1]:r[0];Hh.value=o.textures.length>1?o.textures[1]:o.texture,jh.value=o.width,Kh.value=o.height;let u=s[n];2===n&&e.resolutionLevel%2!=0&&(u=3),Qh.value=u,l.viewport.set(Xh.value,0,u,u),t.setRenderTarget(l),Wh.material=Yh(),Wh.render(t),l.viewport.set(0,0,l.width,l.height);let d=$h.value;$h.value=Xh.value,Xh.value=d,n<i&&(Xh.value+=s[n+1])}hm.lastPass="pyramid-readback";let n=s.length%2==0?0:1;t.readRenderTargetPixelsAsync(r[n],r[n].width-1,0,1,1).then(t=>{let a=t[0];hm.readbacksResolved++,hm.lastTotal=a,!this.retired&&(this._disposeRetired(),(3*a>e.geometry.drawRange.count||e.drawRangeNeedsForceUpdate)&&(e.geometry.drawRange.count=3*Math.floor(1.2*a)),e.drawRangeNeedsForceUpdate=!1,null!==this._marchBuffers&&e.geometry.drawRange.count>this._marchCapacity&&(this._computeDirty=!0))}).catch(()=>{})}dispose(){for(let e of[...this.spatialTargets,...this.potentialTargets,...this.voxelTargets,...this.pyramidTargets.flat()])e?.dispose();this.spatialMaterial?.dispose(),this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose();let e=this._lastRenderer?.backend?.attributeUtils,t=t=>{if(e&&null!==t)for(let a of[t.positions,t.normals,t.colors]){let t=a.value;t&&e.destroyAttribute(t)}},a=t=>{if(null!==t){for(let e of Object.values(t.kernels))e?.dispose?.();if(e)for(let a of t.storageAttributes)e.destroyAttribute(a)}};t(this._marchBuffers),t(this._vertexBuffers);let r=this._drawIndex?.value;e&&r&&e.destroyAttribute(r),this._drawIndex=null,this._computeNode?.dispose?.(),this._marchBuffers=null,this._vertexBuffers=null,this._computeNode=null,this._computeNodeKey="",this._marchCapacity=0,a(this._ultra),this._ultra?.sdfTexture.dispose(),this._ultra?.colorTexture.dispose(),this._ultra?.coarseTexture.dispose(),this._ultra=null,a(this._ultraDrag),this._ultraDrag?.sdfTexture.dispose(),this._ultraDrag?.colorTexture.dispose(),this._ultraDrag?.coarseTexture.dispose(),this._ultraDrag=null,this._meshBaker?.atlas.dispose(),this._meshBaker=null,this._lastDispatched=null,this._disposeRetired(),this._lastRenderer=null}},fm=new WeakMap,_m=new WeakMap,ym=[];i(function(e){if(e.cached)return function(e){let t=()=>e.drawIndex?e.drawIndex.element(ye):ye;return{position:re(a=>{let r=e.positions.element(t()).xyz.toVar();return Mh(a,r),r})(),normal:Te(e.normals.element(t()).xyz),color:Te(e.colors.element(t()))}}(e.cached);let t=Vh(e),a=$("vec3","vShapeBlendNormal"),r=$("vec4","vShapeBlendColor");return{position:re(e=>{let{position:s,normal:i,color:n}=t(ye.toFloat());return a.assign(i),r.assign(n),Mh(e,s),s})(),normal:a,color:r}}),l(e=>function(e){let t=fm.get(e);if(t?.wantsReplacement){let a=_m.get(e);_m.set(e,t),t.retired=!0;let r=new gm(t.capacityHint,t.poolHint,t.vertHint);t.transferSettleQueue(r),a&&r.runWhenSettled(()=>a.dispose()),t=r,fm.set(e,t)}return t||(t=new gm,fm.set(e,t)),t}(e)),u({release:e=>function(e){let t=fm.get(e),a=_m.get(e);fm.delete(e),_m.delete(e),a&&ym.push(a),t&&(t.retired=!0,ym.push(t))}(e),drainRetired:function(){let e=ym.length;if(e>0){for(let e of ym)e.dispose();ym.length=0}return e}});var xm=[64,1,1],vm=cr,bm=vm-1,Tm=(e,t)=>void 0!==t?lr(e,t):lr(e),wm=(e,t)=>{let a=e.xyz,r=ma(a,t),s=ma(a,r);return t.add(r.mul(e.w).mul(2)).add(s.mul(2))},Sm=re(([e,t])=>{let a=e,r=t,s=Da(a,r).add(1).toVar(),i=ae(0).toVar();return le(s.lessThan(1e-7),()=>{s.assign(0),le(Ae(a.x).greaterThan(Ae(a.z)),()=>{i.assign(ae(a.y.negate(),a.x,0))}).Else(()=>{i.assign(ae(0,a.z.negate(),a.y))})}).Else(()=>{i.assign(ma(a,r))}),(e=>{let t=Da(e,e);return t.lessThan(1e-10).select(ne(0,0,0,1),e.mul(Pe(At(t,1e-20))))})(ne(i,s))}),Vm=e=>(e=>e.sub(R(e.mul(1/289)).mul(289)))(e.mul(34).add(10).mul(e)),Mm=re(([e])=>{let t=e,a=1/6,r=1/3,s=R(t.add(Da(t,ae(r)))).toVar(),i=t.sub(s).add(Da(s,ae(a))).toVar(),n=da(i.yzx,i.xyz).toVar(),l=ae(1).sub(n).toVar(),o=Dt(n,l.zxy).toVar(),u=At(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(R(e.mul(1/289)).mul(289)))(s));let c=Vm(Vm(Vm(ne(0,o.z,u.z,1).add(s.z)).add(s.y).add(ne(0,o.y,u.y,1))).add(s.x).add(ne(0,o.x,u.x,1))).toVar(),p=.142857142857,g=2*p,f=.5*p-1,_=p,y=c.sub(R(c.mul(_*_)).mul(49)).toVar(),x=R(y.mul(_)).toVar(),v=R(y.sub(x.mul(7))).toVar(),b=x.mul(g).add(f).toVar(),T=v.mul(g).add(f).toVar(),w=ne(1).sub(Ae(b)).sub(Ae(T)).toVar(),S=ne(b.xy,T.xy).toVar(),V=ne(b.zw,T.zw).toVar(),M=R(S).mul(2).add(1).toVar(),C=R(V).mul(2).add(1).toVar(),z=da(w,ne(0)).negate().toVar(),k=S.xzyw.add(M.xzyw.mul(z.xxyy)).toVar(),A=V.xzyw.add(C.xzyw.mul(z.zzww)).toVar(),P=ae(k.xy,w.x).toVar(),E=ae(k.zw,w.y).toVar(),N=ae(A.xy,w.z).toVar(),B=ae(A.zw,w.w).toVar(),L=(e=>ne(1.79284291400159).sub(e.mul(.85373472095314)))(ne(Da(P,P),Da(E,E),Da(N,N),Da(B,B))).toVar();P.assign(P.mul(L.x)),E.assign(E.mul(L.y)),N.assign(N.mul(L.z)),B.assign(B.mul(L.w));let I=At(ne(.5).sub(ne(Da(i,i),Da(d,d),Da(h,h),Da(m,m))),ne(0)).toVar();return I.assign(I.mul(I)),Da(I.mul(I),ne(Da(P,i),Da(E,d),Da(N,h),Da(B,m))).mul(105)}),Cm=class extends Ot{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=Ya(kt.mul(ne(this.tangentWorld,0)).xyz),i=t,n=be,l=Ya(i.add(n)),o=At(et(ma(s,i)),0),u=At(et(ma(s,l)),0);r.directDiffuse.addAssign(a.mul(o).mul(this.diffuseIntensity).mul(Pa.rgb)),r.directSpecular.addAssign(a.mul(ze(u,this.specularPower)).mul(this.specularIntensity).mul(ae(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(Pa.rgb)),r.indirectDiffuse.mulAssign(a)}},Rm=class extends Ot{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=t,i=Wa,n=be,l=Ya(s.add(n)),o=Da(i,s).clamp(),u=Da(i,l).clamp();r.directDiffuse.addAssign(a.mul(o).mul(.85).mul(Pa.rgb)),r.directSpecular.addAssign(a.mul(ze(u,60)).mul(.3).mul(ae(.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(Pa.rgb)),r.indirectDiffuse.mulAssign(a)}},zm=class extends bt{constructor(e){super(),this.model=e,this.lights=!0}setupLightingModel(){return this.model}},km=new us,Am=new us,Pm=new ds,Em=class{constructor(){this.uNumStrands=Tm(0,"int"),this.uNumVerts=Tm(0,"int"),this.uDamping=Tm(.03),this.uLocalStiffness=Tm(.67),this.uGlobalStiffness=Tm(.5),this.uGlobalRange=Tm(.15),this.uStiffnessFalloff=Tm(.1),this.uGravity=Tm(0),this.uVspCoeff=Tm(.01),this.uVspThreshold=Tm(50),this.uKink=Tm(0),this.uKinkFreq=Tm(0),this.uUnitScale=Tm(100),this.uClumpStrength=Tm(0),this.uClumpSize=Tm(32,"int"),this.uClumpTipScale=Tm(1.5),this.uReset=Tm(1),this.uHasWind=Tm(0),this.uWind0=Tm(new ds),this.uWind1=Tm(new ds),this.uWind2=Tm(new ds),this.uWind3=Tm(new ds),this.uBoneQuat=Tm(new _s(0,0,0,1)),this.uBoneTrans=Tm(new ds),this.uDeltaQuat=Tm(new _s(0,0,0,1)),this.uPrevBoneTrans=Tm(new ds),this.uHairRoot=Tm(new Ss),this.uHairMid=Tm(new Ss),this.uHairTip=Tm(new Ss),this.uHeadColor=Tm(new Ss),this.uNoiseA=Tm(new Ss),this.uNoiseB=Tm(new Ss),this.uNoiseC=Tm(new Ss),this.uNoiseD=Tm(new Ss),this.uNoiseScale=Tm(.018),this.uNoiseMixHair=Tm(0),this.uNoiseMixHead=Tm(0),this.uWidth=Tm(.525),this.uSpecPow=Tm(40),this.uSpecInt=Tm(.4),this.uDiffInt=Tm(.6),this.uAmbInt=Tm(.25),this.uOpacity=Tm(1),this.uTipFade=Tm(.4),this.uColorSource=Tm(0),this.uShadeRoot=Tm(.6),this.uShadeTip=Tm(1.15),this.uShadowTexelWorld=Tm(0),this._armed=!1,this._uploadedGeneration=-1,this._prevBoneQuat=new us,this._prevBonePos=new ds,this._hasPrevBone=!1,this._renderer=null,this.initialPos=fe(gr,"vec4"),this.rootColors=fe(pr,"vec4"),this.positions=fe(gr,"vec4"),this.positionsPrev=fe(gr,"vec4"),this.positionsPrevPrev=fe(gr,"vec4"),this.tangents=fe(gr,"vec4"),this.restLengths=fe(gr,"float"),this.vspQuats=fe(pr,"vec4"),this.vspTrans=fe(pr,"vec4"),this.kIntegrate=this._buildIntegrate(),this.kStrandLevel=this._buildStrandLevel(),this.kVsp=this._buildVsp(),this.kLocalShape=this._buildLocalShape(),this.kLengthWind=this._buildLengthWind(),this.kClump=this._buildClump(),this.kRigidFollow=this._buildRigidFollow(),this.ribbonMaterial=this._buildRibbonMaterial(),this.scalpMaterial=this._buildScalpMaterial()}boneQuatNode(){return this.uBoneQuat}boneTransNode(){return this.uBoneTrans}_buildIntegrate(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Ce()});let t=e.div(vm).toVar(),a=e.sub(t.mul(vm)).toVar(),r=this.boneQuatNode(),s=this.boneTransNode(),i=this.initialPos.element(e).toVar(),n=ne(wm(r,i.xyz).add(s),i.w).toVar(),l=this.positions.element(e).toVar(),o=this.positionsPrev.element(e).toVar(),u=o.toVar();le(this.uReset.greaterThan(.5),()=>{l.assign(n),u.assign(n)});let d=n.toVar();le(l.w.greaterThan(0),()=>{let e=ir(_r),t=Ka(this.uDamping.negate().mul(e).mul(60)),a=l.xyz.add(l.xyz.sub(u.xyz).mul(t)).add(ae(0,-1,0).mul(this.uGravity).mul(e).mul(e));d.assign(ne(a,l.w))}),le(this.uGlobalStiffness.greaterThan(0).and(this.uGlobalRange.greaterThan(0)).and(d.w.greaterThan(0)).and(a.toFloat().lessThan(this.uGlobalRange.mul(vm))),()=>{let t=e.sub(a),s=this.initialPos.element(t),i=Ya(wm(r,s.xyz)).y.mul(.5).add(.5),l=this.uGlobalStiffness.mul(ze(At(i,0),this.uStiffnessFalloff)),o=n.xyz.sub(d.xyz).mul(l);d.assign(ne(d.xyz.add(o),d.w))}),le(this.uKink.greaterThan(0).and(d.w.greaterThan(0)),()=>{let e=a.toFloat().div(vm),r=t.sub(t.div(256).mul(256)).toFloat().mul(.0245),i=e.mul(this.uKinkFreq).mul(6.2831853).add(r),l=this.uKink.mul(e).mul(.15).mul(this.uUnitScale),o=Ya(n.xyz.sub(s)).toVar(),u=ae(0).toVar();le(Ae(o.y).lessThan(.99),()=>{u.assign(Ya(ma(o,ae(0,1,0))))}).Else(()=>{u.assign(Ya(ma(o,ae(1,0,0))))});let h=Ya(ma(o,u)),m=u.mul(Wt(i)).mul(l).add(h.mul(oa(i.mul(1.3).add(r))).mul(l).mul(.7));d.assign(ne(d.xyz.add(m),d.w))}),this.positionsPrevPrev.element(e).assign(o),this.positionsPrev.element(e).assign(l),this.positions.element(e).assign(d)})().compute(xm[0],xm)}_buildStrandLevel(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=e.mul(vm).toVar(),a=this.positionsPrevPrev.element(t.add(1)),r=this.positionsPrev.element(t),s=this.positionsPrev.element(t.add(1)),i=this.positions.element(t),n=this.positions.element(t.add(1)),l=s.xyz.sub(r.xyz),o=n.xyz.sub(i.xyz),u=l.div(At(et(l),1e-7)),d=o.div(At(et(o),1e-7)),h=Sm(u,d).toVar(),m=i.xyz.sub(wm(h,r.xyz)),c=this.uVspCoeff.toVar(),p=et(n.xyz.sub(s.xyz.mul(2)).add(a.xyz));le(p.greaterThan(this.uVspThreshold),()=>{c.assign(1)}),this.vspQuats.element(e).assign(h),this.vspTrans.element(e).assign(ne(m,c))})().compute(xm[0],xm)}_buildVsp(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Ce()});let t=e.div(vm).toVar(),a=e.sub(t.mul(vm)).toVar();le(a.lessThan(2),()=>{Ce()});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=>ne(e.xyz.mul(ir(1).sub(i)).add(wm(r,e.xyz).add(s.xyz).mul(i)),e.w);this.positions.element(e).assign(o(n)),this.positionsPrev.element(e).assign(o(l))})().compute(xm[0],xm)}_buildLocalShape(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=e.mul(vm).toVar(),a=Dt(this.uLocalStiffness,.95).mul(.5),r=this.boneQuatNode();he(bm-1,({i:e})=>{let s=t.add(e).add(1).toVar(),i=this.positions.element(s).toVar(),n=this.positions.element(s.add(1)).toVar(),l=this.positions.element(s.sub(1)),o=wm(r,this.initialPos.element(s).xyz),u=wm(r,this.initialPos.element(s.add(1)).xyz),d=wm(r,this.initialPos.element(s.sub(1)).xyz),h=i.xyz.sub(l.xyz),m=u.sub(o),c=o.sub(d),p=Sm(c.div(At(et(c),1e-7)),h.div(At(et(h),1e-7))),g=wm(p,m).add(i.xyz).sub(n.xyz).mul(a);le(i.w.greaterThan(0),()=>{i.assign(ne(i.xyz.sub(g),i.w))}),le(n.w.greaterThan(0),()=>{n.assign(ne(n.xyz.add(g),n.w))}),this.positions.element(s).assign(i),this.positions.element(s.add(1)).assign(n)})})().compute(xm[0],xm)}_buildLengthWind(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=e.mul(vm).toVar();le(this.uHasWind.greaterThan(.5),()=>{let a=e.sub(e.div(20).mul(20)).toFloat().div(20),r=this.uWind0.mul(a).add(this.uWind1.mul(ir(1).sub(a))).add(this.uWind2.mul(a)).add(this.uWind3.mul(ir(1).sub(a))).toVar();he(bm-2,({i:e})=>{let a=t.add(e).add(2).toVar(),s=this.positions.element(a).toVar(),i=this.positions.element(a.add(1)),n=s.xyz.sub(i.xyz),l=ma(ma(n,r),n).negate();s.assign(ne(s.xyz.add(l.mul(_r).mul(.1)),s.w)),this.positions.element(a).assign(s)})}),he(5,()=>{he(bm,({i:e})=>{let a=t.add(e).toVar(),r=this.positions.element(a).toVar(),s=this.positions.element(a.add(1)).toVar(),i=this.restLengths.element(a),n=s.xyz.sub(r.xyz),l=At(et(n),1e-7),o=ir(1).sub(i.div(l)),u=n.mul(o),d=r.w.greaterThan(0),h=s.w.greaterThan(0),m=d.select(h.select(ir(.5),ir(1)),ir(0)),c=h.select(d.select(ir(.5),ir(1)),ir(0));r.assign(ne(r.xyz.add(u.mul(m)),r.w)),s.assign(ne(s.xyz.sub(u.mul(c)),s.w)),this.positions.element(a).assign(r),this.positions.element(a.add(1)).assign(s)})}),he(bm,({i:e})=>{let a=t.add(e).add(1).toVar(),r=this.positions.element(a.sub(1)),s=this.positions.element(a).toVar(),i=s.xyz.sub(r.xyz),n=At(et(i),1e-7),l=this.restLengths.element(a.sub(1));le(n.greaterThan(l),()=>{s.assign(ne(r.xyz.add(i.div(n).mul(l)),s.w)),this.positions.element(a).assign(s)})}),he(vm,({i:e})=>{let a=t.add(e).toVar(),r=e.equal(vm-1).select(a.sub(1),a).toVar(),s=Ya(this.positions.element(r.add(1)).xyz.sub(this.positions.element(r).xyz));this.tangents.element(a).assign(ne(s,0))})})().compute(xm[0],xm)}_buildClump(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=this.uClumpSize.toVar(),a=e.div(t).mul(t).toVar();le(e.equal(a),()=>{Ce()}),le(a.greaterThanEqual(this.uNumStrands),()=>{Ce()});let r=e.mul(vm).toVar(),s=a.mul(vm).toVar();he(bm,({i:e})=>{let t=e.add(1).toVar(),a=t.toFloat().div(bm),i=this.uClumpStrength.mul(ze(a,ir(1).div(At(this.uClumpTipScale,.5)))),n=r.add(t).toVar(),l=this.positions.element(n).toVar(),o=this.positions.element(s.add(t));l.assign(ne(qt(l.xyz,o.xyz,i),l.w)),this.positions.element(n).assign(l)})})().compute(xm[0],xm)}_buildRigidFollow(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Ce()});let t=this.uDeltaQuat,a=this.uPrevBoneTrans,r=this.boneTransNode(),s=s=>{let i=s.element(e).toVar();i.assign(ne(wm(t,i.xyz.sub(a)).add(r),i.w)),s.element(e).assign(i)};s(this.positions),s(this.positionsPrev),s(this.positionsPrevPrev);let i=this.tangents.element(e).toVar();i.assign(ne(wm(t,i.xyz),0)),this.tangents.element(e).assign(i)})().compute(xm[0],xm)}pastelNoise(e){let t=e.sub(this.boneTransNode()).mul(this.uNoiseScale),a=Mm(t).mul(.5).add(.5),r=Mm(t.add(ae(31.7,17.3,53.1))).mul(.5).add(.5),s=Mm(t.mul(.7).add(ae(71.9,11.2,43.8))).mul(.5).add(.5),i=qt(this.uNoiseA,this.uNoiseB,a);return i=qt(i,this.uNoiseC,r.mul(.6)),i=qt(i,this.uNoiseD,s.mul(.25)),i}_buildRibbonMaterial(){let e=$("vec3","vHairTangent"),t=$("vec3","vHairNormal"),a=$("vec2","vHairUv"),r=$("float","vHairRand"),s=$("vec3","vHairInherit"),i=new zm(new Cm(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=Is;let n=i=>re(()=>{let n=Re(me).toVar(),l=n.div(bm).toVar(),o=n.sub(l.mul(bm)).toVar(),u=l.mul(vm).add(o).toVar(),d=Re(ye).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,_=qt(c,p,m).toVar(),y=qt(g,f,m).toVar(),x=Ya(yt.sub(_)),v=ma(y,x).toVar(),b=et(v).toVar();v.assign(b.greaterThan(1e-7).select(v.div(b),ae(1,0,0)));let T=o.toFloat().div(bm),w=o.add(1).toFloat().div(bm),S=qt(T,w,m).toVar(),V=this.uWidth.mul(ir(1).sub(S.mul(this.uTipFade))).toVar(),M=i?(()=>{let e=this.uShadowTexelWorld,t=e.greaterThan(0).select(e.mul(1.5).clamp(ir(2),ir(8)),ir(0));return At(t.sub(V),0).toVar()})():null;M&&V.addAssign(M);let C=h.mul(2).sub(1),R=_.add(v.mul(V).mul(C)).toVar();M&&R.assign(R.sub(x.mul(M)));let z=this.positionsPrev.element(u).xyz,k=this.positionsPrev.element(u.add(1)).xyz;ce.assign(qt(z,k,m).add(v.mul(V).mul(C)));let A=B(Wt(l.toFloat().mul(12.9898)).mul(43758.5453));return r.assign(A),s.assign(this.rootColors.element(l).xyz),e.assign(y),t.assign(Ya(x.sub(y.mul(Da(y,x))))),a.assign(Y(h,S)),R}),l=re(()=>{let e=a.y,t=qt(this.uHairRoot,this.uHairMid,Dt(e.mul(2),1)),i=e.lessThan(.5).select(t,qt(this.uHairMid,this.uHairTip,e.sub(.5).mul(2))).toVar(),n=s.mul(qt(this.uShadeRoot,this.uShadeTip,e));i.assign(this.uColorSource.greaterThan(.5).select(n,i)),i.assign(qt(i,this.pastelNoise(Ve),this.uNoiseMixHair));let l=ir(1).sub(Ae(a.x.sub(.5)).mul(2));return ir(1).sub(e.mul(this.uTipFade)).mul(ze(At(l,0),.5)).toVar().lessThan(.25).discard(),r.greaterThanEqual(this.uOpacity).discard(),ne(i,1)});return i.positionNode=n(!1)(),i.castShadowPositionNode=n(!0)(),i.normalNode=t,i.colorNode=l(),i.needsUpdate=!0,i}_buildScalpMaterial(){let e=new zm(new Rm);e.name="SplineHairScalp";let t=re(()=>{let e=qt(this.uHeadColor,this.pastelNoise(Ve),this.uNoiseMixHead);return ne(e,1)});return e.colorNode=t(),e.needsUpdate=!0,e}update(e,t){let a=t;if(!0!==a.backend?.isWebGPUBackend||(this._renderer=a,!1===e.visible))return;if(!this._armed){this._armed=!0;let t=e.ribbonMesh.material;e.ribbonMesh.material=this.ribbonMaterial,t.dispose?.();let a=e.scalpMesh.material;e.scalpMesh.material=this.scalpMaterial,a.dispose?.(),e.ribbonMesh.visible=!0}e.checkDataDrift();let r=e.activeGuideStrands,s=r*vm;e.generation!==this._uploadedGeneration&&(this._uploadedGeneration=e.generation,this.initialPos.value.array.set(e.roots.initialPositions),this.initialPos.value.needsUpdate=!0,this.restLengths.value.array.set(e.roots.restLengths),this.restLengths.value.needsUpdate=!0,this.rootColors.value.array.set(e.roots.rootColors),this.rootColors.value.needsUpdate=!0,e.ribbonMesh.geometry.instanceCount=r*bm,e.resetRequested=!0),this._syncUniforms(e),e.boneTransform(km,Pm),this.uBoneQuat.value.set(km.x,km.y,km.z,km.w),this.uBoneTrans.value.copy(Pm);let i=this._hasPrevBone&&(Math.abs(this._prevBoneQuat.dot(km))<.9999995||this._prevBonePos.distanceToSquared(Pm)>1e-8),n=Math.floor(e.pendingSimSeconds/_r);n>yr&&(n=yr),e.pendingSimSeconds=Math.max(0,Math.min(e.pendingSimSeconds-n*_r,_r)),e.resetRequested&&n<1&&(n=1),n<1&&i&&(Am.copy(this._prevBoneQuat).invert().premultiply(km),this.uDeltaQuat.value.set(Am.x,Am.y,Am.z,Am.w),this.uPrevBoneTrans.value.copy(this._prevBonePos),this._dispatch(a,this.kRigidFollow,s));for(let t=0;t<n;t++){this.uReset.value=e.resetRequested&&0===t?1:0,e.simTime+=_r,this._updateWind(e),this._dispatch(a,this.kIntegrate,s),this._dispatch(a,this.kStrandLevel,r),this._dispatch(a,this.kVsp,s);for(let e=0;e<2;e++)this._dispatch(a,this.kLocalShape,r);this._dispatch(a,this.kLengthWind,r),e.data.clumpStrength>.001&&this._dispatch(a,this.kClump,r)}n>0&&(e.resetRequested=!1),this._prevBoneQuat.copy(km),this._prevBonePos.copy(Pm),this._hasPrevBone=!0}_dispatch(e,t,a){t.count=a,e.compute(t)}_updateWind(e){let t=e.data,a=Math.max(e.roots.unitScale,.001),r=t.windStrength/a;this.uHasWind.value=t.windStrength>.001?1:0;let s=.7*e.simTime,i=Math.sin(s)*r,n=Math.cos(s)*r*.5;this.uWind0.value.set(i,0,n),this.uWind1.value.set(.7*i,.5*r,1.2*n),this.uWind2.value.set(.3*-i,0,.5*n),this.uWind3.value.set(.5*i,-.3*r,.8*-n)}_shadowTexelWorld(e){let t=e;for(;t.parent;)t=t.parent;let a=t;if(!a?.traverse)return 0;let r=0;return a.traverse(e=>{let t=e;if(!0!==t.isDirectionalLight||!0!==t.castShadow||!1===t.visible)return;let a=t.shadow?.camera,s=t.shadow?.mapSize?.x??0;"number"!=typeof a?.right||"number"!=typeof a?.left||s<=0||(r=Math.max(r,(a.right-a.left)/s))}),r}_syncUniforms(e){let t=e.data,a=e.roots.unitScale;this.uNumStrands.value=e.activeGuideStrands,this.uNumVerts.value=e.activeGuideStrands*vm,this.uDamping.value=t.damping,this.uLocalStiffness.value=t.localStiffness,this.uGlobalStiffness.value=t.globalStiffness,this.uGlobalRange.value=t.globalRange,this.uStiffnessFalloff.value=t.stiffnessFalloff,this.uGravity.value=t.gravity*a,this.uVspCoeff.value=t.vspCoefficient,this.uVspThreshold.value=.5*a,this.uKink.value=t.kink,this.uKinkFreq.value=t.kinkFrequency,this.uUnitScale.value=a,this.uClumpStrength.value=t.clumpStrength,this.uClumpSize.value=Math.max(1,Math.round(t.clumpSize)),this.uClumpTipScale.value=t.clumpTipScale;let r=(e,t)=>{e.value.setRGB(t.r,t.g,t.b,cs)};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*fr*e.widthWorldScale,this.uShadowTexelWorld.value=this._shadowTexelWorld(e),this.uColorSource.value="object"===t.hairColorSource&&"object"===t.headShape&&t.baseObjectId?1:0,this.uShadeRoot.value=t.hairShadeRoot??.6,this.uShadeTip.value=t.hairShadeTip??1.15,this.uSpecPow.value=t.specularPower,this.uSpecInt.value=t.specularIntensity,this.uDiffInt.value=t.diffuseIntensity,this.uAmbInt.value=t.ambientIntensity,this.uOpacity.value=t.opacity,this.uTipFade.value=t.tipFade}dispose(){for(let e of[this.kIntegrate,this.kStrandLevel,this.kVsp,this.kLocalShape,this.kLengthWind,this.kClump,this.kRigidFollow])e.dispose();this.ribbonMaterial.dispose(),this.scalpMaterial.dispose();let e=this._renderer?.backend?.attributeUtils;if(e)for(let t of[this.initialPos,this.rootColors,this.positions,this.positionsPrev,this.positionsPrevPrev,this.tangents,this.restLengths,this.vspQuats,this.vspTrans])e.destroyAttribute(t.value);this._renderer=null}},Nm=new WeakMap,Bm=[];ur(e=>function(e){let t=Nm.get(e);return void 0===t&&(t=new Em,Nm.set(e,t)),t}(e)),hr({release:e=>function(e){let t=Nm.get(e);void 0!==t&&(Nm.delete(e),Bm.push(t))}(e),drainRetired:function(){let e=Bm.length;if(e>0){for(let e of Bm)e.dispose();Bm.length=0}return e}});var Lm="\nconst PI: f32 = 3.14159265358979323846;\n\nconst TRANSMITTANCE_TEXTURE_WIDTH: i32 = 256;\nconst TRANSMITTANCE_TEXTURE_HEIGHT: i32 = 64;\nconst SCATTERING_TEXTURE_R_SIZE: i32 = 32;\nconst SCATTERING_TEXTURE_MU_SIZE: i32 = 128;\nconst SCATTERING_TEXTURE_MU_S_SIZE: i32 = 32;\nconst SCATTERING_TEXTURE_NU_SIZE: i32 = 8;\nconst SCATTERING_TEXTURE_WIDTH: i32 = 256;\nconst SCATTERING_TEXTURE_HEIGHT: i32 = 128;\nconst SCATTERING_TEXTURE_DEPTH: i32 = 32;\nconst IRRADIANCE_TEXTURE_WIDTH: i32 = 64;\nconst IRRADIANCE_TEXTURE_HEIGHT: i32 = 16;\n\nstruct DensityProfileLayer {\n\twidth: f32,\n\texp_term: f32,\n\texp_scale: f32,\n\tlinear_term: f32,\n\tconstant_term: f32,\n\tpad0: f32,\n\tpad1: f32,\n\tpad2: f32,\n}\n\nstruct DensityProfile {\n\tlayers: array<DensityProfileLayer, 2>,\n}\n\n\n\n\nstruct Atm {\n\tsolar_irradiance: vec3f,\n\tsun_angular_radius: f32,\n\trayleigh_scattering: vec3f,\n\tbottom_radius: f32,\n\tmie_scattering: vec3f,\n\ttop_radius: f32,\n\tmie_extinction: vec3f,\n\tmie_phase_function_g: f32,\n\tabsorption_extinction: vec3f,\n\tmu_s_min: f32,\n\tground_albedo: vec3f,\n\tpad0: f32,\n\tsky_spectral_radiance_to_luminance: vec3f,\n\tpad1: f32,\n\tsun_spectral_radiance_to_luminance: vec3f,\n\tpad2: f32,\n\trayleigh_density: DensityProfile,\n\tmie_density: DensityProfile,\n\tabsorption_density: DensityProfile,\n}\n\nfn ClampCosine(mu: f32) -> f32 {\n\treturn clamp(mu, -1.0, 1.0);\n}\n\nfn ClampDistance(d: f32) -> f32 {\n\treturn max(d, 0.0);\n}\n\nfn ClampRadius(atm: Atm, r: f32) -> f32 {\n\treturn clamp(r, atm.bottom_radius, atm.top_radius);\n}\n\nfn SafeSqrt(a: f32) -> f32 {\n\treturn sqrt(max(a, 0.0));\n}\n\n\n\nfn smoothstepGl(edge0: f32, edge1: f32, x: f32) -> f32 {\n\tlet t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n\treturn t * t * (3.0 - 2.0 * t);\n}\n\n\n\n\nfn tex2DBilinear(t: texture_2d<f32>, uv: vec2f, size: vec2i) -> vec4f {\n\tlet coord = uv * vec2f(size) - 0.5;\n\tlet i0 = vec2i(floor(coord));\n\tlet f = coord - floor(coord);\n\tlet maxc = size - 1;\n\tlet c00 = textureLoad(t, clamp(i0, vec2i(0), maxc), 0);\n\tlet c10 = textureLoad(t, clamp(i0 + vec2i(1, 0), vec2i(0), maxc), 0);\n\tlet c01 = textureLoad(t, clamp(i0 + vec2i(0, 1), vec2i(0), maxc), 0);\n\tlet c11 = textureLoad(t, clamp(i0 + vec2i(1, 1), vec2i(0), maxc), 0);\n\treturn mix(mix(c00, c10, f.x), mix(c01, c11, f.x), f.y);\n}\n\nfn tex3DTrilinear(t: texture_3d<f32>, uvw: vec3f, size: vec3i) -> vec4f {\n\tlet coord = uvw * vec3f(size) - 0.5;\n\tlet i0 = vec3i(floor(coord));\n\tlet f = coord - floor(coord);\n\tlet maxc = size - 1;\n\tlet c000 = textureLoad(t, clamp(i0, vec3i(0), maxc), 0);\n\tlet c100 = textureLoad(t, clamp(i0 + vec3i(1, 0, 0), vec3i(0), maxc), 0);\n\tlet c010 = textureLoad(t, clamp(i0 + vec3i(0, 1, 0), vec3i(0), maxc), 0);\n\tlet c110 = textureLoad(t, clamp(i0 + vec3i(1, 1, 0), vec3i(0), maxc), 0);\n\tlet c001 = textureLoad(t, clamp(i0 + vec3i(0, 0, 1), vec3i(0), maxc), 0);\n\tlet c101 = textureLoad(t, clamp(i0 + vec3i(1, 0, 1), vec3i(0), maxc), 0);\n\tlet c011 = textureLoad(t, clamp(i0 + vec3i(0, 1, 1), vec3i(0), maxc), 0);\n\tlet c111 = textureLoad(t, clamp(i0 + vec3i(1, 1, 1), vec3i(0), maxc), 0);\n\tlet z0 = mix(mix(c000, c100, f.x), mix(c010, c110, f.x), f.y);\n\tlet z1 = mix(mix(c001, c101, f.x), mix(c011, c111, f.x), f.y);\n\treturn mix(z0, z1, f.z);\n}\n\nfn GetLayerDensity(layer: DensityProfileLayer, altitude: f32) -> f32 {\n\tlet density = layer.exp_term * exp(layer.exp_scale * altitude) +\n\t\tlayer.linear_term * altitude + layer.constant_term;\n\treturn clamp(density, 0.0, 1.0);\n}\n\nfn GetProfileDensity(profile: DensityProfile, altitude: f32) -> f32 {\n\tif (altitude < profile.layers[0].width) {\n\t\treturn GetLayerDensity(profile.layers[0], altitude);\n\t}\n\treturn GetLayerDensity(profile.layers[1], altitude);\n}\n\nfn DistanceToTopAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {\n\tlet discriminant = r * r * (mu * mu - 1.0) + atm.top_radius * atm.top_radius;\n\treturn ClampDistance(-r * mu + SafeSqrt(discriminant));\n}\n\nfn DistanceToBottomAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {\n\tlet discriminant = r * r * (mu * mu - 1.0) +\n\t\tatm.bottom_radius * atm.bottom_radius;\n\treturn ClampDistance(-r * mu - SafeSqrt(discriminant));\n}\n\nfn RayIntersectsGround(atm: Atm, r: f32, mu: f32) -> bool {\n\treturn mu < 0.0 &&\n\t\tr * r * (mu * mu - 1.0) + atm.bottom_radius * atm.bottom_radius >= 0.0;\n}\n\nfn GetTextureCoordFromUnitRange(x: f32, texture_size: i32) -> f32 {\n\treturn 0.5 / f32(texture_size) + x * (1.0 - 1.0 / f32(texture_size));\n}\n\nfn GetUnitRangeFromTextureCoord(u: f32, texture_size: i32) -> f32 {\n\treturn (u - 0.5 / f32(texture_size)) / (1.0 - 1.0 / f32(texture_size));\n}\n\nfn GetTransmittanceTextureUvFromRMu(atm: Atm, r: f32, mu: f32) -> vec2f {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius);\n\tlet d = DistanceToTopAtmosphereBoundary(atm, r, mu);\n\tlet d_min = atm.top_radius - r;\n\tlet d_max = rho + H;\n\tlet x_mu = (d - d_min) / (d_max - d_min);\n\tlet x_r = rho / H;\n\treturn vec2f(\n\t\tGetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH),\n\t\tGetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT));\n}\n\nfn GetRMuFromTransmittanceTextureUv(\n\tatm: Atm, uv: vec2f, r: ptr<function, f32>, mu: ptr<function, f32>) {\n\tlet x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH);\n\tlet x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT);\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = H * x_r;\n\t*r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius);\n\tlet d_min = atm.top_radius - *r;\n\tlet d_max = rho + H;\n\tlet d = d_min + x_mu * (d_max - d_min);\n\tif (d == 0.0) {\n\t\t*mu = 1.0;\n\t} else {\n\t\t*mu = (H * H - rho * rho - d * d) / (2.0 * (*r) * d);\n\t}\n\t*mu = ClampCosine(*mu);\n}\n\nfn GetTransmittanceToTopAtmosphereBoundary(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu: f32) -> vec3f {\n\tlet uv = GetTransmittanceTextureUvFromRMu(atm, r, mu);\n\treturn tex2DBilinear(transmittance_texture, uv,\n\t\tvec2i(TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT)).rgb;\n}\n\nfn GetTransmittance(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, d: f32, ray_r_mu_intersects_ground: bool) -> vec3f {\n\tlet r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\tlet mu_d = ClampCosine((r * mu + d) / r_d);\n\n\tif (ray_r_mu_intersects_ground) {\n\t\treturn min(\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, -mu_d) /\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, -mu),\n\t\t\tvec3f(1.0, 1.0, 1.0));\n\t} else {\n\t\treturn min(\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu) /\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, mu_d),\n\t\t\tvec3f(1.0, 1.0, 1.0));\n\t}\n}\n\nfn GetTransmittanceToSun(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet sin_theta_h = atm.bottom_radius / r;\n\tlet cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0));\n\n\tlet step = smoothstepGl(-sin_theta_h * atm.sun_angular_radius,\n\t\tsin_theta_h * atm.sun_angular_radius,\n\t\tmu_s - cos_theta_h);\n\n\treturn GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) * step;\n}\n\nfn RayleighPhaseFunction(nu: f32) -> f32 {\n\tlet k = 3.0 / (16.0 * PI);\n\treturn k * (1.0 + nu * nu);\n}\n\nfn MiePhaseFunction(g: f32, nu: f32) -> f32 {\n\tlet k = 3.0 / (8.0 * PI) * (1.0 - g * g) / (2.0 + g * g);\n\treturn k * (1.0 + nu * nu) / pow(abs(1.0 + g * g - 2.0 * g * nu), 1.5);\n}\n\nfn GetScatteringTextureUvwzFromRMuMuSNu(\n\tatm: Atm, r: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec4f {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius);\n\tlet u_r = GetTextureCoordFromUnitRange(rho / H, SCATTERING_TEXTURE_R_SIZE);\n\n\tlet r_mu = r * mu;\n\tlet discriminant = r_mu * r_mu - r * r +\n\t\tatm.bottom_radius * atm.bottom_radius;\n\tvar u_mu: f32;\n\n\tif (ray_r_mu_intersects_ground) {\n\t\tlet d = -r_mu - SafeSqrt(discriminant);\n\t\tlet d_min = r - atm.bottom_radius;\n\t\tlet d_max = rho;\n\t\tvar x: f32 = 0.0;\n\t\tif (d_max != d_min) {\n\t\t\tx = (d - d_min) / (d_max - d_min);\n\t\t}\n\t\tu_mu = 0.5 - 0.5 * GetTextureCoordFromUnitRange(x, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t} else {\n\t\tlet d = -r_mu + SafeSqrt(discriminant + H * H);\n\t\tlet d_min = atm.top_radius - r;\n\t\tlet d_max = rho + H;\n\t\tu_mu = 0.5 + 0.5 * GetTextureCoordFromUnitRange(\n\t\t\t(d - d_min) / (d_max - d_min), SCATTERING_TEXTURE_MU_SIZE / 2);\n\t}\n\n\tlet d = DistanceToTopAtmosphereBoundary(atm, atm.bottom_radius, mu_s);\n\tlet d_min = atm.top_radius - atm.bottom_radius;\n\tlet d_max = H;\n\tlet a = (d - d_min) / (d_max - d_min);\n\tlet A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min);\n\n\tlet u_mu_s = GetTextureCoordFromUnitRange(\n\t\tmax(1.0 - a / A, 0.0) / (1.0 + a), SCATTERING_TEXTURE_MU_S_SIZE);\n\n\tlet u_nu = (nu + 1.0) / 2.0;\n\treturn vec4f(u_nu, u_mu_s, u_mu, u_r);\n}\n\nfn GetRMuMuSNuFromScatteringTextureUvwz(\n\tatm: Atm, uvwz: vec4f,\n\tr: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>,\n\tnu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = H * GetUnitRangeFromTextureCoord(uvwz.w, SCATTERING_TEXTURE_R_SIZE);\n\t*r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius);\n\n\tif (uvwz.z < 0.5) {\n\t\tlet d_min = *r - atm.bottom_radius;\n\t\tlet d_max = rho;\n\t\tlet d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord(\n\t\t\t1.0 - 2.0 * uvwz.z, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t\tif (d == 0.0) {\n\t\t\t*mu = -1.0;\n\t\t} else {\n\t\t\t*mu = ClampCosine(-(rho * rho + d * d) / (2.0 * (*r) * d));\n\t\t}\n\t\t*ray_r_mu_intersects_ground = true;\n\t} else {\n\t\tlet d_min = atm.top_radius - *r;\n\t\tlet d_max = rho + H;\n\t\tlet d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord(\n\t\t\t2.0 * uvwz.z - 1.0, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t\tif (d == 0.0) {\n\t\t\t*mu = 1.0;\n\t\t} else {\n\t\t\t*mu = ClampCosine((H * H - rho * rho - d * d) / (2.0 * (*r) * d));\n\t\t}\n\t\t*ray_r_mu_intersects_ground = false;\n\t}\n\n\tlet x_mu_s = GetUnitRangeFromTextureCoord(uvwz.y, SCATTERING_TEXTURE_MU_S_SIZE);\n\tlet d_min = atm.top_radius - atm.bottom_radius;\n\tlet d_max = H;\n\tlet A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min);\n\tlet a = (A - x_mu_s * A) / (1.0 + x_mu_s * A);\n\tlet d = d_min + min(a, A) * (d_max - d_min);\n\tif (d == 0.0) {\n\t\t*mu_s = 1.0;\n\t} else {\n\t\t*mu_s = ClampCosine((H * H - d * d) / (2.0 * atm.bottom_radius * d));\n\t}\n\n\t*nu = ClampCosine(uvwz.x * 2.0 - 1.0);\n}\n\nfn GetRMuMuSNuFromScatteringTextureFragCoord(\n\tatm: Atm, frag_coord: vec3f,\n\tr: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>,\n\tnu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {\n\tlet SCATTERING_TEXTURE_SIZE = vec4f(\n\t\tf32(SCATTERING_TEXTURE_NU_SIZE - 1),\n\t\tf32(SCATTERING_TEXTURE_MU_S_SIZE),\n\t\tf32(SCATTERING_TEXTURE_MU_SIZE),\n\t\tf32(SCATTERING_TEXTURE_R_SIZE));\n\n\tlet frag_coord_nu = floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE));\n\tlet frag_coord_mu_s = frag_coord.x -\n\t\tf32(SCATTERING_TEXTURE_MU_S_SIZE) * floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE));\n\n\tlet uvwz = vec4f(frag_coord_nu, frag_coord_mu_s, frag_coord.y, frag_coord.z) /\n\t\tSCATTERING_TEXTURE_SIZE;\n\n\tGetRMuMuSNuFromScatteringTextureUvwz(\n\t\tatm, uvwz, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\t*nu = clamp(*nu,\n\t\t(*mu) * (*mu_s) - sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))),\n\t\t(*mu) * (*mu_s) + sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))));\n}\n\nfn GetIrradianceTextureUvFromRMuS(atm: Atm, r: f32, mu_s: f32) -> vec2f {\n\tlet x_r = (r - atm.bottom_radius) / (atm.top_radius - atm.bottom_radius);\n\tlet x_mu_s = mu_s * 0.5 + 0.5;\n\treturn vec2f(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH),\n\t\tGetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT));\n}\n\nfn GetIrradiance(\n\tatm: Atm, irradiance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet uv = GetIrradianceTextureUvFromRMuS(atm, r, mu_s);\n\treturn tex2DBilinear(irradiance_texture, uv,\n\t\tvec2i(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT)).rgb;\n}\n",Im=e=>`\n${Lm}\n\nfn ComputeOpticalLengthToTopAtmosphereBoundary(\n\tatm: Atm, profile: DensityProfile, r: f32, mu: f32) -> f32 {\n\tconst SAMPLE_COUNT: i32 = 500;\n\tlet dx = DistanceToTopAtmosphereBoundary(atm, r, mu) / f32(SAMPLE_COUNT);\n\tvar result: f32 = 0.0;\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\t\tlet r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r);\n\t\tlet y_i = GetProfileDensity(profile, r_i - atm.bottom_radius);\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\tresult += y_i * weight_i * dx;\n\t}\n\treturn result;\n}\n\nfn ComputeTransmittanceToTopAtmosphereBoundary(\n\tatm: Atm, r: f32, mu: f32) -> vec3f {\n\tvar density = vec3f(0.0);\n\tdensity += atm.rayleigh_scattering *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.rayleigh_density, r, mu);\n\tdensity += atm.mie_extinction *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.mie_density, r, mu);\n\tdensity += atm.absorption_extinction *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.absorption_density, r, mu);\n\treturn exp(-density);\n}\n\nfn ComputeTransmittanceToTopAtmosphereBoundaryTexture(\n\tatm: Atm, frag_coord: vec2f) -> vec3f {\n\tlet TRANSMITTANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(TRANSMITTANCE_TEXTURE_WIDTH), f32(TRANSMITTANCE_TEXTURE_HEIGHT));\n\tvar r: f32;\n\tvar mu: f32;\n\tGetRMuFromTransmittanceTextureUv(\n\t\tatm, frag_coord / TRANSMITTANCE_TEXTURE_SIZE, &r, &mu);\n\treturn ComputeTransmittanceToTopAtmosphereBoundary(atm, r, mu);\n}\n\nfn ComputeSingleScatteringIntegrand(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32, d: f32,\n\tray_r_mu_intersects_ground: bool,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tlet r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\tlet mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d);\n\n\tlet transmittance =\n\t\tGetTransmittance(atm, transmittance_texture, r, mu, d, ray_r_mu_intersects_ground) *\n\t\tGetTransmittanceToSun(atm, transmittance_texture, r_d, mu_s_d);\n\n\t*rayleigh = transmittance *\n\t\tGetProfileDensity(atm.rayleigh_density, r_d - atm.bottom_radius);\n\t*mie = transmittance *\n\t\tGetProfileDensity(atm.mie_density, r_d - atm.bottom_radius);\n}\n\nfn DistanceToNearestAtmosphereBoundary(\n\tatm: Atm, r: f32, mu: f32, ray_r_mu_intersects_ground: bool) -> f32 {\n\tif (ray_r_mu_intersects_ground) {\n\t\treturn DistanceToBottomAtmosphereBoundary(atm, r, mu);\n\t}\n\treturn DistanceToTopAtmosphereBoundary(atm, r, mu);\n}\n\nfn ComputeSingleScattering(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tconst SAMPLE_COUNT: i32 = 50;\n\tlet dx = DistanceToNearestAtmosphereBoundary(\n\t\tatm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT);\n\n\tvar rayleigh_sum = vec3f(0.0);\n\tvar mie_sum = vec3f(0.0);\n\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\t\tvar rayleigh_i: vec3f;\n\t\tvar mie_i: vec3f;\n\t\tComputeSingleScatteringIntegrand(\n\t\t\tatm, transmittance_texture, r, mu, mu_s, nu, d_i,\n\t\t\tray_r_mu_intersects_ground, &rayleigh_i, &mie_i);\n\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\trayleigh_sum += rayleigh_i * weight_i;\n\t\tmie_sum += mie_i * weight_i;\n\t}\n\n\t*rayleigh = rayleigh_sum * dx * atm.solar_irradiance * atm.rayleigh_scattering;\n\t*mie = mie_sum * dx * atm.solar_irradiance * atm.mie_scattering;\n}\n\nfn ComputeSingleScatteringTexture(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec3f,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar nu: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground);\n\tComputeSingleScattering(\n\t\tatm, transmittance_texture, r, mu, mu_s, nu,\n\t\tray_r_mu_intersects_ground, rayleigh, mie);\n}\n\n// The n-th-order lookup used during precompute: the delta textures are\n// float32, so they go through the manual trilinear helper.\nfn GetScatteringDelta(\n\tatm: Atm, scattering_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec3f {\n\tlet uvwz = GetScatteringTextureUvwzFromRMuMuSNu(\n\t\tatm, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\tlet tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1);\n\tlet tex_x = floor(tex_coord_x);\n\tlet lerp = tex_coord_x - tex_x;\n\n\tlet uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\tlet uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\n\tlet size = vec3i(SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT, SCATTERING_TEXTURE_DEPTH);\n\treturn tex3DTrilinear(scattering_texture, uvw0, size).rgb * (1.0 - lerp) +\n\t\ttex3DTrilinear(scattering_texture, uvw1, size).rgb * lerp;\n}\n\nfn GetScatteringOrder(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\tscattering_order: i32) -> vec3f {\n\tif (scattering_order == 1) {\n\t\tlet rayleigh = GetScatteringDelta(\n\t\t\tatm, single_rayleigh_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t\tlet mie = GetScatteringDelta(\n\t\t\tatm, single_mie_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t\treturn rayleigh * RayleighPhaseFunction(nu) +\n\t\t\tmie * MiePhaseFunction(atm.mie_phase_function_g, nu);\n\t} else {\n\t\treturn GetScatteringDelta(\n\t\t\tatm, multiple_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t}\n}\n\nfn GetRMuSFromIrradianceTextureUv(\n\tatm: Atm, uv: vec2f, r: ptr<function, f32>, mu_s: ptr<function, f32>) {\n\tlet x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH);\n\tlet x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT);\n\t*r = atm.bottom_radius + x_r * (atm.top_radius - atm.bottom_radius);\n\t*mu_s = ClampCosine(2.0 * x_mu_s - 1.0);\n}\n\nfn ComputeDirectIrradiance(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet alpha_s = atm.sun_angular_radius;\n\n\tvar average_cosine_factor: f32;\n\tif (mu_s < -alpha_s) {\n\t\taverage_cosine_factor = 0.0;\n\t} else if (mu_s > alpha_s) {\n\t\taverage_cosine_factor = mu_s;\n\t} else {\n\t\taverage_cosine_factor = (mu_s + alpha_s) * (mu_s + alpha_s) / (4.0 * alpha_s);\n\t}\n\n\treturn atm.solar_irradiance *\n\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) *\n\t\taverage_cosine_factor;\n}\n\nfn ComputeIndirectIrradiance(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tr: f32, mu_s: f32, scattering_order: i32) -> vec3f {\n\tconst SAMPLE_COUNT: i32 = 32;\n\tlet dphi = PI / f32(SAMPLE_COUNT);\n\tlet dtheta = PI / f32(SAMPLE_COUNT);\n\n\tvar result = vec3f(0.0);\n\tlet omega_s = vec3f(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s);\n\n\tfor (var j: i32 = 0; j < SAMPLE_COUNT / 2; j++) {\n\t\tlet theta = (f32(j) + 0.5) * dtheta;\n\t\tfor (var i: i32 = 0; i < 2 * SAMPLE_COUNT; i++) {\n\t\t\tlet phi = (f32(i) + 0.5) * dphi;\n\t\t\tlet omega = vec3f(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta));\n\t\t\tlet domega = dtheta * dphi * sin(theta);\n\t\t\tlet nu = dot(omega, omega_s);\n\n\t\t\tresult += GetScatteringOrder(atm,\n\t\t\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\t\t\tmultiple_scattering_texture,\n\t\t\t\tr, omega.z, mu_s, nu, false, scattering_order) * omega.z * domega;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfn ComputeDirectIrradianceTexture(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec2f) -> vec3f {\n\tvar r: f32;\n\tvar mu_s: f32;\n\tlet IRRADIANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT));\n\tGetRMuSFromIrradianceTextureUv(\n\t\tatm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s);\n\treturn ComputeDirectIrradiance(atm, transmittance_texture, r, mu_s);\n}\n\nfn ComputeIndirectIrradianceTexture(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tfrag_coord: vec2f, scattering_order: i32) -> vec3f {\n\tvar r: f32;\n\tvar mu_s: f32;\n\tlet IRRADIANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT));\n\tGetRMuSFromIrradianceTextureUv(\n\t\tatm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s);\n\treturn ComputeIndirectIrradiance(atm,\n\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\tmultiple_scattering_texture, r, mu_s, scattering_order);\n}\n\nfn ComputeScatteringDensity(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32, scattering_order: i32) -> vec3f {\n\tlet zenith_direction = vec3f(0.0, 0.0, 1.0);\n\tlet omega = vec3f(sqrt(1.0 - mu * mu), 0.0, mu);\n\tvar sun_dir_x: f32 = 0.0;\n\tif (omega.x != 0.0) {\n\t\tsun_dir_x = (nu - mu * mu_s) / omega.x;\n\t}\n\tlet sun_dir_y = sqrt(max(1.0 - sun_dir_x * sun_dir_x - mu_s * mu_s, 0.0));\n\tlet omega_s = vec3f(sun_dir_x, sun_dir_y, mu_s);\n\n\tconst SAMPLE_COUNT: i32 = 16;\n\tlet dphi = PI / f32(SAMPLE_COUNT);\n\tlet dtheta = PI / f32(SAMPLE_COUNT);\n\tvar rayleigh_mie = vec3f(0.0);\n\n\tfor (var l: i32 = 0; l < SAMPLE_COUNT; l++) {\n\t\tlet theta = (f32(l) + 0.5) * dtheta;\n\t\tlet cos_theta = cos(theta);\n\t\tlet sin_theta = sin(theta);\n\t\tlet ray_r_theta_intersects_ground = RayIntersectsGround(atm, r, cos_theta);\n\n\t\tvar distance_to_ground: f32 = 0.0;\n\t\tvar transmittance_to_ground = vec3f(0.0);\n\t\tvar ground_albedo = vec3f(0.0);\n\t\tif (ray_r_theta_intersects_ground) {\n\t\t\tdistance_to_ground = DistanceToBottomAtmosphereBoundary(atm, r, cos_theta);\n\t\t\ttransmittance_to_ground = GetTransmittance(\n\t\t\t\tatm, transmittance_texture, r, cos_theta, distance_to_ground, true);\n\t\t\t// NOTE: the reference leaves ground_albedo at vec3(0) here (it\n\t\t\t// declares it but never assigns atm.ground_albedo) — transcribed\n\t\t\t// as-is so the LUTs match bit-for-bit in spirit.\n\t\t}\n\n\t\tfor (var m: i32 = 0; m < 2 * SAMPLE_COUNT; m++) {\n\t\t\tlet phi = (f32(m) + 0.5) * dphi;\n\t\t\tlet omega_i = vec3f(cos(phi) * sin_theta, sin(phi) * sin_theta, cos_theta);\n\t\t\tlet domega_i = dtheta * dphi * sin(theta);\n\n\t\t\tlet nu1 = dot(omega_s, omega_i);\n\t\t\tvar incident_radiance = GetScatteringOrder(atm,\n\t\t\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\t\t\tmultiple_scattering_texture, r, omega_i.z, mu_s, nu1,\n\t\t\t\tray_r_theta_intersects_ground, scattering_order - 1);\n\n\t\t\tlet ground_normal = normalize(zenith_direction * r + omega_i * distance_to_ground);\n\t\t\tlet ground_irradiance = GetIrradiance(\n\t\t\t\tatm, irradiance_texture, atm.bottom_radius, dot(ground_normal, omega_s));\n\t\t\tincident_radiance += transmittance_to_ground * ground_albedo *\n\t\t\t\t(1.0 / PI) * ground_irradiance;\n\n\t\t\tlet nu2 = dot(omega, omega_i);\n\n\t\t\tlet rayleigh_density = GetProfileDensity(\n\t\t\t\tatm.rayleigh_density, r - atm.bottom_radius);\n\t\t\tlet mie_density = GetProfileDensity(\n\t\t\t\tatm.mie_density, r - atm.bottom_radius);\n\n\t\t\trayleigh_mie += incident_radiance * (\n\t\t\t\tatm.rayleigh_scattering * rayleigh_density * RayleighPhaseFunction(nu2) +\n\t\t\t\tatm.mie_scattering * mie_density * MiePhaseFunction(atm.mie_phase_function_g, nu2)) *\n\t\t\t\tdomega_i;\n\t\t}\n\t}\n\n\treturn rayleigh_mie;\n}\n\nfn ComputeMultipleScattering(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_density_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec3f {\n\tconst SAMPLE_COUNT: i32 = 50;\n\tlet dx = DistanceToNearestAtmosphereBoundary(\n\t\tatm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT);\n\n\tvar rayleigh_mie_sum = vec3f(0.0);\n\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\n\t\tlet r_i = ClampRadius(atm, sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r));\n\t\tlet mu_i = ClampCosine((r * mu + d_i) / r_i);\n\t\tlet mu_s_i = ClampCosine((r * mu_s + d_i * nu) / r_i);\n\n\t\tlet rayleigh_mie_i =\n\t\t\tGetScatteringDelta(atm, scattering_density_texture, r_i, mu_i, mu_s_i, nu,\n\t\t\t\tray_r_mu_intersects_ground) *\n\t\t\tGetTransmittance(atm, transmittance_texture, r, mu, d_i,\n\t\t\t\tray_r_mu_intersects_ground) * dx;\n\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\trayleigh_mie_sum += rayleigh_mie_i * weight_i;\n\t}\n\n\treturn rayleigh_mie_sum;\n}\n\nfn ComputeScatteringDensityTexture(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tfrag_coord: vec3f, scattering_order: i32) -> vec3f {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar nu: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground);\n\n\treturn ComputeScatteringDensity(atm, transmittance_texture,\n\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\tmultiple_scattering_texture, irradiance_texture, r, mu, mu_s, nu,\n\t\tscattering_order);\n}\n\nfn ComputeMultipleScatteringTexture(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_density_texture: texture_3d<f32>,\n\tfrag_coord: vec3f, nu: ptr<function, f32>) -> vec3f {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, nu, &ray_r_mu_intersects_ground);\n\n\treturn ComputeMultipleScattering(atm, transmittance_texture,\n\t\tscattering_density_texture, r, mu, mu_s, *nu,\n\t\tray_r_mu_intersects_ground);\n}\n\n\nstruct PassParams {\n\tluminance_from_radiance: mat3x3f,\n\tblend: vec4f,\n\tlayer: i32,\n\tscattering_order: i32,\n}\n\nfn RadianceToLuminance(pass_params: PassParams, rad: vec3f) -> vec3f {\n\treturn pass_params.luminance_from_radiance * rad;\n}\n\n@group(0) @binding(0) var<uniform> atm: Atm;\n@group(0) @binding(1) var<uniform> pass_params: PassParams;\n${e}\n`,Fm=Im("\n@group(0) @binding(2) var out_transmittance: texture_storage_2d<rgba32float, write>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\ttextureStore(out_transmittance, coord,\n\t\tvec4f(ComputeTransmittanceToTopAtmosphereBoundaryTexture(atm, frag_coord), 1.0));\n}\n",Dm=Im("\n@group(0) @binding(2) var irradiance_read: texture_2d<f32>;\n@group(0) @binding(3) var out_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(4) var out_delta_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(5) var transmittance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\n\ttextureStore(out_delta_irradiance, coord,\n\t\tvec4f(ComputeDirectIrradianceTexture(atm, transmittance, frag_coord), 1.0));\n\n\tvar result = vec4f(0.0, 0.0, 0.0, 1.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tresult += textureLoad(irradiance_read, coord, 0);\n\t}\n\ttextureStore(out_irradiance, coord, result);\n}\n",Um=Im("\n@group(0) @binding(2) var out_delta_rayleigh: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var out_delta_mie: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(4) var scattering_read: texture_3d<f32>;\n@group(0) @binding(5) var out_scattering: texture_storage_3d<rgba16float, write>;\n@group(0) @binding(6) var transmittance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tvar delta_rayleigh: vec3f;\n\tvar delta_mie: vec3f;\n\tComputeSingleScatteringTexture(atm, transmittance, frag_coord,\n\t\t&delta_rayleigh, &delta_mie);\n\n\ttextureStore(out_delta_rayleigh, coord, vec4f(delta_rayleigh, 1.0));\n\ttextureStore(out_delta_mie, coord, vec4f(delta_mie, 1.0));\n\n\tvar scattering = vec4f(\n\t\tRadianceToLuminance(pass_params, delta_rayleigh),\n\t\tRadianceToLuminance(pass_params, delta_mie).r);\n\tif (pass_params.blend[2] == 1.0) {\n\t\tscattering += textureLoad(scattering_read, coord, 0);\n\t}\n\ttextureStore(out_scattering, coord, scattering);\n}\n",Om=Im("\n@group(0) @binding(2) var out_delta_scattering_density: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var transmittance: texture_2d<f32>;\n@group(0) @binding(4) var single_rayleigh_scattering: texture_3d<f32>;\n@group(0) @binding(5) var single_mie_scattering: texture_3d<f32>;\n@group(0) @binding(6) var multiple_scattering: texture_3d<f32>;\n@group(0) @binding(7) var irradiance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tlet scattering_density = ComputeScatteringDensityTexture(\n\t\tatm, transmittance, single_rayleigh_scattering, single_mie_scattering,\n\t\tmultiple_scattering, irradiance, frag_coord, pass_params.scattering_order);\n\n\ttextureStore(out_delta_scattering_density, coord, vec4f(scattering_density, 1.0));\n}\n",Gm=Im("\n@group(0) @binding(2) var out_delta_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(3) var irradiance_read: texture_2d<f32>;\n@group(0) @binding(4) var out_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(5) var single_rayleigh_scattering: texture_3d<f32>;\n@group(0) @binding(6) var single_mie_scattering: texture_3d<f32>;\n@group(0) @binding(7) var multiple_scattering: texture_3d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\n\tlet delta_irradiance_value = ComputeIndirectIrradianceTexture(\n\t\tatm, single_rayleigh_scattering, single_mie_scattering,\n\t\tmultiple_scattering, frag_coord, pass_params.scattering_order);\n\ttextureStore(out_delta_irradiance, coord, vec4f(delta_irradiance_value, 1.0));\n\n\tvar irradiance = vec4f(RadianceToLuminance(pass_params, delta_irradiance_value), 1.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tirradiance += textureLoad(irradiance_read, coord, 0);\n\t}\n\ttextureStore(out_irradiance, coord, irradiance);\n}\n",qm=Im("\n@group(0) @binding(2) var out_delta_multiple_scattering: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var scattering_read: texture_3d<f32>;\n@group(0) @binding(4) var out_scattering: texture_storage_3d<rgba16float, write>;\n@group(0) @binding(5) var transmittance: texture_2d<f32>;\n@group(0) @binding(6) var delta_scattering_density: texture_3d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tvar nu: f32;\n\tlet delta_multiple_scattering_value = ComputeMultipleScatteringTexture(\n\t\tatm, transmittance, delta_scattering_density, frag_coord, &nu);\n\n\ttextureStore(out_delta_multiple_scattering, coord,\n\t\tvec4f(delta_multiple_scattering_value, 1.0));\n\n\tvar scattering = vec4f(\n\t\tRadianceToLuminance(pass_params, delta_multiple_scattering_value) /\n\t\t\tRayleighPhaseFunction(nu),\n\t\t0.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tscattering += textureLoad(scattering_read, coord, 0);\n\t}\n\ttextureStore(out_scattering, coord, scattering);\n}\n";function Wm(e){let t=e.backend.device;if(!t)throw new Error("[spline/sky] WebGPU device unavailable for LUT precompute");return t}function Hm(e,t){e.initTexture(t);let a=e.backend.get(t);if(!a?.texture)throw new Error("[spline/sky] three did not allocate a GPU texture");return a.texture}function jm(e,t,a,r){let s=new O(e,t);return s.type=a,s.minFilter=Ws,s.magFilter=Ws,s.generateMipmaps=!1,s.mipmapsAutoUpdate=!1,s.name=r,s}function Km(e,t,a,r,s,i){let n=new H(e,t,a);return n.type=r,n.minFilter=i,n.magFilter=i,n.generateMipmaps=!1,n.mipmapsAutoUpdate=!1,n.name=s,n}var $m=256,Xm={transmittance:{code:Fm,entries:[{storage:"2d",format:"rgba32float"}]},directIrradiance:{code:Dm,entries:[{sampled:"2d"},{storage:"2d",format:"rgba32float"},{storage:"2d",format:"rgba32float"},{sampled:"2d"}]},singleScattering:{code:Um,entries:[{storage:"3d",format:"rgba32float"},{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"}]},scatteringDensity:{code:Om,entries:[{storage:"3d",format:"rgba32float"},{sampled:"2d"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"},{sampled:"2d"}]},indirectIrradiance:{code:Gm,entries:[{storage:"2d",format:"rgba32float"},{sampled:"2d"},{storage:"2d",format:"rgba32float"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"}]},multipleScattering:{code:qm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"},{sampled:"3d"}]}};async function Qm(e,t,a,r,s,i){let n=Wm(e),l=Hm(e,t),o=a*(i?8:16),u=256*Math.ceil(o/256),d=n.createBuffer({size:u*r*s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),h=n.createCommandEncoder();h.copyTextureToBuffer({texture:l},{buffer:d,bytesPerRow:u,rowsPerImage:r},{width:a,height:r,depthOrArrayLayers:s}),n.queue.submit([h.finish()]),await d.mapAsync(GPUMapMode.READ);let m=d.getMappedRange(),c=new Float32Array(a*r*s*4);for(let e=0;e<s;e++)for(let t=0;t<r;t++){let s=(e*r+t)*u;if(i){let i=new Uint16Array(m,s,4*a);for(let s=0;s<4*a;s++)c[(e*r+t)*a*4+s]=Zm(i[s])}else{let i=new Float32Array(m,s,4*a);c.set(i,(e*r+t)*a*4)}}return d.unmap(),d.destroy(),c}function Zm(e){let t=(32768&e)>>15,a=(31744&e)>>10,r=1023&e;return 0===a?(t?-1:1)*Math.pow(2,-14)*(r/1024):31===a?r?NaN:1/0*(t?-1:1):(t?-1:1)*Math.pow(2,a-15)*(1+r/1024)}function Ym(e,t){return.5/t+e*(1-1/t)}function Jm(e,t,a,r,s){let i=Math.min(Math.max(r*t-.5,0),t-1),n=Math.min(Math.max(s*a-.5,0),a-1),l=Math.floor(i),o=Math.floor(n),u=Math.min(l+1,t-1),d=Math.min(o+1,a-1),h=i-l,m=n-o,c=[0,0,0];for(let a=0;a<3;a++){let r=e[4*(o*t+l)+a],s=e[4*(o*t+u)+a],i=e[4*(d*t+l)+a],n=e[4*(d*t+u)+a];c[a]=(r*(1-h)+s*h)*(1-m)+(i*(1-h)+n*h)*m}return c}function ec(e,t,a,r){let s=e.bottomRadius/a,i=-Math.sqrt(Math.max(0,1-s*s)),n=function(e,t,a){let r=Math.min(1,Math.max(0,(a-e)/(t-e)));return r*r*(3-2*r)}(-s*e.sunAngularRadius,s*e.sunAngularRadius,r-i),l=function(e,t,a,r){let s=Math.sqrt(e.topRadius*e.topRadius-e.bottomRadius*e.bottomRadius),i=Math.sqrt(Math.max(0,a*a-e.bottomRadius*e.bottomRadius)),n=function(e,t,a){let r=t*t*(a*a-1)+e.topRadius*e.topRadius;return Math.max(0,-t*a+Math.sqrt(Math.max(0,r)))}(e,a,r),l=e.topRadius-a,o=i/s;return Jm(t,256,64,Ym((n-l)/(i+s-l),256),Ym(o,64))}(e,t,a,r);return[l[0]*n,l[1]*n,l[2]*n]}function tc(e){return.2126*e[0]+.7152*e[1]+.0722*e[2]}function ac(e,t,a,r){let s=ec(e,t.transmittance,a,r),i=e.sunSpectralRadianceToLuminance;return[e.solarIrradiance[0]*s[0]*i[0],e.solarIrradiance[1]*s[1]*i[1],e.solarIrradiance[2]*s[2]*i[2]]}function rc(e,t,a,r){let s=function(e,t,a,r){let s=(a-e.bottomRadius)/(e.topRadius-e.bottomRadius);return Jm(t,64,16,Ym(.5*r+.5,64),Ym(s,16))}(e,t.irradiance,a,r),i=e.skySpectralRadianceToLuminance;return[s[0]*i[0],s[1]*i[1],s[2]*i[2]]}var sc="6.0e4",ic="\nfn GetExtrapolatedSingleMieScattering(atm: Atm, scattering: vec4f) -> vec3f {\n\tif (scattering.r == 0.0) {\n\t\treturn vec3f(0.0);\n\t}\n\treturn scattering.rgb * scattering.a / scattering.r *\n\t\t(atm.rayleigh_scattering.r / atm.mie_scattering.r) *\n\t\t(atm.mie_scattering / atm.rayleigh_scattering);\n}\n\nfn GetCombinedScattering(\n\tatm: Atm,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\tsingle_mie_scattering: ptr<function, vec3f>) -> vec3f {\n\tlet uvwz = GetScatteringTextureUvwzFromRMuMuSNu(\n\t\tatm, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\tlet tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1);\n\tlet tex_x = floor(tex_coord_x);\n\tlet lerp = tex_coord_x - tex_x;\n\n\tlet uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\tlet uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\n\tlet combined_scattering =\n\t\ttextureSampleLevel(scattering_texture, scattering_sampler, uvw0, 0.0) * (1.0 - lerp) +\n\t\ttextureSampleLevel(scattering_texture, scattering_sampler, uvw1, 0.0) * lerp;\n\tlet scattering = combined_scattering.xyz;\n\t*single_mie_scattering = GetExtrapolatedSingleMieScattering(atm, combined_scattering);\n\n\treturn scattering;\n}\n\n// GLSL relies on sqrt(negative) = NaN making both branch conditions false;\n// WGSL leaves that indeterminate, so the discriminant is tested explicitly —\n// same control flow for every defined input.\nfn GetSkyRadiance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tcamera_in: vec3f, view_ray: vec3f, shadow_length: f32,\n\tsun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f {\n\tvar camera = camera_in;\n\tvar r = length(camera);\n\tvar rmu = dot(camera, view_ray);\n\tlet disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius;\n\tvar distance_to_top_atmosphere_boundary = -1.0;\n\tif (disc >= 0.0) {\n\t\tdistance_to_top_atmosphere_boundary = -rmu - sqrt(disc);\n\t}\n\n\tif (distance_to_top_atmosphere_boundary > 0.0) {\n\t\tcamera = camera + view_ray * distance_to_top_atmosphere_boundary;\n\t\tr = atm.top_radius;\n\t\trmu += distance_to_top_atmosphere_boundary;\n\t} else if (r > atm.top_radius) {\n\t\t*transmittance = vec3f(0.0);\n\t\treturn vec3f(0.0);\n\t}\n\n\tlet mu = rmu / r;\n\tlet mu_s = dot(camera, sun_direction) / r;\n\tlet nu = dot(view_ray, sun_direction);\n\tlet ray_r_mu_intersects_ground = RayIntersectsGround(atm, r, mu);\n\n\tif (ray_r_mu_intersects_ground) {\n\t\t*transmittance = vec3f(0.0);\n\t} else {\n\t\t*transmittance = GetTransmittanceToTopAtmosphereBoundary(\n\t\t\tatm, transmittance_texture, r, mu);\n\t}\n\n\tvar single_mie_scattering: vec3f;\n\tvar scattering: vec3f;\n\n\tif (shadow_length == 0.0) {\n\t\tscattering = GetCombinedScattering(\n\t\t\tatm, scattering_texture, scattering_sampler,\n\t\t\tr, mu, mu_s, nu, ray_r_mu_intersects_ground,\n\t\t\t&single_mie_scattering);\n\t} else {\n\t\tlet d = shadow_length;\n\t\tlet r_p = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\t\tlet mu_p = (r * mu + d) / r_p;\n\t\tlet mu_s_p = (r * mu_s + d * nu) / r_p;\n\n\t\tscattering = GetCombinedScattering(\n\t\t\tatm, scattering_texture, scattering_sampler,\n\t\t\tr_p, mu_p, mu_s_p, nu, ray_r_mu_intersects_ground,\n\t\t\t&single_mie_scattering);\n\n\t\tlet shadow_transmittance = GetTransmittance(\n\t\t\tatm, transmittance_texture, r, mu, shadow_length,\n\t\t\tray_r_mu_intersects_ground);\n\n\t\tscattering = scattering * shadow_transmittance;\n\t\tsingle_mie_scattering = single_mie_scattering * shadow_transmittance;\n\t}\n\n\treturn scattering * RayleighPhaseFunction(nu) + single_mie_scattering *\n\t\tMiePhaseFunction(atm.mie_phase_function_g, nu);\n}\n\n/**\n * The transmittance half of GetSkyRadiance, without the radiance.\n *\n * The clouds march calls GetSkyRadiance once per LIT step purely for its\n * transmittance out-param and drops the returned radiance on the floor —\n * paying two 3D scattering-LUT samples, the single-Mie extrapolation and\n * both phase functions (a pow among them) for a value nothing reads. Whether a\n * driver's optimizer notices is up to the driver; this is the same control\n * flow and the same lookup with the dead half deleted, so the value is\n * bit-identical either way.\n */\nfn GetSkyTransmittance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tcamera_in: vec3f, view_ray: vec3f) -> vec3f {\n\tvar camera = camera_in;\n\tvar r = length(camera);\n\tvar rmu = dot(camera, view_ray);\n\tlet disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius;\n\tvar distance_to_top_atmosphere_boundary = -1.0;\n\tif (disc >= 0.0) {\n\t\tdistance_to_top_atmosphere_boundary = -rmu - sqrt(disc);\n\t}\n\n\tif (distance_to_top_atmosphere_boundary > 0.0) {\n\t\tcamera = camera + view_ray * distance_to_top_atmosphere_boundary;\n\t\tr = atm.top_radius;\n\t\trmu += distance_to_top_atmosphere_boundary;\n\t} else if (r > atm.top_radius) {\n\t\treturn vec3f(0.0);\n\t}\n\n\tlet mu = rmu / r;\n\tif (RayIntersectsGround(atm, r, mu)) {\n\t\treturn vec3f(0.0);\n\t}\n\treturn GetTransmittanceToTopAtmosphereBoundary(\n\t\tatm, transmittance_texture, r, mu);\n}\n\nfn GetSunAndSkyIrradiance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f,\n\tsky_irradiance: ptr<function, vec3f>) -> vec3f {\n\tlet r = length(p);\n\tlet mu_s = dot(p, sun_direction) / r;\n\n\t*sky_irradiance = GetIrradiance(atm, irradiance_texture, r, mu_s) *\n\t\t(1.0 + dot(normal, p) / r) * 0.5;\n\n\treturn atm.solar_irradiance *\n\t\tGetTransmittanceToSun(atm, transmittance_texture, r, mu_s) *\n\t\tmax(dot(normal, sun_direction), 0.0);\n}\n\n// atmosphere.glsl wrappers: radiance -> luminance via the spectral factors.\nfn GetSkyRadianceLum(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tcamera: vec3f, view_ray: vec3f, shadow_length: f32,\n\tsun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f {\n\treturn GetSkyRadiance(atm, transmittance_texture, scattering_texture,\n\t\tscattering_sampler, camera, view_ray, shadow_length, sun_direction,\n\t\ttransmittance) * atm.sky_spectral_radiance_to_luminance;\n}\n\nfn GetSunAndSkyIrradianceLum(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f,\n\tsky_irradiance: ptr<function, vec3f>) -> vec3f {\n\tlet sun_irradiance = GetSunAndSkyIrradiance(\n\t\tatm, transmittance_texture, irradiance_texture, p, normal,\n\t\tsun_direction, sky_irradiance);\n\t*sky_irradiance = *sky_irradiance * atm.sky_spectral_radiance_to_luminance;\n\treturn sun_irradiance * atm.sun_spectral_radiance_to_luminance;\n}\n\n/**\n * The sky half of GetSunAndSkyIrradianceLum. Same story as\n * GetSkyTransmittance: the clouds march reads only the sky out-param and\n * discards the sun return, whose GetTransmittanceToSun is a second manual\n * bilinear (four texel loads) plus a smoothstep. Multiplication order is\n * kept exactly as the two-function chain evaluates it, so the result is\n * bit-identical.\n */\nfn GetSkyIrradianceLum(\n\tatm: Atm,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f) -> vec3f {\n\tlet r = length(p);\n\tlet mu_s = dot(p, sun_direction) / r;\n\treturn GetIrradiance(atm, irradiance_texture, r, mu_s) *\n\t\t(1.0 + dot(normal, p) / r) * 0.5 *\n\t\tatm.sky_spectral_radiance_to_luminance;\n}\n\n// Rebuild the Atm struct from the packed uniforms the TSL entries receive\n// (density profiles are precompute-only and stay zeroed).\nfn UnpackAtm(\n\tsolar_irradiance: vec3f,\n\trayleigh_scattering: vec3f,\n\tmie_scattering: vec3f,\n\tsky_srtl: vec3f,\n\tsun_srtl: vec3f,\n\t// x: sun_angular_radius, y: bottom_radius, z: top_radius, w: mie_phase_g\n\tscalars: vec4f,\n\tmu_s_min: f32) -> Atm {\n\tvar atm: Atm;\n\tatm.solar_irradiance = solar_irradiance;\n\tatm.rayleigh_scattering = rayleigh_scattering;\n\tatm.mie_scattering = mie_scattering;\n\tatm.sky_spectral_radiance_to_luminance = sky_srtl;\n\tatm.sun_spectral_radiance_to_luminance = sun_srtl;\n\tatm.sun_angular_radius = scalars.x;\n\tatm.bottom_radius = scalars.y;\n\tatm.top_radius = scalars.z;\n\tatm.mie_phase_function_g = scalars.w;\n\tatm.mu_s_min = mu_s_min;\n\treturn atm;\n}\n\n// ray.vert's interpolation, reproduced exactly: the reference normalizes the\n// corner rays in the VERTEX shader, interpolates the unit vectors, then\n// renormalizes per fragment — bilinear-mixing the four unit corner rays here\n// is that same math (not the same as unprojecting the fragment directly).\nfn SkyViewRay(\n\tuv: vec2f, ray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f) -> vec3f {\n\treturn normalize(mix(mix(ray00, ray10, uv.x), mix(ray01, ray11, uv.x), uv.y));\n}\n",nc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\tlet earth_center = vec3f(0.0, -atm.bottom_radius, 0.0);\n\tlet camera = cameraPos - earth_center;\n\tlet sun_dir = normalize(sunDir);\n\tlet view_ray = SkyViewRay(uv, ray00, ray10, ray01, ray11);\n\n\tvar transmittance: vec3f;\n\tlet sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex,\n\t\tscatteringSamp, camera, view_ray, 0.0, sun_dir, &transmittance);\n\n\treturn vec4f(min(sky, vec3f(${sc})), 1.0);\n`,lc="\nfn mod289v4(x: vec4f) -> vec4f { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfn permuteV4(x: vec4f) -> vec4f { return mod289v4(((x * 34.0) + 10.0) * x); }\n\nfn taylorInvSqrt(r: vec4f) -> vec4f { return 1.79284291400159 - 0.85373472095314 * r; }\n\nfn mod289v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfn simplexNoise(v: vec3f) -> f32 {\n\tlet C = vec2f(1.0 / 6.0, 1.0 / 3.0);\n\tlet D = vec4f(0.0, 0.5, 1.0, 2.0);\n\n\t// First corner\n\tvar i = floor(v + dot(v, C.yyy));\n\tlet x0 = v - i + dot(i, C.xxx);\n\n\t// Other corners\n\tlet g = step(x0.yzx, x0.xyz);\n\tlet l = 1.0 - g;\n\tlet i1 = min(g.xyz, l.zxy);\n\tlet i2 = max(g.xyz, l.zxy);\n\n\tlet x1 = x0 - i1 + C.xxx;\n\tlet x2 = x0 - i2 + C.yyy;\n\tlet x3 = x0 - D.yyy;\n\n\t// Permutations\n\ti = mod289v3(i);\n\tlet p = permuteV4(permuteV4(permuteV4(\n\t\ti.z + vec4f(0.0, i1.z, i2.z, 1.0)) +\n\t\ti.y + vec4f(0.0, i1.y, i2.y, 1.0)) +\n\t\ti.x + vec4f(0.0, i1.x, i2.x, 1.0));\n\n\tlet n_ = 0.142857142857;\n\tlet ns = n_ * D.wyz - D.xzx;\n\n\tlet j = p - 49.0 * floor(p * ns.z * ns.z);\n\n\tlet x_ = floor(j * ns.z);\n\tlet y_ = floor(j - 7.0 * x_);\n\n\tlet x = x_ * ns.x + ns.yyyy;\n\tlet y = y_ * ns.x + ns.yyyy;\n\tlet h = 1.0 - abs(x) - abs(y);\n\n\tlet b0 = vec4f(x.xy, y.xy);\n\tlet b1 = vec4f(x.zw, y.zw);\n\n\tlet s0 = floor(b0) * 2.0 + 1.0;\n\tlet s1 = floor(b1) * 2.0 + 1.0;\n\tlet sh = -step(h, vec4f(0.0));\n\n\tlet a0 = b0.xzyw + s0.xzyw * sh.xxyy;\n\tlet a1 = b1.xzyw + s1.xzyw * sh.zzww;\n\n\tvar p0 = vec3f(a0.xy, h.x);\n\tvar p1 = vec3f(a0.zw, h.y);\n\tvar p2 = vec3f(a1.xy, h.z);\n\tvar p3 = vec3f(a1.zw, h.w);\n\n\t// Normalise gradients\n\tlet norm = taylorInvSqrt(vec4f(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\n\t// Mix final noise value\n\tvar m = max(0.5 - vec4f(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec4f(0.0));\n\tm = m * m;\n\treturn 105.0 * dot(m * m, vec4f(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));\n}\n\nfn simplexFBM(x: vec3f, octaves: i32, freq_in: f32) -> f32 {\n\tvar final_: f32 = 0.0;\n\tvar denom: f32 = 0.0;\n\tvar amp: f32 = 1.0;\n\tvar freq = freq_in;\n\n\tfor (var i: i32 = 0; i < octaves; i++) {\n\t\tfinal_ += amp * simplexNoise(x * freq);\n\t\tdenom += amp;\n\n\t\tfreq *= 2.0;\n\t\tamp *= 0.5;\n\t}\n\n\treturn final_ / denom;\n}\n\nfn mod7v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 7.0)) * 7.0; }\n\nfn permuteV3(x: vec3f) -> vec3f { return mod289v3((34.0 * x + 10.0) * x); }\n\nfn worleyNoise(P: vec3f) -> f32 {\n\tlet K = 0.142857142857;\n\tlet Ko = 0.428571428571;\n\tlet K2 = 0.020408163265306;\n\tlet Kz = 0.166666666667;\n\tlet Kzo = 0.416666666667;\n\tlet jitter = 1.0;\n\n\tlet Pi = mod289v3(floor(P));\n\tlet Pf = fract(P) - 0.5;\n\n\tlet Pfx = Pf.x + vec3f(1.0, 0.0, -1.0);\n\tlet Pfy = Pf.y + vec3f(1.0, 0.0, -1.0);\n\tlet Pfz = Pf.z + vec3f(1.0, 0.0, -1.0);\n\n\tlet p = permuteV3(Pi.x + vec3f(-1.0, 0.0, 1.0));\n\tlet p1 = permuteV3(p + Pi.y - 1.0);\n\tlet p2 = permuteV3(p + Pi.y);\n\tlet p3 = permuteV3(p + Pi.y + 1.0);\n\n\tlet p11 = permuteV3(p1 + Pi.z - 1.0);\n\tlet p12 = permuteV3(p1 + Pi.z);\n\tlet p13 = permuteV3(p1 + Pi.z + 1.0);\n\n\tlet p21 = permuteV3(p2 + Pi.z - 1.0);\n\tlet p22 = permuteV3(p2 + Pi.z);\n\tlet p23 = permuteV3(p2 + Pi.z + 1.0);\n\n\tlet p31 = permuteV3(p3 + Pi.z - 1.0);\n\tlet p32 = permuteV3(p3 + Pi.z);\n\tlet p33 = permuteV3(p3 + Pi.z + 1.0);\n\n\tlet ox11 = fract(p11 * K) - Ko;\n\tlet oy11 = mod7v3(floor(p11 * K)) * K - Ko;\n\tlet oz11 = floor(p11 * K2) * Kz - Kzo;\n\n\tlet ox12 = fract(p12 * K) - Ko;\n\tlet oy12 = mod7v3(floor(p12 * K)) * K - Ko;\n\tlet oz12 = floor(p12 * K2) * Kz - Kzo;\n\n\tlet ox13 = fract(p13 * K) - Ko;\n\tlet oy13 = mod7v3(floor(p13 * K)) * K - Ko;\n\tlet oz13 = floor(p13 * K2) * Kz - Kzo;\n\n\tlet ox21 = fract(p21 * K) - Ko;\n\tlet oy21 = mod7v3(floor(p21 * K)) * K - Ko;\n\tlet oz21 = floor(p21 * K2) * Kz - Kzo;\n\n\tlet ox22 = fract(p22 * K) - Ko;\n\tlet oy22 = mod7v3(floor(p22 * K)) * K - Ko;\n\tlet oz22 = floor(p22 * K2) * Kz - Kzo;\n\n\tlet ox23 = fract(p23 * K) - Ko;\n\tlet oy23 = mod7v3(floor(p23 * K)) * K - Ko;\n\tlet oz23 = floor(p23 * K2) * Kz - Kzo;\n\n\tlet ox31 = fract(p31 * K) - Ko;\n\tlet oy31 = mod7v3(floor(p31 * K)) * K - Ko;\n\tlet oz31 = floor(p31 * K2) * Kz - Kzo;\n\n\tlet ox32 = fract(p32 * K) - Ko;\n\tlet oy32 = mod7v3(floor(p32 * K)) * K - Ko;\n\tlet oz32 = floor(p32 * K2) * Kz - Kzo;\n\n\tlet ox33 = fract(p33 * K) - Ko;\n\tlet oy33 = mod7v3(floor(p33 * K)) * K - Ko;\n\tlet oz33 = floor(p33 * K2) * Kz - Kzo;\n\n\tlet dx11 = Pfx + jitter * ox11;\n\tlet dy11 = Pfy.x + jitter * oy11;\n\tlet dz11 = Pfz.x + jitter * oz11;\n\n\tlet dx12 = Pfx + jitter * ox12;\n\tlet dy12 = Pfy.x + jitter * oy12;\n\tlet dz12 = Pfz.y + jitter * oz12;\n\n\tlet dx13 = Pfx + jitter * ox13;\n\tlet dy13 = Pfy.x + jitter * oy13;\n\tlet dz13 = Pfz.z + jitter * oz13;\n\n\tlet dx21 = Pfx + jitter * ox21;\n\tlet dy21 = Pfy.y + jitter * oy21;\n\tlet dz21 = Pfz.x + jitter * oz21;\n\n\tlet dx22 = Pfx + jitter * ox22;\n\tlet dy22 = Pfy.y + jitter * oy22;\n\tlet dz22 = Pfz.y + jitter * oz22;\n\n\tlet dx23 = Pfx + jitter * ox23;\n\tlet dy23 = Pfy.y + jitter * oy23;\n\tlet dz23 = Pfz.z + jitter * oz23;\n\n\tlet dx31 = Pfx + jitter * ox31;\n\tlet dy31 = Pfy.z + jitter * oy31;\n\tlet dz31 = Pfz.x + jitter * oz31;\n\n\tlet dx32 = Pfx + jitter * ox32;\n\tlet dy32 = Pfy.z + jitter * oy32;\n\tlet dz32 = Pfz.y + jitter * oz32;\n\n\tlet dx33 = Pfx + jitter * ox33;\n\tlet dy33 = Pfy.z + jitter * oy33;\n\tlet dz33 = Pfz.z + jitter * oz33;\n\n\tlet d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11;\n\tlet d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12;\n\tlet d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13;\n\tlet d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21;\n\tlet d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22;\n\tlet d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23;\n\tlet d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31;\n\tlet d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32;\n\tlet d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33;\n\n\tlet d1 = min(min(d11, d12), d13);\n\tlet d2 = min(min(d21, d22), d23);\n\tlet d3 = min(min(d31, d32), d33);\n\tvar d = min(min(d1, d2), d3);\n\tlet dx = min(min(d.x, d.y), d.z);\n\treturn sqrt(dx);\n}\n",oc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\n\tvar ctx: CloudsCtx;\n\tctx.maxDistance = cloudsParamsA.x;\n\tctx.sigmaS = cloudsParamsA.y;\n\tctx.sigmaA = cloudsParamsA.z;\n\tctx.cloudLayerThickness = cloudsParamsA.w;\n\tctx.cloudLayerBottom = cloudsParamsB.x;\n\tctx.highCloudsHeight = cloudsParamsB.y;\n\tctx.highCloudsScale = cloudsParamsB.z;\n\tctx.weatherMapScale = cloudsParamsB.w;\n\tctx.baseNoiseScale = cloudsParamsC.x;\n\tctx.detailNoiseScale = cloudsParamsC.y;\n\tctx.cirrusDensity = cloudsParamsC.z;\n\tctx.altoDensity = cloudsParamsC.w;\n\tctx.windSpeed = cloudsParamsD.x;\n\tctx.weatherMapBlend = cloudsParamsD.y;\n\tctx.time = cloudsParamsD.z;\n\tctx.minStep = cloudsParamsD.w;\n\tctx.sigmaT = ctx.sigmaA + ctx.sigmaS;\n\tctx.fogFactor = ctx.maxDistance / 6.0;\n\tctx.bottomRadius = atm.bottom_radius;\n\tctx.sunDir = normalize(sunDir);\n\tctx.earthCenter = vec3f(0.0, -atm.bottom_radius, 0.0);\n\n\tlet rd = SkyViewRay(uv, ray00, ray10, ray01, ray11);\n\n\tlet volumetric = RaymarchVolumetricCloud(ctx, atm,\n\t\ttransmittanceTex, scatteringTex, scatteringSamp, irradianceTex,\n\t\tbaseNoiseTex, noiseSamp, detailNoiseTex,\n\t\tweatherCurTex, weatherSamp, weatherNextTex,\n\t\tcameraPos, rd);\n\tlet hightAlt = HighAltitudeCloud(ctx, atm,\n\t\ttransmittanceTex, scatteringTex, scatteringSamp,\n\t\thighCloudsTex, weatherSamp,\n\t\tcameraPos, rd);\n\n\tvar cloud = volumetric;\n\tcloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb,\n\t\tcloud.a + (1.0 - cloud.a) * hightAlt.a);\n\n\treturn vec4f(min(cloud.rgb, vec3f(${sc})), cloud.a);\n`,uc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\tlet earth_center = vec3f(0.0, -atm.bottom_radius, 0.0);\n\tlet camera = cameraPos - earth_center;\n\tlet sun_dir = normalize(sunDir);\n\n\tlet azimuth = (uv.x - 0.5) * 2.0 * PI;\n\tlet latitude = (uv.y - 0.5) * PI;\n\tlet cosLat = cos(latitude);\n\tlet rd = vec3f(cosLat * cos(azimuth), sin(latitude), cosLat * sin(azimuth));\n\n\tvar transmittance: vec3f;\n\tlet sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex,\n\t\tscatteringSamp, camera, rd, 0.0, sun_dir, &transmittance);\n\n\tvar cloud = vec4f(0.0);\n\tif (cloudsOn > 0.5) {\n\t\tvar ctx: CloudsCtx;\n\t\tctx.maxDistance = cloudsParamsA.x;\n\t\tctx.sigmaS = cloudsParamsA.y;\n\t\tctx.sigmaA = cloudsParamsA.z;\n\t\tctx.cloudLayerThickness = cloudsParamsA.w;\n\t\tctx.cloudLayerBottom = cloudsParamsB.x;\n\t\tctx.highCloudsHeight = cloudsParamsB.y;\n\t\tctx.highCloudsScale = cloudsParamsB.z;\n\t\tctx.weatherMapScale = cloudsParamsB.w;\n\t\tctx.baseNoiseScale = cloudsParamsC.x;\n\t\tctx.detailNoiseScale = cloudsParamsC.y;\n\t\tctx.cirrusDensity = cloudsParamsC.z;\n\t\tctx.altoDensity = cloudsParamsC.w;\n\t\tctx.windSpeed = cloudsParamsD.x;\n\t\tctx.weatherMapBlend = cloudsParamsD.y;\n\t\tctx.time = cloudsParamsD.z;\n\t\tctx.minStep = cloudsParamsD.w;\n\t\tctx.sigmaT = ctx.sigmaA + ctx.sigmaS;\n\t\tctx.fogFactor = ctx.maxDistance / 6.0;\n\t\tctx.bottomRadius = atm.bottom_radius;\n\t\tctx.sunDir = sun_dir;\n\t\tctx.earthCenter = earth_center;\n\n\t\tlet volumetric = RaymarchVolumetricCloud(ctx, atm,\n\t\t\ttransmittanceTex, scatteringTex, scatteringSamp, irradianceTex,\n\t\t\tbaseNoiseTex, noiseSamp, detailNoiseTex,\n\t\t\tweatherCurTex, weatherSamp, weatherNextTex,\n\t\t\tcameraPos, rd);\n\t\tlet hightAlt = HighAltitudeCloud(ctx, atm,\n\t\t\ttransmittanceTex, scatteringTex, scatteringSamp,\n\t\t\thighCloudsTex, weatherSamp,\n\t\t\tcameraPos, rd);\n\t\tcloud = volumetric;\n\t\tcloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb,\n\t\t\tcloud.a + (1.0 - cloud.a) * hightAlt.a);\n\t}\n\n\tlet WHITE_POINT: f32 = 11.07;\n\tvar color = min(sky, vec3f(${sc})) * (1.0 - cloud.a) +\n\t\tmin(cloud.rgb, vec3f(${sc}));\n\tcolor = Hable(color, exposure, WHITE_POINT);\n\tcolor = pow(color, vec3f(1.0 / gamma));\n\n\treturn vec4f(color, 1.0);\n`,dc="\nfn HableTonemap(x: vec3f) -> vec3f {\n\tlet A = 0.15;\n\tlet B = 0.50;\n\tlet C = 0.10;\n\tlet D = 0.20;\n\tlet E = 0.02;\n\tlet F = 0.30;\n\treturn ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;\n}\n\nfn Hable(color: vec3f, exposure: f32, whitePoint: f32) -> vec3f {\n\treturn HableTonemap(color * exposure) / HableTonemap(vec3f(whitePoint));\n}\n",hc=`\n${lc}\nfn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 {\n\treturn min2 + (value - min1) * (max2 - min2) / (max1 - min1);\n}\n\n@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>;\n\n// The reference dispatches 8x8x8 workgroups; WebGPU's default\n// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the\n// driver dispatches size/4 groups — same texel coverage, same math).\n@compute @workgroup_size(4, 4, 4)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet id = vec3i(gid);\n\tlet size = vec3i(textureDimensions(outNoise));\n\tif (any(id >= size)) {\n\t\treturn;\n\t}\n\n\tlet f = vec3f(id);\n\n\tlet p = simplexFBM(f, 4, 0.25) * 0.5 + 0.5;\n\tlet w = 1.0 - worleyNoise(f * 0.125) / 0.866;\n\n\tvar result: vec4f;\n\tresult.r = remap(p, 0.0, 1.0, w, 1.0);\n\tresult.g = worleyNoise(f * 0.25);\n\tresult.b = worleyNoise(f * 0.5);\n\tresult.a = worleyNoise(f);\n\n\ttextureStore(outNoise, id, result);\n}\n`,mc=`\n${lc}\n@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>;\n\n// The reference dispatches 8x8x8 workgroups; WebGPU's default\n// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the\n// driver dispatches size/4 groups — same texel coverage, same math).\n@compute @workgroup_size(4, 4, 4)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet id = vec3i(gid);\n\tlet size = vec3i(textureDimensions(outNoise));\n\tif (any(id >= size)) {\n\t\treturn;\n\t}\n\n\tlet f = vec3f(id);\n\n\tvar result: vec4f;\n\tresult.r = 1.0 - worleyNoise(f * 0.25);\n\tresult.g = 1.0 - worleyNoise(f * 0.5);\n\tresult.b = 1.0 - worleyNoise(f);\n\tresult.a = 1.0;\n\n\ttextureStore(outNoise, id, result);\n}\n`,cc=Math.fround,pc=360,gc=.5*Math.PI/180,fc=1e3,_c=[1.11776,1.14259,1.01249,1.14716,1.72765,1.73054,1.6887,1.61253,1.91198,2.03474,2.02042,2.02212,1.93377,1.95809,1.91686,1.8298,1.8685,1.8931,1.85149,1.8504,1.8341,1.8345,1.8147,1.78158,1.7533,1.6965,1.68194,1.64654,1.6048,1.52143,1.55622,1.5113,1.474,1.4482,1.41018,1.36775,1.34188,1.31429,1.28303,1.26758,1.2367,1.2082,1.18737,1.14683,1.12362,1.1058,1.07124,1.04992],yc=[118e-29,2182e-31,2818e-31,6636e-31,1527e-30,2763e-30,552e-29,8451e-30,1582e-29,2316e-29,3669e-29,4924e-29,7752e-29,9016e-29,148e-27,1602e-28,2139e-28,2755e-28,3091e-28,35e-26,4266e-28,4672e-28,4398e-28,4701e-28,5019e-28,4305e-28,374e-27,3215e-28,2662e-28,2238e-28,1852e-28,1473e-28,1209e-28,9423e-29,7455e-29,6566e-29,5105e-29,415e-28,4228e-29,3237e-29,2451e-29,2801e-29,2534e-29,1624e-29,1465e-29,2078e-29,1383e-29,7105e-30],xc=[360,1299e-7,3917e-9,6061e-7,365,2321e-7,6965e-9,.001086,370,4149e-7,1239e-8,.001946,375,7416e-7,2202e-8,.003486,380,.001368,39e-6,.006450001,385,.002236,64e-6,.01054999,390,.004243,12e-5,.02005001,395,.00765,217e-6,.03621,400,.01431,396e-6,.06785001,405,.02319,64e-5,.1102,410,.04351,.00121,.2074,415,.07763,.00218,.3713,420,.13438,.004,.6456,425,.21477,.0073,1.0390501,430,.2839,.0116,1.3856,435,.3285,.01684,1.62296,440,.34828,.023,1.74706,445,.34806,.0298,1.7826,450,.3362,.038,1.77211,455,.3187,.048,1.7441,460,.2908,.06,1.6692,465,.2511,.0739,1.5281,470,.19536,.09098,1.28764,475,.1421,.1126,1.0419,480,.09564,.13902,.8129501,485,.05795001,.1693,.6162,490,.03201,.20802,.46518,495,.0147,.2586,.3533,500,.0049,.323,.272,505,.0024,.4073,.2123,510,.0093,.503,.1582,515,.0291,.6082,.1117,520,.06327,.71,.07824999,525,.1096,.7932,.05725001,530,.1655,.862,.04216,535,.2257499,.9148501,.02984,540,.2904,.954,.0203,545,.3597,.9803,.0134,550,.4334499,.9949501,.008749999,555,.5120501,1,.005749999,560,.5945,.995,.0039,565,.6784,.9786,.002749999,570,.7621,.952,.0021,575,.8425,.9154,.0018,580,.9163,.87,.001650001,585,.9786,.8163,.0014,590,1.0263,.757,.0011,595,1.0567,.6949,.001,600,1.0622,.631,8e-4,605,1.0456,.5668,6e-4,610,1.0026,.503,34e-5,615,.9384,.4412,24e-5,620,.8544499,.381,19e-5,625,.7514,.321,1e-4,630,.6424,.265,4999999e-11,635,.5419,.217,3e-5,640,.4479,.175,2e-5,645,.3608,.1382,1e-5,650,.2835,.107,0,655,.2187,.0816,0,660,.1649,.061,0,665,.1212,.04458,0,670,.0874,.032,0,675,.0636,.0232,0,680,.04677,.017,0,685,.0329,.01192,0,690,.0227,.00821,0,695,.01584,.005723,0,700,.01135916,.004102,0,705,.008110916,.002929,0,710,.005790346,.002091,0,715,.004109457,.001484,0,720,.002899327,.001047,0,725,.00204919,74e-5,0,730,.001439971,52e-5,0,735,.0009999493,3611e-7,0,740,.0006900786,2492e-7,0,745,.0004760213,1719e-7,0,750,.0003323011,12e-5,0,755,.0002348261,848e-7,0,760,.0001661505,6e-5,0,765,117413e-9,424e-7,0,770,8307527e-11,3e-5,0,775,5870652e-11,212e-7,0,780,4150994e-11,1499e-8,0,785,2935326e-11,106e-7,0,790,2067383e-11,74657e-10,0,795,1455977e-11,52578e-10,0,800,1025398e-11,37029e-10,0,805,7221456e-12,26078e-10,0,810,5085868e-12,18366e-10,0,815,3581652e-12,12934e-10,0,820,2522525e-12,9.1093e-7,0,825,1776509e-12,6.4153e-7,0,830,1251141e-12,4.5181e-7,0],vc=[3.2406,-1.5372,-.4986,-.9689,1.8758,.0415,.0557,-.204,1.057],bc={maxOzoneNumberDensity:5374e15,rayleigh:124062e-11,rayleighScaleHeight:8e3,mieScaleHeight:1200,mieAngstromAlpha:0,mieAngstromBeta:.005328,mieSingleScatteringAlbedo:.9,miePhaseFunctionG:.9,groundAlbedo:.1,numScatteringOrders:4};function Tc(e,t,a){if(a<e[0])return t[0];for(let r=0;r<e.length-1;r++)if(a<e[r+1]){let s=(a-e[r])/(e[r+1]-e[r]);return t[r]*(1-s)+t[r+1]*s}return t[t.length-1]}function wc(e,t){if(e<=pc||e>=830)return 0;let a=(e-pc)/5,r=Math.floor(a);return a-=r,xc[4*r+t]*(1-a)+xc[4*(r+1)+t]*a}function Sc(e,t,a){let r=0,s=0,i=0,n=Tc(e,t,680),l=Tc(e,t,550),o=Tc(e,t,440);for(let u=pc;u<830;u+=1){let d=wc(u,1),h=wc(u,2),m=wc(u,3),c=vc[0]*d+vc[1]*h+vc[2]*m,p=vc[3]*d+vc[4]*h+vc[5]*m,g=vc[6]*d+vc[7]*h+vc[8]*m,f=Tc(e,t,u);r+=c*f/n*Math.pow(cc(u/680),a),s+=p*f/l*Math.pow(cc(u/550),a),i+=g*f/o*Math.pow(cc(u/440),a)}return r*=683,s*=683,i*=683,[r,s,i]}var Vc=Math.PI/180;function Mc(e,t,a,r,s){return[cc(e/fc),cc(t),cc(a*fc),cc(r*fc),cc(s)]}function Cc(e){return new Float32Array([...e,...e])}var Rc=cc(Vc),zc=cc(Math.PI),kc=cc(2*Math.PI);function Ac(e,t=80){let a=cc(52*Rc),r=cc(cc(23.44)*Rc),s=cc(e%86400/86400),i=cc(r*Math.sin(cc(cc(cc(2*zc)*(t-80))/365))),n=cc(cc(s-.5)*kc),l=cc(Math.sin(a)*Math.sin(i)+Math.cos(a)*Math.cos(i)*Math.cos(n)),o=cc(1-cc(l*l)),u=cc(Math.sqrt(o>0?o:0));return[cc(u*Math.sin(n)),l,cc(u*Math.cos(n))]}var Pc=Math.fround,Ec=256;function Nc(e){return Pc(e-Math.floor(e))}function Bc(e,t,a){e=Pc(e+a),t=Pc(t+a);let r=Pc(Pc(e*Pc(127.1))+Pc(t*Pc(311.7))),s=Pc(Pc(e*Pc(269.5))+Pc(t*Pc(183.3)));return[Nc(Pc(Pc(Math.sin(r))*Pc(43758.5453123))),Nc(Pc(Pc(Math.sin(s))*Pc(43758.5453123)))]}function Lc(e,t,a){return Pc(Pc(Pc(Pc(Pc(t-e)*Pc(3-Pc(2*a)))*a)*a)+e)}var Ic=Pc(Pc(3.14159265)/2147483648);function Fc(e,t,a,r,s){let[i,n]=function(e,t,a){let r=e>>>0,s=t>>>0;r=(r^Math.imul(a,2654435761))>>>0,s=(s^Math.imul(a,2246822519))>>>0,r=Math.imul(r,3284157443)>>>0,s=(s^(r<<16|r>>>16))>>>0,s=Math.imul(s,1911520717)>>>0,r=(r^(s<<16|s>>>16))>>>0,r=Math.imul(r,2048419325)>>>0;let i=Pc(Pc(r)*Ic);return[Pc(Math.sin(i)),Pc(Math.cos(i))]}(e,t,s),l=Pc(a-e),o=Pc(r-t);return Pc(Pc(l*i)+Pc(o*n))}function Dc(e,t,a=0){let r=Math.trunc(e),s=Math.trunc(t),i=r+1,n=s+1,l=Pc(e-r),o=Pc(t-s),u=Fc(r,s,e,t,a),d=Fc(i,s,e,t,a),h=Lc(u,d,l);u=Fc(r,n,e,t,a),d=Fc(i,n,e,t,a);let m=Lc(u,d,l);return Lc(h,m,o)}function Uc(e,t,a,r=1,s=1,i=0){let n=0,l=0;for(let o=0;o<e;o++)n=Pc(n+Pc(s*Dc(Pc(t*r),Pc(a*r),i))),l=Pc(l+s),s=Pc(.5*s),r=Pc(2*r);return Pc(n/l)}function Oc(e,t,a,r=0){let s=Math.floor(e),i=Math.floor(t),n=Pc(e-s),l=Pc(t-i),o=1e9;for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let u=Pc(Pc(Pc(s+t)+a)%a),d=Pc(Pc(Pc(i+e)+a)%a),[h,m]=Bc(u,d,r),c=Pc(h+t),p=Pc(m+e),g=Pc(c-n),f=Pc(p-l),_=Pc(Math.sqrt(Pc(Pc(g*g)+Pc(f*f))));_<o&&(o=_)}return o}function Gc(e,t,a){let r=Pc(Pc(a-e)/Pc(t-e));return r<0&&(r=0),r>1&&(r=1),Pc(Pc(r*r)*Pc(3-Pc(2*r)))}function qc(e,t,a){return Pc(Pc(e*Pc(1-a))+Pc(t*a))}function Wc(e){return Math.trunc(e)>>>0}var Hc=new Float32Array(1),jc=new Uint32Array(Hc.buffer);function Kc(e){Hc[0]=e;let t=jc[0],a=t>>>16&32768,r=t>>>23&255,s=8388607&t;if(255===r)return 31744|a|(0!==s?512:0);let i=r-112;return i>=31?31744|a:i<=0?a:(a|i<<10|s>>>13)+(s>>>12&1)}var $c=new Map;function Xc(e,t){let a=`${e}|${Pc(t)}`,r=$c.get(a);if(void 0!==r)return $c.delete(a),$c.set(a,r),r;let s=function(e){let t=new Uint16Array(262144);for(let a=0;a<65536;a++)t[4*a+0]=Kc(e[3*a+0]),t[4*a+1]=Kc(e[3*a+1]),t[4*a+2]=Kc(e[3*a+2]),t[4*a+3]=15360;return t}(function(e,t){switch(t=Pc(t),e){case"clear":return new Float32Array(196608);case"mostlyClear":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,24,1,a))+.5);t[n+0]=Pc(Gc(Pc(.45),Pc(.8),l)*Pc(.7)),t[n+1]=0,t[n+2]=Pc(.3)}return t}(t);case"partlyCloudy":return function(e){let t=new Float32Array(196608),a=Pc(Math.max(1,Wc(e)));for(let r=0;r<Ec;r++)for(let s=0;s<Ec;s++){let i=Pc(r/Ec),n=Pc(s/Ec),l=3*(s*Ec+r),o=Pc(1-Oc(Pc(24*i),Pc(24*n),24,e)),u=Pc(Pc(.5*Uc(3,i,n,16,a,0))+.5),d=Pc(u*Gc(Pc(.3),1,o)),h=Pc(qc(0,Pc(.35),Gc(Pc(.1),Pc(.4),d))*o);t[l+0]=d,t[l+1]=0,t[l+2]=d<.1?0:h}return t}(t);case"mostlyCloudy":return function(e){let t=new Float32Array(196608),a=Pc(Math.max(1,Wc(e)));for(let r=0;r<Ec;r++)for(let s=0;s<Ec;s++){let i=Pc(r/Ec),n=Pc(s/Ec),l=3*(s*Ec+r),o=Pc(1-Oc(Pc(32*i),Pc(32*n),32,e)),u=Pc(Pc(.5*Uc(3,i,n,16,a,0))+.5),d=Pc(u*Gc(0,Pc(.9),o)),h=Pc(qc(0,Pc(.6),Gc(Pc(.1),Pc(.4),d))*o);t[l+0]=d,t[l+1]=0,t[l+2]=d<.1?0:h}return t}(t);case"overcast":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,16,1,a))+.5);t[n+0]=Gc(Pc(.2),1,l),t[n+1]=Pc(.3),t[n+2]=Pc(.8)}return t}(t);case"storm":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,16,1,a))+.5);t[n+0]=Gc(Pc(.1),1,l),t[n+1]=Pc(Pc(.5*Uc(2,s,i,8,1,a))+.5),t[n+2]=1}return t}(t)}}(e,t));return $c.size>=8&&$c.delete($c.keys().next().value),$c.set(a,s),s}var Qc={cirrus:"sky-cirrus.png",alto:"sky-alto.png"};async function Zc(e){let t=Jr(Qc[e]),a=await fetch(t,{mode:"cors"});if(!a.ok)throw new Error(`skyAssets: fetching ${t} failed (${a.status})`);return new Uint8Array(await a.arrayBuffer())}async function Yc(e){let t=512,a=await createImageBitmap(new Blob([e],{type:"image/png"}),{colorSpaceConversion:"none"}),r=new OffscreenCanvas(t,t).getContext("2d");if(!r)throw new Error("skyAssets: no 2d context for PNG decode");r.drawImage(a,0,0,t,t),a.close();let s=r.getImageData(0,0,t,t).data,i=new Uint8Array(t*t);for(let e=0;e<t;e++){let a=511-e;for(let r=0;r<t;r++)i[e*t+r]=s[4*(a*t+r)]}return i}var Jc="\nconst HDRI_PI: f32 = 3.141592653589793;\n\nfn HdriRotateByEuler(dir: vec3f, euler: vec3f) -> vec3f {\n\tlet cx = cos(euler.x); let sx = sin(euler.x);\n\tlet cy = cos(euler.y); let sy = sin(euler.y);\n\tlet cz = cos(euler.z); let sz = sin(euler.z);\n\n\tlet rot = mat3x3f(\n\t\tcy * cz, cy * sz, -sy,\n\t\tsx * sy * cz - cx * sz, sx * sy * sz + cx * cz, sx * cy,\n\t\tcx * sy * cz + sx * sz, cx * sy * sz - sx * cz, cx * cy\n\t);\n\treturn rot * dir;\n}\n\n/** Direction → equirect uv — Hana's compute_equirectangular_uvs with the v\n * term flipped for three's flipY image upload (see the header note; u is\n * Hana's exact 1 − (long + π)/2π). */\nfn HdriDirToUv(dir0: vec3f, euler: vec3f) -> vec2f {\n\tlet dir = HdriRotateByEuler(normalize(dir0), euler);\n\tlet longitude = atan2(dir.x, dir.z);\n\tlet latitude = asin(clamp(dir.y, -1.0, 1.0));\n\tlet u = 1.0 - (longitude + HDRI_PI) / (2.0 * HDRI_PI);\n\tlet v = (latitude + HDRI_PI / 2.0) / HDRI_PI;\n\treturn vec2f(u, v);\n}\n\n/** Mip level whose texel footprint covers the given angle. Used per tap by\n * HdriSampleBlurred so the gaussian rings never undersample the gaps\n * between taps (same LOD-selection idea as the reflection layer's\n * cone-width blur). 0 when the footprint is smaller than one texel. */\nfn HdriBlurLod(texWidth: f32, footprintAngle: f32) -> f32 {\n\tlet texelsPerRadian = texWidth / (2.0 * HDRI_PI);\n\treturn clamp(log2(max(footprintAngle * texelsPerRadian, 1.0)), 0.0, 16.0);\n}\n\n/** Interleaved gradient noise (Jimenez) — the same per-pixel hash family\n * the reflection layer's blur uses. Deliberately STATIC here (no frame\n * animation, no TAA reliance): the blur must look identical whether or\n * not temporal AA runs, so the dither is a fixed spatial pattern. */\nfn HdriIGN(pix: vec2f) -> f32 {\n\treturn fract(\n\t\t52.9829189 * fract(dot(pix, vec2f(0.06711056, 0.00583715))));\n}\n\n/**\n * Gaussian-blurred equirect sample: a 13-tap disc around the ray — center\n * plus two hex rings at 1σ and 2σ (σ = half the blur angle), true gaussian\n * ring weights (e^0, e^-0.5, e^-2) — with every tap reading a σ-footprint\n * mip so the rings blend seamlessly. Reads like a gaussian of ~σ instead\n * of the boxy bilinear lozenges a bare mip pick produces at large radii;\n * a mip pyramid alone is a stack of 2×2 box filters.\n *\n * jitter (x = disc rotation in radians, y = ring radius scale)\n * decorrelates the kernel per pixel: a FIXED sparse disc leaves\n * tap-replica and mip-interpolation structure — subtle bands parallel to\n * strong source edges. The background pass feeds it static per-pixel IGN\n * (structured banding becomes fine, temporally stable spatial noise —\n * deliberately NOT frame-animated, so nothing depends on TAA); the tiny\n * env re-projection passes (0, 1).\n */\nfn HdriSampleBlurred(\n\tenvTex: texture_2d<f32>, envSamp: sampler,\n\tdir: vec3f, euler: vec3f, blurAngle: f32, jitter: vec2f) -> vec3f {\n\tlet st0 = HdriDirToUv(dir, euler);\n\tif (blurAngle <= 0.0) {\n\t\treturn textureSampleLevel(envTex, envSamp, st0, 0.0).rgb;\n\t}\n\tlet sigma = blurAngle * 0.5;\n\tlet lod = HdriBlurLod(f32(textureDimensions(envTex, 0).x), sigma);\n\n\t// Tangent frame around the ray (the offsets live on its normal plane).\n\tlet axis = select(\n\t\tvec3f(0.0, 1.0, 0.0), vec3f(1.0, 0.0, 0.0), abs(dir.y) > 0.99);\n\tlet t1 = normalize(cross(axis, dir));\n\tlet t2 = cross(dir, t1);\n\n\tlet r1 = sigma * jitter.y;\n\tlet r2 = 2.0 * sigma * jitter.y;\n\tlet wRing1 = 0.60653066; // e^-0.5, taps at 1σ\n\tlet wRing2 = 0.13533528; // e^-2, taps at 2σ\n\tvar sum = textureSampleLevel(envTex, envSamp, st0, lod).rgb;\n\tvar wSum = 1.0;\n\tfor (var i = 0u; i < 6u; i = i + 1u) {\n\t\t// Ring 2 sits on the hex vertices, ring 1 on the rotated midpoints.\n\t\tlet a1 = (f32(i) + 0.5) * (HDRI_PI / 3.0) + jitter.x;\n\t\tlet d1 = normalize(dir + (t1 * cos(a1) + t2 * sin(a1)) * r1);\n\t\tsum += textureSampleLevel(\n\t\t\tenvTex, envSamp, HdriDirToUv(d1, euler), lod).rgb * wRing1;\n\t\tlet a2 = f32(i) * (HDRI_PI / 3.0) + jitter.x;\n\t\tlet d2 = normalize(dir + (t1 * cos(a2) + t2 * sin(a2)) * r2);\n\t\tsum += textureSampleLevel(\n\t\t\tenvTex, envSamp, HdriDirToUv(d2, euler), lod).rgb * wRing2;\n\t\twSum += wRing1 + wRing2;\n\t}\n\treturn sum / wSum;\n}\n",ep=64,tp=32;function ap(e){return Math.pow(e/255,2.2)}var rp=class{constructor(e,t){this._uRotation=lr(new ds),this._uBlurAngle=lr(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(Ur(e)){let{data:a,width:r,height:s}=e;t=(e,t)=>{let i=Math.min(r-1,Math.floor((e+.5)/ep*r)),n=Math.min(s-1,Math.floor((t+.5)/tp*s)),l=4*((s-1-n)*r+i);return[Math.pow(Math.max(Ms.fromHalfFloat(a[l]),0),2.2),Math.pow(Math.max(Ms.fromHalfFloat(a[l+1]),0),2.2),Math.pow(Math.max(Ms.fromHalfFloat(a[l+2]),0),2.2)]}}else{if(typeof document>"u")return null;let a=document.createElement("canvas");a.width=ep,a.height=tp;let r,s=a.getContext("2d",{willReadFrequently:!0});if(null===s)return null;try{s.drawImage(e,0,0,ep,tp),r=s.getImageData(0,0,ep,tp).data}catch{return null}t=(e,t)=>{let a=4*(t*ep+e);return[ap(r[a]),ap(r[a+1]),ap(r[a+2])]}}let a=e=>.2126*e[0]+.7152*e[1]+.0722*e[2],r=(e,t)=>{let a=(t+.5)/tp*Math.PI,r=Math.PI-(e+.5)/ep*2*Math.PI,s=Math.sin(a);return[s*Math.sin(r),Math.cos(a),s*Math.cos(r)]},s=[0,0,0],i=[0,0,0],n=0,l=0,o=0;for(let e=0;e<tp;e++){let r=Math.sin((e+.5)/tp*Math.PI),u=e<16;for(let d=0;d<ep;d++){let h=t(d,e);o=Math.max(o,a(h));let m=u?s:i;m[0]+=h[0]*r,m[1]+=h[1]*r,m[2]+=h[2]*r,u?n+=r:l+=r}}let u=[s[0]/n,s[1]/n,s[2]/n],d=[i[0]/l,i[1]/l,i[2]/l],h=a(u),m=a(d),c=(h*n+m*l)/Math.max(n+l,1e-6),p=.9*o,g=[0,0,0],f=[0,0,0],_=0;for(let e=0;e<tp;e++){let s=Math.sin((e+.5)/tp*Math.PI);for(let i=0;i<ep;i++){let n=t(i,e),l=a(n);if(l<p)continue;let o=r(i,e),u=s*l;g[0]+=o[0]*u,g[1]+=o[1]*u,g[2]+=o[2]*u,f[0]+=n[0]*s,f[1]+=n[1]*s,f[2]+=n[2]*s,_+=s}}let y=Math.hypot(g[0],g[1],g[2]),x=_>0?[f[0]/_,f[1]/_,f[2]/_]:[1,1,1],v=a(x);return{skyColor:u,skyLum:h,groundColor:d,groundLum:m,meanLum:c,sunDir:y>1e-4?[g[0]/y,g[1]/y,g[2]/y]:[0,1,0],sunColor:x,sunLum:v,sunPeak:c>1e-6?v/c:1}}(e.image)),this._lighting}_ensureSampleTexture(e){if(null===this._sampleTexture||this._sourceTexture!==e){this._sampleTexture?.dispose();let t=Ur(e.image)?Or(e.image):new ps(e.image);t.name="sky-hdri-source",t.wrapS=Ls,t.wrapT=Fs,t.minFilter=Js,t.magFilter=Qs,t.generateMipmaps=!0,t.flipY=!Ur(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 ke("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}",[Me(Jc)])({uv:vt,ray00:this._rays.ray00,ray10:this._rays.ray10,ray01:this._rays.ray01,ray11:this._rays.ray11,rotation:this._uRotation,blurAngle:this._uBlurAngle,resolution:w.resolution,envTex:Ea(e),envSamp:ct(e)})}_ensureBackgroundMesh(e){if(this.backgroundMesh)return this.backgroundMesh;let t=new As;t.setAttribute("position",new Cs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let a=new bt;a.name="SplineSkyHdriBackground",a.lights=!1,a.depthWrite=!1,a.depthTest=!1,a.colorNode=this._buildBackgroundNode(e);let r=ke("fn hdriBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");a.vertexNode=r({position:ie});let s=new Ds(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=ke("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}",[Me(Jc)])({uv:U(),rotation:this._uRotation,blurAngle:this._uBlurAngle,envTex:Ea(e),envSamp:ct(e)});if(null===this._envQuad){let e=new bt;e.name="SplineSkyHdriEnvironmentPass",e.lights=!1,e.fragmentNode=t,this._envQuad=new Ga(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 ys(256,128,{type:ts,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-hdri-environment",e.generateMipmaps=!0,e.minFilter=Js,e.magFilter=Qs,e.wrapS=Ls}let l=this._uRotation.value,o=`${i.uuid}|${i.version}|${l.x},${l.y},${l.z}|${r}`;if(o!==this._lastEnvKey){this._lastEnvKey=o;let e=this._renderer,t=e.getRenderTarget();e.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),e.setRenderTarget(t)}s?n.parent!==e&&(n.parent?.remove(n),e.add(n)):n.parent?.remove(n)}detach(){this._active=!1,this.backgroundMesh?.parent?.remove(this.backgroundMesh)}dispose(){this.detach(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this._envQuad=null,this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._boundTexture=null,this._sampleTexture?.dispose(),this._sampleTexture=null,this._sourceTexture=null,this._sourceVersion=-1}},sp=new Ss,ip=new os,np=new _s,lp=new _s,op={maxDistance:128,sigmaS:10,sigmaA:0,cloudLayerThickness:4,cloudLayerBottom:2,highCloudsHeight:8,highCloudsScale:32,weatherMapScale:128,baseNoiseScale:25,detailNoiseScale:1.5},up=.3,dp=.3,hp={clear:[0,0],mostlyClear:[up,dp],partlyCloudy:[up,dp],mostlyCloudy:[up,dp],overcast:[up,dp],storm:[up,dp]},mp=null;try{let e=new URLSearchParams(window.location.search).get("dbgskystep");null!==e&&""!==e&&Number.isFinite(Number(e))&&(mp=Math.max(0,Number(e)))}catch{}var cp=.62,pp={clear:1,mostlyClear:.95,partlyCloudy:.9,mostlyCloudy:.8,overcast:.6,storm:.5},gp={clear:1,mostlyClear:.92,partlyCloudy:.8,mostlyCloudy:.55,overcast:.3,storm:.15},fp={clear:1,mostlyClear:.97,partlyCloudy:.92,mostlyCloudy:.8,overcast:.65,storm:.5},_p="\n\tuv: vec2f,\n\tray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f,\n\tcameraPos: vec3f, sunDir: vec3f,\n\tsolarIrradiance: vec3f, rayleighScattering: vec3f, mieScattering: vec3f,\n\tskySrtl: vec3f, sunSrtl: vec3f, atmScalars: vec4f, muSMin: f32,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler",yp=`${_p},\n\tirradianceTex: texture_2d<f32>,\n\tbaseNoiseTex: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoiseTex: texture_3d<f32>,\n\tweatherCurTex: texture_2d<f32>, weatherSamp: sampler,\n\tweatherNextTex: texture_2d<f32>,\n\thighCloudsTex: texture_2d<f32>,\n\tcloudsParamsA: vec4f, cloudsParamsB: vec4f,\n\tcloudsParamsC: vec4f, cloudsParamsD: vec4f`,xp=class{constructor(e){this._luts=null,this._baseNoise=null,this._detailNoise=null,this._highCloudsReady=!1,this._skyTarget=null,this._cloudsTarget=null,this._skyQuad=null,this._cloudsQuad=null,this._envTarget=null,this._envQuad=null,this._lastEnvKey=null,this.backgroundMesh=null,this._hdri=null,this._uRay00=lr(new ds),this._uRay10=lr(new ds),this._uRay01=lr(new ds),this._uRay11=lr(new ds),this._uCameraPos=lr(new ds(0,.1,0)),this._uSunDir=lr(new ds(0,1,0)),this._uCloudsParamsC=lr(new _s(op.baseNoiseScale,op.detailNoiseScale,up,dp)),this._uCloudsParamsD=lr(new _s(0,1,0,0)),this._uExposure=lr(5e-4),this._uGamma=lr(2.2),this._uEnvCloudsOn=lr(0),this._lastPage=null,this._lastVersion=-1,this._appliedWeather=null,this._appliedSeed=0,this._blendStart=0,this._blendFrom=1,this._presetFrom="partlyCloudy",this._presetTo="partlyCloudy",this._windOffsetKm=0,this._lastFrameTime=null,this._cloudsEnabled=!0,this._cloudsTargetCleared=!1,this._animating=!1,this._lastSkyPassKey=null,this._lastCloudsPassKey=null,this._sunLight=null,this._iblHdriTexture=null,this._iblRotationY=0,this._pmremBumpAt=0,this._pmremPending=!1,this._skyHemi=null,this._userAmbientSuppressed=!1,this._lightingLuts=null,this._lightingLutsRequested=!1,this._noonSunLum=0,this._noonSkyLum=0,this._noonSunRgb=null,this._lightingPage=null,this.assetsReady=Promise.resolve(),this.fixedSkySize=null,this.fixedCloudsSize=null,this.fixedTimeSeconds=null,this.numScatteringOrdersOverride=null,this.highCloudDensityOverride=null,this.minStepKmOverride=null,this._cloudsArgs=null,this._cloudsLib=null,this._renderer=e,this._atmosphereUniforms=function(e){let t=function(e){let t=[],a=[],r=[],s=[],i=[],n=[],l=[];for(let o=pc;o<=830;o+=10){let u=.001*o,d=e.mieAngstromBeta/e.mieScaleHeight*Math.pow(u,-e.mieAngstromAlpha);t.push(o),a.push(_c[(o-pc)/10]),r.push(e.rayleigh*Math.pow(u,-4)),s.push(d*e.mieSingleScatteringAlbedo),i.push(d),n.push(e.maxOzoneNumberDensity*yc[(o-pc)/10]),l.push(e.groundAlbedo)}return{wavelengths:t,solarIrradiance:a,rayleighScattering:r,mieScattering:s,mieExtinction:i,absorptionExtinction:n,groundAlbedo:l}}(e),{wavelengths:a}=t,r=Sc(a,t.solarIrradiance,-3),s=Sc(a,t.solarIrradiance,0),i=(e,t)=>[cc(Tc(a,e,680)*t),cc(Tc(a,e,550)*t),cc(Tc(a,e,440)*t)];return{solarIrradiance:i(t.solarIrradiance,1),rayleighScattering:i(t.rayleighScattering,fc),mieScattering:i(t.mieScattering,fc),mieExtinction:i(t.mieExtinction,fc),absorptionExtinction:i(t.absorptionExtinction,fc),groundAlbedo:i(t.groundAlbedo,1),skySpectralRadianceToLuminance:[cc(r[0]),cc(r[1]),cc(r[2])],sunSpectralRadianceToLuminance:[cc(s[0]),cc(s[1]),cc(s[2])],bottomRadius:6360,topRadius:6420,muSMin:cc(Math.cos(120*Vc)),sunAngularRadius:cc(gc),miePhaseG:cc(e.miePhaseFunctionG),rayleighDensity:Cc(Mc(0,1,-1/e.rayleighScaleHeight,0,0)),mieDensity:Cc(Mc(0,1,-1/e.mieScaleHeight,0,0)),absorptionDensity:new Float32Array([...Mc(25e3,0,0,1/15e3,-2/3),...Mc(0,0,0,-1/15e3,8/3)]),luminanceFromRadiance:new Float32Array([1,0,0,0,1,0,0,0,1])}}(bc);let t=e=>{let t=new Hs(new Uint16Array(262144),Ec,Ec,gs,ts);return t.wrapS=Ls,t.wrapT=Ls,t.minFilter=Qs,t.magFilter=Qs,t.name=e,t.needsUpdate=!0,t};this._weatherCur=t("sky-weather-current"),this._weatherNext=t("sky-weather-next"),this._highClouds=new Hs(new Uint8Array(1048576),512,512,gs,ti),this._highClouds.wrapS=Ls,this._highClouds.wrapT=Ls,this._highClouds.minFilter=Qs,this._highClouds.magFilter=Qs,this._highClouds.name="sky-high-clouds",this._highClouds.needsUpdate=!0,this.assetsReady=async function(){let[e,t]=await Promise.all([Zc("cirrus").then(Yc),Zc("alto").then(Yc)]),a=262144,r=new Uint8Array(2*a);for(let s=0;s<a;s++)r[2*s+0]=e[s],r[2*s+1]=t[s];return r}().then(e=>{let t=this._highClouds.image.data;for(let a=0;a<e.length/2;a++)t[4*a+0]=e[2*a+0],t[4*a+1]=e[2*a+1];this._highClouds.needsUpdate=!0,this._highCloudsReady=!0},()=>{})}get attached(){return null!=this.backgroundMesh?.parent||!0===this._hdri?.active}get animationActive(){return this.attached&&(this._animating||this._pmremPending)}get luts(){return this._luts}readbackLut(e){let t=this._luts;return t?"transmittance"===e?Qm(this._renderer,t.transmittance,256,64,1,!1):"irradiance"===e?Qm(this._renderer,t.irradiance,64,16,1,!1):Qm(this._renderer,t.scattering,256,128,32,!0):Promise.reject(new Error("sky LUTs not ready"))}readbackNoise(e){let t="base"===e?this._baseNoise:this._detailNoise;if(!t)return Promise.reject(new Error("sky noise not ready"));let a="base"===e?128:32;return Qm(this._renderer,t,a,a,a,!0)}get skyTexture(){return this._skyTarget?.texture??null}get cloudsTexture(){return this._cloudsTarget?.texture??null}get environmentTexture(){return!0===this._hdri?.active?this._hdri.environmentTexture:this._envTarget?.texture??null}get iblTexture(){return null===this._lightingPage?null:!0===this._hdri?.active?this._iblHdriTexture:this._envTarget?.texture??null}get iblRotationY(){return!0===this._hdri?.active?this._iblRotationY:0}_requestEnvPmrem(e){let t=this._envTarget?.texture;void 0!==t&&(e-this._pmremBumpAt>=150?(this._pmremBumpAt=e,this._pmremPending=!1,t.needsPMREMUpdate=!0):this._pmremPending=!0)}get weatherTextureData(){return{current:this._weatherCur.image.data,next:this._weatherNext.image.data}}_ensureLuts(){this._luts||(this._luts=function(e,t,a){let r=Wm(e),s=jm(256,64,es,"sky-lut-transmittance"),i=[jm(64,16,es,"sky-lut-irradiance-a"),jm(64,16,es,"sky-lut-irradiance-b")],n=[Km(256,128,32,ts,"sky-lut-scattering-a",Qs),Km(256,128,32,ts,"sky-lut-scattering-b",Qs)],l=jm(64,16,es,"sky-delta-irradiance"),o=Km(256,128,32,es,"sky-delta-rayleigh",Ws),u=Km(256,128,32,es,"sky-delta-mie",Ws),d=Km(256,128,32,es,"sky-delta-density",Ws),h={transmittance:Hm(e,s),irr:i.map(t=>Hm(e,t)),scat:n.map(t=>Hm(e,t)),deltaIrradiance:Hm(e,l),deltaRayleigh:Hm(e,o),deltaMie:Hm(e,u),deltaDensity:Hm(e,d)},m=h.deltaRayleigh,c=function(e){let t=new Float32Array(80),a=0,r=(e,r)=>{t[a++]=e[0],t[a++]=e[1],t[a++]=e[2],t[a++]=r};r(e.solarIrradiance,e.sunAngularRadius),r(e.rayleighScattering,e.bottomRadius),r(e.mieScattering,e.topRadius),r(e.mieExtinction,e.miePhaseG),r(e.absorptionExtinction,e.muSMin),r(e.groundAlbedo,0),r(e.skySpectralRadianceToLuminance,0),r(e.sunSpectralRadianceToLuminance,0);for(let r of[e.rayleighDensity,e.mieDensity,e.absorptionDensity])for(let e=0;e<2;e++){for(let s=0;s<5;s++)t[a++]=r[5*e+s];a+=3}return t}(t),p=r.createBuffer({label:"sky-atm-uniforms",size:c.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(p,0,c.buffer,0,c.byteLength);let g=[],f=e=>(g.push(e),(g.length-1)*$m),_=new Map;for(let[e,t]of Object.entries(Xm)){let a=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform",hasDynamicOffset:!0}}];t.entries.forEach((e,t)=>{"sampled"in e?a.push({binding:2+t,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:"unfilterable-float",viewDimension:e.sampled}}):a.push({binding:2+t,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:e.format,viewDimension:e.storage}})});let s=r.createBindGroupLayout({label:`sky-${e}-bgl`,entries:a}),i=r.createComputePipeline({label:`sky-${e}`,layout:r.createPipelineLayout({bindGroupLayouts:[s]}),compute:{module:r.createShaderModule({label:`sky-${e}-wgsl`,code:t.code}),entryPoint:"main"}});_.set(e,{pipeline:i,layout:s})}let y=[],x=0,v=0,b=(e,t)=>[e/8,t/8,1];y.push([{kernel:"transmittance",textures:[h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:b(256,64)}]),y.push([{kernel:"directIrradiance",textures:[h.irr[x],h.irr[1-x],h.deltaIrradiance,h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:b(64,16)}]),x=1-x;{let e=[];for(let t=0;t<32;t++)e.push({kernel:"singleScattering",textures:[h.deltaRayleigh,h.deltaMie,h.scat[v],h.scat[1-v],h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:t,scatteringOrder:0}),groups:b(256,128)});y.push(e),v=1-v}for(let e=2;e<=a;e++){{let t=[];for(let a=0;a<32;a++)t.push({kernel:"scatteringDensity",textures:[h.deltaDensity,h.transmittance,h.deltaRayleigh,h.deltaMie,m,h.deltaIrradiance],slotOffset:f({blend:[0,0,0,0],layer:a,scatteringOrder:e}),groups:b(256,128)});y.push(t)}y.push([{kernel:"indirectIrradiance",textures:[h.deltaIrradiance,h.irr[x],h.irr[1-x],h.deltaRayleigh,h.deltaMie,m],slotOffset:f({blend:[0,1,0,0],layer:0,scatteringOrder:e-1}),groups:b(64,16)}]),x=1-x;{let t=[];for(let a=0;a<32;a++)t.push({kernel:"multipleScattering",textures:[m,h.scat[v],h.scat[1-v],h.transmittance,h.deltaDensity],slotOffset:f({blend:[0,1,0,0],layer:a,scatteringOrder:e}),groups:b(256,128)});y.push(t),v=1-v}}let T=new Float32Array(g.length*$m/4);g.forEach((e,t)=>function(e,t,a){let r=t;e[r+0]=1,e[r+5]=1,e[r+10]=1,e[r+12]=a.blend[0],e[r+13]=a.blend[1],e[r+14]=a.blend[2],e[r+15]=a.blend[3],new Int32Array(e.buffer,e.byteOffset+4*(r+16),2).set([a.layer,a.scatteringOrder])}(T,t*$m/4,e));let w=r.createBuffer({label:"sky-pass-params",size:T.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(w,0,T.buffer,0,T.byteLength);let S=new Map,V=e=>{let t=S.get(e);return t||(t=e.createView({mipLevelCount:1}),S.set(e,t)),t};for(let e of y){let t=r.createCommandEncoder({label:"sky-precompute"}),a=t.beginComputePass();for(let t of e){let{pipeline:e,layout:s}=_.get(t.kernel),i=[{binding:0,resource:{buffer:p}},{binding:1,resource:{buffer:w,size:$m}}];t.textures.forEach((e,t)=>{i.push({binding:2+t,resource:V(e)})});let n=r.createBindGroup({layout:s,entries:i});a.setPipeline(e),a.setBindGroup(0,n,[t.slotOffset]),a.dispatchWorkgroups(...t.groups)}a.end(),r.queue.submit([t.finish()])}let M=i[x],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??bc.numScatteringOrders))}_ensureNoise(){if(this._baseNoise)return;let e=this._renderer.backend.device;if(!e)throw new Error("[spline/sky] WebGPU device unavailable");let t=(e,t)=>{let a=new H(e,e,e);return a.type=ts,a.minFilter=Qs,a.magFilter=Qs,a.wrapS=Ls,a.wrapT=Ls,a.wrapR=Ls,a.generateMipmaps=!1,a.mipmapsAutoUpdate=!1,a.name=t,a};this._baseNoise=t(128,"sky-base-noise"),this._detailNoise=t(32,"sky-detail-noise");let a=(t,a,r)=>{this._renderer.initTexture(a);let s=this._renderer.backend.get(a).texture,i=e.createShaderModule({code:t}),n=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba16float",viewDimension:"3d"}}]}),l=e.createComputePipeline({layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:i,entryPoint:"main"}}),o=e.createCommandEncoder({label:"sky-noise"}),u=o.beginComputePass();u.setPipeline(l),u.setBindGroup(0,e.createBindGroup({layout:n,entries:[{binding:0,resource:s.createView({mipLevelCount:1})}]}));let d=r/4;u.dispatchWorkgroups(d,d,d),u.end(),e.queue.submit([o.finish()])};a(hc,this._baseNoise,128),a(mc,this._detailNoise,32)}_atmArgs(){let e=this._atmosphereUniforms;return{solarIrradiance:lr(new ds(...e.solarIrradiance)),rayleighScattering:lr(new ds(...e.rayleighScattering)),mieScattering:lr(new ds(...e.mieScattering)),skySrtl:lr(new ds(...e.skySpectralRadianceToLuminance)),sunSrtl:lr(new ds(...e.sunSpectralRadianceToLuminance)),atmScalars:lr(new _s(e.sunAngularRadius,e.bottomRadius,e.topRadius,e.miePhaseG)),muSMin:lr(e.muSMin)}}_ensurePasses(){if(this._skyQuad)return;this._ensureLuts(),this._ensureNoise();let e=this._luts,t={uv:U(),ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11,cameraPos:this._uCameraPos,sunDir:this._uSunDir,...this._atmArgs(),transmittanceTex:Ea(e.transmittance),scatteringTex:Ia(e.scattering),scatteringSamp:ct(e.scattering)},a=Me(Lm+ic),r=ke(`fn skyPass(${_p}) -> vec4f {${nc}}`,[a]),s=new bt;s.name="SplineSkyPass",s.lights=!1,s.fragmentNode=r(t),this._skyQuad=new Ga(s);let i=Me(Lm+ic+"\nfn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 {\n\treturn min2 + (value - min1) * (max2 - min2) / (max1 - min1);\n}\n\nfn saturateF(x: f32) -> f32 {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nfn triplanarSample(\n\tt: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f {\n\tvar blend = abs(n);\n\tblend = pow(blend, vec3f(4.0));\n\tblend /= dot(blend, vec3f(1.0));\n\n\tlet cx = textureSampleLevel(t, s, p.yz * scale, 0.0);\n\tlet cy = textureSampleLevel(t, s, p.xz * scale, 0.0);\n\tlet cz = textureSampleLevel(t, s, p.xy * scale, 0.0);\n\n\treturn cx * blend.x + cy * blend.y + cz * blend.z;\n}\n\n/** Weight below which a triplanar axis is dropped instead of sampled.\n *\n * The weights are normalized pow(|n|, 4). Inside the cloud shell n is the\n * planet's up vector at the sample, and the march reaches at most\n * CLOUDS_PARAMS.maxDistance (128 km) over a 6360 km radius: |n.x| and |n.z|\n * stay under sin(128 / 6363) = 0.021, so their weights stay under 2e-7 —\n * four orders of magnitude under the fp16 quantum of the [0, 1] weather\n * channels they scale. The threshold sits well above that worst case on\n * purpose: it keeps the branch UNIFORM across the pass (every ray in the\n * layer drops the same two axes) instead of flickering per texel, and it\n * bounds the error at one threshold per dropped axis. */\nconst TRIPLANAR_WEIGHT_EPS: f32 = 1.0e-5;\n\n/**\n * triplanarSample with negligible axes skipped — three texture samples down\n * to one for any sample inside the cloud shell. This is the hot one: the\n * weather map is read once per density sample (twice mid-transition) and there\n * are up to seven density samples per lit step, so between this and the blend\n * branch below the weather taps go from six per density sample to one. When\n * all three axes clear the threshold the accumulation matches triplanarSample\n * exactly (adding into a zero-initialized vec4 is exact).\n */\nfn triplanarSampleAdaptive(\n\tt: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f {\n\tvar blend = abs(n);\n\tblend = pow(blend, vec3f(4.0));\n\tblend /= dot(blend, vec3f(1.0));\n\n\tvar c = vec4f(0.0);\n\tif (blend.x > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.yz * scale, 0.0) * blend.x;\n\t}\n\tif (blend.y > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.xz * scale, 0.0) * blend.y;\n\t}\n\tif (blend.z > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.xy * scale, 0.0) * blend.z;\n\t}\n\treturn c;\n}\n\nfn raySphereIntersectFar(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 {\n\tlet a = dot(rd, rd);\n\tlet s0_r0 = r0 - s0;\n\tlet b = 2.0 * dot(rd, s0_r0);\n\tlet c = dot(s0_r0, s0_r0) - (sr * sr);\n\n\tlet d = b * b - 4.0 * a * c;\n\tif (d < 0.0) {\n\t\treturn -1.0;\n\t}\n\n\treturn (-b + sqrt(d)) / (2.0 * a);\n}\n\nfn raySphereIntersect(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 {\n\tlet a = dot(rd, rd);\n\tlet s0_r0 = r0 - s0;\n\tlet b = 2.0 * dot(rd, s0_r0);\n\tlet c = dot(s0_r0, s0_r0) - (sr * sr);\n\n\tlet d = b * b - 4.0 * a * c;\n\tif (d < 0.0) {\n\t\treturn -1.0;\n\t}\n\n\tlet sqrtD = sqrt(d);\n\n\tlet t0 = (-b - sqrtD) / (2.0 * a);\n\tif (t0 > 0.0) {\n\t\treturn t0;\n\t}\n\n\tlet t1 = (-b + sqrtD) / (2.0 * a);\n\tif (t1 > 0.0) {\n\t\treturn t1;\n\t}\n\n\treturn -1.0;\n}\n\nconst CLOUD_RAY_STEPS: i32 = 160;\nconst LIGHT_RAY_STEPS: i32 = 6;\n\nconst cirrusSpeedFactor: f32 = 3.5;\nconst altoSpeedFactor: f32 = 2.0;\nconst detailStrength: f32 = 0.1;\nconst CLOUD_EPS: f32 = 1e-5;\n\nstruct CloudsCtx {\n\tmaxDistance: f32,\n\tsigmaS: f32,\n\tsigmaA: f32,\n\tcloudLayerThickness: f32,\n\tcloudLayerBottom: f32,\n\thighCloudsHeight: f32,\n\thighCloudsScale: f32,\n\tweatherMapScale: f32,\n\tbaseNoiseScale: f32,\n\tdetailNoiseScale: f32,\n\tcirrusDensity: f32,\n\taltoDensity: f32,\n\twindSpeed: f32,\n\tweatherMapBlend: f32,\n\ttime: f32,\n\t/** Floor on the march step length, km. 0 = the reference's fixed\n\t * CLOUD_RAY_STEPS division of the span (see RaymarchVolumetricCloud). */\n\tminStep: f32,\n\tsigmaT: f32,\n\tfogFactor: f32,\n\tbottomRadius: f32,\n\tsunDir: vec3f,\n\tearthCenter: vec3f,\n}\n\nfn HenyeyGreenstein(g: f32, costh: f32) -> f32 {\n\treturn (1.0 - g * g) / (4.0 * PI * pow(1.0 + g * g - 2.0 * g * costh, 1.5));\n}\n\nfn HeightGradient(h: f32, cloudType: f32) -> f32 {\n\tlet stratus = smoothstepGl(0.0, 0.07, h) * smoothstepGl(0.2, 0.07, h);\n\tlet cumulus = smoothstepGl(0.0, 0.2, h) * smoothstepGl(0.65, 0.35, h);\n\tlet cumulonimbus = smoothstepGl(0.0, 0.1, h) * smoothstepGl(0.95, 0.4, h);\n\n\tlet a = 1.0 - cloudType;\n\tlet wS = a * a;\n\tlet wCu = 2.0 * cloudType * a;\n\tlet wCb = cloudType * cloudType;\n\n\treturn wS * stratus + wCu * cumulus + wCb * cumulonimbus;\n}\n\nfn SampleDensity(\n\tctx: CloudsCtx,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tpos: vec3f) -> f32 {\n\tlet heightFraction = (length(pos - ctx.earthCenter) - ctx.bottomRadius - ctx.cloudLayerBottom) /\n\t\tctx.cloudLayerThickness;\n\tif (heightFraction < 0.0 || heightFraction > 1.0) {\n\t\treturn 0.0;\n\t}\n\n\tlet n = normalize(pos - ctx.earthCenter);\n\t// triplanar fixes 2d texture stretching on sphere\n\tlet weatherPos = pos + ctx.time * ctx.windSpeed;\n\tlet weatherScale = 1.0 / ctx.weatherMapScale;\n\t// The blend sits pinned at 1 except during the 2 s preset transition, and\n\t// mix(a, b, 1) is b — so outside a transition the \"current\" map's taps are\n\t// dead weight on every density sample. The blend is a uniform, so this\n\t// branch is coherent across the whole pass; a driver cannot fold it away\n\t// on its own. (At the endpoints the result differs from the mix by at most\n\t// one ulp, and only if the implementation lowers mix to an fma.)\n\tvar weather: vec3f;\n\tif (ctx.weatherMapBlend >= 1.0) {\n\t\tweather = triplanarSampleAdaptive(nextWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t} else if (ctx.weatherMapBlend <= 0.0) {\n\t\tweather = triplanarSampleAdaptive(currentWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t} else {\n\t\tlet weather0 = triplanarSampleAdaptive(currentWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t\tlet weather1 = triplanarSampleAdaptive(nextWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t\tweather = mix(weather0, weather1, ctx.weatherMapBlend);\n\t}\n\n\tlet coverage = weather.r;\n\tlet precipitation = weather.g;\n\tlet cloudType = weather.b;\n\tlet heightGradient = HeightGradient(heightFraction, cloudType);\n\n\t// Zero coverage: the reference's remap below divides by zero and the\n\t// resulting NaN dies in GLSL's NaN-hostile clamp/compares (density 0).\n\t// WGSL's min/max SWALLOW NaN — saturate(NaN) becomes 1.0, a full-density\n\t// phantom cloud — so the \"no coverage, no cloud\" outcome is made\n\t// explicit here instead of riding on NaN semantics.\n\t// (Negated form so NaN coverage — the upstream partlyCloudy/seed-0\n\t// weather-map quirk — also lands here instead of resurrecting.)\n\tif (!(coverage > 0.0)) {\n\t\treturn 0.0;\n\t}\n\n\t// === base form ===\n\tlet base_uv = pos / ctx.baseNoiseScale + ctx.time * ctx.windSpeed / ctx.baseNoiseScale;\n\tlet baseN = textureSampleLevel(baseNoise, noiseSamp, base_uv, 0.0);\n\tlet lowFBM = baseN.g * 0.625 + baseN.b * 0.25 + baseN.a * 0.125;\n\tvar baseCloud = remap(baseN.r, -(1.0 - lowFBM), 1.0, 0.0, 1.0);\n\n\t// === compose ===\n\tbaseCloud = remap(baseCloud, 1.0 - coverage, 1.0, 0.0, 1.0);\n\tbaseCloud *= coverage;\n\tbaseCloud *= heightGradient;\n\n\tif (baseCloud < 0.0) {\n\t\treturn 0.0;\n\t}\n\n\t// === details ===\n\tlet detail_uv = pos / ctx.detailNoiseScale + ctx.time * ctx.windSpeed / ctx.detailNoiseScale;\n\tlet detailN = textureSampleLevel(detailNoise, noiseSamp, detail_uv, 0.0).rgb;\n\tlet detailFBM = dot(detailN, vec3f(0.625, 0.25, 0.125));\n\tlet detailCloud = remap(baseCloud, detailFBM * detailStrength, 1.0, 0.0, 1.0);\n\n\t// Detail erosion can push detailCloud negative; pow(<0, e) is NaN and\n\t// WGSL's NaN-swallowing saturate below would resurrect it to FULL\n\t// density (the GLSL NaN dies in the reference's clamp/compares —\n\t// effective density 0). Negated compare so NaN input lands here too.\n\tif (!(detailCloud > 0.0)) {\n\t\treturn 0.0;\n\t}\n\n\tlet density = pow(detailCloud, mix(1.0, 0.5, precipitation));\n\n\treturn saturateF(density);\n}\n\nconst SCATTERING_OCTAVES: i32 = 4;\n\n/**\n * The per-octave phase terms of MultipleOctaveScattering.\n *\n * They depend only on mu (the view/sun cosine) and a fixed geometric\n * sequence — nothing that varies along a ray. The reference nonetheless\n * recomputes all eight Henyey-Greenstein lobes, each with a pow, inside the\n * light march: once per LIT step, up to CLOUD_RAY_STEPS times per pixel.\n * Hoisted to once per pixel here; same values, same order, so the sum below\n * is bit-identical.\n */\nfn OctaveScatteringPhases(mu: f32) -> vec4f {\n\tlet phaseAttenuation = 0.2;\n\n\tvar c: f32 = 1.0;\n\tvar phases = vec4f(0.0);\n\n\tfor (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) {\n\t\tphases[i] = mix(\n\t\t\tHenyeyGreenstein(-0.2 * c, mu), HenyeyGreenstein(0.8 * c, mu), 0.3);\n\t\tc *= phaseAttenuation;\n\t}\n\n\treturn phases;\n}\n\nfn MultipleOctaveScattering(\n\tctx: CloudsCtx, density: f32, phases: vec4f) -> f32 {\n\tlet attenuation = 0.5;\n\tlet contribution = 0.6;\n\n\tvar a: f32 = 1.0;\n\tvar b: f32 = 1.0;\n\n\tvar luminance: f32 = 0.0;\n\n\tfor (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) {\n\t\tluminance += b * phases[i] * exp(-ctx.sigmaT * density * a);\n\n\t\ta *= attenuation;\n\t\tb *= contribution;\n\t}\n\n\treturn luminance;\n}\n\nfn IntersectCloudLayer(\n\tctx: CloudsCtx, ro: vec3f, rd: vec3f,\n\ttEnter: ptr<function, f32>, tExit: ptr<function, f32>) -> bool {\n\tlet innerRadius = ctx.bottomRadius + ctx.cloudLayerBottom;\n\tlet outerRadius = ctx.bottomRadius + ctx.cloudLayerBottom + ctx.cloudLayerThickness;\n\n\tlet tInnerNear = raySphereIntersect(ro, rd, ctx.earthCenter, innerRadius);\n\tlet tInnerFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, innerRadius);\n\tlet tOuterNear = raySphereIntersect(ro, rd, ctx.earthCenter, outerRadius);\n\tlet tOuterFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, outerRadius);\n\n\tlet distToCenter = length(ro - ctx.earthCenter);\n\n\tif (distToCenter < innerRadius) { // cam below layer\n\t\t*tEnter = tInnerFar;\n\t\t*tExit = tOuterFar;\n\t} else if (distToCenter < outerRadius) { // cam inside layer\n\t\t*tEnter = 0.0;\n\t\tif (tInnerNear > 0.0) {\n\t\t\t*tExit = tInnerNear;\n\t\t} else {\n\t\t\t*tExit = tOuterFar;\n\t\t}\n\t} else { // cam above layer\n\t\tif (tOuterNear < 0.0) {\n\t\t\treturn false;\n\t\t}\n\t\t*tEnter = tOuterNear;\n\t\tif (tInnerNear > 0.0) {\n\t\t\t*tExit = tInnerNear;\n\t\t} else {\n\t\t\t*tExit = tOuterFar;\n\t\t}\n\t}\n\n\tif (*tExit < 0.0 || *tEnter >= *tExit) {\n\t\treturn false;\n\t}\n\n\t*tEnter = max(*tEnter, 0.0);\n\treturn true;\n}\n\nfn ComputeLightVisibility(\n\tctx: CloudsCtx,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tpos: vec3f, lightDir: vec3f, phases: vec4f) -> f32 {\n\tvar tLightEnter: f32;\n\tvar tLightExit: f32;\n\tif (!IntersectCloudLayer(ctx, pos, lightDir, &tLightEnter, &tLightExit)) {\n\t\treturn 0.0;\n\t}\n\n\ttLightExit = min(tLightExit, ctx.cloudLayerThickness * 1.0);\n\n\tlet dt = (tLightExit - tLightEnter) / f32(LIGHT_RAY_STEPS);\n\tlet startPos = pos + lightDir * tLightEnter;\n\tvar d: f32 = 0.0;\n\n\tfor (var i: i32 = 0; i < LIGHT_RAY_STEPS; i++) {\n\t\td += SampleDensity(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap,\n\t\t\tstartPos + lightDir * dt * f32(i));\n\t}\n\td *= dt;\n\n\treturn MultipleOctaveScattering(ctx, d, phases);\n}\n\nfn RaymarchVolumetricCloud(\n\tctx: CloudsCtx, atm: Atm,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler,\n\tirradianceTex: texture_2d<f32>,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tro: vec3f, rd: vec3f) -> vec4f {\n\tvar tEnter: f32;\n\tvar tExit: f32;\n\n\tif (!IntersectCloudLayer(ctx, ro, rd, &tEnter, &tExit)) {\n\t\treturn vec4f(0.0);\n\t}\n\n\ttExit = min(tExit, ctx.maxDistance);\n\tlet span = tExit - tEnter;\n\n\t// The reference always divides the span into CLOUD_RAY_STEPS, so the step\n\t// length swings with the ray's elevation: a near-vertical ray crosses the\n\t// 4 km shell in 25 m steps — 8x finer than the 195 m base-noise texel it is\n\t// sampling, so runs of those samples re-read one texel — while a grazing\n\t// 128 km ray gets 800 m and is the case the step budget is actually FOR. A\n\t// floor on the step length spends the full budget on the grazing rays and\n\t// stops over-marching the steep ones. ctx.minStep = 0 reproduces the\n\t// reference exactly (?dbgskystep=0, and CI pins it via minStepKmOverride);\n\t// see MIN_MARCH_STEP_KM for the measured cost/benefit.\n\tlet refDt = span / f32(CLOUD_RAY_STEPS);\n\tlet dt = max(refDt, ctx.minStep);\n\tlet steps = select(\n\t\tmin(CLOUD_RAY_STEPS, i32(ceil(span / dt))),\n\t\tCLOUD_RAY_STEPS,\n\t\tctx.minStep <= 0.0);\n\n\tvar t = max(tEnter, 0.0);\n\tvar pos = ro + rd * t;\n\n\tvar radiance = vec3f(0.0);\n\tvar totalTransmittance = vec3f(1.0);\n\n\tlet mu = dot(rd, ctx.sunDir);\n\tlet horizDist = length(pos - ro);\n\t// Loop-invariant for the whole march (see OctaveScatteringPhases).\n\tlet phases = OctaveScatteringPhases(mu);\n\n\tvar sky_transmittance: vec3f;\n\tvar sunLight: vec3f;\n\tvar skyIrradiance: vec3f;\n\n\tfor (var i: i32 = 0; i < steps; i++) {\n\t\tif (t > tExit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tpos = ro + rd * t;\n\n\t\tif (horizDist * horizDist > ctx.maxDistance * ctx.maxDistance) {\n\t\t\tbreak;\n\t\t}\n\n\t\tlet density = SampleDensity(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap, pos);\n\n\t\tif (density > 0.0) {\n\t\t\t// get lightning — only the sun-ward transmittance and the sky\n\t\t\t// irradiance are read, so both lookups take the halved variants\n\t\t\t// (same values, see GetSkyTransmittance / GetSkyIrradianceLum).\n\t\t\tsky_transmittance = GetSkyTransmittance(\n\t\t\t\tatm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir);\n\t\t\tskyIrradiance = GetSkyIrradianceLum(atm, irradianceTex,\n\t\t\t\tpos - ctx.earthCenter, normalize(pos - ctx.earthCenter), ctx.sunDir);\n\t\t\tsunLight = sky_transmittance * atm.sun_spectral_radiance_to_luminance;\n\t\t\t// night\n\t\t\tskyIrradiance = max(vec3f(10.0), skyIrradiance);\n\t\t\tsunLight = max(vec3f(100.0), sunLight);\n\n\t\t\tlet vis = ComputeLightVisibility(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap, pos, ctx.sunDir,\n\t\t\t\tphases);\n\n\t\t\tlet sampleSigmaS = ctx.sigmaS * density;\n\t\t\tlet sampleSigmaT = max(ctx.sigmaT * density, CLOUD_EPS);\n\n\t\t\tlet powder = exp(-density * sampleSigmaT);\n\t\t\tlet powderEffect = mix(1.0, powder, smoothstepGl(0.5, -0.5, mu));\n\t\t\tvar inscatter = (sunLight * vis + skyIrradiance) * sampleSigmaS;\n\t\t\tinscatter *= powderEffect;\n\n\t\t\tlet transmittance = exp(-sampleSigmaT * dt);\n\n\t\t\t// Energy conserving\n\t\t\tradiance += totalTransmittance * (inscatter - inscatter * transmittance) / sampleSigmaT;\n\t\t\ttotalTransmittance *= transmittance;\n\n\t\t\tif (length(totalTransmittance) <= 0.1) {\n\t\t\t\ttotalTransmittance = vec3f(0.0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tt += dt;\n\t}\n\n\t// Convert transmittance to alpha\n\tlet alpha = 1.0 - dot(totalTransmittance, vec3f(0.2126, 0.7152, 0.0722));\n\n\tlet fog = exp(-horizDist / ctx.fogFactor); // ! hack probably should use bruneton transmittance\n\n\treturn vec4f(radiance, alpha) * fog;\n}\n\n// High-altitude clouds (above the volumetric) 2D\nfn HighAltitudeCloud(\n\tctx: CloudsCtx, atm: Atm,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler,\n\thighCloudsMap: texture_2d<f32>, weatherSamp: sampler,\n\tro: vec3f, rd: vec3f) -> vec4f {\n\tif (abs(rd.y) < CLOUD_EPS) {\n\t\treturn vec4f(0.0);\n\t}\n\n\tvar result = vec4f(0.0);\n\n\tlet t = raySphereIntersect(ro, rd, ctx.earthCenter, ctx.bottomRadius + ctx.highCloudsHeight);\n\tif (t < 0.0) {\n\t\treturn result;\n\t}\n\n\tlet pos = ro + rd * t;\n\tlet normal = normalize(pos - ctx.earthCenter);\n\tlet mu = dot(-rd, ctx.sunDir);\n\tlet phase = mix(HenyeyGreenstein(-0.1, mu), HenyeyGreenstein(0.2, mu), 0.2);\n\n\t// Sun-ward: transmittance only (the radiance return was discarded).\n\tlet trans = GetSkyTransmittance(\n\t\tatm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir);\n\tlet sunLight = trans * atm.sun_spectral_radiance_to_luminance;\n\tvar zenithTrans: vec3f;\n\tlet skyLight = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex, scatteringSamp,\n\t\tpos - ctx.earthCenter, vec3f(0.0, 1.0, 0.0), 0.0, ctx.sunDir, &zenithTrans);\n\n\tlet scatter = sunLight * phase + skyLight;\n\n\t// === Cirrus (R) ===\n\tlet cirrusDensity = triplanarSample(highCloudsMap, weatherSamp,\n\t\tpos + ctx.time * ctx.windSpeed * cirrusSpeedFactor, normal,\n\t\t1.0 / ctx.highCloudsScale).r;\n\n\tif (cirrusDensity > CLOUD_EPS) {\n\t\tlet alpha = cirrusDensity * ctx.cirrusDensity;\n\t\tresult = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha,\n\t\t\tresult.a + (1.0 - result.a) * alpha);\n\t}\n\n\t// === Alto (G) ===\n\tlet altoDensity = triplanarSample(highCloudsMap, weatherSamp,\n\t\tpos + ctx.time * ctx.windSpeed * altoSpeedFactor, normal,\n\t\t1.0 / ctx.highCloudsScale).g;\n\n\tif (altoDensity > CLOUD_EPS) {\n\t\tlet alpha = altoDensity * ctx.altoDensity;\n\t\tresult = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha,\n\t\t\tresult.a + (1.0 - result.a) * alpha);\n\t}\n\n\tlet fog = exp(-length((ro + rd * t) - ro) / ctx.fogFactor);\n\treturn result * fog;\n}\n"),n=ke(`fn cloudsPass(${yp}) -> vec4f {${oc}}`,[i]),l=op,o={...t,irradianceTex:Ea(e.irradiance),baseNoiseTex:Ia(this._baseNoise),noiseSamp:ct(this._baseNoise),detailNoiseTex:Ia(this._detailNoise),weatherCurTex:Ea(this._weatherCur),weatherSamp:ct(this._weatherCur),weatherNextTex:Ea(this._weatherNext),highCloudsTex:Ea(this._highClouds),cloudsParamsA:lr(new _s(l.maxDistance,l.sigmaS,l.sigmaA,l.cloudLayerThickness)),cloudsParamsB:lr(new _s(l.cloudLayerBottom,l.highCloudsHeight,l.highCloudsScale,l.weatherMapScale)),cloudsParamsC:this._uCloudsParamsC,cloudsParamsD:this._uCloudsParamsD},u=new bt;u.name="SplineSkyCloudsPass",u.lights=!1,u.fragmentNode=n(o),this._cloudsQuad=new Ga(u),this._cloudsArgs=o,this._cloudsLib=i}_ensureEnvPass(){if(this._envQuad)return;this._ensurePasses();let e=ke(`fn skyEnvPass(${yp},\n\texposure: f32, gamma: f32, cloudsOn: f32) -> vec4f {${uc}}`,[Me(dc),this._cloudsLib]),t=new bt;t.name="SplineSkyEnvironmentPass",t.lights=!1,t.fragmentNode=e({...this._cloudsArgs,exposure:this._uExposure,gamma:this._uGamma,cloudsOn:this._uEnvCloudsOn}),this._envQuad=new Ga(t)}_ensureBackgroundMesh(e,t){if(this.backgroundMesh)return this.backgroundMesh;let a=new As;a.setAttribute("position",new Cs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let r=new bt;r.name="SplineSkyBackground",r.lights=!1,r.depthWrite=!1,r.depthTest=!1,r.colorNode=this._buildComposeNode(e,t);let s=ke("fn skyBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");r.vertexNode=s({position:ie});let i=new Ds(a,r);return i.name="SplineSkyBackground",i.frustumCulled=!1,i.renderOrder=-1e9,i.matrixAutoUpdate=!1,i.raycast=()=>{},this.backgroundMesh=i,i}_syncState(e){let t=e.skyState,a=e!==this._lastPage;if(!a&&e.skyStateVersion===this._lastVersion)return;this._lastPage=e,this._lastVersion=e.skyStateVersion;let r=t.weather;if(r!==this._appliedWeather||t.seed!==this._appliedSeed||a){let e=Xc(r,t.seed);if(null===this._appliedWeather||a)this._weatherCur.image.data.set(e),this._weatherNext.image.data.set(e),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendFrom=1,this._blendStart=0,this._presetFrom=r,this._presetTo=r;else{let t=this._weatherCur.image.data,a=this._weatherNext.image.data;t.set(a),a.set(e),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendStart=performance.now(),this._blendFrom=0,this._presetFrom=this._presetTo,this._presetTo=r}this._appliedWeather=r,this._appliedSeed=t.seed}this._uExposure.value=5e-4*t.exposure,this._cloudsEnabled=t.clouds}_cornerRay(e,t,a,r){let s=np.set(e,t,-1,1).applyMatrix4(a.projectionMatrixInverse);return this._eyeRayToWorld(s.x,s.y,a,r)}_eyeRayToWorld(e,t,a,r){let s=lp.set(e,t,-1,0).applyMatrix4(a.matrixWorld);return r.set(s.x,s.y,s.z).normalize()}_updateCornerRays(e,t){let a=e;if(-1!==e.projectionMatrix.elements[11]){let r="number"==typeof a.fov&&a.fov>0?a.fov:45,s=Math.tan(r*Math.PI/360),i=s*t;return this._eyeRayToWorld(-i,-s,e,this._uRay00.value),this._eyeRayToWorld(i,-s,e,this._uRay10.value),this._eyeRayToWorld(-i,s,e,this._uRay01.value),void this._eyeRayToWorld(i,s,e,this._uRay11.value)}this._cornerRay(-1,-1,e,this._uRay00.value),this._cornerRay(1,-1,e,this._uRay10.value),this._cornerRay(-1,1,e,this._uRay01.value),this._cornerRay(1,1,e,this._uRay11.value)}update(e,t){if("hdri"===e.skyState?.mode)return void this._updateHdri(e,t,e.skyState);!0===this._hdri?.active&&this._hdri.detach(),this._ensurePasses(),this._syncState(e);let a=e.skyState,r=performance.now(),s=null===this._lastFrameTime?0:(r-this._lastFrameTime)/1e3;this._lastFrameTime=r;let i=a.animateWind&&!0===this._renderer.skyAnimationAllowed&&null===this.fixedTimeSeconds;i&&(this._windOffsetKm+=a.windSpeed/1e3*300*Math.min(s,.25));let n=this.fixedTimeSeconds??3600*a.timeOfDay,l=Ac(n);this._uSunDir.value.set(l[0],l[1],l[2]);let o=1;this._blendStart>0&&(o=Math.min(1,this._blendFrom+(r-this._blendStart)/1e3/2),o>=1&&(this._blendStart=0));let u=this.minStepKmOverride??mp??.05;null!==this.fixedTimeSeconds?this._uCloudsParamsD.value.set(a.windSpeed/1e3,o,this.fixedTimeSeconds,u):this._uCloudsParamsD.value.set(1,o,this._windOffsetKm,u);let d=this.highCloudDensityOverride,h=hp[this._presetFrom],m=hp[this._presetTo];this._uCloudsParamsC.value.set(op.baseNoiseScale,op.detailNoiseScale,null!==d?d[0]:h[0]+(m[0]-h[0])*o,null!==d?d[1]:h[1]+(m[1]-h[1])*o),this._animating=this._cloudsEnabled&&(this._blendStart>0||i&&0!==a.windSpeed),!0===a.lighting?(this._ensureLightingLuts(),this._updateLighting(e,o,a.exposure,a.lightingIntensity??1)):null!==this._lightingPage&&this._teardownLighting();let c=this._renderer.getDrawingBufferSize(ip);this._updateCornerRays(t,c.y>0?c.x/c.y:1);let p=Math.max(1,Math.round(this.fixedSkySize?.x??c.x)),g=Math.max(1,Math.round(this.fixedSkySize?.y??c.y)),f=Math.max(1,Math.round(this.fixedCloudsSize?.x??c.x/4)),_=Math.max(1,Math.round(this.fixedCloudsSize?.y??c.y/4)),y=(e,t,a,r)=>{if(e&&e.width===t&&e.height===a)return e;void 0!==this._renderer.retireRenderTarget?this._renderer.retireRenderTarget(e):e?.dispose();let s=new ys(t,a,{type:ts,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(sp),t=b.getClearAlpha();b.setClearColor(0,0),b.clear(!0,!1,!1),b.setClearColor(e,t),this._cloudsTargetCleared=!0}if(!1!==this._renderer.skyEnvironmentNeeded){if(this._ensureEnvPass(),null===this._envTarget){this._envTarget=new ys(256,128,{type:ts,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-environment",e.generateMipmaps=!0,e.minFilter=Js,e.magFilter=Qs,e.wrapS=Ls}this._uEnvCloudsOn.value=this._cloudsEnabled?1:0;let e=i?.25*Math.round(w.z/.25):w.z,t=this._blendStart>0?Math.floor(16*o)/16:o,a=`${n}|${this._uExposure.value}|${this._uGamma.value}|${this._cloudsEnabled}|${w.x},${t},${e},${w.w}|${this._presetFrom}>${this._presetTo}|${d??""}|${this._appliedWeather}|${this._appliedSeed}|${this._highCloudsReady}`;a!==this._lastEnvKey?(this._lastEnvKey=a,b.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),this._requestEnvPmrem(r)):this._pmremPending&&this._requestEnvPmrem(r)}b.setRenderTarget(T);let E=this._ensureBackgroundMesh(this._skyTarget.texture,this._cloudsTarget.texture);(x!==this._skyTarget||v!==this._cloudsTarget)&&this._rebindComposeTextures(),E.parent!==e&&(E.parent?.remove(E),e.add(E))}_updateHdri(e,t,a){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._animating=!1;let r=this._renderer.getDrawingBufferSize(ip);this._updateCornerRays(t,r.y>0?r.x/r.y:1),null===this._hdri&&(this._hdri=new rp(this._renderer,{ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11}));let s=e.skyHdriHolder,i=null!==s&&s.loaded?s.getTexture(1001):null;this._iblHdriTexture=i,this._iblRotationY=a.hdri?.rotation??0;let n=t.fov,l="number"==typeof n&&n>0?n:45,o=r.y/(this._renderer.getPixelRatio?.()??1),u=l*Math.PI/180/Math.max(1,o),d=(a.hdri?.blur??0)*u;this._hdri.update(e,i,a.hdri?.rotation,d,!1!==a.hdri?.showBackground);let h=!0===a.lighting&&null!==i?this._hdri.lightingInfo(i):null;null!==h?this._updateHdriLighting(e,h,a.hdri?.rotation??0,a.lightingIntensity??1):null!==this._lightingPage&&this._teardownLighting()}_updateHdriLighting(e,t,a,r){null!==this._lightingPage&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let s=e=>{let t=Math.max(e[0],e[1],e[2],1e-6);return[e[0]/t,e[1]/t,e[2]/t]},i=this._sunLight;null===i&&(i=new ss(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 ki(16777215,8947848,0),m.name="SplineSkyAmbient",m.layers.enable(3),m.raycast=()=>{},this._skyHemi=m),m.parent!==e&&e.add(m);let c=s(t.skyColor);m.color.setRGB(c[0],c[1],c[2]);let p=s(t.groundColor),g=t.skyLum>1e-6?Math.min(t.groundLum/t.skyLum,1):cp;m.groundColor.setRGB(p[0]*g,p[1]*g,p[2]*g),m.intensity=.75*Math.PI*(t.skyLum/.5)*r}_ensureLightingLuts(){if(this._lightingLutsRequested||null===this._luts)return;this._lightingLutsRequested=!0;let e=this._luts;Promise.all([Qm(this._renderer,e.transmittance,256,64,1,!1),Qm(this._renderer,e.irradiance,64,16,1,!1)]).then(([e,t])=>{this._lightingLuts={transmittance:e,irradiance:t};let a=this._atmosphereUniforms,r=a.bottomRadius+.1,s=Ac(43200)[1],i=ac(a,this._lightingLuts,r,s);this._noonSunRgb=[i[0],i[1],i[2]],this._noonSunLum=tc(i),this._noonSkyLum=tc(rc(a,this._lightingLuts,r,s))},()=>{})}_updateLighting(e,t,a,r){let s=this._lightingLuts,i=this._noonSunRgb;if(null===s||null===i||this._noonSunLum<=0||this._noonSkyLum<=0)return;null!==this._lightingPage&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let n=this._atmosphereUniforms,l=n.bottomRadius+.1,o=this._uSunDir.value,u=o.y,d=e=>e[this._presetFrom]+(e[this._presetTo]-e[this._presetFrom])*t,h=(e,t)=>{let a=[e[0]/Math.max(i[0],1e-12),e[1]/Math.max(i[1],1e-12),e[2]/Math.max(i[2],1e-12)],r=tc(a),s=[r+(a[0]-r)*t,r+(a[1]-r)*t,r+(a[2]-r)*t],n=Math.max(s[0],s[1],s[2],1e-12);return[s[0]/n,s[1]/n,s[2]/n]},m=d(pp),c=ac(n,s,l,u),p=tc(c),g=this._sunLight;if(null===g&&(g=new ss(16777215,0),g.name="SplineSkySun",g.layers.enable(3),g.raycast=()=>{},this._sunLight=g),g.parent!==e&&e.add(g),g.userData.splineDiffuseOnly=!1,g.position.set(o.x,o.y,o.z).multiplyScalar(1e5),p>0){let e=h(c,m);g.color.setRGB(e[0],e[1],e[2])}g.intensity=1*Math.PI*(p/this._noonSunLum)*d(gp)*a*r;let f=e.ambientLight;null!=f&&(null!==f.parent&&f.removeFromParent(),this._userAmbientSuppressed=!0);let _=this._skyHemi;null===_&&(_=new ki(16777215,8947848,0),_.name="SplineSkyAmbient",_.layers.enable(3),_.raycast=()=>{},this._skyHemi=_),_.parent!==e&&e.add(_);let y=rc(n,s,l,u),x=tc(y),[v,b,T]=h(y,m);_.color.setRGB(v,b,T),_.groundColor.setRGB(v*cp,b*cp,T*cp),_.intensity=.75*Math.PI*(x/this._noonSkyLum)*d(fp)*a*r}_teardownLighting(){let e=this._lightingPage;if(this._lightingPage=null,this._sunLight?.parent?.remove(this._sunLight),this._skyHemi?.parent?.remove(this._skyHemi),this._userAmbientSuppressed){this._userAmbientSuppressed=!1;let t=e?.ambientLight,a=e?.data?.ambient?.enabled;t&&!1!==a&&e.add(t)}}_buildComposeNode(e,t){return ke("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}",[Me(dc)])({uv:vt,skyTex:Ea(e),skySamp:ct(e),cloudsTex:Ea(t),exposure:this._uExposure,gamma:this._uGamma})}_rebindComposeTextures(){let e=this.backgroundMesh?.material;!e||!this._skyTarget||!this._cloudsTarget||(e.colorNode=this._buildComposeNode(this._skyTarget.texture,this._cloudsTarget.texture),e.needsUpdate=!0)}detach(){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._hdri?.detach(),this._teardownLighting()}dispose(){this.detach(),this._hdri?.dispose(),this._hdri=null,this._sunLight?.dispose(),this._sunLight=null,this._skyHemi?.dispose(),this._skyHemi=null,this._luts?.dispose(),this._luts=null,this._baseNoise?.dispose(),this._detailNoise?.dispose(),this._weatherCur.dispose(),this._weatherNext.dispose(),this._highClouds.dispose(),this._skyTarget?.dispose(),this._cloudsTarget?.dispose(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._skyQuad=null,this._cloudsQuad=null,this._envQuad=null,this._cloudsArgs=null,this._cloudsLib=null,this._lastSkyPassKey=null,this._lastCloudsPassKey=null}};Rl=e=>new xp(e);var vp=e=>e,bp=$("vec4","vSplatColor"),Tp=$("vec2","vSplatPosition");function wp(e,t,a){return e.element(t).element(a)}var Sp=class extends bt{constructor(e){super(),this.uniformsNeedUpdate=!1,this._covariancesTex=Ea(new ps),this._centersColorsTex=Ea(new ps),this._meshMatrixWorldsTex=Ea(new ps),this._focal=lr(new os),this._viewport=lr(new os),this._basisViewport=lr(new os),this._covariancesTextureSize=lr(new os(1024,1024)),this._centersColorsTextureSize=lr(new os(1024,1024)),this._orthoZoom=lr(-1),this._velocityMRT=ba({velocity:ne(0)}),this.name="WebGPUSplatMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.side=Is,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 Ss)},this._buildGraph(e)}_buildGraph(e){let t=this._covariancesTex,a=this._centersColorsTex,r=this._meshMatrixWorldsTex,s=this._focal,i=this._basisViewport,n=this._covariancesTextureSize,l=this._centersColorsTextureSize,o=this._orthoZoom,u=re(()=>{let u=it("splatIndex","uint"),d=(e,t,a)=>{let r=u.mul(rr(e)).add(rr(t)).toFloat().div(a.x);return Y(B(r),R(r).div(a.y))},h=a.sample(d(1,0,l)).toVar(),m=ot(W(h.y,h.z,h.w),"vec3").toVar(),c=h.x;bp.assign(ne(c.bitAnd(rr(255)).toFloat(),c.shiftRight(rr(8)).bitAnd(rr(255)).toFloat(),c.shiftRight(rr(16)).bitAnd(rr(255)).toFloat(),c.shiftRight(rr(24)).bitAnd(rr(255)).toFloat()).mul(1/255));let p=it("position","vec3").xy.mul(2).toVar();Tp.assign(p);let g=ir(0);for(let t=1;t<e.length-1;t++)g=vp(g.add(u.greaterThanEqual(rr(e[t])).select(ir(1),ir(0))));let f=g.mul(4).toVar(),_=e=>r.sample(Y(f.add(e).div(1024),0)),y=xt(_(0),_(1),_(2),_(3)),x=kt.mul(y).toVar(),v=x.mul(ne(m,1)).toVar(),b=Tt.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,k=S.x,A=S.y,P=gt(V,M,C,M,z,k,C,k,A),E=ir(1).div(v.z.mul(v.z)).toVar(),N=x,L=gt(N.element(0).xyz,N.element(1).xyz,N.element(2).xyz).transpose(),I=gt(s.x.div(v.z),0,s.x.mul(v.x).negate().mul(E),0,s.y.div(v.z),s.y.mul(v.y).negate().mul(E),0,0,0),F=e=>{let t=e.transpose().mul(P).mul(e);return ne(wp(t,0,0).add(.3),wp(t,0,1),wp(t,1,1).add(.3),0).xyz},D=o.greaterThan(0),U=D.select(F(L),F(L.mul(I))).toVar(),O=b.xyz.div(b.w).toVar(),G=U.x,q=U.z,H=U.y,j=G.mul(q).sub(H.mul(H)),K=G.add(q),$=K.mul(.5),X=na(At(K.mul(K).div(4).sub(j),0)).toVar(),Q=$.add(X).toVar(),Z=At($.sub(X),0).toVar(),J=Ya(Y(H,Q.sub(G))).toVar(),ee=Y(J.y,J.x.negate()).toVar(),te=J.mul(Dt(na(Q.mul(2)),1024)).toVar(),ae=ee.mul(Dt(na(Z.mul(2)),1024)).toVar(),re=te.mul(p.x).add(ae.mul(p.y)).mul(i).toVar();return re.assign(D.select(re.mul(o),re)),ne(O.xy.add(re),O.z,1)}),d=re(()=>{let e=Tp.dot(Tp).negate().toVar();e.lessThan(-4).discard();let t=Ka(e).mul(bp.w);return ne(bp.xyz,t)});this.vertexNode=u(),this.colorNode=d(),this.needsUpdate=!0}setup(e){let t=e.renderer.getMRT?.();this.mrtNode=t?this._velocityMRT:null,super.setup(e)}nodeMaterialDispose(){this.dispose()}};function Vp(){let e=lr(1),t=lr(.6),a=lr(1),r=lr(1),s=lr(new Ss(16603997)),i=lr(new Ss(2857471)),n=lr(new Ss(3728051)),l=lr(9),o=lr(new os),u=new bt;u.name="EditorGridNodeMaterial",u.transparent=!0,u.lights=!1,u.fog=!1;let d=St(l.equal(10),n,i),h=St(l.equal(8),n,s),m=St(ue.x.equal(o.x),d,St(ue.z.equal(o.y),h,ae(.5)));u.colorNode=m;let c=_e.z.negate(),p=$t(a.mul(500),a.mul(4500),c).mul(r);u.opacityNode=qt(e.mul(t),ir(0),p);let g={get value(){return 0===r.value?1/0:a.value},set value(e){Number.isFinite(e)?(a.value=e,r.value=1):r.value=0}};return u.uniforms={angleFadeFactor:e,opacityFactor:t,gridScale:g,red:s,blue:i,green:n,mode:l,offset:o},u}function Mp(){return typeof navigator<"u"&&void 0!==navigator.gpu}vr({createSplatMaterial:e=>new Sp(e)}),kr({createRootMaterial:(e,t)=>new nh(e,t),createSharedMaterial:(e,t,a)=>new lh(e,t,a)}),Pr({tsl:er,NodeMaterial:bt,MeshBasicNodeMaterial:Ht,MeshStandardNodeMaterial:ga,MeshPhysicalNodeMaterial:xa,MeshPhongNodeMaterial:ra,MeshLambertNodeMaterial:Jt,MeshToonNodeMaterial:wa,MeshMatcapNodeMaterial:Ca,MeshNormalNodeMaterial:It,SpriteNodeMaterial:Aa,PointsNodeMaterial:Na,LineBasicNodeMaterial:Vt,LineDashedNodeMaterial:zt,Color:Ss,Vector2:os,Vector3:ds,Vector4:_s,Matrix3:hs,Matrix4:Ts,Texture:ps,CanvasTexture:rs,DataTexture:Hs,VideoTexture:ri,FrontSide:Ns,BackSide:Bs,DoubleSide:Is,NormalBlending:qs,AdditiveBlending:js,MultiplyBlending:Xs,SubtractiveBlending:Ks,RepeatWrapping:Ls,ClampToEdgeWrapping:Fs,MirroredRepeatWrapping:Os,NearestFilter:Ws,LinearFilter:Qs,LinearMipmapLinearFilter:Js,SRGBColorSpace:cs,LinearSRGBColorSpace:fs}),Ar(()=>{let e=new Fa;return e.depthWrite=!1,e.opacity=.5,e});var Cp=["maxUniformBuffersPerShaderStage","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageBufferBindingSize","maxBufferSize","maxVertexBuffers","maxVertexAttributes","maxUniformBufferBindingSize","maxColorAttachmentBytesPerSample"];async function Rp(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 Cp){let t=r[e];"number"==typeof t&&Number.isFinite(t)&&(a[e]=t)}return a}catch{return}}(e),r=new wo({...e,requiredLimits:a});await r.init();try{let e=new URLSearchParams(window.location.search);if("off"===e.get("taa")&&(r.temporalAAEnabled=!1),"1"===e.get("nojit")){let e=r.taaHistory;e.beginJitter=()=>{},e.endJitter=()=>{}}"1"===e.get("dbghdt")&&(r.hdTransmission=!0)}catch{}return r}export{Do as SPE_BLENDING_MULTIPLY,Fo as SPE_BLENDING_NORMAL,Oo as SPE_BLENDING_OVERLAY,Uo as SPE_BLENDING_SCREEN,Bo as TSLLayerParams,nh as TSLRootMaterial,lh as TSLSharedMaterial,Wi as WebGPUPostPipeline,wo as WebGPUSplineRenderer,Vp as createEditorGridNodeMaterial,Rp as createWebGPUSplineRenderer,$o as getTSLLayerBuilder,Xo as hasTSLLayerBuilder,Mp as isWebGPUSupported,Eo as ownUniformValue,Ko as registerTSLLayer,No as setRenderUniformValue,Io as simpleCalpha,qo as speBlend,zo as speObjectNormal,Ro as speObjectPosition,Po as splitUniformValueSlots,Lo as standardCalpha,jo as unsupportedTSLLayerBuilder,w as webgpuGlobals};
1
+ import{a as e,b as t,c as a,d as r}from"./runtime-chunk-FN2C54JM.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-RX3SW5K2.js";import{b as g}from"./runtime-chunk-CVUJ3GMH.js";import"./runtime-chunk-LQL2PJVX.js";import"./runtime-chunk-4LKRNVPP.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-M3ZKF7PK.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,C as N,Ca as B,Cc as L,D as I,Da as F,Db as D,Dc as U,E as O,Ea as G,Eb as q,Ec as W,F as H,Fa as j,Fb as K,Fc as $,G as X,Ga as Q,Gb as Z,Gc as Y,H as J,Ha as ee,Hb as te,Hc as ae,I as re,Ia as se,Ib as ie,Ic as ne,J as le,Ja as oe,Jb as ue,Jc as de,K as he,Ka as me,Kb as ce,Kc as pe,L as ge,La as fe,Lb as _e,Lc as ye,M as xe,Ma as ve,Mb as be,Mc as Te,N as we,Na as Se,Nb as Ve,Nc as Me,O as 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 Fe,R as De,Ra as Ue,Rc as Oe,S as Ge,Sa as qe,T as We,Ta as He,Tb as je,U as Ke,Ua as $e,Ub as Xe,V as Qe,Va as Ze,Vb as Ye,W as Je,Wa as et,Wb as tt,X as at,Xa as rt,Xb as st,Y as it,Ya as nt,Yb as lt,Z as ot,Za as ut,Zb as dt,_ as ht,_a as mt,_b as ct,aa as pt,ab as gt,ac as ft,b as _t,ba as yt,bb as xt,bc as vt,c as bt,ca as Tt,cb as wt,cc as St,d as Vt,da as Mt,db as Ct,dc as Rt,e as zt,ea as kt,eb as At,ec as Pt,f as Et,fa as Nt,fb as Bt,fc as Lt,g as It,ga as Ft,gb as Dt,gc as Ut,h as Ot,ha as Gt,hb as qt,hc as Wt,i as Ht,ia as jt,ib as Kt,ic as $t,j as Xt,ja as Qt,jb as Zt,jc as Yt,k as Jt,ka as ea,kb as ta,kc as aa,l as ra,la as sa,lb as ia,lc as na,m as la,ma as oa,mb as ua,mc as da,n as ha,na as ma,nb as ca,nc as pa,o as ga,oa as fa,ob as _a,oc as ya,p as xa,pa as va,pb as ba,pc as Ta,q as wa,qa as Sa,qb as Va,qc as Ma,r as Ca,ra as Ra,rb as za,rc as ka,s as Aa,sa as Pa,sc as Ea,t as Na,ta as Ba,tb as La,tc as Ia,u as Fa,ua as Da,ub as Ua,uc as Oa,v as Ga,va as qa,vb as Wa,vc as Ha,w as ja,wa as Ka,wb as $a,wc as Xa,x as Qa,xa as Za,xb as Ya,xc as Ja,y as er,ya as tr,yb as ar,yc as rr,z as sr,za as ir,zb as nr,zc as lr}from"./runtime-chunk-5H2Z5KYI.js";import{a as or}from"./runtime-chunk-GFTBNL2W.js";import{a as ur,b as dr,c as hr,d as mr,e as cr,f as pr,g as gr,h as fr,i as _r,j as yr}from"./runtime-chunk-BLFFIB2B.js";import{a as xr,b as vr,e as br,f as Tr}from"./runtime-chunk-KKDM5MC5.js";import{a as wr}from"./runtime-chunk-ZM7N5SZG.js";import"./runtime-chunk-UHCXLQHA.js";import{a as Sr,b as Vr,c as Mr}from"./runtime-chunk-CDYE22J6.js";import{a as Cr,b as Rr}from"./runtime-chunk-RTRWO43P.js";import"./runtime-chunk-ZASM3KKC.js";import"./runtime-chunk-TU4KDRKR.js";import"./runtime-chunk-WQ2NXI3U.js";import{a as zr}from"./runtime-chunk-YS7K3AW3.js";import"./runtime-chunk-MVJAFW5H.js";import"./runtime-chunk-JSRKKIOS.js";import"./runtime-chunk-M4BPCY7K.js";import"./runtime-chunk-QSJVWNNM.js";import"./runtime-chunk-VNO2DW74.js";import{L as kr,O as Ar,Q as Pr,U as Er,V as Nr,W as Br,Y as Lr,Z as Ir,_ as Fr,h as Dr,k as Ur,l as Or,m as Gr}from"./runtime-chunk-7FDJ7IIR.js";import"./runtime-chunk-4YV3EXSU.js";import"./runtime-chunk-NSD7DU3P.js";import"./runtime-chunk-MOZWC42D.js";import"./runtime-chunk-2PT2WH66.js";import"./runtime-chunk-4KZXQGUQ.js";import"./runtime-chunk-U4QOT2PX.js";import"./runtime-chunk-TZCHGFVF.js";import{W as qr,ea as Wr,fa as Hr,qa as jr,ra as Kr,sa as $r,ta as Xr,x as Qr}from"./runtime-chunk-VPEJ5BFD.js";import{e as Zr,f as Yr}from"./runtime-chunk-EOV2DL2V.js";import{b as Jr}from"./runtime-chunk-Y3BMDVJ7.js";import{Aa as es,Ba as ts,Bc as as,Bd as rs,Be as ss,Cc as is,Cd as ns,D as ls,Dc as os,Ec as us,Fc as ds,Gc as hs,Hc as ms,Ib as cs,Ic as ps,Ja as gs,Jb as fs,Jc as _s,Kc as ys,Ma as xs,Me as vs,Oa as bs,Oc as Ts,Pc as ws,Tc as Ss,Y as Vs,Yc as Ms,Zc as Cs,aa as Rs,ca as zs,da as ks,dd as As,g as Ps,id as Es,j as Ns,k as Bs,ka as Ls,l as Is,la as Fs,ld as Ds,m as Us,ma as Os,mc as Gs,n as qs,na as Ws,nd as Hs,o as js,p as Ks,pd as $s,q as Xs,qa as Qs,r as Zs,rd as Ys,sa as Js,t as ei,ua as ti,ve as ai,yd as ri,ye as si,z as ii,ze as ni}from"./runtime-chunk-VGN7YHB7.js";import"./runtime-chunk-ML3Z74BL.js";var li=[[.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]],oi=lr(new Ss(1,1,1)).setGroup(st),ui=lr(.1).setGroup(st),di=lr(2e3).setGroup(st),hi=lr(0).setGroup(st),mi=lr(new ds(.005,.01,0)).setGroup(st),ci=re(([e,t,a,r])=>{let s=r.x,i=r.y,n=a.y.sub(r.z),l=s.mul(i.mul(n).negate().clamp(-60,60).exp()),o=i.mul(e.y).clamp(-60,60).toVar(),u=St(o.greaterThanEqual(0),ir(1),ir(-1)).mul(o.abs().max(1e-4));return l.mul(t).mul(ir(1).sub(u.negate().exp())).div(u).max(0).negate().exp().oneMinus()}),pi=re(()=>{let e=Ve.sub(yt).toVar(),t=e.length().max(1e-6);return ci(e,t,yt,mi)}),gi=(()=>{let e=ir(1).sub(da(.5,hi)).add(da(1.5,hi)),t=da(.5,hi),a=ir(1).sub(ir(1).sub(Xe(ui,di).mul(e)).mul(ir(1).sub(pi().mul(t))));return P(oi,a)})();function fi(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=gi);oi.value.copy(a.color),ui.value=a.near,di.value=a.far,hi.value=jr.getModeIndex({mode:e.fogMode}),mi.value.set(e.fogDensity??jr.getDensity({}),e.fogHeightFalloff??jr.getHeightFalloff({}),e.fogHeightBase??jr.getHeightBase({}))}else if(null===t)for(let e of r)e?.fogNode&&(e.fogNode=null)}var _i=e=>e,yi=e=>e,xi=e=>e,vi=(e,t,a)=>R(e.add(.5).mul(t)).add(.5).div(a),bi=new Ga,Ti=new Ss,wi=class{constructor(){this._gBuffer=null,this._aoBuffer=null,this._hbaoMaterial=null,this._resolveMaterial=null,this._boundBlueNoise=null,this._frameIndex=0,this._projectionMatrixInverse=lr(new Ts),this._isOrtho=lr(0),this._resolution=lr(new os(1,1)),this._fullResolution=lr(new os(1,1)),this._radiusOfInfluence=lr(128),this._radiusInScreenSpace=lr(1),this._exponent=lr(1),this._aoColor=lr(new Ss(0,0,0)),this._bias=lr(.5),this._frame=lr(0),this._fogEnabled=lr(0),this._fogNear=lr(1),this._fogFar=lr(1e3),this._fogMode=lr(0),this._fogHeightParams=lr(new ds(.005,.01,0)),this._cameraWorldMatrix=lr(new Ts);let e=new bt;e.name="SplineHBAO.gbuffer",e.side=Is,e.fragmentNode=ne(Wa.mul(tr),1),e.lights=!1,e.blending=Us,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=Ea(this._gBuffer.depthTexture),r=Ea(this._gBuffer.texture),s=Ea(t),i=this._projectionMatrixInverse,n=this._isOrtho,l=this._resolution,o=this._fullResolution,u=this._radiusOfInfluence,d=this._radiusInScreenSpace,h=this._exponent,m=this._aoColor,c=this._bias,p=this._frame,g=this._fogEnabled,f=this._fogNear,_=this._fogFar,y=this._fogMode,x=this._fogHeightParams,v=this._cameraWorldMatrix,b=!0===e.reversedDepthBuffer,T=e=>a.sample(e),w=(e,t)=>ee(e,t,i),S=e=>w(e,T(e)),V=re(()=>{let e=U().toVar(),t=l,a=o,i=R(e.mul(t)).toVar(),V=a.div(t).toVar(),M=vi(i,V,a).toVar(),C=T(M).toVar(),z=w(M,C).toVar(),k=Ya(r.sample(M).xyz).toVar(),A=At(d.div(qt(z.z.negate(),ir(1),n)),ir(5)).toVar(),P=$e(Re(ft.xy.x).bitAnd(Re(127)),Re(ft.xy.y).bitAnd(Re(127))),E=s.load(P).xyz.x,N=B(E.add(ir(.61803398875).mul(p))).mul(6.283),L=oa(N).toVar(),I=Wt(N).toVar(),F=A.div(5).toVar(),D=ir(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]=li[4*e+r],l=Y(L.mul(s).sub(I.mul(n)),I.mul(s).add(L.mul(n))),o=yi(i.add(dt(l.mul(t)))).toVar(),d=xi(S(vi(o,V,a))).toVar();t.addAssign(F);let h=xi(d.sub(z)).toVar(),m=_i(h.dot(h)).toVar(),p=na(m),g=_i(k.dot(h)).div(At(p,ir(1e-4))),f=m.mul(ir(-1).div(u.mul(u))).add(1);D.addAssign(Ft(g.sub(c),0,1).mul(Ft(f,0,1)))}}let O=ir(1).div(ir(1).sub(c));D.mulAssign(O.div(16));let G=Ft(ir(1).sub(D.mul(2)),0,1),q=ze(G,h).toVar(),W=b?C.lessThanEqual(0):C.greaterThanEqual(1);q.assign(W.select(ir(1),q));let H=ae(qt(m,ae(1),q)).toVar(),j=$t(f,_,z.z.negate()),K=v.mul(ne(z,1)).xyz,$=v.mul(ne(0,0,0,1)).xyz,X=K.sub($).toVar(),Q=ci(X,X.length().max(1e-6),$,x),Z=y,J=ir(1).sub(da(.5,Z)).add(da(1.5,Z)),ee=da(.5,Z),te=ir(1).sub(ir(1).sub(j.mul(J)).mul(ir(1).sub(Q.mul(ee)))).mul(g);return H.assign(qt(H,ae(1),te)),ne(H,1)}),M=new bt;return M.name="SplineHBAO.hbao",M.colorNode=V(),M.depthTest=!1,M.depthWrite=!1,M.blending=Us,M.needsUpdate=!0,M}_buildResolveMaterial(){let e=Ea(this._aoBuffer.texture),t=Ea(this._gBuffer.depthTexture),a=this._resolution,r=this._fullResolution,s=re(()=>{let s=U().toVar(),i=a,n=r,l=Y(ir(1).div(i.x),ir(1).div(i.y)).toVar(),o=s.sub(l.mul(.5)).toVar(),u=o.add(Y(l.x,0)).toVar(),d=o.add(Y(0,l.y)).toVar(),h=o.add(l).toVar(),m=t.sample(s).toVar(),c=n.div(i).toVar(),p=e=>t.sample(vi(e,c,n)),g=R(o.mul(i)).toVar(),f=m.sub(p(g)).abs().toVar(),_=m.sub(p(g.add(Y(1,0)))).abs().toVar(),y=m.sub(p(g.add(Y(0,1)))).abs().toVar(),x=m.sub(p(g.add(Y(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 bt;return i.name="SplineHBAO.resolve",i.colorNode=s(),i.depthTest=!1,i.depthWrite=!1,i.blending=Us,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 ys(n,l,{type:ts,depthTexture:new ns(n,l),minFilter:Qs,magFilter:Qs}));if(this._gBuffer=c.target,m=m||c.changed,o){let e=this._ensureTarget(this._aoBuffer,d,h,()=>new ys(d,h,{minFilter:Qs,magFilter:Qs,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(Ti),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,bi.material=this._hbaoMaterial,bi.name="SplineHBAO.hbao",y.setRenderTarget(o?this._aoBuffer:i),bi.render(e),o&&(bi.material=this._resolveMaterial,bi.name="SplineHBAO.resolve",y.setRenderTarget(i),bi.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}},Si={texture:null,version:0,rotation:new ws,quality:"full"},Vi=new Set;function Mi(e){let t=Si.texture,a=e.lights&&"physical"===e.category&&null!==t&&("full"===Si.quality||!1!==e.envReflectiveInLow?.()),r=e.envNode instanceof zi;a?(!r||e.envNode.sourceTexture!==t)&&(e.envNode=new zi(t),e.needsUpdate=!0):r&&(e.envNode=null,e.needsUpdate=!0)}var Ci=new WeakMap;function Ri(e,t){let a=null;return{getUV:()=>{if(null===a){let r=be.negate().reflect(t);r=Ie(e).mix(r,t),r=r.normalize(),a=r.transformDirection(Nt)}return a},getTextureLevel:()=>e}}var zi=class extends ha{constructor(e){super(null),this.sourceTexture=e}static get type(){return"SplineEnvironmentNode"}setup(e){let t=function(e){let t=Ci.get(e);return void 0===t&&(t=te(e),Ci.set(e,t)),t}(this.sourceTexture),a=e.context,r=t.context(Ri(lt,Wa)).mul(Ct);a.radiance.addAssign(r);let s=t.context({getUV:()=>$a,getTextureLevel:()=>ir(1)}).mul(Math.PI).mul(Ct);a.iblIrradiance.addAssign(s);let i=a.lightingModel?.clearcoatRadiance;if(i){let e=t.context(Ri(Qt,jt)).mul(Ct);i.addAssign(e)}return null}},ki=class extends ai{},Ai=class extends C{static get type(){return"SplineSkyHemisphereLightNode"}setup(e){return e.material?.envNode instanceof zi?null:super.setup(e)}},Pi=e=>e,Ei=e=>e,Ni=e=>e,Bi=e=>e,Li=.25,Ii=256/(2*Math.PI),Fi=(e,t,a,r,s)=>{let i=ae(0).toVar();return le(r.lessThan(.5),()=>{i.assign(e.sample(t).level(s).rgb)}).Else(()=>{let r=ae(0).toVar(),n=ir(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=Ni(Bi(e.sample(Y(Pi(t.x).add(a.mul(u)),Pi(t.y).add(a.mul(d)))).level(s)).rgb);r.addAssign(m.mul(h)),n.addAssign(ir(h))}i.assign(r.div(n))}),i},Di=(e,t,a,r)=>{let s=ne(t.mul(2).sub(1),ir(1).sub(a).mul(2).sub(1),r,1),i=e.mul(s).toVar();return i.xyz.div(i.w)},Ui=(e,t,a,r)=>{let s=w.reflectionEnvEnabled,i=w.reflectionMissColor,n=a.greaterThan(.05),l=r??St(n,ir(.6),ir(1)),o=We(t.z,t.x).div(2*Math.PI).add(.5),u=Ge(Ft(t.y,ir(-1),ir(1))).div(Math.PI).add(.5),d=Dt(mt(a.mul(l).mul(Li*Ii).add(1)),ir(8)),h=e.sample(Y(o,u)).level(d).rgb;return St(s.greaterThan(.5),h,i)},Oi=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=St(y,ae(0,0,-1),Ya(a.originView)).toVar(),v=a.normalV.toVar(),b=Ye(x,v).toVar(),T=Ft(i.mul(.1),ir(0),ir(1)).toVar(),S=w.resolution,V=T.greaterThan(.05),M=e.singleRay?ir(1):St(V,ir(.6),ir(1)),C=(e,t,s,i)=>{let l=Ya(Xa(e,r.worldMatrix)).toVar(),h=ir(1).sub($t(ir(.85),ir(.99),e.z)).toVar(),x=a.originView.toVar(),b=x.z.negate().max(r.near).toVar(),w=ir(b.mul(10)).toVar();le(e.z.greaterThan(1e-5),()=>{let t=r.near.negate().sub(x.z).div(e.z);w.assign(Dt(w,t.mul(.95).max(1e-4)))});let V,C=x.add(e.mul(w)).toVar(),R=ae(a.screenUv,a.fragWindowZ).toVar(),z=(e=>{let t=r.projectionMatrix.mul(ne(e,1)).toVar(),a=t.xyz.div(t.w);return ae(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5),a.z)})(C).toVar(),k=T.mul(S.y).mul(.075).toVar();if(i){let e=k.mul(g.y.div(S.y)).toVar(),t=Dt(ir(.8),ir(12).div(e.max(.001))).toVar();i.assign(e.mul(t)),V=ir(1).sub(t.mul(t)).max(0).sqrt().toVar()}let A=z.sub(R).toVar(),P=At(A.xy.length(),ir(1e-5)).toVar(),E=ir(0).toVar(),N=ae(0).toVar(),B=()=>{let e=f.sub(1).toVar(),a=Re(1).toVar(),r=Re(0).toVar(),s=(e,t)=>Dt(e,t),i=A,l=i.div(i.z).toVar(),o=ae(R).toVar(),u=Y(St(i.x.greaterThanEqual(0),ir(1),ir(-1)),St(i.y.greaterThanEqual(0),ir(1),ir(-1))).toVar(),d=u.mul(1e-5).toVar();u.assign(Ft(u,Y(0),Y(1)));let h=e=>Y(Oa(m,e)),c=(e,t)=>e.mul(t).floor(),p=(e,t,a)=>{let r=Y(1).div(a),s=t.div(a).add(r.mul(u)).sub(e.xy).div(i.xy).toVar(),n=e.add(i.mul(Dt(s.x,s.y))).toVar();return n.xy.addAssign(St(s.x.lessThan(s.y),Y(d.x,0),Y(0,d.y))),n},y=h(a),x=c(o.xy,y);o.assign(p(o,x,y)),he(256,()=>{le(a.lessThan(Re(0)).or(r.greaterThanEqual(t)),()=>{X()});let u=h(a).toVar(),d=c(o.xy,u).toVar(),m=_($e(Re(d.x),Re(d.y)),a).toVar(),g=ae(o).toVar();le(i.z.greaterThan(0),()=>{let t=m.sub(o.z).toVar();le(t.greaterThan(0),()=>{g.assign(o.add(l.mul(t)))});let r=c(g.xy,u).toVar();le(((e,t)=>Re(e.x).notEqual(Re(t.x)).or(Re(e.y).notEqual(Re(t.y))))(d,r),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Re(2))))}).Else(()=>{le(a.equal(Re(1)).and(t.abs().greaterThan(n)),()=>{g.assign(p(o,d,u)),a.assign(Re(2))})})}).Else(()=>{le(o.z.lessThan(m),()=>{g.assign(p(o,d,u)),a.assign(s(e,a.add(Re(2))))})}),o.assign(g),a.subAssign(Re(1)),r.addAssign(Re(1))});let v=o.x.greaterThan(0).and(o.x.lessThan(1)).and(o.y.greaterThan(0)).and(o.y.lessThan(1)).and(o.z.greaterThan(0)).and(o.z.lessThan(1));le(a.lessThan(Re(0)).and(r.lessThan(t)).and(v),()=>{E.assign(1),N.assign(o);let e=o.xy.sub(R.xy).length().div(P).clamp(0,1),t=e.sub(ir(2).div(g.y).div(P)).max(0),a=ae(R.add(A.mul(t))).toVar(),r=ae(R.add(A.mul(e))).toVar(),s=ae(r).toVar();for(let e=0;e<4;e++){s.assign(qt(a,r,.5));let e=Pi(_($e(Ei(s.xy).mul(g)),Re(0)));le(s.z.sub(e).greaterThan(0),()=>{r.assign(s)}).Else(()=>{a.assign(s)})}N.assign(s)})},L=()=>{let e=At(o,ir(1e-4)),a=ir(e).toVar(),r=ae(R).toVar(),s=ae(R).toVar(),i=ir(-1).toVar();he(256,({i:l})=>{le(l.greaterThanEqual(t),()=>{X()});let o=ir(l).mul(a).div(P).toVar();le(o.greaterThan(1),()=>{X()}),s.assign(A.mul(o).add(R));let u=s.x.lessThan(0).or(s.x.greaterThan(1)).or(s.y.lessThan(0)).or(s.y.greaterThan(1)).or(s.z.lessThan(0)).or(s.z.greaterThan(1));le(u,()=>{X()});let d=_($e(s.xy.mul(g)),Re(0)).toVar(),h=s.z.sub(d).toVar();le(i.lessThanEqual(0).and(h.greaterThan(0)),()=>{let e=ae(r).toVar(),t=ae(s).toVar(),a=ae(s).toVar(),i=ir(h).toVar();for(let r=0;r<4;r++){a.assign(qt(e,t,.5));let r=Pi(_($e(Ei(a.xy).mul(g)),Re(0)));i.assign(a.z.sub(r)),le(i.greaterThan(0),()=>{t.assign(a)}).Else(()=>{e.assign(a)})}le(i.abs().lessThan(n),()=>{E.assign(1),N.assign(a),X()})}),i.assign(h),r.assign(s),a.addAssign(e.div(2))})};le(h.greaterThan(0).and(p.not()),()=>{"number"==typeof u?1===u?B():L():le(u.greaterThan(.5),()=>{B()}).Else(()=>{L()})});let I=Ui(c,l,T,V).toVar(),F=ae(I).toVar();return le(E.greaterThan(.5),()=>{let t=N.xy.sub(R.xy).length().div(P).clamp(0,1).toVar(),a=x.z.negate().max(1e-4).toVar(),n=C.z.negate().max(1e-4).toVar(),l=qt(ir(1).div(a),ir(1).div(n),t).toVar(),o=qt(x.div(a),C.div(n),t).div(l),u=qt(x,C,t),m=St(y,u,o).toVar(),c=m.sub(x).length().toVar(),p=r.projectionMatrix.element(1).y.mul(S.y).mul(.5),w=St(y,ir(1),m.z.abs().max(1e-4)),V=T.mul(M).mul(Li).mul(c).mul(p).div(w),z=At(V,k).toVar(),A=z.mul(g.y.div(S.y)).toVar(),E=A.toVar(),B=z.toVar();if(i){let e=Dt(ir(.8),ir(12).div(A.max(.001))).toVar();i.assign(A.mul(e)),E.assign(A.mul(ir(1).sub(e.mul(e)).max(0).sqrt())),B.assign(E.mul(S.y.div(g.y)))}let L=ir(f.sub(1)),D=Dt(mt(E.add(1)),L),U=s?Fi(d,N.xy,B.mul(.75).div(S.y),E.mul(.75),D.sub(1).max(0).floor()).toVar():d.sample(N.xy).level(D).rgb.toVar(),O=e=>$t(ir(0),ir(.07),e).mul($t(ir(0),ir(.07),ir(1).sub(e))),G=O(N.x).mul(O(N.y)),q=N.xy.mul(g),W=_($e(q),Re(0)),H=Di(r.projectionMatrixInverse,N.x,N.y,W).toVar(),j=Da(H.sub(x),v),K=$t(b.mul(-.05),b.mul(-.005),j),$=ir(1).div(g.x),X=ir(1).div(g.y),Q=_($e(q.sub(Y(1,0))),Re(0)),Z=_($e(q.add(Y(1,0))),Re(0)),J=_($e(q.sub(Y(0,1))),Re(0)),ee=_($e(q.add(Y(0,1))),Re(0)),te=Di(r.projectionMatrixInverse,N.x.sub($),N.y,Q),ae=Di(r.projectionMatrixInverse,N.x.add($),N.y,Z),re=Di(r.projectionMatrixInverse,N.x,N.y.sub(X),J),se=Di(r.projectionMatrixInverse,N.x,N.y.add(X),ee),ie=Ya(ma(ae.sub(te),se.sub(re))).toVar(),ne=St(ie.z.lessThan(0),ie.negate(),ie),le=$t(ir(.02),ir(.12),Da(ne,e).negate()),oe=h.mul(G).mul(K).mul(le);F.assign(qt(I,U,oe))}),F};if(e.singleRay)return C(b,l,!0,e.singleRay.footprintOut).toVar();let R=e.noisePixel,z=B(ir(52.9829189).mul(B(R.x.mul(.06711056).add(R.y.mul(.00583715))))).mul(2*Math.PI).toVar(),k=St(b.y.abs().greaterThan(.99),ae(1,0,0),ae(0,1,0)),A=Ya(ma(k,b)).toVar(),P=ma(b,A).toVar(),E=(e,t=4)=>{let a=T.mul(Li*Math.sqrt((e+.5)/t)),r=z.add(2.399963229728653*e);return Ya(b.mul(oa(a)).add(A.mul(oa(r)).add(P.mul(Wt(r))).mul(Wt(a)))).toVar()},N=V.and(p.not()),L=St(N,E(0),b).toVar(),I=ae(0).toVar();I.addAssign(C(L,l,!0));let F=ir(1).toVar();return le(N,()=>{I.addAssign(C(E(2),l,!1)),F.assign(2),le(T.greaterThan(.35),()=>{I.addAssign(C(E(1),l,!1)),I.addAssign(C(E(3),l,!1)),F.assign(4)})}),I.div(F).toVar()},Gi=new os,qi=class extends as{constructor(e){super(),this.postprocessingState=$r.defaultData,this.sceneTransitionPass={uniforms:{mixRatio:lr(0),uDPR:{value:1},uResolution:{value:new os}}},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 Hs,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 Hs(e,128,128);t.wrapS=Ls,t.wrapT=Ls,t.minFilter=Ws,t.magFilter=Ws,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=qi.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=qi._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(Gi);let e=Math.max(1,Math.round(Gi.x)),t=Math.max(1,Math.round(Gi.y));null===this._rt?this._rt=new ys(e,t,{depthBuffer:!0}):(this._rt.width!==e||this._rt.height!==t)&&(this._rt.dispose(),this._rt=new ys(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(Gi),e.beginJitter(t,Gi.x,Gi.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 _s?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 _s?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()}},Wi=qi;Wi.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 Hi=(()=>{try{return"1"===new URLSearchParams(window.location.search).get("dbgdestroys")}catch{return!1}})(),ji=[],Ki=6,$i=()=>-1,Xi=!1,Qi=null;function Zi(e,t,a){ji.push({t:Math.round(performance.now()),frame:$i(),kind:e,label:t||"(unlabeled)",size:a,stack:((new Error).stack??"").split("\n").slice(2,9).join("\n")}),ji.length>32&&ji.shift()}var Yi=(e,t)=>({start:Re(0),end:Re(t),type:"int",condition:"<",name:e}),Ji=Ft;function en(e,t){let a=new ys(e,t,{depthBuffer:!1,type:es,format:bs});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ws,a.texture.magFilter=Ws,a}var tn=null;function an(){return null===tn&&((tn=en(64,8)).texture.name="SplinePCSSPyramidAtlas"),tn.texture}function rn(e,t,a,r,s,i){let n=new bt,l=Ea(t),o=re(()=>{let e=ft,t=0!==i?e.x.sub(i):e.x,n=Re(t).mul(a).toVar(),o=Re(e.y).mul(a).toVar(),u=ir(1e9).toVar(),d=ir(-1e9).toVar();return he(Yi("ly",a),Yi("lx",a),e=>{let{lx:t,ly:a}=e,i=Ji(n.add(t),Re(0),Re(r)),h=Ji(o.add(a),Re(0),Re(r)),m=l.load($e(i,h));u.assign(Dt(u,m.x)),d.assign(At(d,s?m.y:m.x))}),ne(u,d,0,1)})();return n.fragmentNode=o,n.name=e,n.lights=!1,n.blending=Us,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,n}var sn=new Set;function nn(e){let t=e;return t.__spePcssPyramid||(t.__spePcssPyramid={fresh:!1,slot:-1,passKey:"",mid:null,small:null,toMid:null,toSmall:null},sn.add(new WeakRef(t.__spePcssPyramid))),t.__spePcssPyramid}var ln=new Array(8).fill(null);function on(e){return!0===e.__spePcssPyramid?.fresh}function un(e){return e.__spePcssPyramid?.slot??-1}var dn=!1;var hn=new ds,mn=e=>e,cn=e=>e,pn=e=>e,gn=!0,fn=!0,_n=!0,yn=!0;try{let e=new URLSearchParams(window.location.search),t=e.get("dbgpcss");"classic"===t||"0"===t?(gn=!1,fn=!1,_n=!1,yn=!1):(gn="0"!==e.get("dbgpcsssplit"),fn="0"!==e.get("dbgpcsshw"),_n="0"!==e.get("dbgpcsshiz"),yn="0"!==e.get("dbgshadowmask"))}catch{}var xn=!1,vn=()=>fn&&xn,bn=()=>_n&&xn,Tn=()=>yn&&xn,wn=()=>bn(),Sn=()=>Tn(),Vn=[[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]],Mn=16;function Cn(e){let t=e;return t.__spePcssKnobs||(t.__spePcssKnobs={mapSize:lr(2048),radius:lr(1),penumbraSize:lr(.5),depthEps:lr(1e-4),penumbraFrameScale:lr(1),penumbraFrameOffset:lr(0),pyramidEnabled:lr(0),pyramidSlot:lr(0),maskChannel:lr(new _s(0,0,0,0)),planeNormalMat:lr((new hs).set(0,0,0,0,0,0,0,0,0))}),t.__spePcssKnobs}function Rn(e,t){Cn(e).maskChannel.value.set(0===t?1:0,1===t?1:0,2===t?1:0,3===t?1:0)}function zn(e,t,a){let r=e,s=Cn(e);s.mapSize.value=r.mapSize?.x??2048,s.radius.value=r.radius??1,s.penumbraSize.value=t??r.penumbraSize??.5,r.camera?.isOrthographicCamera&&r.matrix?s.planeNormalMat.value.getNormalMatrix(r.matrix):s.planeNormalMat.value.set(0,0,0,0,0,0,0,0,0);let i="number"==typeof r.camera?.far&&"number"==typeof r.camera?.near?r.camera.far-r.camera.near:0;s.depthEps.value=i>.001?1.25/i:1e-4;let n=e.__speRangeEnvelope,l=n?n.far-n.near:0;n&&l>.001&&i>.001&&r.camera?(s.penumbraFrameScale.value=i/l,s.penumbraFrameOffset.value=(r.camera.near-n.near)/l):(s.penumbraFrameScale.value=1,s.penumbraFrameOffset.value=0);let o=0;if(a&&a.fresh&&a.slot>=0&&bn()){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 kn(e,t){let a=e.planeNormalMat.mul(t).toVar(),r=a.z,s=Ut(r).add(da(Ae(r),ir(0))).mul(At(Ae(r),ir(1e-4)));return Y(a.x.negate().div(s),a.y.div(s)).toVar()}var An=(e,t)=>Ft(Da(e,t),ir(-.05),ir(.05));function Pn(e,t,a,r,s,i,n){let l=vn()?Math.max(4,Mn>>1):Mn,o=gn?Math.max(4,Mn>>1):Mn,u=vn(),d=Cn(t),h=d.mapSize,m=Y(h,h),c=d.radius,p=d.penumbraSize,g=Ea(e),f=e=>g.load($e(Ft(e,Y(0),Y(1)).mul(m))).x,_=ir(1).div(m.x).toVar(),y=ir(80).div(_.mul(1024)).toVar(),x=d.depthEps,v=kn(d,n),b=()=>{let t=ir(0).toVar(),n=ir(0).toVar();for(let e=0;e<o;e++){let i=cn(Q(Re(e),Re(o),s)).mul(_).mul(y),l=f(cn(a.add(i))).toVar();le(l.lessThan(r.add(An(v,i)).add(x)),()=>{t.addAssign(l),n.addAssign(1)})}let h=ir(0).toVar();le(n.greaterThan(0),()=>{let e=t.div(n).toVar(),a=d.penumbraFrameScale,s=d.penumbraFrameOffset,i=r.sub(e).mul(a).div(e.mul(a).add(s)).toVar();h.assign(Ft(i.mul(i).mul(200).mul(p),ir(0),ir(1)))});let m=ir(0).toVar();for(let t=0;t<l;t++){let i=cn(Q(Re(t),Re(l),s)).mul(_),n=cn(i.mul(c.mul(2)).add(i.mul(h.mul(y)))),o=mn(r.add(An(v,n)));u?m.addAssign(mn(Ea(e,cn(a.add(n))).compare(o))):m.addAssign(da(o,f(cn(a.add(n)))))}i.assign(m.div(l))};if(bn()){let e=Ea(an()),t=d.pyramidEnabled,s=d.pyramidSlot,n=ir(8),l=ir(0).toVar();le(t.greaterThan(.5),()=>{let t=Ft(a,Y(0),Y(1)),i=t.x.mul(n).toVar(),o=t.y.mul(n).toVar(),u=s.mul(n),d=ir(1e9).toVar(),h=ir(-1e9).toVar();for(let t=-1;t<=1;t++)for(let a=-1;a<=1;a++){let r=Ft(i.add(ir(a)),ir(0),n.sub(1)),s=Ft(o.add(ir(t)),ir(0),n.sub(1)),l=cn(Y(r.add(u),s)),m=e.load($e(l));d.assign(Dt(d,mn(m.x))),h.assign(At(h,mn(m.y)))}let m=_.mul(c.mul(2).add(y)),p=Dt(et(v).mul(m),ir(.05)).toVar();le(d.greaterThanEqual(r.add(x).add(p)),()=>{l.assign(1)}).ElseIf(h.lessThan(r.sub(p)),()=>{l.assign(2)})}),le(l.equal(1),()=>{i.assign(1)}).ElseIf(l.equal(2),()=>{i.assign(0)}).Else(b)}else b()}var En=re(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=Cn(r),i=a.xy.toVar(),n=a.z.toVar(),l=$a.toVar(),o=w.pcssHalton,u=j(ft.xy.add(o)).mul(6.28318530718).toVar(),d=ir(1).toVar();if(Tn()){let e=s.maskChannel,a=w.shadowMaskEnabled,o=w.shadowMaskGBuffer,h=w.shadowMaskTexture,m=ir(0).toVar(),c=ir(1).toVar();le(a.greaterThan(.5).and(Da(e,ne(1,1,1,1)).greaterThan(.5)),()=>{let t=vt,a=w.shadowMaskResolution,r=w.shadowMaskFullResolution,s=_e.z,i=t.mul(a).sub(Y(.5,.5)).toVar(),n=R(i).toVar(),l=i.sub(n).toVar(),u=At(Ae(s).mul(.02),ir(.05)),d=ir(0).toVar(),p=ir(0).toVar();for(let t=0;t<=1;t++)for(let i=0;i<=1;i++){let m=cn(Ft(n.add(Y(i,t)),Y(0,0),a.sub(Y(1,1)))),c=cn(m.add(Y(.5,.5)).div(a)),g=cn(R(c.mul(r)).add(Y(.5,.5)).div(r)),f=mn(o.sample(g).w),_=mn(Da(h.sample(c),e)),y=mn(0===i?ir(1).sub(l.x):mn(l.x)),x=mn(0===t?ir(1).sub(l.y):mn(l.y)),v=mn(da(Ae(f.sub(s)),u)),b=mn(y.mul(x).mul(v)).toVar();d.addAssign(b),p.addAssign(_.mul(b))}le(d.greaterThan(.001),()=>{m.assign(1),c.assign(p.div(d))})}),le(m.greaterThan(.5),()=>{d.assign(c)}).Else(()=>{Pn(t,r,i,n,u,d,l)})}else Pn(t,r,i,n,u,d,l);return d}),Nn=re(e=>{let{depthTexture:t,shadowCoord:a,shadow:r}=e,s=Cn(r),i=a.xy.toVar(),n=a.z.toVar(),l=kn(s,$a.toVar()),o=s.mapSize,u=s.radius.mul(ir(1).div(o)).toVar(),d=j(ft.xy).mul(6.28318530718).toVar(),h=ir(0).toVar();for(let e=0;e<5;e++){let a=cn(Q(Re(e),Re(5),d)).mul(u).toVar();h.addAssign(mn(Ea(t,cn(i.add(a))).compare(n.add(An(l,a)))))}return h.mul(.2)}),Bn=re(e=>{let{depthTexture:t,bd3D:a,dp:r,shadow:s}=e,i=Mn,n=Cn(s),l=n.mapSize,o=n.radius,u=ir(1).div(l).toVar(),d=w.pcssHalton,h=j(ft.xy.add(d)).mul(6.28318530718).toVar(),m=o.add(5).toVar(),c=ir(0).toVar();for(let e=0;e<i;e++){let s=cn(Q(Re(e),Re(i),h)).mul(u).toVar(),n=pn(ae(s.x,s.y,mn(s.x).negate()).mul(m)),l=pn(a.add(n));c.addAssign(mn(fa(t,l).compare(r)))}return c.div(i)});function Ln(e,t){let a=t;return a.isPointLight?(T.pcssHookServes++,qn):a.isSpotLight||a.isDirectionalLight?(T.pcssHookServes++,Gn):null}var In=lr(1);function Fn(e){In.value=e?1:0}var Dn=(e,t)=>e(t),Un=["depthTexture","shadowCoord","shadow","depthLayer","bd3D","dp"];function On(e,t){return a=>{let r=function(e){let t=e,a={};if(null==t)return a;for(let e of Un){let r=t[e];void 0!==r&&(a[e]=r)}return a}(a),s=Dn(e,r),i=Dn(t,r);return re(()=>{let e=ir(1).toVar();return le(In.greaterThan(.5),()=>{e.assign(s)}).Else(()=>{e.assign(i)}),e})()}}var Gn=On(En,Nn),qn=On(Bn,we),Wn=new Ga,Hn=new Ss,jn=new os,Kn=class{constructor(){this._gBuffer=null,this._maskTarget=null,this._resolveMaterial=null,this._resolveKey="",this._cameraWorld=lr(new Ts),this._projInv=lr(new Ts),this._lightRows=[];let e=new bt;e.name="SplineShadowMask.gbuffer",e.fragmentNode=ne(Wa,_e.z),e.lights=!1,e.blending=Us,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 bt;t.name="SplineShadowMask.resolve";let a=Ea(this._gBuffer.depthTexture),r=Ea(this._gBuffer.texture),s=this._cameraWorld,i=this._projInv,n=this._gBuffer.width,l=this._gBuffer.height;this._lightRows=e.map(()=>({matrix:lr(new Ts),bias:lr(0),normalBias:lr(0)}));let o=this._lightRows,u=re(()=>{let t=U(),u=R(t.mul(Y(n,l))).add(Y(.5,.5)).div(Y(n,l)).toVar(),d=a.sample(u),h=ee(u,d,i).toVar(),m=r.sample(u).toVar(),c=s,p=c.mul(ne(h,1)).xyz.toVar(),g=Ya(c.mul(ne(m.xyz,0)).xyz).toVar(),f=w.pcssHalton,_=j(ft.xy.add(f)).mul(6.28318530718).toVar(),y=[ir(1).toVar(),ir(1).toVar(),ir(1).toVar(),ir(1).toVar()];return e.forEach((e,t)=>{let a=o[t],r=p.add(g.mul(a.normalBias)),s=a.matrix.mul(ne(r,1)).toVar(),i=s.xyz.div(s.w),n=ae(i.x,ir(1).sub(i.y),i.z).toVar(),l=n.z.add(a.bias).toVar(),u=n.x.greaterThanEqual(0).and(n.x.lessThanEqual(1)).and(n.y.greaterThanEqual(0)).and(n.y.lessThanEqual(1)).and(l.lessThanEqual(1));le(u,()=>{Pn(e.shadow.map.depthTexture,e.shadow,n.xy,l,_,y[t],g)})}),ne(y[0],y[1],y[2],y[3])})();return t.fragmentNode=u,t.lights=!1,t.blending=Us,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,t}render(e,t,a,r,s){let i=s??e.getDrawingBufferSize(jn),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 ys(n,l,{type:ts,depthTexture:new ns(n,l),minFilter:Qs,magFilter:Qs});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 ys(o,u,{depthBuffer:!1,minFilter:Qs,magFilter:Qs});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(Hn),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 Wn.material=this._resolveMaterial,Wn.name="SplineShadowMask.resolve",e.setRenderTarget(this._maskTarget),Wn.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)=>{Rn(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=""}},$n=e=>e,Xn=e=>e,Qn=new Ga,Zn=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 Yn(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 Jn=Array.from({length:16},(e,t)=>[Yn(t+1,2),Yn(t+1,3)]),el="h16";try{let e=new URLSearchParams(window.location.search).get("dbgjitseq");("r2"===e||"h64"===e||"white"===e||"half"===e)&&(el=e)}catch{}function tl(e){return ae(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 al(e,t=!0){let a=ae(e.x.add(e.y).sub(e.z),e.x.add(e.z),e.x.sub(e.y).sub(e.z));return t?Ft(a,ae(0),ae(1)):At(a,ae(0))}var rl=class extends _t{constructor(e,t,a,r,s=!1){super("vec4"),this._resolution=lr(new os(1,1)),this._historyValid=lr(0),this._jitterUV=lr(new os(0,0)),this._resolveMaterials=null,this._rebuildResolveMaterials=null,this.beautyNode=e,this.depthNode=t,this.velocityNode=a,this._hdr=s,this._history=r??sl(),this._ownsHistory=void 0===r,this._outputTexNode=Ea(this._history.rtA.texture)}static get type(){return"SplineTAANode"}get outputTextureNode(){return this._outputTexNode}renderResolve(e){de.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&&(Qn.material=n,Qn.name="SplineTAA.resolve",Qn.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 ne(tl(t.rgb),t.a)},v=e=>{let c=re(()=>{let c=U().toVar();if(h)return ne(y.x.mul(400).add(.5),y.y.mul(400).add(.5),ir(.5),ir(1));let v=c,b=Y(ir(1).div(f.x),ir(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(Y(b.x.mul(e),b.y.mul(t))).toVar()),S=T,V=ir(t?-1e3:1e3).toVar(),M=Y(T[4]).toVar();for(let e=0;e<9;e++){let a=$n(g.load($e(T[e].mul(Xn(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($e(M.mul(f))).xy.mul(Y(.5,-.5)).toVar();s&&C.assign(Y(0,0));let z=c.sub(C).toVar(),k=a?Y(z.x,ir(1).sub(z.y)).toVar():z,A=x(v).toVar();if(r)return ne(C.x.mul(20).add(.5),C.y.mul(20).add(.5),_,ir(1));if(o){let e=new Hs(new Uint8Array([255,0,0,255,255,0,0,255,255,0,0,255,255,0,0,255]),2,2);return e.needsUpdate=!0,Ea(e).sample(c)}if(l){let t=a?Y(c.x,ir(1).sub(c.y)):c;return e.sample(t)}if(n){let t=a?Y(c.x,ir(1).sub(c.y)):c,r=e.sample(k),s=e.sample(t),i=A.x,n=e=>tl(e.rgb).x;return ne(n(r).sub(i).abs().mul(8),n(s).sub(i).abs().mul(8),ir(0),ir(1))}let P=k.mul(f).toVar(),E=R(P.sub(.5)).add(.5).toVar(),N=P.sub(E).toVar(),B=N.mul(N.mul(N.mul(-.5).add(1)).add(-.5)).toVar(),L=N.mul(N).mul(N.mul(1.5).add(-2.5)).add(1).toVar(),I=N.mul(N.mul(N.mul(-1.5).add(2)).add(.5)).toVar(),F=N.mul(N).mul(N.mul(.5).add(-.5)).toVar(),D=L.add(I).toVar(),O=I.div(D).toVar(),G=E.sub(1).div(f).toVar(),q=E.add(2).div(f).toVar(),W=E.add(O).div(f).toVar(),H=ne(0).toVar();H.addAssign(e.sample(Y(W.x,G.y)).mul(D.x.mul(B.y))),H.addAssign(e.sample(Y(G.x,W.y)).mul(B.x.mul(D.y))),H.addAssign(e.sample(Y(W.x,W.y)).mul(D.x.mul(D.y))),H.addAssign(e.sample(Y(q.x,W.y)).mul(F.x.mul(D.y))),H.addAssign(e.sample(Y(W.x,q.y)).mul(D.x.mul(F.y)));let j=ne(tl(H.rgb),H.a).toVar();if(m)return ne(al(j.rgb).mul(ae(1,.55,.55)),H.a);let K=x(S[0]).toVar(),$=x(S[1]).toVar(),X=x(S[2]).toVar(),Q=x(S[3]).toVar(),Z=x(S[4]).toVar(),J=x(S[5]).toVar(),ee=x(S[6]).toVar(),te=x(S[7]).toVar(),re=x(S[8]).toVar(),se=ne(Dt(K,Dt($,Dt(X,Dt(Q,Dt(Z,Dt(J,Dt(ee,Dt(te,re))))))))).toVar(),ie=ne(At(K,At($,At(X,At(Q,At(Z,At(J,At(ee,At(te,re))))))))).toVar(),le=ne(Dt($,Dt(Q,Dt(Z,Dt(J,te))))).toVar(),oe=ne(At($,At(Q,At(Z,At(J,te))))).toVar();se.assign(se.add(le).mul(.5)),ie.assign(ie.add(oe).mul(.5));let ue=ie.r.sub(se.r).mul(.25).mul(.5).toVar(),de=A.gb.toVar();u||(se.y.assign(de.x.sub(ue)),se.z.assign(de.y.sub(ue)),ie.y.assign(de.x.add(ue)),ie.z.assign(de.y.add(ue)));let he=ne(i?j:Ft(j,se,ie)).toVar(),me=d||i?ir(.9):ir(.9).mul(_),ce=ne(qt(A,he,me)).toVar(),pe=w.tapAngle,ge=je(c.mul(f).add(Y(pe.mul(127.1),pe.mul(311.7)))).sub(.5).mul(1/255);return ne(al(ce.rgb,!this._hdr).add(ae(ge)),ce.a)}),v=new bt;return v.name="SplineTAA.resolve",v.colorNode=c(),v.depthTest=!1,v.depthWrite=!1,v.blending=Us,v.needsUpdate=!0,v};return this._rebuildResolveMaterials=()=>{this._resolveMaterials&&(this._resolveMaterials[0].dispose(),this._resolveMaterials[1].dispose()),this._resolveMaterials=[v(Ea(this._history.rtB.texture)),v(Ea(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),de.setProjectionMatrix(null)}};function sl(){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 ys(e,t,{minFilter:Qs,magFilter:Qs,depthBuffer:!1});return a()?s.texture.type=ts: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 Ts,jitterOffsetUV:new os(0,0),beginJitter(e,t,a){if(l)return;let r,s;if(l=!0,(null===n||n.cam!==e)&&(n?.clearViewOffset(),n=new Zn(e)),this.unjitteredProjection.copy(e.projectionMatrix),w.unjitteredProjection.value.copy(e.projectionMatrix),"r2"===el){let e=++this.jitterIndex;r=(.5+.7548776662466927*e)%1,s=(.5+.5698402909980532*e)%1}else if("white"===el)this.jitterIndex++,r=Math.random(),s=Math.random();else if("h64"===el)r=Yn(this.jitterIndex%64+1,2),s=Yn(this.jitterIndex%64+1,3),this.jitterIndex=(this.jitterIndex+1)%64;else if("half"===el){let[e,t]=Jn[this.jitterIndex];r=.5+.5*(e-.5),s=.5+.5*(t-.5),this.jitterIndex=(this.jitterIndex+1)%Jn.length}else[r,s]=Jn[this.jitterIndex],this.jitterIndex=(this.jitterIndex+1)%Jn.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 il,nl=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}},ll=new Ga,ol=new os,ul=class extends _t{static get type(){return"SMAANode"}constructor(e){super("vec4"),this.textureNode=e,this.updateBeforeType=ge.FRAME,this._renderTargetEdges=new ys(1,1,{depthBuffer:!1,type:ts}),this._renderTargetEdges.texture.name="SMAANode.edges",this._renderTargetWeights=new ys(1,1,{depthBuffer:!1,type:ts}),this._renderTargetWeights.texture.name="SMAANode.weights",this._renderTargetBlend=new ys(1,1,{depthBuffer:!1,type:ts}),this._renderTargetBlend.texture.name="SMAANode.blend";let t=this,a=new Image;a.crossOrigin="anonymous",a.src=Jr("smaa-node-area.png"),a.onload=function(){t._areaTexture.needsUpdate=!0},this._areaTexture=new ps,this._areaTexture.name="SMAANode.area",this._areaTexture.image=a,this._areaTexture.minFilter=Qs,this._areaTexture.generateMipmaps=!1,this._areaTexture.flipY=!1;let r=new Image;r.crossOrigin="anonymous",r.src=Jr("smaa-node-search.png"),r.onload=function(){t._searchTexture.needsUpdate=!0},this._searchTexture=new ps,this._searchTexture.name="SMAANode.search",this._searchTexture.image=r,this._searchTexture.magFilter=Ws,this._searchTexture.minFilter=Ws,this._searchTexture.generateMipmaps=!1,this._searchTexture.flipY=!1,this._invSize=lr(new os),this._areaTextureUniform=Ea(this._areaTexture),this._searchTextureUniform=Ea(this._searchTexture),this._edgesTextureUniform=Ea(this._renderTargetEdges.texture),this._weightsTextureUniform=Ea(this._renderTargetWeights.texture),this._materialEdges=new bt,this._materialEdges.name="SMAANode.edges",this._materialWeights=new bt,this._materialWeights.name="SMAANode.weights",this._materialBlend=new bt,this._materialBlend.name="SMAANode.blend",this._textureNode=K(this,this._renderTargetBlend.texture)}getTextureNode(){return this._textureNode}setSize(e,t){this._invSize.value.set(1/e,1/t),this._renderTargetEdges.setSize(e,t),this._renderTargetWeights.setSize(e,t),this._renderTargetBlend.setSize(e,t)}updateBefore(e){let{renderer:t}=e;il=ja.resetRendererState(t,il);let a=t.getDrawingBufferSize(ol);this.setSize(a.width,a.height),t.setRenderTarget(this._renderTargetEdges),ll.material=this._materialEdges,ll.render(t),t.setRenderTarget(this._renderTargetWeights),ll.material=this._materialWeights,ll.render(t),t.setRenderTarget(this._renderTargetBlend),ll.material=this._materialBlend,ll.render(t),ja.restoreRendererState(t,il)}setup(e){let t=Y(.00625,.0017857142857142857),a=1/7,r=this.textureNode.uvNode||U(),s=re(()=>{let e=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-1,0,0,-1))),t=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(1,0,0,1))),a=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-2,0,0,-2)));return $("vec4","vOffset0").assign(e),$("vec4","vOffset1").assign(t),$("vec4","vOffset2").assign(a),ua}),i=re(()=>{let e=$("vec4","vOffset0"),t=$("vec4","vOffset1"),a=$("vec4","vOffset2"),s=Y(.1,.1),i=ne().toVar(),n=this.textureNode.sample(r).rgb.toVar(),l=this.textureNode.sample(e.xy).rgb.toVar(),o=Ae(n.sub(l));i.x=At(o.r,o.g,o.b);let u=this.textureNode.sample(e.zw).rgb.toVar();o=Ae(n.sub(u)),i.y=At(o.r,o.g,o.b);let d=da(s,i.xy).toVar();Da(d,Y(1,1)).equal(0).discard();let h=this.textureNode.sample(t.xy).rgb.toVar();o=Ae(n.sub(h)),i.z=At(o.r,o.g,o.b);let m=this.textureNode.sample(t.zw).rgb.toVar();o=Ae(n.sub(m)),i.w=At(o.r,o.g,o.b);let c=At(i.x,i.y,i.z,i.w).toVar(),p=this.textureNode.sample(a.xy).rgb.toVar();o=Ae(n.sub(p)),i.z=At(o.r,o.g,o.b);let g=this.textureNode.sample(a.zw).rgb.toVar();return o=Ae(n.sub(g)),i.w=At(o.r,o.g,o.b),c=At(c,i.z,i.w),d.xy.mulAssign(Y(da(ir(.5).mul(c),i.xy))),ne(d,0,0)}),n=re(([e,t,a,r])=>{let s=Y(t).toVar();return s.r=a.add(s.r.mul(r)),ir(255).mul(e.sample(s)).r}),l=re(([e,r,s,i,n])=>{let l=ir(16).mul(ir(4).mul(Y(s,i)).round()).add(r);return l=t.mul(l).add(ir(.5).mul(t)),l.y.addAssign(ir(a).mul(n)),e.sample(l).rg}),o=re(([e,t,a,r])=>{let s=Y(0,1).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(Y(2,0).mul(this._invSize)),le(i.x.lessThanEqual(r).or(s.g.lessThanEqual(ir(.8281)).or(s.r.notEqual(ir(0)))),()=>{X()})}),i.x.addAssign(ir(.25).mul(this._invSize.x)),i.x.addAssign(this._invSize.x),i.x.addAssign(ir(2).mul(this._invSize.x)),i.x.subAssign(this._invSize.x.mul(n(t,s,0,.5))),i.x}),u=re(([e,t,a,r])=>{let s=Y(0,1).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(Y(2,0).mul(this._invSize)),le(i.x.greaterThanEqual(r).or(s.g.lessThanEqual(ir(.8281)).or(s.r.notEqual(ir(0)))),()=>{X()})}),i.x.subAssign(ir(.25).mul(this._invSize.x)),i.x.subAssign(this._invSize.x),i.x.subAssign(ir(2).mul(this._invSize.x)),i.x.addAssign(this._invSize.x.mul(n(t,s,.5,.5))),i.x}),d=re(([e,t,a,r])=>{let s=Y(1,0).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.addAssign(Y(0,-2).mul(this._invSize)),le(i.y.lessThanEqual(r).or(s.r.lessThanEqual(ir(.8281)).or(s.g.notEqual(ir(0)))),()=>{X()})}),i.y.addAssign(ir(.25).mul(this._invSize.y)),i.y.addAssign(this._invSize.y),i.y.addAssign(ir(2).mul(this._invSize.y)),i.y.subAssign(this._invSize.y.mul(n(t,s.gr,0,.5))),i.y}),h=re(([e,t,a,r])=>{let s=Y(1,0).toVar(),i=Y(a).toVar();return he({start:Re(0),end:Re(8),type:"int",condition:"<"},()=>{s.assign(e.sample(i).rg),i.subAssign(Y(0,-2).mul(this._invSize)),le(i.y.greaterThanEqual(r).or(s.r.lessThanEqual(ir(.8281)).or(s.g.notEqual(ir(0)))),()=>{X()})}),i.y.subAssign(ir(.25).mul(this._invSize.y)),i.y.subAssign(this._invSize.y),i.y.subAssign(ir(2).mul(this._invSize.y)),i.y.addAssign(this._invSize.y.mul(n(t,s.gr,.5,.5))),i.y}),m=re(()=>{let e=r.xy.div(this._invSize),t=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-.25,-.125,1.25,-.125))).toVar(),a=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(-.125,-.25,-.125,1.25))).toVar(),s=ne(t.xz,a.yw).add(ne(-2,2,-2,2).mul(ne(this._invSize.xx,this._invSize.yy)).mul(ir(8))).toVar();return $("vec2","vPixcoord").assign(e),$("vec4","vOffset0").assign(t),$("vec4","vOffset1").assign(a),$("vec4","vOffset2").assign(s),ua}),c=re(()=>{let e=$("vec2","vPixcoord"),t=$("vec4","vOffset0"),a=$("vec4","vOffset1"),s=$("vec4","vOffset2"),i=ne(0,0,0,0).toVar(),n=ne(0,0,0,0).toVar(),m=this._edgesTextureUniform.sample(r).rg.toVar();return le(m.g.greaterThan(ir(0)),()=>{let r=Y().toVar(),d=Y().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=Y().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=na(Ae(r)),p=this._edgesTextureUniform.sample(m.add(Y(1,0).mul(this._invSize))).r.toVar();i.r=p,i.rg=l(this._areaTextureUniform,c,h,p,ir(n.y))}),le(m.r.greaterThan(ir(0)),()=>{let r=Y().toVar(),o=Y().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=Y().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=na(Ae(r)),p=this._edgesTextureUniform.sample(m.add(Y(0,1).mul(this._invSize))).g.toVar();i.ba=l(this._areaTextureUniform,c,u,p,ir(n.x))}),i}),p=re(()=>{let e=ne(r.xy,r.xy).add(ne(this._invSize.xy,this._invSize.xy).mul(ne(1,0,0,1)));return $("vec4","vOffset1").assign(e),ua}),g=re(()=>{let e=$("vec4","vOffset1"),t=ne().toVar(),a=ne().toVar();return a.xz=this._weightsTextureUniform.sample(r).xz,a.y=this._weightsTextureUniform.sample(e.zw).g,a.w=this._weightsTextureUniform.sample(e.xy).a,le(Da(a,ne(1)).lessThan(1e-5),()=>{t.assign(this.textureNode.sample(r))}).Else(()=>{let e=Y().toVar();e.x=a.a.greaterThan(a.b).select(a.a,a.b.negate()),e.y=a.g.greaterThan(a.r).select(a.g,a.r.negate()),le(Ae(e.x).greaterThan(Ae(e.y)),()=>{e.y.assign(0)}).Else(()=>{e.x.assign(0)});let s=this.textureNode.sample(r).toVar(),i=Y(r).toVar();i.addAssign(Ut(e).mul(this._invSize));let n=this.textureNode.sample(i).toVar(),l=Ae(e.x).greaterThan(Ae(e.y)).select(Ae(e.x),Ae(e.y)).toVar(),o=qt(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""}},dl=new os,hl=new Ss,ml=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 ys(e,t,{depthBuffer:!0,stencilBuffer:!1,samples:0});a.texture.name="SplineHelperOverlay.color",this._rt=a}if(null===this._texNode){this._texNode=Ea(this._rt.texture),this._smaaNode=(r=this._texNode,new ul(sa(r)));let e=new bt;e.name="SplineHelperOverlayComposite",e.fragmentNode=this._smaaNode,e.transparent=!0,e.blending=Zs,e.blendEquation=ei,e.blendSrc=ii,e.blendDst=ls,e.blendSrcAlpha=ii,e.blendDstAlpha=ls,e.depthTest=!1,e.depthWrite=!1,this._material=e,this._quad=new Ga(e);let t=new bt;t.name="SplineHelperOverlayDepthSeed",this._depthTexNode=Ea(a),t.depthNode=this._depthTexNode.x,t.fragmentNode=ne(0),t.colorWrite=!1,t.depthTest=!1,t.depthWrite=!0,this._seedMaterial=t,this._seedQuad=new Ga(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(dl);let i=this._ensureTarget(dl.x,dl.y,s),n=e.getRenderTarget(),l=e.autoClear;e.getClearColor(hl);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(hl,o),b()){let t=e.toneMapping,a=e.outputColorSpace;e.toneMapping=Vs,e.outputColorSpace=ms.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()}},cl=new WeakMap,pl=new Set,gl=0;var fl=new WeakMap,_l=new Set,yl=0;function xl(e){let t=e.parent?.selectedTexture;return t&&!0===t.isTexture?t:null}function vl(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 bl=new WeakMap;function Tl(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=ir(1).sub(ir(1).sub(e).mul(ir(1).sub(t))).toVec3();return qt(e,a,s)}case 10:return qt(e,e.mul(t),s);default:return qt(e,t,s)}}var wl=null;function Sl(){return null===wl&&(wl=ba({output:E,velocity:de})),wl}var Vl=re(e=>{let t=e.lightDistance,a=e.cutoffDistance,r=e.decayExponent,s=a.greaterThan(0).and(r.greaterThan(0));return St(s,t.div(a).oneMinus().clamp().pow(r),ir(1))}),Ml=class extends Qa{static get type(){return"SplinePointLightNode"}setupDirect(e){let t=this.getLightVector(e),a=t.normalize(),r=Vl({lightDistance:t.length(),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode});return{lightColor:this.colorNode.mul(r),lightDirection:a}}},Cl=class extends A{static get type(){return"SplineSpotLightNode"}setupDirect(e){let t,a,r=this.light,s=this.getLightVector(e),i=s.normalize(),n=i.dot(rt(r)),l=this.getSpotAttenuation(e,n),o=Vl({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=Ea(d.map,a.xy).onRenderUpdate(()=>d.map)),t&&a){let e=a.mul(2).sub(1).abs().lessThan(1).all();u=St(e,u.mul(t),u)}return{lightColor:u,lightDirection:i}}},Rl=null,zl=new ds,kl=new ds,Al=new Ss,Pl=new Ss,El=new Ss,Nl=new ds,Bl=new ds,Ll=new os,Il=new ds(1,0,0),Fl=new ds(0,1,0),Dl=new ds(0,0,1),Ul=new ds,Ol=new ds,Gl=new ds,ql=new ds,Wl=new Ts,Hl=new ds,jl=new ds,Kl=new Ys,$l=new _s,Xl=new _s,Ql=new os,Zl=new os,Yl=new ds,Jl=new ds,eo=new ds,to=new ds,ao=new ds,ro=[],so=!1,io=!1,no=!1,lo="full",oo="g16",uo=!1,ho=!1,mo=!1,co="default",po=!1,go=!0,fo=!0,_o=!0,yo=!0,xo=!0,vo=xr;try{let e=new URLSearchParams(window.location.search),t=e.get("instancing");if(null!==t)if("off"===t||"0"===t||"false"===t||"no"===t)xo=!1;else{let e=Number.parseInt(t,10);Number.isFinite(e)&&e>1&&(vo=e)}so="0"===e.get("dbgao"),io="0"===e.get("dbgshadow"),no="1"===e.get("dbgfp16"),uo="0"===e.get("dbgsky"),ho="0"===e.get("dbgssr"),mo="0"===e.get("dbgibl");let a=e.get("pbrcolor");"0"===a?co="off":("linear"===a||"aces"===a||"agx"===a||"neutral"===a)&&(co=a),po="0"===e.get("dbgplanar"),go="0"!==e.get("dbgplanarpyr"),fo="0"!==e.get("dbgssrpyr"),_o="0"!==e.get("dbgssrhalf"),yo="0"!==e.get("dbgssrresolve");let r=e.get("dbgprefilter");"0"===r?lo="off":"base"===r?lo="base":"k4"===r&&(oo="k4")}catch{}function bo(){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 To=class extends N{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:no?ts:ti,asyncCompilation:!0===e.asyncCompilation||"load"===e.asyncCompilation}),this.viewportWidth=1,this.viewportHeight=1,this.resolution=new os,this.dummyCamera=new zr,this.sceneTransitionDuration=0,this.sceneTransitionTimeRemaining=-1,this.manageShadowUpdates=!1,this.forceShadowUpdates=!1,this._shadowMapMissingAtSync=!1,this.temporalAAEnabled=!0,this.hdrChainActive=!1,this.isWebGPUSplineRenderer=!0,this.shadowFilterHook=Ln,this._gaugeSnapshot="",this._gaugeChangedAt=0,this._gaugeStallWarned=!1,this._skipStalls=new nl,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(),Hi&&function(){if(!Xi){if(Xi=!0,$i=()=>w.frameIndex.value,typeof GPUBuffer<"u"){let e=GPUBuffer.prototype.destroy;GPUBuffer.prototype.destroy=function(){return Zi("buffer",this.label,this.size),e.call(this)}}if(typeof GPUTexture<"u"){let e=GPUTexture.prototype.destroy;GPUTexture.prototype.destroy=function(){return Zi("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 Wi(this),this.library.addLight(Ai,ki),this.shadowMap.enabled=!0,this.shadowMap.type=Ps,t=!0===this.backend?.isWebGPUBackend,xn=t,this._deferGpuBufferDestruction(),this.outputColorSpace=fs,this.toneMapping=Vs,function(e){let t=e.library;t.addLight(Ml,wr),t.addLight(Cl,Rr),t.addLight(sr,Cr),t.lightNodes.delete(ni),t.lightNodes.delete(si),t.addLight(Ml,ni),t.addLight(Cl,si)}(this),this.sceneBundlesEnabled=!0===e.sceneBundles||"rerecord"===e.sceneBundles,this.sceneBundlesForceRerecord="rerecord"===e.sceneBundles,this.domElement.removeAttribute?.("data-engine")}get lastFrameIncomplete(){return!!(this._warmupInFlight||this._compilationHasWork&&!this._gaugesStalled)||0!==(this._skippedAsyncDraws??0)&&!this._skipStalls.stalled}get _gaugesStalled(){return this._gaugeChangedAt>0&&performance.now()-this._gaugeChangedAt>To._GAUGE_STALL_MS}_trackGaugeStall(){let e=this._asyncCompilationGauges,t=void 0!==e&&(e.queued>0||e.pipelines>0),a=t?`${e.queued}/${e.pipelines}`:"";return t?a!==this._gaugeSnapshot?(this._gaugeSnapshot=a,void(this._gaugeChangedAt=performance.now())):void(this._gaugesStalled&&!this._gaugeStallWarned&&(this._gaugeStallWarned=!0,console.warn(`[spline/webgpu] async pipeline driver stalled (${a} in flight, no movement for ${To._GAUGE_STALL_MS}ms) — treating frames as final so screenshots, thumbnails and the on-demand render loop keep working.`))):(this._gaugeSnapshot="",void(this._gaugeChangedAt=0))}_trackStalledSkips(e){let t=this._compilationHasWork&&!this._gaugesStalled;this._skipStalls.update(e,t),T.stalledSkipFrames=this._skipStalls.frames,this._skipStalls.stalled&&!this._stallWarned&&(this._stallWarned=!0,console.warn(`[spline/webgpu] ${e} draw(s) are permanently skipped — their render pipelines never became ready (look for "pipeline creation failed" above). Those objects will not appear; the frame is treated as final so screenshots, thumbnails and the on-demand render loop keep working.`))}get _asyncCompilationGauges(){return this.info.asyncCompilation}get _compilationHasWork(){let e=this._asyncCompilationGauges;return void 0!==e&&(e.queued>0||e.pipelines>0)}get asyncCompilationEnabled(){return!0===this._asyncCompilation}get taaHistory(){return this._taaHistory||(this._taaHistory=sl()),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 ys(2,2,{count:2});e.textures[0].name="output",e.textures[0].type=ti,e.textures[1].name="velocity",e.textures[1].type=ts;let t=new ns(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 Tr?e.activePage:e;Fn(Xr.isSoft(t?.data?.shadow)),t&&fi(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(Sl())),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(Sl())),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 Tr?e:e.scene;if(!0!==a.needsTransmission?.()&&!0!==a.needsReflection?.())return null;if(null===this._grabWarmupTarget){let e=new ys(2,2);e.texture.type=ti;let t=new ns(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=fl.get(e);return a&&(a.epoch!==yl||a.srcMaterial!==t||a.geometry!==e.geometry||a.position.src!==e.geometry.getAttribute("position")||a.map!==t.map||a.selectedMap!==xl(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=xl(e),o=new $s(r.array,3);o.setUsage(Gs);let u={src:r,attr:o,version:r.version},d=[],h=e=>{let t=new $s(new Float32Array(e.count),1);t.setUsage(Gs);let a={src:e,attr:t,version:e.version};return vl(a),d.push(a),a},m=s?h(s):null,c=i?h(i):null,p=new Na;p.name=`SplinePointsTwin(${t.name||t.type})`,p.positionNode=ve(u.attr,"vec3"),p.size=t.size,p.sizeAttenuation=t.sizeAttenuation,p.transparent=t.transparent,p.depthTest=t.depthTest,p.depthWrite=t.depthWrite,p.blending=t.blending,p.fog=!1;let g=m?ve(m.attr,"float"):null,f=c?ve(c.attr,"float"):null;p.colorNode=re(()=>{null!==f?J(f.lessThan(.5)):null!==g&&J(g.greaterThan(.5));let e=null!==n?Ea(n,U()):ne(1);return(null!==g&&null!==n&&null!==l?qt(e,Ea(l,U()),g):e).mul(ne(wt,1))})();let _=new Es(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:yl};return _l.add(new WeakRef(y)),y}(e,t),fl.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&&(vl(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=bl.get(e);return a&&(a.epoch!==yl||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 $s(new Float32Array(e.count*t),t);a.setUsage(Gs);let r={src:e,attr:a,version:e.version};return vl(r),r},i=s(a.getAttribute("position"),3),n=s(a.getAttribute("hover"),1),l=s(a.getAttribute("selected"),1),o=lr(r.pointSize.value),u=lr((new Ss).fromArray(r.color.value)),d=new Na;d.name=`SplinePointsTwin(${t.name||t.type})`,d.positionNode=ve(i.attr,"vec3");let h=ve(n.attr,"float"),m=ve(l.attr,"float");d.sizeNode=o.add(h.mul(4)),d.sizeAttenuation=!1,d.transparent=t.transparent,d.depthTest=t.depthTest,d.depthWrite=t.depthWrite,d.blending=t.blending,d.fog=!1,d.colorNode=re(()=>{let e=et(U().mul(2).sub(1)).toVar();J(e.greaterThan(1));let t=St(m.equal(1),ae(.22,.9,.7),u.add(h.mul(.25)));return ne(St(e.greaterThan(.75),ae(1),t),1)})();let c=new Es(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:yl};return _l.add(new WeakRef(p)),p}(e,t),bl.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&&(vl(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=cl.get(e);if(!t||t.epoch!==gl){let a=new Et;a.name=`SplineHelperTwin(${e.name||e.type})`,a.worldUnits=!1,t={twin:a,epoch:gl},cl.set(e,t),pl.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 ml),this._helperOverlay.render(this,e,t,a,r),T.helperOverlayMode="smaa";else{let r=this.autoClear;this.autoClear=!1,e&&this.render(e,a),t&&(this.clearDepth(),this.render(t,a)),this.autoClear=r,T.helperOverlayMode="direct"}for(let e of i)e.object.material=e.original;for(let e of s)e.visible=!0}createEffectChain(){return function(e){let t=e.pipeline,a=t.postprocessingState,r=!0===a.enabled,s=q(t.scene,t.camera),i=e.hdrChainActive;try{let e=new URLSearchParams(window.location.search).get("dbgfp16");("scene"===e||"st"===e)&&(i=!0)}catch{}let n=s.getTextureNode(),l=n,o=null;if(e.temporalAAEnabled){s.setMRT(Sl()),o=function(e,t,a,r,s=!1){return new rl(e,t,a,r,s)}(n,s.getTextureNode("depth"),s.getTextureNode("velocity"),e.taaHistory,i),l=o,s.getTexture("velocity").type=ts;try{if("1"===new URLSearchParams(window.location.search).get("dbgvel")){let e=s.getTextureNode("velocity");l=ne(e.x.mul(20).add(.5),e.y.mul(20).add(.5),ir(.5),ir(1))}}catch{}}i?s.getTexture("output").type=ts:v()&&(s.getTexture("output").internalFormat="rgba8unorm-srgb");let u=(e,t)=>"number"==typeof e&&Number.isFinite(e)?e:t,d={bloomIntensity:lr(1),caOffset:lr(new os(0,0)),vignetteOffset:lr(0),vignetteDarkness:lr(0),hue:lr(0),saturationPlus1:lr(1),brightness:lr(0),bcContrastScale:lr(1),dofFocusDistance:lr(0),dofFocalLength:lr(0),dofBokehScale:lr(1),dofCameraNear:lr(50),dofCameraFar:lr(1e4),dofOrtho:lr(0),pixelCells:lr(new os(1,1)),bloomOpacity:lr(1),caOpacity:lr(1),vignetteOpacity:lr(1),noiseOpacity:lr(1),hueSaturationOpacity:lr(1),brightnessContrastOpacity:lr(1),dofOpacity:lr(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 os(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(_(U()));c=qt(c,e.rgb,1),p=qt(p,e.a,1)}let x=null;if(r&&a.bloom.enabled){let e=Zr("bloom");if(e){let t=a.bloom;x=e(o?o.outputTextureNode:n,{kernelSize:Kr(t.kernelSize),blurScale:u(t.blurScale,1),luminanceThreshold:u(t.luminanceThreshold,.9),luminanceSmoothing:u(t.luminanceSmoothing,.025)});let r=Ft(x.mul(d.bloomIntensity),0,1);c=Tl(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=ir(1).sub(ir(1).sub(e).mul(ir(1).sub(t)));return qt(e,a,s)}case 10:return qt(e,e.mul(t),s);default:return qt(e,t,s)}}(p,r.a,t.blendFunction,d.bloomOpacity)}else Yr("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=U().sub(.5),l=r.sample(s(U().add(i.mul(t)))).r,o=r.sample(s(U())).g,u=r.sample(s(U().sub(i.mul(t)))).b;c=Tl(c,ae(l,o,u),e.blendFunction,d.caOpacity)}if(r&&a.vignette.enabled){let e=a.vignette,t=et(U().sub(.5)),r=$t(ir(.8).mul(d.vignetteOffset),d.vignetteOffset.add(.799),t.mul(d.vignetteDarkness));c=Tl(c,c.mul(r.oneMinus()),e.blendFunction,d.vignetteOpacity)}if(r&&a.noise.enabled){let e=a.noise,t=B(Wt(Da(U().add(B(Ha)),Y(12.9898,78.233))).mul(43758.5453));c=Tl(c,ae(t),e.blendFunction,d.noiseOpacity)}if(r&&a.hueSaturation.enabled){let e=a.hueSaturation,t=oe(c,d.hue);t=M(t,d.saturationPlus1),c=Tl(c,t,e.blendFunction,d.hueSaturationOpacity)}if(r&&a.brightnessContrast.enabled){let e=a.brightnessContrast,t=c.add(ae(d.brightness));t=t.sub(.5).mul(d.bcContrastScale).add(.5),c=Tl(c,t.min(1),e.blendFunction,d.brightnessContrastOpacity).max(0)}if(r&&a.depthOfField.enabled){let e=Zr("depthOfField");if(e){let t=a.depthOfField,r=s.getTextureNode("depth"),i=qt(Z(r,d.dofCameraNear,d.dofCameraFar),z(r,d.dofCameraNear,d.dofCameraFar),d.dofOrtho);c=Tl(c,e(ne(c,p),i,d.dofFocusDistance,d.dofFocalLength,d.dofBokehScale).rgb,t.blendFunction,d.dofOpacity)}else Yr("depthOfField","webgpu")}let b=ne(c,p);if(t.uiOverlayEnabled&&t.uiCanvasTexture){let e=Ea(t.uiCanvasTexture,U().flipY()),a=qt(b.rgb,e.rgb,e.a),r=Ft(b.a.add(e.a),0,1);b=ne(a,r)}let T=t.sceneTransitionFromTexture;if(T){let e=Ea(T,U()),a=t.sceneTransitionPass.uniforms.mixRatio;b=qt(e,b,a)}let w=t.watermarkTexture;if(w){let t=w.image,a=t?.width||128,r=t?.height||32,s=new os(e.viewportWidth*e.getPixelRatio(),e.viewportHeight*e.getPixelRatio()),i=12*e.getPixelRatio(),n=.5*a*e.getPixelRatio(),l=.5*r*e.getPixelRatio(),o=Y((s.x-n-i)/s.x,i/s.y),u=Y(n/s.x,l/s.y),d=U().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=Ft(d,0,1),c=Ea(w,m),p=c.a.mul(h.select(ir(1),ir(0)));b=ne(qt(b.rgb,c.rgb,p),Ft(b.a.add(p),0,1))}let S=new I(e,b);return{syncValues:h,render(){s.scene=t.scene,s.camera=t.camera,S.render()},renderTAAResolve:o?e=>{s.scene=t.scene,s.camera=t.camera,o.renderResolve(e)}:null,renderBloomPasses:x?e=>{s.scene=t.scene,s.camera=t.camera,x.renderBloom(e)}:null,resize(){},sceneDepthTexture:()=>s.renderTarget?.depthTexture??null,dispose(){o?.dispose(),x?.dispose(),s.dispose(),S.dispose()}}}(this)}renderSplineSceneWithDummyCamera(e,t,a=1){this.dummyCamera.updateCameraState(t.dataPatched),this.dummyCamera.matrix.copy(t.matrixWorld);let r=t.height,s=t.width,i=this.viewportWidth/this.viewportHeight;s<r?s=r*i:r=s/i,this.dummyCamera.setViewplaneSize(s,r);for(let t=0;t<a;t++)this.renderSplineScene(e,this.dummyCamera)}renderSplineScene(a,r,{sceneHelpers:s=this.sceneHelpers,sceneHelpersOnTop:i=this.sceneHelpersOnTop}={}){if(this._warmupInFlight)return;this._maybeCloseAsyncLoadWindow(),this._frameSerial++,this._disposeRetiredGrabTargets(),(mr()?.drainRetired()??0)+(d()?.drainRetired()??0)>0&&this._retireBundleRecords(),Hi&&function(e){if(null==e||e===Qi)return;let t=e;"function"==typeof t.addEventListener&&(Qi=e,t.addEventListener("uncapturederror",e=>{let t=e?.error?.message??"";!t.toLowerCase().includes("destroyed")||Ki<=0||(Ki--,console.warn(`[spline/webgpu][dbgdestroys] submit rejected at frame ${$i()} (t=${Math.round(performance.now())}ms):\n${t.slice(0,400)}\n— last ${ji.length} destroy() calls, newest last (a stack WITHOUT _disposeRetiredGrabTargets bypassed the deferral):`,ji.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 Tr?a.activePage:a,u=l.visible;l.visible=!0;let h=l.scene;if(fi(l),this.renderStarted=!0,xo&&a instanceof Tr){let e=a.updateInstanceGroups(l,vo);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=uo?null:l.skyState;if(!0===m?.enabled){if(this.skyEnvironmentNeeded=!ho&&(h.needsReflectionDirty||h.needsReflection())||!mo&&!0===m.lighting,null===this._skySystem){let e=Rl;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;!mo&&!0===m?.enabled&&this._skySystem&&(c=this._skySystem.iblTexture??null,p=this._skySystem.iblRotationY??0),function(e){if(Si.quality===e)return!1;Si.quality=e;for(let e of Vi)Mi(e)}("low"===m?.lightingQuality?"low":"full"),function(e){if(Si.texture===e)return!1;Si.texture=e,Si.version++;for(let e of Vi)Mi(e)}(c),Si.rotation.set(0,-p,0),l.environmentIntensity=!0===m?.enabled?m.lightingIntensity??1:1;{let e="off"===co?null:l.gradingState,t="default"!==co&&"off"!==co,a=t||"linear"===e?.pipeline,r=t?"linear"===co?"none":co:e?.toneMapping??"aces";this.toneMapping=a?"aces"===r?Rs:"agx"===r?zs:"neutral"===r?ks:Vs:Vs,this.toneMappingExposure=a?e?.exposure??1:1,this.outputColorSpace=a?cs:fs,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 _=Vn[f];w.pcssHalton.value.set(_[0],_[1]),w.tapAngle.value=Math.random()*Math.PI*2,w.tapAngle2.value=Math.random()*Math.PI*2,this._syncLightState(l),w.unjitteredProjection.value.copy(r.projectionMatrix);let y=this.temporalAAEnabled?this.taaHistory:null;if(y){let e=this.getDrawingBufferSize(Zl);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?dr():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?br:null,r.layers.enable(3),r.layers.enable(8),r.layers.enable(4);let b=l.data.ao,S=b.occlusion&&!so&&!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(!ho&&h.needsReflection()?(this._renderReflectionPass(l,r),po?w.reflectionPlanarEnabled.value=0:this._renderPlanarReflectionPass(l,r),this._renderReflectionResolvePass(l,r)):w.reflectionResolveEnabled.value=0,this.sceneBundlesEnabled&&this._updateSceneBundle(l,r),this.pipeline.isUIOverlayEnabled&&l.uiCanvas?.enabled&&l.uiCanvas.texture&&l.uiCanvas.texture.image.width>0){let e=this.getPixelRatio();(l.uiCanvas.width!==this.viewportWidth||l.uiCanvas.height!==this.viewportHeight||l.uiCanvas.dpr!==e)&&l.uiCanvas.applySize({width:this.viewportWidth,height:this.viewportHeight},e),l.uiCanvas.render(this),this.pipeline.uiCanvasTexture=l.uiCanvas.texture,this.pipeline.uiOverlayEnabled=!0}else this.pipeline.uiOverlayEnabled=!1;this.pipeline.sceneHelpers=s,this.pipeline.sceneHelpersOnTop=i,this.pipeline.scene=l,this.pipeline.camera=r;let V=t(l.postprocessing);this.pipeline.postprocessingState!==V&&this.pipeline.updatePostprocessing(V),this.pipeline.render(),y?.endJitter(),T.outputInterpositions=this._frameBufferTargets?.size??0,this.manageShadowUpdates&&(h.shadowsDirty=this._shadowMapMissingAtSync||this.lastFrameIncomplete),r instanceof zr&&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,eo.setFromMatrixPosition(e.matrixWorld),e.target?(e.target.updateMatrixWorld(),to.setFromMatrixPosition(e.target.matrixWorld)):to.set(0,0,0),ao.subVectors(to,eo),ao.lengthSq()<1e-10)return;ao.normalize();let l=1/0,o=-1/0;for(let e=0;e<a;e++){let a=4*e,r=(t[a]-eo.x)*ao.x+(t[a+1]-eo.y)*ao.y+(t[a+2]-eo.z)*ao.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(Yl):Yl.setFromMatrixPosition(a.matrixWorld);let r=4*t;ro[r]=Yl.x,ro[r+1]=Yl.y,ro[r+2]=Yl.z,ro[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;Yl.copy(r.center).applyMatrix4(a.matrixWorld),Jl.setFromMatrixScale(a.matrixWorld);let i=r.radius*Math.max(Math.abs(Jl.x),Math.abs(Jl.y),Math.abs(Jl.z)),n=4*t;ro[n]=Yl.x,ro[n+1]=Yl.y,ro[n+2]=Yl.z,ro[n+3]=i,t++}),t}_syncLightState(e){let t=Xr.isSoft(e.data.shadow);Fn(t),T.shadowTypeSoft=t,function(e){switch(e){case"low":Mn=8;break;case"high":Mn=32;break;default:Mn=16}}(e.data.shadow?.softShadowQuality),t&&wn()&&(dn||(this.initTexture?.(an()),dn=!0));let r=-1;T.pcssLights=0,T.pcssPyramidActive=0,this._maskLights.length=0,this._maskBlocked=!1,T.nodeResurrections=this._nodes?._spResurrections??0;let s=!1,i=w.toonLightData.array,n=0,l=this.manageShadowUpdates,o=e.scene.shadowsDirty||this.forceShadowUpdates;this._shadowMapMissingAtSync=!1,e.traverseVisible(u=>{let d=u;if(a(d)&&(e.scene.shadowsDirty=!0),l&&(d.isPointLight||d.isSpotLight||d.isDirectionalLight)&&d.shadow&&(d.shadow.autoUpdate=o,o&&!0===d.castShadow&&null==d.shadow.map&&(this._shadowMapMissingAtSync=!0)),io&&(d.isPointLight||d.isSpotLight||d.isDirectionalLight)&&d.castShadow&&(d.castShadow=!1),d.isPointLight&&d.castShadow&&d.shadow&&(function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==qn&&T.pcssForeignFilter++:(e.filterNode=qn,T.pcssInstalled++)}(d.shadow),zn(d.shadow),T.pcssLights++),(d.isSpotLight||d.isDirectionalLight)&&d.castShadow&&d.shadow){d.isDirectionalLight&&(r<0&&(r=this._gatherShadowBounds(e)),this._fitDirectionalShadowRange(d,ro,r)),function(e){void 0!==e.filterNode&&null!==e.filterNode?e.filterNode!==Gn&&T.pcssForeignFilter++:(Object.defineProperty(e,"penumbraSize",{get:()=>d.data?.penumbraSize??.5,configurable:!0}),e.filterNode=Gn,T.pcssInstalled++)}(d.shadow);let a,i=!l||o||!0===d.shadow.needsUpdate;if(t&&wn()&&(i?function(e){let t=e;t.__spePcssPyramid&&(t.__spePcssPyramid.fresh=!1)}(d.shadow):on(d.shadow)||function(e,t){let a=t,r=a.map?.depthTexture??null;if(null==r)return!1;let s=nn(t);if(function(e){let t=nn(e);if(t.slot>=0)return t.slot;for(let a=0;a<8;a++){let r=ln[a];if(null===r||void 0===r.deref())return ln[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=en(64,64),s.mid.texture.name="SplinePCSSPyramidMid"),null===s.small&&(s.small=en(8,8),s.small.texture.name="SplinePCSSPyramidSmall"),s.toMid=new Ga(rn(`SplinePCSSPyramidToMid${i}`,r,Math.ceil(i/64),i-1,!1,0)),s.toSmall=new Ga(rn("SplinePCSSPyramidToSmall",s.mid.texture,8,63,!0,0)),s.passKey=l),an();let o=e.getRenderTarget();e.setRenderTarget(s.mid),s.toMid.render(e),e.setRenderTarget(s.small),s.toSmall.render(e),e.setRenderTarget(o),hn.set(n,0,0),e.copyTextureToTexture(s.small.texture,tn.texture,null,hn),s.fresh=!0,T.pcssPyramidBuilds++}(this,d.shadow),a={slot:un(d.shadow),fresh:on(d.shadow)}),t&&Sn()&&(Rn(d.shadow,-1),this._maskLights.push({light:d,shadow:d.shadow}),(i||null==d.shadow.map)&&(this._maskBlocked=!0)),zn(d.shadow,d.data?.penumbraSize??.5,a)&&T.pcssPyramidActive++,!s){s=!0;let e=d.shadow;T.pcssRadius0=e.radius??-1,T.pcssPenumbra0=e.penumbraSize??-1}T.pcssLights++}if(!(n>=f))if(d.isPointLight||d.isSpotLight)kl.setFromMatrixPosition(d.matrixWorld),i[n].set(kl.x,kl.y,kl.z,0),n++;else if(d.isDirectionalLight&&d.target){d.target.updateMatrixWorld();let e=kl;e.setFromMatrixPosition(d.matrixWorld),e.sub(zl.setFromMatrixPosition(d.target.matrixWorld)).normalize(),i[n].set(e.x,e.y,e.z,1),n++}}),w.toonLightCount.value=n}_renderShadowMaskPass(e,t){let a=0;if(Sn()&&!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 Kn);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(Zl),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 ys(s,i,{depthBuffer:!1})),w.aoRenderTarget.value=this._aoRenderTarget.texture,this._hbao||(this._hbao=new wi);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:jr.getModeIndex({mode:e.fogMode}),fogDensity:e.fogDensity??jr.getDensity({}),fogHeightFalloff:e.fogHeightFalloff??jr.getHeightFalloff({}),fogHeightBase:e.fogHeightBase??jr.getHeightBase({})},this.pipeline.blueNoiseTexture,this._aoRenderTarget)}_renderNormalPass(e,t,a){let r=a.outline&&a.cavity?"both":a.cavity?"normals":"hash",s=this.getDrawingBufferSize(Zl),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 ys(i,n,{count:"both"===r?2:1,type:"normals"===r?ts:es,depthTexture:new ns(i,n)});"both"===r&&(e.textures[0].name="g0",e.textures[1].name="g1",e.textures[1].type=ts);for(let t of e.textures)t.minFilter=Ws,t.magFilter=Ws;return e});let l=this._encodeMaterials[r];if(void 0===l){this._depthContrastUniform??(this._depthContrastUniform=lr(1));let e=new bt;e.name=`SplineNormalPassEncode_${r}`;let t=it("randomColor","vec3"),a=()=>{let e=Ya($a),a=Ra.sub(.5).mul(this._depthContrastUniform).add(.5),r=qt(qt(t,e,.2),ae(a),.4);return ne(r,t.x)},s=()=>{let e=Ya(Wa),a=St(F,e,e.negate());return ne(a,t.x)};e.fragmentNode="both"===r?ba({g0:a(),g1:s()}):"normals"===r?s():a(),e.lights=!1,e.blending=Us,e.needsUpdate=!0,this._encodeMaterials[r]=e,l=e}this._depthContrastUniform.value=t instanceof zr?(t.far-t.near)/1e4:1;let o=e.overrideMaterial,u=this.getRenderTarget(),d=this.getClearColor(Al),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=Ea(_),t=new bt;t.name="SplineUICanvasBlit",t.fragmentNode=e.sample(U()),t.lights=!1,t.blending=Us,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,a={quad:new Ga(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=Ea(_),r=lr(new os(1,0)),s=new bt;s.name="SplineTransmissionPrefilter";let i=U(),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=ne(o,1),s.lights=!1,s.blending=Us,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,t={quad:new Ga(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(oo,"SplineTransmissionDownsample"),this._downsamplePasses[e]=t,t)}_buildDownsamplePassEntry(e,t){let a=Ea(_),r=lr(new os(1,1)),s=new bt;s.name=t;let i=U(),n=r,l=(e,t)=>a.sample(i.add(Y(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=ne(o,1),s.lights=!1,s.blending=Us,s.depthTest=!1,s.depthWrite=!1,s.needsUpdate=!0,{quad:new Ga(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(Zl),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?lo:"off";this._transmissionTarget=this._reallocGrabTarget(this._transmissionTarget,s,i,()=>{let e=new ys(s,i,{depthBuffer:!0}),t=e.texture;return"off"===n?(t.generateMipmaps=!0,t.minFilter=Js):(t.generateMipmaps=!1,t.minFilter=Qs),t.magFilter=Qs,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 ys(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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 ys(s,i,{depthBuffer:!1}),a=e.texture;return a.minFilter=Js,a.magFilter=Qs,"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 bt;e.name="SplineReflectionDepthBlit";let t=Ea(this._reflectionTarget.depthTexture);e.fragmentNode=ne(ae(t.sample(U())),1),e.lights=!1,e.blending=Us,e.depthTest=!1,e.depthWrite=!1,e.needsUpdate=!0,r.push({quad:new Ga(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 bt;n.name=`SplineReflectionDepthMin${s}`;let l=Ea(this._reflectionDepthChain[s-1].texture),o=ft,u=Re(o.x).mul(2),d=Re(o.y).mul(2),h=(e,t)=>l.load($e(u.add(e),d.add(t))).x,m=(e,t)=>Dt(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=ne(ae(c),1),n.lights=!1,n.blending=Us,n.depthTest=!1,n.depthWrite=!1,n.needsUpdate=!0,r.push({quad:new Ga(n)})}this._reflectionDepthPasses=r}_renderReflectionPass(e,t){let a=this.getDrawingBufferSize(Zl),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=Vr(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(_o&&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&&fo;this._reflectionTarget=this._reallocGrabTarget(this._reflectionTarget,l,o,()=>{let e=new ys(l,o,{depthTexture:new ns(l,o)});return d?(e.texture.generateMipmaps=!1,e.texture.minFilter=Qs):(e.texture.generateMipmaps=!0,e.texture.minFilter=Js),e.texture.magFilter=Qs,e});let h=(e,t)=>{let a=new ys(e,t,{depthBuffer:!1,type:es,format:xs});return a.texture.generateMipmaps=!1,a.texture.minFilter=Ws,a.texture.magFilter=Ws,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(Pl);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 ys(l,o,{depthBuffer:!1}),t=e.texture;return t.minFilter=Js,t.magFilter=Qs,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 ys(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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;Nl.copy(s.center).applyMatrix4(e.matrixWorld);let o=t.projectionMatrix.elements[5]*a/2,u=1;!0===t.isPerspectiveCamera&&(Bl.setFromMatrixPosition(t.matrixWorld),u=Math.max(Nl.distanceTo(Bl),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&&yo&&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=Mr(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(Ll).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 ys(e,t,{type:ts,depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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 ys(l,o,{count:2,type:ts,depthTexture:new ns(l,o)});for(let t of e.textures)t.generateMipmaps=!1,t.minFilter=Ws,t.magFilter=Ws;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 bt;e.name="SplineReflectionGBuffer";let t=L("__splinePlanarMirror","float"),a=w.reflectionPlanarEnabled.greaterThan(.5),r=L("__srMode","float"),s=St(t.greaterThan(.5).and(a),ir(0),r);e.fragmentNode=ba({g0:ne(Ya(Wa),s),g1:ne(L("__srBlur","float"),L("__srThickness","float"),L("__srStepSize","float"),L("__srSteps","float"))}),e.lights=!1,e.blending=Us,e.needsUpdate=!0,this._reflectionGBufferMaterial=e}let u=this._skippedAsyncDraws??0,d=e.overrideMaterial,h=this.getRenderTarget(),m=this.getClearColor(El),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=lr(new Ts),i=lr(new Ts),n=lr(new Ts),l=lr(.1),o=this._reflectionGBufferTarget,u=Ea(o.textures[0]),d=Ea(o.textures[1]),h=Ea(o.depthTexture),m=Ea(e),c=Ea(this._reflectionDepthPyramid.texture),p=Ea(t),g=new bt;g.name="SplineReflectionResolve";let f=re(()=>{let e=ft,t=$e(Re(e.x),Re(e.y)),a=U(),r=u.load(t).toVar(),o=h.sample(a).toVar(),g=ne(0).toVar(),f=ir(0).toVar();return le(r.w.greaterThan(.5),()=>{let e=d.load(t).toVar(),u=Di(i,a.x,a.y,o),h=Oi({dials:{blur:e.x,thickness:e.y,stepSize:e.z,steps:Re(e.w),tracingMode:r.w.sub(1)},surface:{originView:u,normalV:Ya(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:ht(!1),noisePixel:Y(t),singleRay:{footprintOut:f}});g.assign(ne(h,f.add(1)))}),g});g.fragmentNode=f(),g.lights=!1,g.blending=Us,g.depthTest=!1,g.depthWrite=!1,g.needsUpdate=!0,this._reflectionResolveMarch={quad:new Ga(g),proj:s,projInv:i,camWorld:n,near:l};let _=Ea(this._reflectionResolveMarchTarget.texture),y=Ea(this._reflectionResolveBlurTmp.texture),x=e=>{let t=new bt;t.name=`SplineReflectionResolveBlur${e.toUpperCase()}`;let s="x"===e?_:y,i="x"===e?1/a:1/r,n=re(()=>{let t=U(),a=_.sample(t).toVar().w.sub(1).max(0).clamp(.5,12).toVar(),r=ne(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?Y(a.mul(l/6*i),0):Y(0,a.mul(l/6*i)),d=s.sample(t.add(u)).toVar(),h="x"===e?d.w.min(1):d.w;r.addAssign(ne(d.rgb,h).mul(o))}return r.div(n)});return t.fragmentNode=n(),t.lights=!1,t.blending=Us,t.depthTest=!1,t.depthWrite=!1,t.needsUpdate=!0,new Ga(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&&Sr(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=Il,i=o*m*(u*c)):o<=l&&o<=u?(s=Fl,i=l*h*(u*c)):(s=Dl,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(Ul.copy(a.normalAxis).transformDirection(s),Ol.setFromMatrixPosition(s),Gl.setFromMatrixPosition(t.matrixWorld),ql.subVectors(Ol,Gl),ql.dot(Ul)>0&&Ul.negate(),ql.dot(Ul)>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(ql.subVectors(Ol,Gl),ql.reflect(Ul).negate(),ql.add(Ol),Wl.extractRotation(t.matrixWorld),Hl.set(0,0,-1).applyMatrix4(Wl).add(Gl),jl.subVectors(Ol,Hl),jl.reflect(Ul).negate(),jl.add(Ol),i.position.copy(ql),i.up.set(0,1,0).applyMatrix4(Wl),i.up.reflect(Ul),i.lookAt(jl),i.updateMatrixWorld(),i.projectionMatrix.copy(t.projectionMatrix),i.projectionMatrixInverse.copy(i.projectionMatrix).invert(),!0===t.isPerspectiveCamera){Kl.setFromNormalAndCoplanarPoint(Ul,Ol),Kl.applyMatrix4(i.matrixWorldInverse),$l.set(Kl.normal.x,Kl.normal.y,Kl.normal.z,Kl.constant);let e=i.projectionMatrix.elements;Xl.x=(Math.sign($l.x)+e[8])/e[0],Xl.y=(Math.sign($l.y)+e[9])/e[5],Xl.z=-1,Xl.w=(1+e[10])/e[14],$l.multiplyScalar(1/$l.dot(Xl)),e[2]=$l.x,e[6]=$l.y,e[10]=$l.z,e[14]=$l.w}let n=this.getDrawingBufferSize(Ql),l=Math.max(1,Math.round(n.x)),o=Math.max(1,Math.round(n.y)),u=!0===this.backend?.isWebGPUBackend&&go;this._planarTarget=this._reallocGrabTarget(this._planarTarget,l,o,()=>{let e=new ys(l,o);return u?(e.texture.generateMipmaps=!1,e.texture.minFilter=Qs):(e.texture.generateMipmaps=!0,e.texture.minFilter=Js),e.texture.magFilter=Qs,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 ys(l,o,{depthBuffer:!1}),a=t.texture;return a.minFilter=Js,a.magFilter=Qs,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 ys(e,t,{depthBuffer:!1});return a.texture.generateMipmaps=!1,a.texture.minFilter=Qs,a.texture.magFilter=Qs,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(Zl),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 ys(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 bo();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 ys(e,t,{depthBuffer:!0})):(this._ciOffscreenTarget=new ys(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(),mr()?.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 sn){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)}sn.clear(),ln.fill(null),tn?.dispose(),tn=null,dn=!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 pl)e.deref()?.dispose();pl.clear(),gl++}(),function(){for(let e of _l){let t=e.deref();void 0!==t&&(t.sprite.removeFromParent(),t.material.dispose())}_l.clear(),yl++}(),this._taaHistory?.dispose(),this._taaHistory=void 0;for(let e of Object.values(this._encodeMaterials))e?.dispose();this._encodeMaterials={},this._bundledPages.clear(),this.pipeline.dispose(),this.dummyCamera.dispose(),super.dispose(),this._disposeRetiredGrabTargets(),w.transmissionRenderTarget.value=_,w.normalRenderTarget.value=_,w.aoRenderTarget.value=_,w.reflectionRenderTarget.value=y,w.reflectionDepthPyramid.value=y,w.reflectionEnvMap.value=y,w.reflectionPlanarTarget.value=y,w.reflectionPlanarEnabled.value=0,w.reflectionResolveTarget.value=x,w.reflectionResolveEnabled.value=0}},wo=To;wo._GAUGE_STALL_MS=3e3;var So=(e,t)=>e.element(t);function Vo(e){let t=e;return null!=t&&!0===t.isInstancedMesh&&null!=t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute}var Mo=new WeakMap;function Co(e){return ca.mul(function(e){let t=e.spInstanceMatrixNode;if(void 0!==t)return t;let a=e.object,r=a.instanceMatrix,s=Math.max(a.count??1,1);if(!0===r.isStorageInstancedBufferAttribute)return So(pa(r,"mat4",s),me);if(16*s*4<=e.getUniformBufferLimit())return So(S(r.array,"mat4",s),me);let i=Mo.get(r);void 0===i&&(i=new vs(r.array,16,1),Mo.set(r,i));let n=r.usage===Gs?Se:ve;return xt(n(i,"vec4",16,0),n(i,"vec4",16,4),n(i,"vec4",16,8),n(i,"vec4",16,12))}(e))}var Ro=re(e=>Vo(e.object)?ie:ue).once()().toVar("speObjectPosition"),zo=re(e=>{let t=e.material?.shapeBlendObjectNormal;return t||(Vo(e.object)?e.geometry.hasAttribute("normal")?La:ae(0,1,0):Ua)}).once()().toVar("speObjectNormal"),ko=(re(e=>Vo(e.object)?Co(e):ca).once()(),re(e=>{if(!Vo(e.object))return ta;let t=Co(e),a=e=>So(t,e).xyz;return ae(a(0).length(),a(1).length(),a(2).length()).toVarying("v_speModelScale")}).once()().toVar("speModelScale")),Ao=(re(e=>Vo(e.object)?gt(Co(e)).inverse().transpose():Zt).once()(),re(e=>Vo(e.object)?Co(e).inverse():_a).once()(),new WeakMap);function Po(e){if(Ao.has(e))return;let t={own:e.value,render:e.value};Ao.set(e,t),Object.defineProperty(e,"value",{configurable:!0,enumerable:!0,get:()=>t.render,set:e=>{t.render=e,t.own=e}})}function Eo(e){let t=Ao.get(e);return void 0!==t?t.own:e.value}function No(e,t){let a=Ao.get(e);void 0!==a?a.render=t:e.value=t}var Bo=class{constructor(e){this.layerId=e,this.uniforms={},this.byName=new Map,this.liveValues=new Map}set(e,t,a){return this.byName.set(e,t),this.uniforms[`f${this.layerId}_${e}`]=t,void 0!==a&&this.liveValues.set(e,a),this}has(e){return this.byName.has(e)}names(){return[...this.byName.keys()]}get(e){let t=this.byName.get(e);if(void 0===t)throw new Error(`TSLLayerParams: unknown param "${e}" (layer f${this.layerId})`);return t}getFloat(e){return this.get(e)}getInt(e){return this.get(e)}getBool(e){return this.get(e)}getVec2(e){return this.get(e)}getVec3(e){return this.get(e)}getVec4(e){return this.get(e)}getColor(e){return this.get(e)}getValue(e){if(this.liveValues.has(e))return this.liveValues.get(e);let t=this.byName.get(e);return void 0===t?void 0:Eo(t)}getLiveValue(e){return this.liveValues.get(e)}getNodeValue(e){let t=this.byName.get(e);return void 0===t?void 0:Eo(t)}setValue(e,t){let a=this.byName.get(e);void 0===a||void 0===t||(this.liveValues.has(e)&&this.liveValues.set(e,t),a.value=t)}};function Lo(e,t,a){let r=ir(e).toVar(),s=ir(qt(r.div(Ft(r.add(t.accumAlpha),ir(1e-5),ir(1))),r,a)).toVar();return t.accumAlpha.addAssign(nr(t.accumAlpha).mul(r).mul(nr(a))),s}function Io(e,t){let a=ir(e).toVar(),r=ir(a.div(Ft(a.add(t.accumAlpha),ir(1e-5),ir(1)))).toVar();return t.accumAlpha.addAssign(nr(t.accumAlpha).mul(a)),r}var Fo=0,Do=1,Uo=2,Oo=3,Go=re(e=>{let t=e.a.toVar(),a=e.b.toVar(),r=e.alpha.toVar(),s=e.mode,i=ae(1).toVar();return le(s.equal(Re(0)),()=>{i.assign(qt(t,a,r))}).ElseIf(s.equal(Re(1)),()=>{i.assign(qt(t,t.mul(a),r))}).ElseIf(s.equal(Re(2)),()=>{i.assign(qt(t,nr(nr(t).mul(nr(a))),r))}).ElseIf(s.equal(Re(3)),()=>{let e=da(t,ae(.5)),s=qt(nr(nr(t).mul(nr(a)).mul(2)),t.mul(a).mul(2),e);i.assign(qt(t,s,r).clamp(0,1))}),i});function qo(e,t,a,r){return Go({a:e,b:t,alpha:a,mode:r})}var Wo=new Map,Ho=new Set,jo=(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:ae(1,0,0),calpha:Io(r,a)}};function Ko(e,t){Wo.set(e,t)}function $o(e){let t=Wo.get(e);return void 0!==t?t:(Ho.has(e)||(Ho.add(e),console.warn(`[spe] Material layer type "${e}" is not available in this runtime build (no WebGPU port, or compiled out) — rendering flat red.`)),jo)}function Xo(e){return Wo.has(e)}var{diffuseContribution:Qo,specularColorBlended:Zo}=er,Yo=re(e=>{let t=Wa.dot(e.lightDirection),a=Y(t.mul(.5).add(.5),0),r=a.fwidth().mul(.5);return qt(ae(.7),ae(1),$t(ir(.7).sub(r.x),ir(.7).add(r.x),a.x))}),Jo=re(e=>{let t=e.lightDirection.add(be).normalize(),a=Wa.dot(t).clamp(),r=be.dot(t).clamp(),s=r.mul(-5.55473).sub(6.98316).mul(r).exp2(),i=Yt.mul(s.oneMinus()).add(s),n=ir(.25),l=Lt.mul(.5).add(1).mul(1/Math.PI).mul(a.pow(Lt));return i.mul(n).mul(l)});function eu(e){let t=w.aoRenderTarget.sample(vt).rgb,a=w.aoEnabledUniform;return null!==e&&(a=a.mul(St(e,ir(1),ir(0)))),qt(ae(1),t,a)}var tu,au=(tu=class extends Xt{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=Yo({lightDirection:t}).mul(a);r.directDiffuse.addAssign(s.mul(Pa.rgb.mul(1/Math.PI))),r.directSpecular.addAssign(s.mul(Jo({lightDirection:t})))}},class extends tu{constructor(){super(...arguments),this.aoOcclusionGate=null}finish(e,...t){super.finish?.call(this,e,...t);let{reflectedLight:a,outgoingLight:r}=e.context,s=eu(this.aoOcclusionGate),i=a.directDiffuse.add(a.indirectDiffuse);r.subAssign(i.mul(nr(s)))}}),ru=class extends la{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=Wa.dot(a.lightDirection).clamp().mul(a.lightColor),t=er.BRDF_Lambert({diffuseColor:Qo});return void a.reflectedLight.directDiffuse.addAssign(e.mul(t))}super.direct(e,t)}},su=e=>e,iu=[{a:"y",b:"z",pole:"x"},{a:"z",b:"x",pole:"y"},{a:"x",b:"y",pole:"z"}];function nu(e,t){return"x"===t?e.x:"y"===t?e.y:e.z}function lu(e,t){return Va(e,ae(t,1)).div(2).add(.5).xy}function ou(e,t,a){let r=ir(e.div(Ft(e.add(t.accumAlpha),ir(1e-5),ir(1)))).toVar();return t.accumAlpha.addAssign(nr(t.accumAlpha).mul(e).mul(nr(a))),r}function uu(e){let t=e.getValue("projection")??0,a=e.getValue("axis")??0,r=a>=0&&a<=2?a:0,s=e.getValue("projectionAxis")??-1,i=s>=0&&s<=2?s:1,n=e.get("mat"),l=e.getVec2("size");if(1===t){let e=Ro,t=0===r?e.zy:1===r?e.xz:e.xy,a=Y(t.add(1).div(2)).toVar();return{uvs:[Y(lu(n,a.mul(2).sub(1).div(l.mul(.5)))).toVar()],weights:null}}if(2===t){let e=ae(Ya(Ro)).toVar(),{a:t,b:a,pole:r}=iu[i],s=ir(We(nu(e,t),nu(e,a)).div(6.283).add(.5)).toVar(),l=ir(Ge(nu(e,r)).div(3.1415).add(.5)).toVar(),o=Y(s,l).toVar();return{uvs:[Y(lu(n,o.mul(2).sub(1))).toVar()],weights:null}}if(3===t){let e=ae(Ya(Ro)).toVar(),{a:t,b:a,pole:r}=iu[i],s=ir(We(nu(e,t),nu(e,a)).div(6.283).add(.5)).toVar(),o=ir(nu(Ro,r).div(l.y.mul(.5))).toVar(),u=ir(o.div(2).add(.5)).toVar(),d=Y(s,u).toVar();return{uvs:[Y(lu(n,d.mul(2).sub(1))).toVar()],weights:null}}if(4===t){let t=e.getFloat("blending"),a=ae(Ro).toVar(),r=Y(a.xy.add(1).div(2)).toVar(),s=Y(a.zy.add(1).div(2)).toVar(),i=Y(a.xz.add(1).div(2)).toVar();for(let e of[r,s,i])e.assign(lu(n,su(e.mul(2).sub(1).div(l.mul(.5)))));let o=ir(nr(t).mul(125).add(3)).toVar(),u=ae(zo).toVar(),d=ae(Ae(Ya(u))).toVar();return d.assign(ze(d,ae(o))),d.divAssign(Da(d,ae(1))),{uvs:[r,s,i],weights:d}}return{uvs:[Y(lu(n,U().mul(2).sub(1))).toVar()],weights:null}}var du=(e,t,a)=>{let r,s=e.getValue("projection")??0,i=e.getValue("axis")??0,n=i>=0&&i<=2?i:0,l=e.getValue("side")??0,o=e.get("texture"),u=e.getFloat("crop"),{uvs:d,weights:h}=uu(e),m=[...d],c=null;if(1===s){if(r=o.sample(d[0]),2!==l){let e=0===n?ae(1,0,0):1===n?ae(0,1,0):ae(0,0,1),t=Da(zo,e);c=da(ir(0),1===l?t.mul(-1):t)}}else if(2===s||3===s)r=function(e,t){if(e.value.minFilter===Ws&&e.value.magFilter===Ws)return e.sample(t);let a=Y(va(t)).toVar(),r=Y(Sa(t)).toVar();return a.x.subAssign(R(a.x.add(.5))),r.x.subAssign(R(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"):ir(1),g=ne(qt(ne(0,0,0,1),r,p)).toVar(),f=ae(g.rgb).toVar(),_=ir(t.alpha.mul(g.a)).toVar();return null!==c&&_.mulAssign(c),function(e,t,a){le(e.greaterThan(.5),()=>{for(let e of a)le(e.x.lessThan(0).or(e.x.greaterThan(1)).or(e.y.lessThan(0)).or(e.y.greaterThan(1)),()=>{t.assign(0)})})}(u,_,m),_.mulAssign(t.mask),{color:f,calpha:ou(_,a,t.isMask)}};function hu(e,t,a){let r=Y(t).toVar(),s=Y(va(r)).toVar(),i=Y(Sa(r)).toVar(),n=t=>a.mul(V(e.sample(t).rgb)),l=ir(n(r)).toVar(),o=ir(n(r.add(s)).sub(l)).toVar(),u=ir(n(r.add(i)).sub(l)).toVar();return Y(o,u)}function mu(e,t,a){let r=ae(va(e)).toVar(),s=ae(Sa(e)).toVar(),i=ae(Ya(t)).toVar(),n=ae(Ya(ma(s,i))).toVar(),l=ae(Ya(ma(i,r))).toVar(),o=ir(Da(r,n).mul(tr)).toVar(),u=ae(Ut(o).mul(a.x.mul(n).add(a.y.mul(l)))).toVar();return Ya(Ae(o).mul(i).sub(u))}function cu(e,t){let a,r=e.get("texture"),s=e.has("loaded")?e.getFloat("loaded"):ir(1),i=e=>{let a=r.sample(e),s="luminance"===t?V(a.rgb):a[t];return ir(s).toVar()},{uvs:n,weights:l}=uu(e);if(null!==l){let e=i(n[0]),t=i(n[1]),r=i(n[2]);a=e.mul(l.z).add(t.mul(l.x)).add(r.mul(l.y))}else a=i(n[0]);return qt(ir(1),a,s)}Ko("texture",du),Ko("video",du);var pu=ar,gu=he,fu=.1666667,_u=re(e=>{let t=e.c,a=Wt(Da(t,ae(17,59.4,15))).mul(4096),r=B(a.mul(512)),s=a.mul(.125),i=B(s.mul(512)),n=s.mul(.125),l=B(n.mul(512));return ae(i,l,r).sub(.5)}).setLayout({name:"spe_random3",type:"vec3",inputs:[{name:"c",type:"vec3"}]});function yu(e){return _u({c:e})}var xu=re(e=>{let t=e.p,a=R(t.add(Da(t,ae(.3333333)))).toVar(),r=t.sub(a).add(Da(a,ae(fu))).toVar(),s=da(ae(0),r.sub(r.yzx)).toVar(),i=s.mul(nr(s.zxy)).toVar(),n=nr(s.zxy.mul(nr(s))).toVar(),l=r.sub(i).add(fu).toVar(),o=r.sub(n).add(2*fu).toVar(),u=r.sub(1).add(3*fu).toVar(),d=ne(Da(r,r),Da(l,l),Da(o,o),Da(u,u)).toVar();d.assign(ne(.6).sub(d).max(0));let h=ne(Da(yu(a),r),Da(yu(a.add(i)),l),Da(yu(a.add(n)),o),Da(yu(a.add(1)),u)).toVar();return d.mulAssign(d),d.mulAssign(d),h.mulAssign(d),Da(h,ne(52))}).setLayout({name:"spe_simplexFast",type:"float",inputs:[{name:"p",type:"vec3"}]});function vu(e){return xu({p:e})}var bu=re(e=>{let t=e.m,a=gt(ae(-.37,.36,.85),ae(-.14,-.93,.34),ae(.92,.01,.4)),r=gt(ae(-.55,-.39,.74),ae(.33,-.91,-.24),ae(.77,.12,.63)),s=gt(ae(-.71,.52,-.47),ae(-.08,-.72,-.68),ae(-.7,-.45,.56));return vu(t.mul(a)).mul(.5333333).add(vu(t.mul(2).mul(r)).mul(.2666667)).add(vu(t.mul(4).mul(s)).mul(.1333333)).add(vu(t.mul(8)).mul(.0666667))}).setLayout({name:"spe_simplexFractal",type:"float",inputs:[{name:"m",type:"vec3"}]}),Tu=re(e=>{let t=e.x;return Kt(t.mul(34).add(1).mul(t),289)}).setLayout({name:"spe_permute",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function wu(e){return Tu({x:e})}var Su=re(e=>Ta(1.79284291400159,e.r.mul(.85373472095314))).setLayout({name:"spe_taylorInvSqrt",type:"vec4",inputs:[{name:"r",type:"vec4"}]});function Vu(e){return Su({r:e})}var Mu=re(e=>{let t=e.v,a=Y(1/6,1/3),r=ne(0,.5,1,2),s=R(t.add(Da(t,a.yyy))).toVar(),i=t.sub(s).add(Da(s,a.xxx)).toVar(),n=da(i.yzx,i.xyz).toVar(),l=nr(n).toVar(),o=Dt(n.xyz,l.zxy).toVar(),u=At(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(Kt(s,289));let c=wu(wu(wu(s.z.add(ne(0,o.z,u.z,1))).add(s.y).add(ne(0,o.y,u.y,1))).add(s.x).add(ne(0,o.x,u.x,1))).toVar(),p=r.wyz.mul(1/7).sub(r.xzx).toVar(),g=c.sub(R(c.mul(p.z).mul(p.z)).mul(49)).toVar(),f=R(g.mul(p.z)).toVar(),_=R(g.sub(f.mul(7))).toVar(),y=f.mul(p.x).add(p.yyyy).toVar(),x=_.mul(p.x).add(p.yyyy).toVar(),v=Ta(1,Ae(y)).sub(Ae(x)).toVar(),b=ne(y.xy,x.xy).toVar(),T=ne(y.zw,x.zw).toVar(),w=R(b).mul(2).add(1).toVar(),S=R(T).mul(2).add(1).toVar(),V=da(v,ne(0)).negate().toVar(),M=b.xzyw.add(w.xzyw.mul(V.xxyy)).toVar(),C=T.xzyw.add(S.xzyw.mul(V.zzww)).toVar(),z=ae(M.xy,v.x).toVar(),k=ae(M.zw,v.y).toVar(),A=ae(C.xy,v.z).toVar(),P=ae(C.zw,v.w).toVar(),E=Vu(ne(Da(z,z),Da(k,k),Da(A,A),Da(P,P))).toVar();z.mulAssign(E.x),k.mulAssign(E.y),A.mulAssign(E.z),P.mulAssign(E.w);let N=At(Ta(.6,ne(Da(i,i),Da(d,d),Da(h,h),Da(m,m))),0).toVar();return N.mulAssign(N),Da(N.mul(N),ne(Da(z,i),Da(k,d),Da(A,h),Da(P,m))).mul(42)}).setLayout({name:"spe_simplexAshima",type:"float",inputs:[{name:"v",type:"vec3"}]});function Cu(e){return Mu({v:e})}var Ru=re(e=>{let t=e.x;return t.sub(R(t.mul(1/289)).mul(289))}).setLayout({name:"spe_mod289",type:"vec4",inputs:[{name:"x",type:"vec4"}]}),zu=re(e=>{let t=e.x;return Ru({x:t.mul(34).add(1).mul(t)})}).setLayout({name:"spe_perm",type:"vec4",inputs:[{name:"x",type:"vec4"}]});function ku(e){return zu({x:e})}var Au=re(e=>{let t=e.p,a=R(t).toVar(),r=t.sub(a).toVar();r.assign(r.mul(r).mul(Ta(3,r.mul(2))));let s=a.xxyy.add(ne(0,1,0,1)).toVar(),i=ku(s.xyxy).toVar(),n=ku(i.xyxy.add(s.zzww)).toVar().add(a.zzzz).toVar(),l=ku(n).toVar(),o=ku(n.add(1)).toVar(),u=B(l.mul(1/41)).toVar(),d=B(o.mul(1/41)).toVar().mul(r.z).add(u.mul(nr(r.z))).toVar(),h=d.yw.mul(r.x).add(d.xz.mul(nr(r.x))).toVar();return h.y.mul(r.y).add(h.x.mul(nr(r.y)))}).setLayout({name:"spe_valueNoise",type:"float",inputs:[{name:"p",type:"vec3"}]}),Pu=re(e=>{let t=ae(e.x).toVar(),a=ir(0).toVar(),r=ir(.5).toVar(),s=ae(100).toVar();return he(5,()=>{a.addAssign(r.mul(function(e){return Au({p:e})}(t))),t.assign(t.mul(2).add(s)),r.mulAssign(.5)}),a}).setLayout({name:"spe_fbm",type:"float",inputs:[{name:"x",type:"vec3"}]}),Eu=re(e=>{let t=e.t;return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"spe_fade",type:"vec3",inputs:[{name:"t",type:"vec3"}]}),Nu=re(e=>{let t=e.P,a=R(t).toVar(),r=a.add(ae(1)).toVar();a.assign(Kt(a,289)),r.assign(Kt(r,289));let s=B(t).toVar(),i=s.sub(ae(1)).toVar(),n=ne(a.x,r.x,a.x,r.x).toVar(),l=ne(a.yy,r.yy).toVar(),o=ne(a.zzzz).toVar(),u=ne(r.zzzz).toVar(),d=wu(wu(n).add(l)).toVar(),h=wu(d.add(o)).toVar(),m=wu(d.add(u)).toVar(),c=h.div(7).toVar(),p=B(R(c).div(7)).sub(.5).toVar();c.assign(B(c));let g=ne(.5).sub(Ae(c)).sub(Ae(p)).toVar(),f=da(g,ne(0)).toVar();c.subAssign(f.mul(da(0,c).sub(.5))),p.subAssign(f.mul(da(0,p).sub(.5)));let _=m.div(7).toVar(),y=B(R(_).div(7)).sub(.5).toVar();_.assign(B(_));let x=ne(.5).sub(Ae(_)).sub(Ae(y)).toVar(),v=da(x,ne(0)).toVar();_.subAssign(v.mul(da(0,_).sub(.5))),y.subAssign(v.mul(da(0,y).sub(.5)));let b=ae(c.x,p.x,g.x).toVar(),T=ae(c.y,p.y,g.y).toVar(),w=ae(c.z,p.z,g.z).toVar(),S=ae(c.w,p.w,g.w).toVar(),V=ae(_.x,y.x,x.x).toVar(),M=ae(_.y,y.y,x.y).toVar(),C=ae(_.z,y.z,x.z).toVar(),z=ae(_.w,y.w,x.w).toVar(),k=Vu(ne(Da(b,b),Da(w,w),Da(T,T),Da(S,S))).toVar();b.mulAssign(k.x),w.mulAssign(k.y),T.mulAssign(k.z),S.mulAssign(k.w);let A=Vu(ne(Da(V,V),Da(C,C),Da(M,M),Da(z,z))).toVar();V.mulAssign(A.x),C.mulAssign(A.y),M.mulAssign(A.z),z.mulAssign(A.w);let P=Da(b,s).toVar(),E=Da(T,ae(i.x,s.yz)).toVar(),N=Da(w,ae(s.x,i.y,s.z)).toVar(),L=Da(S,ae(i.xy,s.z)).toVar(),I=Da(V,ae(s.xy,i.z)).toVar(),F=Da(M,ae(i.x,s.y,i.z)).toVar(),D=Da(C,ae(s.x,i.yz)).toVar(),U=Da(z,i).toVar(),O=function(e){return Eu({t:e})}(s).toVar(),G=qt(ne(P,E,N,L),ne(I,F,D,U),O.z).toVar(),q=qt(G.xy,G.zw,O.y).toVar();return qt(q.x,q.y,O.x).toVar().mul(2.2)}).setLayout({name:"spe_perlin",type:"float",inputs:[{name:"P",type:"vec3"}]});function Bu(e){return Nu({P:e})}var Lu=re(e=>{let t=B(e.p3.mul(.1031)).toVar();return t.addAssign(Da(t,t.yzx.add(33.33))),B(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_hashwithoutsine13",type:"float",inputs:[{name:"p3",type:"vec3"}]}),Iu=re(e=>{let t=B(e.p3.mul(ae(.1031,.103,.0973))).toVar();return t.addAssign(Da(t,t.yxz.add(33.33))),B(t.xxy.add(t.yxx).mul(t.zyx))}).setLayout({name:"spe_hashwithoutsine33",type:"vec3",inputs:[{name:"p3",type:"vec3"}]});function Fu(e){return Iu({p3:e})}var Du=re(e=>{let{a:t,b:a,k:r}=e,s=$t(0,1,a.sub(t).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(nr(s)).toVar();return qt(a,t,s).sub(i)}).setLayout({name:"spe_smin",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Uu(e,t,a){return Du({a:e,b:t,k:a})}var Ou=re(e=>{let{a:t,b:a,k:r}=e,s=$t(1,0,t.sub(a).mul(.5).div(r).add(.5)).toVar(),i=r.mul(s).mul(nr(s)).toVar();return qt(t,a,s).add(i)}).setLayout({name:"spe_smax",type:"float",inputs:[{name:"a",type:"float"},{name:"b",type:"float"},{name:"k",type:"float"}]});function Gu(e,t,a){return Ou({a:e,b:t,k:a})}var qu=re(e=>{let{value:t,input_min:a,input_max:r,output_min:s,output_max:i}=e,n=r.sub(a).toVar(),l=i.sub(s).toVar(),o=t.sub(a).div(n).toVar();return s.add(o.mul(l))}).setLayout({name:"spe_remap",type:"float",inputs:[{name:"value",type:"float"},{name:"input_min",type:"float"},{name:"input_max",type:"float"},{name:"output_min",type:"float"},{name:"output_max",type:"float"}]});function Wu(e,t,a,r,s){return qu({value:e,input_min:t,input_max:a,output_min:r,output_max:s})}var Hu=re(e=>{let{x:t,style:a,smoothness:r,seed:s,quality:i}=e,n=Ze(R(t)).toVar(),l=B(t).toVar(),o=ir(8).toVar(),u=ir(8).toVar(),d=ir(8).toVar(),h=ir(8).toVar(),m=ir(8).toVar(),c=ir(8).toVar(),p=Ze(0).toVar(),g=ae(0).toVar(),f=Re(i).toVar(),_=()=>({start:f.negate(),end:f,condition:"<=",type:"int"});gu(_(),_(),_(),({i:e,j:t,k:a})=>{let i=Ze(e,t,a).toVar(),d=ae(i).add(Fu(ae(n.add(i)).add(s))).sub(l).toVar(),m=et(d).toVar();o.assign(Uu(m,o,r)),le(m.lessThan(u),()=>{h.assign(u),u.assign(m),p.assign(Ze(e,t,a)),g.assign(d)}).ElseIf(m.lessThan(h),()=>{h.assign(m)})}),le(a.notEqual(Re(0)).and(a.notEqual(Re(5))).and(a.notEqual(Re(7))),()=>{gu(_(),_(),_(),({i:e,j:t,k:a})=>{let i=p.add(Ze(e,t,a)).toVar(),o=ae(i).add(Fu(ae(n.add(i)).add(s))).sub(l).toVar(),u=Da(g.add(o).mul(.5),o.sub(g)).toVar(),h=Da(g.add(o).mul(.5),Ya(o.sub(g))).toVar();m.assign(Uu(u,m,r)),c.assign(Dt(c,h));let f=Ze(e,t,a).toVar();le(De(pu(f,p)),()=>{let e=ae(f).add(Fu(ae(n.add(f)).add(s))).sub(l).toVar(),t=et(e).toVar();d.assign(Uu(t,d,r))})})});let y=ir(0).toVar();return le(a.equal(Re(0)),()=>{y.assign(o)}).ElseIf(a.equal(Re(1)),()=>{y.assign(d)}).ElseIf(a.equal(Re(2)),()=>{y.assign(d.sub(o))}).ElseIf(a.equal(Re(3)),()=>{let e=ir(3).toVar(),t=At(e.sub(Ae(u.sub(h))),0).div(e).toVar();y.assign(Dt(u,h).sub(t.mul(t).mul(e).mul(1/4)))}).ElseIf(a.equal(Re(4)),()=>{y.assign(Ka(m.mul(5)))}).ElseIf(a.equal(Re(5)),()=>{y.assign(ze(o,3))}).ElseIf(a.equal(Re(6)),()=>{let e=r.mul(.25).add(.0125).toVar(),t=ze(r,3).mul(.25).add(.0125).toVar();y.assign($t(e.sub(e.mul(t)),e.add(e.mul(t)),c))}).ElseIf(a.equal(Re(7)),()=>{y.assign(function(e){return Lu({p3:e})}(ae(n.add(p)).add(s)))}),y}).setLayout({name:"spe_voronoi",type:"float",inputs:[{name:"x",type:"vec3"},{name:"style",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"quality",type:"int"}]});function ju(e,t,a,r,s){return Hu({x:e,style:t,smoothness:a,seed:r,quality:s})}var Ku=[vu,function(e){return bu({m:e})},Cu,function(e){return Pu({x:e})},Bu],$u=e=>e,Xu=re(e=>{let t=e.v;return Ya(St(Ae(t.x).greaterThan(Ae(t.z)),ae(t.y.negate(),t.x,0),ae(0,t.z.negate(),t.y)))}).setLayout({name:"spe_displaceOrthogonal",type:"vec3",inputs:[{name:"v",type:"vec3"}]});function Qu(e,t,a,r){return e.add(t).mul(a).mul(.001).add(1e-4).add(r.mul(.1))}var Zu=new Map,Yu=re(e=>{let{n:t,scale:a,intensity:r,offset:s,movement:i,smoothness:n}=e,l=e.p,o=ir(ju(Qu(l,s,a,i),e.voronoiStyle,n,e.seed,e.quality)).toVar();return o.assign(Wu(o,e.lowCut,e.highCut,ir(0),ir(1))),o.assign(Gu(o,ir(0),n.mul(.25))),o.assign(Uu(o,ir(1),n.mul(.25))),l.add(t.mul(o).mul(r))}).setLayout({name:"spe_displaceVoronoi",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"},{name:"voronoiStyle",type:"int"},{name:"smoothness",type:"float"},{name:"seed",type:"float"},{name:"highCut",type:"float"},{name:"lowCut",type:"float"},{name:"quality",type:"int"}]});function Ju(e,t,a){let r=function(e,t){let a=Math.trunc(e.getValue("noiseType")??0),r={n:t,scale:e.getFloat("scale"),intensity:e.getFloat("intensity"),offset:e.getVec3("offset"),movement:e.getFloat("movement")};if(5===a)return t=>Yu({...r,p:t,voronoiStyle:e.getInt("voronoiStyle"),smoothness:e.getFloat("smoothness"),seed:e.getFloat("seed"),highCut:e.getFloat("highCut"),lowCut:e.getFloat("lowCut"),quality:e.getInt("quality")});let s=function(e){let t=Zu.get(e);if(void 0===t){let a=Ku[e]??Ku[0];t=re(e=>{let{n:t,scale:r,intensity:s,offset:i,movement:n}=e,l=e.p;return l.add(t.mul(a(Qu(l,i,r,n))).mul(s))}).setLayout({name:`spe_displaceScalar${e}`,type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"n",type:"vec3"},{name:"scale",type:"float"},{name:"intensity",type:"float"},{name:"offset",type:"vec3"},{name:"movement",type:"float"}]}),Zu.set(e,t)}return t}(a);return e=>s({...r,p:e})}(e,a),s=ae(r(t)).toVar(),i=ae(function(e){return Xu({v:e})}(a)).toVar(),n=Ya(ma(a,i)).toVar(),l=ae(r(t.add(i))).toVar(),o=ae(r(t.add(n))).toVar();return{position:s,normal:Ya(ma(l.sub(s),o.sub(s)))}}Ko("color",(e,t,a)=>{let r=t.alpha.mul(t.mask);return{color:e.getColor("color"),calpha:Io(r,a)}});var ed=e=>e,td=e=>e;Ko("depth",(e,t,a)=>{let r,s=e.get("colors"),i=e.get("steps"),n=(e.getValue("colors")??s.array).length,l=!0===e.getValue("smooth"),o=(e.getValue("isVector")??1)>.5,u=0===(e.getValue("gradientType")??0),d=(e.getValue("isWorldSpace")??0)>.5,h=e.getFloat("near"),m=e.getFloat("far");if(o){let t=e.getVec3("origin"),a=d?Ve:Ro;if(u){let s=Ya(e.getVec3("direction"));r=Da(s,a.sub(t))}else r=et(a.sub(t))}else r=et(Ve.sub(yt));let c=r.sub(h).div(m.sub(h)).toVar(),p=ne(s.element(0)).toVar();for(let e=1;e<n;e++){let t=ed(i.element(e-1)),a=ed(i.element(e)),r=Ft(c.sub(t).div(a.sub(t)),ir(0),ir(1)),n=l?$t(ir(0),ir(1),r):r;p.assign(qt(p,td(s.element(e)),n))}let g=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Lo(g,a,t.isMask)}}),Ko("cavity",(e,t,a)=>{let r=Ft(e.getFloat("ridge"),0,2),s=Ft(e.getFloat("valley"),0,2),i=w.normalViewRenderTarget,n=w.resolution,l=it("randomColor","vec3").x.toVar(),o=vt.toVar(),u=Y(ir(1).div(n.x),ir(1).div(n.y)).toVar(),d=(e,t)=>i.sample(o.add(Y(e,t)).toVar()).toVar(),h=d(ir(0),u.y.negate()),m=d(ir(0),u.y),c=d(u.x.negate(),ir(0)),p=d(u.x,ir(0)),g=e=>e.a.equal(l).and(Da(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=ir(.5).div(At(r.mul(r),ir(1e-4))).toVar(),x=ir(.7).div(At(s.mul(s),ir(1e-4))).toVar(),v=(e,t)=>St(e.lessThan(ir(.5).div(t)),e.mul(ir(1).sub(e.mul(t))),ir(.25).div(t)),b=St(f,St(_.greaterThan(0),v(_,y).mul(2),v(_.negate(),x).mul(-2)),ir(0)).toVar(),T=St(b.abs().lessThan(.001),ir(0),b).toVar(),S=ae(Ft(T.mul(.5).add(.5),0,1)),V=St(T.notEqual(0),ir(1),ir(0)),M=St(t.isMask,ir(1),V);return{color:S,calpha:Lo(t.alpha.mul(t.mask).mul(M),a,t.isMask)}}),Ko("dust",(e,t,a)=>{let r=e.getFloat("coverage"),s=e.getFloat("softness"),i=e.getFloat("noiseStrength"),n=e.getFloat("noiseScale"),l=Da(Ya($a),ae(0,1,0)),o=ir(0).toVar();le(i.notEqual(0),()=>{let e=vu(Ro.div(n).toVar().add(ae(1.7,9.2,1)));o.assign(e.mul(i))});let u=At(s,1e-4).toVar(),d=qt(u.add(1),u.add(1).negate(),Ft(r,0,1)).toVar(),h=$t(d.sub(u),d.add(u),l.add(o)).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Lo(h,a,t.isMask)}});var ad=(e,t)=>e.element(t);Ko("fresnel",(e,t,a)=>{let r=ad(Tt,2).w.equal(-1),s=ae(ad(kt,0).z,ad(kt,1).z,ad(kt,2).z).negate(),i=Ve.sub(yt),n=St(r,i,s),l=e.getFloat("bias").add(e.getFloat("scale").mul(ze(Ae(e.getFloat("factor").add(Da(Ya(n),Ya($a)))),e.getFloat("intensity")))),o=Ft(l,0,1).mul(t.alpha).mul(t.mask);return{color:e.getColor("color"),calpha:Lo(o,a,t.isMask)}});var rd=e=>e,sd=e=>e;Ko("gradient",(e,t,a)=>{let r=e.get("colors"),s=e.get("steps"),i=(e.getValue("colors")??r.array).length,n=(e.getValue("steps")??s.array).length,l=Math.min(10,i,n),o=e.getInt("gradientType"),u=e.getBool("smooth"),d=e.getVec2("offset"),h=e.getVec2("morph"),m=e.getFloat("angle"),c=U(),p=ne(r.element(0)).toVar(),g=Y(h.div(c)).toVar(),f=Y(ir(.5).add(g.x),g.y).toVar(),_=Y(oa(m).mul(f.x).sub(Wt(m).mul(f.y)),Wt(m).mul(f.x).add(oa(m).mul(f.y))).toVar(),y=Y(c.sub(.5).add(d).div(2).add(_.div(2))),x=ir(Da(y,_).div(Da(_,_))).toVar();le(o.equal(Re(1)),()=>{x.assign(Ba(c.add(h).mul(3),c.add(d).add(1)).add(m))}).ElseIf(o.equal(Re(2)),()=>{let e=We(c.x.add(h.x).sub(.5).add(d.x),c.y.add(h.y).sub(.5).add(d.y)).mul(-1);x.assign(B(m.div(xe).div(-2).add(e.div(xe).mul(.5))))});for(let e=1;e<l;e++){let t=rd(s.element(e-1)),a=rd(s.element(e)),i=Ft(x.sub(t).div(a.sub(t)),ir(0),ir(1)),n=rd(St(u,$t(ir(0),ir(1),i),i));p.assign(qt(p,sd(r.element(e)),n))}let v=t.alpha.mul(p.a).mul(t.mask);return{color:p.rgb,calpha:Lo(v,a,t.isMask)}}),Ko("matcap",(e,t,a)=>{let r=e.getFloat("rotation"),s=Ya(_e.negate()),i=Ya(ae(s.z,0,s.x.negate())),n=ma(s,i),l=Y(Da(i,Wa),Da(n,Wa)),o=oa(r),u=Wt(r),d=Y(o.mul(l.x).sub(u.mul(l.y)),u.mul(l.x).add(o.mul(l.y))).mul(.495).add(.5),h=e.get("texture").sample(d),m=t.alpha.mul(t.mask);return{color:h.rgb,calpha:Lo(m,a,t.isMask)}}),Ko("noise",(e,t,a)=>{try{if("0"===new URLSearchParams(window.location.search).get("dbgnoise"))return{color:ae(0),calpha:ir(0)}}catch{}let r=Math.trunc(e.getValue("noiseType")??0),s=ir(At(Ae(e.getFloat("scale")),.001)).toVar(),i=ae(Ro.div(e.getVec3("size"))).toVar();i.divAssign(s);let n=e.getFloat("move"),l=e.getVec4("colorA"),o=e.getVec4("colorC"),u=ne(0).toVar();if(5===r){let t=e.getFloat("smoothness"),a=ir(ju(i.add(n),e.getInt("voronoiStyle"),t,e.getFloat("seed"),e.getInt("quality"))).toVar();a.assign(Wu(a,e.getFloat("lowCut"),e.getFloat("highCut"),ir(0),ir(1))),a.assign(Gu(a,ir(0),t.mul(.25))),a.assign(Uu(a,ir(1),t.mul(.25))),u.assign(qt(l,o,a))}else{let t=Ku[r]??Ku[0],a=e.getVec4("colorB"),s=e.getVec4("colorD"),d=ae(e.getVec2("distortion"),1).toVar(),h=ae(e.getVec2("fA"),1).toVar(),m=ae(e.getVec2("fB"),1).toVar(),c=ae(t(i),t(i.add(ae(1))),t(i.add(ae(1)))).toVar(),p=ae(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=ir(t(i.add(p))).toVar();u.assign(qt(l,a,Ft(g.mul(g).mul(4),ir(0),ir(1)))),u.assign(qt(u,o,Ft(et(c),ir(0),ir(1)))),u.assign(qt(u,s,Ft(et(p.x),ir(0),ir(1))))}let d=t.alpha.mul(u.a).mul(t.mask);return{color:Ft(u,ir(0),ir(1)).rgb,calpha:Lo(d,a,t.isMask)}}),Ko("normal",(e,t,a)=>({color:D(Ya(Wa)).mul(da(ae(.5),e.getVec3("cnormal"))),calpha:Io(t.alpha.mul(t.mask),a)}));var id=2*Math.PI,nd=Math.PI/180,ld=re(e=>{let t=B(e.p.xyx.mul(.1031)).toVar();return t.addAssign(Da(t,t.yzx.add(33.33))),B(t.x.add(t.y).mul(t.z))}).setLayout({name:"spe_pattern_hash12",type:"float",inputs:[{name:"p",type:"vec2"}]});function od(e){return ld({p:e})}var ud=re(e=>{let t=e.uv,a=.5,r=ir(e.a.mul(nd)).toVar(),s=Y(oa(r).mul(t.x.sub(a)).add(Wt(r).mul(t.y.sub(a))).add(a),oa(r).mul(t.y.sub(a)).sub(Wt(r).mul(t.x.sub(a))).add(a));return B(s)}).setLayout({name:"spe_pattern_rotate_uv",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"a",type:"float"}]});function dd(e,t){return ud({uv:e,a:t})}var hd=re(e=>{let t=Y(e.uv.mul(e.frequency)).toVar(),a=Y(R(t)).toVar(),r=ir(Kt(a.y,2)).toVar();t.x.addAssign(r.mul(e.zigzag));let s=Y(B(t)).toVar();s.assign(s.mul(2).sub(1)),a.assign(R(t));let i=ir(od(a).mul(5).add(1)).toVar(),n=ir(qt(ir(1),i,e.variation)).toVar();return s.mulAssign(n),s}).setLayout({name:"spe_pattern_tile_and_center",type:"vec2",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"variation",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function md(e,t,a,r,s){return hd({uv:e,frequency:t,variation:a,zigzag:r,rotation:s})}var cd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,et(t).sub(e.size))}).setLayout({name:"spe_pattern_circle",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),pd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar(),a=ir(et(t)).toVar(),r=ir($t(e.smoothness.negate(),e.smoothness,a.sub(e.size))).toVar(),s=ir($t(e.smoothness.negate(),e.smoothness,a.sub(e.size.mul(.5)))).toVar();return r.add(nr(s))}).setLayout({name:"spe_pattern_ring",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),gd=re(e=>{let t=ir(ir(id).div(ir(e.n))).toVar(),a=ir(e.r.mul(ka(t.mul(.5)))).toVar(),r=Y(e.p.yx.negate()).toVar(),s=ir(t.mul(R(We(r.y,r.x).add(t.mul(.5)).div(t)))).toVar(),i=Y(oa(s),Wt(s)).toVar();return r.assign(Y(i.x.mul(r.x).add(i.y.mul(r.y)),i.y.negate().mul(r.x).add(i.x.mul(r.y)))),et(r.sub(Y(e.r,Ft(r.y,a.negate(),a)))).mul(Ut(r.x.sub(e.r)))}).setLayout({name:"spe_pattern_sdf_ngon",type:"float",inputs:[{name:"p",type:"vec2"},{name:"r",type:"float"},{name:"n",type:"int"}]}),fd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,gd({p:t,r:e.size,n:e.sides}))}).setLayout({name:"spe_pattern_polygon",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"},{name:"sides",type:"int"}]}),_d=re(e=>{let t=e.b,a=Y(Ae(e.p)).toVar();a.assign(St(a.y.greaterThan(a.x),a.yx,a.xy));let r=Y(a.sub(t)).toVar(),s=ir(At(r.y,r.x)).toVar(),i=Y(St(s.greaterThan(0),r,Y(t.y.sub(a.x),s.negate()))).toVar();return Ut(s).mul(et(At(i,Y(0)))).add(e.r)}).setLayout({name:"spe_pattern_sdf_cross",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"},{name:"r",type:"float"}]}),yd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,_d({p:t,b:Y(e.size,e.size.mul(.25)),r:e.smoothness}))}).setLayout({name:"spe_pattern_xcross",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),xd=re(e=>{let t=e.b,a=Y(Ae(e.p)).toVar(),r=Y(t.sub(a.mul(2))).toVar(),s=r.x.mul(t.x).sub(r.y.mul(t.y)),i=ir(Ft(s.div(Da(t,t)),ir(-1),ir(1))).toVar();return ir(et(a.sub(t.mul(.5).mul(Y(nr(i),i.add(1)))))).toVar().mul(Ut(a.x.mul(t.y).add(a.y.mul(t.x)).sub(t.x.mul(t.y))))}).setLayout({name:"spe_pattern_sdf_diamond",type:"float",inputs:[{name:"p",type:"vec2"},{name:"b",type:"vec2"}]}),vd=re(e=>{let t=Y(md(e.uv,e.frequency,e.variation,e.zigzag,e.rotation)).toVar();return $t(e.smoothness.negate(),e.smoothness,xd({p:t,b:Y(e.size)}))}).setLayout({name:"spe_pattern_diamond",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),bd=re(e=>{let t=Y(e.uv.mul(e.frequency)).toVar(),a=Y(R(t)).toVar(),r=ir(Kt(a.y,2)).toVar();t.x.addAssign(r.add(e.zigzag.mul(r)));let s=ir(R(t.x)).toVar();return Kt(s,2)}).setLayout({name:"spe_pattern_checkerboard",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),Td=re(e=>{let t=Y(md(e.uv,e.frequency,ir(0),e.zigzag,e.rotation)).toVar(),a=ir(R(e.uv.mul(e.frequency)).y).toVar(),r=ir(od(Y(a))).toVar(),s=ir(qt(e.size,e.size.mul(r),e.variation)).toVar();return $t(s.sub(e.smoothness),s.add(e.smoothness),Ae(t.y))}).setLayout({name:"spe_pattern_line",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]}),wd=re(e=>{let{a:t,b:a,c:r,d:s}=e,i=Y(e.p.sub(Y(s,t)).mul(r)).toVar();i.x.assign(Kt(i.x,id)),le(i.x.greaterThan(Math.PI),()=>{i.x.assign(ir(id).sub(i.x))});let n=ir(0).toVar(),l=ir(id).toVar();he(24,()=>{let e=ir(n.add(l).mul(.5)).toVar(),t=ir(e.sub(i.x).add(a.mul(r).mul(Wt(e)).mul(i.y.sub(a.mul(r).mul(oa(e)))))).toVar();le(t.lessThan(0),()=>{n.assign(e)}).Else(()=>{l.assign(e)})});let o=ir(n.add(l).mul(.5)).toVar(),u=Y(o,a.mul(r).mul(oa(o))).toVar();return et(i.sub(u)).div(r)}).setLayout({name:"spe_pattern_udf_cos",type:"float",inputs:[{name:"p",type:"vec2"},{name:"a",type:"float"},{name:"b",type:"float"},{name:"c",type:"float"},{name:"d",type:"float"}]}),Sd=re(e=>{let t=ir(e.frequency.x).toVar(),a=Y(e.uv.mul(t)).toVar(),r=Y(R(a)).toVar(),s=ir(Kt(r.y,2)).toVar();a.x.addAssign(s.mul(e.zigzag));let i=Y(a.x,B(a.y)).toVar(),n=ir(e.frequency.y.mul(.1)).toVar(),l=ir(wd({p:i,a:ir(.5),b:ir(.125),c:n.mul(id),d:ir(0)})).toVar(),o=ir(od(Y(r.y))).toVar(),u=ir(qt(e.size,e.size.mul(o),e.variation)).toVar();return $t(e.smoothness.negate(),e.smoothness,l.sub(u.mul(.5)))}).setLayout({name:"spe_pattern_wave",type:"float",inputs:[{name:"uv",type:"vec2"},{name:"frequency",type:"vec2"},{name:"size",type:"float"},{name:"variation",type:"float"},{name:"smoothness",type:"float"},{name:"zigzag",type:"float"},{name:"rotation",type:"float"}]});function Vd(e,t){let a={uv:t.uv,frequency:t.frequency,size:t.size,variation:t.variation,smoothness:t.smoothness,zigzag:t.zigzag,rotation:t.rotation};switch(e){case 1:return pd(a);case 2:return fd({...a,sides:t.sides});case 3:return yd(a);case 4:return vd(a);case 5:return bd(a);case 6:return Td(a);case 7:return Sd(a);default:return cd(a)}}Ko("pattern",(e,t,a)=>{let r,s,i=e.getValue("style")??0,n=e.getValue("projection")??0,l=e.getValue("axis")??0,o=e.getFloat("blending"),u=e.getVec2("offset"),d=e.getVec4("colorA"),h=e.getVec4("colorB"),m=e.getVec2("frequency"),c=e.getFloat("size"),p=e.getFloat("variation"),g=e.getFloat("smoothness"),f=e.getFloat("zigzag"),_=e.getFloat("rotation"),y=e.getVec2("vertical"),x=e.getVec2("horizontal"),v=e.getInt("sides"),b={frequency:m,size:c,variation:p,smoothness:ir(ze(g,5)).toVar(),zigzag:f,rotation:_,sides:v};if(4===n){let e=ae(Ro).toVar(),t=ir(.0125).toVar(),a=Y(B(e.xy.mul(t))).toVar(),n=Y(B(e.zy.mul(t))).toVar(),l=Y(B(e.xz.mul(t))).toVar();a.assign(dd(a.add(u),_)),n.assign(dd(n.add(u),_)),l.assign(dd(l.add(u),_));let d=ir(Vd(i,{uv:a,...b})).toVar(),h=ir(Vd(i,{uv:n,...b})).toVar(),m=ir(Vd(i,{uv:l,...b})).toVar(),c=ir(nr(o).mul(125).add(3)).toVar(),p=ae(zo).toVar(),g=ae(Ae(Ya(p))).toVar();g.assign(ze(g,ae(c))),g.divAssign(Da(g,ae(1))),d.mulAssign(g.z),h.mulAssign(g.x),m.mulAssign(g.y),r=ir(d.add(h).add(m)).toVar(),s=Y(a.mul(g.z).add(n.mul(g.x)).add(l.mul(g.y))).toVar()}else{let e=Y(0).toVar();if(0===n)e.assign(U());else if(2===n){let t,a,r=ae(Ro).toVar(),s=ir(et(r)).toVar();0===l?(t=ir(We(r.y,r.z)).toVar(),a=ir(Be(r.x.div(s))).toVar()):1===l?(t=ir(We(r.x,r.z)).toVar(),a=ir(Be(r.y.div(s))).toVar()):(t=ir(We(r.y,r.x)).toVar(),a=ir(Be(r.z.div(s))).toVar()),e.assign(Y(t,a).div(Math.PI))}e.addAssign(u),e.assign(B(e)),e.assign(dd(e,_)),r=Vd(i,{uv:e,...b}),s=e}let T=ne(qt(d,h,r)).toVar();T.a.assign(Ft(T.a,ir(0),ir(1))),T.a.mulAssign(da(y.x,s.y).mul(da(s.y,y.y))),T.a.mulAssign(da(x.x,Ae(s.x)).mul(da(Ae(s.x),x.y)));let w=t.alpha.mul(Ft(T.a,ir(0),ir(1))).mul(t.mask);return{color:Ft(T,ne(0),ne(1)).rgb,calpha:Lo(w,a,t.isMask)}});var Md=(e,t)=>e.element(t);Ko("rainbow",(e,t,a)=>{let r=e.getFloat("filmThickness"),s=e.getFloat("movement"),i=e.getVec3("wavelengths"),n=e.getFloat("noiseStrength"),l=e.getFloat("noiseScale"),o=e.getVec3("offset"),u=ir(0).toVar();!1!==t.noiseCompiledIn&&le(n.notEqual(0),()=>{let e=Ro.div(l).toVar(),t=vu(e.mul(1.6).add(ae(1.8,1.5,1.9).mul(vu(e))).add(ae(1.7,9.2,1)));u.assign(t.mul(n))});let d=i.mul(ae(1,.8,.6)).add(1),h=Md(Tt,2).w.equal(-1),m=ae(Md(kt,0).z,Md(kt,1).z,Md(kt,2).z).negate(),c=Ve.sub(yt),p=St(h,c,m),g=Da(Ya(p.add(o.mul(-.001))),Ya($a)),f=oa(r.add(u).div(d).mul(g).add(s)).mul(.5).add(.5),_=ae(Ft(f,0,2)).toVar(),y=Ft(_.r.add(_.g).add(_.b),0,1);return{color:_,calpha:Lo(t.alpha.mul(y).mul(t.mask),a,t.isMask)}});var Cd=e=>e,Rd=e=>e,zd=he,kd=he,Ad=re(e=>{let t=e.x,a=ae(Da(t,ae(127.1,311.7,74.7)),Da(t,ae(269.5,183.3,246.1)),Da(t,ae(113.5,271.9,124.6)));return B(Wt(a).mul(43758.5453123))}).setLayout({name:"spe_toonHash3",type:"vec3",inputs:[{name:"x",type:"vec3"}]}),Pd=re(e=>{let t=e.x,a=R(t).toVar(),r=B(t).toVar(),s=ir(100).toVar(),i=()=>({start:Re(-1),end:Re(1),condition:"<=",type:"int"});return kd(i(),i(),i(),({i:e,j:t,k:i})=>{let n=ae(e,t,i).toVar(),l=n.sub(r).add(function(e){return Ad({x:e})}(a.add(n))).toVar(),o=Da(l,l).toVar();le(o.lessThan(s),()=>{s.assign(o)})}),s.sqrt()}).setLayout({name:"spe_toonVoronoiF1",type:"float",inputs:[{name:"x",type:"vec3"}]});Ko("toon",(e,t,a)=>{let r=e.getInt("positioning"),s=e.get("colors"),i=e.get("steps"),n=e.getVec3("source"),l=e.getBool("isWorldSpace"),o=e.getFloat("noiseStrength"),u=e.getFloat("noiseScale"),d=e.getVec4("shadowColor"),h=e.getVec3("offset"),m=Ya($a).toVar(),c=ir(0).toVar();!0===a.lightsAvailable&&le(r.equal(Re(0)),()=>{zd({start:Re(0),end:w.toonLightCount,condition:"<",type:"int"},({i:e})=>{let t=w.toonLightData.element(e).toVar(),a=t.xyz,r=t.w,s=St(r.greaterThan(.5),Ya(a),Ya(a.sub(Ve))),i=Da(s,m).mul(.5).add(.5);c.assign(At(c,i))}),c.assign(Ft(c,0,1))}),le(r.equal(Re(1)),()=>{let e=qt(Ro,Ve,St(l,ir(1),ir(0))),t=Ya(n.sub(e));c.assign(Da(t,m).mul(.5).add(.5))}).ElseIf(r.equal(Re(2)),()=>{let e=yt.sub(h),t=Ya(e.sub(Ve));c.assign(Da(t,m).mul(.5).add(.5))}),le(o.greaterThan(0),()=>{let e=Ro.div(u),t=ir(1).sub(Pd({x:e}));c.addAssign(t.mul(o))}),c.assign(Ft(c,0,1));let p=(e.getValue("colors")??s.array).length,g=(e.getValue("steps")??i.array).length,f=Math.min(10,p,g),_=ne(s.element(0)).toVar();for(let e=1;e<f;e++){let t=Cd(i.element(e-1)),a=Cd(i.element(e)),r=Ft(c.sub(t).div(a.sub(t)),ir(0),ir(1));_.assign(qt(_,Rd(s.element(e)),$t(0,1,r)))}!0===a.lightsAvailable&&le(r.equal(Re(0)),()=>{let e=ir(1),t=qt(_.rgb,d.rgb,d.a);_.rgb.assign(qt(t,_.rgb,e))});let y=t.alpha.mul(_.a).mul(t.mask);return{color:_.rgb,calpha:Io(y,a)}});var Ed=e=>e,Nd=e=>e,Bd=e=>e,Ld=e=>e;Ko("transmission",(e,t,a)=>{let r=e.getFloat("thickness"),s=e.getFloat("ior"),i=e.getFloat("roughness"),n=w.transmissionRenderTarget,l=w.transmissionSamplerSize,o=e=>((e,t)=>kt.element(t))(0,e),u=Ya(ae(o(0).z.negate(),o(1).z.negate(),o(2).z.negate())),d=Ya(Ve.sub(yt)),h=w.orthographicUniform,m=St(h.greaterThan(.5),u,d).toVar(),c=Ya($a).toVar(),p=tt(m,c,ir(1).div(s)).toVar(),g=Ya(p).mul(r).mul(ko).toVar(),f=e=>{let t=w.unjitteredProjection.mul(kt).mul(ne(e,1)),a=t.xy.div(t.w);return Y(a.x.mul(.5).add(.5),a.y.mul(-.5).add(.5))},_=f(Ve.add(g).toVar()).toVar(),y=(f(Ve).toVar(),i.mul(Ft(s.mul(2).sub(2),ir(0),ir(1))).toVar()),x=mt(l.x).mul(y).toVar(),v=y,b=Dt(x.div(5.5),ir(8.5)).toVar(),T=null,S="fit",V=!0,M=!1,C=12,z="white",k=1;try{let e=new URLSearchParams(window.location.search),t=e.get("dbglod");null!==t&&(T=Number(t));let a=e.get("dbgtap");"ring"===a&&(S="ring"),("single"===a||"1"===a)&&(S="single"),("r50"===a||"r75"===a||"full"===a)&&(S=a),"singlewide"===a&&(S="singlewide"),("fit"===a||"singlefit"===a)&&(S="fit");let r=e.get("dbgwidth");null!==r&&Number.isFinite(Number(r))&&(k=Math.max(0,Number(r))),"6"===a&&(S="ring",C=6),"0"===e.get("dbgwarp")&&(V=!1),"1"===e.get("dbgdither")&&(M=!0);let s=e.get("dbgangle");("classic"===s||"0"===s)&&(z=s)}catch{}null!==T&&Number.isFinite(T)&&b.assign(ir(T));let A,P=(()=>{if("singlewide"===S)return Dt(b.add(1),ir(8.5)).toVar();if("fit"!==S)return b;let e=w.transmissionActualSize.x.div(w.resolution.x),t=v.mul(b).mul(5*k).mul(e).toVar();return Dt(mt(Za(b.mul(2)).add(t.mul(t).mul(3))).mul(.5),ir(8.5)).toVar()})(),E=e=>n.sample(V?(e=>{let t=w.transmissionActualSize.div(Za(R(P))),a=e.mul(t).sub(.5),r=R(a),s=a.sub(r),i=s.mul(s).mul(Y(3,3).sub(s.mul(2)));return r.add(.5).add(i).div(t)})(e):e).level(P).rgb,N="r50"===S?.5:"r75"===S?.75:1;if("single"===S||"singlewide"===S||"fit"===S)if("fit"===S){let e=R(P).toVar(),t=P.sub(e).toVar(),a=na(Za(t.mul(2)).sub(1)).mul(1.1547).toVar(),r=Y(Za(e)).div(w.transmissionActualSize).mul(a).toVar(),s=ae(0).toVar(),i=12;for(let t=0;t<i;t++){let a=Nd(Q(t,i,ir(0))),l=Nd(_.add(a.mul(r)));s.addAssign(Bd(Ld(n.sample(l).level(e)).rgb))}A=s.div(i).toVar()}else A=E(_).toVar();else{let e=Y(ir(1).div(w.resolution.x),ir(1).div(w.resolution.y)).toVar(),t=j("classic"===z?ft.xy.add(w.cameraJitterPx):ft.xy).mul(6.28318530718);"white"===z&&(t=t.add(w.tapAngle));let a=t.toVar(),r=w.tapAngle.mul(13.7).toVar(),s=w.tapAngle2.mul(5.3).toVar(),i=Y(Za(R(P).add(1))).div(w.transmissionActualSize).toVar(),n=j(ft.xy.add(Y(r,s))).toVar(),l=j(ft.xy.add(Y(s.mul(1.71),r.mul(2.39)))).toVar(),o=ae(0).toVar();for(let t=0;t<C;t++){let r=Nd(Q(t,C,a)).mul(e).mul(v).mul(b.mul(10)).mul(N),s=Nd(_.add(r));if(M){let e=Ed(B(n.add(.7548776662*t))),a=Ed(B(l.add(.5698402911*t))),r=Nd(Y(e.sub(.5),a.sub(.5)).mul(i));s=Nd(s.add(r))}o.addAssign(E(s))}A=o.div(C).toVar()}if(e.has("attenuationDistance")){let t=e.getFloat("attenuationDistance"),a=ae(e.getColor("attenuationColor")).toVar();le(t.greaterThan(0),()=>{let e=ze(At(a,ae(1e-4)),ae(r.div(t)));A.mulAssign(e)})}let L=t.alpha.mul(t.mask).toVar(),I=L.div(Ft(L.add(a.accumAlpha),ir(1e-5),ir(1))).toVar();return a.accumAlpha.addAssign(ir(1).sub(a.accumAlpha).mul(t.alpha)),{color:A,calpha:I}}),Ko("reflection",(e,t,a)=>{let r=e.getFloat("blur"),s=e.getFloat("thickness"),i=e.getInt("steps"),n=e.getFloat("stepSize"),l=e.getValue("tracingMode")??0,o=w.reflectionRenderTarget,u=w.reflectionDepthPyramid,d=w.reflectionDepthPyramid,h=w.reflectionDepthLevels,m=w.reflectionEnvMap,c=w.reflectionPlanarTarget,p=w.reflectionPlanarEnabled,g=L("__splinePlanarMirror","float"),f=p.greaterThan(.5).and(g.greaterThan(.5)),_=w.reflectionResolveTarget,y=w.reflectionResolveEnabled,x=w.orthographicUniform.greaterThan(.5),v=St(x,ae(0,0,-1),Ya(_e)).toVar(),b=Ya(Wa).toVar(),T=Ye(v,b).toVar(),S=Ft(r.mul(.1),ir(0),ir(1)).toVar(),V=w.resolution,M=ae(0).toVar(),C=y.greaterThan(.5).and(S.greaterThan(.05)).and(f.not()),R=Ya(Xa(T,Nt)).toVar(),z=Ui(m,R,S).toVar(),k=_.sample(vt).level(ir(0)).toVar();le(C,()=>{let e=k.a.toVar();M.assign(qt(z,k.rgb.div(e.max(1e-4)),Ft(e.mul(2),ir(0),ir(1))))}).Else(()=>{M.assign(Oi({dials:{blur:r,thickness:s,steps:i,stepSize:n,tracingMode:l},surface:{originView:_e,normalV:b,screenUv:vt,fragWindowZ:Ra},camera:{projectionMatrix:Tt,projectionMatrixInverse:Mt,worldMatrix:Nt,near:pt},resources:{colorMap:o,depthPyramid:u,depthPyramidNode:d,envMap:m},usePlanar:f,noisePixel:vt.mul(V).floor()}))}),le(f,()=>{let e=Y(ir(1).sub(vt.x),vt.y).toVar(),t=ir(h.sub(1)),a=Dt(mt(S.mul(V.y).mul(.075).add(1)),t).toVar(),r=a.sub(1).max(0).floor().toVar(),s=ir(2).pow(a).sub(1).max(0).toVar(),i=s.mul(.75).div(V.y).toVar();M.assign(Fi(c,e,i,s.mul(.75),r))});let A=t.alpha.mul(t.mask).toVar(),P=A.div(Ft(A.add(a.accumAlpha),ir(1e-5),ir(1))).toVar();return a.accumAlpha.addAssign(ir(1).sub(a.accumAlpha).mul(A)),{color:M,calpha:P}});var Id=e=>e,Fd=e=>e;function Dd(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=Ir[e.type];if(void 0!==r)for(let e of r)a.push(`${e}=${String(t[e])}`)}for(let[t,r]of e.uniformKinds)("vec4array"===r||"floatArray"===r)&&a.push(`${t}#${(e.params.getValue(t)??[]).length}`);if("rainbow"===e.type&&a.push(`noise=${!1!==e.noiseCompiledIn}`,`forced=${!0===e.noiseForced}`),"displace"===e.type&&a.push(`dt=${String(t.displacementType)}`),"texture"===e.type||"video"===e.type||"matcap"===e.type){if(0===e.holders.length)throw new Error(`structuralKey: ${e.type} layer has no holder`);let r=t.texture??{};a.push(`holder=${e.holders.map(e=>e.instanceId).join(",")}`,`wrap=${String(r.wrapping)}`,`min=${String(r.minFilter)}`,`mag=${String(r.magFilter)}`)}return a.join(";")}Ko("outline",(e,t,a)=>{let r=e.getColor("outlineColor"),s=e.getColor("contourColor"),i=e.getFloat("outlineWidth"),n=e.getFloat("contourWidth"),l=e.getFloat("outlineThreshold"),o=e.getFloat("contourThreshold"),u=e.getFloat("outlineSmoothing"),d=e.getFloat("contourFrequency"),h=e.getVec3("contourDirection"),m=e.getBool("positionalLines"),c=e.getBool("compensation"),p=w.normalRenderTarget,g=w.normalRenderTargetDepth,f=w.resolution,_=w.pixelRatio,y=it("randomColor","vec3").x.toVar(),x=Ra.toVar(),v=vt.toVar(),b=Y(ir(1).div(f.x),ir(1).div(f.y)).toVar(),T=w.pcssHalton,S=j(ft.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]],R=e=>Q(e,9,S).mul(b),z=[],k=ir(0).toVar();for(let e=0;e<9;e++){let[t,a]=C[e],r=4===e?v:Id(v.add(Y(M.x.mul(t),M.y.mul(a))).add(R(e))),s=Id(r).toVar(),i=Fd(p.sample(s)).toVar();z.push(i),le(i.a.notEqual(y).and(i.a.notEqual(0)),()=>{let e=g.sample(s).r.add(1e-4);le(x.greaterThan(e),()=>{k.assign(1)})})}let A=z[2].rgb.add(z[5].rgb.mul(2)).add(z[8].rgb).sub(z[0].rgb.add(z[3].rgb.mul(2)).add(z[6].rgb)),P=z[0].rgb.add(z[1].rgb.mul(2)).add(z[2].rgb).sub(z[6].rgb.add(z[7].rgb.mul(2)).add(z[8].rgb)),E=na(Da(A,A).add(Da(P,P))).mul(k.oneMinus()).toVar(),N=ae(r).toVar(),L=$t(l.sub(u),l.add(u),E).toVar(),I=Ya($a).toVar(),F=ir(1).sub(o).toVar();le(m,()=>{let e=Ro.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=B(t.mul(d).mul(.01)),r=G(t.mul(d)),i=$t(r.mul(n.mul(.01)),r.mul(n.mul(.02)),a).toVar();le(i.lessThan(1).and(L.equal(0)),()=>{N.assign(s),L.assign(1)})}).Else(()=>{let e=I.mul(h),t=e.x.add(e.y).add(e.z).toVar(),a=G(t.mul(o)).toVar(),r=Wt(t.mul(d)).toVar(),i=$t(ir(0),a.mul(n),ir(1).sub(r)).toVar();le(a.greaterThan(F.mul(.5)).and(i.lessThan(1)).and(L.equal(0)),()=>{N.assign(s),L.assign(ir(1).sub(i))})});let D=t.alpha.mul(L).mul(t.mask).toVar(),U=D.div(Ft(D.add(a.accumAlpha),ir(1e-5),ir(1))).toVar();return a.accumAlpha.addAssign(ir(1).sub(a.accumAlpha).mul(D)),{color:N,calpha:U}}),Ko("vertexColor",(e,t,a)=>{let r=pe(),s=t.alpha.mul(t.mask).mul(r.a);return{color:r.rgb,calpha:Io(s,a)}});var Ud=e=>e,Od=e=>e;function Gd(e,t=1){let a=new Ss(e);return new Dr(a.r,a.g,a.b,t)}function qd(e,t){if(e instanceof Dr)return e;if(e instanceof Ss)return new Dr(e.r,e.g,e.b,1);if("number"==typeof e)return Gd(e);if("object"==typeof e&&null!==e&&"r"in e&&"g"in e&&"b"in e){let t=e;return new Dr(t.r,t.g,t.b,t.a??1)}return t()}function Wd(){let e=new Array(10).fill(new _s(0,0,0,1)).map(e=>e.clone());return e[1]=new _s(1,1,1,1),e}function Hd(){let e=new Array(10).fill(1);return e[0]=0,e}var jd={color:{color:{kind:"color",def:()=>Gd(Qr)}},vertexColor:{},cavity:{ridge:{kind:"float",def:()=>1},valley:{kind:"float",def:()=>1}},fresnel:{color:{kind:"color",def:()=>Gd(16777215)},bias:{kind:"float",def:()=>.1},scale:{kind:"float",def:()=>1},intensity:{kind:"float",def:()=>2},factor:{kind:"float",def:()=>1}},dust:{color:{kind:"color",def:()=>Gd(10323813)},coverage:{kind:"float",def:()=>.2},softness:{kind:"float",def:()=>.2},noiseStrength:{kind:"float",def:()=>.2},noiseScale:{kind:"float",def:()=>1}},rainbow:{filmThickness:{kind:"float",def:()=>30},movement:{kind:"float",def:()=>0},wavelengths:{kind:"vec3",def:()=>new ds},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},offset:{kind:"vec3",def:()=>new ds}},transmission:{thickness:{kind:"float",def:()=>10},ior:{kind:"float",def:()=>1.5},roughness:{kind:"float",def:()=>.5},attenuationColor:{kind:"color",def:()=>Gd(16777215)},attenuationDistance:{kind:"float",def:()=>0}},reflection:{blur:{kind:"float",def:()=>0},thickness:{kind:"float",def:()=>.001},steps:{kind:"int",def:()=>60},stepSize:{kind:"float",def:()=>.005},tracingMode:{kind:"int",def:()=>1}},toon:{positioning:{kind:"int",def:()=>0},colors:{kind:"vec4array",def:Wd},steps:{kind:"floatArray",def:Hd},source:{kind:"vec3",def:()=>new ds},isWorldSpace:{kind:"bool",def:()=>!0},noiseStrength:{kind:"float",def:()=>0},noiseScale:{kind:"float",def:()=>1},shadowColor:{kind:"colorVec4",def:()=>new Dr(0,0,0,0)},offset:{kind:"vec3",def:()=>new ds}},outline:{outlineColor:{kind:"color",def:()=>Gd(16777215)},contourColor:{kind:"color",def:()=>Gd(16777215)},outlineWidth:{kind:"float",def:()=>.1},contourWidth:{kind:"float",def:()=>.1},outlineThreshold:{kind:"float",def:()=>.1},contourThreshold:{kind:"float",def:()=>.1},outlineSmoothing:{kind:"float",def:()=>.1},contourFrequency:{kind:"float",def:()=>.1},contourDirection:{kind:"vec3",def:()=>new ds(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 ds},direction:{kind:"vec3",def:()=>new ds(1,0,0)},colors:{kind:"vec4array",def:()=>[new _s(0,0,0,1),new _s(1,1,1,1)]},steps:{kind:"floatArray",def:()=>[0,1]}},noise:{scale:{kind:"float",def:()=>1},size:{kind:"vec3",def:()=>new ds(100,100,100)},move:{kind:"float",def:()=>1},fA:{kind:"vec2",def:()=>new os(1.7,9.2)},fB:{kind:"vec2",def:()=>new os(8.3,2.8)},distortion:{kind:"vec2",def:()=>new os(1,1)},colorA:{kind:"colorVec4",def:()=>new Dr(.4,.4,.4,1)},colorB:{kind:"colorVec4",def:()=>new Dr(.4,.4,.4,1)},colorC:{kind:"colorVec4",def:()=>new Dr(1,1,1,1)},colorD:{kind:"colorVec4",def:()=>new Dr(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 ds(1,1,1)}},gradient:{gradientType:{kind:"int",def:()=>0},smooth:{kind:"bool",def:()=>!1},colors:{kind:"vec4array",def:Wd},steps:{kind:"floatArray",def:Hd},offset:{kind:"vec2",def:()=>new os},morph:{kind:"vec2",def:()=>new os},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 os},colorA:{kind:"colorVec4",def:()=>new Dr(0,0,0,1)},colorB:{kind:"colorVec4",def:()=>new Dr(1,1,1,1)},frequency:{kind:"vec2",def:()=>new os(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 os(0,1)},horizontal:{kind:"vec2",def:()=>new os(0,1)},sides:{kind:"int",def:()=>6}}},Kd=new _s;function $d(e,t){let a=e.material;if((null==a||!0!==a.isTSLNodeMaterial)&&(a=e.object?.material,null==a||!0!==a.isTSLNodeMaterial))return t;if("light"===t.kind){let e=a.lightLayer;if(null==e)return t;let r=e.data?.category,s=t.data?.category;return r===s?e:t}let r=a.layers?.[t.structIndex];return void 0!==r&&r.type===t.type?r:t}function Xd(e,t){if("number"!=typeof t||!Number.isInteger(t)||t<0)throw new Error(`[spe] ${e}.element() needs a build-time constant index (got ${String(t)}). Array params are inlined as per-slot uniforms; a dynamic index needs a real uniformArray.`);return t}function Qd(e,t,a,r){let s,i,n=e.params;switch(a){case"float":s=lr(Number(r??0));break;case"int":s=lr(Number(r??0),"int");break;case"axis":s=lr(["x","y","z"].indexOf(String(r)),"int");break;case"bool":s=lr(!!r);break;case"vec2":s=lr(r instanceof os?r:new os);break;case"vec3":s=lr(r instanceof ds?r:new ds);break;case"vec4":s=lr(r instanceof _s?r:new _s);break;case"color":{let e=qd(r,()=>Gd(16777215));s=lr(e),i=e;break}case"colorVec4":{let a=qd(r,()=>new Dr(1,1,1,1)),n=new _s(a.r,a.g,a.b,a.a),l=lr(n);l.onObjectUpdate(r=>{let s=$d(r,e).params.getLiveValue(t)??a;n.set(s.r,s.g,s.b,s.a)}),s=l,i=a;break}case"vec4array":{let a=Array.isArray(r)?r:[];s=function(e,t,a){let r=new Map;return{element(s){let i=Xd(t,s),n=r.get(i);if(void 0===n){let s=lr(a[i]??new _s);s.onObjectUpdate(r=>($d(r,e).params.getValue(t)??a)[i]??Kd),n=s,r.set(i,n)}return n},array:a,get value(){return a},set value(e){if(Array.isArray(e))for(let t=0;t<Math.min(a.length,e.length);t++){let r=e[t];Array.isArray(r)?a[t].set(r[0]??0,r[1]??0,r[2]??0,r[3]??1):r&&"object"==typeof r&&a[t].set(r.x??0,r.y??0,r.z??0,r.w??1)}}}}(e,t,a.length>0?a:[new _s]),i=a;break}case"floatArray":{let a=Array.isArray(r)?r:[0];s=function(e,t,a){let r=new Map;return{element(s){let i=Xd(t,s),n=r.get(i);if(void 0===n){let s=lr(a[i]??0);s.onObjectUpdate(r=>{let s=$d(r,e).params.getValue(t);return Number((s??a)[i]??0)}),n=s,r.set(i,n)}return n},array:a,get value(){return a},set value(e){if(Array.isArray(e))for(let t=0;t<Math.min(a.length,e.length);t++)a[t]=Number(e[t])}}}(e,t,a.length>0?a:[0]),i=a;break}}"vec4array"!==a&&"floatArray"!==a&&"colorVec4"!==a&&(Po(s),s.onObjectUpdate(a=>{let r=$d(a,e).params.getValue(t);void 0!==r&&No(s,r)})),n.set(t,s,i),e.uniformKinds.set(t,a)}var Zd=class{constructor(e,t,a,r){this.repeat=e,this.offset=t,this.rotation=a,this.target=r,this.updateMatrix()}updateMatrix(){this.target.setUvTransform(this.offset[0],this.offset[1],this.repeat[0],this.repeat[1],0,0,0).premultiply((new hs).makeRotation(this.rotation*is.DEG2RAD))}},Yd=class{constructor(e,t,a,r){this.kind=e,this.id=t,this.uuid=a,this.data=r,this.uniformKinds=new Map,this.holders=[],this.structIndex=-1,this.params=new Bo(t)}get type(){return this.data.type}get uniforms(){return this.params.uniforms}get alphaNode(){return this.params.getFloat("alpha")}get modeNode(){return this.params.getInt("mode")}get isMaskNode(){return this.params.getFloat("isMask")}get isMaskEnabled(){return"isMask"in this.data&&!!this.data.isMask}hasValue(e){return this.params.has(e)}setValue(e,t){if("noiseStrength"===e&&!1===this.noiseCompiledIn&&"number"==typeof t&&0!==t&&void 0!==this.onNoiseMismatch){let a=this.onNoiseMismatch;return this.onNoiseMismatch=void 0,this.params.setValue(e,t),void(a(t)&&(this.noiseCompiledIn=!0))}this.params.setValue(e,t)}getNode(e){return this.params.has(e)?this.params.get(e):void 0}getValue(e){return this.params.getValue(e)}getName(e){let t=/f\d+_(.*)/.exec(e);if(t&&t.length>1)return t[1];console.log(`Layer.getName: error ${e}`)}getNames(){return this.params.names()}get assetsLoaded(){return this.holders.every(e=>e.loaded)}dispose(){for(let e of this.holders)e instanceof Gr||e.deref();this.holders.length=0}},Jd=class extends Yd{constructor(e,t,a){super("light",e,t,a),this.node={alphaOverride:void 0,alpha:{value:1}}}get lightData(){return this.data}get category(){return this.lightData.category??"phong"}};function eh(e,t){let a=e.data;"displace"!==a.type?("alpha"in a&&e.params.has("alpha")&&e.params.setValue("alpha",Nr(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",(Br(a.intensity,t)??1)*(a.visible?1:0))}function th(e,t){Qd(e,"alpha","float",t.alpha??1),Qd(e,"mode","int",t.mode??0),Qd(e,"isMask","float",t.isMask?1:0)}function ah(e,t,a,r){let s=new Jd(e,t,a),i=a;if(Qd(s,"alpha","float",Nr(i.alpha,r)),Qd(s,"mode","int",i.mode??0),Qd(s,"bumpMapIntensity","float",i.bumpMapIntensity??5),Qd(s,"alphaOverride","float",Nr(i.alphaOverride,r)),a.visible)if("lambert"===i.category)Qd(s,"emissive","color",r.color(i.emissive)??Gd(0)),Qd(s,"occlusion","bool",i.occlusion??!0);else if("toon"===i.category)Qd(s,"shininess","float",i.shininess??30),Qd(s,"specular","color",r.color(i.specular)??Gd(1118481));else if("physical"===i.category){Qd(s,"roughness","float",i.roughness??.3),Qd(s,"metalness","float",i.metalness??0),Qd(s,"reflectivity","float",i.reflectivity??.5),Qd(s,"occlusion","bool",i.occlusion??!0),Qd(s,"normalScale","float",i.normalScale??1),Qd(s,"aoMapIntensity","float",i.aoMapIntensity??1),Qd(s,"emissive","color",void 0!==i.emissive?r.color(i.emissive)??Gd(0):Gd(0)),Qd(s,"emissiveIntensity","float",i.emissiveIntensity??1);let e=i;void 0!==e.clearcoat&&(Qd(s,"clearcoat","float",e.clearcoat),Qd(s,"clearcoatRoughness","float",e.clearcoatRoughness??.1)),void 0!==e.sheen&&(Qd(s,"sheen","float",e.sheen),Qd(s,"sheenColor","color",void 0!==e.sheenColor?r.color(e.sheenColor)??Gd(16777215):Gd(16777215)),Qd(s,"sheenRoughness","float",e.sheenRoughness??.5)),void 0!==e.ior&&(Qd(s,"ior","float",e.ior),Qd(s,"specularIntensity","float",e.specularIntensity??1),Qd(s,"specularColor","color",void 0!==e.specularColor?r.color(e.specularColor)??Gd(16777215):Gd(16777215))),void 0!==e.iridescence&&(Qd(s,"iridescence","float",e.iridescence),Qd(s,"iridescenceIOR","float",e.iridescenceIOR??1.3),Qd(s,"iridescenceThickness","float",e.iridescenceThickness??400))}else Qd(s,"shininess","float",i.shininess??30),Qd(s,"specular","color",void 0!==i.specular?r.color(i.specular)??Gd(1118481):Gd(1118481)),Qd(s,"occlusion","bool",i.occlusion??!0);return s.node.alphaOverride=s.params.get("alphaOverride"),eh(s,r),s}function rh(e,t,a,r){let s=new Yd("fragment",e,t,a),i="texture"===a.type?null!=a.texture.image?r.uiBuffer(a.texture.image)??r.image(a.texture.image):r.getImage(""):"video"===a.type?r.video(a.texture.video):null!=a.texture.image?r.image(a.texture.image):r.getImage("");s.holders.push(i);let n=a.texture.wrapping??("texture"===a.type?1e3:1001),l=function(e,t,a,r){let s=Ea(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=Br(a.texture.rotation??0,r)??0;if("matcap"===a.type)Qd(s,"rotation","float",o*is.DEG2RAD);else{let e=lr(new os(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=lr(i.loaded||i.isBuffer?1:0);t.onRenderUpdate(()=>i.loaded||i.isBuffer?1:0),s.params.set("loaded",t),s.uniformKinds.set("loaded","float"),Qd(s,"crop","float",a.crop?1:0),Qd(s,"projection","int",a.projection??0),Qd(s,"axis","axis",a.axis),Qd(s,"projectionAxis","axis",a.projectionAxis),Qd(s,"side","int",a.side??0);let l=a.size?new os(Br(a.size[0],r)??0,Br(a.size[1],r)??0):new os(100,100);Qd(s,"size","vec2",l),Qd(s,"blending","float",a.blending??0);let u=new hs,d=new Zd([Br(a.texture.repeat?.[0]??1,r)??1,Br(a.texture.repeat?.[1]??1,r)??1],[Br(a.texture.offset?.[0]??0,r)??0,Br(a.texture.offset?.[1]??0,r)??0],o,u),h=lr(u);Po(h),h.onObjectUpdate(e=>{let t=$d(e,s).params.getNodeValue("mat");void 0!==t&&No(h,t)}),s.params.set("mat",h,d)}return th(s,{alpha:Nr(a.alpha,r),mode:a.mode??0,isMask:a.isMask??!1}),eh(s,r),s}function sh(e,t,a,s){if("light"===a.type)return ah(e,t,a,s);if("texture"===a.type||"video"===a.type||"matcap"===a.type)return rh(e,t,a,s);if("displace"===a.type)return function(e,t,a,r){if("noise"!==a.displacementType)throw new Error;let s=new Yd("vertex",e,t,a),i=(e,t)=>Br(e,r)??t;return Qd(s,"offset","vec3",new ds(...a.offset.map(e=>i(e,0)))),Qd(s,"scale","float",i(a.scale,10)),Qd(s,"intensity","float",i(a.intensity,8)),Qd(s,"movement","float",i(a.movement,1)),Qd(s,"noiseType","int",a.noiseType??0),Qd(s,"voronoiStyle","int",a.voronoiStyle??0),Qd(s,"smoothness","float",i(a.smoothness,.5)),Qd(s,"seed","float",i(a.seed,0)),Qd(s,"highCut","float",i(a.highCut,1)),Qd(s,"lowCut","float",i(a.lowCut,0)),Qd(s,"quality","int",Br(a.quality,r)??1),eh(s,r),s}(e,t,a,s);let i=new Yd("fragment",e,t,a),n=r(a,s),l=jd[a.type]??jd.color;for(let[e,t]of Object.entries(l))Qd(i,e,t.kind,n[e]??t.def());if("transmission"===a.type){let e=typeof window<"u"?window.innerWidth:1,t=typeof window<"u"?window.innerHeight:1;Qd(i,"aspectRatio","vec2",e>=t?new os(t/e,1):new os(1,e/t))}return th(i,n),eh(i,s),i}var ih={displace_noise:[{nums:["intensity","scale","movement","smoothness","seed","highCut","lowCut"],vecs:["offset"]}],displace_map:[{nums:["intensity"],vecs:[]}],depth:[{nums:["near","far"],vecs:["origin","direction"]}],cavity:[{nums:["ridge","valley"],vecs:[]}],fresnel:[{nums:["bias","scale","intensity","factor"],vecs:[]}],dust:[{nums:["coverage","softness","noiseStrength","noiseScale"],vecs:[]}],rainbow:[{nums:["filmThickness","movement","noiseStrength","noiseScale"],vecs:["offset","wavelengths"]}],noise:[{nums:["scale","move","seed","highCut","lowCut","smoothness"],vecs:["size","distortion","fA","fB"]}],pattern:[{nums:["blending","size","variation","smoothness","zigzag","rotation"],vecs:["offset","frequency","vertical","horizontal"]}],outline:[{nums:["outlineWidth","contourWidth","outlineThreshold","contourThreshold","outlineSmoothing","contourFrequency"],vecs:["contourDirection"]}],toon:[{nums:["noiseStrength","noiseScale"],vecs:["offset","source"]}],transmission:[{nums:["roughness","thickness","ior"],vecs:[]}],reflection:[{nums:["blur","thickness","steps","stepSize"],vecs:[]}],texture:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],video:[{nums:[],vecs:["size"]},{nums:["rotation"],vecs:["repeat","offset"],path:["texture"]}],gradient:[{nums:["angle"],vecs:["offset","morph"]}],matcap:[{nums:["rotation"],vecs:[],path:["texture"]}]},nh=class extends bt{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=Si.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){Vi.add(e)}(this),this.addEventListener("dispose",()=>function(e){Vi.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(${Dd(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(Dd(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 zi?Si.version:0,a=this.physicalLobes();return`${e}|env${t}|lobes${(a.clearcoat?1:0)|(a.sheen?2:0)|(a.iridescence?4:0)}`}get isRoot(){return this.root===this}get category(){return this.lightLayer.category}envReflectiveInLow(){let e=!1;for(let t of this.layers){let a=t.data;if("physical"===a?.category&&(e=!0,void 0!==a.roughnessMap||void 0!==a.metalnessMap||"number"!=typeof a.roughness||"number"!=typeof a.metalness||void 0!==a.clearcoat||void 0!==a.sheen||void 0!==a.iridescence||void 0!==a.ior||a.metalness>.3||a.roughness<.4))return!0}return!e}get hasAO(){return this.lightLayer.getValue("occlusion")??!1}get fragment(){}reset(e,t,a=!1){(this.data!==e||a)&&this.reset0(e,t)}reset0(e,t){this.lastContext=t,this.data=e;let a=e.layers??Hr.defaultTwoLayerData("phong").layers;for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear();let r=[];for(let e of a)try{let a=sh(this.layerIdGen++,e.id,e.data,t.shared);"rainbow"===a.type&&this.armRainbowNoiseSpecialization(a),r.push(a)}catch(t){console.warn(`[spe] material layer '${e.data.type}' (${e.id}) failed to build — skipping this layer`,t)}this.layers=r,this.layers.reverse();for(let e=0;e<this.layers.length;e++)this.layers[e].structIndex=e;this.name=e.name??"Untitled Material";let s=this.layers.find(e=>e instanceof Jd);if(void 0===s&&(s=ah(0,"",{...Wr.defaultData("light","phong"),visible:!1},t.shared)),this.lightLayer=s,this.lights=!!this.lightLayer.data.visible,this.ctx={accumAlpha:ir(0).toVar("accumAlpha"),lightsAvailable:this.lights&&("phong"===this.category||"lambert"===this.category||"physical"===this.category)},this.colorNode=re(()=>this.buildColorStack())(),this.buildVertexStack(),this.normalNode=this.buildNormalNode(this.displacedNormalView()),this.emissiveNode=this.lights&&"lambert"===this.category&&this.lightLayer.params.has("emissive")?this.lightLayer.params.get("emissive"):null,this.aoNode=null,this.lights&&"physical"===this.category){let e=this.lightLayer.params,t=this.lightLayer.lightData;if(e.has("emissive")){let a=this.findTextureMapLayer(t.emissiveMap);this.emissiveNode=re(()=>{let t=ae(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"):ir(1),{uvs:s,weights:i}=uu(e);if(null!==i){let e=ae(a.sample(s[0]).rgb).toVar(),r=ae(a.sample(s[1]).rgb).toVar(),n=ae(a.sample(s[2]).rgb).toVar();t=e.mul(i.z).add(r.mul(i.x)).add(n.mul(i.y))}else t=ae(a.sample(s[0]).rgb);return qt(ae(0),t,r)}(a.params))),t})()}let a=this.findTextureMapLayer(t.aoMap);null!==a&&(this.aoNode=re(()=>qt(ir(1),cu(a.params,t.aoMapChannel??"r"),e.getFloat("aoMapIntensity")))())}this.transparent=Er(e,t.shared),Mi(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(),Mi(this),this.needsUpdate=!0}getFlavor(e,t,a,r){if(!this.isRoot)return this.root.getFlavor(e,t,a,r);let s=a?6:(e?3:0)+t;if(s+=7*((r?.resolutionLevel??0)-(r?.useChildrenColors?4:0)),0===s)return this;s-=1;let i=this.flavors[s];return void 0===i&&(i=new nh(this.data,this.lastContext,this.allowVariableSaves,this),i.flatShading=e,i.side=t,i.wireframe=a,r&&(i.shapeBlendOptions={...r},i.defines={SHAPEBLEND:r.resolutionLevel,SHAPEBLEND_C:r.useChildrenColors?1:0},i._invalidateStructuralKey()),this.flavors[s]=i),i}getShapeBlendBaseColor(){let e=this.layers.find(e=>"fragment"===e.kind&&"color"===e.type),t=e?.getValue("color"),a=e?.getValue("alpha");return{r:t?.r??1,g:t?.g??1,b:t?.b??1,a:a??1}}setShapeBlendResources(e){this._shapeBlendResources=e,this._applyShapeBlendGraph()}_applyShapeBlendGraph(){if(!this.shapeBlendOptions||!this._shapeBlendResources)return;let e=n();if(null===e)return;let t=e(this._shapeBlendResources);this.positionNode=t.position,this.shapeBlendObjectNormal=t.normal,this.normalNode=this.buildNormalNode(za(Ja(t.normal))),this.castShadowPositionNode=t.position,this.shapeBlendOptions.useChildrenColors&&(this._shapeBlendColorNode=t.color,this.colorNode=re(()=>this.buildColorStack())()),this.needsUpdate=!0}lightLayerIndex(){return this.layers.findIndex(e=>e instanceof Jd)}findTextureMapLayer(e){if(!e)return null;if("string"!=typeof e)return qr.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=Wr.defaultData("texture"),a={...t,visible:!1,texture:{...t.texture,image:e.image,wrapping:e.wrapping??1e3,offset:e.offset??[0,0],repeat:e.repeat??[1,1],minFilter:e.minFilter??1008,magFilter:e.magFilter??1006}},r=rh(this.layerIdGen++,`mapImage${this.layerIdGen}`,a,this.lastContext.shared);return this.syntheticMapLayers.set(e,r),r}catch(e){return console.warn("[spe] light-layer map image failed to build — skipped",e),null}}buildNormalNode(e){if(this.lights&&"physical"===this.category&&!this.wireframe){let t=this.lightLayer.lightData,a=this.findTextureMapLayer(t.normalMap);if(null!==a){let t=this.lightLayer.params.getFloat("normalScale");return re(()=>function(e,t,a){let r=ae(a??Wa).toVar(),s=_e,i=e.get("texture"),n=e.has("loaded")?e.getFloat("loaded"):ir(1),l=e=>{let a=Y(e).toVar(),l=ae(i.sample(a).rgb.mul(2).sub(1)).toVar(),o=ae(qt(ae(0,0,1),l,n)).toVar();o.xy.mulAssign(t);let u=ae(va(s)).toVar(),d=ae(Sa(s)).toVar(),h=Y(va(a)).toVar(),m=Y(Sa(a)).toVar(),c=ae(Ya(r)).toVar(),p=ae(ma(d,c)).toVar(),g=ae(ma(c,u)).toVar(),f=ae(p.mul(h.x).add(g.mul(m.x))).toVar(),_=ae(p.mul(h.y).add(g.mul(m.y))).toVar(),y=ir(At(Da(f,f),Da(_,_))).toVar(),x=ir(St(y.equal(0),ir(0),tr.mul(Pe(y)))).toVar();return Ya(f.mul(o.x.mul(x)).add(_.mul(o.y.mul(x))).add(c.mul(o.z)))},{uvs:o,weights:u}=uu(e);if(null!==u){let e=l(o[0]),t=l(o[1]),a=l(o[2]);return Ya(e.mul(u.z).add(t.mul(u.x)).add(a.mul(u.y)))}return l(o[0])}(a.params,t,e))()}}let t=this.findTextureMapLayer(this.lightLayer.lightData.bumpMap),a=this.lights&&"lambert"!==this.category;if(null===t||!a||this.wireframe)return e;let r=this.lightLayer.params.getFloat("bumpMapIntensity");return re(()=>function(e,t,a){let r=ae(a??Wa).toVar(),s=_e,i=e.get("texture"),{uvs:n,weights:l}=uu(e);if(null!==l){let e=mu(s,r,hu(i,n[0],t)),a=mu(s,r,hu(i,n[1],t)),o=mu(s,r,hu(i,n[2],t));return Ya(e.mul(l.z).add(a.mul(l.x)).add(o.mul(l.y)))}return mu(s,r,hu(i,n[0],t))}(t.params,r,e))()}buildVertexStack(){let e=this.layers.filter(e=>"vertex"===e.kind);if(0===e.length)return this.positionNode=null,void(this.displacedObjectNormal=null);let t=function(e){let t=$("vec3","vDisplacedNormal");return{position:re(a=>{let r=ue,s=Ua;for(let t=0;t<e.length;t++){let a=Ju(e[t],$u(ue),s);r=0===t?a.position:$u(r.add(a.position).mul(.5)),s=a.normal}let i=ae(r).toVar();return t.assign(s),!0===a.needsPreviousData?.()&&ce.assign(i),i})(),normal:t}}(e.map(e=>e.params));this.positionNode=t.position,this.displacedObjectNormal=t.normal}displacedNormalView(){let e=this.root.displacedObjectNormal;return null===e?null:za(Ja(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=ir(1);null!==t&&(r=this.evaluateMask(t));let s={alpha:a?.alpha??e.alphaNode,isMask:e.isMaskNode,mask:r,mode:e.modeNode,noiseCompiledIn:e.noiseCompiledIn},i=$o(e.type)(e.params,s,this.ctx);return a?.color?{...i,color:a.color}:i}evaluateMask(e){let t=this.runLayerBuilder(e,null);return V(t.color.mul(t.calpha))}buildColorStack(){let e=this.lightLayerIndex(),t=-1===e?0:e,a=null;for(let e=0;e<t;e++){let t=this.layers[e];if("fragment"!==t.kind)continue;if(null===a){let r=this._shapeBlendColorNode;a=Od(this.runLayerBuilder(t,this.maskSourceFor(e),r?{color:Od(r.rgb),alpha:Ud(r.w)}:void 0).color);continue}if(t.isMaskEnabled)continue;let r=this.runLayerBuilder(t,this.maskSourceFor(e));a=qo(a,r.color,r.calpha,t.modeNode)}return a??ea(Qr)}setup(e){e.context.setupClearcoatNormal=()=>Ma(Wa,"NORMAL","vec3"),super.setup(e)}setupLightingModel(){let e=this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null;return function(e,t=null,a=null,r=!1){switch(e){case"physical":{let e=new ru(!0===a?.clearcoat,!0===a?.sheen,!0===a?.iridescence,!1,!1,!1);return e.envIrradianceActive=r,e}case"lambert":return new Xt(!1);case"toon":{let e=new au;return e.aoOcclusionGate=t,e}default:return new Xt}}(this.category,e,this.physicalLobes(),this.envNode instanceof zi)}physicalLobes(){let e=this.lightLayer.params;return{clearcoat:e.has("clearcoat"),sheen:e.has("sheen"),iridescence:e.has("iridescence")}}setupVariants(e){if(!this.lights)return;let t=null,a=null;if("physical"===this.category){let e=this.lightLayer.lightData,r=this.findTextureMapLayer(e.roughnessMap);null!==r&&(t=re(()=>cu(r.params,e.roughnessMapChannel??"luminance"))());let s=this.findTextureMapLayer(e.metalnessMap);null!==s&&(a=re(()=>cu(s.params,e.metalnessMapChannel??"b"))())}!function(e,t,a=null,r=null){if("phong"===e||"toon"===e)Lt.assign(t.getFloat("shininess").max(1e-4)),Yt.assign(t.getColor("specular"));else if("physical"===e){let e=t.getFloat("metalness"),s=t.getFloat("roughness"),i=t.getFloat("reflectivity");if(null!==a&&(s=a.mul(s)),null!==r&&(e=Ft(r.mul(e),ir(0),ir(1))),Bt.assign(e),lt.assign(Ft(s,ir(.0525),ir(1))),t.has("ior")){let a=t.getFloat("ior"),r=t.has("specularColor")?ae(t.getColor("specularColor")):ae(1),s=t.has("specularIntensity")?t.getFloat("specularIntensity"):ir(1);Le.assign(a),Yt.assign(Dt(Ee(Le.sub(1).div(Le.add(1))).mul(r),ae(1)).mul(s)),Zo.assign(qt(Yt,Pa.rgb,e)),aa.assign(qt(s,ir(1),e))}else{let t=ae(i.pow(2).mul(.16));Yt.assign(t),Zo.assign(qt(t,Pa.rgb,e)),aa.assign(ir(1))}if(Qo.assign(Pa.rgb.mul(nr(e))),t.has("clearcoat")&&(Gt.assign(t.getFloat("clearcoat")),Qt.assign(Ft(t.getFloat("clearcoatRoughness"),ir(.0525),ir(1)))),t.has("sheen")){let e=t.has("sheenColor")?ae(t.getColor("sheenColor")):ae(1);Rt.assign(e.mul(t.getFloat("sheen"))),Pt.assign(Ft(t.getFloat("sheenRoughness"),ir(.07),ir(1)))}t.has("iridescence")&&(Ue.assign(t.getFloat("iridescence")),qe.assign(t.getFloat("iridescenceIOR")),He.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?ae(0):Pa.rgb,i=ae(0),n=ae(0);if(r&&(a.length>0||r.getScope().hasLights)){let e=this.setupLightingModel()||null,t=nt(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&&(qa.assign(ae(this.emissiveNode)),s=s.add(qa)),re(()=>this.applyPostLighting(s,i,n))()}applyPostLighting(e,t,a){let r,s=this.ctx.accumAlpha,i=!0===this.lights,n=this.lightLayerIndex(),l=-1===n?0:n+1,o=ir(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=ae(t).toVar();return le(De(ar(u,Pa.rgb)),()=>{let e=Ft(et(a.add(r)),ir(0),ir(1));o.accumAlpha.addAssign(nr(o.accumAlpha).mul(s).mul(n).mul(e)),u.assign(qo(Pa.rgb,u,s.mul(n),i)),u.mulAssign(eu(l))}),u}({outgoing:e,directSpecular:t,indirectSpecular:a,shadingAlpha:this.lightLayer.alphaNode,shadingBlend:this.lightLayer.modeNode,mask:o,occlusion:this.lightLayer.params.has("occlusion")?this.lightLayer.params.getBool("occlusion"):null,ctx:this.ctx})}else r=ae(e).toVar();let u=r,d=!1;for(let e=l;e<this.layers.length;e++){let t=this.layers[e];if("fragment"!==t.kind||t.isMaskEnabled)continue;let a=this.runLayerBuilder(t,this.maskSourceFor(e));u=qo(u,a.color,a.calpha,t.modeNode),d=!0}if(d&&r.assign(u),!i){let e=-1===n?null:this.maskSourceFor(n);null!==e&&(o=this.evaluateMask(e))}let h=this.lightLayer.params.has("alphaOverride")?this.lightLayer.params.getFloat("alphaOverride"):ir(1),m=i?s:s.mul(o);if(Pa.a.assign(m.mul(h)),Pa.a.lessThanEqual(ir(0)).discard(),this.dithering){let e=je(ft.xy),t=ae(.25/255,-.25/255,.25/255),a=qt(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||Lr(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)&&!Lr(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(Er(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):Mi(this)}else this.reset0(t,a);else this.root.updateByOp(e,t,a)}static hasVariableString(e){return"string"==typeof e||Array.isArray(e)&&e.some(e=>"string"==typeof e)}updateLayerTextureByOp(e,t,a){if(1!==t.path.length||0!==t.type)return!0;let r=t.props,s=a.texture;if(!s)return!0;let i=e.data.texture;for(let e of Object.keys(r))if("repeat"!==e&&"offset"!==e&&"rotation"!==e||nh.hasVariableString(s[e])||nh.hasVariableString(i?.[e]))return!0;if("matcap"===e.type)return"repeat"in r||"offset"in r||(e.data=a,e.setValue("rotation",(s.rotation??0)*is.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||Lr(r))!==e.noiseCompiledIn)return!0}let r=Ir[e.type];if(void 0!==r&&r.includes(t))return!0;let i=Fr[e.type];if(void 0!==i&&i.includes(t)){let a=e.getValue(t),r=s[t];if(Array.isArray(a)&&Array.isArray(r)&&a.length!==r.length)return!0}let n=a[t],l=e.data[t];if("axis"!==t&&("string"==typeof n||"string"==typeof l)||Array.isArray(n)&&n.some(e=>"string"==typeof e)||Array.isArray(l)&&l.some(e=>"string"==typeof e))return!0}e.data=a;for(let t of Object.keys(s))this.applyLayerValue(e,t,a,r.shared);return!1}applyLayerValue(e,t,a,r){let s=a;if(("alpha"===t||"visible"===t||"intensity"===t)&&(eh(e,r),"intensity"!==t||"displace"===e.type))return;if("alphaOverride"===t&&e instanceof Jd)return void e.setValue("alphaOverride",Nr(s[t],r));if(!e.hasValue(t))return;let i=e.uniformKinds.get(t),n=s[t];switch(i){case"color":case"colorVec4":{let a=e.getValue(t),s="string"==typeof n?r.color(n):qd(n,()=>a??new Dr(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(Er(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(Er(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 ps||i.setValue(s,t)}saveVariableLocations(e){if(!this.allowVariableSaves)return;let t=this.data.layers?.find(e=>"light"===e.data.type);t&&e.shared.getVariable(t.data.alphaOverride,["material",this.uuid,"alphaOverride"]),this.data.layers?.forEach(t=>{let a=t.data;"alpha"in a&&"string"==typeof a.alpha&&e.shared.getVariable(a.alpha,["material",this.uuid,"layer",t.id,"alpha"]);let r="displace"===t.data.type?"noise"===a.displacementType?"displace_noise":"displace_map":t.data.type,s=ih[r];if(s)for(let r of s){let s=a;for(let e of r.path??[])e in s&&(s=s[e]);for(let a of r.nums)a in s&&e.shared.getVariable(s[a],["material",this.uuid,"layer",t.id,...r.path??[],a]);for(let a of r.vecs)a in s&&s[a].forEach((s,i)=>{e.shared.getVariable(s,["material",this.uuid,"layer",t.id,...r.path??[],a,0===i?"x":1===i?"y":"z"])})}})}clampUniformsForPreview(e,t){let a=(e,t,a)=>Math.min(Math.max(e,t),a);for(let r of this.layers)if("displace"===r.type){let s=r.uniforms[`f${r.id}_intensity`];s.value=a(s.value,e,t)}}updateFrame(){}assetsLoaded(){if(!this.layers.every(e=>e.assetsLoaded))return!1;for(let e of this.root.syntheticMapLayers.values())if(!e.assetsLoaded)return!1;return!0}nodeMaterialDispose(){if(this.isRoot){for(let e of this.layers)e.dispose();for(let e of this.syntheticMapLayers.values())e.dispose();this.syntheticMapLayers.clear()}this.dispose();for(let e of this.flavors)e?.dispose()}},lh=class extends nh{constructor(e,t,a){super(e,t,!1),this.isTSLSharedMaterial=!0,this.uuid=a,this.allowVariableSaves=!0,this.saveVariableLocations(t)}};function oh(e,t){let a=e.xyz;return t.add(ma(a,ma(a,t).add(t.mul(e.w))).mul(2))}function uh(e){let t=Cu(e),a=Cu(ae(e.y.sub(19.1),e.z.add(33.4),e.x.add(47.2))),r=Cu(ae(e.z.add(74.2),e.x.sub(124.5),e.y.add(99.4)));return ae(t,a,r)}var dh=re(e=>{let t=e.p.add(e.seed).toVar(),a=ae(.1,0,0),r=ae(0,.1,0),s=ae(0,0,.1),i=uh(t.sub(a)).toVar(),n=uh(t.add(a)).toVar(),l=uh(t.sub(r)).toVar(),o=uh(t.add(r)).toVar(),u=uh(t.sub(s)).toVar(),d=uh(t.add(s)).toVar(),h=o.z.sub(l.z).sub(d.y).add(u.y),m=d.x.sub(u.x).sub(n.z).add(i.z),c=n.y.sub(i.y).sub(o.x).add(l.x);return Ya(ae(h,m,c).mul(5))});function hh(e,t){return dh({p:e,seed:t})}function mh(e,t,a){return ae(Bu(e.add(ae(a)).mul(t)),Bu(e.add(ae(a.add(20))).mul(t)),Bu(e.add(ae(a.sub(30))).mul(t)))}function ch(e){return{f:(t,a=0)=>e.node(t)??e.getUniform(t,a),v3:t=>e.node(t)??e.getUniform(t,null),v4:t=>e.node(t)??e.getUniform(t,null),tex:t=>e.node(t)??e.getTexture(t,null)}}function ph(e,t){switch(e){case"position":return function(e){let t=ch(e.registry);return re(()=>{let a=U(),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=da(.5,p),_=ir(3).mul(f),y=c.mul(ir(1).add(_)),x=c.mul(Dt(t.f("uFPSRatio",1),ir(5)));n.addAssign(qt(x,y,f));let v=oh(t.v4("uWorldQuaternion"),h).add(t.v3("uWorldOffset"));n.assign(qt(n,v,o)),d.assign(qt(d,t.f("uTime"),o));let b=At(g.sub(t.f("uTime").sub(d)),ir(0)).div(g);return qt(ne(0),ne(n,b),u)})()}(t);case"velocity":return function(e){let t=ch(e.registry),a=e.features;return re(()=>{let r=U(),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=ir(1).sub(t.f("uRandomMassFactor").mul(function(e){return e.dot(Y(12.9898,78.233)).sin().mul(43758.5453).fract()}(function(e){return e.xy}(o)).mul(.5).add(.5))).toVar(),f=t.f("uSpeed",1),_=t.f("uNoiseStrength"),y=t.f("uNoiseScale"),x=t.f("uNoiseSeed");le(c.equal(1),()=>{a.USE_CURL_NOISE&&(le(y.greaterThan(0),()=>{d.assign(hh(l.mul(y).mul(.002),x).mul(_.add(1)).mul(.05).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(hh(l,x).mul(_).mul(.05).mul(f))})),a.USE_SIMPLEX_NOISE&&(le(y.greaterThan(0),()=>{d.assign(ae(Cu(l.mul(y).mul(.001)).mul(_.add(1)).mul(.1)).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(ae(Cu(l.mul(_).mul(.001)).mul(.05)).mul(f))})),a.USE_FBM_NOISE&&(le(y.greaterThan(0),()=>{d.assign(mh(l.mul(y).mul(.001),_.add(1),x).mul(f))}),le(_.greaterThan(0).and(y.equal(0)),()=>{d.addAssign(mh(l.mul(_).mul(.001),_.add(1),x).mul(.1).mul(f))})),function(e,t,a,r,s){if(!e.features.USE_COLLIDER)return;let i=At(t.f("uBounce").mul(2),ir(.01)).toVar(),n=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),l=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar().div(e).toVar(),o=et(l).toVar();le(o.lessThanEqual(ir(1).add(n.div(et(e)))).and(s.equal(0)),()=>{let a=l.mul(ir(1).add(n.div(et(e)))),o=Ya(a.div(e.mul(e)));o=oh(t.v4("uColliderQuaternion"),o),r.assign(Ye(r,o).mul(i)),s.assign(1)}).Else(()=>{s.assign(0)})}if(e.features.USE_BOX_COLLIDER){let e=t.v3("uColliderSize").div(2),l=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),o=Ae(l).sub(e).toVar(),u=At(o.x,At(o.y,o.z)).toVar();le(u.lessThanEqual(n.mul(.5)).and(s.equal(0)),()=>{let e=ae(0).toVar();le(o.x.greaterThan(o.y).and(o.x.greaterThan(o.z)),()=>{e.assign(ae(Ut(l.x),0,0))}).ElseIf(o.y.greaterThan(o.z),()=>{e.assign(ae(0,Ut(l.y),0))}).Else(()=>{e.assign(ae(0,0,Ut(l.z)))});let a=oh(t.v4("uColliderQuaternion"),e);r.assign(Ye(r,a).mul(i)),s.assign(1)}).Else(()=>{s.assign(0)})}}(e,t,l,d,p),function(e,t,a,r){if(!e.features.USE_ATTRACTOR)return;let s=t.f("uForceIntensity"),i=t.f("uForceDamping");if(e.features.USE_FORCE_LOCAL_SPACE){let n,l,o=t.f("particleSize");if(e.features.USE_SPHERE_COLLIDER){let e=t.v3("uColliderSize"),r=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos")));n=et(r.div(e)).toVar(),l=ir(1)}else{let e=t.v3("uColliderSize").div(2),r=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))),s=Ae(r).sub(e);n=At(s.x,At(s.y,s.z)).toVar(),l=o}le(n.lessThanEqual(l),()=>{let o=e.features.USE_SPHERE_COLLIDER?ir(1).sub(n).mul(s):At(ir(1).sub(l.div(n)),ir(0)).mul(s),u=a.sub(t.v3("uColliderPos")),d=Ya(u).mul(o);r.subAssign(d),r.mulAssign(i)})}else{let e=a.sub(t.v3("uColliderPos")),n=Ya(e).mul(s);r.subAssign(n),r.mulAssign(i)}}(e,t,l,d),function(e,t,a,r,s,i,n){if(!e.features.USE_VORTEX)return;let l=t.f("particleSize"),o=t.v3("uColliderSize").div(2),u=oh(t.v4("uColliderQuaternionInvert"),a.sub(t.v3("uColliderPos"))).toVar(),d=Ae(u).sub(o).toVar(),h=At(d.x,At(d.y,d.z)).toVar();le(h.lessThanEqual(l),()=>{let e=t.f("uForceIntensity"),l=t.v3("uColliderPos").add(oh(t.v4("uColliderQuaternion"),ae(0))).sub(a).toVar(),o=ae(0,1,.01),u=Ya(ma(o,oh(t.v4("uColliderQuaternion"),l))).toVar(),d=et(l.mul(e).mul(3)).toVar();r.assign(u.mul(d).mul(.005));let h=oh(t.v4("uWorldQuaternion"),s);r.addAssign(h.mul(n).mul(ir(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(qt(d,oh(t.v4("uWorldQuaternion"),v).mul(f),m)),d.addAssign(t.v3("uGravity").div(g.mul(.5)).mul(ir(1).sub(p))),ne(d,p)})()}(t);case"emissionRate":return function(e){let t=ch(e.registry);return re(()=>{let a=U(),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=da(o,s),h=da(s,o.add(u).sub(1)),m=d.mul(h);return l.assign(qt(l,t.f("uTime"),m)),ne(m,qt(n,ir(1),m),l,1)})()}(t)}}var gh=class{constructor(){this.nodes=new Map,this.textureNodes=new Map}getUniform(e,t){let a=this.nodes.get(e);return a||(a=lr(t),this.nodes.set(e,a)),a}getTexture(e,t){let a=this.textureNodes.get(e);return a||(a=Ea(t??new ps),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 ps||a&&"object"==typeof a&&a.isTexture){let r=this.getTexture(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(e){r.value=e}}})}else{let r=this.getUniform(t,a);r.value=a,Object.defineProperty(e,t,{configurable:!0,enumerable:!0,value:{get value(){return r.value},set value(e){r.value=e}}})}}}},fh=class{constructor(e,t,a,r){this.name=e,this.kind=t,this.initialTexture=a,this.currentIndex=0,this.registry=new gh,this.depTextureNodes=new Map,this.dependencies=[],this.nodeMaterial=null,this._uniformsStore={};let s=()=>new ys(r,r,{type:es,minFilter:Ws,magFilter:Ws,wrapS:Fs,wrapT:Fs,depthBuffer:!1});this.renderTargets=[s(),s()],this.material=Object.defineProperty({},"uniforms",{get:()=>this._uniformsStore,set:e=>{this.registry.adopt(e),this._uniformsStore=e}})}get currentRenderTarget(){return this.renderTargets[this.currentIndex]}get nextRenderTarget(){return this.renderTargets[1-this.currentIndex]}advance(){this.currentIndex=1-this.currentIndex}dispose(){this.renderTargets[0].dispose(),this.renderTargets[1].dispose(),this.nodeMaterial?.dispose()}},_h=new Ga,yh=class{constructor(e,t,a,r){this.sizeX=e,this.sizeY=t,this.renderer=a,this.features=r,this.variables=[],this._copyMaterial=null,this._copyTextureNode=Ea(new ps)}addVariable(e,t,a){let r=new fh(e,"uCurrentPosition"===e?"position":"uCurrentVelocity"===e?"velocity":"emissionRate",a,this.sizeX);return this.variables.push(r),r}setVariableDependencies(e,t){e.dependencies=t;for(let a of t)e.depTextureNodes.has(a.name)||e.depTextureNodes.set(a.name,Ea(a.currentRenderTarget.texture))}init(){if(!this._copyMaterial){let e=new bt;e.name="WebGPUComputation.copy",e.fragmentNode=ne(this._copyTextureNode),e.depthTest=!1,e.depthWrite=!1,e.blending=Us,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 bt;t.name=`WebGPUComputation.${e.kind}`,t.fragmentNode=ph(e.kind,{features:this.features,registry:e.registry,depTexture:t=>{let a=e.depTextureNodes.get(t);if(!a)throw new Error(`WebGPUComputationRenderer: variable "${e.name}" reads undeclared dependency "${t}"`);return a},resolution:new os(this.sizeX,this.sizeY)}),t.depthTest=!1,t.depthWrite=!1,t.blending=Us,t.needsUpdate=!0,e.nodeMaterial=t}}compute(){for(let e of this.variables)if(e.nodeMaterial){for(let t of e.dependencies)e.depTextureNodes.get(t.name).value=t.currentRenderTarget.texture;this._renderQuad(e.nodeMaterial,e.nextRenderTarget)}for(let e of this.variables)e.advance()}getCurrentRenderTarget(e){return e.currentRenderTarget}_renderQuad(e,t){let a=this.renderer,r=a.getRenderTarget(),s=a.getMRT();a.setMRT(null),a.setRenderTarget(t),_h.material=e,_h.render(a),a.setRenderTarget(r),a.setMRT(s)}dispose(){for(let e of this.variables)e.dispose();this._copyMaterial?.dispose()}};function xh(e,t){switch(e){case"linearFadeOut":return ir(1).sub(t);case"linearInOut":return t.lessThan(.5).select(t,ir(1).sub(t));case"exponentialInOut":return t.lessThan(.4).select(t.div(.4),t.greaterThan(.6).select(ir(1).sub(t.sub(.6).div(.4)),ir(1)));case"constant":return ir(1);default:return t}}function vh(e){return e.dot(Y(12.9898,78.233)).sin().mul(43758.5453).fract()}var bh=class extends bt{constructor(e,t){super(),this.easeOpacity="linearFadeIn",this.easeSize="linearFadeIn",this.useSizeEnd=!1,this.isColoringRandom=!1,this._uniformsStore={},this._uPosition=Ea(new ps),this._uTexture=Ea(new ps),this._uColor=lr(new _s(1,1,1,1)),this._uColor2=lr(new _s(1,1,1,1)),this._uSize=lr(1),this._uSizeEnd=lr(1),this._uWorldOffset=lr(new ds),this._uWorldQuaternion=lr(new _s(0,0,0,1)),this._uRotation=lr(0),this._uRotationEnd=lr(0),this._center=lr(new os(.5,.5)),this._uRandScaleFactor=lr(0),this._uRandRotationFactor=lr(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=it("particleRef","vec2"),t=this._uPosition,a=re(()=>{let a=t.sample(e).toVar(),r=a.w.toVar(),s=a.xyz.sub(this._uWorldOffset);s=function(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}(this._uWorldQuaternion,s);let i=it("position","vec3"),n=ir(1).sub(r),l=this.useSizeEnd?i.mul(ae(qt(this._uSize,this._uSizeEnd,n))):i.mul(ae(this._uSize.mul(xh(this.easeSize,n)))),o=ca,u=o.element(0).xyz.length(),d=o.element(1).xyz.length(),h=vh(e).toVar(),m=ir(1).sub(this._uRandScaleFactor.mul(h)),c=Y(u,d).mul(m).toVar(),p=2*Math.PI,g=h.mul(this._uRandRotationFactor).mul(p),f=ir(1).sub(this._uRotation).mul(p),_=ir(1).sub(this._uRotationEnd).mul(p),y=qt(f.add(g),_.add(g),r).toVar(),x=this._center,v=l.xy.sub(x.sub(Y(.5))).mul(c).toVar(),b=Y(oa(y).mul(v.x).sub(Wt(y).mul(v.y)),Wt(y).mul(v.x).add(oa(y).mul(v.y))).toVar(),T=ia.mul(ne(s,1)).toVar();return T.xy.addAssign(b),Tt.mul(T)}),r=re(()=>{let a=t.sample(e).w.toVar();a.lessThanEqual(.005).discard();let r=ir(1).sub(a),s=this.isColoringRandom?vh(e):r,i=qt(this._uColor,this._uColor2,s).toVar(),n=xh(this.easeOpacity,r).toVar(),l=this._uTexture.sample(U()).toVar();return ne(l.rgb.mul(i.rgb),i.a.mul(l.a).mul(n))});this.vertexNode=a(),this.colorNode=r(),this.needsUpdate=!0}nodeMaterialDispose(){this.dispose()}};function Th(e,t){return(a,r,s,i)=>{let n=s.mod(t).add(a.add(.5).div(e)).div(t),l=R(s.div(t)).add(r.add(.5).div(e)).div(t);return i.sample(Y(n,l))}}or({createComputation:(e,t,a,r)=>new yh(e,t,a,r),createMaterial:(e,t)=>new bh(e,t)});var wh=[[0,0,0],[1,0,0],[1,0,0],[1,1,0],[0,1,0],[1,1,0],[0,0,0],[0,1,0],[0,0,1],[1,0,1],[1,0,1],[1,1,1],[0,1,1],[1,1,1],[0,0,1],[0,1,1],[0,0,0],[0,0,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1],[0,1,0],[0,1,1]];function Sh(e){let t=rr(e.x.mul(65535).add(.5)),a=t.bitAnd(rr(255)).toFloat().mul(.00392156862),r=t.shiftRight(rr(8)).bitAnd(rr(255)).toFloat().mul(.00392156862);return ne(r,a,e.y,e.z)}function Vh(e){let{levelShiftX:t,scale:a,originOffset:r}=function(e){switch(e){case 5:return{levelShiftX:[4,6,12,24,48,96,192],scale:16,originOffset:16};case 7:return{levelShiftX:[4,6,12,24,48,96,192,384,768,1536],scale:4,originOffset:64};case 8:return{levelShiftX:[4,8,16,32,64,128,256,512,1024,2048,4096],scale:2,originOffset:128};default:return{levelShiftX:[4,8,16,32,64,128,256,512],scale:8,originOffset:32}}}(e.resolutionLevel),s=e.pyramidLevelSizes.length,i=s%2==0?s-3:s-2,n=s%2==0,l=Math.pow(2,e.resolutionLevel),o=e.pyramidLevelSizes[s-1]/l,u=Th(l,o),d=e.pyramid1Size.width,h=e.pyramid1Size.height,m=e.pyramid2Size.width,c=e.pyramid2Size.height,p=k(wh.map(([e,t,a])=>new ds(e,t,a)));return s=>{let g=ae(0).toVar(),f=ae(0,0,1).toVar(),_=ne(0).toVar(),y=s.toVar(),x=R(y.div(3)).toVar(),v=(e,t)=>Y(e.x.add(t).add(.5).div(d),e.y.add(.5).div(h)),b=(e,t)=>Y(e.x.add(t).add(.5).div(m),e.y.add(.5).div(c)),T=d-2,w=m-1,S=Y(0,0).toVar(),V=e.pyramid2.sample(b(S,w)).toVar();return le(x.lessThan(V.x),()=>{let s=ir(0).toVar(),d=e=>{let t=V.add(ne(s)).toVar(),a=ne(t.yzw,s),r=ne(ne(x).greaterThanEqual(a)).mul(ne(ne(x).lessThan(t))).toVar();S.mulAssign(2),S.addAssign(Y(0,1).mul(r.x).add(Y(1,1).mul(r.y)).add(Y(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=R(S.x.div(l)).add(R(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(Y(M,C)).x.mul(2).toInt().toVar(),k=ae(h,m,c).add(p.element(z)).toVar(),A=ae(h,m,c).add(p.element(z.add(1))).toVar(),P=u(k.x,k.y,k.z,e.potential).toVar(),E=u(A.x,A.y,A.z,e.potential).toVar(),N=P.x.div(P.x.sub(E.x));_.assign(qt(Sh(P.yzw),Sh(E.yzw),N)),g.assign(k.add(A.sub(k).mul(N)).sub(ae(r)).mul(a));let B=u(k.x,k.y,k.z,e.voxel),L=u(A.x,A.y,A.z,e.voxel);f.assign(Ya(qt(B.xyz,L.xyz,N)))}),{position:g,normal:f,color:_}}}function Mh(e,t){!0===e.needsPreviousData?.()&&ce.assign(t)}var Ch=e=>e,Rh=e=>e,zh=h,kh=m;function Ah(e,t){let a=e.xyz;return t.add(a.cross(a.cross(t).add(t.mul(e.w))).mul(2))}function Ph(e,t,a,r){let s=Ft(e,-1,1),i=e.sub(s).mul(2).add(1),n=Ft(ir(.5).add(s.mul(.5).mul(t.sub(s.mul(i).mul(a))).div(r)),0,1);return qt(t,s.mul(i).mul(a),n).sub(s.mul(r).mul(n).mul(ir(1).sub(n)))}function Eh(e,t,a,r,s){let i=ir(0).toVar(),n=a.y,l=a.z,o=a.w,u=le(e.lessThan(.5),()=>{i.assign(et(t).sub(n))}).ElseIf(e.lessThan(1.5),()=>{let e=ae(n,l,o),a=et(t.div(e)),r=et(t.div(e.mul(e)));i.assign(a.mul(a.sub(1)).div(r))}).ElseIf(e.lessThan(2.5),()=>{let e=ae(n,l,o),a=Ae(t).sub(e).toVar();i.assign(et(At(a,ae(0))).add(Dt(At(a.x,At(a.y,a.z)),0)))}).ElseIf(e.lessThan(3.5),()=>{let e=Ae(Y(et(t.xz),t.y)).sub(Y(l,n)).toVar();i.assign(Dt(At(e.x,e.y),0).add(et(At(e,Y(0)))))}).ElseIf(e.lessThan(4.5),()=>{let e=n,a=l,r=o,s=Y(et(t.xz),t.y).toVar(),u=Y(r,e),d=Y(r.sub(a),e.mul(2)),h=Y(s.x.sub(Dt(s.x,s.y.lessThan(0).select(a,r))),Ae(s.y).sub(e)).toVar(),m=s.sub(u).add(d.mul(Ft(Da(u.sub(s),d).div(Da(d,d)),0,1))).toVar(),c=m.x.lessThan(0).and(h.y.lessThan(0)).select(ir(-1),ir(1));i.assign(c.mul(na(Dt(Da(h,h),Da(m,m)))))}).ElseIf(e.lessThan(5.5),()=>{let e=Y(et(t.xy).sub(n),t.z);i.assign(et(e).sub(l))}),d=()=>{let e=Ae(t.x).toVar(),a=Y(n,l),s=o,u=r.w,d=a.y.mul(e).greaterThan(a.x.mul(t.y)).select(Da(Y(e,t.y),a),et(Y(e,t.y))),h=ae(e,t.y,t.z);i.assign(na(Da(h,h).add(s.mul(s)).sub(s.mul(d).mul(2))).sub(u))};return s?u.ElseIf(e.lessThan(6.5),d).Else(()=>{i.assign(s(t,a,r))}):u.Else(d),i}function Nh(e,t=!0){let a=e.spatialDivisions,r=e.spatialn;return(s,i)=>{let n=t?ne(0).toVar():ne(0),l=ir(1e3).toVar(),o=t?ir(0).toVar():ir(0),u=t?ir(0).toVar():ir(0),d=i.y.add(i.z.mul(a)).add(.5).div(a*a),h=(a,r)=>{let i=r.toVar();he(zh,({i:r})=>{le(i.lessThan(1),()=>{X()}),i.mulAssign(.5),le(B(i).greaterThanEqual(.5),()=>{let i=ir(r).add(a).add(.5).mul(1/kh),d=e.shapeRow(i,0).toVar(),h=e.shapeRow(i,1).toVar(),m=e.shapeRow(i,2).toVar(),c=e.shapeRow(i,3).toVar(),p=Ah(h,s.sub(d.xyz)).div(c.z).toVar(),g=Eh(m.x,p,m,c,e.meshSdf).sub(c.y).mul(c.z).toVar(),f=c.x.toVar(),_=d.w;if(l.assign(Ph(_,l,g,f)),t){let t=da(-1.5,_).mul(da(_,-.5)),a=$t(u,0,g.negate()),r=qt(ir(1),a,t);n.mulAssign(r),o.mulAssign(r),u.assign(At(u,f)),f.addAssign(e.colorKBump);let s=e.shapeRow(i,4).toVar(),l=$t(f,0,g).mul(s.a.greaterThanEqual(0).toFloat()).toVar();o.addAssign(l),n.addAssign(s.mul(l))}})})},m=t=>{let s=t.mul(4*zh).toVar(),n=e.spatialTex.sample(Y(i.x.mul(r).add(t).add(.5).div(r*a),d)).toVar();h(s,n.x),h(s.add(zh),n.y),h(s.add(2*zh),n.z),h(s.add(3*zh),n.w)};return 1===r?m(ir(0)):he(r,({i:e})=>{m(ir(e).toVar())}),t&&n.divAssign(o),{sdf:qt(l,ir(0),da(1e20,l)).toVar(),color:n,colorDivisor:o}}}var Bh=[4,4,4],Lh=(e,t)=>Ne(e,t);function Ih(e){let t=e.resolution,a=t-1,r=e.colorResolution,s=e.capacity,i=t/4,n=i-1,l=lr(e.bboxHalf),o=lr(e.bboxOffset),u=lr(1e30),d=lr(new ds(0,0,0)),h=lr(new ds(i,i,i)),m=e.env.spatialDivisions,c=ir(e.buildSeq).mul(0),p=e.sparseStorage??null,g=p?p.poolBricks:0,f=p?Math.ceil(g/4096):0,_=p?.meshlet??null,y=_?_.drawIndex:null,x=_?Math.floor(s/24):0,v=_?_.vertexBlocks:0,b=(e,t,a,r)=>{let s=new H(e,t,a);return s.format=xs,s.type=es,s.minFilter=Ws,s.magFilter=Ws,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=xs,T.type=es,T.minFilter=Ws,T.magFilter=Ws;let w=e.reuseTextures?.colorTexture??new H(r,r,r);w.name="SplineShapeBlend.ultraColor";let S=e.reuseTextures?.coarseTexture??new H(i,i,i);S.format=xs,S.type=es,S.minFilter=Ws,S.magFilter=Ws,S.name="SplineShapeBlend.ultraCoarse";let V=fe(8,"uint").toAtomic(),M=(e=0)=>V.element(e),C=p?fe(_?12:4,"int").toAtomic():null,z=e=>C.element(e),A=p?fe(Math.max(g,1),"float"):null,P=i*i*i,E=p?fe(P*(_?4:1),"float"):null,N=e=>Re(e.x.add(e.y.mul(i)).add(e.z.mul(i*i))),B=e=>E.element(N(e)),L=e=>E.element(N(e).add(Re(P))),I=e=>E.element(N(e).add(Re(2*P))),F=e=>E.element(N(e).add(Re(3*P))),D=e=>E.element(e.add(Re(3*P))),U=p?fe(Math.max(g,1),"float"):null,O=_?fe(3*Math.max(x,1),"float"):null,G=e=>O.element(e),q=e=>G(Re(e)),W=e=>G(Re(e.add(x))),j=e=>G(e.add(Re(2*x))),K=_?fe(Math.max(v,1),"float"):null,$=e=>K.element(e),Q=_?fe(24*Math.max(x,1),"uint"):null,Z=e=>Q.element(e),J=_?lr(0):null,ee=_?lr(new Ts):null,te=_?lr(2):null,ie=k(Array.from(e.numTrisTable)),oe=k(wh.map(([e,t,a])=>new ds(e,t,a))),ue=Nh(e.env,!1),de=Nh(e.env),ce=(e,t)=>e.div(t).mul(2).sub(1),pe=(e,t)=>e.div(t).mul(m-1).floor(),ge=re(()=>{for(let e=0;e<8;e++)Je(M(e),rr(0))})(),_e=re(()=>{le(Re(me).greaterThanEqual(Re(s)),()=>{Ce()}),e.buffers.positions.element(Re(me)).assign(ne(0))})(),ye=_?re(()=>{le(Re(me).greaterThanEqual(Re(s)),()=>{Ce()}),y.element(Re(me)).assign(rr(c))})():null,xe=Ia(S),ve=e=>xe.load(Ze(Ft(e,ae(0),ae(n)))).x,be=e=>B(Ft(e,ae(0),ae(n))),Te=(e,t)=>{let a=At(e,0),r=R(a.div(4096)),s=a.sub(r.mul(4096)),i=R(s.div(64)),n=s.sub(i.mul(64));return ae(n,i,r).mul(4).add(t)},we=re(()=>{let t=ae(se).add(d).toVar();le(t.x.greaterThan(n).or(t.y.greaterThan(n)).or(t.z.greaterThan(n)),()=>{Ce()});let r=t.mul(4).add(ae(1.5)),s=(t=>{let a=ir(1e3).toVar();return he(kh,({i:r})=>{le(ir(r).greaterThanEqual(e.npart),()=>{X()});let s=ir(r).add(.5).mul(1/kh),i=e.env.shapeRow(s,0).toVar(),n=e.env.shapeRow(s,1).toVar(),l=e.env.shapeRow(s,2).toVar(),o=e.env.shapeRow(s,3).toVar(),u=Ah(n,t.sub(i.xyz)).div(o.z).toVar(),d=Eh(l.x,u,l,o,e.env.meshSdf).sub(o.y).mul(o.z).toVar();a.assign(Ph(i.w,a,d,o.x))}),a})(ce(r,a));ya(S,Ze(t),ne(s.add(c),0,0,0)).toStack()})(),Se=e=>{le(e.x.greaterThan(n).or(e.y.greaterThan(n)).or(e.z.greaterThan(n)),()=>{Ce()})},Ve=p?re(()=>{let e=ae(se).toVar();Se(e),B(e).assign(ir(-1).add(c)),_&&(L(e).assign(ir(-1).add(c)),I(e).assign(ir(-1).add(c)))})():null,Me=p?re(()=>{let e=ae(se).add(d).toVar();Se(e);let t=ve(e).toVar(),a=be(e).toVar();le(Ae(t).greaterThan(u).and(a.greaterThan(-.5)),()=>{let t=Ke(z(1),Re(1)).toVar();A.element(t).assign(a),B(e).assign(ir(-1).add(c))})})():null,ze=p?re(()=>{let e=ae(se).add(d).toVar();Se(e);let t=ve(e).toVar(),a=be(e).toVar();le(Ae(t).lessThanEqual(u).and(a.lessThan(-.5)),()=>{let t=ir(-1).toVar(),a=at(z(1),Re(1)).toVar();le(a.greaterThanEqual(1),()=>{t.assign(A.element(a.sub(1)))}).Else(()=>{Ke(z(1),Re(1));let e=Ke(z(0),Re(1)).toVar();le(e.lessThan(Re(g)),()=>{t.assign(e.toFloat())}).Else(()=>{Je(z(2),Re(1))})}),le(t.greaterThan(-.5),()=>{U.element(Re(t)).assign((e=>e.x.add(e.y.mul(256)).add(e.z.mul(65536)))(e)),B(e).assign(t.add(c))})})})():null,ke=p?re(()=>{let e=Qe(z(0)).toVar(),t=Qe(z(2)).toVar();if(Je(M(1),rr(e)),Je(M(2),rr(t)),Je(z(2),Re(0)),_){let e=Qe(z(3)).toVar(),t=Qe(z(5)).toVar();Je(M(4),rr(e)),Je(M(5),rr(t)),Je(z(5),Re(0));let a=Qe(z(6)).toVar(),r=Qe(z(8)).toVar();Je(M(6),rr(a)),Je(M(7),rr(r)),Je(z(8),Re(0))}})():null,Pe=_?re(()=>{let e=ae(se).toVar();le(e.x.greaterThanEqual(h.x).or(e.y.greaterThanEqual(h.y)).or(e.z.greaterThanEqual(h.z)),()=>{Ce()});let t=e.add(d).toVar();Se(t);let a=I(t).toVar();le(a.greaterThan(-.5),()=>{let e=Ke(z(7),Re(1)).toVar();$(e).assign(a),I(t).assign(ir(-1).add(c))});let r=L(t).toVar();le(r.lessThan(-.5),()=>{Ce()}),L(t).assign(ir(-1).add(c)),he(48,()=>{le(r.lessThan(-.5),()=>{X()});let e=Ke(z(4),Re(1)).toVar();j(e).assign(r),r.assign(q(r))})})():null,Ee=_?re(()=>{let e=ae(se).add(d).toVar();Se(e);let t=ir(0).toVar();le(be(e).greaterThan(-.5),()=>{let a=e.mul(4).toVar(),r=Ye.map(([e,t,r])=>We(ae(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=Ya(s).toVar(),n=Da(r[0],i);for(let e=1;e<8;e++)n=Dt(n,Da(r[e],i));le(n.greaterThan(te),()=>{t.assign(ir(1))})}),F(e).assign(t.add(c))})():null,Ne=Math.min(4096,Math.max(g,1)),Be=()=>{let e=ae(se).toVar(),t=R(e.x.mul(.25)).toVar(),a=R(e.y.mul(.25)).toVar();return{slot:a.mul(Ne).add(t).toVar(),local:ae(e.x.sub(t.mul(4)),e.y.sub(a.mul(4)),e.z).toVar()}},Le=e=>(e=>{let t=R(e.div(65536)),a=e.sub(t.mul(65536)),r=R(a.div(256)),s=a.sub(r.mul(256));return ae(s,r,t)})(U.element(Re(e))),Ie=p?re(()=>{let e=ae(se).add(d.mul(4)).toVar(),t=e.mul(.25).floor().toVar(),r=be(t).toVar();le(r.lessThan(-.5),()=>{Ce()});let{sdf:s}=ue(ce(e,a),pe(e,a));ya(T,Ze(Te(r,e.sub(t.mul(4)))),ne(s.add(c),0,0,0)).toStack()})():null,De=p?re(()=>{let{slot:e,local:t}=Be();le(e.greaterThanEqual(g),()=>{Ce()});let r=Le(e).toVar();le(be(r).notEqual(e),()=>{Ce()});let s=r.mul(4).add(t).toVar(),{sdf:i}=ue(ce(s,a),pe(s,a));ya(T,Ze(Te(e,t)),ne(i.add(c),0,0,0)).toStack()})():re(()=>{let e=ae(se).add(d.mul(4)).toVar(),t=ve(e.mul(.25).floor()).toVar();le(Ae(t).greaterThan(u),()=>{ya(T,Ze(e),ne(t.add(c),0,0,0)).toStack(),Ce()});let{sdf:r}=ue(ce(e,a),pe(e,a));ya(T,Ze(e),ne(r.add(c),0,0,0)).toStack()})(),Ue=re(()=>{let e=ae(se).add(d.mul(2)).toVar();le(e.x.greaterThan(r-1).or(e.y.greaterThan(r-1)).or(e.z.greaterThan(r-1)),()=>{Ce()}),le(Ae(ve(e.mul(.5).floor())).greaterThan(u),()=>{Ce()});let{color:t,colorDivisor:a}=de(ce(e,r-1),pe(e,r-1)),s=a.greaterThan(0).select(t,ne(0));ya(w,Ze(e),Ft(s.add(c),ne(0),ne(1))).toStack()})(),Ge=Ia(T),qe=p?(e,t,r)=>{let s=Ft(ae(e,t,r),ae(0),ae(a)),i=s.mul(.25).floor(),n=be(i),l=Ge.load(Ze(Te(n,s.sub(i.mul(4))))).x;return n.lessThan(-.5).select(ve(i),l)}:(e,t,r)=>Ge.load(Ze(Ft(ae(e,t,r),ae(0),ae(a)))).x,We=e=>{let t=e.x,a=e.y,r=e.z,s=qe(t.add(1),a,r).sub(qe(t.sub(1),a,r)),i=qe(t,a.add(1),r).sub(qe(t,a.sub(1),r)),n=qe(t,a,r.add(1)).sub(qe(t,a,r.sub(1)));return s.equal(0).and(i.equal(0)).and(n.equal(0)).select(ae(.199,.299,.399),Ya(ae(s,i,n)))},He=(t,r,i)=>{let n=((e,t,a)=>{let r=(r,s,i,n)=>qe(e.add(r),t.add(s),a.add(i)).lessThan(0).toFloat().mul(n);return r(0,0,0,1).add(r(1,0,0,2)).add(r(0,1,0,8)).add(r(1,1,0,4)).add(r(0,0,1,16)).add(r(1,0,1,32)).add(r(0,1,1,128)).add(r(1,1,1,64))})(t,r,i).toVar(),u=ie.element(Re(n)).toVar();le(u.lessThan(.5),()=>{Ce()});let d=Ke(M(),rr(u)).toVar();le(ir(d).add(u).mul(3).lessThanEqual(s),()=>{let s=n.add(.5).mul(.00390625);he(5,({i:n})=>{le(ir(n).greaterThanEqual(u),()=>{X()});let h=ir(n).toVar();he(3,({i:n})=>{let u=ir(n).toVar();((t,r,s,i,n,u)=>{let d=n.mul(.0625).add(.03125),h=e.triTable.sample(Y(d,i)).x.mul(2).toInt().toVar(),m=ae(t,r,s).add(oe.element(h)).toVar(),c=ae(t,r,s).add(oe.element(h.add(1))).toVar(),p=qe(m.x,m.y,m.z).toVar(),g=qe(c.x,c.y,c.z).toVar(),f=p.div(p.sub(g)).toVar(),_=m.add(c.sub(m).mul(f)).toVar().div(a).mul(2).sub(1).toVar(),y=_.mul(l).add(ae(o)),x=Ya(qt(We(m),We(c),f)),v=_.add(1).mul(.5),b=Ia(w,v,Re(0)),T=u.toVar();e.buffers.positions.element(T).assign(ne(y,1)),e.buffers.normals.element(T).assign(ne(x,0)),e.buffers.colors.element(T).assign(b)})(t,r,i,s,h.mul(3).add(u),Re(d).add(Re(h)).mul(3).add(Re(u)))})})})},je=p?re(()=>{let{slot:e,local:t}=Be();le(e.greaterThanEqual(g),()=>{Ce()});let r=Le(e).toVar();le(be(r).notEqual(e),()=>{Ce()});let s=r.x.mul(4).add(t.x).toVar(),i=r.y.mul(4).add(t.y).toVar(),n=r.z.mul(4).add(t.z).toVar();le(s.greaterThanEqual(a).or(i.greaterThanEqual(a)).or(n.greaterThanEqual(a)),()=>{Ce()}),He(s,i,n)})():re(()=>{let e=ae(se).x.toVar(),t=ae(se).y.toVar(),r=ae(se).z.toVar();le(e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a)),()=>{Ce()}),le(Ae(ve(ae(e,t,r).mul(.25).floor())).greaterThan(u),()=>{Ce()}),He(e,t,r)})(),$e=()=>{let e=ae(Oe).toVar(),t=e.y.mul(Ne).add(e.x).toVar(),a=ae(0).toVar(),r=ir(0).toVar();return le(t.lessThan(g),()=>{a.assign(Le(t)),le(be(a).equal(t),()=>{r.assign(ir(1))})}),{brick:a,valid:r}},Xe=()=>{let e=ae(Oe).add(d).toVar(),t=ir(0).toVar();return le(e.x.lessThanEqual(n).and(e.y.lessThanEqual(n)).and(e.z.lessThanEqual(n)),()=>{le(be(e).greaterThan(-.5),()=>{t.assign(ir(1))})}),{brick:e,valid:t}},Ye=[[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]],tt=t=>re(()=>{let r=Lh("float",64),s=Lh("float",1),i=ae(ut).toVar(),n=Re(i.x.add(i.y.mul(4)).add(i.z.mul(16))).toVar(),{brick:u,valid:d}=t(),h=F(u).toVar(),m=ir(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=Ye.map(([e,t,a])=>qe(f.add(m.mul(e)),_.add(m.mul(t)),y.add(m.mul(a))).toVar()),b=x[0].lessThan(0).toFloat();for(let e=1;e<8;e++)b=b.add(x[e].lessThan(0).toFloat());let T=b.toVar(),S=ir(0).toVar();le(d.greaterThan(.5).and(g).and(f.add(m).lessThanEqual(a)).and(_.add(m).lessThanEqual(a)).and(y.add(m).lessThanEqual(a)).and(T.greaterThan(.5)).and(T.lessThan(7.5)),()=>{S.assign(ir(1))}),r.element(n).assign(S.add(c)),Fe(),le(n.equal(Re(0)).and(d.greaterThan(.5)),()=>{let e=ir(0).toVar();he(64,({i:t})=>{e.addAssign(r.element(t))});let t=ir(-1).toVar();le(e.greaterThan(.5),()=>{let e=at(z(7),Re(1)).toVar();le(e.greaterThanEqual(1),()=>{t.assign($(e.sub(1)))}).Else(()=>{Ke(z(7),Re(1));let e=Ke(z(6),Re(1)).toVar();le(e.lessThan(Re(v)),()=>{t.assign(e.toFloat())}).Else(()=>{Je(z(8),Re(1))})}),le(t.greaterThan(-.5),()=>{I(u).assign(t.add(c))})}),s.element(Re(0)).assign(t)}),Fe();let V=s.element(Re(0)).toVar(),M=S.greaterThan(.5).or(p.and(g).and(d.greaterThan(.5)).and(f.add(m).lessThanEqual(a)).and(_.add(m).lessThanEqual(a)).and(y.add(m).lessThanEqual(a)));le(M.and(V.greaterThan(-.5)),()=>{let t=ae(0).toVar(),r=ir(0).toVar();for(let[e,a]of et)le(x[e].lessThan(0).toFloat().notEqual(x[a].lessThan(0).toFloat()),()=>{let s=x[e].div(x[e].sub(x[a])),[i,n,l]=Ye[e],[o,u,d]=Ye[a];t.addAssign(ae(i,n,l).add(ae(o-i,u-n,d-l).mul(s)).mul(m)),r.addAssign(1)});let s=t.div(At(r,1)).toVar();le(r.lessThan(.5),()=>{s.assign(ae(m.mul(.5)))});let u=ae(f,_,y).add(s).toVar().div(a).mul(2).sub(1).toVar(),d=u.mul(l).add(ae(o)),h=ae(0).toVar(),c=s.div(m).toVar();for(let e=0;e<8;e++){let[t,a,r]=Ye[e],s=t?Ch(c.x):ir(1).sub(Ch(c.x)),i=a?Ch(c.y):ir(1).sub(Ch(c.y)),n=r?Ch(c.z):ir(1).sub(Ch(c.z));h.addAssign(We(Rh(ae(f.add(m.mul(t)),_.add(m.mul(a)),y.add(m.mul(r))))).mul(s.mul(i).mul(n)))}let g=Ya(h),v=u.add(1).mul(.5),b=Ia(w,v,Re(0)),T=Re(p.select(i.x.add(i.y.mul(2)).add(i.z.mul(4)),ir(n))).toVar(),S=Re(V.mul(64)).add(T).toVar();e.buffers.positions.element(S).assign(ne(d,1)),e.buffers.normals.element(S).assign(ne(g,0)),e.buffers.colors.element(S).assign(b)})})(),rt=_?tt($e):null,st=_?tt(Xe):null,it=e=>re(()=>{let t=Lh("float",64),r=Lh("float",64),s=Lh("float",48),n=ae(ut).toVar(),l=Re(n.x.add(n.y.mul(4)).add(n.z.mul(16))).toVar(),{brick:o,valid:u}=e(),d=o.x.mul(4).add(n.x).toVar(),h=o.y.mul(4).add(n.y).toVar(),m=o.z.mul(4).add(n.z).toVar(),p=qe(d,h,m).lessThan(0).toFloat().toVar(),g=(e,t,a)=>D(Re(R(e.mul(.25))).add(Re(R(t.mul(.25))).mul(i)).add(Re(R(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=ir(0).toVar(),v=ir(0).toVar(),b=ir(0).toVar(),T=ir(1).toVar(),w=ir(1).toVar(),S=ir(1).toVar(),V=(e,t,r,s,i,n,l,o,c)=>{let y=g(...c[0]).add(g(...c[1])).add(g(...c[2])).add(g(...c[3])).greaterThan(3.5).toVar(),x=qe(d.add(r),h.add(s),m.add(i)).lessThan(0).toFloat(),v=qe(d.add(2*r),h.add(2*s),m.add(2*i)).lessThan(0).toFloat();le(u.greaterThan(.5).and(y.not()).and(o.add(1).lessThanEqual(a)).and(_(n,ir(1))).and(_(l,ir(1))).and(p.notEqual(x)),()=>{e.assign(ir(1)),t.assign(ir(1))}),le(u.greaterThan(.5).and(y).and(f(d)).and(f(h)).and(f(m)).and(o.add(2).lessThanEqual(a)).and(_(n,ir(2))).and(_(l,ir(2))).and(p.notEqual(v)),()=>{e.assign(ir(1)),t.assign(ir(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)),Fe(),le(l.equal(Re(0)).and(u.greaterThan(.5)),()=>{let e=ir(0).toVar();he(64,({i:a})=>{r.element(a).assign(e),e.addAssign(t.element(a))}),Ke(M(0),rr(e));let a=R(e.add(7).mul(1/8)).toVar(),i=ir(-1).toVar(),n=ir(-1).toVar();he(48,({i:t})=>{le(ir(t).greaterThanEqual(a),()=>{X()});let r=ir(t).toVar(),l=ir(-1).toVar(),o=at(z(4),Re(1)).toVar();le(o.greaterThanEqual(1),()=>{l.assign(j(o.sub(1)))}).Else(()=>{Ke(z(4),Re(1));let e=Ke(z(3),Re(1)).toVar();le(e.lessThan(Re(x)),()=>{l.assign(e.toFloat())}).Else(()=>{Je(z(5),Re(1))})}),s.element(Re(r)).assign(l),le(l.greaterThan(-.5),()=>{W(l).assign(Dt(e.sub(r.mul(8)),8)),q(l).assign(ir(-1)),le(n.greaterThan(-.5),()=>{q(n).assign(l)}).Else(()=>{i.assign(l)}),n.assign(l)})}),L(o).assign(i)}),Fe(),le(C.greaterThan(.5),()=>{let e=(e,t,a)=>{let r=R(e.mul(.25)),s=R(t.mul(.25)),n=R(a.mul(.25)),l=Re(r).add(Re(s).mul(i)).add(Re(n).mul(i*i)),o=Re(e.sub(r.mul(4))).add(Re(t.sub(s.mul(4))).mul(4)).add(Re(a.sub(n.mul(4))).mul(16));return rr(l.mul(64).add(o))},t=r.element(l).toVar(),a=(e,a,r)=>{let i=s.element(Re(R(t.mul(1/8)))).toVar();le(i.greaterThan(-.5),()=>{let s=t.sub(R(t.mul(1/8)).mul(8)),n=Re(i.mul(24).add(s.mul(3))).toVar();Z(n).assign(e),Z(n.add(Re(1))).assign(a),Z(n.add(Re(2))).assign(r)}),t.addAssign(1)},n=(t,r)=>{le(t.greaterThan(.5),()=>{let t=e(...r[0]).toVar(),s=e(...r[1]).toVar(),i=e(...r[2]).toVar(),n=e(...r[3]).toVar();le(p.greaterThan(.5),()=>{a(t,s,i),a(t,i,n)}).Else(()=>{a(t,n,i),a(t,i,s)})})};n(y,[[d,h.sub(T),m.sub(T)],[d,h,m.sub(T)],[d,h,m],[d,h.sub(T),m]]),n(v,[[d.sub(w),h,m.sub(w)],[d.sub(w),h,m],[d,h,m],[d,h,m.sub(w)]]),n(b,[[d.sub(S),h.sub(S),m],[d,h.sub(S),m],[d,h,m],[d.sub(S),h,m]])})})(),nt=_?it($e):null,lt=_?it(Xe):null,ot=_?re(()=>{let e=Lh("float",48),t=Lh("float",2),r=ae(ut).toVar(),s=Re(r.x.add(r.y.mul(4)).add(r.z.mul(16))).toVar(),i=ae(Oe).toVar(),n=i.y.mul(Ne).add(i.x).toVar();le(s.equal(Re(0)),()=>{let r=ir(0).toVar();le(n.lessThan(g),()=>{let t=Le(n).toVar();le(be(t).equal(n),()=>{let s=ir(0).toVar();le(J.greaterThan(.5),()=>{let e=ae(0).toVar(),r=ae(0).toVar();for(let s=0;s<8;s++){let i=Rh(t.mul(4).add(ae(4*(1&s),4*(s>>1&1),4*(s>>2&1)))),n=Rh(i.div(a).mul(2).sub(1)).mul(l).add(ae(o)),u=ee.mul(ne(n,1)).toVar(),d=Ch(u.w);e.addAssign(ae(Ch(u.x).lessThan(d.negate()).toFloat(),Ch(u.y).lessThan(d.negate()).toFloat(),Ch(u.z).lessThan(0).toFloat())),r.addAssign(ae(Ch(u.x).greaterThan(d).toFloat(),Ch(u.y).greaterThan(d).toFloat(),Ch(u.z).greaterThan(d).toFloat()))}le(At(At(e.x,At(e.y,e.z)),At(r.x,At(r.y,r.z))).greaterThan(7.5),()=>{s.assign(ir(1))})}),le(s.lessThan(.5),()=>{let a=L(t).toVar();he(48,({i:t})=>{le(a.lessThan(-.5),()=>{X()}),e.element(t).assign(a),r.addAssign(W(a)),a.assign(q(a))})})})});let s=ir(0).toVar();le(r.greaterThan(.5),()=>{let e=Ke(M(3),rr(r.mul(3))).toVar();s.assign(ir(e))}),t.element(Re(0)).assign(s.add(c)),t.element(Re(1)).assign(r)}),Fe();let u=t.element(Re(1)).toVar(),d=t.element(Re(0)).toVar(),h=ir(s).toVar();he(6,()=>{le(h.greaterThanEqual(u),()=>{X()});let t=e.element(Re(R(h.mul(1/8)))).toVar(),a=h.sub(R(h.mul(1/8)).mul(8)),r=Re(t.mul(24).add(a.mul(3))).toVar(),s=Re(d.add(h.mul(3))).toVar(),i=e=>{let t=Z(0===e?r:r.add(Re(e))).toVar(),a=Re(t.shiftRight(rr(6))).toVar(),s=Re(t.bitAnd(rr(63))).toVar(),i=(e=>E.element(e.add(Re(2*P))))(a).toVar(),n=D(a),l=s.bitAnd(Re(3)),o=s.shiftRight(Re(2)).bitAnd(Re(3)),u=s.shiftRight(Re(4)).bitAnd(Re(3)),d=l.shiftRight(Re(1)).add(o.shiftRight(Re(1)).mul(Re(2))).add(u.shiftRight(Re(1)).mul(Re(4)));return{blockF:i,li:Re(n.greaterThan(.5).select(d,s)).toVar()}},n=i(0),l=i(1),o=i(2);le(n.blockF.greaterThan(-.5).and(l.blockF.greaterThan(-.5)).and(o.blockF.greaterThan(-.5)),()=>{let e=e=>rr(Re(e.blockF.mul(64)).add(e.li));y.element(s).assign(e(n)),y.element(s.add(Re(1))).assign(e(l)),y.element(s.add(Re(2))).assign(e(o))}).Else(()=>{y.element(s).assign(rr(0)),y.element(s.add(Re(1))).assign(rr(0)),y.element(s.add(Re(2))).assign(rr(0))}),h.addAssign(64)})})():null,dt=Math.ceil(t/Bh[0]),ht=Math.ceil(r/Bh[0]),mt=Math.ceil(i/Bh[0]),ct=(e,t)=>e.compute(t,Array.isArray(t)?Bh:void 0),pt=[Ne,Math.max(1,Math.ceil(g/Ne)),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,E,U,O,K,Q].filter(e=>null!==e).map(e=>e.value),uniforms:{bboxHalf:l,bboxOffset:o,activeThreshold:u,windowOrigin:d,..._?{windowSize:h,cullEnabled:J,cullMVP:ee,adaptCos:te}:{}},kernels:{zero:ct(ge,1),clear:_e.compute([Math.ceil(s/256),1,1],[256,1,1]),coarse:ct(we,[mt,mt,mt]),...Ve?{init:ct(Ve,[mt,mt,mt])}:{},...Me?{release:ct(Me,[mt,mt,mt])}:{},...ze?{alloc:ct(ze,[mt,mt,mt])}:{},...ke?{stats:ct(ke,1)}:{},sdf:ct(De,p?pt:[dt,dt,dt]),...Ie?{sdfWindow:ct(Ie,[dt,dt,dt])}:{},color:ct(Ue,[ht,ht,ht]),extract:_?ct(nt,pt):ct(je,p?pt:[dt,dt,dt]),..._?{clearDraw:ye.compute([Math.ceil(s/256),1,1],[256,1,1]),meshRelease:ct(Pe,[mt,mt,mt]),verts:ct(rt,pt),vertsWindow:ct(st,[i,i,i]),extractWindow:ct(lt,[i,i,i]),classify:ct(Ee,[mt,mt,mt]),gather:ct(ot,pt)}:{}}}}var Fh=24576;function Dh(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/Fh));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 ds(0,0,0),o=new ds,u=0;for(let e=0;e<i;e++){let r=e*s*3;for(let e=0;e<3;e++){let s=a?a.getX(r+e):r+e;o.fromBufferAttribute(t,s),n[u++]=o.x,n[u++]=o.y,n[u++]=o.z,n[u++]=0,l.x=Math.max(l.x,Math.abs(o.x)),l.y=Math.max(l.y,Math.abs(o.y)),l.z=Math.max(l.z,Math.abs(o.z))}}if(0===l.x&&0===l.y&&0===l.z)return null;let d=Math.max(l.x,l.y,l.z);return l.x=1.08*Math.max(l.x,.05*d),l.y=1.08*Math.max(l.y,.05*d),l.z=1.08*Math.max(l.z,.05*d),{data:n,triCount:i,boxHalf:l}}function Uh(e){let t=Ia(e);return(e,a,r)=>{let s=At(ae(a.z,a.w,r.w),ae(1e-5)).toVar(),i=a.y,n=ae(i.mod(4).mul(48),R(i.div(4)).mul(48),0).toVar(),l=Ft(e.div(s).mul(.5).add(.5),ae(0),ae(1)).mul(47).toVar(),o=Dt(R(l),ae(46)).toVar(),u=l.sub(o).toVar(),d=n.add(o).toVar(),h=(e,a,r)=>t.load(Ze(d.add(ae(e,a,r)))).x,m=u.x,c=u.y,p=u.z,g=qt(h(0,0,0),h(1,0,0),m),f=qt(h(0,1,0),h(1,1,0),m),_=qt(h(0,0,1),h(1,0,1),m),y=qt(h(0,1,1),h(1,1,1),m),x=qt(qt(g,f,c),qt(_,y,c),p),v=At(s.x,At(s.y,s.z)),b=Ae(e).sub(s),T=et(At(b,ae(0)));return x.mul(v).add(T)}}function Oh(e){return new ds(e%4*48,48*Math.floor(e/4),0)}var Gh=e=>e,qh=e=>e,Wh=new Ga,Hh=Ea(new ps),jh=lr(1),Kh=lr(1),$h=lr(0),Xh=lr(0),Qh=lr(1),Zh=null;function Yh(){if(null!==Zh)return Zh;let e=re(()=>{let e=Y(jh,Kh),t=Y(1).div(e),a=U().mul(Qh).sub(Y(.5)).mul(2).add(Y(.5)).toVar();a.x.addAssign($h);let r=a.div(e).toVar(),s=Hh.sample(r).x.toVar();r.x.addAssign(t.x);let i=Hh.sample(r).x.toVar();r.y.addAssign(t.y);let n=Hh.sample(r).x.toVar();r.x.subAssign(t.x);let l=Hh.sample(r).x.toVar(),o=s,u=o.add(i),d=u.add(n),h=d.add(l);return ne(h,d,u,o)})(),t=new bt;return t.name="SplineShapeBlend.pyramid",t.fragmentNode=e,t.depthTest=!1,t.depthWrite=!1,t.blending=Us,t.needsUpdate=!0,Zh=t,t}var Jh=!1,em=!1,tm="",am=!1,rm=!1,sm=!1,im=!1,nm=!1,lm=!1,om=!1,um=!1,dm=!1;try{let e=new URLSearchParams(window.location.search);Jh="vertex"===e.get("dbgsbmarch"),em="0"===e.get("dbgsbultra"),tm=e.get("dbgsbchain")??"",am="1"===e.get("dbgsbnoclear"),rm="0"===e.get("dbgsbsparse"),sm="0"===e.get("dbgsbincr"),im="1"===e.get("dbgsblod"),nm="1"===e.get("dbgsbpool"),lm="0"===e.get("dbgsbpool"),om="0"===e.get("dbgsbmesh"),um="0"===e.get("dbgsbadapt"),dm="1"===e.get("dbgsbcull")}catch{}var hm={updates:0,skips:0,computes:0,readbacksResolved:0,readbackErrors:0,fieldsFull:0,fieldsWindowed:0,lastWindowBricks:0,refines:0,lastDispatchRes:0,regathers:0,readbackPending:!1,lastTotal:-1,lastPass:"",staleConfigSkips:0,marchPositions:null},mm=24576,cm=Math.cos(8*Math.PI/180);function pm(e,t,a=1){return new ys(e,t,{count:a,format:gs,type:es,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:Ws,magFilter:Ws,wrapS:Fs,wrapT:Fs})}var gm=class{constructor(e=0,t=0,a=0){this.wantsReplacement=!1,this.capacityHint=0,this._builtOnce=!1,this.level=-1,this.spatialnAtBuild=-1,this._passesRenderer=null,this._marchCapacity=0,this._marchBuffers=null,this._computeNode=null,this._computeNodeKey="",this._legacyMaterialsLevel=-1,this._computeDirty=!1,this._cachedAtBuild=!1,this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,this._lastFieldChangeMs=0,this._ultraResAtBuild=0,this._ultraReadbackPending=!1,this._ultraReadbackQueued=!1,this._ultraWantedCapacity=0,this._poolAtBuild=0,this._ultraWantedPoolBricks=0,this.poolHint=0,this._drawIndex=null,this._vertexBuffers=null,this._vertBlocksAtBuild=0,this._ultraWantedVertexBlocks=0,this.vertHint=0,this._cullCamera=null,this._lastGatherMVP=new Ts,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=Ea(new ps),this.spatialTexNode=Ea(new ps),this.potentialTexNode=Ea(new ps),this.voxelTexNode=Ea(new ps),this.pyramid1TexNode=Ea(new ps),this.pyramid2TexNode=Ea(new ps),this.npartUniform=lr(0),this.spatialnUniform=lr(1),this.spanUniform=lr(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 Hs(r.triTable,16,256,xs,es);i.needsUpdate=!0;let n=new Hs(r.numTrisTable,256,1,xs,es);n.needsUpdate=!0,this.triTableTexNode=Ea(i),this.numTrisTableTexNode=Ea(n)}shapeRow(e,t){return this.shapesTex.sample(Y(e,(t+.5)/5))}_quadMaterial(e,t){let a=new bt;return a.name=e,a.fragmentNode=t,a.depthTest=!1,a.depthWrite=!1,a.blending=Us,a.needsUpdate=!0,a}_buildSpatialMaterial(e){let t=e.spatialDivisions,a=h,r=m,s=this.npartUniform,i=this.spatialnUniform,n=this.spanUniform,l=e.spatialn,o=re(()=>{let e=Y(t*l,t**2),o=R(U().mul(e)).toVar(),u=o.y.toVar(),d=u.sub(R(u.div(t)).mul(t)).toVar();u.assign(R(u.div(t)));let h=u,m=o.x.toVar(),c=m.sub(R(m.div(i)).mul(i)).toVar().mul(4*a).toVar();m.assign(R(m.div(i)));let p=ae(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=ir(0).toVar();for(let i=a-1;i>=0;i--){let a=e.add(i),n=a.add(.5).div(r),l=this.shapeRow(n,0),o=qh(l.xyz),u=Gh(l.w);t.mulAssign(2);let d=Gh(g.x).lessThan(Gh(o.x)).and(Gh(o.x).lessThan(Gh(f.x))).and(Gh(g.y).lessThan(Gh(o.y))).and(Gh(o.y).lessThan(Gh(f.y))).and(Gh(g.z).lessThan(Gh(o.z))).and(Gh(o.z).lessThan(Gh(f.z))).and(a.lessThan(Gh(s))).or(u.equal(-2));t.addAssign(d.select(ir(1),ir(0)))}return t};return ne(_(c),_(c.add(a)),_(c.add(2*a)),_(c.add(3*a)))})();return this._quadMaterial("SplineShapeBlend.spatial",o)}_fieldEnv(e,t){return{shapeRow:(e,t)=>this.shapeRow(e,t),spatialTex:this.spatialTexNode,spatialDivisions:e.spatialDivisions,spatialn:e.spatialn,colorKBump:t,meshSdf:this._meshBaker?Uh(this._meshBaker.atlas):void 0}}_buildPotentialMaterial(e){let t=e.spatialDivisions,a=e.resolution,r=a-1,s=1/a,i=e.zLayersPerRow,n=e.basePyramidSize,l=Nh(this._fieldEnv(e,2*s)),o=re(()=>{let e=R(U().mul(Y(n,n))).toVar(),o=e.x.mod(a),u=e.y.mod(a),d=R(e.x.mul(s)).add(R(e.y.mul(s)).mul(i)),h=ae(o,u,d),m=h.div(r).mul(2).sub(1).toVar(),c=R(h.div(r).mul(t-1)).toVar(),{sdf:p,color:g}=l(m,c),f=rr(g.x.mul(255)),_=rr(g.y.mul(255)),y=f.shiftLeft(rr(8)).bitOr(_);return ne(p,y.toFloat().mul(1525902e-11),g.z,g.w)})();return this._quadMaterial("SplineShapeBlend.potential",o)}_buildVoxelMaterial(e){let t=e.resolution,a=t-1,r=1/t,s=e.zLayersPerRow,i=e.basePyramidSize,n=Th(t,s),l=this.potentialTexNode,o=()=>{let e=R(U().mul(Y(i,i))).toVar();return{xi:e.x.mod(t).toVar(),yi:e.y.mod(t).toVar(),zi:R(e.x.mul(r)).add(R(e.y.mul(r)).mul(s)).toVar()}},u=(e,t,a)=>{let r=(r,s,i,o)=>n(e.add(r),t.add(s),a.add(i),l).x.lessThan(0).toFloat().mul(o);return r(0,0,0,1).add(r(1,0,0,2)).add(r(0,1,0,8)).add(r(1,1,0,4)).add(r(0,0,1,16)).add(r(1,0,1,32)).add(r(0,1,1,128)).add(r(1,1,1,64))},d=re(()=>{let{xi:e,yi:t,zi:r}=o(),s=((e,t,a)=>{let r=n(e.add(1),t,a,l).x.sub(n(e.sub(1),t,a,l).x),s=n(e,t.add(1),a,l).x.sub(n(e,t.sub(1),a,l).x),i=n(e,t,a.add(1),l).x.sub(n(e,t,a.sub(1),l).x);return r.equal(0).and(s.equal(0)).and(i.equal(0)).select(ae(.199,.299,.399),Ya(ae(r,s,i)))})(e,t,r).toVar(),i=ne(s,0).toVar(),d=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return le(d.not(),()=>{i.assign(ne(s,u(e,t,r)))}),i})(),h=re(()=>{let{xi:e,yi:t,zi:r}=o(),s=ne(0).toVar(),i=e.greaterThanEqual(a).or(t.greaterThanEqual(a)).or(r.greaterThanEqual(a));return le(i.not(),()=>{let a=u(e,t,r);s.assign(this.numTrisTableTexNode.sample(Y(a.add(.5).div(256),.5)))}),s})();return this._quadMaterial("SplineShapeBlend.voxel",ba({output:d,numTris:h}))}_spatialTargetFor(e){let t=e.resolutionLevel,a=this.spatialTargets[t];return a||(a=pm(e.spatialDivisions*e.spatialn,e.spatialDivisions**2),this.spatialTargets[t]=a),a}_targetsFor(e){let t=e.resolutionLevel,a=this._spatialTargetFor(e),r=this.potentialTargets[t];r||(r=pm(e.basePyramidSize,e.basePyramidSize),this.potentialTargets[t]=r);let s=this.voxelTargets[t];s||(s=pm(e.basePyramidSize,e.basePyramidSize,2),s.textures[0].name="output",s.textures[1].name="numTris",s.textures[1].format=xs,this.voxelTargets[t]=s);let i=this.pyramidTargets[t];return i||(i=[pm(e.pyramidTexture1Width,e.pyramidTexture1Height),pm(e.pyramidTexture2Width,e.pyramidTexture2Height)],this.pyramidTargets[t]=i),{spatial:a,potential:r,voxel:s,pyramid:i}}_marchResources(e){let t=this._targetsFor(e),a=e.pyramidLevelSizes.length%2==0?0:1,r=1-a;return{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:t.pyramid[r].width,height:t.pyramid[r].height},pyramid2Size:{width:t.pyramid[a].width,height:t.pyramid[a].height}}}_maxMarchSlots(e){let t=e.backend?.device?.limits,a=Math.min(t?.maxStorageBufferBindingSize??134217728,t?.maxBufferSize??268435456);return 192*Math.floor(a/16/192)}_ensureMarchCapacity(e,t){if(null!==this._marchBuffers&&e<=this._marchCapacity)return!1;let a=Math.min(Math.max(t,mm),192*Math.ceil(1.5*e/192));if(null!==this._marchBuffers&&a<=this._marchCapacity)return!1;if(null!==this._marchBuffers)for(let e of[this._marchBuffers.positions,this._marchBuffers.normals,this._marchBuffers.colors]){let t=e.value;t&&this._retiredStorage.push(t)}return this._marchBuffers={positions:fe(a,"vec4"),normals:fe(a,"vec4"),colors:fe(a,"vec4")},this._marchCapacity=a,this._computeNode=null,!0}update(e,t,a){if(hm.updates++,this._lastRenderer=t,void 0!==a&&(this._cullCamera=a),e._meshSdfBaked.size>0)for(let[t,a]of e._meshSdfBaked)a.owner!==this&&e._meshSdfBaked.delete(t);let r=p(e),i=!0===t.backend?.isWebGPUBackend;if(i&&e._meshSdfWanted.size>0&&null===this._meshBaker&&(this._meshBaker=function(e,t){let a=new H(192,48*Math.ceil(4),48);a.format=xs,a.type=es,a.minFilter=Ws,a.magFilter=Ws,a.name="SplineShapeBlend.meshSdfAtlas";let r=ir(t).mul(0),s=lr(new ds(0,0,0)),i=lr(0),n=lr(new ds(1,1,1)),l=fe(3*Fh,"vec4"),o=e=>l.element(e),u=re(()=>{let e=ae(se).toVar();le(e.x.greaterThanEqual(48).or(e.y.greaterThanEqual(48)).or(e.z.greaterThanEqual(48)),()=>{Ce()});let t=e.div(47).mul(2).sub(1).mul(n).toVar(),l=ir(1e30).toVar(),u=ir(1e15).toVar();he(Fh,({i:e})=>{le(ir(e).greaterThanEqual(i),()=>{X()});let a=Re(ir(e).toVar()).mul(3).toVar(),r=o(a).xyz.toVar(),s=o(a.add(Re(1))).xyz.toVar(),n=o(a.add(Re(2))).xyz.toVar(),d=s.sub(r).toVar(),h=n.sub(r).toVar(),m=t.sub(r).toVar(),c=Da(d,m).toVar(),p=Da(h,m).toVar(),g=t.sub(s).toVar(),f=Da(d,g).toVar(),_=Da(h,g).toVar(),y=t.sub(n).toVar(),x=Da(d,y).toVar(),v=Da(h,y).toVar(),b=ae(0).toVar(),T=f.mul(v).sub(x.mul(_)).toVar(),w=x.mul(p).sub(c.mul(v)).toVar(),S=c.mul(_).sub(f.mul(p)).toVar();le(c.lessThanEqual(0).and(p.lessThanEqual(0)),()=>{b.assign(r)}).ElseIf(f.greaterThanEqual(0).and(_.lessThanEqual(f)),()=>{b.assign(s)}).ElseIf(v.greaterThanEqual(0).and(x.lessThanEqual(v)),()=>{b.assign(n)}).ElseIf(S.lessThanEqual(0).and(c.greaterThanEqual(0)).and(f.lessThanEqual(0)),()=>{let e=c.div(c.sub(f));b.assign(r.add(d.mul(e)))}).ElseIf(w.lessThanEqual(0).and(p.greaterThanEqual(0)).and(v.lessThanEqual(0)),()=>{let e=p.div(p.sub(v));b.assign(r.add(h.mul(e)))}).ElseIf(T.lessThanEqual(0).and(_.sub(f).greaterThanEqual(0)).and(x.sub(v).greaterThanEqual(0)),()=>{let e=_.sub(f).div(_.sub(f).add(x.sub(v)));b.assign(s.add(n.sub(s).mul(e)))}).Else(()=>{let e=ir(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=Da(V,V).toVar();le(M.lessThan(l),()=>{l.assign(M);let e=ma(d,h),t=Da(V,e).greaterThanEqual(0).select(ir(1),ir(-1));u.assign(na(M).mul(t))})});let d=At(n.x,At(n.y,n.z));ya(a,Ze(e.add(s)),ne(u.div(d).add(r),0,0,0)).toStack()})(),d=Math.ceil(12),h=u.compute([d,d,d],[4,4,4]);return{atlas:a,slots:16,kernel:h,uniforms:{slotOrigin:s,triCount:i,boxHalf:n},setTriangles(e,t){let a=l.value;a.array.set(e.subarray(0,12*t)),a.needsUpdate=!0}}}(0,++this._ultraBuildSeq)),0===e.npart)return null!==this._meshBaker&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t),void(e.geometry.drawRange.count=0);this.npartUniform.value=e.npart,this.spatialnUniform.value=e.spatialn,this.spanUniform.value=e.spatialPassUniforms.span.value,e.shapesDataTexture.value&&(this.shapesTex.value=e.shapesDataTexture.value);let n=!Jh&&i,l=n&&!em&&e.ultraFieldResolution>0,o=l&&!lm&&(nm||e.ultraFieldResolution>=512)?Math.min(Math.pow(e.ultraFieldResolution/4,3),Math.max(function(e){let t=e/4;return Math.min(t*t*t,Math.max(8192,16*t*t))}(e.ultraFieldResolution),this._ultraWantedPoolBricks,this.poolHint)):0,u=o>0&&!om,d=this._maxMarchSlots(t),h=u?Math.min(Math.floor(d/64),Math.max(function(e){let t=e/4;return Math.min(262144,Math.max(2048,2*t*t))}(e.ultraFieldResolution),this._ultraWantedVertexBlocks,this.vertHint)):0,m=null!==this._meshBaker,c=e.needsRebuild||this.level!==e.resolutionLevel||this.spatialnAtBuild!==e.spatialn||this._cachedAtBuild!==n||this._ultraResAtBuild!==(l?e.ultraFieldResolution:0)||this._poolAtBuild!==o||this._vertBlocksAtBuild!==h||this._meshAtBuild!==m;if(c&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let g=n&&this._ensureMarchCapacity(Math.min(Math.max(d,mm),Math.max(e.geometry.drawRange.count,this.capacityHint,l?Math.max(function(e){return Math.max(mm,192*Math.ceil(16*e*e/192))}(e.ultraFieldResolution),this._ultraWantedCapacity):mm)),d);if(g&&this._builtOnce)return this.wantsReplacement=!0,this.capacityHint=Math.max(this._marchCapacity,this._ultraWantedCapacity),this.poolHint=Math.max(this.poolHint,this._ultraWantedPoolBricks),void(this.vertHint=Math.max(this.vertHint,this._ultraWantedVertexBlocks));let f=this._spatialTargetFor(e),_=l?null:this._targetsFor(e),y=c||g,x=l&&null!==this._ultra&&this._ultraResAtBuild===e.ultraFieldResolution&&!g&&this.level===e.resolutionLevel&&this.spatialnAtBuild===e.spatialn&&this._cachedAtBuild===n;if(y&&x)e.needsRebuild=!1,this._ultra.uniforms.bboxHalf.value=e.bboxSize/2,this._ultra.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag&&(this._ultraDrag.uniforms.bboxHalf.value=e.bboxSize/2,this._ultraDrag.uniforms.bboxOffset.value=e.bboxOffset);else if(y){e.needsRebuild=!1;let t=this.spatialnAtBuild!==e.spatialn;this.level=e.resolutionLevel,this.spatialnAtBuild=e.spatialn,this._meshAtBuild=m,(t||null===this.spatialMaterial)&&(this.spatialMaterial?.dispose(),this.spatialMaterial=this._buildSpatialMaterial(e)),this.spatialTexNode.value=f.texture;let a=this._ultra,r=this._ultraDrag;if(this._ultra=null,this._ultraDrag=null,this._lastDispatched=null,this._refinePending=!1,l){let t=e.ultraFieldResolution,i=null!==a&&this._ultraResAtBuild===t;if(i&&!g)this._ultra=a,a.uniforms.bboxHalf.value=e.bboxSize/2,a.uniforms.bboxOffset.value=e.bboxOffset,this._ultraDrag=r,r&&(r.uniforms.bboxHalf.value=e.bboxSize/2,r.uniforms.bboxOffset.value=e.bboxOffset);else{let n=i&&0===o&&!a.sparse;a&&!n&&this._ultraRetired.push(a.sdfTexture,a.colorTexture,a.coarseTexture),u&&null===this._drawIndex&&(this._drawIndex=fe(this._marchCapacity,"uint")),u&&null===this._vertexBuffers&&(this._vertexBuffers={positions:fe(64*h,"vec4"),normals:fe(64*h,"vec4"),colors:fe(64*h,"vec4")}),this._ultra=Ih({resolution:t,colorResolution:t/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(t/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:s().numTrisTable,buffers:u?this._vertexBuffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,sparseStorage:o>0?{poolBricks:o,meshlet:u?{drawIndex:this._drawIndex,vertexBlocks:h}:void 0}:void 0,reuseTextures:n?{sdfTexture:a.sdfTexture,colorTexture:a.colorTexture,coarseTexture:a.coarseTexture}:void 0}),this._poolAtBuild=o,this._vertBlocksAtBuild=h;let l=im&&t>=128&&!u?t/2:0;r&&(!i||0===l)&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),l>0&&(this._ultraDrag=Ih({resolution:l,colorResolution:l/2,bboxHalf:e.bboxSize/2,bboxOffset:e.bboxOffset,capacity:this._marchCapacity,env:this._fieldEnv(e,2/(l/2)),npart:this.npartUniform,triTable:this.triTableTexNode,numTrisTable:s().numTrisTable,buffers:this._marchBuffers,buildSeq:++this._ultraBuildSeq,reuseTextures:i&&r?{sdfTexture:r.sdfTexture,colorTexture:r.colorTexture,coarseTexture:r.coarseTexture}:void 0}))}this._ultraResAtBuild=t}else{a&&this._ultraRetired.push(a.sdfTexture,a.colorTexture,a.coarseTexture),r&&this._ultraRetired.push(r.sdfTexture,r.colorTexture,r.coarseTexture),(this._legacyMaterialsLevel!==e.resolutionLevel||t||null===this.potentialMaterial||null===this.voxelMaterial)&&(this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose(),this.potentialMaterial=this._buildPotentialMaterial(e),this.voxelMaterial=this._buildVoxelMaterial(e),this._legacyMaterialsLevel=e.resolutionLevel),this.potentialTexNode.value=_.potential.texture,this.voxelTexNode.value=_.voxel.textures[0];let s=e.pyramidLevelSizes.length%2==0?0:1,i=1-s;this.pyramid1TexNode.value=_.pyramid[i].texture,this.pyramid2TexNode.value=_.pyramid[s].texture,this._ultraResAtBuild=0}let i=e.material;void 0===i.defines&&(i.defines={}),tm.includes("nomat")||(i.defines.SHAPEBLEND=e.resolutionLevel),tm.includes("nomat")||i.setShapeBlendResources?.(l?{resolutionLevel:e.resolutionLevel,pyramidLevelSizes:e.pyramidLevelSizes,triTable:this.triTableTexNode,potential:this.potentialTexNode,voxel:this.voxelTexNode,pyramid1:this.pyramid1TexNode,pyramid2:this.pyramid2TexNode,pyramid1Size:{width:1,height:1},pyramid2Size:{width:1,height:1},cached:u?{...this._vertexBuffers,drawIndex:this._drawIndex}:this._marchBuffers}:{...this._marchResources(e),cached:n?this._marchBuffers:void 0}),this._cachedAtBuild=n;let d=`${e.resolutionLevel}:${this._marchCapacity}`;this._computeNodeKey!==d&&(this._computeNode=null,this._computeNodeKey=d)}if(y)return this._builtOnce=!0,void(this._computeDirty=!0);null!==this._meshBaker&&e._meshSdfWanted.size>0&&this._bakeNextMeshChild(e,t);let v=this._passesRenderer!==t,b=r&&!sm&&!this._computeDirty&&!v&&!e._fieldDirtyFull;if(!(r||this._computeDirty||v)){if(l&&this._refinePending&&null!==this._ultra&&performance.now()-this._lastFieldChangeMs>250)return this._refinePending=!1,this._passesRenderer=t,hm.refines++,void this._runUltra(e,t,!1,this._ultra);if(l&&dm&&null!==this._ultra&&this._ultra.meshlet&&this._lastDispatched===this._ultra&&!this._ultraReadbackPending&&this._updateCullUniforms(e,this._ultra)&&(!this._hasGatherMVP||!this._lastGatherMVP.equals(this._ultra.uniforms.cullMVP.value))){this._lastGatherMVP.copy(this._ultra.uniforms.cullMVP.value),this._hasGatherMVP=!0,hm.regathers++;let a=t;return a.compute(this._ultra.kernels.zero),am||a.compute(this._ultra.kernels.clearDraw),a.compute(this._ultra.kernels.gather),this._ultra.kernels.stats&&a.compute(this._ultra.kernels.stats),void this._runUltraReadback(e,t)}if(!e.drawRangeNeedsForceUpdate)return void hm.skips++;if(l)return void(this._ultraReadbackPending||this._runUltraReadback(e,t))}if(this._passesRenderer=t,tm.includes("none")&&hm.readbacksResolved>0)return void(this._computeDirty=!1);let T=t.getRenderTarget(),w=t.getMRT(),S=t.autoClear;if(t.setMRT(null),t.autoClear=!1,hm.lastPass="spatial",t.setRenderTarget(f),Wh.material=this.spatialMaterial,Wh.render(t),l){t.autoClear=S,t.setRenderTarget(T),t.setMRT(w);let a=null!==this._ultraDrag&&r&&!this._computeDirty;return this._refinePending=a,this._lastFieldChangeMs=performance.now(),this._runUltra(e,t,b,a?this._ultraDrag:this._ultra),void(this._computeDirty=!1)}return"spatial"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="potential",t.setRenderTarget(_.potential),Wh.material=this.potentialMaterial,Wh.render(t),"potential"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="voxel",t.setRenderTarget(_.voxel),Wh.material=this.voxelMaterial,Wh.render(t),"voxel"===tm&&hm.readbacksResolved>0?(t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),void(this._computeDirty=!1)):(hm.lastPass="pyramid",this._renderPyramid(e,t,_.voxel,_.pyramid),t.autoClear=S,t.setRenderTarget(T),t.setMRT(w),hm.lastPass="march",n&&(null===this._computeNode&&(this._computeNode=function(e,t,a){let r=Vh(e);return re(()=>{let{position:e,normal:a,color:s}=r(me.toFloat());t.positions.element(me).assign(ne(e,1)),t.normals.element(me).assign(ne(a,0)),t.colors.element(me).assign(s)})().compute(a)}(this._marchResources(e),this._marchBuffers,this._marchCapacity)),t.compute(this._computeNode),hm.computes++),void(this._computeDirty=!1))))}_bakeNextMeshChild(e,t){let a=this._meshBaker;for(let[r,s]of e._meshSdfWanted){let i=c(s);if(this._meshBakeFailed.get(r)===i)continue;let n=this._meshSlots.get(r);if(void 0===n){if(this._meshSlots.size>=a.slots)for(let t of this._meshSlots.keys())!e._meshSdfBaked.has(t)&&!e._meshSdfWanted.has(t)&&(this._meshSlots.delete(t),this._meshBakeFailed.delete(t));if(this._meshSlots.size>=a.slots){this._meshWarnedFull||(this._meshWarnedFull=!0,console.warn(`Spline shape blend: more than ${a.slots} distinct mesh children — the extra meshes are left out of the blend.`));continue}let t=new Set(this._meshSlots.values());for(n=0;t.has(n);)n++;this._meshSlots.set(r,n)}let l=Dh(s);if(null!==l)return a.setTriangles(l.data,l.triCount),a.uniforms.slotOrigin.value.copy(Oh(n)),a.uniforms.triCount.value=l.triCount,a.uniforms.boxHalf.value.copy(l.boxHalf),t.compute(a.kernel),e._meshSdfBaked.set(r,{slot:n,boxHalf:l.boxHalf.clone(),posVersion:i,owner:this}),void e._meshSdfWanted.delete(r);this._meshBakeFailed.set(r,i)}}_updateCullUniforms(e,t){if(!t.meshlet)return!1;let a=this._cullCamera;return dm&&a&&void 0!==a.projectionMatrix&&void 0!==a.matrixWorldInverse?(t.uniforms.cullMVP.value.multiplyMatrices(w.unjitteredProjection.value,a.matrixWorldInverse).multiply(e.matrixWorld),t.uniforms.cullEnabled.value=1,!0):(t.uniforms.cullEnabled.value=0,!1)}_runUltra(e,t,a,r){let s=t;hm.lastPass="ultra-kernels",hm.lastDispatchRes=r.resolution,hm.marchPositions=(r.meshlet?this._vertexBuffers:this._marchBuffers).positions.value,this._lastDispatched=r;let i=r.resolution,n=i/4,l=2/(i-1);r.uniforms.activeThreshold.value=rm?1e30:(3*Math.sqrt(3)+4)*l+.25*e._maxBlendK;let o=r.meshlet&&!um;r.meshlet&&(r.uniforms.adaptCos.value=o?cm:2);let u=0,d=0,h=0,m=n,c=n,p=n;if(a){let t=r.uniforms.activeThreshold.value+2/(e.spatialDivisions-1)+4/(i-1),a=e=>Math.floor(.5*(e+1)*(i-1)/4),s=e=>Math.min(n-1,Math.max(0,a(e))),l=e=>Math.min(n,Math.max(1,a(e)+1));if(u=s(e._fieldDirtyMin.x-t),d=s(e._fieldDirtyMin.y-t),h=s(e._fieldDirtyMin.z-t),m=l(e._fieldDirtyMax.x+t)-u,c=l(e._fieldDirtyMax.y+t)-d,p=l(e._fieldDirtyMax.z+t)-h,hm.fieldsWindowed++,o){let e=Math.min(n,u+m+1),t=Math.min(n,d+c+1),a=Math.min(n,h+p+1);u=Math.max(0,u-1),d=Math.max(0,d-1),h=Math.max(0,h-1),m=e-u,c=t-d,p=a-h}}else hm.fieldsFull++;hm.lastWindowBricks=m*c*p,r.uniforms.windowOrigin.value.set(u,d,h),r.uniforms.windowSize?.value.set(m,c,p);let g=0===u&&0===d&&0===h&&m===n&&c===n&&p===n,f=[Math.ceil(m/4),Math.ceil(c/4),Math.ceil(p/4)];r.meshlet&&this._updateCullUniforms(e,r)&&(this._lastGatherMVP.copy(r.uniforms.cullMVP.value),this._hasGatherMVP=!0),s.compute(r.kernels.zero),am||s.compute(r.meshlet?r.kernels.clearDraw:r.kernels.clear),r.needsInit&&r.kernels.init&&(s.compute(r.kernels.init),r.needsInit=!1),s.compute(r.kernels.coarse,f),r.kernels.release&&s.compute(r.kernels.release,f),r.kernels.alloc&&s.compute(r.kernels.alloc,f),r.kernels.meshRelease&&s.compute(r.kernels.meshRelease,f),r.sparse?g?s.compute(r.kernels.sdf):s.compute(r.kernels.sdfWindow,[m,c,p]):s.compute(r.kernels.sdf,[m,c,p]),r.kernels.classify&&s.compute(r.kernels.classify,f),s.compute(r.kernels.color,[Math.ceil(m/2),Math.ceil(c/2),Math.ceil(p/2)]),r.meshlet?(g?(s.compute(r.kernels.verts),s.compute(r.kernels.extract)):(s.compute(r.kernels.vertsWindow,[m,c,p]),s.compute(r.kernels.extractWindow,[m,c,p])),s.compute(r.kernels.gather)):s.compute(r.kernels.extract),r.kernels.stats&&s.compute(r.kernels.stats),hm.computes++,this._ultraReadbackPending?this._ultraReadbackQueued=!0:this._runUltraReadback(e,t)}_disposeRetired(){for(let e of this._ultraRetired)e.dispose();if(this._ultraRetired.length=0,this._retiredStorage.length>0){let e=this._lastRenderer?.backend?.attributeUtils;if(e)for(let t of this._retiredStorage)e.destroyAttribute(t);this._retiredStorage.length=0}for(let e of this._onSettled)e();this._onSettled.length=0}runWhenSettled(e){this._onSettled.push(e)}transferSettleQueue(e){e._onSettled.push(...this._onSettled),this._onSettled.length=0}_runUltraReadback(e,t){let a=this._lastDispatched??this._ultra,r=t;this._ultraReadbackPending=!0,hm.readbackPending=!0,r.getArrayBufferAsync(a.counterAttribute).then(r=>{if(this._ultraReadbackPending=!1,hm.readbackPending=!1,this.retired)return;this._disposeRetired();let s=new Uint32Array(r),i=a.meshlet?Math.floor(s[3]/3):s[0];if(hm.readbacksResolved++,hm.lastTotal=i,a.sparse&&s.length>2&&s[2]>0&&(this._ultraWantedPoolBricks=Math.ceil(1.5*Math.max(s[1],a.poolBricks)),this._computeDirty=!0),a.meshlet&&s.length>5&&s[5]>0){let e=Math.min(24*s[4],this._maxMarchSlots(t));e>this._marchCapacity&&(this._ultraWantedCapacity=Math.max(this._ultraWantedCapacity,e),this._computeDirty=!0)}if(a.meshlet&&s.length>7&&s[7]>0){let e=Math.min(Math.ceil(1.5*s[6]),Math.floor(this._maxMarchSlots(t)/64));e>a.vertexBlocks&&(this._ultraWantedVertexBlocks=Math.max(this._ultraWantedVertexBlocks,e),this._computeDirty=!0)}let n=Math.floor(this._marchCapacity/3);if(e.geometry.drawRange.count=3*Math.min(Math.ceil(1.25*i),n),e.markSceneShadowsDirty(),e.drawRangeNeedsForceUpdate=!1,this._ultraReadbackQueued&&(this._ultraReadbackQueued=!1,this._runUltraReadback(e,t)),i>n){let e=Math.min(3*i,this._maxMarchSlots(t));e>this._marchCapacity&&(this._ultraWantedCapacity=e,this._computeDirty=!0)}}).catch(()=>{hm.readbackErrors++,this._ultraReadbackPending=!1,hm.readbackPending=!1})}_renderPyramid(e,t,a,r){let s=e.pyramidLevelSizes,i=s.length-1-1;$h.value=0,Xh.value=0;for(let n=i;n>=0;n--){let l=n%2==i%2?r[0]:r[1],o=n===i?a:n%2==i%2?r[1]:r[0];Hh.value=o.textures.length>1?o.textures[1]:o.texture,jh.value=o.width,Kh.value=o.height;let u=s[n];2===n&&e.resolutionLevel%2!=0&&(u=3),Qh.value=u,l.viewport.set(Xh.value,0,u,u),t.setRenderTarget(l),Wh.material=Yh(),Wh.render(t),l.viewport.set(0,0,l.width,l.height);let d=$h.value;$h.value=Xh.value,Xh.value=d,n<i&&(Xh.value+=s[n+1])}hm.lastPass="pyramid-readback";let n=s.length%2==0?0:1;t.readRenderTargetPixelsAsync(r[n],r[n].width-1,0,1,1).then(t=>{let a=t[0];hm.readbacksResolved++,hm.lastTotal=a,!this.retired&&(this._disposeRetired(),(3*a>e.geometry.drawRange.count||e.drawRangeNeedsForceUpdate)&&(e.geometry.drawRange.count=3*Math.floor(1.2*a)),e.drawRangeNeedsForceUpdate=!1,null!==this._marchBuffers&&e.geometry.drawRange.count>this._marchCapacity&&(this._computeDirty=!0))}).catch(()=>{})}dispose(){for(let e of[...this.spatialTargets,...this.potentialTargets,...this.voxelTargets,...this.pyramidTargets.flat()])e?.dispose();this.spatialMaterial?.dispose(),this.potentialMaterial?.dispose(),this.voxelMaterial?.dispose();let e=this._lastRenderer?.backend?.attributeUtils,t=t=>{if(e&&null!==t)for(let a of[t.positions,t.normals,t.colors]){let t=a.value;t&&e.destroyAttribute(t)}},a=t=>{if(null!==t){for(let e of Object.values(t.kernels))e?.dispose?.();if(e)for(let a of t.storageAttributes)e.destroyAttribute(a)}};t(this._marchBuffers),t(this._vertexBuffers);let r=this._drawIndex?.value;e&&r&&e.destroyAttribute(r),this._drawIndex=null,this._computeNode?.dispose?.(),this._marchBuffers=null,this._vertexBuffers=null,this._computeNode=null,this._computeNodeKey="",this._marchCapacity=0,a(this._ultra),this._ultra?.sdfTexture.dispose(),this._ultra?.colorTexture.dispose(),this._ultra?.coarseTexture.dispose(),this._ultra=null,a(this._ultraDrag),this._ultraDrag?.sdfTexture.dispose(),this._ultraDrag?.colorTexture.dispose(),this._ultraDrag?.coarseTexture.dispose(),this._ultraDrag=null,this._meshBaker?.atlas.dispose(),this._meshBaker=null,this._lastDispatched=null,this._disposeRetired(),this._lastRenderer=null}},fm=new WeakMap,_m=new WeakMap,ym=[];i(function(e){if(e.cached)return function(e){let t=()=>e.drawIndex?e.drawIndex.element(ye):ye;return{position:re(a=>{let r=e.positions.element(t()).xyz.toVar();return Mh(a,r),r})(),normal:Te(e.normals.element(t()).xyz),color:Te(e.colors.element(t()))}}(e.cached);let t=Vh(e),a=$("vec3","vShapeBlendNormal"),r=$("vec4","vShapeBlendColor");return{position:re(e=>{let{position:s,normal:i,color:n}=t(ye.toFloat());return a.assign(i),r.assign(n),Mh(e,s),s})(),normal:a,color:r}}),l(e=>function(e){let t=fm.get(e);if(t?.wantsReplacement){let a=_m.get(e);_m.set(e,t),t.retired=!0;let r=new gm(t.capacityHint,t.poolHint,t.vertHint);t.transferSettleQueue(r),a&&r.runWhenSettled(()=>a.dispose()),t=r,fm.set(e,t)}return t||(t=new gm,fm.set(e,t)),t}(e)),u({release:e=>function(e){let t=fm.get(e),a=_m.get(e);fm.delete(e),_m.delete(e),a&&ym.push(a),t&&(t.retired=!0,ym.push(t))}(e),drainRetired:function(){let e=ym.length;if(e>0){for(let e of ym)e.dispose();ym.length=0}return e}});var xm=[64,1,1],vm=cr,bm=vm-1,Tm=(e,t)=>void 0!==t?lr(e,t):lr(e),wm=(e,t)=>{let a=e.xyz,r=ma(a,t),s=ma(a,r);return t.add(r.mul(e.w).mul(2)).add(s.mul(2))},Sm=re(([e,t])=>{let a=e,r=t,s=Da(a,r).add(1).toVar(),i=ae(0).toVar();return le(s.lessThan(1e-7),()=>{s.assign(0),le(Ae(a.x).greaterThan(Ae(a.z)),()=>{i.assign(ae(a.y.negate(),a.x,0))}).Else(()=>{i.assign(ae(0,a.z.negate(),a.y))})}).Else(()=>{i.assign(ma(a,r))}),(e=>{let t=Da(e,e);return t.lessThan(1e-10).select(ne(0,0,0,1),e.mul(Pe(At(t,1e-20))))})(ne(i,s))}),Vm=e=>(e=>e.sub(R(e.mul(1/289)).mul(289)))(e.mul(34).add(10).mul(e)),Mm=re(([e])=>{let t=e,a=1/6,r=1/3,s=R(t.add(Da(t,ae(r)))).toVar(),i=t.sub(s).add(Da(s,ae(a))).toVar(),n=da(i.yzx,i.xyz).toVar(),l=ae(1).sub(n).toVar(),o=Dt(n,l.zxy).toVar(),u=At(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(R(e.mul(1/289)).mul(289)))(s));let c=Vm(Vm(Vm(ne(0,o.z,u.z,1).add(s.z)).add(s.y).add(ne(0,o.y,u.y,1))).add(s.x).add(ne(0,o.x,u.x,1))).toVar(),p=.142857142857,g=2*p,f=.5*p-1,_=p,y=c.sub(R(c.mul(_*_)).mul(49)).toVar(),x=R(y.mul(_)).toVar(),v=R(y.sub(x.mul(7))).toVar(),b=x.mul(g).add(f).toVar(),T=v.mul(g).add(f).toVar(),w=ne(1).sub(Ae(b)).sub(Ae(T)).toVar(),S=ne(b.xy,T.xy).toVar(),V=ne(b.zw,T.zw).toVar(),M=R(S).mul(2).add(1).toVar(),C=R(V).mul(2).add(1).toVar(),z=da(w,ne(0)).negate().toVar(),k=S.xzyw.add(M.xzyw.mul(z.xxyy)).toVar(),A=V.xzyw.add(C.xzyw.mul(z.zzww)).toVar(),P=ae(k.xy,w.x).toVar(),E=ae(k.zw,w.y).toVar(),N=ae(A.xy,w.z).toVar(),B=ae(A.zw,w.w).toVar(),L=(e=>ne(1.79284291400159).sub(e.mul(.85373472095314)))(ne(Da(P,P),Da(E,E),Da(N,N),Da(B,B))).toVar();P.assign(P.mul(L.x)),E.assign(E.mul(L.y)),N.assign(N.mul(L.z)),B.assign(B.mul(L.w));let I=At(ne(.5).sub(ne(Da(i,i),Da(d,d),Da(h,h),Da(m,m))),ne(0)).toVar();return I.assign(I.mul(I)),Da(I.mul(I),ne(Da(P,i),Da(E,d),Da(N,h),Da(B,m))).mul(105)}),Cm=class extends Ot{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=Ya(kt.mul(ne(this.tangentWorld,0)).xyz),i=t,n=be,l=Ya(i.add(n)),o=At(et(ma(s,i)),0),u=At(et(ma(s,l)),0);r.directDiffuse.addAssign(a.mul(o).mul(this.diffuseIntensity).mul(Pa.rgb)),r.directSpecular.addAssign(a.mul(ze(u,this.specularPower)).mul(this.specularIntensity).mul(ae(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(Pa.rgb)),r.indirectDiffuse.mulAssign(a)}},Rm=class extends Ot{direct(e){let{lightDirection:t,lightColor:a,reflectedLight:r}=e,s=t,i=Wa,n=be,l=Ya(s.add(n)),o=Da(i,s).clamp(),u=Da(i,l).clamp();r.directDiffuse.addAssign(a.mul(o).mul(.85).mul(Pa.rgb)),r.directSpecular.addAssign(a.mul(ze(u,60)).mul(.3).mul(ae(.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(Pa.rgb)),r.indirectDiffuse.mulAssign(a)}},zm=class extends bt{constructor(e){super(),this.model=e,this.lights=!0}setupLightingModel(){return this.model}},km=new us,Am=new us,Pm=new ds,Em=class{constructor(){this.uNumStrands=Tm(0,"int"),this.uNumVerts=Tm(0,"int"),this.uDamping=Tm(.03),this.uLocalStiffness=Tm(.67),this.uGlobalStiffness=Tm(.5),this.uGlobalRange=Tm(.15),this.uStiffnessFalloff=Tm(.1),this.uGravity=Tm(0),this.uVspCoeff=Tm(.01),this.uVspThreshold=Tm(50),this.uKink=Tm(0),this.uKinkFreq=Tm(0),this.uUnitScale=Tm(100),this.uClumpStrength=Tm(0),this.uClumpSize=Tm(32,"int"),this.uClumpTipScale=Tm(1.5),this.uReset=Tm(1),this.uHasWind=Tm(0),this.uWind0=Tm(new ds),this.uWind1=Tm(new ds),this.uWind2=Tm(new ds),this.uWind3=Tm(new ds),this.uBoneQuat=Tm(new _s(0,0,0,1)),this.uBoneTrans=Tm(new ds),this.uDeltaQuat=Tm(new _s(0,0,0,1)),this.uPrevBoneTrans=Tm(new ds),this.uHairRoot=Tm(new Ss),this.uHairMid=Tm(new Ss),this.uHairTip=Tm(new Ss),this.uHeadColor=Tm(new Ss),this.uNoiseA=Tm(new Ss),this.uNoiseB=Tm(new Ss),this.uNoiseC=Tm(new Ss),this.uNoiseD=Tm(new Ss),this.uNoiseScale=Tm(.018),this.uNoiseMixHair=Tm(0),this.uNoiseMixHead=Tm(0),this.uWidth=Tm(.525),this.uSpecPow=Tm(40),this.uSpecInt=Tm(.4),this.uDiffInt=Tm(.6),this.uAmbInt=Tm(.25),this.uOpacity=Tm(1),this.uTipFade=Tm(.4),this.uColorSource=Tm(0),this.uShadeRoot=Tm(.6),this.uShadeTip=Tm(1.15),this.uShadowTexelWorld=Tm(0),this._armed=!1,this._uploadedGeneration=-1,this._prevBoneQuat=new us,this._prevBonePos=new ds,this._hasPrevBone=!1,this._renderer=null,this.initialPos=fe(gr,"vec4"),this.rootColors=fe(pr,"vec4"),this.positions=fe(gr,"vec4"),this.positionsPrev=fe(gr,"vec4"),this.positionsPrevPrev=fe(gr,"vec4"),this.tangents=fe(gr,"vec4"),this.restLengths=fe(gr,"float"),this.vspQuats=fe(pr,"vec4"),this.vspTrans=fe(pr,"vec4"),this.kIntegrate=this._buildIntegrate(),this.kStrandLevel=this._buildStrandLevel(),this.kVsp=this._buildVsp(),this.kLocalShape=this._buildLocalShape(),this.kLengthWind=this._buildLengthWind(),this.kClump=this._buildClump(),this.kRigidFollow=this._buildRigidFollow(),this.ribbonMaterial=this._buildRibbonMaterial(),this.scalpMaterial=this._buildScalpMaterial()}boneQuatNode(){return this.uBoneQuat}boneTransNode(){return this.uBoneTrans}_buildIntegrate(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Ce()});let t=e.div(vm).toVar(),a=e.sub(t.mul(vm)).toVar(),r=this.boneQuatNode(),s=this.boneTransNode(),i=this.initialPos.element(e).toVar(),n=ne(wm(r,i.xyz).add(s),i.w).toVar(),l=this.positions.element(e).toVar(),o=this.positionsPrev.element(e).toVar(),u=o.toVar();le(this.uReset.greaterThan(.5),()=>{l.assign(n),u.assign(n)});let d=n.toVar();le(l.w.greaterThan(0),()=>{let e=ir(_r),t=Ka(this.uDamping.negate().mul(e).mul(60)),a=l.xyz.add(l.xyz.sub(u.xyz).mul(t)).add(ae(0,-1,0).mul(this.uGravity).mul(e).mul(e));d.assign(ne(a,l.w))}),le(this.uGlobalStiffness.greaterThan(0).and(this.uGlobalRange.greaterThan(0)).and(d.w.greaterThan(0)).and(a.toFloat().lessThan(this.uGlobalRange.mul(vm))),()=>{let t=e.sub(a),s=this.initialPos.element(t),i=Ya(wm(r,s.xyz)).y.mul(.5).add(.5),l=this.uGlobalStiffness.mul(ze(At(i,0),this.uStiffnessFalloff)),o=n.xyz.sub(d.xyz).mul(l);d.assign(ne(d.xyz.add(o),d.w))}),le(this.uKink.greaterThan(0).and(d.w.greaterThan(0)),()=>{let e=a.toFloat().div(vm),r=t.sub(t.div(256).mul(256)).toFloat().mul(.0245),i=e.mul(this.uKinkFreq).mul(6.2831853).add(r),l=this.uKink.mul(e).mul(.15).mul(this.uUnitScale),o=Ya(n.xyz.sub(s)).toVar(),u=ae(0).toVar();le(Ae(o.y).lessThan(.99),()=>{u.assign(Ya(ma(o,ae(0,1,0))))}).Else(()=>{u.assign(Ya(ma(o,ae(1,0,0))))});let h=Ya(ma(o,u)),m=u.mul(Wt(i)).mul(l).add(h.mul(oa(i.mul(1.3).add(r))).mul(l).mul(.7));d.assign(ne(d.xyz.add(m),d.w))}),this.positionsPrevPrev.element(e).assign(o),this.positionsPrev.element(e).assign(l),this.positions.element(e).assign(d)})().compute(xm[0],xm)}_buildStrandLevel(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=e.mul(vm).toVar(),a=this.positionsPrevPrev.element(t.add(1)),r=this.positionsPrev.element(t),s=this.positionsPrev.element(t.add(1)),i=this.positions.element(t),n=this.positions.element(t.add(1)),l=s.xyz.sub(r.xyz),o=n.xyz.sub(i.xyz),u=l.div(At(et(l),1e-7)),d=o.div(At(et(o),1e-7)),h=Sm(u,d).toVar(),m=i.xyz.sub(wm(h,r.xyz)),c=this.uVspCoeff.toVar(),p=et(n.xyz.sub(s.xyz.mul(2)).add(a.xyz));le(p.greaterThan(this.uVspThreshold),()=>{c.assign(1)}),this.vspQuats.element(e).assign(h),this.vspTrans.element(e).assign(ne(m,c))})().compute(xm[0],xm)}_buildVsp(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Ce()});let t=e.div(vm).toVar(),a=e.sub(t.mul(vm)).toVar();le(a.lessThan(2),()=>{Ce()});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=>ne(e.xyz.mul(ir(1).sub(i)).add(wm(r,e.xyz).add(s.xyz).mul(i)),e.w);this.positions.element(e).assign(o(n)),this.positionsPrev.element(e).assign(o(l))})().compute(xm[0],xm)}_buildLocalShape(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=e.mul(vm).toVar(),a=Dt(this.uLocalStiffness,.95).mul(.5),r=this.boneQuatNode();he(bm-1,({i:e})=>{let s=t.add(e).add(1).toVar(),i=this.positions.element(s).toVar(),n=this.positions.element(s.add(1)).toVar(),l=this.positions.element(s.sub(1)),o=wm(r,this.initialPos.element(s).xyz),u=wm(r,this.initialPos.element(s.add(1)).xyz),d=wm(r,this.initialPos.element(s.sub(1)).xyz),h=i.xyz.sub(l.xyz),m=u.sub(o),c=o.sub(d),p=Sm(c.div(At(et(c),1e-7)),h.div(At(et(h),1e-7))),g=wm(p,m).add(i.xyz).sub(n.xyz).mul(a);le(i.w.greaterThan(0),()=>{i.assign(ne(i.xyz.sub(g),i.w))}),le(n.w.greaterThan(0),()=>{n.assign(ne(n.xyz.add(g),n.w))}),this.positions.element(s).assign(i),this.positions.element(s.add(1)).assign(n)})})().compute(xm[0],xm)}_buildLengthWind(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=e.mul(vm).toVar();le(this.uHasWind.greaterThan(.5),()=>{let a=e.sub(e.div(20).mul(20)).toFloat().div(20),r=this.uWind0.mul(a).add(this.uWind1.mul(ir(1).sub(a))).add(this.uWind2.mul(a)).add(this.uWind3.mul(ir(1).sub(a))).toVar();he(bm-2,({i:e})=>{let a=t.add(e).add(2).toVar(),s=this.positions.element(a).toVar(),i=this.positions.element(a.add(1)),n=s.xyz.sub(i.xyz),l=ma(ma(n,r),n).negate();s.assign(ne(s.xyz.add(l.mul(_r).mul(.1)),s.w)),this.positions.element(a).assign(s)})}),he(5,()=>{he(bm,({i:e})=>{let a=t.add(e).toVar(),r=this.positions.element(a).toVar(),s=this.positions.element(a.add(1)).toVar(),i=this.restLengths.element(a),n=s.xyz.sub(r.xyz),l=At(et(n),1e-7),o=ir(1).sub(i.div(l)),u=n.mul(o),d=r.w.greaterThan(0),h=s.w.greaterThan(0),m=d.select(h.select(ir(.5),ir(1)),ir(0)),c=h.select(d.select(ir(.5),ir(1)),ir(0));r.assign(ne(r.xyz.add(u.mul(m)),r.w)),s.assign(ne(s.xyz.sub(u.mul(c)),s.w)),this.positions.element(a).assign(r),this.positions.element(a.add(1)).assign(s)})}),he(bm,({i:e})=>{let a=t.add(e).add(1).toVar(),r=this.positions.element(a.sub(1)),s=this.positions.element(a).toVar(),i=s.xyz.sub(r.xyz),n=At(et(i),1e-7),l=this.restLengths.element(a.sub(1));le(n.greaterThan(l),()=>{s.assign(ne(r.xyz.add(i.div(n).mul(l)),s.w)),this.positions.element(a).assign(s)})}),he(vm,({i:e})=>{let a=t.add(e).toVar(),r=e.equal(vm-1).select(a.sub(1),a).toVar(),s=Ya(this.positions.element(r.add(1)).xyz.sub(this.positions.element(r).xyz));this.tangents.element(a).assign(ne(s,0))})})().compute(xm[0],xm)}_buildClump(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumStrands),()=>{Ce()});let t=this.uClumpSize.toVar(),a=e.div(t).mul(t).toVar();le(e.equal(a),()=>{Ce()}),le(a.greaterThanEqual(this.uNumStrands),()=>{Ce()});let r=e.mul(vm).toVar(),s=a.mul(vm).toVar();he(bm,({i:e})=>{let t=e.add(1).toVar(),a=t.toFloat().div(bm),i=this.uClumpStrength.mul(ze(a,ir(1).div(At(this.uClumpTipScale,.5)))),n=r.add(t).toVar(),l=this.positions.element(n).toVar(),o=this.positions.element(s.add(t));l.assign(ne(qt(l.xyz,o.xyz,i),l.w)),this.positions.element(n).assign(l)})})().compute(xm[0],xm)}_buildRigidFollow(){return re(()=>{let e=Re(me).toVar();le(e.greaterThanEqual(this.uNumVerts),()=>{Ce()});let t=this.uDeltaQuat,a=this.uPrevBoneTrans,r=this.boneTransNode(),s=s=>{let i=s.element(e).toVar();i.assign(ne(wm(t,i.xyz.sub(a)).add(r),i.w)),s.element(e).assign(i)};s(this.positions),s(this.positionsPrev),s(this.positionsPrevPrev);let i=this.tangents.element(e).toVar();i.assign(ne(wm(t,i.xyz),0)),this.tangents.element(e).assign(i)})().compute(xm[0],xm)}pastelNoise(e){let t=e.sub(this.boneTransNode()).mul(this.uNoiseScale),a=Mm(t).mul(.5).add(.5),r=Mm(t.add(ae(31.7,17.3,53.1))).mul(.5).add(.5),s=Mm(t.mul(.7).add(ae(71.9,11.2,43.8))).mul(.5).add(.5),i=qt(this.uNoiseA,this.uNoiseB,a);return i=qt(i,this.uNoiseC,r.mul(.6)),i=qt(i,this.uNoiseD,s.mul(.25)),i}_buildRibbonMaterial(){let e=$("vec3","vHairTangent"),t=$("vec3","vHairNormal"),a=$("vec2","vHairUv"),r=$("float","vHairRand"),s=$("vec3","vHairInherit"),i=new zm(new Cm(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=Is;let n=i=>re(()=>{let n=Re(me).toVar(),l=n.div(bm).toVar(),o=n.sub(l.mul(bm)).toVar(),u=l.mul(vm).add(o).toVar(),d=Re(ye).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,_=qt(c,p,m).toVar(),y=qt(g,f,m).toVar(),x=Ya(yt.sub(_)),v=ma(y,x).toVar(),b=et(v).toVar();v.assign(b.greaterThan(1e-7).select(v.div(b),ae(1,0,0)));let T=o.toFloat().div(bm),w=o.add(1).toFloat().div(bm),S=qt(T,w,m).toVar(),V=this.uWidth.mul(ir(1).sub(S.mul(this.uTipFade))).toVar(),M=i?(()=>{let e=this.uShadowTexelWorld,t=e.greaterThan(0).select(e.mul(1.5).clamp(ir(2),ir(8)),ir(0));return At(t.sub(V),0).toVar()})():null;M&&V.addAssign(M);let C=h.mul(2).sub(1),R=_.add(v.mul(V).mul(C)).toVar();M&&R.assign(R.sub(x.mul(M)));let z=this.positionsPrev.element(u).xyz,k=this.positionsPrev.element(u.add(1)).xyz;ce.assign(qt(z,k,m).add(v.mul(V).mul(C)));let A=B(Wt(l.toFloat().mul(12.9898)).mul(43758.5453));return r.assign(A),s.assign(this.rootColors.element(l).xyz),e.assign(y),t.assign(Ya(x.sub(y.mul(Da(y,x))))),a.assign(Y(h,S)),R}),l=re(()=>{let e=a.y,t=qt(this.uHairRoot,this.uHairMid,Dt(e.mul(2),1)),i=e.lessThan(.5).select(t,qt(this.uHairMid,this.uHairTip,e.sub(.5).mul(2))).toVar(),n=s.mul(qt(this.uShadeRoot,this.uShadeTip,e));i.assign(this.uColorSource.greaterThan(.5).select(n,i)),i.assign(qt(i,this.pastelNoise(Ve),this.uNoiseMixHair));let l=ir(1).sub(Ae(a.x.sub(.5)).mul(2));return ir(1).sub(e.mul(this.uTipFade)).mul(ze(At(l,0),.5)).toVar().lessThan(.25).discard(),r.greaterThanEqual(this.uOpacity).discard(),ne(i,1)});return i.positionNode=n(!1)(),i.castShadowPositionNode=n(!0)(),i.normalNode=t,i.colorNode=l(),i.needsUpdate=!0,i}_buildScalpMaterial(){let e=new zm(new Rm);e.name="SplineHairScalp";let t=re(()=>{let e=qt(this.uHeadColor,this.pastelNoise(Ve),this.uNoiseMixHead);return ne(e,1)});return e.colorNode=t(),e.needsUpdate=!0,e}update(e,t){let a=t;if(!0!==a.backend?.isWebGPUBackend||(this._renderer=a,!1===e.visible))return;if(!this._armed){this._armed=!0;let t=e.ribbonMesh.material;e.ribbonMesh.material=this.ribbonMaterial,t.dispose?.();let a=e.scalpMesh.material;e.scalpMesh.material=this.scalpMaterial,a.dispose?.(),e.ribbonMesh.visible=!0}e.checkDataDrift();let r=e.activeGuideStrands,s=r*vm;e.generation!==this._uploadedGeneration&&(this._uploadedGeneration=e.generation,this.initialPos.value.array.set(e.roots.initialPositions),this.initialPos.value.needsUpdate=!0,this.restLengths.value.array.set(e.roots.restLengths),this.restLengths.value.needsUpdate=!0,this.rootColors.value.array.set(e.roots.rootColors),this.rootColors.value.needsUpdate=!0,e.ribbonMesh.geometry.instanceCount=r*bm,e.resetRequested=!0),this._syncUniforms(e),e.boneTransform(km,Pm),this.uBoneQuat.value.set(km.x,km.y,km.z,km.w),this.uBoneTrans.value.copy(Pm);let i=this._hasPrevBone&&(Math.abs(this._prevBoneQuat.dot(km))<.9999995||this._prevBonePos.distanceToSquared(Pm)>1e-8),n=Math.floor(e.pendingSimSeconds/_r);n>yr&&(n=yr),e.pendingSimSeconds=Math.max(0,Math.min(e.pendingSimSeconds-n*_r,_r)),e.resetRequested&&n<1&&(n=1),n<1&&i&&(Am.copy(this._prevBoneQuat).invert().premultiply(km),this.uDeltaQuat.value.set(Am.x,Am.y,Am.z,Am.w),this.uPrevBoneTrans.value.copy(this._prevBonePos),this._dispatch(a,this.kRigidFollow,s));for(let t=0;t<n;t++){this.uReset.value=e.resetRequested&&0===t?1:0,e.simTime+=_r,this._updateWind(e),this._dispatch(a,this.kIntegrate,s),this._dispatch(a,this.kStrandLevel,r),this._dispatch(a,this.kVsp,s);for(let e=0;e<2;e++)this._dispatch(a,this.kLocalShape,r);this._dispatch(a,this.kLengthWind,r),e.data.clumpStrength>.001&&this._dispatch(a,this.kClump,r)}n>0&&(e.resetRequested=!1),this._prevBoneQuat.copy(km),this._prevBonePos.copy(Pm),this._hasPrevBone=!0}_dispatch(e,t,a){t.count=a,e.compute(t)}_updateWind(e){let t=e.data,a=Math.max(e.roots.unitScale,.001),r=t.windStrength/a;this.uHasWind.value=t.windStrength>.001?1:0;let s=.7*e.simTime,i=Math.sin(s)*r,n=Math.cos(s)*r*.5;this.uWind0.value.set(i,0,n),this.uWind1.value.set(.7*i,.5*r,1.2*n),this.uWind2.value.set(.3*-i,0,.5*n),this.uWind3.value.set(.5*i,-.3*r,.8*-n)}_shadowTexelWorld(e){let t=e;for(;t.parent;)t=t.parent;let a=t;if(!a?.traverse)return 0;let r=0;return a.traverse(e=>{let t=e;if(!0!==t.isDirectionalLight||!0!==t.castShadow||!1===t.visible)return;let a=t.shadow?.camera,s=t.shadow?.mapSize?.x??0;"number"!=typeof a?.right||"number"!=typeof a?.left||s<=0||(r=Math.max(r,(a.right-a.left)/s))}),r}_syncUniforms(e){let t=e.data,a=e.roots.unitScale;this.uNumStrands.value=e.activeGuideStrands,this.uNumVerts.value=e.activeGuideStrands*vm,this.uDamping.value=t.damping,this.uLocalStiffness.value=t.localStiffness,this.uGlobalStiffness.value=t.globalStiffness,this.uGlobalRange.value=t.globalRange,this.uStiffnessFalloff.value=t.stiffnessFalloff,this.uGravity.value=t.gravity*a,this.uVspCoeff.value=t.vspCoefficient,this.uVspThreshold.value=.5*a,this.uKink.value=t.kink,this.uKinkFreq.value=t.kinkFrequency,this.uUnitScale.value=a,this.uClumpStrength.value=t.clumpStrength,this.uClumpSize.value=Math.max(1,Math.round(t.clumpSize)),this.uClumpTipScale.value=t.clumpTipScale;let r=(e,t)=>{e.value.setRGB(t.r,t.g,t.b,cs)};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*fr*e.widthWorldScale,this.uShadowTexelWorld.value=this._shadowTexelWorld(e),this.uColorSource.value="object"===t.hairColorSource&&"object"===t.headShape&&t.baseObjectId?1:0,this.uShadeRoot.value=t.hairShadeRoot??.6,this.uShadeTip.value=t.hairShadeTip??1.15,this.uSpecPow.value=t.specularPower,this.uSpecInt.value=t.specularIntensity,this.uDiffInt.value=t.diffuseIntensity,this.uAmbInt.value=t.ambientIntensity,this.uOpacity.value=t.opacity,this.uTipFade.value=t.tipFade}dispose(){for(let e of[this.kIntegrate,this.kStrandLevel,this.kVsp,this.kLocalShape,this.kLengthWind,this.kClump,this.kRigidFollow])e.dispose();this.ribbonMaterial.dispose(),this.scalpMaterial.dispose();let e=this._renderer?.backend?.attributeUtils;if(e)for(let t of[this.initialPos,this.rootColors,this.positions,this.positionsPrev,this.positionsPrevPrev,this.tangents,this.restLengths,this.vspQuats,this.vspTrans])e.destroyAttribute(t.value);this._renderer=null}},Nm=new WeakMap,Bm=[];ur(e=>function(e){let t=Nm.get(e);return void 0===t&&(t=new Em,Nm.set(e,t)),t}(e)),hr({release:e=>function(e){let t=Nm.get(e);void 0!==t&&(Nm.delete(e),Bm.push(t))}(e),drainRetired:function(){let e=Bm.length;if(e>0){for(let e of Bm)e.dispose();Bm.length=0}return e}});var Lm="\nconst PI: f32 = 3.14159265358979323846;\n\nconst TRANSMITTANCE_TEXTURE_WIDTH: i32 = 256;\nconst TRANSMITTANCE_TEXTURE_HEIGHT: i32 = 64;\nconst SCATTERING_TEXTURE_R_SIZE: i32 = 32;\nconst SCATTERING_TEXTURE_MU_SIZE: i32 = 128;\nconst SCATTERING_TEXTURE_MU_S_SIZE: i32 = 32;\nconst SCATTERING_TEXTURE_NU_SIZE: i32 = 8;\nconst SCATTERING_TEXTURE_WIDTH: i32 = 256;\nconst SCATTERING_TEXTURE_HEIGHT: i32 = 128;\nconst SCATTERING_TEXTURE_DEPTH: i32 = 32;\nconst IRRADIANCE_TEXTURE_WIDTH: i32 = 64;\nconst IRRADIANCE_TEXTURE_HEIGHT: i32 = 16;\n\nstruct DensityProfileLayer {\n\twidth: f32,\n\texp_term: f32,\n\texp_scale: f32,\n\tlinear_term: f32,\n\tconstant_term: f32,\n\tpad0: f32,\n\tpad1: f32,\n\tpad2: f32,\n}\n\nstruct DensityProfile {\n\tlayers: array<DensityProfileLayer, 2>,\n}\n\n\n\n\nstruct Atm {\n\tsolar_irradiance: vec3f,\n\tsun_angular_radius: f32,\n\trayleigh_scattering: vec3f,\n\tbottom_radius: f32,\n\tmie_scattering: vec3f,\n\ttop_radius: f32,\n\tmie_extinction: vec3f,\n\tmie_phase_function_g: f32,\n\tabsorption_extinction: vec3f,\n\tmu_s_min: f32,\n\tground_albedo: vec3f,\n\tpad0: f32,\n\tsky_spectral_radiance_to_luminance: vec3f,\n\tpad1: f32,\n\tsun_spectral_radiance_to_luminance: vec3f,\n\tpad2: f32,\n\trayleigh_density: DensityProfile,\n\tmie_density: DensityProfile,\n\tabsorption_density: DensityProfile,\n}\n\nfn ClampCosine(mu: f32) -> f32 {\n\treturn clamp(mu, -1.0, 1.0);\n}\n\nfn ClampDistance(d: f32) -> f32 {\n\treturn max(d, 0.0);\n}\n\nfn ClampRadius(atm: Atm, r: f32) -> f32 {\n\treturn clamp(r, atm.bottom_radius, atm.top_radius);\n}\n\nfn SafeSqrt(a: f32) -> f32 {\n\treturn sqrt(max(a, 0.0));\n}\n\n\n\nfn smoothstepGl(edge0: f32, edge1: f32, x: f32) -> f32 {\n\tlet t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n\treturn t * t * (3.0 - 2.0 * t);\n}\n\n\n\n\nfn tex2DBilinear(t: texture_2d<f32>, uv: vec2f, size: vec2i) -> vec4f {\n\tlet coord = uv * vec2f(size) - 0.5;\n\tlet i0 = vec2i(floor(coord));\n\tlet f = coord - floor(coord);\n\tlet maxc = size - 1;\n\tlet c00 = textureLoad(t, clamp(i0, vec2i(0), maxc), 0);\n\tlet c10 = textureLoad(t, clamp(i0 + vec2i(1, 0), vec2i(0), maxc), 0);\n\tlet c01 = textureLoad(t, clamp(i0 + vec2i(0, 1), vec2i(0), maxc), 0);\n\tlet c11 = textureLoad(t, clamp(i0 + vec2i(1, 1), vec2i(0), maxc), 0);\n\treturn mix(mix(c00, c10, f.x), mix(c01, c11, f.x), f.y);\n}\n\nfn tex3DTrilinear(t: texture_3d<f32>, uvw: vec3f, size: vec3i) -> vec4f {\n\tlet coord = uvw * vec3f(size) - 0.5;\n\tlet i0 = vec3i(floor(coord));\n\tlet f = coord - floor(coord);\n\tlet maxc = size - 1;\n\tlet c000 = textureLoad(t, clamp(i0, vec3i(0), maxc), 0);\n\tlet c100 = textureLoad(t, clamp(i0 + vec3i(1, 0, 0), vec3i(0), maxc), 0);\n\tlet c010 = textureLoad(t, clamp(i0 + vec3i(0, 1, 0), vec3i(0), maxc), 0);\n\tlet c110 = textureLoad(t, clamp(i0 + vec3i(1, 1, 0), vec3i(0), maxc), 0);\n\tlet c001 = textureLoad(t, clamp(i0 + vec3i(0, 0, 1), vec3i(0), maxc), 0);\n\tlet c101 = textureLoad(t, clamp(i0 + vec3i(1, 0, 1), vec3i(0), maxc), 0);\n\tlet c011 = textureLoad(t, clamp(i0 + vec3i(0, 1, 1), vec3i(0), maxc), 0);\n\tlet c111 = textureLoad(t, clamp(i0 + vec3i(1, 1, 1), vec3i(0), maxc), 0);\n\tlet z0 = mix(mix(c000, c100, f.x), mix(c010, c110, f.x), f.y);\n\tlet z1 = mix(mix(c001, c101, f.x), mix(c011, c111, f.x), f.y);\n\treturn mix(z0, z1, f.z);\n}\n\nfn GetLayerDensity(layer: DensityProfileLayer, altitude: f32) -> f32 {\n\tlet density = layer.exp_term * exp(layer.exp_scale * altitude) +\n\t\tlayer.linear_term * altitude + layer.constant_term;\n\treturn clamp(density, 0.0, 1.0);\n}\n\nfn GetProfileDensity(profile: DensityProfile, altitude: f32) -> f32 {\n\tif (altitude < profile.layers[0].width) {\n\t\treturn GetLayerDensity(profile.layers[0], altitude);\n\t}\n\treturn GetLayerDensity(profile.layers[1], altitude);\n}\n\nfn DistanceToTopAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {\n\tlet discriminant = r * r * (mu * mu - 1.0) + atm.top_radius * atm.top_radius;\n\treturn ClampDistance(-r * mu + SafeSqrt(discriminant));\n}\n\nfn DistanceToBottomAtmosphereBoundary(atm: Atm, r: f32, mu: f32) -> f32 {\n\tlet discriminant = r * r * (mu * mu - 1.0) +\n\t\tatm.bottom_radius * atm.bottom_radius;\n\treturn ClampDistance(-r * mu - SafeSqrt(discriminant));\n}\n\nfn RayIntersectsGround(atm: Atm, r: f32, mu: f32) -> bool {\n\treturn mu < 0.0 &&\n\t\tr * r * (mu * mu - 1.0) + atm.bottom_radius * atm.bottom_radius >= 0.0;\n}\n\nfn GetTextureCoordFromUnitRange(x: f32, texture_size: i32) -> f32 {\n\treturn 0.5 / f32(texture_size) + x * (1.0 - 1.0 / f32(texture_size));\n}\n\nfn GetUnitRangeFromTextureCoord(u: f32, texture_size: i32) -> f32 {\n\treturn (u - 0.5 / f32(texture_size)) / (1.0 - 1.0 / f32(texture_size));\n}\n\nfn GetTransmittanceTextureUvFromRMu(atm: Atm, r: f32, mu: f32) -> vec2f {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius);\n\tlet d = DistanceToTopAtmosphereBoundary(atm, r, mu);\n\tlet d_min = atm.top_radius - r;\n\tlet d_max = rho + H;\n\tlet x_mu = (d - d_min) / (d_max - d_min);\n\tlet x_r = rho / H;\n\treturn vec2f(\n\t\tGetTextureCoordFromUnitRange(x_mu, TRANSMITTANCE_TEXTURE_WIDTH),\n\t\tGetTextureCoordFromUnitRange(x_r, TRANSMITTANCE_TEXTURE_HEIGHT));\n}\n\nfn GetRMuFromTransmittanceTextureUv(\n\tatm: Atm, uv: vec2f, r: ptr<function, f32>, mu: ptr<function, f32>) {\n\tlet x_mu = GetUnitRangeFromTextureCoord(uv.x, TRANSMITTANCE_TEXTURE_WIDTH);\n\tlet x_r = GetUnitRangeFromTextureCoord(uv.y, TRANSMITTANCE_TEXTURE_HEIGHT);\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = H * x_r;\n\t*r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius);\n\tlet d_min = atm.top_radius - *r;\n\tlet d_max = rho + H;\n\tlet d = d_min + x_mu * (d_max - d_min);\n\tif (d == 0.0) {\n\t\t*mu = 1.0;\n\t} else {\n\t\t*mu = (H * H - rho * rho - d * d) / (2.0 * (*r) * d);\n\t}\n\t*mu = ClampCosine(*mu);\n}\n\nfn GetTransmittanceToTopAtmosphereBoundary(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu: f32) -> vec3f {\n\tlet uv = GetTransmittanceTextureUvFromRMu(atm, r, mu);\n\treturn tex2DBilinear(transmittance_texture, uv,\n\t\tvec2i(TRANSMITTANCE_TEXTURE_WIDTH, TRANSMITTANCE_TEXTURE_HEIGHT)).rgb;\n}\n\nfn GetTransmittance(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, d: f32, ray_r_mu_intersects_ground: bool) -> vec3f {\n\tlet r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\tlet mu_d = ClampCosine((r * mu + d) / r_d);\n\n\tif (ray_r_mu_intersects_ground) {\n\t\treturn min(\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, -mu_d) /\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, -mu),\n\t\t\tvec3f(1.0, 1.0, 1.0));\n\t} else {\n\t\treturn min(\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu) /\n\t\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r_d, mu_d),\n\t\t\tvec3f(1.0, 1.0, 1.0));\n\t}\n}\n\nfn GetTransmittanceToSun(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet sin_theta_h = atm.bottom_radius / r;\n\tlet cos_theta_h = -sqrt(max(1.0 - sin_theta_h * sin_theta_h, 0.0));\n\n\tlet step = smoothstepGl(-sin_theta_h * atm.sun_angular_radius,\n\t\tsin_theta_h * atm.sun_angular_radius,\n\t\tmu_s - cos_theta_h);\n\n\treturn GetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) * step;\n}\n\nfn RayleighPhaseFunction(nu: f32) -> f32 {\n\tlet k = 3.0 / (16.0 * PI);\n\treturn k * (1.0 + nu * nu);\n}\n\nfn MiePhaseFunction(g: f32, nu: f32) -> f32 {\n\tlet k = 3.0 / (8.0 * PI) * (1.0 - g * g) / (2.0 + g * g);\n\treturn k * (1.0 + nu * nu) / pow(abs(1.0 + g * g - 2.0 * g * nu), 1.5);\n}\n\nfn GetScatteringTextureUvwzFromRMuMuSNu(\n\tatm: Atm, r: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec4f {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = SafeSqrt(r * r - atm.bottom_radius * atm.bottom_radius);\n\tlet u_r = GetTextureCoordFromUnitRange(rho / H, SCATTERING_TEXTURE_R_SIZE);\n\n\tlet r_mu = r * mu;\n\tlet discriminant = r_mu * r_mu - r * r +\n\t\tatm.bottom_radius * atm.bottom_radius;\n\tvar u_mu: f32;\n\n\tif (ray_r_mu_intersects_ground) {\n\t\tlet d = -r_mu - SafeSqrt(discriminant);\n\t\tlet d_min = r - atm.bottom_radius;\n\t\tlet d_max = rho;\n\t\tvar x: f32 = 0.0;\n\t\tif (d_max != d_min) {\n\t\t\tx = (d - d_min) / (d_max - d_min);\n\t\t}\n\t\tu_mu = 0.5 - 0.5 * GetTextureCoordFromUnitRange(x, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t} else {\n\t\tlet d = -r_mu + SafeSqrt(discriminant + H * H);\n\t\tlet d_min = atm.top_radius - r;\n\t\tlet d_max = rho + H;\n\t\tu_mu = 0.5 + 0.5 * GetTextureCoordFromUnitRange(\n\t\t\t(d - d_min) / (d_max - d_min), SCATTERING_TEXTURE_MU_SIZE / 2);\n\t}\n\n\tlet d = DistanceToTopAtmosphereBoundary(atm, atm.bottom_radius, mu_s);\n\tlet d_min = atm.top_radius - atm.bottom_radius;\n\tlet d_max = H;\n\tlet a = (d - d_min) / (d_max - d_min);\n\tlet A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min);\n\n\tlet u_mu_s = GetTextureCoordFromUnitRange(\n\t\tmax(1.0 - a / A, 0.0) / (1.0 + a), SCATTERING_TEXTURE_MU_S_SIZE);\n\n\tlet u_nu = (nu + 1.0) / 2.0;\n\treturn vec4f(u_nu, u_mu_s, u_mu, u_r);\n}\n\nfn GetRMuMuSNuFromScatteringTextureUvwz(\n\tatm: Atm, uvwz: vec4f,\n\tr: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>,\n\tnu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {\n\tlet H = sqrt(atm.top_radius * atm.top_radius -\n\t\tatm.bottom_radius * atm.bottom_radius);\n\tlet rho = H * GetUnitRangeFromTextureCoord(uvwz.w, SCATTERING_TEXTURE_R_SIZE);\n\t*r = sqrt(rho * rho + atm.bottom_radius * atm.bottom_radius);\n\n\tif (uvwz.z < 0.5) {\n\t\tlet d_min = *r - atm.bottom_radius;\n\t\tlet d_max = rho;\n\t\tlet d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord(\n\t\t\t1.0 - 2.0 * uvwz.z, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t\tif (d == 0.0) {\n\t\t\t*mu = -1.0;\n\t\t} else {\n\t\t\t*mu = ClampCosine(-(rho * rho + d * d) / (2.0 * (*r) * d));\n\t\t}\n\t\t*ray_r_mu_intersects_ground = true;\n\t} else {\n\t\tlet d_min = atm.top_radius - *r;\n\t\tlet d_max = rho + H;\n\t\tlet d = d_min + (d_max - d_min) * GetUnitRangeFromTextureCoord(\n\t\t\t2.0 * uvwz.z - 1.0, SCATTERING_TEXTURE_MU_SIZE / 2);\n\t\tif (d == 0.0) {\n\t\t\t*mu = 1.0;\n\t\t} else {\n\t\t\t*mu = ClampCosine((H * H - rho * rho - d * d) / (2.0 * (*r) * d));\n\t\t}\n\t\t*ray_r_mu_intersects_ground = false;\n\t}\n\n\tlet x_mu_s = GetUnitRangeFromTextureCoord(uvwz.y, SCATTERING_TEXTURE_MU_S_SIZE);\n\tlet d_min = atm.top_radius - atm.bottom_radius;\n\tlet d_max = H;\n\tlet A = -2.0 * atm.mu_s_min * atm.bottom_radius / (d_max - d_min);\n\tlet a = (A - x_mu_s * A) / (1.0 + x_mu_s * A);\n\tlet d = d_min + min(a, A) * (d_max - d_min);\n\tif (d == 0.0) {\n\t\t*mu_s = 1.0;\n\t} else {\n\t\t*mu_s = ClampCosine((H * H - d * d) / (2.0 * atm.bottom_radius * d));\n\t}\n\n\t*nu = ClampCosine(uvwz.x * 2.0 - 1.0);\n}\n\nfn GetRMuMuSNuFromScatteringTextureFragCoord(\n\tatm: Atm, frag_coord: vec3f,\n\tr: ptr<function, f32>, mu: ptr<function, f32>, mu_s: ptr<function, f32>,\n\tnu: ptr<function, f32>, ray_r_mu_intersects_ground: ptr<function, bool>) {\n\tlet SCATTERING_TEXTURE_SIZE = vec4f(\n\t\tf32(SCATTERING_TEXTURE_NU_SIZE - 1),\n\t\tf32(SCATTERING_TEXTURE_MU_S_SIZE),\n\t\tf32(SCATTERING_TEXTURE_MU_SIZE),\n\t\tf32(SCATTERING_TEXTURE_R_SIZE));\n\n\tlet frag_coord_nu = floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE));\n\tlet frag_coord_mu_s = frag_coord.x -\n\t\tf32(SCATTERING_TEXTURE_MU_S_SIZE) * floor(frag_coord.x / f32(SCATTERING_TEXTURE_MU_S_SIZE));\n\n\tlet uvwz = vec4f(frag_coord_nu, frag_coord_mu_s, frag_coord.y, frag_coord.z) /\n\t\tSCATTERING_TEXTURE_SIZE;\n\n\tGetRMuMuSNuFromScatteringTextureUvwz(\n\t\tatm, uvwz, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\t*nu = clamp(*nu,\n\t\t(*mu) * (*mu_s) - sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))),\n\t\t(*mu) * (*mu_s) + sqrt((1.0 - (*mu) * (*mu)) * (1.0 - (*mu_s) * (*mu_s))));\n}\n\nfn GetIrradianceTextureUvFromRMuS(atm: Atm, r: f32, mu_s: f32) -> vec2f {\n\tlet x_r = (r - atm.bottom_radius) / (atm.top_radius - atm.bottom_radius);\n\tlet x_mu_s = mu_s * 0.5 + 0.5;\n\treturn vec2f(GetTextureCoordFromUnitRange(x_mu_s, IRRADIANCE_TEXTURE_WIDTH),\n\t\tGetTextureCoordFromUnitRange(x_r, IRRADIANCE_TEXTURE_HEIGHT));\n}\n\nfn GetIrradiance(\n\tatm: Atm, irradiance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet uv = GetIrradianceTextureUvFromRMuS(atm, r, mu_s);\n\treturn tex2DBilinear(irradiance_texture, uv,\n\t\tvec2i(IRRADIANCE_TEXTURE_WIDTH, IRRADIANCE_TEXTURE_HEIGHT)).rgb;\n}\n",Im=e=>`\n${Lm}\n\nfn ComputeOpticalLengthToTopAtmosphereBoundary(\n\tatm: Atm, profile: DensityProfile, r: f32, mu: f32) -> f32 {\n\tconst SAMPLE_COUNT: i32 = 500;\n\tlet dx = DistanceToTopAtmosphereBoundary(atm, r, mu) / f32(SAMPLE_COUNT);\n\tvar result: f32 = 0.0;\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\t\tlet r_i = sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r);\n\t\tlet y_i = GetProfileDensity(profile, r_i - atm.bottom_radius);\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\tresult += y_i * weight_i * dx;\n\t}\n\treturn result;\n}\n\nfn ComputeTransmittanceToTopAtmosphereBoundary(\n\tatm: Atm, r: f32, mu: f32) -> vec3f {\n\tvar density = vec3f(0.0);\n\tdensity += atm.rayleigh_scattering *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.rayleigh_density, r, mu);\n\tdensity += atm.mie_extinction *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.mie_density, r, mu);\n\tdensity += atm.absorption_extinction *\n\t\tComputeOpticalLengthToTopAtmosphereBoundary(atm, atm.absorption_density, r, mu);\n\treturn exp(-density);\n}\n\nfn ComputeTransmittanceToTopAtmosphereBoundaryTexture(\n\tatm: Atm, frag_coord: vec2f) -> vec3f {\n\tlet TRANSMITTANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(TRANSMITTANCE_TEXTURE_WIDTH), f32(TRANSMITTANCE_TEXTURE_HEIGHT));\n\tvar r: f32;\n\tvar mu: f32;\n\tGetRMuFromTransmittanceTextureUv(\n\t\tatm, frag_coord / TRANSMITTANCE_TEXTURE_SIZE, &r, &mu);\n\treturn ComputeTransmittanceToTopAtmosphereBoundary(atm, r, mu);\n}\n\nfn ComputeSingleScatteringIntegrand(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32, d: f32,\n\tray_r_mu_intersects_ground: bool,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tlet r_d = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\tlet mu_s_d = ClampCosine((r * mu_s + d * nu) / r_d);\n\n\tlet transmittance =\n\t\tGetTransmittance(atm, transmittance_texture, r, mu, d, ray_r_mu_intersects_ground) *\n\t\tGetTransmittanceToSun(atm, transmittance_texture, r_d, mu_s_d);\n\n\t*rayleigh = transmittance *\n\t\tGetProfileDensity(atm.rayleigh_density, r_d - atm.bottom_radius);\n\t*mie = transmittance *\n\t\tGetProfileDensity(atm.mie_density, r_d - atm.bottom_radius);\n}\n\nfn DistanceToNearestAtmosphereBoundary(\n\tatm: Atm, r: f32, mu: f32, ray_r_mu_intersects_ground: bool) -> f32 {\n\tif (ray_r_mu_intersects_ground) {\n\t\treturn DistanceToBottomAtmosphereBoundary(atm, r, mu);\n\t}\n\treturn DistanceToTopAtmosphereBoundary(atm, r, mu);\n}\n\nfn ComputeSingleScattering(\n\tatm: Atm, transmittance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tconst SAMPLE_COUNT: i32 = 50;\n\tlet dx = DistanceToNearestAtmosphereBoundary(\n\t\tatm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT);\n\n\tvar rayleigh_sum = vec3f(0.0);\n\tvar mie_sum = vec3f(0.0);\n\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\t\tvar rayleigh_i: vec3f;\n\t\tvar mie_i: vec3f;\n\t\tComputeSingleScatteringIntegrand(\n\t\t\tatm, transmittance_texture, r, mu, mu_s, nu, d_i,\n\t\t\tray_r_mu_intersects_ground, &rayleigh_i, &mie_i);\n\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\trayleigh_sum += rayleigh_i * weight_i;\n\t\tmie_sum += mie_i * weight_i;\n\t}\n\n\t*rayleigh = rayleigh_sum * dx * atm.solar_irradiance * atm.rayleigh_scattering;\n\t*mie = mie_sum * dx * atm.solar_irradiance * atm.mie_scattering;\n}\n\nfn ComputeSingleScatteringTexture(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec3f,\n\trayleigh: ptr<function, vec3f>, mie: ptr<function, vec3f>) {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar nu: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground);\n\tComputeSingleScattering(\n\t\tatm, transmittance_texture, r, mu, mu_s, nu,\n\t\tray_r_mu_intersects_ground, rayleigh, mie);\n}\n\n// The n-th-order lookup used during precompute: the delta textures are\n// float32, so they go through the manual trilinear helper.\nfn GetScatteringDelta(\n\tatm: Atm, scattering_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec3f {\n\tlet uvwz = GetScatteringTextureUvwzFromRMuMuSNu(\n\t\tatm, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\tlet tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1);\n\tlet tex_x = floor(tex_coord_x);\n\tlet lerp = tex_coord_x - tex_x;\n\n\tlet uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\tlet uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\n\tlet size = vec3i(SCATTERING_TEXTURE_WIDTH, SCATTERING_TEXTURE_HEIGHT, SCATTERING_TEXTURE_DEPTH);\n\treturn tex3DTrilinear(scattering_texture, uvw0, size).rgb * (1.0 - lerp) +\n\t\ttex3DTrilinear(scattering_texture, uvw1, size).rgb * lerp;\n}\n\nfn GetScatteringOrder(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\tscattering_order: i32) -> vec3f {\n\tif (scattering_order == 1) {\n\t\tlet rayleigh = GetScatteringDelta(\n\t\t\tatm, single_rayleigh_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t\tlet mie = GetScatteringDelta(\n\t\t\tatm, single_mie_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t\treturn rayleigh * RayleighPhaseFunction(nu) +\n\t\t\tmie * MiePhaseFunction(atm.mie_phase_function_g, nu);\n\t} else {\n\t\treturn GetScatteringDelta(\n\t\t\tatm, multiple_scattering_texture, r, mu, mu_s, nu,\n\t\t\tray_r_mu_intersects_ground);\n\t}\n}\n\nfn GetRMuSFromIrradianceTextureUv(\n\tatm: Atm, uv: vec2f, r: ptr<function, f32>, mu_s: ptr<function, f32>) {\n\tlet x_mu_s = GetUnitRangeFromTextureCoord(uv.x, IRRADIANCE_TEXTURE_WIDTH);\n\tlet x_r = GetUnitRangeFromTextureCoord(uv.y, IRRADIANCE_TEXTURE_HEIGHT);\n\t*r = atm.bottom_radius + x_r * (atm.top_radius - atm.bottom_radius);\n\t*mu_s = ClampCosine(2.0 * x_mu_s - 1.0);\n}\n\nfn ComputeDirectIrradiance(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, r: f32, mu_s: f32) -> vec3f {\n\tlet alpha_s = atm.sun_angular_radius;\n\n\tvar average_cosine_factor: f32;\n\tif (mu_s < -alpha_s) {\n\t\taverage_cosine_factor = 0.0;\n\t} else if (mu_s > alpha_s) {\n\t\taverage_cosine_factor = mu_s;\n\t} else {\n\t\taverage_cosine_factor = (mu_s + alpha_s) * (mu_s + alpha_s) / (4.0 * alpha_s);\n\t}\n\n\treturn atm.solar_irradiance *\n\t\tGetTransmittanceToTopAtmosphereBoundary(atm, transmittance_texture, r, mu_s) *\n\t\taverage_cosine_factor;\n}\n\nfn ComputeIndirectIrradiance(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tr: f32, mu_s: f32, scattering_order: i32) -> vec3f {\n\tconst SAMPLE_COUNT: i32 = 32;\n\tlet dphi = PI / f32(SAMPLE_COUNT);\n\tlet dtheta = PI / f32(SAMPLE_COUNT);\n\n\tvar result = vec3f(0.0);\n\tlet omega_s = vec3f(sqrt(1.0 - mu_s * mu_s), 0.0, mu_s);\n\n\tfor (var j: i32 = 0; j < SAMPLE_COUNT / 2; j++) {\n\t\tlet theta = (f32(j) + 0.5) * dtheta;\n\t\tfor (var i: i32 = 0; i < 2 * SAMPLE_COUNT; i++) {\n\t\t\tlet phi = (f32(i) + 0.5) * dphi;\n\t\t\tlet omega = vec3f(cos(phi) * sin(theta), sin(phi) * sin(theta), cos(theta));\n\t\t\tlet domega = dtheta * dphi * sin(theta);\n\t\t\tlet nu = dot(omega, omega_s);\n\n\t\t\tresult += GetScatteringOrder(atm,\n\t\t\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\t\t\tmultiple_scattering_texture,\n\t\t\t\tr, omega.z, mu_s, nu, false, scattering_order) * omega.z * domega;\n\t\t}\n\t}\n\n\treturn result;\n}\n\nfn ComputeDirectIrradianceTexture(\n\tatm: Atm, transmittance_texture: texture_2d<f32>, frag_coord: vec2f) -> vec3f {\n\tvar r: f32;\n\tvar mu_s: f32;\n\tlet IRRADIANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT));\n\tGetRMuSFromIrradianceTextureUv(\n\t\tatm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s);\n\treturn ComputeDirectIrradiance(atm, transmittance_texture, r, mu_s);\n}\n\nfn ComputeIndirectIrradianceTexture(\n\tatm: Atm,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tfrag_coord: vec2f, scattering_order: i32) -> vec3f {\n\tvar r: f32;\n\tvar mu_s: f32;\n\tlet IRRADIANCE_TEXTURE_SIZE = vec2f(\n\t\tf32(IRRADIANCE_TEXTURE_WIDTH), f32(IRRADIANCE_TEXTURE_HEIGHT));\n\tGetRMuSFromIrradianceTextureUv(\n\t\tatm, frag_coord / IRRADIANCE_TEXTURE_SIZE, &r, &mu_s);\n\treturn ComputeIndirectIrradiance(atm,\n\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\tmultiple_scattering_texture, r, mu_s, scattering_order);\n}\n\nfn ComputeScatteringDensity(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32, scattering_order: i32) -> vec3f {\n\tlet zenith_direction = vec3f(0.0, 0.0, 1.0);\n\tlet omega = vec3f(sqrt(1.0 - mu * mu), 0.0, mu);\n\tvar sun_dir_x: f32 = 0.0;\n\tif (omega.x != 0.0) {\n\t\tsun_dir_x = (nu - mu * mu_s) / omega.x;\n\t}\n\tlet sun_dir_y = sqrt(max(1.0 - sun_dir_x * sun_dir_x - mu_s * mu_s, 0.0));\n\tlet omega_s = vec3f(sun_dir_x, sun_dir_y, mu_s);\n\n\tconst SAMPLE_COUNT: i32 = 16;\n\tlet dphi = PI / f32(SAMPLE_COUNT);\n\tlet dtheta = PI / f32(SAMPLE_COUNT);\n\tvar rayleigh_mie = vec3f(0.0);\n\n\tfor (var l: i32 = 0; l < SAMPLE_COUNT; l++) {\n\t\tlet theta = (f32(l) + 0.5) * dtheta;\n\t\tlet cos_theta = cos(theta);\n\t\tlet sin_theta = sin(theta);\n\t\tlet ray_r_theta_intersects_ground = RayIntersectsGround(atm, r, cos_theta);\n\n\t\tvar distance_to_ground: f32 = 0.0;\n\t\tvar transmittance_to_ground = vec3f(0.0);\n\t\tvar ground_albedo = vec3f(0.0);\n\t\tif (ray_r_theta_intersects_ground) {\n\t\t\tdistance_to_ground = DistanceToBottomAtmosphereBoundary(atm, r, cos_theta);\n\t\t\ttransmittance_to_ground = GetTransmittance(\n\t\t\t\tatm, transmittance_texture, r, cos_theta, distance_to_ground, true);\n\t\t\t// NOTE: the reference leaves ground_albedo at vec3(0) here (it\n\t\t\t// declares it but never assigns atm.ground_albedo) — transcribed\n\t\t\t// as-is so the LUTs match bit-for-bit in spirit.\n\t\t}\n\n\t\tfor (var m: i32 = 0; m < 2 * SAMPLE_COUNT; m++) {\n\t\t\tlet phi = (f32(m) + 0.5) * dphi;\n\t\t\tlet omega_i = vec3f(cos(phi) * sin_theta, sin(phi) * sin_theta, cos_theta);\n\t\t\tlet domega_i = dtheta * dphi * sin(theta);\n\n\t\t\tlet nu1 = dot(omega_s, omega_i);\n\t\t\tvar incident_radiance = GetScatteringOrder(atm,\n\t\t\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\t\t\tmultiple_scattering_texture, r, omega_i.z, mu_s, nu1,\n\t\t\t\tray_r_theta_intersects_ground, scattering_order - 1);\n\n\t\t\tlet ground_normal = normalize(zenith_direction * r + omega_i * distance_to_ground);\n\t\t\tlet ground_irradiance = GetIrradiance(\n\t\t\t\tatm, irradiance_texture, atm.bottom_radius, dot(ground_normal, omega_s));\n\t\t\tincident_radiance += transmittance_to_ground * ground_albedo *\n\t\t\t\t(1.0 / PI) * ground_irradiance;\n\n\t\t\tlet nu2 = dot(omega, omega_i);\n\n\t\t\tlet rayleigh_density = GetProfileDensity(\n\t\t\t\tatm.rayleigh_density, r - atm.bottom_radius);\n\t\t\tlet mie_density = GetProfileDensity(\n\t\t\t\tatm.mie_density, r - atm.bottom_radius);\n\n\t\t\trayleigh_mie += incident_radiance * (\n\t\t\t\tatm.rayleigh_scattering * rayleigh_density * RayleighPhaseFunction(nu2) +\n\t\t\t\tatm.mie_scattering * mie_density * MiePhaseFunction(atm.mie_phase_function_g, nu2)) *\n\t\t\t\tdomega_i;\n\t\t}\n\t}\n\n\treturn rayleigh_mie;\n}\n\nfn ComputeMultipleScattering(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_density_texture: texture_3d<f32>,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool) -> vec3f {\n\tconst SAMPLE_COUNT: i32 = 50;\n\tlet dx = DistanceToNearestAtmosphereBoundary(\n\t\tatm, r, mu, ray_r_mu_intersects_ground) / f32(SAMPLE_COUNT);\n\n\tvar rayleigh_mie_sum = vec3f(0.0);\n\n\tfor (var i: i32 = 0; i <= SAMPLE_COUNT; i++) {\n\t\tlet d_i = f32(i) * dx;\n\n\t\tlet r_i = ClampRadius(atm, sqrt(d_i * d_i + 2.0 * r * mu * d_i + r * r));\n\t\tlet mu_i = ClampCosine((r * mu + d_i) / r_i);\n\t\tlet mu_s_i = ClampCosine((r * mu_s + d_i * nu) / r_i);\n\n\t\tlet rayleigh_mie_i =\n\t\t\tGetScatteringDelta(atm, scattering_density_texture, r_i, mu_i, mu_s_i, nu,\n\t\t\t\tray_r_mu_intersects_ground) *\n\t\t\tGetTransmittance(atm, transmittance_texture, r, mu, d_i,\n\t\t\t\tray_r_mu_intersects_ground) * dx;\n\n\t\tvar weight_i: f32 = 1.0;\n\t\tif (i == 0 || i == SAMPLE_COUNT) {\n\t\t\tweight_i = 0.5;\n\t\t}\n\t\trayleigh_mie_sum += rayleigh_mie_i * weight_i;\n\t}\n\n\treturn rayleigh_mie_sum;\n}\n\nfn ComputeScatteringDensityTexture(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tsingle_rayleigh_scattering_texture: texture_3d<f32>,\n\tsingle_mie_scattering_texture: texture_3d<f32>,\n\tmultiple_scattering_texture: texture_3d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tfrag_coord: vec3f, scattering_order: i32) -> vec3f {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar nu: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, &nu, &ray_r_mu_intersects_ground);\n\n\treturn ComputeScatteringDensity(atm, transmittance_texture,\n\t\tsingle_rayleigh_scattering_texture, single_mie_scattering_texture,\n\t\tmultiple_scattering_texture, irradiance_texture, r, mu, mu_s, nu,\n\t\tscattering_order);\n}\n\nfn ComputeMultipleScatteringTexture(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_density_texture: texture_3d<f32>,\n\tfrag_coord: vec3f, nu: ptr<function, f32>) -> vec3f {\n\tvar r: f32;\n\tvar mu: f32;\n\tvar mu_s: f32;\n\tvar ray_r_mu_intersects_ground: bool;\n\tGetRMuMuSNuFromScatteringTextureFragCoord(\n\t\tatm, frag_coord, &r, &mu, &mu_s, nu, &ray_r_mu_intersects_ground);\n\n\treturn ComputeMultipleScattering(atm, transmittance_texture,\n\t\tscattering_density_texture, r, mu, mu_s, *nu,\n\t\tray_r_mu_intersects_ground);\n}\n\n\nstruct PassParams {\n\tluminance_from_radiance: mat3x3f,\n\tblend: vec4f,\n\tlayer: i32,\n\tscattering_order: i32,\n}\n\nfn RadianceToLuminance(pass_params: PassParams, rad: vec3f) -> vec3f {\n\treturn pass_params.luminance_from_radiance * rad;\n}\n\n@group(0) @binding(0) var<uniform> atm: Atm;\n@group(0) @binding(1) var<uniform> pass_params: PassParams;\n${e}\n`,Fm=Im("\n@group(0) @binding(2) var out_transmittance: texture_storage_2d<rgba32float, write>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\ttextureStore(out_transmittance, coord,\n\t\tvec4f(ComputeTransmittanceToTopAtmosphereBoundaryTexture(atm, frag_coord), 1.0));\n}\n",Dm=Im("\n@group(0) @binding(2) var irradiance_read: texture_2d<f32>;\n@group(0) @binding(3) var out_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(4) var out_delta_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(5) var transmittance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\n\ttextureStore(out_delta_irradiance, coord,\n\t\tvec4f(ComputeDirectIrradianceTexture(atm, transmittance, frag_coord), 1.0));\n\n\tvar result = vec4f(0.0, 0.0, 0.0, 1.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tresult += textureLoad(irradiance_read, coord, 0);\n\t}\n\ttextureStore(out_irradiance, coord, result);\n}\n",Um=Im("\n@group(0) @binding(2) var out_delta_rayleigh: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var out_delta_mie: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(4) var scattering_read: texture_3d<f32>;\n@group(0) @binding(5) var out_scattering: texture_storage_3d<rgba16float, write>;\n@group(0) @binding(6) var transmittance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tvar delta_rayleigh: vec3f;\n\tvar delta_mie: vec3f;\n\tComputeSingleScatteringTexture(atm, transmittance, frag_coord,\n\t\t&delta_rayleigh, &delta_mie);\n\n\ttextureStore(out_delta_rayleigh, coord, vec4f(delta_rayleigh, 1.0));\n\ttextureStore(out_delta_mie, coord, vec4f(delta_mie, 1.0));\n\n\tvar scattering = vec4f(\n\t\tRadianceToLuminance(pass_params, delta_rayleigh),\n\t\tRadianceToLuminance(pass_params, delta_mie).r);\n\tif (pass_params.blend[2] == 1.0) {\n\t\tscattering += textureLoad(scattering_read, coord, 0);\n\t}\n\ttextureStore(out_scattering, coord, scattering);\n}\n",Om=Im("\n@group(0) @binding(2) var out_delta_scattering_density: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var transmittance: texture_2d<f32>;\n@group(0) @binding(4) var single_rayleigh_scattering: texture_3d<f32>;\n@group(0) @binding(5) var single_mie_scattering: texture_3d<f32>;\n@group(0) @binding(6) var multiple_scattering: texture_3d<f32>;\n@group(0) @binding(7) var irradiance: texture_2d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tlet scattering_density = ComputeScatteringDensityTexture(\n\t\tatm, transmittance, single_rayleigh_scattering, single_mie_scattering,\n\t\tmultiple_scattering, irradiance, frag_coord, pass_params.scattering_order);\n\n\ttextureStore(out_delta_scattering_density, coord, vec4f(scattering_density, 1.0));\n}\n",Gm=Im("\n@group(0) @binding(2) var out_delta_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(3) var irradiance_read: texture_2d<f32>;\n@group(0) @binding(4) var out_irradiance: texture_storage_2d<rgba32float, write>;\n@group(0) @binding(5) var single_rayleigh_scattering: texture_3d<f32>;\n@group(0) @binding(6) var single_mie_scattering: texture_3d<f32>;\n@group(0) @binding(7) var multiple_scattering: texture_3d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet coord = vec2i(gid.xy);\n\tlet frag_coord = vec2f(coord) + vec2f(0.5, 0.5);\n\n\tlet delta_irradiance_value = ComputeIndirectIrradianceTexture(\n\t\tatm, single_rayleigh_scattering, single_mie_scattering,\n\t\tmultiple_scattering, frag_coord, pass_params.scattering_order);\n\ttextureStore(out_delta_irradiance, coord, vec4f(delta_irradiance_value, 1.0));\n\n\tvar irradiance = vec4f(RadianceToLuminance(pass_params, delta_irradiance_value), 1.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tirradiance += textureLoad(irradiance_read, coord, 0);\n\t}\n\ttextureStore(out_irradiance, coord, irradiance);\n}\n",qm=Im("\n@group(0) @binding(2) var out_delta_multiple_scattering: texture_storage_3d<rgba32float, write>;\n@group(0) @binding(3) var scattering_read: texture_3d<f32>;\n@group(0) @binding(4) var out_scattering: texture_storage_3d<rgba16float, write>;\n@group(0) @binding(5) var transmittance: texture_2d<f32>;\n@group(0) @binding(6) var delta_scattering_density: texture_3d<f32>;\n")+"\n@compute @workgroup_size(8, 8, 1)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tvar coord = vec3i(gid);\n\tcoord.z = pass_params.layer;\n\tlet frag_coord = vec3f(coord) + vec3f(0.5, 0.5, 0.5);\n\n\tvar nu: f32;\n\tlet delta_multiple_scattering_value = ComputeMultipleScatteringTexture(\n\t\tatm, transmittance, delta_scattering_density, frag_coord, &nu);\n\n\ttextureStore(out_delta_multiple_scattering, coord,\n\t\tvec4f(delta_multiple_scattering_value, 1.0));\n\n\tvar scattering = vec4f(\n\t\tRadianceToLuminance(pass_params, delta_multiple_scattering_value) /\n\t\t\tRayleighPhaseFunction(nu),\n\t\t0.0);\n\tif (pass_params.blend[1] == 1.0) {\n\t\tscattering += textureLoad(scattering_read, coord, 0);\n\t}\n\ttextureStore(out_scattering, coord, scattering);\n}\n";function Wm(e){let t=e.backend.device;if(!t)throw new Error("[spline/sky] WebGPU device unavailable for LUT precompute");return t}function Hm(e,t){e.initTexture(t);let a=e.backend.get(t);if(!a?.texture)throw new Error("[spline/sky] three did not allocate a GPU texture");return a.texture}function jm(e,t,a,r){let s=new O(e,t);return s.type=a,s.minFilter=Ws,s.magFilter=Ws,s.generateMipmaps=!1,s.mipmapsAutoUpdate=!1,s.name=r,s}function Km(e,t,a,r,s,i){let n=new H(e,t,a);return n.type=r,n.minFilter=i,n.magFilter=i,n.generateMipmaps=!1,n.mipmapsAutoUpdate=!1,n.name=s,n}var $m=256,Xm={transmittance:{code:Fm,entries:[{storage:"2d",format:"rgba32float"}]},directIrradiance:{code:Dm,entries:[{sampled:"2d"},{storage:"2d",format:"rgba32float"},{storage:"2d",format:"rgba32float"},{sampled:"2d"}]},singleScattering:{code:Um,entries:[{storage:"3d",format:"rgba32float"},{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"}]},scatteringDensity:{code:Om,entries:[{storage:"3d",format:"rgba32float"},{sampled:"2d"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"},{sampled:"2d"}]},indirectIrradiance:{code:Gm,entries:[{storage:"2d",format:"rgba32float"},{sampled:"2d"},{storage:"2d",format:"rgba32float"},{sampled:"3d"},{sampled:"3d"},{sampled:"3d"}]},multipleScattering:{code:qm,entries:[{storage:"3d",format:"rgba32float"},{sampled:"3d"},{storage:"3d",format:"rgba16float"},{sampled:"2d"},{sampled:"3d"}]}};async function Qm(e,t,a,r,s,i){let n=Wm(e),l=Hm(e,t),o=a*(i?8:16),u=256*Math.ceil(o/256),d=n.createBuffer({size:u*r*s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ}),h=n.createCommandEncoder();h.copyTextureToBuffer({texture:l},{buffer:d,bytesPerRow:u,rowsPerImage:r},{width:a,height:r,depthOrArrayLayers:s}),n.queue.submit([h.finish()]),await d.mapAsync(GPUMapMode.READ);let m=d.getMappedRange(),c=new Float32Array(a*r*s*4);for(let e=0;e<s;e++)for(let t=0;t<r;t++){let s=(e*r+t)*u;if(i){let i=new Uint16Array(m,s,4*a);for(let s=0;s<4*a;s++)c[(e*r+t)*a*4+s]=Zm(i[s])}else{let i=new Float32Array(m,s,4*a);c.set(i,(e*r+t)*a*4)}}return d.unmap(),d.destroy(),c}function Zm(e){let t=(32768&e)>>15,a=(31744&e)>>10,r=1023&e;return 0===a?(t?-1:1)*Math.pow(2,-14)*(r/1024):31===a?r?NaN:1/0*(t?-1:1):(t?-1:1)*Math.pow(2,a-15)*(1+r/1024)}function Ym(e,t){return.5/t+e*(1-1/t)}function Jm(e,t,a,r,s){let i=Math.min(Math.max(r*t-.5,0),t-1),n=Math.min(Math.max(s*a-.5,0),a-1),l=Math.floor(i),o=Math.floor(n),u=Math.min(l+1,t-1),d=Math.min(o+1,a-1),h=i-l,m=n-o,c=[0,0,0];for(let a=0;a<3;a++){let r=e[4*(o*t+l)+a],s=e[4*(o*t+u)+a],i=e[4*(d*t+l)+a],n=e[4*(d*t+u)+a];c[a]=(r*(1-h)+s*h)*(1-m)+(i*(1-h)+n*h)*m}return c}function ec(e,t,a,r){let s=e.bottomRadius/a,i=-Math.sqrt(Math.max(0,1-s*s)),n=function(e,t,a){let r=Math.min(1,Math.max(0,(a-e)/(t-e)));return r*r*(3-2*r)}(-s*e.sunAngularRadius,s*e.sunAngularRadius,r-i),l=function(e,t,a,r){let s=Math.sqrt(e.topRadius*e.topRadius-e.bottomRadius*e.bottomRadius),i=Math.sqrt(Math.max(0,a*a-e.bottomRadius*e.bottomRadius)),n=function(e,t,a){let r=t*t*(a*a-1)+e.topRadius*e.topRadius;return Math.max(0,-t*a+Math.sqrt(Math.max(0,r)))}(e,a,r),l=e.topRadius-a,o=i/s;return Jm(t,256,64,Ym((n-l)/(i+s-l),256),Ym(o,64))}(e,t,a,r);return[l[0]*n,l[1]*n,l[2]*n]}function tc(e){return.2126*e[0]+.7152*e[1]+.0722*e[2]}function ac(e,t,a,r){let s=ec(e,t.transmittance,a,r),i=e.sunSpectralRadianceToLuminance;return[e.solarIrradiance[0]*s[0]*i[0],e.solarIrradiance[1]*s[1]*i[1],e.solarIrradiance[2]*s[2]*i[2]]}function rc(e,t,a,r){let s=function(e,t,a,r){let s=(a-e.bottomRadius)/(e.topRadius-e.bottomRadius);return Jm(t,64,16,Ym(.5*r+.5,64),Ym(s,16))}(e,t.irradiance,a,r),i=e.skySpectralRadianceToLuminance;return[s[0]*i[0],s[1]*i[1],s[2]*i[2]]}var sc="6.0e4",ic="\nfn GetExtrapolatedSingleMieScattering(atm: Atm, scattering: vec4f) -> vec3f {\n\tif (scattering.r == 0.0) {\n\t\treturn vec3f(0.0);\n\t}\n\treturn scattering.rgb * scattering.a / scattering.r *\n\t\t(atm.rayleigh_scattering.r / atm.mie_scattering.r) *\n\t\t(atm.mie_scattering / atm.rayleigh_scattering);\n}\n\nfn GetCombinedScattering(\n\tatm: Atm,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tr: f32, mu: f32, mu_s: f32, nu: f32,\n\tray_r_mu_intersects_ground: bool,\n\tsingle_mie_scattering: ptr<function, vec3f>) -> vec3f {\n\tlet uvwz = GetScatteringTextureUvwzFromRMuMuSNu(\n\t\tatm, r, mu, mu_s, nu, ray_r_mu_intersects_ground);\n\n\tlet tex_coord_x = uvwz.x * f32(SCATTERING_TEXTURE_NU_SIZE - 1);\n\tlet tex_x = floor(tex_coord_x);\n\tlet lerp = tex_coord_x - tex_x;\n\n\tlet uvw0 = vec3f((tex_x + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\tlet uvw1 = vec3f((tex_x + 1.0 + uvwz.y) / f32(SCATTERING_TEXTURE_NU_SIZE), uvwz.z, uvwz.w);\n\n\tlet combined_scattering =\n\t\ttextureSampleLevel(scattering_texture, scattering_sampler, uvw0, 0.0) * (1.0 - lerp) +\n\t\ttextureSampleLevel(scattering_texture, scattering_sampler, uvw1, 0.0) * lerp;\n\tlet scattering = combined_scattering.xyz;\n\t*single_mie_scattering = GetExtrapolatedSingleMieScattering(atm, combined_scattering);\n\n\treturn scattering;\n}\n\n// GLSL relies on sqrt(negative) = NaN making both branch conditions false;\n// WGSL leaves that indeterminate, so the discriminant is tested explicitly —\n// same control flow for every defined input.\nfn GetSkyRadiance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tcamera_in: vec3f, view_ray: vec3f, shadow_length: f32,\n\tsun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f {\n\tvar camera = camera_in;\n\tvar r = length(camera);\n\tvar rmu = dot(camera, view_ray);\n\tlet disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius;\n\tvar distance_to_top_atmosphere_boundary = -1.0;\n\tif (disc >= 0.0) {\n\t\tdistance_to_top_atmosphere_boundary = -rmu - sqrt(disc);\n\t}\n\n\tif (distance_to_top_atmosphere_boundary > 0.0) {\n\t\tcamera = camera + view_ray * distance_to_top_atmosphere_boundary;\n\t\tr = atm.top_radius;\n\t\trmu += distance_to_top_atmosphere_boundary;\n\t} else if (r > atm.top_radius) {\n\t\t*transmittance = vec3f(0.0);\n\t\treturn vec3f(0.0);\n\t}\n\n\tlet mu = rmu / r;\n\tlet mu_s = dot(camera, sun_direction) / r;\n\tlet nu = dot(view_ray, sun_direction);\n\tlet ray_r_mu_intersects_ground = RayIntersectsGround(atm, r, mu);\n\n\tif (ray_r_mu_intersects_ground) {\n\t\t*transmittance = vec3f(0.0);\n\t} else {\n\t\t*transmittance = GetTransmittanceToTopAtmosphereBoundary(\n\t\t\tatm, transmittance_texture, r, mu);\n\t}\n\n\tvar single_mie_scattering: vec3f;\n\tvar scattering: vec3f;\n\n\tif (shadow_length == 0.0) {\n\t\tscattering = GetCombinedScattering(\n\t\t\tatm, scattering_texture, scattering_sampler,\n\t\t\tr, mu, mu_s, nu, ray_r_mu_intersects_ground,\n\t\t\t&single_mie_scattering);\n\t} else {\n\t\tlet d = shadow_length;\n\t\tlet r_p = ClampRadius(atm, sqrt(d * d + 2.0 * r * mu * d + r * r));\n\t\tlet mu_p = (r * mu + d) / r_p;\n\t\tlet mu_s_p = (r * mu_s + d * nu) / r_p;\n\n\t\tscattering = GetCombinedScattering(\n\t\t\tatm, scattering_texture, scattering_sampler,\n\t\t\tr_p, mu_p, mu_s_p, nu, ray_r_mu_intersects_ground,\n\t\t\t&single_mie_scattering);\n\n\t\tlet shadow_transmittance = GetTransmittance(\n\t\t\tatm, transmittance_texture, r, mu, shadow_length,\n\t\t\tray_r_mu_intersects_ground);\n\n\t\tscattering = scattering * shadow_transmittance;\n\t\tsingle_mie_scattering = single_mie_scattering * shadow_transmittance;\n\t}\n\n\treturn scattering * RayleighPhaseFunction(nu) + single_mie_scattering *\n\t\tMiePhaseFunction(atm.mie_phase_function_g, nu);\n}\n\n/**\n * The transmittance half of GetSkyRadiance, without the radiance.\n *\n * The clouds march calls GetSkyRadiance once per LIT step purely for its\n * transmittance out-param and drops the returned radiance on the floor —\n * paying two 3D scattering-LUT samples, the single-Mie extrapolation and\n * both phase functions (a pow among them) for a value nothing reads. Whether a\n * driver's optimizer notices is up to the driver; this is the same control\n * flow and the same lookup with the dead half deleted, so the value is\n * bit-identical either way.\n */\nfn GetSkyTransmittance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tcamera_in: vec3f, view_ray: vec3f) -> vec3f {\n\tvar camera = camera_in;\n\tvar r = length(camera);\n\tvar rmu = dot(camera, view_ray);\n\tlet disc = rmu * rmu - r * r + atm.top_radius * atm.top_radius;\n\tvar distance_to_top_atmosphere_boundary = -1.0;\n\tif (disc >= 0.0) {\n\t\tdistance_to_top_atmosphere_boundary = -rmu - sqrt(disc);\n\t}\n\n\tif (distance_to_top_atmosphere_boundary > 0.0) {\n\t\tcamera = camera + view_ray * distance_to_top_atmosphere_boundary;\n\t\tr = atm.top_radius;\n\t\trmu += distance_to_top_atmosphere_boundary;\n\t} else if (r > atm.top_radius) {\n\t\treturn vec3f(0.0);\n\t}\n\n\tlet mu = rmu / r;\n\tif (RayIntersectsGround(atm, r, mu)) {\n\t\treturn vec3f(0.0);\n\t}\n\treturn GetTransmittanceToTopAtmosphereBoundary(\n\t\tatm, transmittance_texture, r, mu);\n}\n\nfn GetSunAndSkyIrradiance(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f,\n\tsky_irradiance: ptr<function, vec3f>) -> vec3f {\n\tlet r = length(p);\n\tlet mu_s = dot(p, sun_direction) / r;\n\n\t*sky_irradiance = GetIrradiance(atm, irradiance_texture, r, mu_s) *\n\t\t(1.0 + dot(normal, p) / r) * 0.5;\n\n\treturn atm.solar_irradiance *\n\t\tGetTransmittanceToSun(atm, transmittance_texture, r, mu_s) *\n\t\tmax(dot(normal, sun_direction), 0.0);\n}\n\n// atmosphere.glsl wrappers: radiance -> luminance via the spectral factors.\nfn GetSkyRadianceLum(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tscattering_texture: texture_3d<f32>,\n\tscattering_sampler: sampler,\n\tcamera: vec3f, view_ray: vec3f, shadow_length: f32,\n\tsun_direction: vec3f, transmittance: ptr<function, vec3f>) -> vec3f {\n\treturn GetSkyRadiance(atm, transmittance_texture, scattering_texture,\n\t\tscattering_sampler, camera, view_ray, shadow_length, sun_direction,\n\t\ttransmittance) * atm.sky_spectral_radiance_to_luminance;\n}\n\nfn GetSunAndSkyIrradianceLum(\n\tatm: Atm,\n\ttransmittance_texture: texture_2d<f32>,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f,\n\tsky_irradiance: ptr<function, vec3f>) -> vec3f {\n\tlet sun_irradiance = GetSunAndSkyIrradiance(\n\t\tatm, transmittance_texture, irradiance_texture, p, normal,\n\t\tsun_direction, sky_irradiance);\n\t*sky_irradiance = *sky_irradiance * atm.sky_spectral_radiance_to_luminance;\n\treturn sun_irradiance * atm.sun_spectral_radiance_to_luminance;\n}\n\n/**\n * The sky half of GetSunAndSkyIrradianceLum. Same story as\n * GetSkyTransmittance: the clouds march reads only the sky out-param and\n * discards the sun return, whose GetTransmittanceToSun is a second manual\n * bilinear (four texel loads) plus a smoothstep. Multiplication order is\n * kept exactly as the two-function chain evaluates it, so the result is\n * bit-identical.\n */\nfn GetSkyIrradianceLum(\n\tatm: Atm,\n\tirradiance_texture: texture_2d<f32>,\n\tp: vec3f, normal: vec3f, sun_direction: vec3f) -> vec3f {\n\tlet r = length(p);\n\tlet mu_s = dot(p, sun_direction) / r;\n\treturn GetIrradiance(atm, irradiance_texture, r, mu_s) *\n\t\t(1.0 + dot(normal, p) / r) * 0.5 *\n\t\tatm.sky_spectral_radiance_to_luminance;\n}\n\n// Rebuild the Atm struct from the packed uniforms the TSL entries receive\n// (density profiles are precompute-only and stay zeroed).\nfn UnpackAtm(\n\tsolar_irradiance: vec3f,\n\trayleigh_scattering: vec3f,\n\tmie_scattering: vec3f,\n\tsky_srtl: vec3f,\n\tsun_srtl: vec3f,\n\t// x: sun_angular_radius, y: bottom_radius, z: top_radius, w: mie_phase_g\n\tscalars: vec4f,\n\tmu_s_min: f32) -> Atm {\n\tvar atm: Atm;\n\tatm.solar_irradiance = solar_irradiance;\n\tatm.rayleigh_scattering = rayleigh_scattering;\n\tatm.mie_scattering = mie_scattering;\n\tatm.sky_spectral_radiance_to_luminance = sky_srtl;\n\tatm.sun_spectral_radiance_to_luminance = sun_srtl;\n\tatm.sun_angular_radius = scalars.x;\n\tatm.bottom_radius = scalars.y;\n\tatm.top_radius = scalars.z;\n\tatm.mie_phase_function_g = scalars.w;\n\tatm.mu_s_min = mu_s_min;\n\treturn atm;\n}\n\n// ray.vert's interpolation, reproduced exactly: the reference normalizes the\n// corner rays in the VERTEX shader, interpolates the unit vectors, then\n// renormalizes per fragment — bilinear-mixing the four unit corner rays here\n// is that same math (not the same as unprojecting the fragment directly).\nfn SkyViewRay(\n\tuv: vec2f, ray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f) -> vec3f {\n\treturn normalize(mix(mix(ray00, ray10, uv.x), mix(ray01, ray11, uv.x), uv.y));\n}\n",nc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\tlet earth_center = vec3f(0.0, -atm.bottom_radius, 0.0);\n\tlet camera = cameraPos - earth_center;\n\tlet sun_dir = normalize(sunDir);\n\tlet view_ray = SkyViewRay(uv, ray00, ray10, ray01, ray11);\n\n\tvar transmittance: vec3f;\n\tlet sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex,\n\t\tscatteringSamp, camera, view_ray, 0.0, sun_dir, &transmittance);\n\n\treturn vec4f(min(sky, vec3f(${sc})), 1.0);\n`,lc="\nfn mod289v4(x: vec4f) -> vec4f { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfn permuteV4(x: vec4f) -> vec4f { return mod289v4(((x * 34.0) + 10.0) * x); }\n\nfn taylorInvSqrt(r: vec4f) -> vec4f { return 1.79284291400159 - 0.85373472095314 * r; }\n\nfn mod289v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 289.0)) * 289.0; }\n\nfn simplexNoise(v: vec3f) -> f32 {\n\tlet C = vec2f(1.0 / 6.0, 1.0 / 3.0);\n\tlet D = vec4f(0.0, 0.5, 1.0, 2.0);\n\n\t// First corner\n\tvar i = floor(v + dot(v, C.yyy));\n\tlet x0 = v - i + dot(i, C.xxx);\n\n\t// Other corners\n\tlet g = step(x0.yzx, x0.xyz);\n\tlet l = 1.0 - g;\n\tlet i1 = min(g.xyz, l.zxy);\n\tlet i2 = max(g.xyz, l.zxy);\n\n\tlet x1 = x0 - i1 + C.xxx;\n\tlet x2 = x0 - i2 + C.yyy;\n\tlet x3 = x0 - D.yyy;\n\n\t// Permutations\n\ti = mod289v3(i);\n\tlet p = permuteV4(permuteV4(permuteV4(\n\t\ti.z + vec4f(0.0, i1.z, i2.z, 1.0)) +\n\t\ti.y + vec4f(0.0, i1.y, i2.y, 1.0)) +\n\t\ti.x + vec4f(0.0, i1.x, i2.x, 1.0));\n\n\tlet n_ = 0.142857142857;\n\tlet ns = n_ * D.wyz - D.xzx;\n\n\tlet j = p - 49.0 * floor(p * ns.z * ns.z);\n\n\tlet x_ = floor(j * ns.z);\n\tlet y_ = floor(j - 7.0 * x_);\n\n\tlet x = x_ * ns.x + ns.yyyy;\n\tlet y = y_ * ns.x + ns.yyyy;\n\tlet h = 1.0 - abs(x) - abs(y);\n\n\tlet b0 = vec4f(x.xy, y.xy);\n\tlet b1 = vec4f(x.zw, y.zw);\n\n\tlet s0 = floor(b0) * 2.0 + 1.0;\n\tlet s1 = floor(b1) * 2.0 + 1.0;\n\tlet sh = -step(h, vec4f(0.0));\n\n\tlet a0 = b0.xzyw + s0.xzyw * sh.xxyy;\n\tlet a1 = b1.xzyw + s1.xzyw * sh.zzww;\n\n\tvar p0 = vec3f(a0.xy, h.x);\n\tvar p1 = vec3f(a0.zw, h.y);\n\tvar p2 = vec3f(a1.xy, h.z);\n\tvar p3 = vec3f(a1.zw, h.w);\n\n\t// Normalise gradients\n\tlet norm = taylorInvSqrt(vec4f(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n\tp0 *= norm.x;\n\tp1 *= norm.y;\n\tp2 *= norm.z;\n\tp3 *= norm.w;\n\n\t// Mix final noise value\n\tvar m = max(0.5 - vec4f(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), vec4f(0.0));\n\tm = m * m;\n\treturn 105.0 * dot(m * m, vec4f(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));\n}\n\nfn simplexFBM(x: vec3f, octaves: i32, freq_in: f32) -> f32 {\n\tvar final_: f32 = 0.0;\n\tvar denom: f32 = 0.0;\n\tvar amp: f32 = 1.0;\n\tvar freq = freq_in;\n\n\tfor (var i: i32 = 0; i < octaves; i++) {\n\t\tfinal_ += amp * simplexNoise(x * freq);\n\t\tdenom += amp;\n\n\t\tfreq *= 2.0;\n\t\tamp *= 0.5;\n\t}\n\n\treturn final_ / denom;\n}\n\nfn mod7v3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 7.0)) * 7.0; }\n\nfn permuteV3(x: vec3f) -> vec3f { return mod289v3((34.0 * x + 10.0) * x); }\n\nfn worleyNoise(P: vec3f) -> f32 {\n\tlet K = 0.142857142857;\n\tlet Ko = 0.428571428571;\n\tlet K2 = 0.020408163265306;\n\tlet Kz = 0.166666666667;\n\tlet Kzo = 0.416666666667;\n\tlet jitter = 1.0;\n\n\tlet Pi = mod289v3(floor(P));\n\tlet Pf = fract(P) - 0.5;\n\n\tlet Pfx = Pf.x + vec3f(1.0, 0.0, -1.0);\n\tlet Pfy = Pf.y + vec3f(1.0, 0.0, -1.0);\n\tlet Pfz = Pf.z + vec3f(1.0, 0.0, -1.0);\n\n\tlet p = permuteV3(Pi.x + vec3f(-1.0, 0.0, 1.0));\n\tlet p1 = permuteV3(p + Pi.y - 1.0);\n\tlet p2 = permuteV3(p + Pi.y);\n\tlet p3 = permuteV3(p + Pi.y + 1.0);\n\n\tlet p11 = permuteV3(p1 + Pi.z - 1.0);\n\tlet p12 = permuteV3(p1 + Pi.z);\n\tlet p13 = permuteV3(p1 + Pi.z + 1.0);\n\n\tlet p21 = permuteV3(p2 + Pi.z - 1.0);\n\tlet p22 = permuteV3(p2 + Pi.z);\n\tlet p23 = permuteV3(p2 + Pi.z + 1.0);\n\n\tlet p31 = permuteV3(p3 + Pi.z - 1.0);\n\tlet p32 = permuteV3(p3 + Pi.z);\n\tlet p33 = permuteV3(p3 + Pi.z + 1.0);\n\n\tlet ox11 = fract(p11 * K) - Ko;\n\tlet oy11 = mod7v3(floor(p11 * K)) * K - Ko;\n\tlet oz11 = floor(p11 * K2) * Kz - Kzo;\n\n\tlet ox12 = fract(p12 * K) - Ko;\n\tlet oy12 = mod7v3(floor(p12 * K)) * K - Ko;\n\tlet oz12 = floor(p12 * K2) * Kz - Kzo;\n\n\tlet ox13 = fract(p13 * K) - Ko;\n\tlet oy13 = mod7v3(floor(p13 * K)) * K - Ko;\n\tlet oz13 = floor(p13 * K2) * Kz - Kzo;\n\n\tlet ox21 = fract(p21 * K) - Ko;\n\tlet oy21 = mod7v3(floor(p21 * K)) * K - Ko;\n\tlet oz21 = floor(p21 * K2) * Kz - Kzo;\n\n\tlet ox22 = fract(p22 * K) - Ko;\n\tlet oy22 = mod7v3(floor(p22 * K)) * K - Ko;\n\tlet oz22 = floor(p22 * K2) * Kz - Kzo;\n\n\tlet ox23 = fract(p23 * K) - Ko;\n\tlet oy23 = mod7v3(floor(p23 * K)) * K - Ko;\n\tlet oz23 = floor(p23 * K2) * Kz - Kzo;\n\n\tlet ox31 = fract(p31 * K) - Ko;\n\tlet oy31 = mod7v3(floor(p31 * K)) * K - Ko;\n\tlet oz31 = floor(p31 * K2) * Kz - Kzo;\n\n\tlet ox32 = fract(p32 * K) - Ko;\n\tlet oy32 = mod7v3(floor(p32 * K)) * K - Ko;\n\tlet oz32 = floor(p32 * K2) * Kz - Kzo;\n\n\tlet ox33 = fract(p33 * K) - Ko;\n\tlet oy33 = mod7v3(floor(p33 * K)) * K - Ko;\n\tlet oz33 = floor(p33 * K2) * Kz - Kzo;\n\n\tlet dx11 = Pfx + jitter * ox11;\n\tlet dy11 = Pfy.x + jitter * oy11;\n\tlet dz11 = Pfz.x + jitter * oz11;\n\n\tlet dx12 = Pfx + jitter * ox12;\n\tlet dy12 = Pfy.x + jitter * oy12;\n\tlet dz12 = Pfz.y + jitter * oz12;\n\n\tlet dx13 = Pfx + jitter * ox13;\n\tlet dy13 = Pfy.x + jitter * oy13;\n\tlet dz13 = Pfz.z + jitter * oz13;\n\n\tlet dx21 = Pfx + jitter * ox21;\n\tlet dy21 = Pfy.y + jitter * oy21;\n\tlet dz21 = Pfz.x + jitter * oz21;\n\n\tlet dx22 = Pfx + jitter * ox22;\n\tlet dy22 = Pfy.y + jitter * oy22;\n\tlet dz22 = Pfz.y + jitter * oz22;\n\n\tlet dx23 = Pfx + jitter * ox23;\n\tlet dy23 = Pfy.y + jitter * oy23;\n\tlet dz23 = Pfz.z + jitter * oz23;\n\n\tlet dx31 = Pfx + jitter * ox31;\n\tlet dy31 = Pfy.z + jitter * oy31;\n\tlet dz31 = Pfz.x + jitter * oz31;\n\n\tlet dx32 = Pfx + jitter * ox32;\n\tlet dy32 = Pfy.z + jitter * oy32;\n\tlet dz32 = Pfz.y + jitter * oz32;\n\n\tlet dx33 = Pfx + jitter * ox33;\n\tlet dy33 = Pfy.z + jitter * oy33;\n\tlet dz33 = Pfz.z + jitter * oz33;\n\n\tlet d11 = dx11 * dx11 + dy11 * dy11 + dz11 * dz11;\n\tlet d12 = dx12 * dx12 + dy12 * dy12 + dz12 * dz12;\n\tlet d13 = dx13 * dx13 + dy13 * dy13 + dz13 * dz13;\n\tlet d21 = dx21 * dx21 + dy21 * dy21 + dz21 * dz21;\n\tlet d22 = dx22 * dx22 + dy22 * dy22 + dz22 * dz22;\n\tlet d23 = dx23 * dx23 + dy23 * dy23 + dz23 * dz23;\n\tlet d31 = dx31 * dx31 + dy31 * dy31 + dz31 * dz31;\n\tlet d32 = dx32 * dx32 + dy32 * dy32 + dz32 * dz32;\n\tlet d33 = dx33 * dx33 + dy33 * dy33 + dz33 * dz33;\n\n\tlet d1 = min(min(d11, d12), d13);\n\tlet d2 = min(min(d21, d22), d23);\n\tlet d3 = min(min(d31, d32), d33);\n\tvar d = min(min(d1, d2), d3);\n\tlet dx = min(min(d.x, d.y), d.z);\n\treturn sqrt(dx);\n}\n",oc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\n\tvar ctx: CloudsCtx;\n\tctx.maxDistance = cloudsParamsA.x;\n\tctx.sigmaS = cloudsParamsA.y;\n\tctx.sigmaA = cloudsParamsA.z;\n\tctx.cloudLayerThickness = cloudsParamsA.w;\n\tctx.cloudLayerBottom = cloudsParamsB.x;\n\tctx.highCloudsHeight = cloudsParamsB.y;\n\tctx.highCloudsScale = cloudsParamsB.z;\n\tctx.weatherMapScale = cloudsParamsB.w;\n\tctx.baseNoiseScale = cloudsParamsC.x;\n\tctx.detailNoiseScale = cloudsParamsC.y;\n\tctx.cirrusDensity = cloudsParamsC.z;\n\tctx.altoDensity = cloudsParamsC.w;\n\tctx.windSpeed = cloudsParamsD.x;\n\tctx.weatherMapBlend = cloudsParamsD.y;\n\tctx.time = cloudsParamsD.z;\n\tctx.minStep = cloudsParamsD.w;\n\tctx.sigmaT = ctx.sigmaA + ctx.sigmaS;\n\tctx.fogFactor = ctx.maxDistance / 6.0;\n\tctx.bottomRadius = atm.bottom_radius;\n\tctx.sunDir = normalize(sunDir);\n\tctx.earthCenter = vec3f(0.0, -atm.bottom_radius, 0.0);\n\n\tlet rd = SkyViewRay(uv, ray00, ray10, ray01, ray11);\n\n\tlet volumetric = RaymarchVolumetricCloud(ctx, atm,\n\t\ttransmittanceTex, scatteringTex, scatteringSamp, irradianceTex,\n\t\tbaseNoiseTex, noiseSamp, detailNoiseTex,\n\t\tweatherCurTex, weatherSamp, weatherNextTex,\n\t\tcameraPos, rd);\n\tlet hightAlt = HighAltitudeCloud(ctx, atm,\n\t\ttransmittanceTex, scatteringTex, scatteringSamp,\n\t\thighCloudsTex, weatherSamp,\n\t\tcameraPos, rd);\n\n\tvar cloud = volumetric;\n\tcloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb,\n\t\tcloud.a + (1.0 - cloud.a) * hightAlt.a);\n\n\treturn vec4f(min(cloud.rgb, vec3f(${sc})), cloud.a);\n`,uc=`\n\tlet atm = UnpackAtm(solarIrradiance, rayleighScattering, mieScattering,\n\t\tskySrtl, sunSrtl, atmScalars, muSMin);\n\tlet earth_center = vec3f(0.0, -atm.bottom_radius, 0.0);\n\tlet camera = cameraPos - earth_center;\n\tlet sun_dir = normalize(sunDir);\n\n\tlet azimuth = (uv.x - 0.5) * 2.0 * PI;\n\tlet latitude = (uv.y - 0.5) * PI;\n\tlet cosLat = cos(latitude);\n\tlet rd = vec3f(cosLat * cos(azimuth), sin(latitude), cosLat * sin(azimuth));\n\n\tvar transmittance: vec3f;\n\tlet sky = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex,\n\t\tscatteringSamp, camera, rd, 0.0, sun_dir, &transmittance);\n\n\tvar cloud = vec4f(0.0);\n\tif (cloudsOn > 0.5) {\n\t\tvar ctx: CloudsCtx;\n\t\tctx.maxDistance = cloudsParamsA.x;\n\t\tctx.sigmaS = cloudsParamsA.y;\n\t\tctx.sigmaA = cloudsParamsA.z;\n\t\tctx.cloudLayerThickness = cloudsParamsA.w;\n\t\tctx.cloudLayerBottom = cloudsParamsB.x;\n\t\tctx.highCloudsHeight = cloudsParamsB.y;\n\t\tctx.highCloudsScale = cloudsParamsB.z;\n\t\tctx.weatherMapScale = cloudsParamsB.w;\n\t\tctx.baseNoiseScale = cloudsParamsC.x;\n\t\tctx.detailNoiseScale = cloudsParamsC.y;\n\t\tctx.cirrusDensity = cloudsParamsC.z;\n\t\tctx.altoDensity = cloudsParamsC.w;\n\t\tctx.windSpeed = cloudsParamsD.x;\n\t\tctx.weatherMapBlend = cloudsParamsD.y;\n\t\tctx.time = cloudsParamsD.z;\n\t\tctx.minStep = cloudsParamsD.w;\n\t\tctx.sigmaT = ctx.sigmaA + ctx.sigmaS;\n\t\tctx.fogFactor = ctx.maxDistance / 6.0;\n\t\tctx.bottomRadius = atm.bottom_radius;\n\t\tctx.sunDir = sun_dir;\n\t\tctx.earthCenter = earth_center;\n\n\t\tlet volumetric = RaymarchVolumetricCloud(ctx, atm,\n\t\t\ttransmittanceTex, scatteringTex, scatteringSamp, irradianceTex,\n\t\t\tbaseNoiseTex, noiseSamp, detailNoiseTex,\n\t\t\tweatherCurTex, weatherSamp, weatherNextTex,\n\t\t\tcameraPos, rd);\n\t\tlet hightAlt = HighAltitudeCloud(ctx, atm,\n\t\t\ttransmittanceTex, scatteringTex, scatteringSamp,\n\t\t\thighCloudsTex, weatherSamp,\n\t\t\tcameraPos, rd);\n\t\tcloud = volumetric;\n\t\tcloud = vec4f(cloud.rgb + (1.0 - cloud.a) * hightAlt.rgb,\n\t\t\tcloud.a + (1.0 - cloud.a) * hightAlt.a);\n\t}\n\n\tlet WHITE_POINT: f32 = 11.07;\n\tvar color = min(sky, vec3f(${sc})) * (1.0 - cloud.a) +\n\t\tmin(cloud.rgb, vec3f(${sc}));\n\tcolor = Hable(color, exposure, WHITE_POINT);\n\tcolor = pow(color, vec3f(1.0 / gamma));\n\n\treturn vec4f(color, 1.0);\n`,dc="\nfn HableTonemap(x: vec3f) -> vec3f {\n\tlet A = 0.15;\n\tlet B = 0.50;\n\tlet C = 0.10;\n\tlet D = 0.20;\n\tlet E = 0.02;\n\tlet F = 0.30;\n\treturn ((x * (A * x + C * B) + D * E) / (x * (A * x + B) + D * F)) - E / F;\n}\n\nfn Hable(color: vec3f, exposure: f32, whitePoint: f32) -> vec3f {\n\treturn HableTonemap(color * exposure) / HableTonemap(vec3f(whitePoint));\n}\n",hc=`\n${lc}\nfn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 {\n\treturn min2 + (value - min1) * (max2 - min2) / (max1 - min1);\n}\n\n@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>;\n\n// The reference dispatches 8x8x8 workgroups; WebGPU's default\n// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the\n// driver dispatches size/4 groups — same texel coverage, same math).\n@compute @workgroup_size(4, 4, 4)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet id = vec3i(gid);\n\tlet size = vec3i(textureDimensions(outNoise));\n\tif (any(id >= size)) {\n\t\treturn;\n\t}\n\n\tlet f = vec3f(id);\n\n\tlet p = simplexFBM(f, 4, 0.25) * 0.5 + 0.5;\n\tlet w = 1.0 - worleyNoise(f * 0.125) / 0.866;\n\n\tvar result: vec4f;\n\tresult.r = remap(p, 0.0, 1.0, w, 1.0);\n\tresult.g = worleyNoise(f * 0.25);\n\tresult.b = worleyNoise(f * 0.5);\n\tresult.a = worleyNoise(f);\n\n\ttextureStore(outNoise, id, result);\n}\n`,mc=`\n${lc}\n@group(0) @binding(0) var outNoise: texture_storage_3d<rgba16float, write>;\n\n// The reference dispatches 8x8x8 workgroups; WebGPU's default\n// maxComputeInvocationsPerWorkgroup is 256, so this port uses 4x4x4 (the\n// driver dispatches size/4 groups — same texel coverage, same math).\n@compute @workgroup_size(4, 4, 4)\nfn main(@builtin(global_invocation_id) gid: vec3u) {\n\tlet id = vec3i(gid);\n\tlet size = vec3i(textureDimensions(outNoise));\n\tif (any(id >= size)) {\n\t\treturn;\n\t}\n\n\tlet f = vec3f(id);\n\n\tvar result: vec4f;\n\tresult.r = 1.0 - worleyNoise(f * 0.25);\n\tresult.g = 1.0 - worleyNoise(f * 0.5);\n\tresult.b = 1.0 - worleyNoise(f);\n\tresult.a = 1.0;\n\n\ttextureStore(outNoise, id, result);\n}\n`,cc=Math.fround,pc=360,gc=.5*Math.PI/180,fc=1e3,_c=[1.11776,1.14259,1.01249,1.14716,1.72765,1.73054,1.6887,1.61253,1.91198,2.03474,2.02042,2.02212,1.93377,1.95809,1.91686,1.8298,1.8685,1.8931,1.85149,1.8504,1.8341,1.8345,1.8147,1.78158,1.7533,1.6965,1.68194,1.64654,1.6048,1.52143,1.55622,1.5113,1.474,1.4482,1.41018,1.36775,1.34188,1.31429,1.28303,1.26758,1.2367,1.2082,1.18737,1.14683,1.12362,1.1058,1.07124,1.04992],yc=[118e-29,2182e-31,2818e-31,6636e-31,1527e-30,2763e-30,552e-29,8451e-30,1582e-29,2316e-29,3669e-29,4924e-29,7752e-29,9016e-29,148e-27,1602e-28,2139e-28,2755e-28,3091e-28,35e-26,4266e-28,4672e-28,4398e-28,4701e-28,5019e-28,4305e-28,374e-27,3215e-28,2662e-28,2238e-28,1852e-28,1473e-28,1209e-28,9423e-29,7455e-29,6566e-29,5105e-29,415e-28,4228e-29,3237e-29,2451e-29,2801e-29,2534e-29,1624e-29,1465e-29,2078e-29,1383e-29,7105e-30],xc=[360,1299e-7,3917e-9,6061e-7,365,2321e-7,6965e-9,.001086,370,4149e-7,1239e-8,.001946,375,7416e-7,2202e-8,.003486,380,.001368,39e-6,.006450001,385,.002236,64e-6,.01054999,390,.004243,12e-5,.02005001,395,.00765,217e-6,.03621,400,.01431,396e-6,.06785001,405,.02319,64e-5,.1102,410,.04351,.00121,.2074,415,.07763,.00218,.3713,420,.13438,.004,.6456,425,.21477,.0073,1.0390501,430,.2839,.0116,1.3856,435,.3285,.01684,1.62296,440,.34828,.023,1.74706,445,.34806,.0298,1.7826,450,.3362,.038,1.77211,455,.3187,.048,1.7441,460,.2908,.06,1.6692,465,.2511,.0739,1.5281,470,.19536,.09098,1.28764,475,.1421,.1126,1.0419,480,.09564,.13902,.8129501,485,.05795001,.1693,.6162,490,.03201,.20802,.46518,495,.0147,.2586,.3533,500,.0049,.323,.272,505,.0024,.4073,.2123,510,.0093,.503,.1582,515,.0291,.6082,.1117,520,.06327,.71,.07824999,525,.1096,.7932,.05725001,530,.1655,.862,.04216,535,.2257499,.9148501,.02984,540,.2904,.954,.0203,545,.3597,.9803,.0134,550,.4334499,.9949501,.008749999,555,.5120501,1,.005749999,560,.5945,.995,.0039,565,.6784,.9786,.002749999,570,.7621,.952,.0021,575,.8425,.9154,.0018,580,.9163,.87,.001650001,585,.9786,.8163,.0014,590,1.0263,.757,.0011,595,1.0567,.6949,.001,600,1.0622,.631,8e-4,605,1.0456,.5668,6e-4,610,1.0026,.503,34e-5,615,.9384,.4412,24e-5,620,.8544499,.381,19e-5,625,.7514,.321,1e-4,630,.6424,.265,4999999e-11,635,.5419,.217,3e-5,640,.4479,.175,2e-5,645,.3608,.1382,1e-5,650,.2835,.107,0,655,.2187,.0816,0,660,.1649,.061,0,665,.1212,.04458,0,670,.0874,.032,0,675,.0636,.0232,0,680,.04677,.017,0,685,.0329,.01192,0,690,.0227,.00821,0,695,.01584,.005723,0,700,.01135916,.004102,0,705,.008110916,.002929,0,710,.005790346,.002091,0,715,.004109457,.001484,0,720,.002899327,.001047,0,725,.00204919,74e-5,0,730,.001439971,52e-5,0,735,.0009999493,3611e-7,0,740,.0006900786,2492e-7,0,745,.0004760213,1719e-7,0,750,.0003323011,12e-5,0,755,.0002348261,848e-7,0,760,.0001661505,6e-5,0,765,117413e-9,424e-7,0,770,8307527e-11,3e-5,0,775,5870652e-11,212e-7,0,780,4150994e-11,1499e-8,0,785,2935326e-11,106e-7,0,790,2067383e-11,74657e-10,0,795,1455977e-11,52578e-10,0,800,1025398e-11,37029e-10,0,805,7221456e-12,26078e-10,0,810,5085868e-12,18366e-10,0,815,3581652e-12,12934e-10,0,820,2522525e-12,9.1093e-7,0,825,1776509e-12,6.4153e-7,0,830,1251141e-12,4.5181e-7,0],vc=[3.2406,-1.5372,-.4986,-.9689,1.8758,.0415,.0557,-.204,1.057],bc={maxOzoneNumberDensity:5374e15,rayleigh:124062e-11,rayleighScaleHeight:8e3,mieScaleHeight:1200,mieAngstromAlpha:0,mieAngstromBeta:.005328,mieSingleScatteringAlbedo:.9,miePhaseFunctionG:.9,groundAlbedo:.1,numScatteringOrders:4};function Tc(e,t,a){if(a<e[0])return t[0];for(let r=0;r<e.length-1;r++)if(a<e[r+1]){let s=(a-e[r])/(e[r+1]-e[r]);return t[r]*(1-s)+t[r+1]*s}return t[t.length-1]}function wc(e,t){if(e<=pc||e>=830)return 0;let a=(e-pc)/5,r=Math.floor(a);return a-=r,xc[4*r+t]*(1-a)+xc[4*(r+1)+t]*a}function Sc(e,t,a){let r=0,s=0,i=0,n=Tc(e,t,680),l=Tc(e,t,550),o=Tc(e,t,440);for(let u=pc;u<830;u+=1){let d=wc(u,1),h=wc(u,2),m=wc(u,3),c=vc[0]*d+vc[1]*h+vc[2]*m,p=vc[3]*d+vc[4]*h+vc[5]*m,g=vc[6]*d+vc[7]*h+vc[8]*m,f=Tc(e,t,u);r+=c*f/n*Math.pow(cc(u/680),a),s+=p*f/l*Math.pow(cc(u/550),a),i+=g*f/o*Math.pow(cc(u/440),a)}return r*=683,s*=683,i*=683,[r,s,i]}var Vc=Math.PI/180;function Mc(e,t,a,r,s){return[cc(e/fc),cc(t),cc(a*fc),cc(r*fc),cc(s)]}function Cc(e){return new Float32Array([...e,...e])}var Rc=cc(Vc),zc=cc(Math.PI),kc=cc(2*Math.PI);function Ac(e,t=80){let a=cc(52*Rc),r=cc(cc(23.44)*Rc),s=cc(e%86400/86400),i=cc(r*Math.sin(cc(cc(cc(2*zc)*(t-80))/365))),n=cc(cc(s-.5)*kc),l=cc(Math.sin(a)*Math.sin(i)+Math.cos(a)*Math.cos(i)*Math.cos(n)),o=cc(1-cc(l*l)),u=cc(Math.sqrt(o>0?o:0));return[cc(u*Math.sin(n)),l,cc(u*Math.cos(n))]}var Pc=Math.fround,Ec=256;function Nc(e){return Pc(e-Math.floor(e))}function Bc(e,t,a){e=Pc(e+a),t=Pc(t+a);let r=Pc(Pc(e*Pc(127.1))+Pc(t*Pc(311.7))),s=Pc(Pc(e*Pc(269.5))+Pc(t*Pc(183.3)));return[Nc(Pc(Pc(Math.sin(r))*Pc(43758.5453123))),Nc(Pc(Pc(Math.sin(s))*Pc(43758.5453123)))]}function Lc(e,t,a){return Pc(Pc(Pc(Pc(Pc(t-e)*Pc(3-Pc(2*a)))*a)*a)+e)}var Ic=Pc(Pc(3.14159265)/2147483648);function Fc(e,t,a,r,s){let[i,n]=function(e,t,a){let r=e>>>0,s=t>>>0;r=(r^Math.imul(a,2654435761))>>>0,s=(s^Math.imul(a,2246822519))>>>0,r=Math.imul(r,3284157443)>>>0,s=(s^(r<<16|r>>>16))>>>0,s=Math.imul(s,1911520717)>>>0,r=(r^(s<<16|s>>>16))>>>0,r=Math.imul(r,2048419325)>>>0;let i=Pc(Pc(r)*Ic);return[Pc(Math.sin(i)),Pc(Math.cos(i))]}(e,t,s),l=Pc(a-e),o=Pc(r-t);return Pc(Pc(l*i)+Pc(o*n))}function Dc(e,t,a=0){let r=Math.trunc(e),s=Math.trunc(t),i=r+1,n=s+1,l=Pc(e-r),o=Pc(t-s),u=Fc(r,s,e,t,a),d=Fc(i,s,e,t,a),h=Lc(u,d,l);u=Fc(r,n,e,t,a),d=Fc(i,n,e,t,a);let m=Lc(u,d,l);return Lc(h,m,o)}function Uc(e,t,a,r=1,s=1,i=0){let n=0,l=0;for(let o=0;o<e;o++)n=Pc(n+Pc(s*Dc(Pc(t*r),Pc(a*r),i))),l=Pc(l+s),s=Pc(.5*s),r=Pc(2*r);return Pc(n/l)}function Oc(e,t,a,r=0){let s=Math.floor(e),i=Math.floor(t),n=Pc(e-s),l=Pc(t-i),o=1e9;for(let e=-1;e<=1;e++)for(let t=-1;t<=1;t++){let u=Pc(Pc(Pc(s+t)+a)%a),d=Pc(Pc(Pc(i+e)+a)%a),[h,m]=Bc(u,d,r),c=Pc(h+t),p=Pc(m+e),g=Pc(c-n),f=Pc(p-l),_=Pc(Math.sqrt(Pc(Pc(g*g)+Pc(f*f))));_<o&&(o=_)}return o}function Gc(e,t,a){let r=Pc(Pc(a-e)/Pc(t-e));return r<0&&(r=0),r>1&&(r=1),Pc(Pc(r*r)*Pc(3-Pc(2*r)))}function qc(e,t,a){return Pc(Pc(e*Pc(1-a))+Pc(t*a))}function Wc(e){return Math.trunc(e)>>>0}var Hc=new Float32Array(1),jc=new Uint32Array(Hc.buffer);function Kc(e){Hc[0]=e;let t=jc[0],a=t>>>16&32768,r=t>>>23&255,s=8388607&t;if(255===r)return 31744|a|(0!==s?512:0);let i=r-112;return i>=31?31744|a:i<=0?a:(a|i<<10|s>>>13)+(s>>>12&1)}var $c=new Map;function Xc(e,t){let a=`${e}|${Pc(t)}`,r=$c.get(a);if(void 0!==r)return $c.delete(a),$c.set(a,r),r;let s=function(e){let t=new Uint16Array(262144);for(let a=0;a<65536;a++)t[4*a+0]=Kc(e[3*a+0]),t[4*a+1]=Kc(e[3*a+1]),t[4*a+2]=Kc(e[3*a+2]),t[4*a+3]=15360;return t}(function(e,t){switch(t=Pc(t),e){case"clear":return new Float32Array(196608);case"mostlyClear":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,24,1,a))+.5);t[n+0]=Pc(Gc(Pc(.45),Pc(.8),l)*Pc(.7)),t[n+1]=0,t[n+2]=Pc(.3)}return t}(t);case"partlyCloudy":return function(e){let t=new Float32Array(196608),a=Pc(Math.max(1,Wc(e)));for(let r=0;r<Ec;r++)for(let s=0;s<Ec;s++){let i=Pc(r/Ec),n=Pc(s/Ec),l=3*(s*Ec+r),o=Pc(1-Oc(Pc(24*i),Pc(24*n),24,e)),u=Pc(Pc(.5*Uc(3,i,n,16,a,0))+.5),d=Pc(u*Gc(Pc(.3),1,o)),h=Pc(qc(0,Pc(.35),Gc(Pc(.1),Pc(.4),d))*o);t[l+0]=d,t[l+1]=0,t[l+2]=d<.1?0:h}return t}(t);case"mostlyCloudy":return function(e){let t=new Float32Array(196608),a=Pc(Math.max(1,Wc(e)));for(let r=0;r<Ec;r++)for(let s=0;s<Ec;s++){let i=Pc(r/Ec),n=Pc(s/Ec),l=3*(s*Ec+r),o=Pc(1-Oc(Pc(32*i),Pc(32*n),32,e)),u=Pc(Pc(.5*Uc(3,i,n,16,a,0))+.5),d=Pc(u*Gc(0,Pc(.9),o)),h=Pc(qc(0,Pc(.6),Gc(Pc(.1),Pc(.4),d))*o);t[l+0]=d,t[l+1]=0,t[l+2]=d<.1?0:h}return t}(t);case"overcast":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,16,1,a))+.5);t[n+0]=Gc(Pc(.2),1,l),t[n+1]=Pc(.3),t[n+2]=Pc(.8)}return t}(t);case"storm":return function(e){let t=new Float32Array(196608),a=Wc(e);for(let e=0;e<Ec;e++)for(let r=0;r<Ec;r++){let s=Pc(e/Ec),i=Pc(r/Ec),n=3*(r*Ec+e),l=Pc(Pc(.5*Uc(3,s,i,16,1,a))+.5);t[n+0]=Gc(Pc(.1),1,l),t[n+1]=Pc(Pc(.5*Uc(2,s,i,8,1,a))+.5),t[n+2]=1}return t}(t)}}(e,t));return $c.size>=8&&$c.delete($c.keys().next().value),$c.set(a,s),s}var Qc={cirrus:"sky-cirrus.png",alto:"sky-alto.png"};async function Zc(e){let t=Jr(Qc[e]),a=await fetch(t,{mode:"cors"});if(!a.ok)throw new Error(`skyAssets: fetching ${t} failed (${a.status})`);return new Uint8Array(await a.arrayBuffer())}async function Yc(e){let t=512,a=await createImageBitmap(new Blob([e],{type:"image/png"}),{colorSpaceConversion:"none"}),r=new OffscreenCanvas(t,t).getContext("2d");if(!r)throw new Error("skyAssets: no 2d context for PNG decode");r.drawImage(a,0,0,t,t),a.close();let s=r.getImageData(0,0,t,t).data,i=new Uint8Array(t*t);for(let e=0;e<t;e++){let a=511-e;for(let r=0;r<t;r++)i[e*t+r]=s[4*(a*t+r)]}return i}var Jc="\nconst HDRI_PI: f32 = 3.141592653589793;\n\nfn HdriRotateByEuler(dir: vec3f, euler: vec3f) -> vec3f {\n\tlet cx = cos(euler.x); let sx = sin(euler.x);\n\tlet cy = cos(euler.y); let sy = sin(euler.y);\n\tlet cz = cos(euler.z); let sz = sin(euler.z);\n\n\tlet rot = mat3x3f(\n\t\tcy * cz, cy * sz, -sy,\n\t\tsx * sy * cz - cx * sz, sx * sy * sz + cx * cz, sx * cy,\n\t\tcx * sy * cz + sx * sz, cx * sy * sz - sx * cz, cx * cy\n\t);\n\treturn rot * dir;\n}\n\n/** Direction → equirect uv — Hana's compute_equirectangular_uvs with the v\n * term flipped for three's flipY image upload (see the header note; u is\n * Hana's exact 1 − (long + π)/2π). */\nfn HdriDirToUv(dir0: vec3f, euler: vec3f) -> vec2f {\n\tlet dir = HdriRotateByEuler(normalize(dir0), euler);\n\tlet longitude = atan2(dir.x, dir.z);\n\tlet latitude = asin(clamp(dir.y, -1.0, 1.0));\n\tlet u = 1.0 - (longitude + HDRI_PI) / (2.0 * HDRI_PI);\n\tlet v = (latitude + HDRI_PI / 2.0) / HDRI_PI;\n\treturn vec2f(u, v);\n}\n\n/** Mip level whose texel footprint covers the given angle. Used per tap by\n * HdriSampleBlurred so the gaussian rings never undersample the gaps\n * between taps (same LOD-selection idea as the reflection layer's\n * cone-width blur). 0 when the footprint is smaller than one texel. */\nfn HdriBlurLod(texWidth: f32, footprintAngle: f32) -> f32 {\n\tlet texelsPerRadian = texWidth / (2.0 * HDRI_PI);\n\treturn clamp(log2(max(footprintAngle * texelsPerRadian, 1.0)), 0.0, 16.0);\n}\n\n/** Interleaved gradient noise (Jimenez) — the same per-pixel hash family\n * the reflection layer's blur uses. Deliberately STATIC here (no frame\n * animation, no TAA reliance): the blur must look identical whether or\n * not temporal AA runs, so the dither is a fixed spatial pattern. */\nfn HdriIGN(pix: vec2f) -> f32 {\n\treturn fract(\n\t\t52.9829189 * fract(dot(pix, vec2f(0.06711056, 0.00583715))));\n}\n\n/**\n * Gaussian-blurred equirect sample: a 13-tap disc around the ray — center\n * plus two hex rings at 1σ and 2σ (σ = half the blur angle), true gaussian\n * ring weights (e^0, e^-0.5, e^-2) — with every tap reading a σ-footprint\n * mip so the rings blend seamlessly. Reads like a gaussian of ~σ instead\n * of the boxy bilinear lozenges a bare mip pick produces at large radii;\n * a mip pyramid alone is a stack of 2×2 box filters.\n *\n * jitter (x = disc rotation in radians, y = ring radius scale)\n * decorrelates the kernel per pixel: a FIXED sparse disc leaves\n * tap-replica and mip-interpolation structure — subtle bands parallel to\n * strong source edges. The background pass feeds it static per-pixel IGN\n * (structured banding becomes fine, temporally stable spatial noise —\n * deliberately NOT frame-animated, so nothing depends on TAA); the tiny\n * env re-projection passes (0, 1).\n */\nfn HdriSampleBlurred(\n\tenvTex: texture_2d<f32>, envSamp: sampler,\n\tdir: vec3f, euler: vec3f, blurAngle: f32, jitter: vec2f) -> vec3f {\n\tlet st0 = HdriDirToUv(dir, euler);\n\tif (blurAngle <= 0.0) {\n\t\treturn textureSampleLevel(envTex, envSamp, st0, 0.0).rgb;\n\t}\n\tlet sigma = blurAngle * 0.5;\n\tlet lod = HdriBlurLod(f32(textureDimensions(envTex, 0).x), sigma);\n\n\t// Tangent frame around the ray (the offsets live on its normal plane).\n\tlet axis = select(\n\t\tvec3f(0.0, 1.0, 0.0), vec3f(1.0, 0.0, 0.0), abs(dir.y) > 0.99);\n\tlet t1 = normalize(cross(axis, dir));\n\tlet t2 = cross(dir, t1);\n\n\tlet r1 = sigma * jitter.y;\n\tlet r2 = 2.0 * sigma * jitter.y;\n\tlet wRing1 = 0.60653066; // e^-0.5, taps at 1σ\n\tlet wRing2 = 0.13533528; // e^-2, taps at 2σ\n\tvar sum = textureSampleLevel(envTex, envSamp, st0, lod).rgb;\n\tvar wSum = 1.0;\n\tfor (var i = 0u; i < 6u; i = i + 1u) {\n\t\t// Ring 2 sits on the hex vertices, ring 1 on the rotated midpoints.\n\t\tlet a1 = (f32(i) + 0.5) * (HDRI_PI / 3.0) + jitter.x;\n\t\tlet d1 = normalize(dir + (t1 * cos(a1) + t2 * sin(a1)) * r1);\n\t\tsum += textureSampleLevel(\n\t\t\tenvTex, envSamp, HdriDirToUv(d1, euler), lod).rgb * wRing1;\n\t\tlet a2 = f32(i) * (HDRI_PI / 3.0) + jitter.x;\n\t\tlet d2 = normalize(dir + (t1 * cos(a2) + t2 * sin(a2)) * r2);\n\t\tsum += textureSampleLevel(\n\t\t\tenvTex, envSamp, HdriDirToUv(d2, euler), lod).rgb * wRing2;\n\t\twSum += wRing1 + wRing2;\n\t}\n\treturn sum / wSum;\n}\n",ep=64,tp=32;function ap(e){return Math.pow(e/255,2.2)}var rp=class{constructor(e,t){this._uRotation=lr(new ds),this._uBlurAngle=lr(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(Ur(e)){let{data:a,width:r,height:s}=e;t=(e,t)=>{let i=Math.min(r-1,Math.floor((e+.5)/ep*r)),n=Math.min(s-1,Math.floor((t+.5)/tp*s)),l=4*((s-1-n)*r+i);return[Math.pow(Math.max(Ms.fromHalfFloat(a[l]),0),2.2),Math.pow(Math.max(Ms.fromHalfFloat(a[l+1]),0),2.2),Math.pow(Math.max(Ms.fromHalfFloat(a[l+2]),0),2.2)]}}else{if(typeof document>"u")return null;let a=document.createElement("canvas");a.width=ep,a.height=tp;let r,s=a.getContext("2d",{willReadFrequently:!0});if(null===s)return null;try{s.drawImage(e,0,0,ep,tp),r=s.getImageData(0,0,ep,tp).data}catch{return null}t=(e,t)=>{let a=4*(t*ep+e);return[ap(r[a]),ap(r[a+1]),ap(r[a+2])]}}let a=e=>.2126*e[0]+.7152*e[1]+.0722*e[2],r=(e,t)=>{let a=(t+.5)/tp*Math.PI,r=Math.PI-(e+.5)/ep*2*Math.PI,s=Math.sin(a);return[s*Math.sin(r),Math.cos(a),s*Math.cos(r)]},s=[0,0,0],i=[0,0,0],n=0,l=0,o=0;for(let e=0;e<tp;e++){let r=Math.sin((e+.5)/tp*Math.PI),u=e<16;for(let d=0;d<ep;d++){let h=t(d,e);o=Math.max(o,a(h));let m=u?s:i;m[0]+=h[0]*r,m[1]+=h[1]*r,m[2]+=h[2]*r,u?n+=r:l+=r}}let u=[s[0]/n,s[1]/n,s[2]/n],d=[i[0]/l,i[1]/l,i[2]/l],h=a(u),m=a(d),c=(h*n+m*l)/Math.max(n+l,1e-6),p=.9*o,g=[0,0,0],f=[0,0,0],_=0;for(let e=0;e<tp;e++){let s=Math.sin((e+.5)/tp*Math.PI);for(let i=0;i<ep;i++){let n=t(i,e),l=a(n);if(l<p)continue;let o=r(i,e),u=s*l;g[0]+=o[0]*u,g[1]+=o[1]*u,g[2]+=o[2]*u,f[0]+=n[0]*s,f[1]+=n[1]*s,f[2]+=n[2]*s,_+=s}}let y=Math.hypot(g[0],g[1],g[2]),x=_>0?[f[0]/_,f[1]/_,f[2]/_]:[1,1,1],v=a(x);return{skyColor:u,skyLum:h,groundColor:d,groundLum:m,meanLum:c,sunDir:y>1e-4?[g[0]/y,g[1]/y,g[2]/y]:[0,1,0],sunColor:x,sunLum:v,sunPeak:c>1e-6?v/c:1}}(e.image)),this._lighting}_ensureSampleTexture(e){if(null===this._sampleTexture||this._sourceTexture!==e){this._sampleTexture?.dispose();let t=Ur(e.image)?Or(e.image):new ps(e.image);t.name="sky-hdri-source",t.wrapS=Ls,t.wrapT=Fs,t.minFilter=Js,t.magFilter=Qs,t.generateMipmaps=!0,t.flipY=!Ur(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 ke("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}",[Me(Jc)])({uv:vt,ray00:this._rays.ray00,ray10:this._rays.ray10,ray01:this._rays.ray01,ray11:this._rays.ray11,rotation:this._uRotation,blurAngle:this._uBlurAngle,resolution:w.resolution,envTex:Ea(e),envSamp:ct(e)})}_ensureBackgroundMesh(e){if(this.backgroundMesh)return this.backgroundMesh;let t=new As;t.setAttribute("position",new Cs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let a=new bt;a.name="SplineSkyHdriBackground",a.lights=!1,a.depthWrite=!1,a.depthTest=!1,a.colorNode=this._buildBackgroundNode(e);let r=ke("fn hdriBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");a.vertexNode=r({position:ie});let s=new Ds(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=ke("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}",[Me(Jc)])({uv:U(),rotation:this._uRotation,blurAngle:this._uBlurAngle,envTex:Ea(e),envSamp:ct(e)});if(null===this._envQuad){let e=new bt;e.name="SplineSkyHdriEnvironmentPass",e.lights=!1,e.fragmentNode=t,this._envQuad=new Ga(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 ys(256,128,{type:ts,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-hdri-environment",e.generateMipmaps=!0,e.minFilter=Js,e.magFilter=Qs,e.wrapS=Ls}let l=this._uRotation.value,o=`${i.uuid}|${i.version}|${l.x},${l.y},${l.z}|${r}`;if(o!==this._lastEnvKey){this._lastEnvKey=o;let e=this._renderer,t=e.getRenderTarget();e.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),e.setRenderTarget(t)}s?n.parent!==e&&(n.parent?.remove(n),e.add(n)):n.parent?.remove(n)}detach(){this._active=!1,this.backgroundMesh?.parent?.remove(this.backgroundMesh)}dispose(){this.detach(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this._envQuad=null,this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._boundTexture=null,this._sampleTexture?.dispose(),this._sampleTexture=null,this._sourceTexture=null,this._sourceVersion=-1}},sp=new Ss,ip=new os,np=new _s,lp=new _s,op={maxDistance:128,sigmaS:10,sigmaA:0,cloudLayerThickness:4,cloudLayerBottom:2,highCloudsHeight:8,highCloudsScale:32,weatherMapScale:128,baseNoiseScale:25,detailNoiseScale:1.5},up=.3,dp=.3,hp={clear:[0,0],mostlyClear:[up,dp],partlyCloudy:[up,dp],mostlyCloudy:[up,dp],overcast:[up,dp],storm:[up,dp]},mp=null;try{let e=new URLSearchParams(window.location.search).get("dbgskystep");null!==e&&""!==e&&Number.isFinite(Number(e))&&(mp=Math.max(0,Number(e)))}catch{}var cp=.62,pp={clear:1,mostlyClear:.95,partlyCloudy:.9,mostlyCloudy:.8,overcast:.6,storm:.5},gp={clear:1,mostlyClear:.92,partlyCloudy:.8,mostlyCloudy:.55,overcast:.3,storm:.15},fp={clear:1,mostlyClear:.97,partlyCloudy:.92,mostlyCloudy:.8,overcast:.65,storm:.5},_p="\n\tuv: vec2f,\n\tray00: vec3f, ray10: vec3f, ray01: vec3f, ray11: vec3f,\n\tcameraPos: vec3f, sunDir: vec3f,\n\tsolarIrradiance: vec3f, rayleighScattering: vec3f, mieScattering: vec3f,\n\tskySrtl: vec3f, sunSrtl: vec3f, atmScalars: vec4f, muSMin: f32,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler",yp=`${_p},\n\tirradianceTex: texture_2d<f32>,\n\tbaseNoiseTex: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoiseTex: texture_3d<f32>,\n\tweatherCurTex: texture_2d<f32>, weatherSamp: sampler,\n\tweatherNextTex: texture_2d<f32>,\n\thighCloudsTex: texture_2d<f32>,\n\tcloudsParamsA: vec4f, cloudsParamsB: vec4f,\n\tcloudsParamsC: vec4f, cloudsParamsD: vec4f`,xp=class{constructor(e){this._luts=null,this._baseNoise=null,this._detailNoise=null,this._highCloudsReady=!1,this._skyTarget=null,this._cloudsTarget=null,this._skyQuad=null,this._cloudsQuad=null,this._envTarget=null,this._envQuad=null,this._lastEnvKey=null,this.backgroundMesh=null,this._hdri=null,this._uRay00=lr(new ds),this._uRay10=lr(new ds),this._uRay01=lr(new ds),this._uRay11=lr(new ds),this._uCameraPos=lr(new ds(0,.1,0)),this._uSunDir=lr(new ds(0,1,0)),this._uCloudsParamsC=lr(new _s(op.baseNoiseScale,op.detailNoiseScale,up,dp)),this._uCloudsParamsD=lr(new _s(0,1,0,0)),this._uExposure=lr(5e-4),this._uGamma=lr(2.2),this._uEnvCloudsOn=lr(0),this._lastPage=null,this._lastVersion=-1,this._appliedWeather=null,this._appliedSeed=0,this._blendStart=0,this._blendFrom=1,this._presetFrom="partlyCloudy",this._presetTo="partlyCloudy",this._windOffsetKm=0,this._lastFrameTime=null,this._cloudsEnabled=!0,this._cloudsTargetCleared=!1,this._animating=!1,this._lastSkyPassKey=null,this._lastCloudsPassKey=null,this._sunLight=null,this._iblHdriTexture=null,this._iblRotationY=0,this._pmremBumpAt=0,this._pmremPending=!1,this._skyHemi=null,this._userAmbientSuppressed=!1,this._lightingLuts=null,this._lightingLutsRequested=!1,this._noonSunLum=0,this._noonSkyLum=0,this._noonSunRgb=null,this._lightingPage=null,this.assetsReady=Promise.resolve(),this.fixedSkySize=null,this.fixedCloudsSize=null,this.fixedTimeSeconds=null,this.numScatteringOrdersOverride=null,this.highCloudDensityOverride=null,this.minStepKmOverride=null,this._cloudsArgs=null,this._cloudsLib=null,this._renderer=e,this._atmosphereUniforms=function(e){let t=function(e){let t=[],a=[],r=[],s=[],i=[],n=[],l=[];for(let o=pc;o<=830;o+=10){let u=.001*o,d=e.mieAngstromBeta/e.mieScaleHeight*Math.pow(u,-e.mieAngstromAlpha);t.push(o),a.push(_c[(o-pc)/10]),r.push(e.rayleigh*Math.pow(u,-4)),s.push(d*e.mieSingleScatteringAlbedo),i.push(d),n.push(e.maxOzoneNumberDensity*yc[(o-pc)/10]),l.push(e.groundAlbedo)}return{wavelengths:t,solarIrradiance:a,rayleighScattering:r,mieScattering:s,mieExtinction:i,absorptionExtinction:n,groundAlbedo:l}}(e),{wavelengths:a}=t,r=Sc(a,t.solarIrradiance,-3),s=Sc(a,t.solarIrradiance,0),i=(e,t)=>[cc(Tc(a,e,680)*t),cc(Tc(a,e,550)*t),cc(Tc(a,e,440)*t)];return{solarIrradiance:i(t.solarIrradiance,1),rayleighScattering:i(t.rayleighScattering,fc),mieScattering:i(t.mieScattering,fc),mieExtinction:i(t.mieExtinction,fc),absorptionExtinction:i(t.absorptionExtinction,fc),groundAlbedo:i(t.groundAlbedo,1),skySpectralRadianceToLuminance:[cc(r[0]),cc(r[1]),cc(r[2])],sunSpectralRadianceToLuminance:[cc(s[0]),cc(s[1]),cc(s[2])],bottomRadius:6360,topRadius:6420,muSMin:cc(Math.cos(120*Vc)),sunAngularRadius:cc(gc),miePhaseG:cc(e.miePhaseFunctionG),rayleighDensity:Cc(Mc(0,1,-1/e.rayleighScaleHeight,0,0)),mieDensity:Cc(Mc(0,1,-1/e.mieScaleHeight,0,0)),absorptionDensity:new Float32Array([...Mc(25e3,0,0,1/15e3,-2/3),...Mc(0,0,0,-1/15e3,8/3)]),luminanceFromRadiance:new Float32Array([1,0,0,0,1,0,0,0,1])}}(bc);let t=e=>{let t=new Hs(new Uint16Array(262144),Ec,Ec,gs,ts);return t.wrapS=Ls,t.wrapT=Ls,t.minFilter=Qs,t.magFilter=Qs,t.name=e,t.needsUpdate=!0,t};this._weatherCur=t("sky-weather-current"),this._weatherNext=t("sky-weather-next"),this._highClouds=new Hs(new Uint8Array(1048576),512,512,gs,ti),this._highClouds.wrapS=Ls,this._highClouds.wrapT=Ls,this._highClouds.minFilter=Qs,this._highClouds.magFilter=Qs,this._highClouds.name="sky-high-clouds",this._highClouds.needsUpdate=!0,this.assetsReady=async function(){let[e,t]=await Promise.all([Zc("cirrus").then(Yc),Zc("alto").then(Yc)]),a=262144,r=new Uint8Array(2*a);for(let s=0;s<a;s++)r[2*s+0]=e[s],r[2*s+1]=t[s];return r}().then(e=>{let t=this._highClouds.image.data;for(let a=0;a<e.length/2;a++)t[4*a+0]=e[2*a+0],t[4*a+1]=e[2*a+1];this._highClouds.needsUpdate=!0,this._highCloudsReady=!0},()=>{})}get attached(){return null!=this.backgroundMesh?.parent||!0===this._hdri?.active}get animationActive(){return this.attached&&(this._animating||this._pmremPending)}get luts(){return this._luts}readbackLut(e){let t=this._luts;return t?"transmittance"===e?Qm(this._renderer,t.transmittance,256,64,1,!1):"irradiance"===e?Qm(this._renderer,t.irradiance,64,16,1,!1):Qm(this._renderer,t.scattering,256,128,32,!0):Promise.reject(new Error("sky LUTs not ready"))}readbackNoise(e){let t="base"===e?this._baseNoise:this._detailNoise;if(!t)return Promise.reject(new Error("sky noise not ready"));let a="base"===e?128:32;return Qm(this._renderer,t,a,a,a,!0)}get skyTexture(){return this._skyTarget?.texture??null}get cloudsTexture(){return this._cloudsTarget?.texture??null}get environmentTexture(){return!0===this._hdri?.active?this._hdri.environmentTexture:this._envTarget?.texture??null}get iblTexture(){return null===this._lightingPage?null:!0===this._hdri?.active?this._iblHdriTexture:this._envTarget?.texture??null}get iblRotationY(){return!0===this._hdri?.active?this._iblRotationY:0}_requestEnvPmrem(e){let t=this._envTarget?.texture;void 0!==t&&(e-this._pmremBumpAt>=150?(this._pmremBumpAt=e,this._pmremPending=!1,t.needsPMREMUpdate=!0):this._pmremPending=!0)}get weatherTextureData(){return{current:this._weatherCur.image.data,next:this._weatherNext.image.data}}_ensureLuts(){this._luts||(this._luts=function(e,t,a){let r=Wm(e),s=jm(256,64,es,"sky-lut-transmittance"),i=[jm(64,16,es,"sky-lut-irradiance-a"),jm(64,16,es,"sky-lut-irradiance-b")],n=[Km(256,128,32,ts,"sky-lut-scattering-a",Qs),Km(256,128,32,ts,"sky-lut-scattering-b",Qs)],l=jm(64,16,es,"sky-delta-irradiance"),o=Km(256,128,32,es,"sky-delta-rayleigh",Ws),u=Km(256,128,32,es,"sky-delta-mie",Ws),d=Km(256,128,32,es,"sky-delta-density",Ws),h={transmittance:Hm(e,s),irr:i.map(t=>Hm(e,t)),scat:n.map(t=>Hm(e,t)),deltaIrradiance:Hm(e,l),deltaRayleigh:Hm(e,o),deltaMie:Hm(e,u),deltaDensity:Hm(e,d)},m=h.deltaRayleigh,c=function(e){let t=new Float32Array(80),a=0,r=(e,r)=>{t[a++]=e[0],t[a++]=e[1],t[a++]=e[2],t[a++]=r};r(e.solarIrradiance,e.sunAngularRadius),r(e.rayleighScattering,e.bottomRadius),r(e.mieScattering,e.topRadius),r(e.mieExtinction,e.miePhaseG),r(e.absorptionExtinction,e.muSMin),r(e.groundAlbedo,0),r(e.skySpectralRadianceToLuminance,0),r(e.sunSpectralRadianceToLuminance,0);for(let r of[e.rayleighDensity,e.mieDensity,e.absorptionDensity])for(let e=0;e<2;e++){for(let s=0;s<5;s++)t[a++]=r[5*e+s];a+=3}return t}(t),p=r.createBuffer({label:"sky-atm-uniforms",size:c.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(p,0,c.buffer,0,c.byteLength);let g=[],f=e=>(g.push(e),(g.length-1)*$m),_=new Map;for(let[e,t]of Object.entries(Xm)){let a=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform",hasDynamicOffset:!0}}];t.entries.forEach((e,t)=>{"sampled"in e?a.push({binding:2+t,visibility:GPUShaderStage.COMPUTE,texture:{sampleType:"unfilterable-float",viewDimension:e.sampled}}):a.push({binding:2+t,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:e.format,viewDimension:e.storage}})});let s=r.createBindGroupLayout({label:`sky-${e}-bgl`,entries:a}),i=r.createComputePipeline({label:`sky-${e}`,layout:r.createPipelineLayout({bindGroupLayouts:[s]}),compute:{module:r.createShaderModule({label:`sky-${e}-wgsl`,code:t.code}),entryPoint:"main"}});_.set(e,{pipeline:i,layout:s})}let y=[],x=0,v=0,b=(e,t)=>[e/8,t/8,1];y.push([{kernel:"transmittance",textures:[h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:b(256,64)}]),y.push([{kernel:"directIrradiance",textures:[h.irr[x],h.irr[1-x],h.deltaIrradiance,h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:0,scatteringOrder:0}),groups:b(64,16)}]),x=1-x;{let e=[];for(let t=0;t<32;t++)e.push({kernel:"singleScattering",textures:[h.deltaRayleigh,h.deltaMie,h.scat[v],h.scat[1-v],h.transmittance],slotOffset:f({blend:[0,0,0,0],layer:t,scatteringOrder:0}),groups:b(256,128)});y.push(e),v=1-v}for(let e=2;e<=a;e++){{let t=[];for(let a=0;a<32;a++)t.push({kernel:"scatteringDensity",textures:[h.deltaDensity,h.transmittance,h.deltaRayleigh,h.deltaMie,m,h.deltaIrradiance],slotOffset:f({blend:[0,0,0,0],layer:a,scatteringOrder:e}),groups:b(256,128)});y.push(t)}y.push([{kernel:"indirectIrradiance",textures:[h.deltaIrradiance,h.irr[x],h.irr[1-x],h.deltaRayleigh,h.deltaMie,m],slotOffset:f({blend:[0,1,0,0],layer:0,scatteringOrder:e-1}),groups:b(64,16)}]),x=1-x;{let t=[];for(let a=0;a<32;a++)t.push({kernel:"multipleScattering",textures:[m,h.scat[v],h.scat[1-v],h.transmittance,h.deltaDensity],slotOffset:f({blend:[0,1,0,0],layer:a,scatteringOrder:e}),groups:b(256,128)});y.push(t),v=1-v}}let T=new Float32Array(g.length*$m/4);g.forEach((e,t)=>function(e,t,a){let r=t;e[r+0]=1,e[r+5]=1,e[r+10]=1,e[r+12]=a.blend[0],e[r+13]=a.blend[1],e[r+14]=a.blend[2],e[r+15]=a.blend[3],new Int32Array(e.buffer,e.byteOffset+4*(r+16),2).set([a.layer,a.scatteringOrder])}(T,t*$m/4,e));let w=r.createBuffer({label:"sky-pass-params",size:T.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});r.queue.writeBuffer(w,0,T.buffer,0,T.byteLength);let S=new Map,V=e=>{let t=S.get(e);return t||(t=e.createView({mipLevelCount:1}),S.set(e,t)),t};for(let e of y){let t=r.createCommandEncoder({label:"sky-precompute"}),a=t.beginComputePass();for(let t of e){let{pipeline:e,layout:s}=_.get(t.kernel),i=[{binding:0,resource:{buffer:p}},{binding:1,resource:{buffer:w,size:$m}}];t.textures.forEach((e,t)=>{i.push({binding:2+t,resource:V(e)})});let n=r.createBindGroup({layout:s,entries:i});a.setPipeline(e),a.setBindGroup(0,n,[t.slotOffset]),a.dispatchWorkgroups(...t.groups)}a.end(),r.queue.submit([t.finish()])}let M=i[x],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??bc.numScatteringOrders))}_ensureNoise(){if(this._baseNoise)return;let e=this._renderer.backend.device;if(!e)throw new Error("[spline/sky] WebGPU device unavailable");let t=(e,t)=>{let a=new H(e,e,e);return a.type=ts,a.minFilter=Qs,a.magFilter=Qs,a.wrapS=Ls,a.wrapT=Ls,a.wrapR=Ls,a.generateMipmaps=!1,a.mipmapsAutoUpdate=!1,a.name=t,a};this._baseNoise=t(128,"sky-base-noise"),this._detailNoise=t(32,"sky-detail-noise");let a=(t,a,r)=>{this._renderer.initTexture(a);let s=this._renderer.backend.get(a).texture,i=e.createShaderModule({code:t}),n=e.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,storageTexture:{access:"write-only",format:"rgba16float",viewDimension:"3d"}}]}),l=e.createComputePipeline({layout:e.createPipelineLayout({bindGroupLayouts:[n]}),compute:{module:i,entryPoint:"main"}}),o=e.createCommandEncoder({label:"sky-noise"}),u=o.beginComputePass();u.setPipeline(l),u.setBindGroup(0,e.createBindGroup({layout:n,entries:[{binding:0,resource:s.createView({mipLevelCount:1})}]}));let d=r/4;u.dispatchWorkgroups(d,d,d),u.end(),e.queue.submit([o.finish()])};a(hc,this._baseNoise,128),a(mc,this._detailNoise,32)}_atmArgs(){let e=this._atmosphereUniforms;return{solarIrradiance:lr(new ds(...e.solarIrradiance)),rayleighScattering:lr(new ds(...e.rayleighScattering)),mieScattering:lr(new ds(...e.mieScattering)),skySrtl:lr(new ds(...e.skySpectralRadianceToLuminance)),sunSrtl:lr(new ds(...e.sunSpectralRadianceToLuminance)),atmScalars:lr(new _s(e.sunAngularRadius,e.bottomRadius,e.topRadius,e.miePhaseG)),muSMin:lr(e.muSMin)}}_ensurePasses(){if(this._skyQuad)return;this._ensureLuts(),this._ensureNoise();let e=this._luts,t={uv:U(),ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11,cameraPos:this._uCameraPos,sunDir:this._uSunDir,...this._atmArgs(),transmittanceTex:Ea(e.transmittance),scatteringTex:Ia(e.scattering),scatteringSamp:ct(e.scattering)},a=Me(Lm+ic),r=ke(`fn skyPass(${_p}) -> vec4f {${nc}}`,[a]),s=new bt;s.name="SplineSkyPass",s.lights=!1,s.fragmentNode=r(t),this._skyQuad=new Ga(s);let i=Me(Lm+ic+"\nfn remap(value: f32, min1: f32, max1: f32, min2: f32, max2: f32) -> f32 {\n\treturn min2 + (value - min1) * (max2 - min2) / (max1 - min1);\n}\n\nfn saturateF(x: f32) -> f32 {\n\treturn clamp(x, 0.0, 1.0);\n}\n\nfn triplanarSample(\n\tt: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f {\n\tvar blend = abs(n);\n\tblend = pow(blend, vec3f(4.0));\n\tblend /= dot(blend, vec3f(1.0));\n\n\tlet cx = textureSampleLevel(t, s, p.yz * scale, 0.0);\n\tlet cy = textureSampleLevel(t, s, p.xz * scale, 0.0);\n\tlet cz = textureSampleLevel(t, s, p.xy * scale, 0.0);\n\n\treturn cx * blend.x + cy * blend.y + cz * blend.z;\n}\n\n/** Weight below which a triplanar axis is dropped instead of sampled.\n *\n * The weights are normalized pow(|n|, 4). Inside the cloud shell n is the\n * planet's up vector at the sample, and the march reaches at most\n * CLOUDS_PARAMS.maxDistance (128 km) over a 6360 km radius: |n.x| and |n.z|\n * stay under sin(128 / 6363) = 0.021, so their weights stay under 2e-7 —\n * four orders of magnitude under the fp16 quantum of the [0, 1] weather\n * channels they scale. The threshold sits well above that worst case on\n * purpose: it keeps the branch UNIFORM across the pass (every ray in the\n * layer drops the same two axes) instead of flickering per texel, and it\n * bounds the error at one threshold per dropped axis. */\nconst TRIPLANAR_WEIGHT_EPS: f32 = 1.0e-5;\n\n/**\n * triplanarSample with negligible axes skipped — three texture samples down\n * to one for any sample inside the cloud shell. This is the hot one: the\n * weather map is read once per density sample (twice mid-transition) and there\n * are up to seven density samples per lit step, so between this and the blend\n * branch below the weather taps go from six per density sample to one. When\n * all three axes clear the threshold the accumulation matches triplanarSample\n * exactly (adding into a zero-initialized vec4 is exact).\n */\nfn triplanarSampleAdaptive(\n\tt: texture_2d<f32>, s: sampler, p: vec3f, n: vec3f, scale: f32) -> vec4f {\n\tvar blend = abs(n);\n\tblend = pow(blend, vec3f(4.0));\n\tblend /= dot(blend, vec3f(1.0));\n\n\tvar c = vec4f(0.0);\n\tif (blend.x > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.yz * scale, 0.0) * blend.x;\n\t}\n\tif (blend.y > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.xz * scale, 0.0) * blend.y;\n\t}\n\tif (blend.z > TRIPLANAR_WEIGHT_EPS) {\n\t\tc += textureSampleLevel(t, s, p.xy * scale, 0.0) * blend.z;\n\t}\n\treturn c;\n}\n\nfn raySphereIntersectFar(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 {\n\tlet a = dot(rd, rd);\n\tlet s0_r0 = r0 - s0;\n\tlet b = 2.0 * dot(rd, s0_r0);\n\tlet c = dot(s0_r0, s0_r0) - (sr * sr);\n\n\tlet d = b * b - 4.0 * a * c;\n\tif (d < 0.0) {\n\t\treturn -1.0;\n\t}\n\n\treturn (-b + sqrt(d)) / (2.0 * a);\n}\n\nfn raySphereIntersect(r0: vec3f, rd: vec3f, s0: vec3f, sr: f32) -> f32 {\n\tlet a = dot(rd, rd);\n\tlet s0_r0 = r0 - s0;\n\tlet b = 2.0 * dot(rd, s0_r0);\n\tlet c = dot(s0_r0, s0_r0) - (sr * sr);\n\n\tlet d = b * b - 4.0 * a * c;\n\tif (d < 0.0) {\n\t\treturn -1.0;\n\t}\n\n\tlet sqrtD = sqrt(d);\n\n\tlet t0 = (-b - sqrtD) / (2.0 * a);\n\tif (t0 > 0.0) {\n\t\treturn t0;\n\t}\n\n\tlet t1 = (-b + sqrtD) / (2.0 * a);\n\tif (t1 > 0.0) {\n\t\treturn t1;\n\t}\n\n\treturn -1.0;\n}\n\nconst CLOUD_RAY_STEPS: i32 = 160;\nconst LIGHT_RAY_STEPS: i32 = 6;\n\nconst cirrusSpeedFactor: f32 = 3.5;\nconst altoSpeedFactor: f32 = 2.0;\nconst detailStrength: f32 = 0.1;\nconst CLOUD_EPS: f32 = 1e-5;\n\nstruct CloudsCtx {\n\tmaxDistance: f32,\n\tsigmaS: f32,\n\tsigmaA: f32,\n\tcloudLayerThickness: f32,\n\tcloudLayerBottom: f32,\n\thighCloudsHeight: f32,\n\thighCloudsScale: f32,\n\tweatherMapScale: f32,\n\tbaseNoiseScale: f32,\n\tdetailNoiseScale: f32,\n\tcirrusDensity: f32,\n\taltoDensity: f32,\n\twindSpeed: f32,\n\tweatherMapBlend: f32,\n\ttime: f32,\n\t/** Floor on the march step length, km. 0 = the reference's fixed\n\t * CLOUD_RAY_STEPS division of the span (see RaymarchVolumetricCloud). */\n\tminStep: f32,\n\tsigmaT: f32,\n\tfogFactor: f32,\n\tbottomRadius: f32,\n\tsunDir: vec3f,\n\tearthCenter: vec3f,\n}\n\nfn HenyeyGreenstein(g: f32, costh: f32) -> f32 {\n\treturn (1.0 - g * g) / (4.0 * PI * pow(1.0 + g * g - 2.0 * g * costh, 1.5));\n}\n\nfn HeightGradient(h: f32, cloudType: f32) -> f32 {\n\tlet stratus = smoothstepGl(0.0, 0.07, h) * smoothstepGl(0.2, 0.07, h);\n\tlet cumulus = smoothstepGl(0.0, 0.2, h) * smoothstepGl(0.65, 0.35, h);\n\tlet cumulonimbus = smoothstepGl(0.0, 0.1, h) * smoothstepGl(0.95, 0.4, h);\n\n\tlet a = 1.0 - cloudType;\n\tlet wS = a * a;\n\tlet wCu = 2.0 * cloudType * a;\n\tlet wCb = cloudType * cloudType;\n\n\treturn wS * stratus + wCu * cumulus + wCb * cumulonimbus;\n}\n\nfn SampleDensity(\n\tctx: CloudsCtx,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tpos: vec3f) -> f32 {\n\tlet heightFraction = (length(pos - ctx.earthCenter) - ctx.bottomRadius - ctx.cloudLayerBottom) /\n\t\tctx.cloudLayerThickness;\n\tif (heightFraction < 0.0 || heightFraction > 1.0) {\n\t\treturn 0.0;\n\t}\n\n\tlet n = normalize(pos - ctx.earthCenter);\n\t// triplanar fixes 2d texture stretching on sphere\n\tlet weatherPos = pos + ctx.time * ctx.windSpeed;\n\tlet weatherScale = 1.0 / ctx.weatherMapScale;\n\t// The blend sits pinned at 1 except during the 2 s preset transition, and\n\t// mix(a, b, 1) is b — so outside a transition the \"current\" map's taps are\n\t// dead weight on every density sample. The blend is a uniform, so this\n\t// branch is coherent across the whole pass; a driver cannot fold it away\n\t// on its own. (At the endpoints the result differs from the mix by at most\n\t// one ulp, and only if the implementation lowers mix to an fma.)\n\tvar weather: vec3f;\n\tif (ctx.weatherMapBlend >= 1.0) {\n\t\tweather = triplanarSampleAdaptive(nextWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t} else if (ctx.weatherMapBlend <= 0.0) {\n\t\tweather = triplanarSampleAdaptive(currentWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t} else {\n\t\tlet weather0 = triplanarSampleAdaptive(currentWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t\tlet weather1 = triplanarSampleAdaptive(nextWeatherMap, weatherSamp,\n\t\t\tweatherPos, n, weatherScale).rgb;\n\t\tweather = mix(weather0, weather1, ctx.weatherMapBlend);\n\t}\n\n\tlet coverage = weather.r;\n\tlet precipitation = weather.g;\n\tlet cloudType = weather.b;\n\tlet heightGradient = HeightGradient(heightFraction, cloudType);\n\n\t// Zero coverage: the reference's remap below divides by zero and the\n\t// resulting NaN dies in GLSL's NaN-hostile clamp/compares (density 0).\n\t// WGSL's min/max SWALLOW NaN — saturate(NaN) becomes 1.0, a full-density\n\t// phantom cloud — so the \"no coverage, no cloud\" outcome is made\n\t// explicit here instead of riding on NaN semantics.\n\t// (Negated form so NaN coverage — the upstream partlyCloudy/seed-0\n\t// weather-map quirk — also lands here instead of resurrecting.)\n\tif (!(coverage > 0.0)) {\n\t\treturn 0.0;\n\t}\n\n\t// === base form ===\n\tlet base_uv = pos / ctx.baseNoiseScale + ctx.time * ctx.windSpeed / ctx.baseNoiseScale;\n\tlet baseN = textureSampleLevel(baseNoise, noiseSamp, base_uv, 0.0);\n\tlet lowFBM = baseN.g * 0.625 + baseN.b * 0.25 + baseN.a * 0.125;\n\tvar baseCloud = remap(baseN.r, -(1.0 - lowFBM), 1.0, 0.0, 1.0);\n\n\t// === compose ===\n\tbaseCloud = remap(baseCloud, 1.0 - coverage, 1.0, 0.0, 1.0);\n\tbaseCloud *= coverage;\n\tbaseCloud *= heightGradient;\n\n\tif (baseCloud < 0.0) {\n\t\treturn 0.0;\n\t}\n\n\t// === details ===\n\tlet detail_uv = pos / ctx.detailNoiseScale + ctx.time * ctx.windSpeed / ctx.detailNoiseScale;\n\tlet detailN = textureSampleLevel(detailNoise, noiseSamp, detail_uv, 0.0).rgb;\n\tlet detailFBM = dot(detailN, vec3f(0.625, 0.25, 0.125));\n\tlet detailCloud = remap(baseCloud, detailFBM * detailStrength, 1.0, 0.0, 1.0);\n\n\t// Detail erosion can push detailCloud negative; pow(<0, e) is NaN and\n\t// WGSL's NaN-swallowing saturate below would resurrect it to FULL\n\t// density (the GLSL NaN dies in the reference's clamp/compares —\n\t// effective density 0). Negated compare so NaN input lands here too.\n\tif (!(detailCloud > 0.0)) {\n\t\treturn 0.0;\n\t}\n\n\tlet density = pow(detailCloud, mix(1.0, 0.5, precipitation));\n\n\treturn saturateF(density);\n}\n\nconst SCATTERING_OCTAVES: i32 = 4;\n\n/**\n * The per-octave phase terms of MultipleOctaveScattering.\n *\n * They depend only on mu (the view/sun cosine) and a fixed geometric\n * sequence — nothing that varies along a ray. The reference nonetheless\n * recomputes all eight Henyey-Greenstein lobes, each with a pow, inside the\n * light march: once per LIT step, up to CLOUD_RAY_STEPS times per pixel.\n * Hoisted to once per pixel here; same values, same order, so the sum below\n * is bit-identical.\n */\nfn OctaveScatteringPhases(mu: f32) -> vec4f {\n\tlet phaseAttenuation = 0.2;\n\n\tvar c: f32 = 1.0;\n\tvar phases = vec4f(0.0);\n\n\tfor (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) {\n\t\tphases[i] = mix(\n\t\t\tHenyeyGreenstein(-0.2 * c, mu), HenyeyGreenstein(0.8 * c, mu), 0.3);\n\t\tc *= phaseAttenuation;\n\t}\n\n\treturn phases;\n}\n\nfn MultipleOctaveScattering(\n\tctx: CloudsCtx, density: f32, phases: vec4f) -> f32 {\n\tlet attenuation = 0.5;\n\tlet contribution = 0.6;\n\n\tvar a: f32 = 1.0;\n\tvar b: f32 = 1.0;\n\n\tvar luminance: f32 = 0.0;\n\n\tfor (var i: i32 = 0; i < SCATTERING_OCTAVES; i++) {\n\t\tluminance += b * phases[i] * exp(-ctx.sigmaT * density * a);\n\n\t\ta *= attenuation;\n\t\tb *= contribution;\n\t}\n\n\treturn luminance;\n}\n\nfn IntersectCloudLayer(\n\tctx: CloudsCtx, ro: vec3f, rd: vec3f,\n\ttEnter: ptr<function, f32>, tExit: ptr<function, f32>) -> bool {\n\tlet innerRadius = ctx.bottomRadius + ctx.cloudLayerBottom;\n\tlet outerRadius = ctx.bottomRadius + ctx.cloudLayerBottom + ctx.cloudLayerThickness;\n\n\tlet tInnerNear = raySphereIntersect(ro, rd, ctx.earthCenter, innerRadius);\n\tlet tInnerFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, innerRadius);\n\tlet tOuterNear = raySphereIntersect(ro, rd, ctx.earthCenter, outerRadius);\n\tlet tOuterFar = raySphereIntersectFar(ro, rd, ctx.earthCenter, outerRadius);\n\n\tlet distToCenter = length(ro - ctx.earthCenter);\n\n\tif (distToCenter < innerRadius) { // cam below layer\n\t\t*tEnter = tInnerFar;\n\t\t*tExit = tOuterFar;\n\t} else if (distToCenter < outerRadius) { // cam inside layer\n\t\t*tEnter = 0.0;\n\t\tif (tInnerNear > 0.0) {\n\t\t\t*tExit = tInnerNear;\n\t\t} else {\n\t\t\t*tExit = tOuterFar;\n\t\t}\n\t} else { // cam above layer\n\t\tif (tOuterNear < 0.0) {\n\t\t\treturn false;\n\t\t}\n\t\t*tEnter = tOuterNear;\n\t\tif (tInnerNear > 0.0) {\n\t\t\t*tExit = tInnerNear;\n\t\t} else {\n\t\t\t*tExit = tOuterFar;\n\t\t}\n\t}\n\n\tif (*tExit < 0.0 || *tEnter >= *tExit) {\n\t\treturn false;\n\t}\n\n\t*tEnter = max(*tEnter, 0.0);\n\treturn true;\n}\n\nfn ComputeLightVisibility(\n\tctx: CloudsCtx,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tpos: vec3f, lightDir: vec3f, phases: vec4f) -> f32 {\n\tvar tLightEnter: f32;\n\tvar tLightExit: f32;\n\tif (!IntersectCloudLayer(ctx, pos, lightDir, &tLightEnter, &tLightExit)) {\n\t\treturn 0.0;\n\t}\n\n\ttLightExit = min(tLightExit, ctx.cloudLayerThickness * 1.0);\n\n\tlet dt = (tLightExit - tLightEnter) / f32(LIGHT_RAY_STEPS);\n\tlet startPos = pos + lightDir * tLightEnter;\n\tvar d: f32 = 0.0;\n\n\tfor (var i: i32 = 0; i < LIGHT_RAY_STEPS; i++) {\n\t\td += SampleDensity(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap,\n\t\t\tstartPos + lightDir * dt * f32(i));\n\t}\n\td *= dt;\n\n\treturn MultipleOctaveScattering(ctx, d, phases);\n}\n\nfn RaymarchVolumetricCloud(\n\tctx: CloudsCtx, atm: Atm,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler,\n\tirradianceTex: texture_2d<f32>,\n\tbaseNoise: texture_3d<f32>, noiseSamp: sampler,\n\tdetailNoise: texture_3d<f32>,\n\tcurrentWeatherMap: texture_2d<f32>, weatherSamp: sampler,\n\tnextWeatherMap: texture_2d<f32>,\n\tro: vec3f, rd: vec3f) -> vec4f {\n\tvar tEnter: f32;\n\tvar tExit: f32;\n\n\tif (!IntersectCloudLayer(ctx, ro, rd, &tEnter, &tExit)) {\n\t\treturn vec4f(0.0);\n\t}\n\n\ttExit = min(tExit, ctx.maxDistance);\n\tlet span = tExit - tEnter;\n\n\t// The reference always divides the span into CLOUD_RAY_STEPS, so the step\n\t// length swings with the ray's elevation: a near-vertical ray crosses the\n\t// 4 km shell in 25 m steps — 8x finer than the 195 m base-noise texel it is\n\t// sampling, so runs of those samples re-read one texel — while a grazing\n\t// 128 km ray gets 800 m and is the case the step budget is actually FOR. A\n\t// floor on the step length spends the full budget on the grazing rays and\n\t// stops over-marching the steep ones. ctx.minStep = 0 reproduces the\n\t// reference exactly (?dbgskystep=0, and CI pins it via minStepKmOverride);\n\t// see MIN_MARCH_STEP_KM for the measured cost/benefit.\n\tlet refDt = span / f32(CLOUD_RAY_STEPS);\n\tlet dt = max(refDt, ctx.minStep);\n\tlet steps = select(\n\t\tmin(CLOUD_RAY_STEPS, i32(ceil(span / dt))),\n\t\tCLOUD_RAY_STEPS,\n\t\tctx.minStep <= 0.0);\n\n\tvar t = max(tEnter, 0.0);\n\tvar pos = ro + rd * t;\n\n\tvar radiance = vec3f(0.0);\n\tvar totalTransmittance = vec3f(1.0);\n\n\tlet mu = dot(rd, ctx.sunDir);\n\tlet horizDist = length(pos - ro);\n\t// Loop-invariant for the whole march (see OctaveScatteringPhases).\n\tlet phases = OctaveScatteringPhases(mu);\n\n\tvar sky_transmittance: vec3f;\n\tvar sunLight: vec3f;\n\tvar skyIrradiance: vec3f;\n\n\tfor (var i: i32 = 0; i < steps; i++) {\n\t\tif (t > tExit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tpos = ro + rd * t;\n\n\t\tif (horizDist * horizDist > ctx.maxDistance * ctx.maxDistance) {\n\t\t\tbreak;\n\t\t}\n\n\t\tlet density = SampleDensity(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap, pos);\n\n\t\tif (density > 0.0) {\n\t\t\t// get lightning — only the sun-ward transmittance and the sky\n\t\t\t// irradiance are read, so both lookups take the halved variants\n\t\t\t// (same values, see GetSkyTransmittance / GetSkyIrradianceLum).\n\t\t\tsky_transmittance = GetSkyTransmittance(\n\t\t\t\tatm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir);\n\t\t\tskyIrradiance = GetSkyIrradianceLum(atm, irradianceTex,\n\t\t\t\tpos - ctx.earthCenter, normalize(pos - ctx.earthCenter), ctx.sunDir);\n\t\t\tsunLight = sky_transmittance * atm.sun_spectral_radiance_to_luminance;\n\t\t\t// night\n\t\t\tskyIrradiance = max(vec3f(10.0), skyIrradiance);\n\t\t\tsunLight = max(vec3f(100.0), sunLight);\n\n\t\t\tlet vis = ComputeLightVisibility(ctx, baseNoise, noiseSamp, detailNoise,\n\t\t\t\tcurrentWeatherMap, weatherSamp, nextWeatherMap, pos, ctx.sunDir,\n\t\t\t\tphases);\n\n\t\t\tlet sampleSigmaS = ctx.sigmaS * density;\n\t\t\tlet sampleSigmaT = max(ctx.sigmaT * density, CLOUD_EPS);\n\n\t\t\tlet powder = exp(-density * sampleSigmaT);\n\t\t\tlet powderEffect = mix(1.0, powder, smoothstepGl(0.5, -0.5, mu));\n\t\t\tvar inscatter = (sunLight * vis + skyIrradiance) * sampleSigmaS;\n\t\t\tinscatter *= powderEffect;\n\n\t\t\tlet transmittance = exp(-sampleSigmaT * dt);\n\n\t\t\t// Energy conserving\n\t\t\tradiance += totalTransmittance * (inscatter - inscatter * transmittance) / sampleSigmaT;\n\t\t\ttotalTransmittance *= transmittance;\n\n\t\t\tif (length(totalTransmittance) <= 0.1) {\n\t\t\t\ttotalTransmittance = vec3f(0.0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tt += dt;\n\t}\n\n\t// Convert transmittance to alpha\n\tlet alpha = 1.0 - dot(totalTransmittance, vec3f(0.2126, 0.7152, 0.0722));\n\n\tlet fog = exp(-horizDist / ctx.fogFactor); // ! hack probably should use bruneton transmittance\n\n\treturn vec4f(radiance, alpha) * fog;\n}\n\n// High-altitude clouds (above the volumetric) 2D\nfn HighAltitudeCloud(\n\tctx: CloudsCtx, atm: Atm,\n\ttransmittanceTex: texture_2d<f32>,\n\tscatteringTex: texture_3d<f32>, scatteringSamp: sampler,\n\thighCloudsMap: texture_2d<f32>, weatherSamp: sampler,\n\tro: vec3f, rd: vec3f) -> vec4f {\n\tif (abs(rd.y) < CLOUD_EPS) {\n\t\treturn vec4f(0.0);\n\t}\n\n\tvar result = vec4f(0.0);\n\n\tlet t = raySphereIntersect(ro, rd, ctx.earthCenter, ctx.bottomRadius + ctx.highCloudsHeight);\n\tif (t < 0.0) {\n\t\treturn result;\n\t}\n\n\tlet pos = ro + rd * t;\n\tlet normal = normalize(pos - ctx.earthCenter);\n\tlet mu = dot(-rd, ctx.sunDir);\n\tlet phase = mix(HenyeyGreenstein(-0.1, mu), HenyeyGreenstein(0.2, mu), 0.2);\n\n\t// Sun-ward: transmittance only (the radiance return was discarded).\n\tlet trans = GetSkyTransmittance(\n\t\tatm, transmittanceTex, pos - ctx.earthCenter, ctx.sunDir);\n\tlet sunLight = trans * atm.sun_spectral_radiance_to_luminance;\n\tvar zenithTrans: vec3f;\n\tlet skyLight = GetSkyRadianceLum(atm, transmittanceTex, scatteringTex, scatteringSamp,\n\t\tpos - ctx.earthCenter, vec3f(0.0, 1.0, 0.0), 0.0, ctx.sunDir, &zenithTrans);\n\n\tlet scatter = sunLight * phase + skyLight;\n\n\t// === Cirrus (R) ===\n\tlet cirrusDensity = triplanarSample(highCloudsMap, weatherSamp,\n\t\tpos + ctx.time * ctx.windSpeed * cirrusSpeedFactor, normal,\n\t\t1.0 / ctx.highCloudsScale).r;\n\n\tif (cirrusDensity > CLOUD_EPS) {\n\t\tlet alpha = cirrusDensity * ctx.cirrusDensity;\n\t\tresult = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha,\n\t\t\tresult.a + (1.0 - result.a) * alpha);\n\t}\n\n\t// === Alto (G) ===\n\tlet altoDensity = triplanarSample(highCloudsMap, weatherSamp,\n\t\tpos + ctx.time * ctx.windSpeed * altoSpeedFactor, normal,\n\t\t1.0 / ctx.highCloudsScale).g;\n\n\tif (altoDensity > CLOUD_EPS) {\n\t\tlet alpha = altoDensity * ctx.altoDensity;\n\t\tresult = vec4f(result.rgb + (1.0 - result.a) * scatter * alpha,\n\t\t\tresult.a + (1.0 - result.a) * alpha);\n\t}\n\n\tlet fog = exp(-length((ro + rd * t) - ro) / ctx.fogFactor);\n\treturn result * fog;\n}\n"),n=ke(`fn cloudsPass(${yp}) -> vec4f {${oc}}`,[i]),l=op,o={...t,irradianceTex:Ea(e.irradiance),baseNoiseTex:Ia(this._baseNoise),noiseSamp:ct(this._baseNoise),detailNoiseTex:Ia(this._detailNoise),weatherCurTex:Ea(this._weatherCur),weatherSamp:ct(this._weatherCur),weatherNextTex:Ea(this._weatherNext),highCloudsTex:Ea(this._highClouds),cloudsParamsA:lr(new _s(l.maxDistance,l.sigmaS,l.sigmaA,l.cloudLayerThickness)),cloudsParamsB:lr(new _s(l.cloudLayerBottom,l.highCloudsHeight,l.highCloudsScale,l.weatherMapScale)),cloudsParamsC:this._uCloudsParamsC,cloudsParamsD:this._uCloudsParamsD},u=new bt;u.name="SplineSkyCloudsPass",u.lights=!1,u.fragmentNode=n(o),this._cloudsQuad=new Ga(u),this._cloudsArgs=o,this._cloudsLib=i}_ensureEnvPass(){if(this._envQuad)return;this._ensurePasses();let e=ke(`fn skyEnvPass(${yp},\n\texposure: f32, gamma: f32, cloudsOn: f32) -> vec4f {${uc}}`,[Me(dc),this._cloudsLib]),t=new bt;t.name="SplineSkyEnvironmentPass",t.lights=!1,t.fragmentNode=e({...this._cloudsArgs,exposure:this._uExposure,gamma:this._uGamma,cloudsOn:this._uEnvCloudsOn}),this._envQuad=new Ga(t)}_ensureBackgroundMesh(e,t){if(this.backgroundMesh)return this.backgroundMesh;let a=new As;a.setAttribute("position",new Cs(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));let r=new bt;r.name="SplineSkyBackground",r.lights=!1,r.depthWrite=!1,r.depthTest=!1,r.colorNode=this._buildComposeNode(e,t);let s=ke("fn skyBackgroundVertex(position: vec3f) -> vec4f {\n\treturn vec4f(position.xy, 0.5, 1.0);\n}");r.vertexNode=s({position:ie});let i=new Ds(a,r);return i.name="SplineSkyBackground",i.frustumCulled=!1,i.renderOrder=-1e9,i.matrixAutoUpdate=!1,i.raycast=()=>{},this.backgroundMesh=i,i}_syncState(e){let t=e.skyState,a=e!==this._lastPage;if(!a&&e.skyStateVersion===this._lastVersion)return;this._lastPage=e,this._lastVersion=e.skyStateVersion;let r=t.weather;if(r!==this._appliedWeather||t.seed!==this._appliedSeed||a){let e=Xc(r,t.seed);if(null===this._appliedWeather||a)this._weatherCur.image.data.set(e),this._weatherNext.image.data.set(e),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendFrom=1,this._blendStart=0,this._presetFrom=r,this._presetTo=r;else{let t=this._weatherCur.image.data,a=this._weatherNext.image.data;t.set(a),a.set(e),this._weatherCur.needsUpdate=!0,this._weatherNext.needsUpdate=!0,this._blendStart=performance.now(),this._blendFrom=0,this._presetFrom=this._presetTo,this._presetTo=r}this._appliedWeather=r,this._appliedSeed=t.seed}this._uExposure.value=5e-4*t.exposure,this._cloudsEnabled=t.clouds}_cornerRay(e,t,a,r){let s=np.set(e,t,-1,1).applyMatrix4(a.projectionMatrixInverse);return this._eyeRayToWorld(s.x,s.y,a,r)}_eyeRayToWorld(e,t,a,r){let s=lp.set(e,t,-1,0).applyMatrix4(a.matrixWorld);return r.set(s.x,s.y,s.z).normalize()}_updateCornerRays(e,t){let a=e;if(-1!==e.projectionMatrix.elements[11]){let r="number"==typeof a.fov&&a.fov>0?a.fov:45,s=Math.tan(r*Math.PI/360),i=s*t;return this._eyeRayToWorld(-i,-s,e,this._uRay00.value),this._eyeRayToWorld(i,-s,e,this._uRay10.value),this._eyeRayToWorld(-i,s,e,this._uRay01.value),void this._eyeRayToWorld(i,s,e,this._uRay11.value)}this._cornerRay(-1,-1,e,this._uRay00.value),this._cornerRay(1,-1,e,this._uRay10.value),this._cornerRay(-1,1,e,this._uRay01.value),this._cornerRay(1,1,e,this._uRay11.value)}update(e,t){if("hdri"===e.skyState?.mode)return void this._updateHdri(e,t,e.skyState);!0===this._hdri?.active&&this._hdri.detach(),this._ensurePasses(),this._syncState(e);let a=e.skyState,r=performance.now(),s=null===this._lastFrameTime?0:(r-this._lastFrameTime)/1e3;this._lastFrameTime=r;let i=a.animateWind&&!0===this._renderer.skyAnimationAllowed&&null===this.fixedTimeSeconds;i&&(this._windOffsetKm+=a.windSpeed/1e3*300*Math.min(s,.25));let n=this.fixedTimeSeconds??3600*a.timeOfDay,l=Ac(n);this._uSunDir.value.set(l[0],l[1],l[2]);let o=1;this._blendStart>0&&(o=Math.min(1,this._blendFrom+(r-this._blendStart)/1e3/2),o>=1&&(this._blendStart=0));let u=this.minStepKmOverride??mp??.05;null!==this.fixedTimeSeconds?this._uCloudsParamsD.value.set(a.windSpeed/1e3,o,this.fixedTimeSeconds,u):this._uCloudsParamsD.value.set(1,o,this._windOffsetKm,u);let d=this.highCloudDensityOverride,h=hp[this._presetFrom],m=hp[this._presetTo];this._uCloudsParamsC.value.set(op.baseNoiseScale,op.detailNoiseScale,null!==d?d[0]:h[0]+(m[0]-h[0])*o,null!==d?d[1]:h[1]+(m[1]-h[1])*o),this._animating=this._cloudsEnabled&&(this._blendStart>0||i&&0!==a.windSpeed),!0===a.lighting?(this._ensureLightingLuts(),this._updateLighting(e,o,a.exposure,a.lightingIntensity??1)):null!==this._lightingPage&&this._teardownLighting();let c=this._renderer.getDrawingBufferSize(ip);this._updateCornerRays(t,c.y>0?c.x/c.y:1);let p=Math.max(1,Math.round(this.fixedSkySize?.x??c.x)),g=Math.max(1,Math.round(this.fixedSkySize?.y??c.y)),f=Math.max(1,Math.round(this.fixedCloudsSize?.x??c.x/4)),_=Math.max(1,Math.round(this.fixedCloudsSize?.y??c.y/4)),y=(e,t,a,r)=>{if(e&&e.width===t&&e.height===a)return e;void 0!==this._renderer.retireRenderTarget?this._renderer.retireRenderTarget(e):e?.dispose();let s=new ys(t,a,{type:ts,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(sp),t=b.getClearAlpha();b.setClearColor(0,0),b.clear(!0,!1,!1),b.setClearColor(e,t),this._cloudsTargetCleared=!0}if(!1!==this._renderer.skyEnvironmentNeeded){if(this._ensureEnvPass(),null===this._envTarget){this._envTarget=new ys(256,128,{type:ts,depthBuffer:!1});let e=this._envTarget.texture;e.name="sky-environment",e.generateMipmaps=!0,e.minFilter=Js,e.magFilter=Qs,e.wrapS=Ls}this._uEnvCloudsOn.value=this._cloudsEnabled?1:0;let e=i?.25*Math.round(w.z/.25):w.z,t=this._blendStart>0?Math.floor(16*o)/16:o,a=`${n}|${this._uExposure.value}|${this._uGamma.value}|${this._cloudsEnabled}|${w.x},${t},${e},${w.w}|${this._presetFrom}>${this._presetTo}|${d??""}|${this._appliedWeather}|${this._appliedSeed}|${this._highCloudsReady}`;a!==this._lastEnvKey?(this._lastEnvKey=a,b.setRenderTarget(this._envTarget),this._envQuad.render(this._renderer),this._requestEnvPmrem(r)):this._pmremPending&&this._requestEnvPmrem(r)}b.setRenderTarget(T);let E=this._ensureBackgroundMesh(this._skyTarget.texture,this._cloudsTarget.texture);(x!==this._skyTarget||v!==this._cloudsTarget)&&this._rebindComposeTextures(),E.parent!==e&&(E.parent?.remove(E),e.add(E))}_updateHdri(e,t,a){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._animating=!1;let r=this._renderer.getDrawingBufferSize(ip);this._updateCornerRays(t,r.y>0?r.x/r.y:1),null===this._hdri&&(this._hdri=new rp(this._renderer,{ray00:this._uRay00,ray10:this._uRay10,ray01:this._uRay01,ray11:this._uRay11}));let s=e.skyHdriHolder,i=null!==s&&s.loaded?s.getTexture(1001):null;this._iblHdriTexture=i,this._iblRotationY=a.hdri?.rotation??0;let n=t.fov,l="number"==typeof n&&n>0?n:45,o=r.y/(this._renderer.getPixelRatio?.()??1),u=l*Math.PI/180/Math.max(1,o),d=(a.hdri?.blur??0)*u;this._hdri.update(e,i,a.hdri?.rotation,d,!1!==a.hdri?.showBackground);let h=!0===a.lighting&&null!==i?this._hdri.lightingInfo(i):null;null!==h?this._updateHdriLighting(e,h,a.hdri?.rotation??0,a.lightingIntensity??1):null!==this._lightingPage&&this._teardownLighting()}_updateHdriLighting(e,t,a,r){null!==this._lightingPage&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let s=e=>{let t=Math.max(e[0],e[1],e[2],1e-6);return[e[0]/t,e[1]/t,e[2]/t]},i=this._sunLight;null===i&&(i=new ss(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 ki(16777215,8947848,0),m.name="SplineSkyAmbient",m.layers.enable(3),m.raycast=()=>{},this._skyHemi=m),m.parent!==e&&e.add(m);let c=s(t.skyColor);m.color.setRGB(c[0],c[1],c[2]);let p=s(t.groundColor),g=t.skyLum>1e-6?Math.min(t.groundLum/t.skyLum,1):cp;m.groundColor.setRGB(p[0]*g,p[1]*g,p[2]*g),m.intensity=.75*Math.PI*(t.skyLum/.5)*r}_ensureLightingLuts(){if(this._lightingLutsRequested||null===this._luts)return;this._lightingLutsRequested=!0;let e=this._luts;Promise.all([Qm(this._renderer,e.transmittance,256,64,1,!1),Qm(this._renderer,e.irradiance,64,16,1,!1)]).then(([e,t])=>{this._lightingLuts={transmittance:e,irradiance:t};let a=this._atmosphereUniforms,r=a.bottomRadius+.1,s=Ac(43200)[1],i=ac(a,this._lightingLuts,r,s);this._noonSunRgb=[i[0],i[1],i[2]],this._noonSunLum=tc(i),this._noonSkyLum=tc(rc(a,this._lightingLuts,r,s))},()=>{})}_updateLighting(e,t,a,r){let s=this._lightingLuts,i=this._noonSunRgb;if(null===s||null===i||this._noonSunLum<=0||this._noonSkyLum<=0)return;null!==this._lightingPage&&this._lightingPage!==e&&this._teardownLighting(),this._lightingPage=e;let n=this._atmosphereUniforms,l=n.bottomRadius+.1,o=this._uSunDir.value,u=o.y,d=e=>e[this._presetFrom]+(e[this._presetTo]-e[this._presetFrom])*t,h=(e,t)=>{let a=[e[0]/Math.max(i[0],1e-12),e[1]/Math.max(i[1],1e-12),e[2]/Math.max(i[2],1e-12)],r=tc(a),s=[r+(a[0]-r)*t,r+(a[1]-r)*t,r+(a[2]-r)*t],n=Math.max(s[0],s[1],s[2],1e-12);return[s[0]/n,s[1]/n,s[2]/n]},m=d(pp),c=ac(n,s,l,u),p=tc(c),g=this._sunLight;if(null===g&&(g=new ss(16777215,0),g.name="SplineSkySun",g.layers.enable(3),g.raycast=()=>{},this._sunLight=g),g.parent!==e&&e.add(g),g.userData.splineDiffuseOnly=!1,g.position.set(o.x,o.y,o.z).multiplyScalar(1e5),p>0){let e=h(c,m);g.color.setRGB(e[0],e[1],e[2])}g.intensity=1*Math.PI*(p/this._noonSunLum)*d(gp)*a*r;let f=e.ambientLight;null!=f&&(null!==f.parent&&f.removeFromParent(),this._userAmbientSuppressed=!0);let _=this._skyHemi;null===_&&(_=new ki(16777215,8947848,0),_.name="SplineSkyAmbient",_.layers.enable(3),_.raycast=()=>{},this._skyHemi=_),_.parent!==e&&e.add(_);let y=rc(n,s,l,u),x=tc(y),[v,b,T]=h(y,m);_.color.setRGB(v,b,T),_.groundColor.setRGB(v*cp,b*cp,T*cp),_.intensity=.75*Math.PI*(x/this._noonSkyLum)*d(fp)*a*r}_teardownLighting(){let e=this._lightingPage;if(this._lightingPage=null,this._sunLight?.parent?.remove(this._sunLight),this._skyHemi?.parent?.remove(this._skyHemi),this._userAmbientSuppressed){this._userAmbientSuppressed=!1;let t=e?.ambientLight,a=e?.data?.ambient?.enabled;t&&!1!==a&&e.add(t)}}_buildComposeNode(e,t){return ke("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}",[Me(dc)])({uv:vt,skyTex:Ea(e),skySamp:ct(e),cloudsTex:Ea(t),exposure:this._uExposure,gamma:this._uGamma})}_rebindComposeTextures(){let e=this.backgroundMesh?.material;!e||!this._skyTarget||!this._cloudsTarget||(e.colorNode=this._buildComposeNode(this._skyTarget.texture,this._cloudsTarget.texture),e.needsUpdate=!0)}detach(){this.backgroundMesh?.parent?.remove(this.backgroundMesh),this._hdri?.detach(),this._teardownLighting()}dispose(){this.detach(),this._hdri?.dispose(),this._hdri=null,this._sunLight?.dispose(),this._sunLight=null,this._skyHemi?.dispose(),this._skyHemi=null,this._luts?.dispose(),this._luts=null,this._baseNoise?.dispose(),this._detailNoise?.dispose(),this._weatherCur.dispose(),this._weatherNext.dispose(),this._highClouds.dispose(),this._skyTarget?.dispose(),this._cloudsTarget?.dispose(),this._envTarget?.dispose(),this._envTarget=null,this._lastEnvKey=null,this._envQuad?.material?.dispose(),this.backgroundMesh?.material?.dispose(),this.backgroundMesh?.geometry.dispose(),this.backgroundMesh=null,this._skyQuad=null,this._cloudsQuad=null,this._envQuad=null,this._cloudsArgs=null,this._cloudsLib=null,this._lastSkyPassKey=null,this._lastCloudsPassKey=null}};Rl=e=>new xp(e);var vp=e=>e,bp=$("vec4","vSplatColor"),Tp=$("vec2","vSplatPosition");function wp(e,t,a){return e.element(t).element(a)}var Sp=class extends bt{constructor(e){super(),this.uniformsNeedUpdate=!1,this._covariancesTex=Ea(new ps),this._centersColorsTex=Ea(new ps),this._meshMatrixWorldsTex=Ea(new ps),this._focal=lr(new os),this._viewport=lr(new os),this._basisViewport=lr(new os),this._covariancesTextureSize=lr(new os(1024,1024)),this._centersColorsTextureSize=lr(new os(1024,1024)),this._orthoZoom=lr(-1),this._velocityMRT=ba({velocity:ne(0)}),this.name="WebGPUSplatMaterial",this.transparent=!0,this.depthTest=!0,this.depthWrite=!1,this.side=Is,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 Ss)},this._buildGraph(e)}_buildGraph(e){let t=this._covariancesTex,a=this._centersColorsTex,r=this._meshMatrixWorldsTex,s=this._focal,i=this._basisViewport,n=this._covariancesTextureSize,l=this._centersColorsTextureSize,o=this._orthoZoom,u=re(()=>{let u=it("splatIndex","uint"),d=(e,t,a)=>{let r=u.mul(rr(e)).add(rr(t)).toFloat().div(a.x);return Y(B(r),R(r).div(a.y))},h=a.sample(d(1,0,l)).toVar(),m=ot(W(h.y,h.z,h.w),"vec3").toVar(),c=h.x;bp.assign(ne(c.bitAnd(rr(255)).toFloat(),c.shiftRight(rr(8)).bitAnd(rr(255)).toFloat(),c.shiftRight(rr(16)).bitAnd(rr(255)).toFloat(),c.shiftRight(rr(24)).bitAnd(rr(255)).toFloat()).mul(1/255));let p=it("position","vec3").xy.mul(2).toVar();Tp.assign(p);let g=ir(0);for(let t=1;t<e.length-1;t++)g=vp(g.add(u.greaterThanEqual(rr(e[t])).select(ir(1),ir(0))));let f=g.mul(4).toVar(),_=e=>r.sample(Y(f.add(e).div(1024),0)),y=xt(_(0),_(1),_(2),_(3)),x=kt.mul(y).toVar(),v=x.mul(ne(m,1)).toVar(),b=Tt.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,k=S.x,A=S.y,P=gt(V,M,C,M,z,k,C,k,A),E=ir(1).div(v.z.mul(v.z)).toVar(),N=x,L=gt(N.element(0).xyz,N.element(1).xyz,N.element(2).xyz).transpose(),I=gt(s.x.div(v.z),0,s.x.mul(v.x).negate().mul(E),0,s.y.div(v.z),s.y.mul(v.y).negate().mul(E),0,0,0),F=e=>{let t=e.transpose().mul(P).mul(e);return ne(wp(t,0,0).add(.3),wp(t,0,1),wp(t,1,1).add(.3),0).xyz},D=o.greaterThan(0),U=D.select(F(L),F(L.mul(I))).toVar(),O=b.xyz.div(b.w).toVar(),G=U.x,q=U.z,H=U.y,j=G.mul(q).sub(H.mul(H)),K=G.add(q),$=K.mul(.5),X=na(At(K.mul(K).div(4).sub(j),0)).toVar(),Q=$.add(X).toVar(),Z=At($.sub(X),0).toVar(),J=Ya(Y(H,Q.sub(G))).toVar(),ee=Y(J.y,J.x.negate()).toVar(),te=J.mul(Dt(na(Q.mul(2)),1024)).toVar(),ae=ee.mul(Dt(na(Z.mul(2)),1024)).toVar(),re=te.mul(p.x).add(ae.mul(p.y)).mul(i).toVar();return re.assign(D.select(re.mul(o),re)),ne(O.xy.add(re),O.z,1)}),d=re(()=>{let e=Tp.dot(Tp).negate().toVar();e.lessThan(-4).discard();let t=Ka(e).mul(bp.w);return ne(bp.xyz,t)});this.vertexNode=u(),this.colorNode=d(),this.needsUpdate=!0}setup(e){let t=e.renderer.getMRT?.();this.mrtNode=t?this._velocityMRT:null,super.setup(e)}nodeMaterialDispose(){this.dispose()}};function Vp(){let e=lr(1),t=lr(.6),a=lr(1),r=lr(1),s=lr(new Ss(16603997)),i=lr(new Ss(2857471)),n=lr(new Ss(3728051)),l=lr(9),o=lr(new os),u=new bt;u.name="EditorGridNodeMaterial",u.transparent=!0,u.lights=!1,u.fog=!1;let d=St(l.equal(10),n,i),h=St(l.equal(8),n,s),m=St(ue.x.equal(o.x),d,St(ue.z.equal(o.y),h,ae(.5)));u.colorNode=m;let c=_e.z.negate(),p=$t(a.mul(500),a.mul(4500),c).mul(r);u.opacityNode=qt(e.mul(t),ir(0),p);let g={get value(){return 0===r.value?1/0:a.value},set value(e){Number.isFinite(e)?(a.value=e,r.value=1):r.value=0}};return u.uniforms={angleFadeFactor:e,opacityFactor:t,gridScale:g,red:s,blue:i,green:n,mode:l,offset:o},u}function Mp(){return typeof navigator<"u"&&void 0!==navigator.gpu}vr({createSplatMaterial:e=>new Sp(e)}),kr({createRootMaterial:(e,t)=>new nh(e,t),createSharedMaterial:(e,t,a)=>new lh(e,t,a)}),Pr({tsl:er,NodeMaterial:bt,MeshBasicNodeMaterial:Ht,MeshStandardNodeMaterial:ga,MeshPhysicalNodeMaterial:xa,MeshPhongNodeMaterial:ra,MeshLambertNodeMaterial:Jt,MeshToonNodeMaterial:wa,MeshMatcapNodeMaterial:Ca,MeshNormalNodeMaterial:It,SpriteNodeMaterial:Aa,PointsNodeMaterial:Na,LineBasicNodeMaterial:Vt,LineDashedNodeMaterial:zt,Color:Ss,Vector2:os,Vector3:ds,Vector4:_s,Matrix3:hs,Matrix4:Ts,Texture:ps,CanvasTexture:rs,DataTexture:Hs,VideoTexture:ri,FrontSide:Ns,BackSide:Bs,DoubleSide:Is,NormalBlending:qs,AdditiveBlending:js,MultiplyBlending:Xs,SubtractiveBlending:Ks,RepeatWrapping:Ls,ClampToEdgeWrapping:Fs,MirroredRepeatWrapping:Os,NearestFilter:Ws,LinearFilter:Qs,LinearMipmapLinearFilter:Js,SRGBColorSpace:cs,LinearSRGBColorSpace:fs}),Ar(()=>{let e=new Fa;return e.depthWrite=!1,e.opacity=.5,e});var Cp=["maxUniformBuffersPerShaderStage","maxSampledTexturesPerShaderStage","maxSamplersPerShaderStage","maxStorageBuffersPerShaderStage","maxStorageBufferBindingSize","maxBufferSize","maxVertexBuffers","maxVertexAttributes","maxUniformBufferBindingSize","maxColorAttachmentBytesPerSample"];async function Rp(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 Cp){let t=r[e];"number"==typeof t&&Number.isFinite(t)&&(a[e]=t)}return a}catch{return}}(e),r=new wo({...e,requiredLimits:a});await r.init();try{let e=new URLSearchParams(window.location.search);if("off"===e.get("taa")&&(r.temporalAAEnabled=!1),"1"===e.get("nojit")){let e=r.taaHistory;e.beginJitter=()=>{},e.endJitter=()=>{}}"1"===e.get("dbghdt")&&(r.hdTransmission=!0)}catch{}return r}export{Do as SPE_BLENDING_MULTIPLY,Fo as SPE_BLENDING_NORMAL,Oo as SPE_BLENDING_OVERLAY,Uo as SPE_BLENDING_SCREEN,Bo as TSLLayerParams,nh as TSLRootMaterial,lh as TSLSharedMaterial,Wi as WebGPUPostPipeline,wo as WebGPUSplineRenderer,Vp as createEditorGridNodeMaterial,Rp as createWebGPUSplineRenderer,$o as getTSLLayerBuilder,Xo as hasTSLLayerBuilder,Mp as isWebGPUSupported,Eo as ownUniformValue,Ko as registerTSLLayer,No as setRenderUniformValue,Io as simpleCalpha,qo as speBlend,zo as speObjectNormal,Ro as speObjectPosition,Po as splitUniformValueSlots,Lo as standardCalpha,jo as unsupportedTSLLayerBuilder,w as webgpuGlobals};