framefields 2.13.0 → 2.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. package/README.md +9 -4
  2. package/dist/audio/index.d.mts +3 -3
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-CHV33Od9.d.mts → audio-C4B9p_yq.d.mts} +2 -2
  5. package/dist/{audio-CHV33Od9.d.mts.map → audio-C4B9p_yq.d.mts.map} +1 -1
  6. package/dist/{audio-DHzLQ_RG.mjs → audio-DIvi6hTD.mjs} +3 -3
  7. package/dist/{audio-DHzLQ_RG.mjs.map → audio-DIvi6hTD.mjs.map} +1 -1
  8. package/dist/cli/check-worker.mjs +43 -43
  9. package/dist/cloud/index.d.mts.map +1 -1
  10. package/dist/components/index.d.mts +7 -7
  11. package/dist/components/index.mjs +42 -42
  12. package/dist/{dist-CUNvNDS3.mjs → dist-CCrYOkcc.mjs} +18 -4
  13. package/dist/dist-CCrYOkcc.mjs.map +1 -0
  14. package/dist/{dist-D3BeAZ7X.mjs → dist-DtPPPsZV.mjs} +314 -137
  15. package/dist/dist-DtPPPsZV.mjs.map +1 -0
  16. package/dist/effects/index.d.mts +3 -3
  17. package/dist/effects/index.mjs +34 -34
  18. package/dist/{effects-BiDgCK1L.mjs → effects-B-L3rLs6.mjs} +2 -2
  19. package/dist/{effects-BiDgCK1L.mjs.map → effects-B-L3rLs6.mjs.map} +1 -1
  20. package/dist/fonts/index.mjs +2 -2
  21. package/dist/{fonts-DeDPWdvJ.mjs → fonts-k5ll8NTE.mjs} +2 -2
  22. package/dist/{fonts-DeDPWdvJ.mjs.map → fonts-k5ll8NTE.mjs.map} +1 -1
  23. package/dist/{gpu-CWjgql4C.mjs → gpu-D2HT3KcE.mjs} +2 -2
  24. package/dist/{gpu-CWjgql4C.mjs.map → gpu-D2HT3KcE.mjs.map} +1 -1
  25. package/dist/{index-D68eGFNE.d.mts → index-B08eSpaI.d.mts} +2 -2
  26. package/dist/{index-D68eGFNE.d.mts.map → index-B08eSpaI.d.mts.map} +1 -1
  27. package/dist/index-BFTtXosj.d.mts.map +1 -1
  28. package/dist/{index-YB9j9KUx.d.mts → index-BGlaws7-.d.mts} +2 -2
  29. package/dist/{index-YB9j9KUx.d.mts.map → index-BGlaws7-.d.mts.map} +1 -1
  30. package/dist/{index-Dibc_xpC.d.mts → index-ByhlTwxh.d.mts} +3 -3
  31. package/dist/{index-Dibc_xpC.d.mts.map → index-ByhlTwxh.d.mts.map} +1 -1
  32. package/dist/{index-X2u96TEo.d.mts → index-C2yaponf.d.mts} +2 -3
  33. package/dist/index-C2yaponf.d.mts.map +1 -0
  34. package/dist/{index-E2IXX0Cz.d.mts → index-CtKUQ2VG.d.mts} +4 -4
  35. package/dist/{index-E2IXX0Cz.d.mts.map → index-CtKUQ2VG.d.mts.map} +1 -1
  36. package/dist/index.d.mts +7 -7
  37. package/dist/index.mjs +49 -49
  38. package/dist/preview/index.d.mts +1 -1
  39. package/dist/preview/index.mjs +10 -10
  40. package/dist/preview-engine/audio.mjs +1 -1
  41. package/dist/preview-engine/{chunk-IEEV5RB3.mjs → chunk-3C2XT64C.mjs} +1 -1
  42. package/dist/preview-engine/chunk-52X7SURQ.mjs +494 -0
  43. package/dist/preview-engine/{chunk-77WWW75O.mjs → chunk-5ZS46EFB.mjs} +1 -1
  44. package/dist/preview-engine/{chunk-4P3MMJWD.mjs → chunk-FZ4RD7HV.mjs} +1 -1
  45. package/dist/preview-engine/{chunk-UFPA36D2.mjs → chunk-N3XTDAL6.mjs} +18 -18
  46. package/dist/preview-engine/chunk-OBIJIQCZ.mjs +1 -0
  47. package/dist/preview-engine/{chunk-SMHEMYCV.mjs → chunk-UBY2UYEL.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-XYCR3STG.mjs → chunk-XCPRRMMW.mjs} +31 -31
  49. package/dist/preview-engine/components.mjs +1 -1
  50. package/dist/preview-engine/effects.mjs +1 -1
  51. package/dist/preview-engine/framefields.mjs +1 -1
  52. package/dist/preview-engine/player.mjs +1 -1
  53. package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +228 -0
  54. package/dist/preview-engine/signals.mjs +1 -1
  55. package/dist/{preview-PDz7o2xg.mjs → preview-lHH8Tv4j.mjs} +3 -3
  56. package/dist/{preview-PDz7o2xg.mjs.map → preview-lHH8Tv4j.mjs.map} +1 -1
  57. package/dist/{program-Bn6ko_I4.mjs → program-BfiB9ttP.mjs} +15 -2
  58. package/dist/program-BfiB9ttP.mjs.map +1 -0
  59. package/dist/renderer/index.d.mts +1 -1
  60. package/dist/renderer/index.mjs +2 -2
  61. package/dist/renderer-0rLmztAv.mjs +5 -0
  62. package/dist/{renderer-BjgFpwVK.mjs → renderer-4nsuReW2.mjs} +3 -3
  63. package/dist/{renderer-BjgFpwVK.mjs.map → renderer-4nsuReW2.mjs.map} +1 -1
  64. package/dist/{renderer-DJPZs_zV.mjs → renderer-7xQmXXMH.mjs} +3 -3
  65. package/dist/{renderer-DJPZs_zV.mjs.map → renderer-7xQmXXMH.mjs.map} +1 -1
  66. package/dist/renderer-B0pjOXFY.mjs +5 -0
  67. package/dist/{renderer-C_1eqfI0.mjs → renderer-B10HDC13.mjs} +3 -3
  68. package/dist/{renderer-C_1eqfI0.mjs.map → renderer-B10HDC13.mjs.map} +1 -1
  69. package/dist/{renderer-DRal7Goa.mjs → renderer-B2IUPjhw.mjs} +3 -3
  70. package/dist/{renderer-DRal7Goa.mjs.map → renderer-B2IUPjhw.mjs.map} +1 -1
  71. package/dist/{renderer-Br8km655.mjs → renderer-B3_GddgJ.mjs} +2 -2
  72. package/dist/{renderer-Br8km655.mjs.map → renderer-B3_GddgJ.mjs.map} +1 -1
  73. package/dist/{renderer-DOZPZTxe.mjs → renderer-B3un4Pdi.mjs} +3 -3
  74. package/dist/{renderer-DOZPZTxe.mjs.map → renderer-B3un4Pdi.mjs.map} +1 -1
  75. package/dist/{renderer-Dp5ChuOs.mjs → renderer-B6bK9rXm.mjs} +2 -2
  76. package/dist/{renderer-Dp5ChuOs.mjs.map → renderer-B6bK9rXm.mjs.map} +1 -1
  77. package/dist/renderer-B7J13reL.mjs +5 -0
  78. package/dist/{renderer-Nnu32rqg.mjs → renderer-BEhZiOT4.mjs} +2 -2
  79. package/dist/{renderer-Nnu32rqg.mjs.map → renderer-BEhZiOT4.mjs.map} +1 -1
  80. package/dist/{renderer-C7m7Yxgc.mjs → renderer-BEuXJY-C.mjs} +3 -3
  81. package/dist/{renderer-C7m7Yxgc.mjs.map → renderer-BEuXJY-C.mjs.map} +1 -1
  82. package/dist/{renderer-D-fzEZfX.mjs → renderer-BGchUBW_.mjs} +2 -2
  83. package/dist/{renderer-D-fzEZfX.mjs.map → renderer-BGchUBW_.mjs.map} +1 -1
  84. package/dist/{renderer--Q0pM9Vh.mjs → renderer-BIKkxw_Z.mjs} +3 -3
  85. package/dist/{renderer--Q0pM9Vh.mjs.map → renderer-BIKkxw_Z.mjs.map} +1 -1
  86. package/dist/{renderer-Dz6P-rPI.mjs → renderer-BM19iK8v.mjs} +2 -2
  87. package/dist/{renderer-Dz6P-rPI.mjs.map → renderer-BM19iK8v.mjs.map} +1 -1
  88. package/dist/{renderer-CE4535aW.mjs → renderer-BOlHW3Mi.mjs} +2 -2
  89. package/dist/{renderer-CE4535aW.mjs.map → renderer-BOlHW3Mi.mjs.map} +1 -1
  90. package/dist/renderer-BPGIKGgl.mjs +5 -0
  91. package/dist/{renderer-C9dqx3U7.mjs → renderer-BTwuM9u-.mjs} +3 -3
  92. package/dist/{renderer-C9dqx3U7.mjs.map → renderer-BTwuM9u-.mjs.map} +1 -1
  93. package/dist/{renderer-BqUAyzCZ.mjs → renderer-BZMh2io2.mjs} +2 -2
  94. package/dist/{renderer-BqUAyzCZ.mjs.map → renderer-BZMh2io2.mjs.map} +1 -1
  95. package/dist/{renderer-BZgJj8Cl.mjs → renderer-BZX932Lj.mjs} +2 -2
  96. package/dist/{renderer-BZgJj8Cl.mjs.map → renderer-BZX932Lj.mjs.map} +1 -1
  97. package/dist/{renderer-BgjPbgbn.mjs → renderer-BhcTYhaP.mjs} +3 -3
  98. package/dist/{renderer-BgjPbgbn.mjs.map → renderer-BhcTYhaP.mjs.map} +1 -1
  99. package/dist/{renderer-CyUiXLRa.mjs → renderer-BmyFfvVA.mjs} +3 -3
  100. package/dist/{renderer-CyUiXLRa.mjs.map → renderer-BmyFfvVA.mjs.map} +1 -1
  101. package/dist/{renderer-opVuiAQR.mjs → renderer-BrEeUw7T.mjs} +2 -2
  102. package/dist/{renderer-opVuiAQR.mjs.map → renderer-BrEeUw7T.mjs.map} +1 -1
  103. package/dist/{renderer-CMnlgAGs.mjs → renderer-BsrKj6Td.mjs} +2 -2
  104. package/dist/{renderer-CMnlgAGs.mjs.map → renderer-BsrKj6Td.mjs.map} +1 -1
  105. package/dist/renderer-Bv-Artj1.mjs +5 -0
  106. package/dist/{renderer-BO_wuUKA.mjs → renderer-BvBqTAtk.mjs} +3 -3
  107. package/dist/{renderer-BO_wuUKA.mjs.map → renderer-BvBqTAtk.mjs.map} +1 -1
  108. package/dist/renderer-BvLjbhcL.mjs +5 -0
  109. package/dist/{renderer-D8gN7aqk.mjs → renderer-Bw-_GZVw.mjs} +3 -3
  110. package/dist/{renderer-D8gN7aqk.mjs.map → renderer-Bw-_GZVw.mjs.map} +1 -1
  111. package/dist/{renderer-LXhEPCmy.mjs → renderer-Bw0O--gW.mjs} +3 -3
  112. package/dist/{renderer-LXhEPCmy.mjs.map → renderer-Bw0O--gW.mjs.map} +1 -1
  113. package/dist/renderer-By6awWaf.mjs +5 -0
  114. package/dist/renderer-C0rvsz7m.mjs +5 -0
  115. package/dist/{renderer-SJyp9-62.mjs → renderer-C4hd6Cqi.mjs} +2 -2
  116. package/dist/{renderer-SJyp9-62.mjs.map → renderer-C4hd6Cqi.mjs.map} +1 -1
  117. package/dist/{renderer-CnL8Cmmr.mjs → renderer-C64_B8It.mjs} +2 -2
  118. package/dist/{renderer-FPiLBwj5.mjs → renderer-C98XwEIr.mjs} +2 -2
  119. package/dist/{renderer-FPiLBwj5.mjs.map → renderer-C98XwEIr.mjs.map} +1 -1
  120. package/dist/{renderer-CL-vyXgX.mjs → renderer-CC22Djgi.mjs} +3 -3
  121. package/dist/{renderer-CL-vyXgX.mjs.map → renderer-CC22Djgi.mjs.map} +1 -1
  122. package/dist/renderer-CDgud_HB.mjs +5 -0
  123. package/dist/renderer-CDiRF3bG.mjs +6 -0
  124. package/dist/{renderer-CwlY8Tb-.mjs → renderer-CHCRcCKw.mjs} +2 -2
  125. package/dist/{renderer-CwlY8Tb-.mjs.map → renderer-CHCRcCKw.mjs.map} +1 -1
  126. package/dist/renderer-CIIEQd4B.mjs +5 -0
  127. package/dist/renderer-CJblwOA9.mjs +5 -0
  128. package/dist/renderer-CNMOXtXE.mjs +5 -0
  129. package/dist/{renderer-S9tVGneU.mjs → renderer-CO4NGvAh.mjs} +69 -69
  130. package/dist/{renderer-S9tVGneU.mjs.map → renderer-CO4NGvAh.mjs.map} +1 -1
  131. package/dist/{renderer-CxSFvKd1.mjs → renderer-CO9vE3sd.mjs} +2 -2
  132. package/dist/{renderer-CxSFvKd1.mjs.map → renderer-CO9vE3sd.mjs.map} +1 -1
  133. package/dist/renderer-COeSeNGg.mjs +5 -0
  134. package/dist/{renderer-NBMmvqWl.mjs → renderer-CQ4h8n7p.mjs} +3 -3
  135. package/dist/{renderer-NBMmvqWl.mjs.map → renderer-CQ4h8n7p.mjs.map} +1 -1
  136. package/dist/{renderer-BsMZ5Iaq.mjs → renderer-CRhEGqW4.mjs} +3 -3
  137. package/dist/{renderer-BsMZ5Iaq.mjs.map → renderer-CRhEGqW4.mjs.map} +1 -1
  138. package/dist/{renderer-RzkU_O1i.mjs → renderer-CSu_vYPn.mjs} +3 -3
  139. package/dist/{renderer-RzkU_O1i.mjs.map → renderer-CSu_vYPn.mjs.map} +1 -1
  140. package/dist/{renderer-BCTUqJG7.mjs → renderer-CU6WT5jW.mjs} +3 -3
  141. package/dist/{renderer-BCTUqJG7.mjs.map → renderer-CU6WT5jW.mjs.map} +1 -1
  142. package/dist/renderer-CUfElmtZ.mjs +5 -0
  143. package/dist/{renderer-Cp_HOmp7.mjs → renderer-CXrnzihz.mjs} +3 -3
  144. package/dist/{renderer-Cp_HOmp7.mjs.map → renderer-CXrnzihz.mjs.map} +1 -1
  145. package/dist/renderer-CYh2lFoJ.mjs +5 -0
  146. package/dist/renderer-CYtVZYMH.mjs +5 -0
  147. package/dist/{renderer-C-GTxnfv.mjs → renderer-CdXBRdFf.mjs} +2 -2
  148. package/dist/{renderer-C-GTxnfv.mjs.map → renderer-CdXBRdFf.mjs.map} +1 -1
  149. package/dist/{renderer-puQhVfDS.mjs → renderer-Cfx_FCSf.mjs} +3 -3
  150. package/dist/{renderer-puQhVfDS.mjs.map → renderer-Cfx_FCSf.mjs.map} +1 -1
  151. package/dist/renderer-CjxZlkjb.mjs +5 -0
  152. package/dist/{renderer-DGb_wgTW.mjs → renderer-CkTehyRX.mjs} +3 -3
  153. package/dist/{renderer-DGb_wgTW.mjs.map → renderer-CkTehyRX.mjs.map} +1 -1
  154. package/dist/{renderer-CgK7Q1G8.mjs → renderer-CldjJmRR.mjs} +2 -2
  155. package/dist/{renderer-BlZgyBSo.mjs → renderer-CoC64eam.mjs} +3 -3
  156. package/dist/{renderer-BlZgyBSo.mjs.map → renderer-CoC64eam.mjs.map} +1 -1
  157. package/dist/renderer-Cpd6TvTC.mjs +5 -0
  158. package/dist/{renderer-BPOh9x5X.mjs → renderer-Cv9CKKWG.mjs} +2 -2
  159. package/dist/{renderer-BPOh9x5X.mjs.map → renderer-Cv9CKKWG.mjs.map} +1 -1
  160. package/dist/{renderer-Cu3iKMSJ.mjs → renderer-D-mX1EVA.mjs} +3 -3
  161. package/dist/{renderer-Cu3iKMSJ.mjs.map → renderer-D-mX1EVA.mjs.map} +1 -1
  162. package/dist/{renderer-BMpmmYOq.mjs → renderer-D0h1hTOo.mjs} +2 -2
  163. package/dist/{renderer-BMpmmYOq.mjs.map → renderer-D0h1hTOo.mjs.map} +1 -1
  164. package/dist/{renderer-DpZballM.mjs → renderer-D0xM67cK.mjs} +2 -2
  165. package/dist/{renderer-DpZballM.mjs.map → renderer-D0xM67cK.mjs.map} +1 -1
  166. package/dist/renderer-D3ziOPhX.mjs +5 -0
  167. package/dist/{renderer-549d94qG.mjs → renderer-DCrKEVjb.mjs} +3 -3
  168. package/dist/{renderer-549d94qG.mjs.map → renderer-DCrKEVjb.mjs.map} +1 -1
  169. package/dist/renderer-DL-phtL5.mjs +5 -0
  170. package/dist/{renderer-CQFMyC_c.mjs → renderer-DNynPM6X.mjs} +2 -2
  171. package/dist/{renderer-CQFMyC_c.mjs.map → renderer-DNynPM6X.mjs.map} +1 -1
  172. package/dist/renderer-DSnmYnHg.mjs +5 -0
  173. package/dist/renderer-DUGfsT-E.mjs +5 -0
  174. package/dist/renderer-DW5af9x1.mjs +5 -0
  175. package/dist/{renderer-B-LUGB9h.mjs → renderer-DWYmJSrl.mjs} +2 -2
  176. package/dist/{renderer-B-LUGB9h.mjs.map → renderer-DWYmJSrl.mjs.map} +1 -1
  177. package/dist/renderer-DYMrol1t.mjs +5 -0
  178. package/dist/{renderer-CciiDHuU.mjs → renderer-DYeNNc_G.mjs} +3 -3
  179. package/dist/{renderer-CciiDHuU.mjs.map → renderer-DYeNNc_G.mjs.map} +1 -1
  180. package/dist/{renderer-CYwVNbUh.mjs → renderer-DYlx7VHo.mjs} +2 -2
  181. package/dist/{renderer-CYwVNbUh.mjs.map → renderer-DYlx7VHo.mjs.map} +1 -1
  182. package/dist/{renderer-CZ5mwBW1.mjs → renderer-D_m6Qbsi.mjs} +2 -2
  183. package/dist/{renderer-CZ5mwBW1.mjs.map → renderer-D_m6Qbsi.mjs.map} +1 -1
  184. package/dist/renderer-DekeUHaz.mjs +5 -0
  185. package/dist/{renderer-BKi6jDi_.mjs → renderer-DhGZ41hQ.mjs} +3 -3
  186. package/dist/{renderer-BKi6jDi_.mjs.map → renderer-DhGZ41hQ.mjs.map} +1 -1
  187. package/dist/{renderer-KgsVk9c6.mjs → renderer-DiZkZ0Pr.mjs} +3 -3
  188. package/dist/{renderer-KgsVk9c6.mjs.map → renderer-DiZkZ0Pr.mjs.map} +1 -1
  189. package/dist/{renderer-BtgqTg2K.mjs → renderer-Dm57W73p.mjs} +2 -2
  190. package/dist/renderer-Dt5uyJdZ.mjs +5 -0
  191. package/dist/{renderer-g9SstkTz.mjs → renderer-DtFZbE1j.mjs} +2 -2
  192. package/dist/{renderer-C1ctHdXl.mjs → renderer-DvHi_wXE.mjs} +3 -3
  193. package/dist/{renderer-C1ctHdXl.mjs.map → renderer-DvHi_wXE.mjs.map} +1 -1
  194. package/dist/{renderer-vll8LX0I.mjs → renderer-Dv_iRIyx.mjs} +17 -17
  195. package/dist/renderer-Dv_iRIyx.mjs.map +1 -0
  196. package/dist/renderer-DwLQAnaK.mjs +5 -0
  197. package/dist/{renderer-DXFJv_e6.mjs → renderer-DzON3wDZ.mjs} +3 -3
  198. package/dist/{renderer-DXFJv_e6.mjs.map → renderer-DzON3wDZ.mjs.map} +1 -1
  199. package/dist/{renderer-RAq3LnNy.mjs → renderer-GIlQ9lZq.mjs} +2 -2
  200. package/dist/{renderer-RAq3LnNy.mjs.map → renderer-GIlQ9lZq.mjs.map} +1 -1
  201. package/dist/{renderer-DwGlDNOV.mjs → renderer-HKv5cBdp.mjs} +2 -2
  202. package/dist/{renderer-DwGlDNOV.mjs.map → renderer-HKv5cBdp.mjs.map} +1 -1
  203. package/dist/renderer-IXQP2CWM.mjs +5 -0
  204. package/dist/renderer-K-Pkw63O.mjs +5 -0
  205. package/dist/renderer-MPw2KH9P.mjs +5 -0
  206. package/dist/{renderer-BUj7jE6t.mjs → renderer-QbSrnPZU.mjs} +3 -3
  207. package/dist/{renderer-BUj7jE6t.mjs.map → renderer-QbSrnPZU.mjs.map} +1 -1
  208. package/dist/renderer-RPu8RMav.mjs +5 -0
  209. package/dist/{renderer-dRXP2dJU.mjs → renderer-TfeohPxt.mjs} +3 -3
  210. package/dist/{renderer-dRXP2dJU.mjs.map → renderer-TfeohPxt.mjs.map} +1 -1
  211. package/dist/{renderer-CuPAQjDK.mjs → renderer-Y1kjtOto.mjs} +3 -3
  212. package/dist/{renderer-CuPAQjDK.mjs.map → renderer-Y1kjtOto.mjs.map} +1 -1
  213. package/dist/{renderer-BIieU9pY.mjs → renderer-YONlI6W-.mjs} +3 -3
  214. package/dist/{renderer-BIieU9pY.mjs.map → renderer-YONlI6W-.mjs.map} +1 -1
  215. package/dist/{renderer-45ifiDkn.mjs → renderer-_J9JcCMR.mjs} +3 -3
  216. package/dist/{renderer-45ifiDkn.mjs.map → renderer-_J9JcCMR.mjs.map} +1 -1
  217. package/dist/renderer-dCqxd5N2.mjs +5 -0
  218. package/dist/{renderer-aRk849b3.d.mts → renderer-fG8Jy8Rx.d.mts} +2 -2
  219. package/dist/{renderer-aRk849b3.d.mts.map → renderer-fG8Jy8Rx.d.mts.map} +1 -1
  220. package/dist/renderer-lhjmE-Fp.mjs +5 -0
  221. package/dist/{renderer-_54hiCq0.mjs → renderer-mDBoz0zT.mjs} +3 -3
  222. package/dist/{renderer-_54hiCq0.mjs.map → renderer-mDBoz0zT.mjs.map} +1 -1
  223. package/dist/{renderer-BHPgkoEL.mjs → renderer-pn52dzZz.mjs} +2 -2
  224. package/dist/{renderer-BHPgkoEL.mjs.map → renderer-pn52dzZz.mjs.map} +1 -1
  225. package/dist/renderer-u9cmBuvM.mjs +5 -0
  226. package/dist/{renderer-BPiWsrC2.mjs → renderer-uER8kn7f.mjs} +2 -2
  227. package/dist/{renderer-BPiWsrC2.mjs.map → renderer-uER8kn7f.mjs.map} +1 -1
  228. package/dist/{renderer-B5b-ehRb.mjs → renderer-uzU6dsdR.mjs} +2 -2
  229. package/dist/{renderer-B5b-ehRb.mjs.map → renderer-uzU6dsdR.mjs.map} +1 -1
  230. package/dist/renderer-vH12jcpz.mjs +5 -0
  231. package/dist/{renderer-DxB_OfLs.mjs → renderer-yNWYqvvq.mjs} +2 -2
  232. package/dist/{renderer-DxB_OfLs.mjs.map → renderer-yNWYqvvq.mjs.map} +1 -1
  233. package/dist/{renderer-dGEMVaZ3.mjs → renderer-zLi2qFGT.mjs} +2 -2
  234. package/dist/{renderer-dGEMVaZ3.mjs.map → renderer-zLi2qFGT.mjs.map} +1 -1
  235. package/dist/{renderers-CP8CFWDs-BRQyvcut.mjs → renderers-CP8CFWDs-BufiCyn7.mjs} +2 -2
  236. package/dist/{renderers-CP8CFWDs-BRQyvcut.mjs.map → renderers-CP8CFWDs-BufiCyn7.mjs.map} +1 -1
  237. package/dist/signals/index.d.mts +4 -4
  238. package/dist/signals/index.mjs +4 -4
  239. package/dist/{src-BzFGotRc.mjs → src-DrP7fGJX.mjs} +37 -12
  240. package/dist/{src-BzFGotRc.mjs.map → src-DrP7fGJX.mjs.map} +1 -1
  241. package/package.json +60 -60
  242. package/dist/dist-CUNvNDS3.mjs.map +0 -1
  243. package/dist/dist-D3BeAZ7X.mjs.map +0 -1
  244. package/dist/index-X2u96TEo.d.mts.map +0 -1
  245. package/dist/preview-engine/chunk-7M5LE6EM.mjs +0 -483
  246. package/dist/preview-engine/chunk-FRJPXWAG.mjs +0 -1
  247. package/dist/preview-engine/renderers-TTXTV4PC.mjs +0 -228
  248. package/dist/program-Bn6ko_I4.mjs.map +0 -1
  249. package/dist/renderer-1aSF5BmY.mjs +0 -5
  250. package/dist/renderer-B2e4Gr9u.mjs +0 -5
  251. package/dist/renderer-B6fz4j50.mjs +0 -5
  252. package/dist/renderer-BEftIYw-.mjs +0 -5
  253. package/dist/renderer-BHTnO-7e.mjs +0 -5
  254. package/dist/renderer-BMlnQqTO.mjs +0 -5
  255. package/dist/renderer-BOzcFezY.mjs +0 -5
  256. package/dist/renderer-BVbjJIKJ.mjs +0 -5
  257. package/dist/renderer-BXsHKf4k.mjs +0 -5
  258. package/dist/renderer-Bks49NVl.mjs +0 -5
  259. package/dist/renderer-C-t7qFKr.mjs +0 -5
  260. package/dist/renderer-C24n-6CX.mjs +0 -6
  261. package/dist/renderer-CCReX-7M.mjs +0 -5
  262. package/dist/renderer-CIxFQrAm.mjs +0 -5
  263. package/dist/renderer-CLHBMIqJ.mjs +0 -5
  264. package/dist/renderer-CMJKi-Ye.mjs +0 -5
  265. package/dist/renderer-C_H3mHZa.mjs +0 -5
  266. package/dist/renderer-CfkTdR5B.mjs +0 -5
  267. package/dist/renderer-CnhkXJ0R.mjs +0 -5
  268. package/dist/renderer-CqpyVsq_.mjs +0 -5
  269. package/dist/renderer-CtWgIpTE.mjs +0 -5
  270. package/dist/renderer-CyuKr5ca.mjs +0 -5
  271. package/dist/renderer-D9ON_1Hf.mjs +0 -5
  272. package/dist/renderer-DAnTgh4o.mjs +0 -5
  273. package/dist/renderer-DWgpivA3.mjs +0 -5
  274. package/dist/renderer-Dh_qNNwR.mjs +0 -5
  275. package/dist/renderer-DkCpXPMP.mjs +0 -5
  276. package/dist/renderer-Dre-6cDR.mjs +0 -5
  277. package/dist/renderer-Ds5z4_HX.mjs +0 -5
  278. package/dist/renderer-HGSCOMyP.mjs +0 -5
  279. package/dist/renderer-KMY8W-cJ.mjs +0 -5
  280. package/dist/renderer-R21YvXz3.mjs +0 -5
  281. package/dist/renderer-RtzCz37W.mjs +0 -5
  282. package/dist/renderer-iMrqAjix.mjs +0 -5
  283. package/dist/renderer-sMed1u1O.mjs +0 -5
  284. package/dist/renderer-tsAuo46l.mjs +0 -5
  285. package/dist/renderer-vll8LX0I.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-C9dqx3U7.mjs","names":[],"sources":["../../../nodes/node-crt/dist/renderers-RZlSUb1G.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"CRT\";\nconst UNIFORM_FLOATS = 16;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet scanlines = u.v[1].x;\n\tlet lineCount = u.v[1].y;\n\tlet curvature = u.v[1].z;\n\tlet mask = u.v[1].w;\n\tlet vignette = u.v[2].x;\n\tlet noise = u.v[2].y;\n\tlet flicker = u.v[2].z;\n\tlet tracking = u.v[2].w;\n\tlet chroma = u.v[3].x;\n\n\tlet R = res();\n\tlet t = time;\n\tlet cc = in.uv * 2.0 - 1.0;\n\tvar uv = (cc * (1.0 + curvature * 0.25 * dot(cc, cc))) * 0.5 + 0.5;\n\tif (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) { return vec4<f32>(0.0, 0.0, 0.0, 1.0); }\n\tlet line = floor(uv.y * lineCount);\n\tlet jitter = (hash12(vec2<f32>(line, floor(t * 30.0))) - 0.5) * tracking * 0.006;\n\tlet bandY = fract(t * 0.13);\n\tlet band = smoothstep(0.07, 0.0, abs(uv.y - bandY)) * tracking;\n\tuv.x += jitter + band * 0.015 * sin(uv.y * 400.0 + t * 20.0);\n\tlet base = sampleS(uv);\n\tvar rgb = base.rgb;\n\tif (chroma > 0.0) {\n\t\tlet off = chroma / R.x;\n\t\tlet avg = (sampleS(uv - vec2<f32>(off, 0.0)).rgb + base.rgb + sampleS(uv + vec2<f32>(off * 2.0, 0.0)).rgb) / 3.0;\n\t\tlet y = luma(base.rgb);\n\t\trgb = vec3<f32>(y) + (avg - vec3<f32>(luma(avg)));\n\t}\n\tlet sl = 0.5 + 0.5 * cos(uv.y * lineCount * 6.2831853);\n\trgb *= 1.0 - scanlines * (1.0 - sl) * 0.7;\n\tlet tri = u32(floor(in.uv.x * R.x)) % 3u;\n\tvar m = vec3<f32>(0.75);\n\tif (tri == 0u) { m.r = 1.25; } else if (tri == 1u) { m.g = 1.25; } else { m.b = 1.25; }\n\trgb *= mix(vec3<f32>(1.0), m, mask);\n\trgb += (hash12(in.uv * R + vec2<f32>(t * 61.0, t * 17.0)) - 0.5) * noise * 0.3;\n\trgb *= 1.0 - flicker * hash12(vec2<f32>(floor(t * 24.0), 3.0));\n\trgb *= 1.0 - vignette * dot(cc, cc) * 0.35;\n\trgb += band * 0.12;\n\treturn vec4<f32>(clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0)), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.scanlines, .45);\n\tdata[5] = num(raw.lineCount, 540);\n\tdata[6] = num(raw.curvature, .12);\n\tdata[7] = num(raw.mask, .25);\n\tdata[8] = num(raw.vignette, .35);\n\tdata[9] = num(raw.noise, .08);\n\tdata[10] = num(raw.flicker, .03);\n\tdata[11] = num(raw.tracking, 0);\n\tdata[12] = num(raw.chroma, 0);\n}\nconst CRTWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CRTWebGPURenderer });\n\n//#endregion\nexport { CRTWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-RZlSUb1G.mjs.map"],"mappings":";;;;;;AAIA,MAAM,KAAK;AACX,MAAM,iBAAiB;;AAEvB,MAAM,SAAS,CAAC;;;;;EAKd,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwFrB;AACF,MAAM,YAAY,WAAW,YAAY;CACxC,QAAQ,wBAAwB,QAAQ;EACvC;EACA;EACA;EACA;EACA,EAAE,GAAG,GAAG,SAAS;CAClB,2BAA2B,IAAI,KAAK;CACpC,SAAS,OAAO,cAAc;EAC7B,WAAW;EACX,WAAW;EACX,cAAc;EACd,cAAc;EACd,CAAC;CACF,EAAE;AACH,SAAS,aAAa,QAAQ,QAAQ;CACrC,MAAM,IAAI,UAAU,OAAO;CAC3B,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO;AAClC,KAAI,CAAC,MAAM;AACV,SAAO,OAAO,KAAK,MAAM,MAAM;GAC9B,MAAM,SAAS,OAAO,mBAAmB;IACxC;IACA,OAAO,GAAG,GAAG,GAAG,EAAE;IAClB,CAAC;AACF,UAAO,OAAO,qBAAqB;IAClC,OAAO,GAAG,GAAG,GAAG;IAChB,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;IACrE,QAAQ;KACP;KACA,YAAY;KACZ;IACD,UAAU;KACT;KACA,YAAY;KACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;KACrB;IACD,WAAW,EAAE,UAAU,kBAAkB;IACzC,CAAC;IACD;AACF,IAAE,UAAU,IAAI,QAAQ,KAAK;;AAE9B,QAAO;;AAER,SAAS,IAAI,GAAG,UAAU;CACzB,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,EAAE;AAC/C,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;;AAGjC,SAAS,KAAK,KAAK,MAAM,MAAM,OAAO;AACrC,MAAK,KAAK,EAAE;AACZ,MAAK,KAAK;AACV,MAAK,KAAK;AACV,MAAK,KAAK,IAAI,IAAI,WAAW,IAAI;AACjC,MAAK,KAAK,IAAI,IAAI,WAAW,IAAI;AACjC,MAAK,KAAK,IAAI,IAAI,WAAW,IAAI;AACjC,MAAK,KAAK,IAAI,IAAI,MAAM,IAAI;AAC5B,MAAK,KAAK,IAAI,IAAI,UAAU,IAAI;AAChC,MAAK,KAAK,IAAI,IAAI,OAAO,IAAI;AAC7B,MAAK,MAAM,IAAI,IAAI,SAAS,IAAI;AAChC,MAAK,MAAM,IAAI,IAAI,UAAU,EAAE;AAC/B,MAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;;AAE9B,MAAM,oBAAoB,OAAO,SAAS;CACzC,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,GAAI;CACnB,MAAM,QAAQ,MAAM,cAAc,WAAW;AAC7C,KAAI,CAAC,MAAO;AACZ,MAAK,KAAK;CACV,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,MAAM,MAAM,oBAAoB,MAAM,SAAS,EAAE;CACpE,MAAM,MAAM,GAAG,QAAQ,kBAAkB,GAAG,OAAO,gBAAgB;EAClE;EACA;EACA,MAAM,QAAQ;EACd,CAAC,GAAG;CACL,MAAM,OAAO,IAAI,aAAa,eAAe;AAC7C,MAAK,KAAK,MAAM,QAAQ,KAAK,MAAM;CACnC,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,MAAM;CACnE,MAAM,SAAS,IAAI;CACnB,MAAM,IAAI,UAAU,OAAO;CAC3B,MAAM,YAAY,aAAa,QAAQ,IAAI,SAAS,OAAO;CAC3D,MAAM,MAAM,IAAI,SAAS,mBAAmB,KAAK;CACjD,IAAI,OAAO;AACX,MAAK,MAAM,YAAY,WAAW;EACjC,MAAM,MAAM,IAAI,SAAS,oBAAoB,aAAa,cAAc;GACvE;GACA;GACA;GACA,GAAG,MAAM,mBAAmB,EAAE;GAC9B,CAAC;AACF,qBAAmB,SAAS,IAAI,YAAY,EAAE,UAAU,CAAC,OAAO,gBAAgB;GAC/E,QAAQ,EAAE;GACV,SAAS;IACR;KACC,SAAS;KACT,UAAU,EAAE,QAAQ,KAAK;KACzB;IACD;KACC,SAAS;KACT,UAAU,SAAS,YAAY;KAC/B;IACD;KACC,SAAS;KACT,UAAU,KAAK,YAAY;KAC3B;IACD;KACC,SAAS;KACT,UAAU,EAAE;KACZ;IACD;GACD,CAAC,CAAC,CAAC;AACJ,SAAO;;AAER,qBAAoB,MAAM,KAAK;;AAKhC,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,mBAAmB,CAAC"}
1
+ {"version":3,"file":"renderer-BTwuM9u-.mjs","names":[],"sources":["../../../nodes/node-crt/dist/renderers-RZlSUb1G.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"CRT\";\nconst UNIFORM_FLOATS = 16;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 4> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet scanlines = u.v[1].x;\n\tlet lineCount = u.v[1].y;\n\tlet curvature = u.v[1].z;\n\tlet mask = u.v[1].w;\n\tlet vignette = u.v[2].x;\n\tlet noise = u.v[2].y;\n\tlet flicker = u.v[2].z;\n\tlet tracking = u.v[2].w;\n\tlet chroma = u.v[3].x;\n\n\tlet R = res();\n\tlet t = time;\n\tlet cc = in.uv * 2.0 - 1.0;\n\tvar uv = (cc * (1.0 + curvature * 0.25 * dot(cc, cc))) * 0.5 + 0.5;\n\tif (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) { return vec4<f32>(0.0, 0.0, 0.0, 1.0); }\n\tlet line = floor(uv.y * lineCount);\n\tlet jitter = (hash12(vec2<f32>(line, floor(t * 30.0))) - 0.5) * tracking * 0.006;\n\tlet bandY = fract(t * 0.13);\n\tlet band = smoothstep(0.07, 0.0, abs(uv.y - bandY)) * tracking;\n\tuv.x += jitter + band * 0.015 * sin(uv.y * 400.0 + t * 20.0);\n\tlet base = sampleS(uv);\n\tvar rgb = base.rgb;\n\tif (chroma > 0.0) {\n\t\tlet off = chroma / R.x;\n\t\tlet avg = (sampleS(uv - vec2<f32>(off, 0.0)).rgb + base.rgb + sampleS(uv + vec2<f32>(off * 2.0, 0.0)).rgb) / 3.0;\n\t\tlet y = luma(base.rgb);\n\t\trgb = vec3<f32>(y) + (avg - vec3<f32>(luma(avg)));\n\t}\n\tlet sl = 0.5 + 0.5 * cos(uv.y * lineCount * 6.2831853);\n\trgb *= 1.0 - scanlines * (1.0 - sl) * 0.7;\n\tlet tri = u32(floor(in.uv.x * R.x)) % 3u;\n\tvar m = vec3<f32>(0.75);\n\tif (tri == 0u) { m.r = 1.25; } else if (tri == 1u) { m.g = 1.25; } else { m.b = 1.25; }\n\trgb *= mix(vec3<f32>(1.0), m, mask);\n\trgb += (hash12(in.uv * R + vec2<f32>(t * 61.0, t * 17.0)) - 0.5) * noise * 0.3;\n\trgb *= 1.0 - flicker * hash12(vec2<f32>(floor(t * 24.0), 3.0));\n\trgb *= 1.0 - vignette * dot(cc, cc) * 0.35;\n\trgb += band * 0.12;\n\treturn vec4<f32>(clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0)), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.scanlines, .45);\n\tdata[5] = num(raw.lineCount, 540);\n\tdata[6] = num(raw.curvature, .12);\n\tdata[7] = num(raw.mask, .25);\n\tdata[8] = num(raw.vignette, .35);\n\tdata[9] = num(raw.noise, .08);\n\tdata[10] = num(raw.flicker, .03);\n\tdata[11] = num(raw.tracking, 0);\n\tdata[12] = num(raw.chroma, 0);\n}\nconst CRTWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CRTWebGPURenderer });\n\n//#endregion\nexport { CRTWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-RZlSUb1G.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-DOL2i2sR.mjs";
2
2
  import { Rt as getFingerprint } from "./dist-C8XSqfTx.mjs";
3
3
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
4
- import { W as lutStore } from "./dist-D3BeAZ7X.mjs";
4
+ import { W as lutStore } from "./dist-DtPPPsZV.mjs";
5
5
 
6
6
  //#region ../../nodes/node-extract-lut/dist/renderers-CDotFzd9.mjs
7
7
  const extractionCache = /* @__PURE__ */ new Map();
@@ -979,4 +979,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ExtractLutWebGPURendere
979
979
 
980
980
  //#endregion
981
981
  export { renderers_default as default };
982
- //# sourceMappingURL=renderer-BqUAyzCZ.mjs.map
982
+ //# sourceMappingURL=renderer-BZMh2io2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BqUAyzCZ.mjs","names":[],"sources":["../../../nodes/node-extract-lut/dist/renderers-CDotFzd9.mjs"],"sourcesContent":["import { getFingerprint } from \"@framefields/core\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { lutStore } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst extractionCache = /* @__PURE__ */ new Map();\nconst pendingExtractions = /* @__PURE__ */ new Map();\nconst latestRequestedFingerprint = /* @__PURE__ */ new Map();\nconst activeTextures = /* @__PURE__ */ new Map();\nconst pipelineCache = /* @__PURE__ */ new WeakMap();\n/**\n* Lazily compiles and caches the two WGSL compute shaders per device.\n*\n* Both shaders write a flat array of f32 triples (R,G,B) for every cell of a\n* `lutSize³` cube. The host uploads whatever small set of parameters is needed\n* (RBF weights OR LAB statistics), then reads the result back as a typed array\n* that can be forwarded to `lutStore.createOrUpdate`.\n*\n* Workgroup size 8×8×4 = 256 threads maps cleanly onto lutSize=33 with\n* ceil(33/8)=5 groups on X/Y and ceil(33/4)=9 on Z → 5×5×9 = 225 dispatches.\n*/\nfunction getOrCreatePipelines(device) {\n\tconst cached = pipelineCache.get(device);\n\tif (cached) return cached;\n\tconst pipelines = {\n\t\trbf: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Params {\n\tlutSize : u32,\n\tnumSamples : u32,\n\tepsilonSq : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n@group(0) @binding(1) var<storage, read> srcPoints : array<vec4f>; // [numSamples]\n@group(0) @binding(2) var<storage, read> weights : array<vec4f>; // [numSamples]\n@group(0) @binding(3) var<storage, read> poly : array<vec4f>; // [4]\n@group(0) @binding(4) var<storage, read_write> lut : array<f32>; // [lutSize³ * 3]\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = params.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\tlet p = vec3f(inR, inG, inB);\n\n\t// Polynomial part: poly[0] + poly[1]*r + poly[2]*g + poly[3]*b\n\tvar out = poly[0].xyz + poly[1].xyz * inR + poly[2].xyz * inG + poly[3].xyz * inB;\n\n\t// RBF sum\n\tlet eps = params.epsilonSq;\n\tlet M = params.numSamples;\n\tvar minDistSq = 1e10;\n\tvar rbfSum = vec3f(0.0);\n\tfor (var i = 0u; i < M; i++) {\n\t\tlet d = p - srcPoints[i].xyz;\n\t\tlet dSq = dot(d, d);\n\t\tminDistSq = min(minDistSq, dSq);\n\t\tlet phi = sqrt(dSq + eps);\n\t\trbfSum += weights[i].xyz * phi;\n\t}\n\n\t// Smoothly fade out RBF weight contribution for regions far from samples\n\t// starts fading at distance 0.25 (dist^2 = 0.0625), fully faded at 0.5 (dist^2 = 0.25)\n\tlet rbfFade = clamp(1.0 - (minDistSq - 0.0625) / (0.25 - 0.0625), 0.0, 1.0);\n\tout += rbfSum * rbfFade;\n\n\t// Smoothly blend the entire mapping towards identity for regions extremely far from samples\n\t// starts blending at distance 0.35 (dist^2 = 0.1225), fully identity at 0.65 (dist^2 = 0.4225)\n\tlet identityBlend = clamp((minDistSq - 0.1225) / (0.4225 - 0.1225), 0.0, 1.0);\n\tout = mix(out, p, identityBlend);\n\n\t// Clamp + write\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = clamp(out.r, 0.0, 1.0);\n\tlut[cell + 1u] = clamp(out.g, 0.0, 1.0);\n\tlut[cell + 2u] = clamp(out.b, 0.0, 1.0);\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t}),\n\t\tstatistical: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Stats {\n\tsrcMean : vec4f, // (meanL, meanA, meanB, pad) of source\n\ttgtMean : vec4f, // (meanL, meanA, meanB, pad) of target\n\tscale : vec4f, // tgtStd / srcStd per channel\n\tlutSize : u32,\n}\n\n@group(0) @binding(0) var<uniform> stats : Stats;\n@group(0) @binding(1) var<storage, read_write> lut : array<f32>;\n\n// Constants matching the Reinhard/rgbToLab implementation\nconst INV_SQRT3 : f32 = 0.57735026919; // 1 / sqrt(3)\nconst INV_SQRT6 : f32 = 0.40824829046; // 1 / sqrt(6)\nconst INV_SQRT2 : f32 = 0.70710678118; // 1 / sqrt(2)\n\nfn safeLog10(v : f32) -> f32 {\n\treturn log(max(v, 1e-5)) * 0.43429448190; // log10(x) = ln(x) / ln(10)\n}\n\nfn rgbToLab(rgb : vec3f) -> vec3f {\n\tlet R = max(rgb.r, 1e-5);\n\tlet G = max(rgb.g, 1e-5);\n\tlet B = max(rgb.b, 1e-5);\n\n\tlet Lms_L = safeLog10(0.3811 * R + 0.5783 * G + 0.0402 * B);\n\tlet Lms_M = safeLog10(0.1967 * R + 0.7244 * G + 0.0782 * B);\n\tlet Lms_S = safeLog10(0.0241 * R + 0.1288 * G + 0.8444 * B);\n\n\treturn vec3f(\n\t\t(Lms_L + Lms_M + Lms_S) * INV_SQRT3,\n\t\t(Lms_L + Lms_M - 2.0 * Lms_S) * INV_SQRT6,\n\t\t(Lms_L - Lms_M) * INV_SQRT2,\n\t);\n}\n\nfn labToRgb(lab : vec3f) -> vec3f {\n\tlet l = lab.x; let a = lab.y; let b = lab.z;\n\n\tlet L_log = l * INV_SQRT3 + a * INV_SQRT6 + b * INV_SQRT2;\n\tlet M_log = l * INV_SQRT3 + a * INV_SQRT6 - b * INV_SQRT2;\n\tlet S_log = l * INV_SQRT3 - 2.0 * a * INV_SQRT6;\n\n\tlet L = pow(10.0, L_log);\n\tlet M = pow(10.0, M_log);\n\tlet S = pow(10.0, S_log);\n\n\treturn clamp(vec3f(\n\t\t 4.4679 * L - 3.5873 * M + 0.1193 * S,\n\t\t-1.2186 * L + 2.3809 * M - 0.1624 * S,\n\t\t 0.0497 * L - 0.2439 * M + 1.2045 * S,\n\t), vec3f(0.0), vec3f(1.0));\n}\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = stats.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\n\tlet lab = rgbToLab(vec3f(inR, inG, inB));\n\tlet mapped = stats.scale.xyz * (lab - stats.srcMean.xyz) + stats.tgtMean.xyz;\n\tlet rgb = labToRgb(mapped);\n\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = rgb.r;\n\tlut[cell + 1u] = rgb.g;\n\tlut[cell + 2u] = rgb.b;\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t})\n\t};\n\tpipelineCache.set(device, pipelines);\n\treturn pipelines;\n}\nfunction solveLU(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t;\n\t\t\t}\n\t\t\tfor (let col = 0; col < 3; col++) {\n\t\t\t\tconst i1 = i * 3 + col, i2 = pivotRow * 3 + col;\n\t\t\t\tconst t = B[i1];\n\t\t\t\tB[i1] = B[i2];\n\t\t\t\tB[i2] = t;\n\t\t\t}\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tfor (let col = 0; col < 3; col++) B[r * 3 + col] -= factor * B[i * 3 + col];\n\t\t}\n\t}\n\tconst X = new Float64Array(n * 3);\n\tfor (let col = 0; col < 3; col++) for (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i * 3 + col];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j * 3 + col];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i * 3 + col] = sum / denom;\n\t}\n\treturn X;\n}\nfunction hasAbsurdCoefficients(X_sol) {\n\tfor (let i = 0; i < X_sol.length; i++) {\n\t\tconst val = X_sol[i];\n\t\tif (Number.isNaN(val) || !Number.isFinite(val) || Math.abs(val) > 1e5) return true;\n\t}\n\treturn false;\n}\nfunction solveLU1D(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t$1 = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t$1;\n\t\t\t}\n\t\t\tconst t = B[i];\n\t\t\tB[i] = B[pivotRow];\n\t\t\tB[pivotRow] = t;\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tB[r] -= factor * B[i];\n\t\t}\n\t}\n\tconst X = new Float64Array(n);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i] = sum / denom;\n\t}\n\treturn X;\n}\nfunction solve1DChannel(srcVals, tgtVals, epsilonSq) {\n\tconst M = srcVals.length;\n\tconst H = M + 2;\n\tconst K_mat = new Float64Array(H * H);\n\tconst B_rhs = new Float64Array(H);\n\tfor (let i = 0; i < M; i++) {\n\t\tconst xi = srcVals[i];\n\t\tB_rhs[i] = tgtVals[i];\n\t\tfor (let j = 0; j < M; j++) {\n\t\t\tconst dx = xi - srcVals[j];\n\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + epsilonSq);\n\t\t}\n\t\tK_mat[i * H + M + 0] = 1;\n\t\tK_mat[i * H + M + 1] = xi;\n\t\tK_mat[(M + 0) * H + i] = 1;\n\t\tK_mat[(M + 1) * H + i] = xi;\n\t}\n\tlet diagMean = 0;\n\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\tdiagMean /= M;\n\tconst lambda = Math.max(1e-4, diagMean * .01);\n\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\tfor (let k = 0; k < 2; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\treturn solveLU1D(K_mat, B_rhs, H);\n}\nfunction evaluate1DChannel(srcVals, X_sol, epsilonSq, lutSize) {\n\tconst M = srcVals.length;\n\tconst out = new Float32Array(lutSize);\n\tfor (let cell = 0; cell < lutSize; cell++) {\n\t\tconst p = cell / (lutSize - 1);\n\t\tlet minDistSq = 1e10;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tminDistSq = Math.min(minDistSq, dx * dx);\n\t\t}\n\t\tlet rbfSum = 0;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tconst phi = Math.sqrt(dx * dx + epsilonSq);\n\t\t\trbfSum += X_sol[i] * phi;\n\t\t}\n\t\tconst rbfFade = Math.max(0, Math.min(1, 1 - (minDistSq - .0625) / .1875));\n\t\tlet val = X_sol[M + 0] + X_sol[M + 1] * p + rbfSum * rbfFade;\n\t\tconst identityBlend = Math.max(0, Math.min(1, (minDistSq - .1225) / .3));\n\t\tval = val * (1 - identityBlend) + p * identityBlend;\n\t\tout[cell] = Math.max(0, Math.min(1, val));\n\t}\n\treturn out;\n}\nfunction isSeparableOperationTree(vv, sourceMedia) {\n\tconst sourceFingerprint = getFingerprint(sourceMedia);\n\tlet current = vv;\n\twhile (current) {\n\t\tconst op = current.operation;\n\t\tif (!op) break;\n\t\tconst mediaToFingerprint = {\n\t\t\t...current,\n\t\t\tmetadata: {},\n\t\t\toperation: current.operation ? { ...current.operation } : void 0\n\t\t};\n\t\tif (mediaToFingerprint.operation) delete mediaToFingerprint.operation.lutUrl;\n\t\tif (getFingerprint(mediaToFingerprint) === sourceFingerprint) return true;\n\t\tif (op.op === \"source\") return false;\n\t\tif (op.op === \"Curves\") {\n\t\t\tif (op.curveType !== \"rgb\") return false;\n\t\t} else if (op.op === \"Levels\") {} else return false;\n\t\tif (current.children && current.children.length > 0) current = current.children[0];\n\t\telse break;\n\t}\n\treturn false;\n}\nfunction rgbToLab(r, g, b) {\n\tconst R = Math.max(1e-5, r), G = Math.max(1e-5, g), B = Math.max(1e-5, b);\n\tconst L = Math.log10(Math.max(1e-5, .3811 * R + .5783 * G + .0402 * B));\n\tconst M = Math.log10(Math.max(1e-5, .1967 * R + .7244 * G + .0782 * B));\n\tconst S = Math.log10(Math.max(1e-5, .0241 * R + .1288 * G + .8444 * B));\n\treturn [\n\t\t(L + M + S) / Math.sqrt(3),\n\t\t(L + M - 2 * S) / Math.sqrt(6),\n\t\t(L - M) / Math.sqrt(2)\n\t];\n}\nfunction getPixelRGB(pixels, idx, isBGRA) {\n\tconst o = idx * 4;\n\tconst rIdx = isBGRA ? o + 2 : o;\n\tconst bIdx = isBGRA ? o : o + 2;\n\treturn [\n\t\tpixels[rIdx] / 255,\n\t\tpixels[o + 1] / 255,\n\t\tpixels[bIdx] / 255\n\t];\n}\nfunction hashString(str) {\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) hash = hash * 33 ^ str.charCodeAt(i);\n\treturn hash >>> 0;\n}\nvar SeededRandom = class {\n\tstate;\n\tconstructor(seed) {\n\t\tthis.state = seed || 1;\n\t}\n\tnext() {\n\t\tthis.state = (this.state * 1664525 + 1013904223) % 4294967296;\n\t\treturn this.state / 4294967296;\n\t}\n};\nfunction seededShuffle(array, seed) {\n\tconst rng = new SeededRandom(seed);\n\tconst shuffled = [...array];\n\tfor (let i = shuffled.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng.next() * (i + 1));\n\t\tconst temp = shuffled[i];\n\t\tshuffled[i] = shuffled[j];\n\t\tshuffled[j] = temp;\n\t}\n\treturn shuffled;\n}\nfunction buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, gridResolution = 20) {\n\tconst occupied = /* @__PURE__ */ new Set();\n\tconst pool = [];\n\tconst numPixels = srcPixels.length / 4;\n\tfor (let i = 0; i < numPixels; i++) {\n\t\tconst src = getPixelRGB(srcPixels, i, isBGRA);\n\t\tconst r = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[0] * gridResolution)));\n\t\tconst g = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[1] * gridResolution)));\n\t\tconst b = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[2] * gridResolution)));\n\t\tconst cellKey = r * gridResolution * gridResolution + g * gridResolution + b;\n\t\tif (!occupied.has(cellKey)) {\n\t\t\toccupied.add(cellKey);\n\t\t\tpool.push({\n\t\t\t\tsrc,\n\t\t\t\ttgt: getPixelRGB(tgtPixels, i, isBGRA)\n\t\t\t});\n\t\t}\n\t}\n\treturn pool;\n}\n/**\n* Evaluates the fitted RBF on the GPU.\n*\n* CPU work that remains:\n* • Build K matrix O(M²) – tiny (≈ 162×162)\n* • solveLU O(M³) – tiny\n*\n* GPU work (replaces the triple-nested JS loop):\n* • 33³ = 35 937 threads × M inner iterations → ~5.7 M parallel MADs\n*\n* Returns a plain Float32Array of length lutSize³×3 for lutStore.\n*/\nasync function evaluateRbfOnGpu(device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq) {\n\tconst M = sampledPoints.length;\n\tconst totalCells = lutSize * lutSize * lutSize;\n\tconst wgs = 8;\n\tconst srcPointsData = new Float32Array(M * 4);\n\tconst weightsData = new Float32Array(M * 4);\n\tfor (let i = 0; i < M; i++) {\n\t\tsrcPointsData[i * 4 + 0] = sampledPoints[i].src[0];\n\t\tsrcPointsData[i * 4 + 1] = sampledPoints[i].src[1];\n\t\tsrcPointsData[i * 4 + 2] = sampledPoints[i].src[2];\n\t\tsrcPointsData[i * 4 + 3] = 0;\n\t\tweightsData[i * 4 + 0] = X_sol[i * 3 + 0];\n\t\tweightsData[i * 4 + 1] = X_sol[i * 3 + 1];\n\t\tweightsData[i * 4 + 2] = X_sol[i * 3 + 2];\n\t\tweightsData[i * 4 + 3] = 0;\n\t}\n\tconst polyData = new Float32Array(16);\n\tfor (let k = 0; k < 4; k++) {\n\t\tpolyData[k * 4 + 0] = X_sol[(M + k) * 3 + 0];\n\t\tpolyData[k * 4 + 1] = X_sol[(M + k) * 3 + 1];\n\t\tpolyData[k * 4 + 2] = X_sol[(M + k) * 3 + 2];\n\t\tpolyData[k * 4 + 3] = 0;\n\t}\n\tconst paramsBuffer = device.createBuffer({\n\t\tsize: 16,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tconst paramsData = /* @__PURE__ */ new ArrayBuffer(16);\n\tnew Uint32Array(paramsData, 0, 2).set([lutSize, M]);\n\tnew Float32Array(paramsData, 8, 1).set([epsilonSq]);\n\tdevice.queue.writeBuffer(paramsBuffer, 0, paramsData);\n\tconst srcPointsBuf = upload(device, srcPointsData);\n\tconst weightsBuf = upload(device, weightsData);\n\tconst polyBuf = upload(device, polyData);\n\tconst lutByteSize = totalCells * 3 * 4;\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.rbf.getBindGroupLayout(0),\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: paramsBuffer }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: { buffer: srcPointsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: { buffer: weightsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: { buffer: polyBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: { buffer: lutBuf }\n\t\t\t}\n\t\t]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"rbf-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.rbf);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / wgs);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tparamsBuffer.destroy();\n\tsrcPointsBuf.destroy();\n\tweightsBuf.destroy();\n\tpolyBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/**\n* Generates the statistical LAB-transfer LUT entirely on the GPU.\n* The only CPU work is computing 6 scalars (mean/std per LAB channel).\n*/\nasync function evaluateStatisticalOnGpu(device, pipelines, srcMean, tgtMean, scale, lutSize) {\n\tconst lutByteSize = lutSize * lutSize * lutSize * 3 * 4;\n\tconst statsData = /* @__PURE__ */ new ArrayBuffer(64);\n\tconst f = new Float32Array(statsData);\n\tconst u = new Uint32Array(statsData);\n\tf[0] = srcMean[0];\n\tf[1] = srcMean[1];\n\tf[2] = srcMean[2];\n\tf[4] = tgtMean[0];\n\tf[5] = tgtMean[1];\n\tf[6] = tgtMean[2];\n\tf[8] = scale[0];\n\tf[9] = scale[1];\n\tf[10] = scale[2];\n\tu[12] = lutSize;\n\tconst statsBuf = device.createBuffer({\n\t\tsize: 64,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(statsBuf, 0, statsData);\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.statistical.getBindGroupLayout(0),\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: statsBuf }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: lutBuf }\n\t\t}]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"stat-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.statistical);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / 8);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tstatsBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/** Uploads a Float32Array into a storage-readable GPUBuffer. */\nfunction upload(device, data) {\n\tconst buf = device.createBuffer({\n\t\tsize: Math.max(data.byteLength, 16),\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(buf, 0, data);\n\treturn buf;\n}\n/**\n* Converts a flat Float32Array [R0,G0,B0, R1,G1,B1 …] returned from the GPU\n* into the tuple array expected by `lutStore.createOrUpdate`.\n*/\nfunction flatToPoints(flat) {\n\tconst n = flat.length / 3;\n\tconst out = new Array(n);\n\tfor (let i = 0; i < n; i++) out[i] = [\n\t\tflat[i * 3],\n\t\tflat[i * 3 + 1],\n\t\tflat[i * 3 + 2]\n\t];\n\treturn out;\n}\nconst ExtractLutWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ExtractLUT\" || !op) return;\n\tconst nodeId = op.nodeId ?? props.renderId;\n\tconst mediaToFingerprint = {\n\t\t...props.virtualMedia,\n\t\tmetadata: {},\n\t\toperation: props.virtualMedia?.operation ? { ...props.virtualMedia.operation } : void 0\n\t};\n\tif (mediaToFingerprint.operation) {\n\t\tdelete mediaToFingerprint.operation.lutUrl;\n\t\tdelete mediaToFingerprint.operation.timeline;\n\t\tdelete mediaToFingerprint.operation.startFrame;\n\t}\n\tconst lutUrl = op.lutUrl ?? `runtime://lut/extract-lut-${nodeId}-${getFingerprint(mediaToFingerprint)}`;\n\tconst fingerprint = lutUrl.startsWith(`runtime://lut/extract-lut-${nodeId}-`) ? lutUrl.slice(`runtime://lut/extract-lut-${nodeId}-`.length) : getFingerprint(mediaToFingerprint);\n\tconst cacheKey = `${nodeId}-${fingerprint}`;\n\tconst sourceMedia = props.virtualMedia?.children?.[0];\n\tconst targetMedia = props.virtualMedia?.children?.[1];\n\tif (!sourceMedia || !targetMedia) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tconst strategy = op.strategy ?? \"deterministic\";\n\tconst samplePoints = op.samplePoints ?? 150;\n\tconst gridSize = 64;\n\tconst numPixels = gridSize * gridSize;\n\tif (extractionCache.get(nodeId) === fingerprint && lutStore.get(lutUrl, ctx.device)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tif (pendingExtractions.has(cacheKey)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tlatestRequestedFingerprint.set(nodeId, fingerprint);\n\tpass.end();\n\tlutStore.getOrLoad(lutUrl, ctx.device);\n\tconst prev = activeTextures.get(nodeId);\n\tif (prev) {\n\t\tconst toDestroy = prev;\n\t\tctx.device.queue.onSubmittedWorkDone().then(() => {\n\t\t\ttry {\n\t\t\t\ttoDestroy.srcTex.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\ttoDestroy.tgtTex.destroy();\n\t\t\t} catch {}\n\t\t});\n\t\tactiveTextures.delete(nodeId);\n\t}\n\tconst srcTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-src-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tctx.renderer.beginFrame(encoder, srcTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c0`,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, srcTex.createView(), srcTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst tgtTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-tgt-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tactiveTextures.set(nodeId, {\n\t\tsrcTex,\n\t\ttgtTex\n\t});\n\tctx.renderer.beginFrame(encoder, tgtTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(targetMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c1`,\n\t\tvirtualMedia: targetMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, tgtTex.createView(), tgtTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst bytesPerPixel = 4;\n\tconst align = 256;\n\tconst unpaddedBPR = gridSize * bytesPerPixel;\n\tconst bytesPerRow = Math.ceil(unpaddedBPR / align) * align;\n\tconst stagingSize = bytesPerRow * gridSize;\n\tconst srcStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-src-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tconst tgtStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-tgt-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tencoder.copyTextureToBuffer({ texture: srcTex }, {\n\t\tbuffer: srcStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tencoder.copyTextureToBuffer({ texture: tgtTex }, {\n\t\tbuffer: tgtStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tlet startMapping = () => {};\n\tconst mainSubmitPromise = new Promise((resolve) => {\n\t\tstartMapping = resolve;\n\t});\n\tconst originalSubmit = ctx.device.queue.submit;\n\tctx.device.queue.submit = function(commandBuffers) {\n\t\tctx.device.queue.submit = originalSubmit;\n\t\toriginalSubmit.call(this, commandBuffers);\n\t\tstartMapping();\n\t};\n\tconst extractionPromise = (async () => {\n\t\ttry {\n\t\t\tawait mainSubmitPromise;\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\ttry {\n\t\t\t\t\tsrcStagingBuffer.destroy();\n\t\t\t\t\ttgtStagingBuffer.destroy();\n\t\t\t\t} catch {}\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait ctx.device.queue.onSubmittedWorkDone();\n\t\t\tawait Promise.all([srcStagingBuffer.mapAsync(GPUMapMode.READ), tgtStagingBuffer.mapAsync(GPUMapMode.READ)]);\n\t\t\tconst srcPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst tgtPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst copyRows = (src, dst) => {\n\t\t\t\tif (bytesPerRow === unpaddedBPR) dst.set(src);\n\t\t\t\telse for (let y = 0; y < gridSize; y++) dst.set(src.subarray(y * bytesPerRow, y * bytesPerRow + unpaddedBPR), y * unpaddedBPR);\n\t\t\t};\n\t\t\tcopyRows(new Uint8Array(srcStagingBuffer.getMappedRange()), srcPixels);\n\t\t\tcopyRows(new Uint8Array(tgtStagingBuffer.getMappedRange()), tgtPixels);\n\t\t\tsrcStagingBuffer.unmap();\n\t\t\tsrcStagingBuffer.destroy();\n\t\t\ttgtStagingBuffer.unmap();\n\t\t\ttgtStagingBuffer.destroy();\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superceded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isBGRA = ctx.renderer.format === \"bgra8unorm\" || ctx.renderer.format === \"bgra8unorm-srgb\";\n\t\t\tconst lutSize = 33;\n\t\t\tconst pipelines = getOrCreatePipelines(ctx.device);\n\t\t\tlet flat = null;\n\t\t\tlet succeeded = false;\n\t\t\tif (strategy === \"deterministic\") {\n\t\t\t\tconst shuffled = seededShuffle(buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, 20), hashString(getFingerprint({\n\t\t\t\t\t...props.virtualMedia,\n\t\t\t\t\tmetadata: {},\n\t\t\t\t\toperation: void 0\n\t\t\t\t})));\n\t\t\t\tconst sampledPoints = shuffled.slice(0, Math.min(shuffled.length, samplePoints));\n\t\t\t\tconst M = sampledPoints.length;\n\t\t\t\tif (M >= 8) {\n\t\t\t\t\tif (isSeparableOperationTree(targetMedia, sourceMedia)) {\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst srcR = sampledPoints.map((p) => p.src[0]);\n\t\t\t\t\t\tconst tgtR = sampledPoints.map((p) => p.tgt[0]);\n\t\t\t\t\t\tconst srcG = sampledPoints.map((p) => p.src[1]);\n\t\t\t\t\t\tconst tgtG = sampledPoints.map((p) => p.tgt[1]);\n\t\t\t\t\t\tconst srcB = sampledPoints.map((p) => p.src[2]);\n\t\t\t\t\t\tconst tgtB = sampledPoints.map((p) => p.tgt[2]);\n\t\t\t\t\t\tconst X_sol_R = solve1DChannel(srcR, tgtR, epsilonSq);\n\t\t\t\t\t\tconst X_sol_G = solve1DChannel(srcG, tgtG, epsilonSq);\n\t\t\t\t\t\tconst X_sol_B = solve1DChannel(srcB, tgtB, epsilonSq);\n\t\t\t\t\t\tif (X_sol_R && !hasAbsurdCoefficients(X_sol_R) && X_sol_G && !hasAbsurdCoefficients(X_sol_G) && X_sol_B && !hasAbsurdCoefficients(X_sol_B)) {\n\t\t\t\t\t\t\tconst lutR = evaluate1DChannel(srcR, X_sol_R, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutG = evaluate1DChannel(srcG, X_sol_G, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutB = evaluate1DChannel(srcB, X_sol_B, epsilonSq, lutSize);\n\t\t\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\t\t\tflat[idx + 0] = lutR[r];\n\t\t\t\t\t\t\t\tflat[idx + 1] = lutG[g];\n\t\t\t\t\t\t\t\tflat[idx + 2] = lutB[b];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsucceeded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\tconst H = M + 4;\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tconst dy = sampledPoints[i].src[1] - sampledPoints[j].src[1];\n\t\t\t\t\t\t\t\tconst dz = sampledPoints[i].src[2] - sampledPoints[j].src[2];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx + dy * dy + dz * dz);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst K_mat = new Float64Array(H * H);\n\t\t\t\t\t\tconst B_rhs = new Float64Array(H * 3);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tconst pi = sampledPoints[i].src;\n\t\t\t\t\t\t\tconst gi = sampledPoints[i].tgt;\n\t\t\t\t\t\t\tB_rhs[i * 3 + 0] = gi[0];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 1] = gi[1];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 2] = gi[2];\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tconst pj = sampledPoints[j].src;\n\t\t\t\t\t\t\t\tconst dx = pi[0] - pj[0], dy = pi[1] - pj[1], dz = pi[2] - pj[2];\n\t\t\t\t\t\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + dy * dy + dz * dz + epsilonSq);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tK_mat[i * H + M + 0] = 1;\n\t\t\t\t\t\t\tK_mat[i * H + M + 1] = pi[0];\n\t\t\t\t\t\t\tK_mat[i * H + M + 2] = pi[1];\n\t\t\t\t\t\t\tK_mat[i * H + M + 3] = pi[2];\n\t\t\t\t\t\t\tK_mat[(M + 0) * H + i] = 1;\n\t\t\t\t\t\t\tK_mat[(M + 1) * H + i] = pi[0];\n\t\t\t\t\t\t\tK_mat[(M + 2) * H + i] = pi[1];\n\t\t\t\t\t\t\tK_mat[(M + 3) * H + i] = pi[2];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet diagMean = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\t\t\t\t\t\tdiagMean /= M;\n\t\t\t\t\t\tconst lambda = Math.max(1e-4, diagMean * .01);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\t\t\t\t\t\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\t\t\t\t\t\tfor (let k = 0; k < 4; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\t\t\t\t\t\tconst X_sol = solveLU(K_mat, B_rhs, H);\n\t\t\t\t\t\tif (X_sol && !hasAbsurdCoefficients(X_sol)) try {\n\t\t\t\t\t\t\tflat = await evaluateRbfOnGpu(ctx.device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq);\n\t\t\t\t\t\t\tlet hasInvalid = false;\n\t\t\t\t\t\t\tfor (let i = 0; i < flat.length; i++) {\n\t\t\t\t\t\t\t\tconst val = flat[i];\n\t\t\t\t\t\t\t\tif (Number.isNaN(val) || !Number.isFinite(val)) {\n\t\t\t\t\t\t\t\t\thasInvalid = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!hasInvalid) succeeded = true;\n\t\t\t\t\t\t} catch (gpuErr) {\n\t\t\t\t\t\t\tconsole.error(\"[ExtractLUT] RBF GPU evaluation failed:\", gpuErr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!succeeded) {\n\t\t\t\tlet srcMeanL = 0, srcMeanA = 0, srcMeanB = 0;\n\t\t\t\tlet tgtMeanL = 0, tgtMeanA = 0, tgtMeanB = 0;\n\t\t\t\tconst srcLABs = [];\n\t\t\t\tconst tgtLABs = [];\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tconst sl = rgbToLab(...getPixelRGB(srcPixels, i, isBGRA));\n\t\t\t\t\tsrcLABs.push(sl);\n\t\t\t\t\tsrcMeanL += sl[0];\n\t\t\t\t\tsrcMeanA += sl[1];\n\t\t\t\t\tsrcMeanB += sl[2];\n\t\t\t\t\tconst tl = rgbToLab(...getPixelRGB(tgtPixels, i, isBGRA));\n\t\t\t\t\ttgtLABs.push(tl);\n\t\t\t\t\ttgtMeanL += tl[0];\n\t\t\t\t\ttgtMeanA += tl[1];\n\t\t\t\t\ttgtMeanB += tl[2];\n\t\t\t\t}\n\t\t\t\tsrcMeanL /= numPixels;\n\t\t\t\tsrcMeanA /= numPixels;\n\t\t\t\tsrcMeanB /= numPixels;\n\t\t\t\ttgtMeanL /= numPixels;\n\t\t\t\ttgtMeanA /= numPixels;\n\t\t\t\ttgtMeanB /= numPixels;\n\t\t\t\tlet srcStdL = 0, srcStdA = 0, srcStdB = 0;\n\t\t\t\tlet tgtStdL = 0, tgtStdA = 0, tgtStdB = 0;\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tsrcStdL += (srcLABs[i][0] - srcMeanL) ** 2;\n\t\t\t\t\tsrcStdA += (srcLABs[i][1] - srcMeanA) ** 2;\n\t\t\t\t\tsrcStdB += (srcLABs[i][2] - srcMeanB) ** 2;\n\t\t\t\t\ttgtStdL += (tgtLABs[i][0] - tgtMeanL) ** 2;\n\t\t\t\t\ttgtStdA += (tgtLABs[i][1] - tgtMeanA) ** 2;\n\t\t\t\t\ttgtStdB += (tgtLABs[i][2] - tgtMeanB) ** 2;\n\t\t\t\t}\n\t\t\t\tsrcStdL = Math.max(Math.sqrt(srcStdL / numPixels), 1e-6);\n\t\t\t\tsrcStdA = Math.max(Math.sqrt(srcStdA / numPixels), 1e-6);\n\t\t\t\tsrcStdB = Math.max(Math.sqrt(srcStdB / numPixels), 1e-6);\n\t\t\t\ttgtStdL = Math.sqrt(tgtStdL / numPixels);\n\t\t\t\ttgtStdA = Math.sqrt(tgtStdA / numPixels);\n\t\t\t\ttgtStdB = Math.sqrt(tgtStdB / numPixels);\n\t\t\t\tif (srcStdL < 1e-4 || srcMeanL < 1e-4) {\n\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\tflat[idx + 0] = r / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 1] = g / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 2] = b / (lutSize - 1);\n\t\t\t\t\t}\n\t\t\t\t} else flat = await evaluateStatisticalOnGpu(ctx.device, pipelines, [\n\t\t\t\t\tsrcMeanL,\n\t\t\t\t\tsrcMeanA,\n\t\t\t\t\tsrcMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtMeanL,\n\t\t\t\t\ttgtMeanA,\n\t\t\t\t\ttgtMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtStdL / srcStdL,\n\t\t\t\t\ttgtStdA / srcStdA,\n\t\t\t\t\ttgtStdB / srcStdB\n\t\t\t\t], lutSize);\n\t\t\t}\n\t\t\tconst smoothedPoints = flatToPoints(flat);\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, smoothedPoints, lutSize, \"3D\");\n\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[ExtractLUT] Async extraction error:\", err);\n\t\t\ttry {\n\t\t\t\tconst lutSize = 33;\n\t\t\t\tconst identityPoints = [];\n\t\t\t\tfor (let z = 0; z < lutSize; z++) for (let y = 0; y < lutSize; y++) for (let x = 0; x < lutSize; x++) identityPoints.push([\n\t\t\t\t\tx / (lutSize - 1),\n\t\t\t\t\ty / (lutSize - 1),\n\t\t\t\t\tz / (lutSize - 1)\n\t\t\t\t]);\n\t\t\t\tif (latestRequestedFingerprint.get(nodeId) === fingerprint) {\n\t\t\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, identityPoints, lutSize, \"3D\");\n\t\t\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t\t\t}\n\t\t\t} catch (fallbackErr) {\n\t\t\t\tconsole.error(\"[ExtractLUT] Failed to write fallback identity LUT:\", fallbackErr);\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, err);\n\t\t\t}\n\t\t} finally {\n\t\t\tpendingExtractions.delete(cacheKey);\n\t\t}\n\t})();\n\tpendingExtractions.set(cacheKey, extractionPromise);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractLutWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CDotFzd9.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BZMh2io2.mjs","names":[],"sources":["../../../nodes/node-extract-lut/dist/renderers-CDotFzd9.mjs"],"sourcesContent":["import { getFingerprint } from \"@framefields/core\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { lutStore } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst extractionCache = /* @__PURE__ */ new Map();\nconst pendingExtractions = /* @__PURE__ */ new Map();\nconst latestRequestedFingerprint = /* @__PURE__ */ new Map();\nconst activeTextures = /* @__PURE__ */ new Map();\nconst pipelineCache = /* @__PURE__ */ new WeakMap();\n/**\n* Lazily compiles and caches the two WGSL compute shaders per device.\n*\n* Both shaders write a flat array of f32 triples (R,G,B) for every cell of a\n* `lutSize³` cube. The host uploads whatever small set of parameters is needed\n* (RBF weights OR LAB statistics), then reads the result back as a typed array\n* that can be forwarded to `lutStore.createOrUpdate`.\n*\n* Workgroup size 8×8×4 = 256 threads maps cleanly onto lutSize=33 with\n* ceil(33/8)=5 groups on X/Y and ceil(33/4)=9 on Z → 5×5×9 = 225 dispatches.\n*/\nfunction getOrCreatePipelines(device) {\n\tconst cached = pipelineCache.get(device);\n\tif (cached) return cached;\n\tconst pipelines = {\n\t\trbf: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Params {\n\tlutSize : u32,\n\tnumSamples : u32,\n\tepsilonSq : f32,\n}\n\n@group(0) @binding(0) var<uniform> params : Params;\n@group(0) @binding(1) var<storage, read> srcPoints : array<vec4f>; // [numSamples]\n@group(0) @binding(2) var<storage, read> weights : array<vec4f>; // [numSamples]\n@group(0) @binding(3) var<storage, read> poly : array<vec4f>; // [4]\n@group(0) @binding(4) var<storage, read_write> lut : array<f32>; // [lutSize³ * 3]\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = params.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\tlet p = vec3f(inR, inG, inB);\n\n\t// Polynomial part: poly[0] + poly[1]*r + poly[2]*g + poly[3]*b\n\tvar out = poly[0].xyz + poly[1].xyz * inR + poly[2].xyz * inG + poly[3].xyz * inB;\n\n\t// RBF sum\n\tlet eps = params.epsilonSq;\n\tlet M = params.numSamples;\n\tvar minDistSq = 1e10;\n\tvar rbfSum = vec3f(0.0);\n\tfor (var i = 0u; i < M; i++) {\n\t\tlet d = p - srcPoints[i].xyz;\n\t\tlet dSq = dot(d, d);\n\t\tminDistSq = min(minDistSq, dSq);\n\t\tlet phi = sqrt(dSq + eps);\n\t\trbfSum += weights[i].xyz * phi;\n\t}\n\n\t// Smoothly fade out RBF weight contribution for regions far from samples\n\t// starts fading at distance 0.25 (dist^2 = 0.0625), fully faded at 0.5 (dist^2 = 0.25)\n\tlet rbfFade = clamp(1.0 - (minDistSq - 0.0625) / (0.25 - 0.0625), 0.0, 1.0);\n\tout += rbfSum * rbfFade;\n\n\t// Smoothly blend the entire mapping towards identity for regions extremely far from samples\n\t// starts blending at distance 0.35 (dist^2 = 0.1225), fully identity at 0.65 (dist^2 = 0.4225)\n\tlet identityBlend = clamp((minDistSq - 0.1225) / (0.4225 - 0.1225), 0.0, 1.0);\n\tout = mix(out, p, identityBlend);\n\n\t// Clamp + write\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = clamp(out.r, 0.0, 1.0);\n\tlut[cell + 1u] = clamp(out.g, 0.0, 1.0);\n\tlut[cell + 2u] = clamp(out.b, 0.0, 1.0);\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t}),\n\t\tstatistical: device.createComputePipeline({\n\t\t\tlayout: \"auto\",\n\t\t\tcompute: {\n\t\t\t\tmodule: device.createShaderModule({ code: `\nstruct Stats {\n\tsrcMean : vec4f, // (meanL, meanA, meanB, pad) of source\n\ttgtMean : vec4f, // (meanL, meanA, meanB, pad) of target\n\tscale : vec4f, // tgtStd / srcStd per channel\n\tlutSize : u32,\n}\n\n@group(0) @binding(0) var<uniform> stats : Stats;\n@group(0) @binding(1) var<storage, read_write> lut : array<f32>;\n\n// Constants matching the Reinhard/rgbToLab implementation\nconst INV_SQRT3 : f32 = 0.57735026919; // 1 / sqrt(3)\nconst INV_SQRT6 : f32 = 0.40824829046; // 1 / sqrt(6)\nconst INV_SQRT2 : f32 = 0.70710678118; // 1 / sqrt(2)\n\nfn safeLog10(v : f32) -> f32 {\n\treturn log(max(v, 1e-5)) * 0.43429448190; // log10(x) = ln(x) / ln(10)\n}\n\nfn rgbToLab(rgb : vec3f) -> vec3f {\n\tlet R = max(rgb.r, 1e-5);\n\tlet G = max(rgb.g, 1e-5);\n\tlet B = max(rgb.b, 1e-5);\n\n\tlet Lms_L = safeLog10(0.3811 * R + 0.5783 * G + 0.0402 * B);\n\tlet Lms_M = safeLog10(0.1967 * R + 0.7244 * G + 0.0782 * B);\n\tlet Lms_S = safeLog10(0.0241 * R + 0.1288 * G + 0.8444 * B);\n\n\treturn vec3f(\n\t\t(Lms_L + Lms_M + Lms_S) * INV_SQRT3,\n\t\t(Lms_L + Lms_M - 2.0 * Lms_S) * INV_SQRT6,\n\t\t(Lms_L - Lms_M) * INV_SQRT2,\n\t);\n}\n\nfn labToRgb(lab : vec3f) -> vec3f {\n\tlet l = lab.x; let a = lab.y; let b = lab.z;\n\n\tlet L_log = l * INV_SQRT3 + a * INV_SQRT6 + b * INV_SQRT2;\n\tlet M_log = l * INV_SQRT3 + a * INV_SQRT6 - b * INV_SQRT2;\n\tlet S_log = l * INV_SQRT3 - 2.0 * a * INV_SQRT6;\n\n\tlet L = pow(10.0, L_log);\n\tlet M = pow(10.0, M_log);\n\tlet S = pow(10.0, S_log);\n\n\treturn clamp(vec3f(\n\t\t 4.4679 * L - 3.5873 * M + 0.1193 * S,\n\t\t-1.2186 * L + 2.3809 * M - 0.1624 * S,\n\t\t 0.0497 * L - 0.2439 * M + 1.2045 * S,\n\t), vec3f(0.0), vec3f(1.0));\n}\n\n@compute @workgroup_size(8, 8, 4)\nfn main(@builtin(global_invocation_id) gid : vec3u) {\n\tlet lutSize = stats.lutSize;\n\tif (gid.x >= lutSize || gid.y >= lutSize || gid.z >= lutSize) { return; }\n\n\tlet inR = f32(gid.x) / f32(lutSize - 1u);\n\tlet inG = f32(gid.y) / f32(lutSize - 1u);\n\tlet inB = f32(gid.z) / f32(lutSize - 1u);\n\n\tlet lab = rgbToLab(vec3f(inR, inG, inB));\n\tlet mapped = stats.scale.xyz * (lab - stats.srcMean.xyz) + stats.tgtMean.xyz;\n\tlet rgb = labToRgb(mapped);\n\n\tlet cell = (gid.z * lutSize * lutSize + gid.y * lutSize + gid.x) * 3u;\n\tlut[cell + 0u] = rgb.r;\n\tlut[cell + 1u] = rgb.g;\n\tlut[cell + 2u] = rgb.b;\n}` }),\n\t\t\t\tentryPoint: \"main\"\n\t\t\t}\n\t\t})\n\t};\n\tpipelineCache.set(device, pipelines);\n\treturn pipelines;\n}\nfunction solveLU(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t;\n\t\t\t}\n\t\t\tfor (let col = 0; col < 3; col++) {\n\t\t\t\tconst i1 = i * 3 + col, i2 = pivotRow * 3 + col;\n\t\t\t\tconst t = B[i1];\n\t\t\t\tB[i1] = B[i2];\n\t\t\t\tB[i2] = t;\n\t\t\t}\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tfor (let col = 0; col < 3; col++) B[r * 3 + col] -= factor * B[i * 3 + col];\n\t\t}\n\t}\n\tconst X = new Float64Array(n * 3);\n\tfor (let col = 0; col < 3; col++) for (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i * 3 + col];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j * 3 + col];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i * 3 + col] = sum / denom;\n\t}\n\treturn X;\n}\nfunction hasAbsurdCoefficients(X_sol) {\n\tfor (let i = 0; i < X_sol.length; i++) {\n\t\tconst val = X_sol[i];\n\t\tif (Number.isNaN(val) || !Number.isFinite(val) || Math.abs(val) > 1e5) return true;\n\t}\n\treturn false;\n}\nfunction solveLU1D(A, B, n) {\n\tconst ipiv = new Int32Array(n);\n\tfor (let i = 0; i < n; i++) ipiv[i] = i;\n\tfor (let i = 0; i < n; i++) {\n\t\tlet maxVal = 0;\n\t\tlet pivotRow = i;\n\t\tfor (let r = i; r < n; r++) {\n\t\t\tconst val = Math.abs(A[r * n + i]);\n\t\t\tif (val > maxVal) {\n\t\t\t\tmaxVal = val;\n\t\t\t\tpivotRow = r;\n\t\t\t}\n\t\t}\n\t\tif (maxVal < 1e-9) return null;\n\t\telse if (pivotRow !== i) {\n\t\t\tconst tmp = ipiv[i];\n\t\t\tipiv[i] = ipiv[pivotRow];\n\t\t\tipiv[pivotRow] = tmp;\n\t\t\tfor (let col = 0; col < n; col++) {\n\t\t\t\tconst i1 = i * n + col, i2 = pivotRow * n + col;\n\t\t\t\tconst t$1 = A[i1];\n\t\t\t\tA[i1] = A[i2];\n\t\t\t\tA[i2] = t$1;\n\t\t\t}\n\t\t\tconst t = B[i];\n\t\t\tB[i] = B[pivotRow];\n\t\t\tB[pivotRow] = t;\n\t\t}\n\t\tconst pivot = A[i * n + i];\n\t\tif (Math.abs(pivot) < 1e-9) return null;\n\t\tfor (let r = i + 1; r < n; r++) {\n\t\t\tconst factor = A[r * n + i] / pivot;\n\t\t\tA[r * n + i] = 0;\n\t\t\tfor (let col = i + 1; col < n; col++) A[r * n + col] -= factor * A[i * n + col];\n\t\t\tB[r] -= factor * B[i];\n\t\t}\n\t}\n\tconst X = new Float64Array(n);\n\tfor (let i = n - 1; i >= 0; i--) {\n\t\tlet sum = B[i];\n\t\tfor (let j = i + 1; j < n; j++) sum -= A[i * n + j] * X[j];\n\t\tconst denom = A[i * n + i];\n\t\tif (Math.abs(denom) < 1e-9) return null;\n\t\tX[i] = sum / denom;\n\t}\n\treturn X;\n}\nfunction solve1DChannel(srcVals, tgtVals, epsilonSq) {\n\tconst M = srcVals.length;\n\tconst H = M + 2;\n\tconst K_mat = new Float64Array(H * H);\n\tconst B_rhs = new Float64Array(H);\n\tfor (let i = 0; i < M; i++) {\n\t\tconst xi = srcVals[i];\n\t\tB_rhs[i] = tgtVals[i];\n\t\tfor (let j = 0; j < M; j++) {\n\t\t\tconst dx = xi - srcVals[j];\n\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + epsilonSq);\n\t\t}\n\t\tK_mat[i * H + M + 0] = 1;\n\t\tK_mat[i * H + M + 1] = xi;\n\t\tK_mat[(M + 0) * H + i] = 1;\n\t\tK_mat[(M + 1) * H + i] = xi;\n\t}\n\tlet diagMean = 0;\n\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\tdiagMean /= M;\n\tconst lambda = Math.max(1e-4, diagMean * .01);\n\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\tfor (let k = 0; k < 2; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\treturn solveLU1D(K_mat, B_rhs, H);\n}\nfunction evaluate1DChannel(srcVals, X_sol, epsilonSq, lutSize) {\n\tconst M = srcVals.length;\n\tconst out = new Float32Array(lutSize);\n\tfor (let cell = 0; cell < lutSize; cell++) {\n\t\tconst p = cell / (lutSize - 1);\n\t\tlet minDistSq = 1e10;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tminDistSq = Math.min(minDistSq, dx * dx);\n\t\t}\n\t\tlet rbfSum = 0;\n\t\tfor (let i = 0; i < M; i++) {\n\t\t\tconst dx = p - srcVals[i];\n\t\t\tconst phi = Math.sqrt(dx * dx + epsilonSq);\n\t\t\trbfSum += X_sol[i] * phi;\n\t\t}\n\t\tconst rbfFade = Math.max(0, Math.min(1, 1 - (minDistSq - .0625) / .1875));\n\t\tlet val = X_sol[M + 0] + X_sol[M + 1] * p + rbfSum * rbfFade;\n\t\tconst identityBlend = Math.max(0, Math.min(1, (minDistSq - .1225) / .3));\n\t\tval = val * (1 - identityBlend) + p * identityBlend;\n\t\tout[cell] = Math.max(0, Math.min(1, val));\n\t}\n\treturn out;\n}\nfunction isSeparableOperationTree(vv, sourceMedia) {\n\tconst sourceFingerprint = getFingerprint(sourceMedia);\n\tlet current = vv;\n\twhile (current) {\n\t\tconst op = current.operation;\n\t\tif (!op) break;\n\t\tconst mediaToFingerprint = {\n\t\t\t...current,\n\t\t\tmetadata: {},\n\t\t\toperation: current.operation ? { ...current.operation } : void 0\n\t\t};\n\t\tif (mediaToFingerprint.operation) delete mediaToFingerprint.operation.lutUrl;\n\t\tif (getFingerprint(mediaToFingerprint) === sourceFingerprint) return true;\n\t\tif (op.op === \"source\") return false;\n\t\tif (op.op === \"Curves\") {\n\t\t\tif (op.curveType !== \"rgb\") return false;\n\t\t} else if (op.op === \"Levels\") {} else return false;\n\t\tif (current.children && current.children.length > 0) current = current.children[0];\n\t\telse break;\n\t}\n\treturn false;\n}\nfunction rgbToLab(r, g, b) {\n\tconst R = Math.max(1e-5, r), G = Math.max(1e-5, g), B = Math.max(1e-5, b);\n\tconst L = Math.log10(Math.max(1e-5, .3811 * R + .5783 * G + .0402 * B));\n\tconst M = Math.log10(Math.max(1e-5, .1967 * R + .7244 * G + .0782 * B));\n\tconst S = Math.log10(Math.max(1e-5, .0241 * R + .1288 * G + .8444 * B));\n\treturn [\n\t\t(L + M + S) / Math.sqrt(3),\n\t\t(L + M - 2 * S) / Math.sqrt(6),\n\t\t(L - M) / Math.sqrt(2)\n\t];\n}\nfunction getPixelRGB(pixels, idx, isBGRA) {\n\tconst o = idx * 4;\n\tconst rIdx = isBGRA ? o + 2 : o;\n\tconst bIdx = isBGRA ? o : o + 2;\n\treturn [\n\t\tpixels[rIdx] / 255,\n\t\tpixels[o + 1] / 255,\n\t\tpixels[bIdx] / 255\n\t];\n}\nfunction hashString(str) {\n\tlet hash = 5381;\n\tfor (let i = 0; i < str.length; i++) hash = hash * 33 ^ str.charCodeAt(i);\n\treturn hash >>> 0;\n}\nvar SeededRandom = class {\n\tstate;\n\tconstructor(seed) {\n\t\tthis.state = seed || 1;\n\t}\n\tnext() {\n\t\tthis.state = (this.state * 1664525 + 1013904223) % 4294967296;\n\t\treturn this.state / 4294967296;\n\t}\n};\nfunction seededShuffle(array, seed) {\n\tconst rng = new SeededRandom(seed);\n\tconst shuffled = [...array];\n\tfor (let i = shuffled.length - 1; i > 0; i--) {\n\t\tconst j = Math.floor(rng.next() * (i + 1));\n\t\tconst temp = shuffled[i];\n\t\tshuffled[i] = shuffled[j];\n\t\tshuffled[j] = temp;\n\t}\n\treturn shuffled;\n}\nfunction buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, gridResolution = 20) {\n\tconst occupied = /* @__PURE__ */ new Set();\n\tconst pool = [];\n\tconst numPixels = srcPixels.length / 4;\n\tfor (let i = 0; i < numPixels; i++) {\n\t\tconst src = getPixelRGB(srcPixels, i, isBGRA);\n\t\tconst r = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[0] * gridResolution)));\n\t\tconst g = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[1] * gridResolution)));\n\t\tconst b = Math.max(0, Math.min(gridResolution - 1, Math.floor(src[2] * gridResolution)));\n\t\tconst cellKey = r * gridResolution * gridResolution + g * gridResolution + b;\n\t\tif (!occupied.has(cellKey)) {\n\t\t\toccupied.add(cellKey);\n\t\t\tpool.push({\n\t\t\t\tsrc,\n\t\t\t\ttgt: getPixelRGB(tgtPixels, i, isBGRA)\n\t\t\t});\n\t\t}\n\t}\n\treturn pool;\n}\n/**\n* Evaluates the fitted RBF on the GPU.\n*\n* CPU work that remains:\n* • Build K matrix O(M²) – tiny (≈ 162×162)\n* • solveLU O(M³) – tiny\n*\n* GPU work (replaces the triple-nested JS loop):\n* • 33³ = 35 937 threads × M inner iterations → ~5.7 M parallel MADs\n*\n* Returns a plain Float32Array of length lutSize³×3 for lutStore.\n*/\nasync function evaluateRbfOnGpu(device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq) {\n\tconst M = sampledPoints.length;\n\tconst totalCells = lutSize * lutSize * lutSize;\n\tconst wgs = 8;\n\tconst srcPointsData = new Float32Array(M * 4);\n\tconst weightsData = new Float32Array(M * 4);\n\tfor (let i = 0; i < M; i++) {\n\t\tsrcPointsData[i * 4 + 0] = sampledPoints[i].src[0];\n\t\tsrcPointsData[i * 4 + 1] = sampledPoints[i].src[1];\n\t\tsrcPointsData[i * 4 + 2] = sampledPoints[i].src[2];\n\t\tsrcPointsData[i * 4 + 3] = 0;\n\t\tweightsData[i * 4 + 0] = X_sol[i * 3 + 0];\n\t\tweightsData[i * 4 + 1] = X_sol[i * 3 + 1];\n\t\tweightsData[i * 4 + 2] = X_sol[i * 3 + 2];\n\t\tweightsData[i * 4 + 3] = 0;\n\t}\n\tconst polyData = new Float32Array(16);\n\tfor (let k = 0; k < 4; k++) {\n\t\tpolyData[k * 4 + 0] = X_sol[(M + k) * 3 + 0];\n\t\tpolyData[k * 4 + 1] = X_sol[(M + k) * 3 + 1];\n\t\tpolyData[k * 4 + 2] = X_sol[(M + k) * 3 + 2];\n\t\tpolyData[k * 4 + 3] = 0;\n\t}\n\tconst paramsBuffer = device.createBuffer({\n\t\tsize: 16,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tconst paramsData = /* @__PURE__ */ new ArrayBuffer(16);\n\tnew Uint32Array(paramsData, 0, 2).set([lutSize, M]);\n\tnew Float32Array(paramsData, 8, 1).set([epsilonSq]);\n\tdevice.queue.writeBuffer(paramsBuffer, 0, paramsData);\n\tconst srcPointsBuf = upload(device, srcPointsData);\n\tconst weightsBuf = upload(device, weightsData);\n\tconst polyBuf = upload(device, polyData);\n\tconst lutByteSize = totalCells * 3 * 4;\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.rbf.getBindGroupLayout(0),\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: paramsBuffer }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: { buffer: srcPointsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: { buffer: weightsBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: { buffer: polyBuf }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: { buffer: lutBuf }\n\t\t\t}\n\t\t]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"rbf-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.rbf);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / wgs);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tparamsBuffer.destroy();\n\tsrcPointsBuf.destroy();\n\tweightsBuf.destroy();\n\tpolyBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/**\n* Generates the statistical LAB-transfer LUT entirely on the GPU.\n* The only CPU work is computing 6 scalars (mean/std per LAB channel).\n*/\nasync function evaluateStatisticalOnGpu(device, pipelines, srcMean, tgtMean, scale, lutSize) {\n\tconst lutByteSize = lutSize * lutSize * lutSize * 3 * 4;\n\tconst statsData = /* @__PURE__ */ new ArrayBuffer(64);\n\tconst f = new Float32Array(statsData);\n\tconst u = new Uint32Array(statsData);\n\tf[0] = srcMean[0];\n\tf[1] = srcMean[1];\n\tf[2] = srcMean[2];\n\tf[4] = tgtMean[0];\n\tf[5] = tgtMean[1];\n\tf[6] = tgtMean[2];\n\tf[8] = scale[0];\n\tf[9] = scale[1];\n\tf[10] = scale[2];\n\tu[12] = lutSize;\n\tconst statsBuf = device.createBuffer({\n\t\tsize: 64,\n\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(statsBuf, 0, statsData);\n\tconst lutBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC\n\t});\n\tconst readbackBuf = device.createBuffer({\n\t\tsize: lutByteSize,\n\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t});\n\tconst bg = device.createBindGroup({\n\t\tlayout: pipelines.statistical.getBindGroupLayout(0),\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: statsBuf }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: { buffer: lutBuf }\n\t\t}]\n\t});\n\tconst enc = device.createCommandEncoder({ label: \"stat-lut-eval\" });\n\tconst pass = enc.beginComputePass();\n\tpass.setPipeline(pipelines.statistical);\n\tpass.setBindGroup(0, bg);\n\tconst groups = Math.ceil(lutSize / 8);\n\tpass.dispatchWorkgroups(groups, groups, Math.ceil(lutSize / 4));\n\tpass.end();\n\tenc.copyBufferToBuffer(lutBuf, 0, readbackBuf, 0, lutByteSize);\n\tdevice.queue.submit([enc.finish()]);\n\tawait readbackBuf.mapAsync(GPUMapMode.READ);\n\tconst result = new Float32Array(readbackBuf.getMappedRange().slice(0));\n\treadbackBuf.unmap();\n\tstatsBuf.destroy();\n\tlutBuf.destroy();\n\treadbackBuf.destroy();\n\treturn result;\n}\n/** Uploads a Float32Array into a storage-readable GPUBuffer. */\nfunction upload(device, data) {\n\tconst buf = device.createBuffer({\n\t\tsize: Math.max(data.byteLength, 16),\n\t\tusage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST\n\t});\n\tdevice.queue.writeBuffer(buf, 0, data);\n\treturn buf;\n}\n/**\n* Converts a flat Float32Array [R0,G0,B0, R1,G1,B1 …] returned from the GPU\n* into the tuple array expected by `lutStore.createOrUpdate`.\n*/\nfunction flatToPoints(flat) {\n\tconst n = flat.length / 3;\n\tconst out = new Array(n);\n\tfor (let i = 0; i < n; i++) out[i] = [\n\t\tflat[i * 3],\n\t\tflat[i * 3 + 1],\n\t\tflat[i * 3 + 2]\n\t];\n\treturn out;\n}\nconst ExtractLutWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ExtractLUT\" || !op) return;\n\tconst nodeId = op.nodeId ?? props.renderId;\n\tconst mediaToFingerprint = {\n\t\t...props.virtualMedia,\n\t\tmetadata: {},\n\t\toperation: props.virtualMedia?.operation ? { ...props.virtualMedia.operation } : void 0\n\t};\n\tif (mediaToFingerprint.operation) {\n\t\tdelete mediaToFingerprint.operation.lutUrl;\n\t\tdelete mediaToFingerprint.operation.timeline;\n\t\tdelete mediaToFingerprint.operation.startFrame;\n\t}\n\tconst lutUrl = op.lutUrl ?? `runtime://lut/extract-lut-${nodeId}-${getFingerprint(mediaToFingerprint)}`;\n\tconst fingerprint = lutUrl.startsWith(`runtime://lut/extract-lut-${nodeId}-`) ? lutUrl.slice(`runtime://lut/extract-lut-${nodeId}-`.length) : getFingerprint(mediaToFingerprint);\n\tconst cacheKey = `${nodeId}-${fingerprint}`;\n\tconst sourceMedia = props.virtualMedia?.children?.[0];\n\tconst targetMedia = props.virtualMedia?.children?.[1];\n\tif (!sourceMedia || !targetMedia) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tconst strategy = op.strategy ?? \"deterministic\";\n\tconst samplePoints = op.samplePoints ?? 150;\n\tconst gridSize = 64;\n\tconst numPixels = gridSize * gridSize;\n\tif (extractionCache.get(nodeId) === fingerprint && lutStore.get(lutUrl, ctx.device)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tif (pendingExtractions.has(cacheKey)) {\n\t\tpass.end();\n\t\treturn;\n\t}\n\tlatestRequestedFingerprint.set(nodeId, fingerprint);\n\tpass.end();\n\tlutStore.getOrLoad(lutUrl, ctx.device);\n\tconst prev = activeTextures.get(nodeId);\n\tif (prev) {\n\t\tconst toDestroy = prev;\n\t\tctx.device.queue.onSubmittedWorkDone().then(() => {\n\t\t\ttry {\n\t\t\t\ttoDestroy.srcTex.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\ttoDestroy.tgtTex.destroy();\n\t\t\t} catch {}\n\t\t});\n\t\tactiveTextures.delete(nodeId);\n\t}\n\tconst srcTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-src-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tctx.renderer.beginFrame(encoder, srcTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c0`,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, srcTex.createView(), srcTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst tgtTex = ctx.device.createTexture({\n\t\tlabel: `ExtractLUT-tgt-grid-${nodeId}`,\n\t\tsize: [gridSize, gridSize],\n\t\tformat: ctx.renderer.format,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t});\n\tactiveTextures.set(nodeId, {\n\t\tsrcTex,\n\t\ttgtTex\n\t});\n\tctx.renderer.beginFrame(encoder, tgtTex.createView(), {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 1\n\t}, gridSize, gridSize, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: gridSize,\n\t\theight: gridSize\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(targetMedia, {\n\t\t...props,\n\t\trenderId: `${nodeId}-c1`,\n\t\tvirtualMedia: targetMedia,\n\t\tcontainerWidth: gridSize,\n\t\tcontainerHeight: gridSize,\n\t\tforceWait: true\n\t}, tgtTex.createView(), tgtTex, gridSize, gridSize);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst bytesPerPixel = 4;\n\tconst align = 256;\n\tconst unpaddedBPR = gridSize * bytesPerPixel;\n\tconst bytesPerRow = Math.ceil(unpaddedBPR / align) * align;\n\tconst stagingSize = bytesPerRow * gridSize;\n\tconst srcStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-src-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tconst tgtStagingBuffer = ctx.device.createBuffer({\n\t\tlabel: `ExtractLUT-tgt-staging-${nodeId}`,\n\t\tsize: stagingSize,\n\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t});\n\tencoder.copyTextureToBuffer({ texture: srcTex }, {\n\t\tbuffer: srcStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tencoder.copyTextureToBuffer({ texture: tgtTex }, {\n\t\tbuffer: tgtStagingBuffer,\n\t\tbytesPerRow\n\t}, [gridSize, gridSize]);\n\tlet startMapping = () => {};\n\tconst mainSubmitPromise = new Promise((resolve) => {\n\t\tstartMapping = resolve;\n\t});\n\tconst originalSubmit = ctx.device.queue.submit;\n\tctx.device.queue.submit = function(commandBuffers) {\n\t\tctx.device.queue.submit = originalSubmit;\n\t\toriginalSubmit.call(this, commandBuffers);\n\t\tstartMapping();\n\t};\n\tconst extractionPromise = (async () => {\n\t\ttry {\n\t\t\tawait mainSubmitPromise;\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\ttry {\n\t\t\t\t\tsrcStagingBuffer.destroy();\n\t\t\t\t\ttgtStagingBuffer.destroy();\n\t\t\t\t} catch {}\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait ctx.device.queue.onSubmittedWorkDone();\n\t\t\tawait Promise.all([srcStagingBuffer.mapAsync(GPUMapMode.READ), tgtStagingBuffer.mapAsync(GPUMapMode.READ)]);\n\t\t\tconst srcPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst tgtPixels = new Uint8Array(numPixels * bytesPerPixel);\n\t\t\tconst copyRows = (src, dst) => {\n\t\t\t\tif (bytesPerRow === unpaddedBPR) dst.set(src);\n\t\t\t\telse for (let y = 0; y < gridSize; y++) dst.set(src.subarray(y * bytesPerRow, y * bytesPerRow + unpaddedBPR), y * unpaddedBPR);\n\t\t\t};\n\t\t\tcopyRows(new Uint8Array(srcStagingBuffer.getMappedRange()), srcPixels);\n\t\t\tcopyRows(new Uint8Array(tgtStagingBuffer.getMappedRange()), tgtPixels);\n\t\t\tsrcStagingBuffer.unmap();\n\t\t\tsrcStagingBuffer.destroy();\n\t\t\ttgtStagingBuffer.unmap();\n\t\t\ttgtStagingBuffer.destroy();\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superceded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst isBGRA = ctx.renderer.format === \"bgra8unorm\" || ctx.renderer.format === \"bgra8unorm-srgb\";\n\t\t\tconst lutSize = 33;\n\t\t\tconst pipelines = getOrCreatePipelines(ctx.device);\n\t\t\tlet flat = null;\n\t\t\tlet succeeded = false;\n\t\t\tif (strategy === \"deterministic\") {\n\t\t\t\tconst shuffled = seededShuffle(buildUniqueColorPool(srcPixels, tgtPixels, isBGRA, 20), hashString(getFingerprint({\n\t\t\t\t\t...props.virtualMedia,\n\t\t\t\t\tmetadata: {},\n\t\t\t\t\toperation: void 0\n\t\t\t\t})));\n\t\t\t\tconst sampledPoints = shuffled.slice(0, Math.min(shuffled.length, samplePoints));\n\t\t\t\tconst M = sampledPoints.length;\n\t\t\t\tif (M >= 8) {\n\t\t\t\t\tif (isSeparableOperationTree(targetMedia, sourceMedia)) {\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst srcR = sampledPoints.map((p) => p.src[0]);\n\t\t\t\t\t\tconst tgtR = sampledPoints.map((p) => p.tgt[0]);\n\t\t\t\t\t\tconst srcG = sampledPoints.map((p) => p.src[1]);\n\t\t\t\t\t\tconst tgtG = sampledPoints.map((p) => p.tgt[1]);\n\t\t\t\t\t\tconst srcB = sampledPoints.map((p) => p.src[2]);\n\t\t\t\t\t\tconst tgtB = sampledPoints.map((p) => p.tgt[2]);\n\t\t\t\t\t\tconst X_sol_R = solve1DChannel(srcR, tgtR, epsilonSq);\n\t\t\t\t\t\tconst X_sol_G = solve1DChannel(srcG, tgtG, epsilonSq);\n\t\t\t\t\t\tconst X_sol_B = solve1DChannel(srcB, tgtB, epsilonSq);\n\t\t\t\t\t\tif (X_sol_R && !hasAbsurdCoefficients(X_sol_R) && X_sol_G && !hasAbsurdCoefficients(X_sol_G) && X_sol_B && !hasAbsurdCoefficients(X_sol_B)) {\n\t\t\t\t\t\t\tconst lutR = evaluate1DChannel(srcR, X_sol_R, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutG = evaluate1DChannel(srcG, X_sol_G, epsilonSq, lutSize);\n\t\t\t\t\t\t\tconst lutB = evaluate1DChannel(srcB, X_sol_B, epsilonSq, lutSize);\n\t\t\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\t\t\tflat[idx + 0] = lutR[r];\n\t\t\t\t\t\t\t\tflat[idx + 1] = lutG[g];\n\t\t\t\t\t\t\t\tflat[idx + 2] = lutB[b];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsucceeded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!succeeded) {\n\t\t\t\t\t\tconst H = M + 4;\n\t\t\t\t\t\tlet epsilonSq = .01;\n\t\t\t\t\t\tlet totalMinDist = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tlet minD = Infinity;\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tif (i === j) continue;\n\t\t\t\t\t\t\t\tconst dx = sampledPoints[i].src[0] - sampledPoints[j].src[0];\n\t\t\t\t\t\t\t\tconst dy = sampledPoints[i].src[1] - sampledPoints[j].src[1];\n\t\t\t\t\t\t\t\tconst dz = sampledPoints[i].src[2] - sampledPoints[j].src[2];\n\t\t\t\t\t\t\t\tminD = Math.min(minD, dx * dx + dy * dy + dz * dz);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttotalMinDist += Math.sqrt(minD);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst meanNND = totalMinDist / M;\n\t\t\t\t\t\tepsilonSq = Math.max(meanNND * meanNND * 4, 1e-4);\n\t\t\t\t\t\tconst K_mat = new Float64Array(H * H);\n\t\t\t\t\t\tconst B_rhs = new Float64Array(H * 3);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) {\n\t\t\t\t\t\t\tconst pi = sampledPoints[i].src;\n\t\t\t\t\t\t\tconst gi = sampledPoints[i].tgt;\n\t\t\t\t\t\t\tB_rhs[i * 3 + 0] = gi[0];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 1] = gi[1];\n\t\t\t\t\t\t\tB_rhs[i * 3 + 2] = gi[2];\n\t\t\t\t\t\t\tfor (let j = 0; j < M; j++) {\n\t\t\t\t\t\t\t\tconst pj = sampledPoints[j].src;\n\t\t\t\t\t\t\t\tconst dx = pi[0] - pj[0], dy = pi[1] - pj[1], dz = pi[2] - pj[2];\n\t\t\t\t\t\t\t\tK_mat[i * H + j] = Math.sqrt(dx * dx + dy * dy + dz * dz + epsilonSq);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tK_mat[i * H + M + 0] = 1;\n\t\t\t\t\t\t\tK_mat[i * H + M + 1] = pi[0];\n\t\t\t\t\t\t\tK_mat[i * H + M + 2] = pi[1];\n\t\t\t\t\t\t\tK_mat[i * H + M + 3] = pi[2];\n\t\t\t\t\t\t\tK_mat[(M + 0) * H + i] = 1;\n\t\t\t\t\t\t\tK_mat[(M + 1) * H + i] = pi[0];\n\t\t\t\t\t\t\tK_mat[(M + 2) * H + i] = pi[1];\n\t\t\t\t\t\t\tK_mat[(M + 3) * H + i] = pi[2];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet diagMean = 0;\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) diagMean += K_mat[i * H + i];\n\t\t\t\t\t\tdiagMean /= M;\n\t\t\t\t\t\tconst lambda = Math.max(1e-4, diagMean * .01);\n\t\t\t\t\t\tfor (let i = 0; i < M; i++) K_mat[i * H + i] += lambda;\n\t\t\t\t\t\tconst polyLambda = Math.max(1e-4, diagMean * .001);\n\t\t\t\t\t\tfor (let k = 0; k < 4; k++) K_mat[(M + k) * H + M + k] = polyLambda;\n\t\t\t\t\t\tconst X_sol = solveLU(K_mat, B_rhs, H);\n\t\t\t\t\t\tif (X_sol && !hasAbsurdCoefficients(X_sol)) try {\n\t\t\t\t\t\t\tflat = await evaluateRbfOnGpu(ctx.device, pipelines, sampledPoints, X_sol, lutSize, epsilonSq);\n\t\t\t\t\t\t\tlet hasInvalid = false;\n\t\t\t\t\t\t\tfor (let i = 0; i < flat.length; i++) {\n\t\t\t\t\t\t\t\tconst val = flat[i];\n\t\t\t\t\t\t\t\tif (Number.isNaN(val) || !Number.isFinite(val)) {\n\t\t\t\t\t\t\t\t\thasInvalid = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!hasInvalid) succeeded = true;\n\t\t\t\t\t\t} catch (gpuErr) {\n\t\t\t\t\t\t\tconsole.error(\"[ExtractLUT] RBF GPU evaluation failed:\", gpuErr);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!succeeded) {\n\t\t\t\tlet srcMeanL = 0, srcMeanA = 0, srcMeanB = 0;\n\t\t\t\tlet tgtMeanL = 0, tgtMeanA = 0, tgtMeanB = 0;\n\t\t\t\tconst srcLABs = [];\n\t\t\t\tconst tgtLABs = [];\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tconst sl = rgbToLab(...getPixelRGB(srcPixels, i, isBGRA));\n\t\t\t\t\tsrcLABs.push(sl);\n\t\t\t\t\tsrcMeanL += sl[0];\n\t\t\t\t\tsrcMeanA += sl[1];\n\t\t\t\t\tsrcMeanB += sl[2];\n\t\t\t\t\tconst tl = rgbToLab(...getPixelRGB(tgtPixels, i, isBGRA));\n\t\t\t\t\ttgtLABs.push(tl);\n\t\t\t\t\ttgtMeanL += tl[0];\n\t\t\t\t\ttgtMeanA += tl[1];\n\t\t\t\t\ttgtMeanB += tl[2];\n\t\t\t\t}\n\t\t\t\tsrcMeanL /= numPixels;\n\t\t\t\tsrcMeanA /= numPixels;\n\t\t\t\tsrcMeanB /= numPixels;\n\t\t\t\ttgtMeanL /= numPixels;\n\t\t\t\ttgtMeanA /= numPixels;\n\t\t\t\ttgtMeanB /= numPixels;\n\t\t\t\tlet srcStdL = 0, srcStdA = 0, srcStdB = 0;\n\t\t\t\tlet tgtStdL = 0, tgtStdA = 0, tgtStdB = 0;\n\t\t\t\tfor (let i = 0; i < numPixels; i++) {\n\t\t\t\t\tsrcStdL += (srcLABs[i][0] - srcMeanL) ** 2;\n\t\t\t\t\tsrcStdA += (srcLABs[i][1] - srcMeanA) ** 2;\n\t\t\t\t\tsrcStdB += (srcLABs[i][2] - srcMeanB) ** 2;\n\t\t\t\t\ttgtStdL += (tgtLABs[i][0] - tgtMeanL) ** 2;\n\t\t\t\t\ttgtStdA += (tgtLABs[i][1] - tgtMeanA) ** 2;\n\t\t\t\t\ttgtStdB += (tgtLABs[i][2] - tgtMeanB) ** 2;\n\t\t\t\t}\n\t\t\t\tsrcStdL = Math.max(Math.sqrt(srcStdL / numPixels), 1e-6);\n\t\t\t\tsrcStdA = Math.max(Math.sqrt(srcStdA / numPixels), 1e-6);\n\t\t\t\tsrcStdB = Math.max(Math.sqrt(srcStdB / numPixels), 1e-6);\n\t\t\t\ttgtStdL = Math.sqrt(tgtStdL / numPixels);\n\t\t\t\ttgtStdA = Math.sqrt(tgtStdA / numPixels);\n\t\t\t\ttgtStdB = Math.sqrt(tgtStdB / numPixels);\n\t\t\t\tif (srcStdL < 1e-4 || srcMeanL < 1e-4) {\n\t\t\t\t\tflat = new Float32Array(lutSize * lutSize * lutSize * 3);\n\t\t\t\t\tfor (let b = 0; b < lutSize; b++) for (let g = 0; g < lutSize; g++) for (let r = 0; r < lutSize; r++) {\n\t\t\t\t\t\tconst idx = (b * lutSize * lutSize + g * lutSize + r) * 3;\n\t\t\t\t\t\tflat[idx + 0] = r / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 1] = g / (lutSize - 1);\n\t\t\t\t\t\tflat[idx + 2] = b / (lutSize - 1);\n\t\t\t\t\t}\n\t\t\t\t} else flat = await evaluateStatisticalOnGpu(ctx.device, pipelines, [\n\t\t\t\t\tsrcMeanL,\n\t\t\t\t\tsrcMeanA,\n\t\t\t\t\tsrcMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtMeanL,\n\t\t\t\t\ttgtMeanA,\n\t\t\t\t\ttgtMeanB\n\t\t\t\t], [\n\t\t\t\t\ttgtStdL / srcStdL,\n\t\t\t\t\ttgtStdA / srcStdA,\n\t\t\t\t\ttgtStdB / srcStdB\n\t\t\t\t], lutSize);\n\t\t\t}\n\t\t\tconst smoothedPoints = flatToPoints(flat);\n\t\t\tif (latestRequestedFingerprint.get(nodeId) !== fingerprint) {\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, new DOMException(\"Extraction superseded by a newer request\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, smoothedPoints, lutSize, \"3D\");\n\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t} catch (err) {\n\t\t\tconsole.error(\"[ExtractLUT] Async extraction error:\", err);\n\t\t\ttry {\n\t\t\t\tconst lutSize = 33;\n\t\t\t\tconst identityPoints = [];\n\t\t\t\tfor (let z = 0; z < lutSize; z++) for (let y = 0; y < lutSize; y++) for (let x = 0; x < lutSize; x++) identityPoints.push([\n\t\t\t\t\tx / (lutSize - 1),\n\t\t\t\t\ty / (lutSize - 1),\n\t\t\t\t\tz / (lutSize - 1)\n\t\t\t\t]);\n\t\t\t\tif (latestRequestedFingerprint.get(nodeId) === fingerprint) {\n\t\t\t\t\tlutStore.createOrUpdate(lutUrl, ctx.device, identityPoints, lutSize, \"3D\");\n\t\t\t\t\textractionCache.set(nodeId, fingerprint);\n\t\t\t\t}\n\t\t\t} catch (fallbackErr) {\n\t\t\t\tconsole.error(\"[ExtractLUT] Failed to write fallback identity LUT:\", fallbackErr);\n\t\t\t\tlutStore.rejectRawDataPromise(lutUrl, err);\n\t\t\t}\n\t\t} finally {\n\t\t\tpendingExtractions.delete(cacheKey);\n\t\t}\n\t})();\n\tpendingExtractions.set(cacheKey, extractionPromise);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractLutWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CDotFzd9.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { c as resolveHandleParam, n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BSKAbyea.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CWjgql4C.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-D2HT3KcE.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-high-pass/dist/renderers-DUL8Peaw.mjs
@@ -253,4 +253,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
253
253
 
254
254
  //#endregion
255
255
  export { renderers_default as t };
256
- //# sourceMappingURL=renderer-BZgJj8Cl.mjs.map
256
+ //# sourceMappingURL=renderer-BZX932Lj.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BZgJj8Cl.mjs","names":[],"sources":["../../../nodes/node-high-pass/dist/renderers-DUL8Peaw.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst highPassConfig = configBuilder().field(\"radius\", z.number().min(.1).max(MAX_RADIUS).default(3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Radius Signal\",\n\tdescription: \"The cutoff radius in pixels. Frequencies smaller than this radius are preserved.\"\n}).field(\"contrastBoost\", z.number().multipleOf(.01).min(1).max(10).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Contrast Boost Signal\",\n\tdescription: \"Multiplier applied to the extracted high-frequency detail delta.\"\n}).field(\"monochrome\", z.boolean().default(true), { description: \"When enabled, high-pass delta is converted to luminance before centering on 50% neutral gray.\" }).build();\nconst HighPassNodeConfigSchema = highPassConfig.schema;\nconst HighPassResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst HIGH_PASS_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HIGHPASS_UNIFORMS = `\nstruct HighPassUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tradius : f32,\n\tcontrastBoost : f32,\n\n\tmonochrome : f32,\n\thasRadiusSig : f32,\n\thasContrastSig : f32,\n\tisSecondPass : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HighPassUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(1) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(2) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tvar radius = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar contrastBoost = u.contrastBoost;\n\tif (u.hasContrastSig > 0.5) {\n\t\tcontrastBoost = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet origCol = textureSampleLevel(origTex, samp, in.uv, 0.0);\n\tif (radius <= 0.0) {\n\t\tif (u.isSecondPass > 0.5) {\n\t\t\treturn vec4<f32>(vec3<f32>(0.5) * origCol.a, origCol.a);\n\t\t}\n\t\treturn origCol;\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet spatial_sigma = radius;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar blurred = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\tlet x = f32(i) * stepScale;\n\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\tblurred += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurResult = blurred / max(totalWeight, 1e-5);\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// Pass 1: Intermediate horizontal blur\n\t\treturn blurResult;\n\t}\n\n\t// Pass 2: Vertical blur complete -> Calculate High Pass difference against original\n\tif (origCol.a < 1e-5) {\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t}\n\n\tlet origUnpremult = origCol.rgb / origCol.a;\n\tlet blurUnpremult = blurResult.rgb / max(blurResult.a, 1e-5);\n\tlet diff = origUnpremult - blurUnpremult;\n\n\tvar highPassRgb : vec3<f32>;\n\tif (u.monochrome > 0.5) {\n\t\tlet lumaDiff = dot(diff, vec3<f32>(0.2126, 0.7152, 0.0722));\n\t\thighPassRgb = vec3<f32>(0.5) + vec3<f32>(lumaDiff * contrastBoost);\n\t} else {\n\t\thighPassRgb = vec3<f32>(0.5) + diff * contrastBoost;\n\t}\n\n\tlet clampedRgb = clamp(highPassRgb, vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(clampedRgb * origCol.a, origCol.a);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst highPassUniformData = new Float32Array(8);\nfunction getHighPassResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst highPassUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst singleTextureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tconst signalTextureLayout = texturesLayout(device, 2);\n\tconst res = {\n\t\thighPassUniformLayout,\n\t\tsingleTextureLayout,\n\t\tsignalTextureLayout,\n\t\thighPassPipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_HIGHPASS_UNIFORMS }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\thighPassUniformLayout,\n\t\t\t\tsingleTextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"HighPass\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"highpass_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst radiusRes = resolveField(op.radiusHandleId, Number(op.radius ?? 3), .1, MAX_RADIUS);\n\tconst contrastRes = resolveField(op.contrastBoostHandleId, Number(op.contrastBoost ?? 1), 1, 10);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { highPassPipeline: pipeline, highPassUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHighPassResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst createHighPassBindGroup1 = (inputTex, origTexture) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTexture.createView()\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[2] = radiusRes.val;\n\thighPassUniformData[3] = contrastRes.val;\n\thighPassUniformData[4] = op.monochrome ?? true ? 1 : 0;\n\thighPassUniformData[5] = radiusRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[6] = contrastRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[7] = 0;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: contrastView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[0] = 1;\n\thighPassUniformData[1] = 0;\n\thighPassUniformData[7] = 0;\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(tmpTex, tmpTex),\n\t\tsigBindGroup\n\t]);\n\thighPassUniformData[0] = 0;\n\thighPassUniformData[1] = 1;\n\thighPassUniformData[7] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(outTex1, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, HighPassResultSchema as i, HIGH_PASS_OUTPUT_TYPE_MAP as n, highPassConfig as o, HighPassNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-DUL8Peaw.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BZX932Lj.mjs","names":[],"sources":["../../../nodes/node-high-pass/dist/renderers-DUL8Peaw.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst highPassConfig = configBuilder().field(\"radius\", z.number().min(.1).max(MAX_RADIUS).default(3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Radius Signal\",\n\tdescription: \"The cutoff radius in pixels. Frequencies smaller than this radius are preserved.\"\n}).field(\"contrastBoost\", z.number().multipleOf(.01).min(1).max(10).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Contrast Boost Signal\",\n\tdescription: \"Multiplier applied to the extracted high-frequency detail delta.\"\n}).field(\"monochrome\", z.boolean().default(true), { description: \"When enabled, high-pass delta is converted to luminance before centering on 50% neutral gray.\" }).build();\nconst HighPassNodeConfigSchema = highPassConfig.schema;\nconst HighPassResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst HIGH_PASS_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HIGHPASS_UNIFORMS = `\nstruct HighPassUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tradius : f32,\n\tcontrastBoost : f32,\n\n\tmonochrome : f32,\n\thasRadiusSig : f32,\n\thasContrastSig : f32,\n\tisSecondPass : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HighPassUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(1) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(2) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tvar radius = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar contrastBoost = u.contrastBoost;\n\tif (u.hasContrastSig > 0.5) {\n\t\tcontrastBoost = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet origCol = textureSampleLevel(origTex, samp, in.uv, 0.0);\n\tif (radius <= 0.0) {\n\t\tif (u.isSecondPass > 0.5) {\n\t\t\treturn vec4<f32>(vec3<f32>(0.5) * origCol.a, origCol.a);\n\t\t}\n\t\treturn origCol;\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet spatial_sigma = radius;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar blurred = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\tlet x = f32(i) * stepScale;\n\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\tblurred += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurResult = blurred / max(totalWeight, 1e-5);\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// Pass 1: Intermediate horizontal blur\n\t\treturn blurResult;\n\t}\n\n\t// Pass 2: Vertical blur complete -> Calculate High Pass difference against original\n\tif (origCol.a < 1e-5) {\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t}\n\n\tlet origUnpremult = origCol.rgb / origCol.a;\n\tlet blurUnpremult = blurResult.rgb / max(blurResult.a, 1e-5);\n\tlet diff = origUnpremult - blurUnpremult;\n\n\tvar highPassRgb : vec3<f32>;\n\tif (u.monochrome > 0.5) {\n\t\tlet lumaDiff = dot(diff, vec3<f32>(0.2126, 0.7152, 0.0722));\n\t\thighPassRgb = vec3<f32>(0.5) + vec3<f32>(lumaDiff * contrastBoost);\n\t} else {\n\t\thighPassRgb = vec3<f32>(0.5) + diff * contrastBoost;\n\t}\n\n\tlet clampedRgb = clamp(highPassRgb, vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(clampedRgb * origCol.a, origCol.a);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst highPassUniformData = new Float32Array(8);\nfunction getHighPassResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst highPassUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst singleTextureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tconst signalTextureLayout = texturesLayout(device, 2);\n\tconst res = {\n\t\thighPassUniformLayout,\n\t\tsingleTextureLayout,\n\t\tsignalTextureLayout,\n\t\thighPassPipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_HIGHPASS_UNIFORMS }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\thighPassUniformLayout,\n\t\t\t\tsingleTextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"HighPass\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"highpass_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst radiusRes = resolveField(op.radiusHandleId, Number(op.radius ?? 3), .1, MAX_RADIUS);\n\tconst contrastRes = resolveField(op.contrastBoostHandleId, Number(op.contrastBoost ?? 1), 1, 10);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { highPassPipeline: pipeline, highPassUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHighPassResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst createHighPassBindGroup1 = (inputTex, origTexture) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTexture.createView()\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[2] = radiusRes.val;\n\thighPassUniformData[3] = contrastRes.val;\n\thighPassUniformData[4] = op.monochrome ?? true ? 1 : 0;\n\thighPassUniformData[5] = radiusRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[6] = contrastRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[7] = 0;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: contrastView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[0] = 1;\n\thighPassUniformData[1] = 0;\n\thighPassUniformData[7] = 0;\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(tmpTex, tmpTex),\n\t\tsigBindGroup\n\t]);\n\thighPassUniformData[0] = 0;\n\thighPassUniformData[1] = 1;\n\thighPassUniformData[7] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(outTex1, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, HighPassResultSchema as i, HIGH_PASS_OUTPUT_TYPE_MAP as n, highPassConfig as o, HighPassNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-DUL8Peaw.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-DOL2i2sR.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
- import "./dist-D3BeAZ7X.mjs";
4
- import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CWjgql4C.mjs";
3
+ import "./dist-DtPPPsZV.mjs";
4
+ import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-D2HT3KcE.mjs";
5
5
  import { i as OpticalFlowComputePipeline } from "./dist-DgZpN6IK.mjs";
6
6
 
7
7
  //#region ../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs
@@ -205,4 +205,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer
205
205
 
206
206
  //#endregion
207
207
  export { DatamoshWebGPURenderer, renderers_default as default };
208
- //# sourceMappingURL=renderer-BgjPbgbn.mjs.map
208
+ //# sourceMappingURL=renderer-BhcTYhaP.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BgjPbgbn.mjs","names":[],"sources":["../../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\nimport { OpticalFlowComputePipeline } from \"@framefields/tensor-webgpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst MOSH_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var moshTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var flowTex : texture_2d<f32>;\n@group(0) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet strength = u.a.x;\n\tlet bleed = u.a.y;\n\tlet inv = u.a.zw;\n\tlet cur0 = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (u.b.x > 0.5) { return cur0; }\n\tlet dims = vec2<f32>(textureDimensions(flowTex));\n\tlet coord = vec2<i32>(clamp(in.uv * dims, vec2<f32>(0.0), dims - 1.0));\n\tlet flow = textureLoad(flowTex, coord, 0).xy;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\t// The old picture moves with the new motion instead of being replaced.\n\tlet moved = textureSampleLevel(moshTex, samp, clamp(in.uv - flow * inv * strength, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\tvar out = mix(moved, cur, bleed);\n\tif (moved.a < 0.01) { out = cur; }\n\treturn out;\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"datamosh_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: MOSH_WGSL,\n\t\tlabel: \"datamosh.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"datamosh\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tflow: new OpticalFlowComputePipeline(device),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height, format) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\th?.prev?.destroy();\n\tconst make = (label, fmt) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: fmt,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"feedback_front\", HISTORY_FORMAT),\n\t\tback: make(\"feedback_back\", HISTORY_FORMAT),\n\t\tprev: make(\"feedback_prev\", format),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [\n\t\t\th.front,\n\t\t\th.back,\n\t\t\t...h.prev ? [h.prev] : []\n\t\t],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepDatamosh(args, h, v, frame, compositionStart, key) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur || !h.prev) return;\n\tconst r = resources(args.ctx.device);\n\tconst { encoder } = args;\n\tconst clean = key || h.frame < 0;\n\tconst flow = clean ? cur.texture : r.flow.execute(h.prev, cur.texture, {}, encoder);\n\tconst uniforms = new Float32Array([\n\t\tv.strength,\n\t\tv.bleed,\n\t\t1 / h.width,\n\t\t1 / h.height,\n\t\tclean ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t]);\n\tdrawFullscreenPass(encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: flow.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tencoder.copyTextureToTexture({ texture: cur.texture }, { texture: h.prev }, [\n\t\th.width,\n\t\th.height,\n\t\t1\n\t]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst DatamoshWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Datamosh\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight, ctx.renderer.format);\n\t{\n\t\tconst v = {\n\t\t\tkeyframes: Array.isArray(raw.keyframes) ? raw.keyframes.map(Math.round) : [],\n\t\t\tstrength: num(raw.strength, 1),\n\t\t\tbleed: Math.min(1, Math.max(0, num(raw.bleed, 0))),\n\t\t\twarmup: Math.max(1, Math.round(num(raw.warmup, 48)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame !== local - 1) {\n\t\t\t\tconst lastKey = Math.max(0, ...v.keyframes.filter((k) => k <= local));\n\t\t\t\tstart = Math.max(lastKey, local - v.warmup);\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepDatamosh(args, h, v, f, compositionStart, f === 0 || v.keyframes.includes(f) || h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer });\n\n//#endregion\nexport { DatamoshWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D-M1-_H_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BhcTYhaP.mjs","names":[],"sources":["../../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\nimport { OpticalFlowComputePipeline } from \"@framefields/tensor-webgpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst MOSH_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var moshTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var flowTex : texture_2d<f32>;\n@group(0) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet strength = u.a.x;\n\tlet bleed = u.a.y;\n\tlet inv = u.a.zw;\n\tlet cur0 = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (u.b.x > 0.5) { return cur0; }\n\tlet dims = vec2<f32>(textureDimensions(flowTex));\n\tlet coord = vec2<i32>(clamp(in.uv * dims, vec2<f32>(0.0), dims - 1.0));\n\tlet flow = textureLoad(flowTex, coord, 0).xy;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\t// The old picture moves with the new motion instead of being replaced.\n\tlet moved = textureSampleLevel(moshTex, samp, clamp(in.uv - flow * inv * strength, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\tvar out = mix(moved, cur, bleed);\n\tif (moved.a < 0.01) { out = cur; }\n\treturn out;\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"datamosh_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: MOSH_WGSL,\n\t\tlabel: \"datamosh.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"datamosh\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tflow: new OpticalFlowComputePipeline(device),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height, format) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\th?.prev?.destroy();\n\tconst make = (label, fmt) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: fmt,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"feedback_front\", HISTORY_FORMAT),\n\t\tback: make(\"feedback_back\", HISTORY_FORMAT),\n\t\tprev: make(\"feedback_prev\", format),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [\n\t\t\th.front,\n\t\t\th.back,\n\t\t\t...h.prev ? [h.prev] : []\n\t\t],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepDatamosh(args, h, v, frame, compositionStart, key) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur || !h.prev) return;\n\tconst r = resources(args.ctx.device);\n\tconst { encoder } = args;\n\tconst clean = key || h.frame < 0;\n\tconst flow = clean ? cur.texture : r.flow.execute(h.prev, cur.texture, {}, encoder);\n\tconst uniforms = new Float32Array([\n\t\tv.strength,\n\t\tv.bleed,\n\t\t1 / h.width,\n\t\t1 / h.height,\n\t\tclean ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t]);\n\tdrawFullscreenPass(encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: flow.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tencoder.copyTextureToTexture({ texture: cur.texture }, { texture: h.prev }, [\n\t\th.width,\n\t\th.height,\n\t\t1\n\t]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst DatamoshWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Datamosh\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight, ctx.renderer.format);\n\t{\n\t\tconst v = {\n\t\t\tkeyframes: Array.isArray(raw.keyframes) ? raw.keyframes.map(Math.round) : [],\n\t\t\tstrength: num(raw.strength, 1),\n\t\t\tbleed: Math.min(1, Math.max(0, num(raw.bleed, 0))),\n\t\t\twarmup: Math.max(1, Math.round(num(raw.warmup, 48)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame !== local - 1) {\n\t\t\t\tconst lastKey = Math.max(0, ...v.keyframes.filter((k) => k <= local));\n\t\t\t\tstart = Math.max(lastKey, local - v.warmup);\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepDatamosh(args, h, v, f, compositionStart, f === 0 || v.keyframes.includes(f) || h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer });\n\n//#endregion\nexport { DatamoshWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D-M1-_H_.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BSKAbyea.mjs";
3
- import { $ as probeVideoSize } from "./dist-D3BeAZ7X.mjs";
4
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CWjgql4C.mjs";
3
+ import { et as probeVideoSize } from "./dist-DtPPPsZV.mjs";
4
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-D2HT3KcE.mjs";
5
5
  import { z } from "zod";
6
6
 
7
7
  //#region ../../nodes/node-rotate/dist/renderers-D7DemTXH.mjs
@@ -180,4 +180,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
180
180
 
181
181
  //#endregion
182
182
  export { renderers_default as t };
183
- //# sourceMappingURL=renderer-CyUiXLRa.mjs.map
183
+ //# sourceMappingURL=renderer-BmyFfvVA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CyUiXLRa.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-D7DemTXH.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_ROTATE_SHADER }),\n\t\t\tlayouts: [uniformLayout, textureLayout],\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-D7DemTXH.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BmyFfvVA.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-D7DemTXH.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_ROTATE_SHADER }),\n\t\t\tlayouts: [uniformLayout, textureLayout],\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-D7DemTXH.mjs.map"],"mappings":";;;;;;;AAOA,MAAM,eAAe,eAAe,CAAC,MAAM,SAAS,EAAE,QAAQ,CAAC,QAAQ,GAAG,EAAE;CAC3E,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,OAAO,EAAE,KAAK;CACtB;CACA;CACA;CACA,CAAC,CAAC,QAAQ,QAAQ,EAAE,EAAE,aAAa,gNAAgN,CAAC,CAAC,MAAM,SAAS,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE;CAC5S,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,OAAO;AACV,MAAM,yBAAyB,aAAa;AAC5C,MAAM,qBAAqB,EAAE,MAAM,CAAC,mBAAmB,kBAAkB,CAAC;;;;;;AAa1E,SAAS,kBAAkB,aAAa,cAAc,aAAa,cAAc,UAAU,KAAK;AAC/F,KAAI,QAAQ,OAAQ,QAAO;EAC1B,OAAO;EACP,QAAQ;EACR;CACD,MAAM,MAAM,WAAW,KAAK,KAAK;CACjC,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;CACjC,MAAM,IAAI,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;CACjC,MAAM,IAAI,QAAQ,UAAU,KAAK,KAAK,IAAI,cAAc,IAAI,gBAAgB,cAAc,IAAI,cAAc,IAAI,gBAAgB,aAAa,GAAG,KAAK,IAAI,eAAe,IAAI,cAAc,IAAI,eAAe,gBAAgB,IAAI,cAAc,IAAI,cAAc;AACjQ,QAAO;EACN,OAAO,cAAc;EACrB,QAAQ,eAAe;EACvB;;AAKF,MAAM,qBAAqB;;;;;;;;;;;EAWzB,qBAAqB;;;;;;;;;;;;;;;AAevB,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,cAAc,IAAI,aAAa,EAAE;AACvC,SAAS,mBAAmB,QAAQ,cAAc;CACjD,MAAM,SAAS,oBAAoB,IAAI,OAAO;AAC9C,KAAI,OAAQ,QAAO;CACnB,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAClE,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC7E,MAAM,MAAM;EACX;EACA;EACA,UAAU,yBAAyB,QAAQ;GAC1C,QAAQ,OAAO,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;GAC/D,SAAS,CAAC,eAAe,cAAc;GACvC,QAAQ;GACR,CAAC;EACF;AACD,qBAAoB,IAAI,QAAQ,IAAI;AACpC,QAAO;;AAER,SAAS,cAAc,KAAK,UAAU,OAAO,KAAK;CACjD,MAAM,QAAQ,OAAO,QAAQ,aAAa,IAAI,OAAO,IAAI,GAAG,QAAQ,QAAQ,OAAO,QAAQ,WAAW,SAAS,OAAO,OAAO,IAAI,QAAQ,aAAa,IAAI,IAAI;EAC7J;EACA;EACA,CAAC,GAAG,WAAW,MAAM,IAAI,QAAQ,MAAM;CACxC,MAAM,IAAI,OAAO,SAAS,SAAS;AACnC,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;;;;;;AAOjC,eAAe,cAAc,OAAO;AACnC,MAAK,IAAI,OAAO,OAAO,OAAO;EAC7B,MAAM,EAAE,OAAO,WAAW,KAAK,YAAY,EAAE;AAC7C,MAAI,SAAS,OAAQ,QAAO;GAC3B;GACA;GACA;EACD,MAAM,KAAK,KAAK;AAChB,MAAI,GAAG,OAAO,UAAU;GACvB,MAAM,MAAM,OAAO,GAAG,QAAQ,WAAW,GAAG,MAAM,GAAG;AACrD,UAAO,OAAO,QAAQ,WAAW,eAAe,IAAI,GAAG;;AAExD,SAAO,KAAK,WAAW;;AAExB,QAAO;;AAER,MAAM,iBAAiB,OAAO,SAAS;CACtC,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,YAAY,CAAC,GAAI;CAChC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,mBAAmB,MAAM,oBAAoB;CACnD,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,YAAY,MAAM,cAAc,WAAW;CACjD,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd;EACD,CAAC;CACF,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI,kBAAkB,IAAI;CAChE,MAAM,QAAQ,KAAK,IAAI,KAAK,cAAc,GAAG,OAAO,GAAG,kBAAkB,IAAI,CAAC;CAC9E,MAAM,OAAO,kBAAkB,aAAa,cAAc,OAAO,QAAQ,OAAO,GAAG,OAAO,QAAQ;CAClG,MAAM,MAAM,QAAQ,KAAK,KAAK;AAC9B,aAAY,KAAK;AACjB,aAAY,KAAK;AACjB,aAAY,KAAK,KAAK,QAAQ;AAC9B,aAAY,KAAK,KAAK,SAAS;AAC/B,aAAY,KAAK,KAAK,IAAI,IAAI;AAC9B,aAAY,KAAK,KAAK,IAAI,IAAI;CAC9B,MAAM,EAAE,UAAU,eAAe,kBAAkB,mBAAmB,IAAI,QAAQ,IAAI,SAAS,OAAO;CACtG,MAAM,aAAa,IAAI,OAAO,gBAAgB;EAC7C,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ,IAAI,SAAS,mBAAmB,YAAY,EAAE;GAClE,CAAC;EACF,CAAC;CACF,MAAM,aAAa,IAAI,OAAO,gBAAgB;EAC7C,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,SAAS,YAAY;GAC/B,EAAE;GACF,SAAS;GACT,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;GAC1D,CAAC;EACF,CAAC;CACF,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;AACF,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU,CAAC,YAAY,WAAW,CAAC;AACpF,qBAAoB,MAAM,QAAQ,GAAG,WAAW,EAAE;;AAKnD,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CWjgql4C.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-D2HT3KcE.mjs";
3
3
 
4
4
  //#region ../../nodes/node-selective-color/dist/renderers-BZ3S3Cgo.mjs
5
5
  const deviceResourceCache = /* @__PURE__ */ new WeakMap();
@@ -166,4 +166,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: SelectiveColorWebGPURen
166
166
 
167
167
  //#endregion
168
168
  export { renderers_default as t };
169
- //# sourceMappingURL=renderer-opVuiAQR.mjs.map
169
+ //# sourceMappingURL=renderer-BrEeUw7T.mjs.map