framefields 2.6.0 → 2.6.2

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 (296) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-QBA2VogL.mjs → audio-BHuVoNc-.mjs} +4 -4
  4. package/dist/{audio-QBA2VogL.mjs.map → audio-BHuVoNc-.mjs.map} +1 -1
  5. package/dist/{audio-B5mdR8vv.d.mts → audio-WcPMxtcz.d.mts} +3 -3
  6. package/dist/{audio-B5mdR8vv.d.mts.map → audio-WcPMxtcz.d.mts.map} +1 -1
  7. package/dist/components/index.d.mts +10 -10
  8. package/dist/components/index.mjs +44 -44
  9. package/dist/{dist-D021IFfp.mjs → dist-CL5JOMSp.mjs} +22 -2
  10. package/dist/dist-CL5JOMSp.mjs.map +1 -0
  11. package/dist/{dist-nHCqVk-e.mjs → dist-CSU_2yUb.mjs} +3 -3
  12. package/dist/{dist-nHCqVk-e.mjs.map → dist-CSU_2yUb.mjs.map} +1 -1
  13. package/dist/{dist-BPOi5xb_.mjs → dist-PlaSQJ43.mjs} +2 -2
  14. package/dist/{dist-BPOi5xb_.mjs.map → dist-PlaSQJ43.mjs.map} +1 -1
  15. package/dist/{dist-CDwWQYg3.mjs → dist-Wsjx_Rza.mjs} +83 -18
  16. package/dist/dist-Wsjx_Rza.mjs.map +1 -0
  17. package/dist/effects/index.d.mts +4 -4
  18. package/dist/effects/index.mjs +35 -35
  19. package/dist/{effects-C-6I4iYW.mjs → effects-BvloJaPQ.mjs} +3 -3
  20. package/dist/{effects-C-6I4iYW.mjs.map → effects-BvloJaPQ.mjs.map} +1 -1
  21. package/dist/fonts/index.mjs +2 -2
  22. package/dist/{fonts-BieW3VWV.mjs → fonts-DpnBDAqM.mjs} +2 -2
  23. package/dist/{fonts-BieW3VWV.mjs.map → fonts-DpnBDAqM.mjs.map} +1 -1
  24. package/dist/{gpu-Bb4WmYYH.mjs → gpu-BvYDrqOC.mjs} +2 -2
  25. package/dist/{gpu-Bb4WmYYH.mjs.map → gpu-BvYDrqOC.mjs.map} +1 -1
  26. package/dist/{index-3Vdef2KE.d.mts → index-BCzXnNpb.d.mts} +3 -3
  27. package/dist/{index-3Vdef2KE.d.mts.map → index-BCzXnNpb.d.mts.map} +1 -1
  28. package/dist/{index-E1IrPAm4.d.mts → index-C541Ol1N.d.mts} +468 -466
  29. package/dist/index-C541Ol1N.d.mts.map +1 -0
  30. package/dist/{index-o8LxWdwz.d.mts → index-C6ihzCpZ.d.mts} +3 -3
  31. package/dist/{index-o8LxWdwz.d.mts.map → index-C6ihzCpZ.d.mts.map} +1 -1
  32. package/dist/{index-BhzlG_1Q.d.mts → index-DcIR_DgU.d.mts} +2 -2
  33. package/dist/{index-BhzlG_1Q.d.mts.map → index-DcIR_DgU.d.mts.map} +1 -1
  34. package/dist/{index-D-Gnyffj.d.mts → index-DsGBouQM.d.mts} +4 -4
  35. package/dist/{index-D-Gnyffj.d.mts.map → index-DsGBouQM.d.mts.map} +1 -1
  36. package/dist/{index-ocZc12ZS.d.mts → index-kj5uSzaI.d.mts} +22 -2
  37. package/dist/index-kj5uSzaI.d.mts.map +1 -0
  38. package/dist/{index-B4o6F1JC.d.mts → index-wUhS1_4W.d.mts} +2 -2
  39. package/dist/{index-B4o6F1JC.d.mts.map → index-wUhS1_4W.d.mts.map} +1 -1
  40. package/dist/index.d.mts +11 -11
  41. package/dist/index.mjs +53 -53
  42. package/dist/preview/index.d.mts +3 -3
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-D6jS38Di.mjs → preview-UMG4Colu.mjs} +2 -2
  45. package/dist/{preview-D6jS38Di.mjs.map → preview-UMG4Colu.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-AYTP6OGO.mjs → chunk-22BLMBWX.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-BBHRXV75.mjs → chunk-6THE6J3A.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-W3I7LKDV.mjs → chunk-HU73APZL.mjs} +1 -1
  49. package/dist/preview-engine/chunk-MXK2PP6K.mjs +1 -0
  50. package/dist/preview-engine/{chunk-VY6ST4QX.mjs → chunk-NIILFJKE.mjs} +1 -1
  51. package/dist/preview-engine/{chunk-2LQCQ3OT.mjs → chunk-T36SKUWK.mjs} +9 -9
  52. package/dist/preview-engine/{chunk-MLAIEIUF.mjs → chunk-TXX2POD2.mjs} +26 -26
  53. package/dist/preview-engine/{chunk-ZMMNN77R.mjs → chunk-ZR4QFIJR.mjs} +1 -1
  54. package/dist/preview-engine/components.mjs +1 -1
  55. package/dist/preview-engine/effects.mjs +1 -1
  56. package/dist/preview-engine/fonts.mjs +1 -1
  57. package/dist/preview-engine/framefields.mjs +1 -1
  58. package/dist/preview-engine/player.mjs +1 -1
  59. package/dist/preview-engine/{renderers-N36R42RL.mjs → renderers-3HFRWF2G.mjs} +1 -1
  60. package/dist/preview-engine/{renderers-4G3UOPA7.mjs → renderers-JBRPKCKF.mjs} +1 -1
  61. package/dist/{program-Bf4yHbHC.mjs → program-B6YvXPhj.mjs} +15 -10
  62. package/dist/program-B6YvXPhj.mjs.map +1 -0
  63. package/dist/registry/chat-thread.json +1 -1
  64. package/dist/registry/terminal.json +1 -1
  65. package/dist/renderer/index.d.mts +2 -2
  66. package/dist/renderer/index.mjs +2 -2
  67. package/dist/{renderer-BsnhAgrB.mjs → renderer-15a6H6Yg.mjs} +3 -3
  68. package/dist/{renderer-BsnhAgrB.mjs.map → renderer-15a6H6Yg.mjs.map} +1 -1
  69. package/dist/renderer-1qAST5qk.mjs +5 -0
  70. package/dist/renderer-2dntY9lQ.mjs +5 -0
  71. package/dist/{renderer-Bpve7M6S.mjs → renderer-56T9Wf1N.mjs} +71 -71
  72. package/dist/{renderer-Bpve7M6S.mjs.map → renderer-56T9Wf1N.mjs.map} +1 -1
  73. package/dist/renderer-83Knj3DI.mjs +5 -0
  74. package/dist/{renderer-yFHP9Zj2.mjs → renderer-876_ArdD.mjs} +3 -3
  75. package/dist/{renderer-yFHP9Zj2.mjs.map → renderer-876_ArdD.mjs.map} +1 -1
  76. package/dist/{renderer-BHgYRSu8.mjs → renderer-8ZxKRprN.mjs} +2 -2
  77. package/dist/{renderer-BHgYRSu8.mjs.map → renderer-8ZxKRprN.mjs.map} +1 -1
  78. package/dist/renderer-B2GWXOwP.mjs +5 -0
  79. package/dist/renderer-B3LlOjNo.mjs +5 -0
  80. package/dist/{renderer-ovkctV5a.mjs → renderer-B51lS0Zb.mjs} +2 -2
  81. package/dist/renderer-B5cPLblQ.mjs +5 -0
  82. package/dist/renderer-B7uorwdR.mjs +5 -0
  83. package/dist/{renderer-D_UPFbei.mjs → renderer-BBnurLTw.mjs} +3 -3
  84. package/dist/{renderer-D_UPFbei.mjs.map → renderer-BBnurLTw.mjs.map} +1 -1
  85. package/dist/{renderer-BKssznKn.mjs → renderer-BHJzeFp9.mjs} +2 -2
  86. package/dist/{renderer-BKssznKn.mjs.map → renderer-BHJzeFp9.mjs.map} +1 -1
  87. package/dist/{renderer-C-dcd14F.d.mts → renderer-BHjw4EdY.d.mts} +2 -2
  88. package/dist/{renderer-C-dcd14F.d.mts.map → renderer-BHjw4EdY.d.mts.map} +1 -1
  89. package/dist/renderer-BJ6LDZlX.mjs +5 -0
  90. package/dist/{renderer-DlA7kzIs.mjs → renderer-BLn9MrDC.mjs} +3 -3
  91. package/dist/{renderer-DlA7kzIs.mjs.map → renderer-BLn9MrDC.mjs.map} +1 -1
  92. package/dist/{renderer-CRkgyk08.mjs → renderer-BUj6OsWX.mjs} +4 -4
  93. package/dist/{renderer-CRkgyk08.mjs.map → renderer-BUj6OsWX.mjs.map} +1 -1
  94. package/dist/{renderer-79mO0b9Y.mjs → renderer-BX2tt7zA.mjs} +3 -3
  95. package/dist/{renderer-79mO0b9Y.mjs.map → renderer-BX2tt7zA.mjs.map} +1 -1
  96. package/dist/{renderer-l1qJE4z-.mjs → renderer-BYNbtv_d.mjs} +2 -2
  97. package/dist/{renderer-l1qJE4z-.mjs.map → renderer-BYNbtv_d.mjs.map} +1 -1
  98. package/dist/{renderer-CY_1u6zi.mjs → renderer-BZ9zGp0Z.mjs} +3 -3
  99. package/dist/{renderer-CY_1u6zi.mjs.map → renderer-BZ9zGp0Z.mjs.map} +1 -1
  100. package/dist/renderer-BaQC4ylR.mjs +5 -0
  101. package/dist/{renderer-Cn9tU_s5.mjs → renderer-BcH6-FsA.mjs} +3 -3
  102. package/dist/{renderer-Cn9tU_s5.mjs.map → renderer-BcH6-FsA.mjs.map} +1 -1
  103. package/dist/{renderer-Cqp_TUl_.mjs → renderer-Bf0Bhqot.mjs} +3 -3
  104. package/dist/{renderer-Cqp_TUl_.mjs.map → renderer-Bf0Bhqot.mjs.map} +1 -1
  105. package/dist/renderer-BfQzj_uW.mjs +5 -0
  106. package/dist/{renderer-BQFxoNzi.mjs → renderer-BfYAlY63.mjs} +3 -3
  107. package/dist/{renderer-BQFxoNzi.mjs.map → renderer-BfYAlY63.mjs.map} +1 -1
  108. package/dist/{renderer-BzEQXAdl.mjs → renderer-BfuMCx2c.mjs} +3 -3
  109. package/dist/{renderer-BzEQXAdl.mjs.map → renderer-BfuMCx2c.mjs.map} +1 -1
  110. package/dist/renderer-Bl9uy1ra.mjs +6 -0
  111. package/dist/{renderer-D01RT3Ov.mjs → renderer-BmarvBo8.mjs} +2 -2
  112. package/dist/{renderer-BL9vkn6m.mjs → renderer-Bpm12fcQ.mjs} +3 -3
  113. package/dist/{renderer-BL9vkn6m.mjs.map → renderer-Bpm12fcQ.mjs.map} +1 -1
  114. package/dist/{renderer-BFdgbqgW.mjs → renderer-BsSZdDHQ.mjs} +3 -3
  115. package/dist/{renderer-BFdgbqgW.mjs.map → renderer-BsSZdDHQ.mjs.map} +1 -1
  116. package/dist/renderer-Bu4FyXDo.mjs +5 -0
  117. package/dist/renderer-BxbJwS3T.mjs +5 -0
  118. package/dist/{renderer-B1Ox12RF.mjs → renderer-Bxs9zUIN.mjs} +2 -2
  119. package/dist/{renderer-B1Ox12RF.mjs.map → renderer-Bxs9zUIN.mjs.map} +1 -1
  120. package/dist/{renderer-CJRu7lLH.mjs → renderer-BxtbwOSp.mjs} +3 -3
  121. package/dist/{renderer-CJRu7lLH.mjs.map → renderer-BxtbwOSp.mjs.map} +1 -1
  122. package/dist/{renderer-DYJHFHF4.mjs → renderer-Byp6c5Y4.mjs} +2 -2
  123. package/dist/{renderer-DYJHFHF4.mjs.map → renderer-Byp6c5Y4.mjs.map} +1 -1
  124. package/dist/{renderer-yF40Pb-n.mjs → renderer-C3gJco03.mjs} +3 -3
  125. package/dist/{renderer-yF40Pb-n.mjs.map → renderer-C3gJco03.mjs.map} +1 -1
  126. package/dist/renderer-C51hhQ7B.mjs +5 -0
  127. package/dist/{renderer-CMWUtfwn.mjs → renderer-C6YcfNbV.mjs} +3 -3
  128. package/dist/{renderer-CMWUtfwn.mjs.map → renderer-C6YcfNbV.mjs.map} +1 -1
  129. package/dist/{renderer-AOZWHGT3.mjs → renderer-C7BxBoHC.mjs} +3 -3
  130. package/dist/{renderer-AOZWHGT3.mjs.map → renderer-C7BxBoHC.mjs.map} +1 -1
  131. package/dist/renderer-C8ZShnSH.mjs +5 -0
  132. package/dist/{renderer-CgdplRri.mjs → renderer-CLvXiFPk.mjs} +2 -2
  133. package/dist/{renderer-CgdplRri.mjs.map → renderer-CLvXiFPk.mjs.map} +1 -1
  134. package/dist/{renderer-DNEFYrQ5.mjs → renderer-COAYUhv2.mjs} +2 -2
  135. package/dist/renderer-CQh1RgN8.mjs +5 -0
  136. package/dist/renderer-CRYaMhGd.mjs +5 -0
  137. package/dist/{renderer-LW8MfGjd.mjs → renderer-CTQTbvWR.mjs} +2 -2
  138. package/dist/{renderer-LW8MfGjd.mjs.map → renderer-CTQTbvWR.mjs.map} +1 -1
  139. package/dist/renderer-CULThR_r.mjs +5 -0
  140. package/dist/{renderer-DFYXjAIT.mjs → renderer-CW05KUXE.mjs} +6 -6
  141. package/dist/{renderer-DFYXjAIT.mjs.map → renderer-CW05KUXE.mjs.map} +1 -1
  142. package/dist/renderer-C_KDGeMJ.mjs +5 -0
  143. package/dist/{renderer-zOK5DYYn.mjs → renderer-CdxHmvvf.mjs} +3 -3
  144. package/dist/{renderer-zOK5DYYn.mjs.map → renderer-CdxHmvvf.mjs.map} +1 -1
  145. package/dist/renderer-Ce4Gam_S.mjs +5 -0
  146. package/dist/{renderer-BDCS7k5X.mjs → renderer-Ck74BZ_L.mjs} +4 -4
  147. package/dist/{renderer-BDCS7k5X.mjs.map → renderer-Ck74BZ_L.mjs.map} +1 -1
  148. package/dist/renderer-CkZ6xcN6.mjs +5 -0
  149. package/dist/{renderer-By5xTRqB.mjs → renderer-CkbIz6M-.mjs} +4 -4
  150. package/dist/{renderer-By5xTRqB.mjs.map → renderer-CkbIz6M-.mjs.map} +1 -1
  151. package/dist/renderer-Co4C29rw.mjs +5 -0
  152. package/dist/{renderer-Duorbrb8.mjs → renderer-CopRZnwp.mjs} +2 -2
  153. package/dist/{renderer-Duorbrb8.mjs.map → renderer-CopRZnwp.mjs.map} +1 -1
  154. package/dist/{renderer-DAfWLGfy.mjs → renderer-CptS_UFe.mjs} +3 -3
  155. package/dist/{renderer-DAfWLGfy.mjs.map → renderer-CptS_UFe.mjs.map} +1 -1
  156. package/dist/{renderer-CY0BT6ok.mjs → renderer-Cs8Od5S8.mjs} +3 -3
  157. package/dist/{renderer-CY0BT6ok.mjs.map → renderer-Cs8Od5S8.mjs.map} +1 -1
  158. package/dist/{renderer-DgRJG_l-.mjs → renderer-CuQceSLi.mjs} +3 -3
  159. package/dist/{renderer-DgRJG_l-.mjs.map → renderer-CuQceSLi.mjs.map} +1 -1
  160. package/dist/{renderer-Bbkf5EIi.mjs → renderer-Cwhm9oQe.mjs} +3 -3
  161. package/dist/{renderer-Bbkf5EIi.mjs.map → renderer-Cwhm9oQe.mjs.map} +1 -1
  162. package/dist/renderer-CyReVcsb.mjs +3 -0
  163. package/dist/{renderer-CHPLHbAs.mjs → renderer-Cy_rrWEC.mjs} +3 -3
  164. package/dist/{renderer-CHPLHbAs.mjs.map → renderer-Cy_rrWEC.mjs.map} +1 -1
  165. package/dist/renderer-CzgPat6y.mjs +5 -0
  166. package/dist/renderer-D-pFBDki.mjs +5 -0
  167. package/dist/{renderer-WTvo3wo9.d.mts → renderer-D1fjdDVu.d.mts} +2 -2
  168. package/dist/{renderer-WTvo3wo9.d.mts.map → renderer-D1fjdDVu.d.mts.map} +1 -1
  169. package/dist/{renderer-EwSSuJXj.mjs → renderer-D4KKtfTl.mjs} +3 -3
  170. package/dist/{renderer-EwSSuJXj.mjs.map → renderer-D4KKtfTl.mjs.map} +1 -1
  171. package/dist/renderer-DELCePyB.mjs +5 -0
  172. package/dist/{renderer-Dj-y-BtT.mjs → renderer-DFGSy_ay.mjs} +3 -3
  173. package/dist/{renderer-Dj-y-BtT.mjs.map → renderer-DFGSy_ay.mjs.map} +1 -1
  174. package/dist/{renderer-PMjV8x65.mjs → renderer-DF_TswHB.mjs} +3 -3
  175. package/dist/{renderer-PMjV8x65.mjs.map → renderer-DF_TswHB.mjs.map} +1 -1
  176. package/dist/{renderer-CsOLHKFx.mjs → renderer-DGUL7JlO.mjs} +3 -3
  177. package/dist/{renderer-CsOLHKFx.mjs.map → renderer-DGUL7JlO.mjs.map} +1 -1
  178. package/dist/{renderer-CYLP8sD6.mjs → renderer-DJJXvO27.mjs} +2 -2
  179. package/dist/{renderer-CYLP8sD6.mjs.map → renderer-DJJXvO27.mjs.map} +1 -1
  180. package/dist/{renderer-KppAWfmJ.mjs → renderer-DJy8V_nb.mjs} +3 -3
  181. package/dist/{renderer-KppAWfmJ.mjs.map → renderer-DJy8V_nb.mjs.map} +1 -1
  182. package/dist/{renderer-kOlfYLtu.mjs → renderer-DKkXBsVx.mjs} +3 -3
  183. package/dist/{renderer-kOlfYLtu.mjs.map → renderer-DKkXBsVx.mjs.map} +1 -1
  184. package/dist/{renderer-4v6XYAiX.mjs → renderer-DLpjygMO.mjs} +3 -3
  185. package/dist/{renderer-4v6XYAiX.mjs.map → renderer-DLpjygMO.mjs.map} +1 -1
  186. package/dist/{renderer-C6Wb1TZT.mjs → renderer-DNNxsVQh.mjs} +3 -3
  187. package/dist/{renderer-C6Wb1TZT.mjs.map → renderer-DNNxsVQh.mjs.map} +1 -1
  188. package/dist/{renderer-ml2LHmRb.mjs → renderer-DUx7rcc5.mjs} +2 -2
  189. package/dist/{renderer-ml2LHmRb.mjs.map → renderer-DUx7rcc5.mjs.map} +1 -1
  190. package/dist/renderer-DWijRKGh.mjs +5 -0
  191. package/dist/{renderer-JJibsJfb.mjs → renderer-DXfYdQ2o.mjs} +2 -2
  192. package/dist/{renderer-JJibsJfb.mjs.map → renderer-DXfYdQ2o.mjs.map} +1 -1
  193. package/dist/{renderer-CcSBjtRa.mjs → renderer-Da5Xcwx5.mjs} +2 -2
  194. package/dist/{renderer-BTjveb1Y.mjs → renderer-DfQWeysg.mjs} +3 -3
  195. package/dist/{renderer-BTjveb1Y.mjs.map → renderer-DfQWeysg.mjs.map} +1 -1
  196. package/dist/renderer-Di-PH-vG.mjs +5 -0
  197. package/dist/{renderer-BQdn_qGp.mjs → renderer-Djpx4utT.mjs} +3 -3
  198. package/dist/{renderer-BQdn_qGp.mjs.map → renderer-Djpx4utT.mjs.map} +1 -1
  199. package/dist/{renderer-DJHuPNJx.mjs → renderer-Dk88a53K.mjs} +3 -3
  200. package/dist/{renderer-DJHuPNJx.mjs.map → renderer-Dk88a53K.mjs.map} +1 -1
  201. package/dist/{renderer-DEeKkljI.mjs → renderer-DlboTFM8.mjs} +3 -3
  202. package/dist/{renderer-DEeKkljI.mjs.map → renderer-DlboTFM8.mjs.map} +1 -1
  203. package/dist/renderer-Dn9CR9KL.mjs +5 -0
  204. package/dist/{renderer-DJTXhVNh.mjs → renderer-GNgSEbBu.mjs} +2 -2
  205. package/dist/{renderer-DJTXhVNh.mjs.map → renderer-GNgSEbBu.mjs.map} +1 -1
  206. package/dist/{renderer-mu2mYo5w.mjs → renderer-HW-6FmmO.mjs} +3 -3
  207. package/dist/{renderer-mu2mYo5w.mjs.map → renderer-HW-6FmmO.mjs.map} +1 -1
  208. package/dist/{renderer-DAONCf_3.mjs → renderer-Hs9t2qY-.mjs} +3 -3
  209. package/dist/{renderer-DAONCf_3.mjs.map → renderer-Hs9t2qY-.mjs.map} +1 -1
  210. package/dist/{renderer-B6vr-B0t.mjs → renderer-I-KtRtuL.mjs} +3 -3
  211. package/dist/{renderer-B6vr-B0t.mjs.map → renderer-I-KtRtuL.mjs.map} +1 -1
  212. package/dist/renderer-ICmKc1Bq.mjs +5 -0
  213. package/dist/{renderer-BmgyvIC3.mjs → renderer-IP6Iy2RQ.mjs} +3 -3
  214. package/dist/{renderer-BmgyvIC3.mjs.map → renderer-IP6Iy2RQ.mjs.map} +1 -1
  215. package/dist/renderer-IR3rE4TW.mjs +5 -0
  216. package/dist/{renderer-VwKmjuc6.mjs → renderer-KS_JYan2.mjs} +3 -3
  217. package/dist/{renderer-VwKmjuc6.mjs.map → renderer-KS_JYan2.mjs.map} +1 -1
  218. package/dist/{renderer-bb3puodg.mjs → renderer-PTV0M2HP.mjs} +2 -2
  219. package/dist/{renderer-bb3puodg.mjs.map → renderer-PTV0M2HP.mjs.map} +1 -1
  220. package/dist/{renderer-DYR4gFEM.mjs → renderer-Q6A9dB56.mjs} +3 -3
  221. package/dist/{renderer-DYR4gFEM.mjs.map → renderer-Q6A9dB56.mjs.map} +1 -1
  222. package/dist/{renderer-rv-AKqCl.mjs → renderer-QYjSQL80.mjs} +2 -2
  223. package/dist/{renderer-rv-AKqCl.mjs.map → renderer-QYjSQL80.mjs.map} +1 -1
  224. package/dist/renderer-Qyc4xLZY.mjs +5 -0
  225. package/dist/renderer-Riuen1UO.mjs +5 -0
  226. package/dist/{renderer-DiD3r9tx.mjs → renderer-SPq9BbnG.mjs} +3 -3
  227. package/dist/{renderer-DiD3r9tx.mjs.map → renderer-SPq9BbnG.mjs.map} +1 -1
  228. package/dist/{renderer-j7aUfyeR.mjs → renderer-UPRkHFPp.mjs} +3 -3
  229. package/dist/{renderer-j7aUfyeR.mjs.map → renderer-UPRkHFPp.mjs.map} +1 -1
  230. package/dist/{renderer-C64g87yU.mjs → renderer-URxsYx_I.mjs} +4 -4
  231. package/dist/{renderer-C64g87yU.mjs.map → renderer-URxsYx_I.mjs.map} +1 -1
  232. package/dist/{renderer-qQmoO5Hk.mjs → renderer-XU08U1If.mjs} +2 -2
  233. package/dist/{renderer-qQmoO5Hk.mjs.map → renderer-XU08U1If.mjs.map} +1 -1
  234. package/dist/renderer-YKJt5oPu.mjs +5 -0
  235. package/dist/renderer-asS1sOXb.mjs +5 -0
  236. package/dist/renderer-mAQErqBN.mjs +5 -0
  237. package/dist/{renderer-UArFa4y9.mjs → renderer-nIKvk_ij.mjs} +3 -3
  238. package/dist/{renderer-UArFa4y9.mjs.map → renderer-nIKvk_ij.mjs.map} +1 -1
  239. package/dist/renderer-pZazoCK-.mjs +5 -0
  240. package/dist/{renderer-ij448rvt.mjs → renderer-rLhze-dj.mjs} +2 -2
  241. package/dist/{renderer-ij448rvt.mjs.map → renderer-rLhze-dj.mjs.map} +1 -1
  242. package/dist/{renderer-eyvY4Lq4.mjs → renderer-sQjiRkiF.mjs} +3 -3
  243. package/dist/{renderer-eyvY4Lq4.mjs.map → renderer-sQjiRkiF.mjs.map} +1 -1
  244. package/dist/{renderer-BR35Xp9n.mjs → renderer-v779MqRx.mjs} +3 -3
  245. package/dist/{renderer-BR35Xp9n.mjs.map → renderer-v779MqRx.mjs.map} +1 -1
  246. package/dist/{renderers-CP8CFWDs-DPLX5EJs.mjs → renderers-CP8CFWDs-CPfe6IN0.mjs} +3 -3
  247. package/dist/{renderers-CP8CFWDs-DPLX5EJs.mjs.map → renderers-CP8CFWDs-CPfe6IN0.mjs.map} +1 -1
  248. package/dist/signals/index.d.mts +5 -5
  249. package/dist/signals/index.mjs +6 -6
  250. package/dist/{signals-BrNF9l9s.mjs → signals-BRgYyspQ.mjs} +3 -3
  251. package/dist/{signals-BrNF9l9s.mjs.map → signals-BRgYyspQ.mjs.map} +1 -1
  252. package/dist/{src-BnkrNj2W.mjs → src-Be7rjknf.mjs} +9 -9
  253. package/dist/{src-BnkrNj2W.mjs.map → src-Be7rjknf.mjs.map} +1 -1
  254. package/package.json +58 -58
  255. package/dist/dist-CDwWQYg3.mjs.map +0 -1
  256. package/dist/dist-D021IFfp.mjs.map +0 -1
  257. package/dist/index-E1IrPAm4.d.mts.map +0 -1
  258. package/dist/index-ocZc12ZS.d.mts.map +0 -1
  259. package/dist/program-Bf4yHbHC.mjs.map +0 -1
  260. package/dist/renderer-4FQmduPw.mjs +0 -5
  261. package/dist/renderer-BBCpRuYU.mjs +0 -5
  262. package/dist/renderer-BBTo_jLO.mjs +0 -5
  263. package/dist/renderer-BLg66ZgG.mjs +0 -5
  264. package/dist/renderer-BScS8AzG.mjs +0 -5
  265. package/dist/renderer-Bb1cS5mJ.mjs +0 -5
  266. package/dist/renderer-Bpwd9zEY.mjs +0 -5
  267. package/dist/renderer-Bzyd9xi5.mjs +0 -5
  268. package/dist/renderer-CXVssx1k.mjs +0 -5
  269. package/dist/renderer-CYFiGLls.mjs +0 -5
  270. package/dist/renderer-C__BvvtP.mjs +0 -5
  271. package/dist/renderer-Ca3YZsoT.mjs +0 -5
  272. package/dist/renderer-CnM5iFj9.mjs +0 -5
  273. package/dist/renderer-D1nZrvQx.mjs +0 -5
  274. package/dist/renderer-D6XjVQME.mjs +0 -5
  275. package/dist/renderer-DIuMnMF0.mjs +0 -5
  276. package/dist/renderer-DUvvM8EF.mjs +0 -5
  277. package/dist/renderer-DWogyuMO.mjs +0 -5
  278. package/dist/renderer-DWsj_LJR.mjs +0 -5
  279. package/dist/renderer-DYun0DJl.mjs +0 -5
  280. package/dist/renderer-D_6YqD-Z.mjs +0 -5
  281. package/dist/renderer-Db9LP86x.mjs +0 -5
  282. package/dist/renderer-DhHiC87m.mjs +0 -5
  283. package/dist/renderer-Dj5jGAkR.mjs +0 -5
  284. package/dist/renderer-DlPUQ7RF.mjs +0 -5
  285. package/dist/renderer-DpIPdgn8.mjs +0 -5
  286. package/dist/renderer-Dv0C9CEt.mjs +0 -6
  287. package/dist/renderer-Iw8fDL-p.mjs +0 -5
  288. package/dist/renderer-SLI69Mju.mjs +0 -5
  289. package/dist/renderer-WyaqnVMz.mjs +0 -3
  290. package/dist/renderer-ZVtbb3-P.mjs +0 -5
  291. package/dist/renderer-gHNCu7H5.mjs +0 -5
  292. package/dist/renderer-gxDNmbtU.mjs +0 -5
  293. package/dist/renderer-hkK4DNRX.mjs +0 -5
  294. package/dist/renderer-oy6SGDRz.mjs +0 -5
  295. package/dist/renderer-rq7UIcuH.mjs +0 -5
  296. package/dist/renderer-xkEJahws.mjs +0 -5
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
- import "./dist-CDwWQYg3.mjs";
4
- import { o as drawChildToTexture } from "./gpu-Bb4WmYYH.mjs";
3
+ import "./dist-Wsjx_Rza.mjs";
4
+ import { o as drawChildToTexture } from "./gpu-BvYDrqOC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs
7
7
  /**
@@ -58,4 +58,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURende
58
58
 
59
59
  //#endregion
60
60
  export { renderers_default as default };
61
- //# sourceMappingURL=renderer-EwSSuJXj.mjs.map
61
+ //# sourceMappingURL=renderer-D4KKtfTl.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-EwSSuJXj.mjs","names":[],"sources":["../../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawChildToTexture } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\n/**\n* WebGPU renderer for the ExtractFrame operation.\n*\n* Renders the child media (Video/Lottie/GIF) at a specific frame number,\n* producing a static image output. The frame number is stored in the operation\n* and the child is rendered at the corresponding timestamp.\n*/\nconst ExtractFrameWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetView, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia, opacity = 1 } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"ExtractFrame\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst frame = op.frame ?? 0;\n\tconst childMeta = childMedia.metadata;\n\tconst childFps = childMeta?.fps ?? 24;\n\tconst timestampSec = frame / childFps;\n\targs.pass.end();\n\tconst sourceWidth = childMeta?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = childMeta?.height ?? props.containerHeight ?? targetHeight;\n\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\tconst containerHeight = props.containerHeight ?? ctx.surface.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\tframe,\n\t\t\tfps: childFps,\n\t\t\ttimestampSec,\n\t\t\tforceWait: true\n\t\t}\n\t});\n\tconst outPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t}, { opacity });\n\targs.pass = outPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-ByS_lnbu.mjs.map"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,OAAO,YAAY,aAAa,cAAc,YAAY;CACvE,MAAM,EAAE,cAAc,UAAU,MAAM;CACtC,MAAM,KAAK,cAAc;AACzB,KAAI,CAAC,MAAM,GAAG,OAAO,eAAgB;CACrC,MAAM,aAAa,aAAa,WAAW;AAC3C,KAAI,CAAC,WAAY;CACjB,MAAM,QAAQ,GAAG,SAAS;CAC1B,MAAM,YAAY,WAAW;CAC7B,MAAM,WAAW,WAAW,OAAO;CACnC,MAAM,eAAe,QAAQ;AAC7B,MAAK,KAAK,KAAK;CACf,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,QAAQ;CAC3D,MAAM,kBAAkB,MAAM,mBAAmB,IAAI,QAAQ;CAC7D,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB;GACA,KAAK;GACL;GACA,WAAW;GACX;EACD,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,CAAC;AACf,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-D4KKtfTl.mjs","names":[],"sources":["../../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawChildToTexture } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\n/**\n* WebGPU renderer for the ExtractFrame operation.\n*\n* Renders the child media (Video/Lottie/GIF) at a specific frame number,\n* producing a static image output. The frame number is stored in the operation\n* and the child is rendered at the corresponding timestamp.\n*/\nconst ExtractFrameWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetView, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia, opacity = 1 } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"ExtractFrame\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst frame = op.frame ?? 0;\n\tconst childMeta = childMedia.metadata;\n\tconst childFps = childMeta?.fps ?? 24;\n\tconst timestampSec = frame / childFps;\n\targs.pass.end();\n\tconst sourceWidth = childMeta?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = childMeta?.height ?? props.containerHeight ?? targetHeight;\n\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\tconst containerHeight = props.containerHeight ?? ctx.surface.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\tframe,\n\t\t\tfps: childFps,\n\t\t\ttimestampSec,\n\t\t\tforceWait: true\n\t\t}\n\t});\n\tconst outPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t}, { opacity });\n\targs.pass = outPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-ByS_lnbu.mjs.map"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,OAAO,YAAY,aAAa,cAAc,YAAY;CACvE,MAAM,EAAE,cAAc,UAAU,MAAM;CACtC,MAAM,KAAK,cAAc;AACzB,KAAI,CAAC,MAAM,GAAG,OAAO,eAAgB;CACrC,MAAM,aAAa,aAAa,WAAW;AAC3C,KAAI,CAAC,WAAY;CACjB,MAAM,QAAQ,GAAG,SAAS;CAC1B,MAAM,YAAY,WAAW;CAC7B,MAAM,WAAW,WAAW,OAAO;CACnC,MAAM,eAAe,QAAQ;AAC7B,MAAK,KAAK,KAAK;CACf,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,QAAQ;CAC3D,MAAM,kBAAkB,MAAM,mBAAmB,IAAI,QAAQ;CAC7D,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB;GACA,KAAK;GACL;GACA,WAAW;GACX;EACD,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,CAAC;AACf,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-Wsjx_Rza.mjs";
3
+ import { t as renderers_default } from "./renderer-BBnurLTw.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
- import "./dist-CDwWQYg3.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-Bb4WmYYH.mjs";
3
+ import "./dist-Wsjx_Rza.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-BvYDrqOC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-rgb-split/dist/renderers-BrKktWQX.mjs
7
7
  const OP = "RGBSplit";
@@ -188,4 +188,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: RGBSplitWebGPURenderer
188
188
 
189
189
  //#endregion
190
190
  export { RGBSplitWebGPURenderer, renderers_default as default };
191
- //# sourceMappingURL=renderer-Dj-y-BtT.mjs.map
191
+ //# sourceMappingURL=renderer-DFGSy_ay.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Dj-y-BtT.mjs","names":[],"sources":["../../../nodes/node-rgb-split/dist/renderers-BrKktWQX.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 = \"RGBSplit\";\nconst UNIFORM_FLOATS = 8;\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>, 2> };\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 amount = u.v[1].x;\n\tlet angle = u.v[1].y;\n\tlet radial = u.v[1].z;\n\n\tlet R = res();\n\tlet a = radians(angle);\n\tvar d = vec2<f32>(cos(a), sin(a)) * amount / R;\n\tif (radial > 0.5) { d = (in.uv - 0.5) * 2.0 * amount / R; }\n\tlet cr = sampleP(in.uv + d);\n\tlet cg = sampleP(in.uv);\n\tlet cb = sampleP(in.uv - d);\n\treturn vec4<f32>(cr.r, cg.g, cb.b, max(max(cr.a, cg.a), cb.a));\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.amount, 8);\n\tdata[5] = num(raw.angle, 0);\n\tdata[6] = raw.radial === void 0 ? 0 : raw.radial ? 1 : 0;\n}\nconst RGBSplitWebGPURenderer = 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: RGBSplitWebGPURenderer });\n\n//#endregion\nexport { RGBSplitWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BrKktWQX.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DFGSy_ay.mjs","names":[],"sources":["../../../nodes/node-rgb-split/dist/renderers-BrKktWQX.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 = \"RGBSplit\";\nconst UNIFORM_FLOATS = 8;\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>, 2> };\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 amount = u.v[1].x;\n\tlet angle = u.v[1].y;\n\tlet radial = u.v[1].z;\n\n\tlet R = res();\n\tlet a = radians(angle);\n\tvar d = vec2<f32>(cos(a), sin(a)) * amount / R;\n\tif (radial > 0.5) { d = (in.uv - 0.5) * 2.0 * amount / R; }\n\tlet cr = sampleP(in.uv + d);\n\tlet cg = sampleP(in.uv);\n\tlet cb = sampleP(in.uv - d);\n\treturn vec4<f32>(cr.r, cg.g, cb.b, max(max(cr.a, cg.a), cb.a));\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.amount, 8);\n\tdata[5] = num(raw.angle, 0);\n\tdata[6] = raw.radial === void 0 ? 0 : raw.radial ? 1 : 0;\n}\nconst RGBSplitWebGPURenderer = 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: RGBSplitWebGPURenderer });\n\n//#endregion\nexport { RGBSplitWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BrKktWQX.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import { At as getFingerprint } from "./dist-D021IFfp.mjs";
2
+ import { jt as getFingerprint } from "./dist-CL5JOMSp.mjs";
3
3
  import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
4
- import { W as lutStore } from "./dist-CDwWQYg3.mjs";
4
+ import { W as lutStore } from "./dist-Wsjx_Rza.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-PMjV8x65.mjs.map
982
+ //# sourceMappingURL=renderer-DF_TswHB.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-PMjV8x65.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-DF_TswHB.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
- import { cn as resolveNumber, un as resolveString } from "./dist-D021IFfp.mjs";
1
+ import { dn as resolveString, ln as resolveNumber } from "./dist-CL5JOMSp.mjs";
2
2
  import { i as isHandleConnected, n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-CDwWQYg3.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-Wsjx_Rza.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs
6
6
  const PARAM_ORDER = [
@@ -262,4 +262,4 @@ var renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProces
262
262
 
263
263
  //#endregion
264
264
  export { renderers_default as t };
265
- //# sourceMappingURL=renderer-CsOLHKFx.mjs.map
265
+ //# sourceMappingURL=renderer-DGUL7JlO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CsOLHKFx.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst hasFrequencySig = isHandleConnected(op, \"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(op, \"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(op, \"qHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-Dt34aC_m.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,UAAU,kBAAkB,IAAI,YAAY,GAAG,IAAI;CACzD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-DGUL7JlO.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst hasFrequencySig = isHandleConnected(op, \"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(op, \"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(op, \"qHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-Dt34aC_m.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,UAAU,kBAAkB,IAAI,YAAY,GAAG,IAAI;CACzD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer, u as unwrapFrameParam } from "./renderer-BgmO1Dzw.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-Bb4WmYYH.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-BvYDrqOC.mjs";
3
3
 
4
4
  //#region ../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs
5
5
  const TILE_OFFSET_SHADER = `
@@ -206,4 +206,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TileOffsetWebGPURendere
206
206
 
207
207
  //#endregion
208
208
  export { renderers_default as t };
209
- //# sourceMappingURL=renderer-CYLP8sD6.mjs.map
209
+ //# sourceMappingURL=renderer-DJJXvO27.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CYLP8sD6.mjs","names":[],"sources":["../../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst TILE_OFFSET_SHADER = `\nstruct TileOffsetUniforms {\n offsetX : f32,\n offsetY : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n layerWidth : f32,\n layerHeight : f32,\n edgeMode : f32,\n pad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : TileOffsetUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : 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 var offX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n let sigX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offX = offX + sigX;\n }\n\n var offY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n let sigY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offY = offY + sigY;\n }\n\n let normOffset = vec2<f32>(\n offX / max(1.0, u.layerWidth),\n offY / max(1.0, u.layerHeight)\n );\n var uv = in.uv - normOffset;\n\n // Edge Modes:\n // 0.0 = wrap (seamless modulo)\n // 1.0 = clamp (edge smear)\n // 2.0 = transparent (clear bounds)\n // 3.0 = mirror (ping-pong reflection)\n if (u.edgeMode < 0.5) {\n uv = fract(uv);\n } else if (u.edgeMode < 1.5) {\n uv = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n } else if (u.edgeMode < 2.5) {\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n return vec4<f32>(0.0);\n }\n } else {\n uv = 1.0 - abs(fract(uv * 0.5) * 2.0 - 1.0);\n }\n\n let color = textureSampleLevel(tex, samp, uv, 0.0);\n return color;\n}\n`;\nconst uniformData = new Float32Array(8);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 2),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getTileOffsetResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `tile_offset_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `tile_offset_${format}.wgsl`,\n\t\t\tcode: TILE_OFFSET_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `TileOffsetPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst TileOffsetWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"TileOffset\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"tile_offset_node\";\n\tconst resolveBindable = (configKey, defaultValue) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Number(input.outputItem.data ?? defaultValue);\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = isNaN(numVal) ? defaultValue : numVal;\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Number(sd.offset ?? 0);\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst offsetXRes = resolveBindable(\"offsetX\", 0);\n\tconst offsetYRes = resolveBindable(\"offsetY\", 0);\n\tlet edgeModeIndex = 0;\n\tconst edgeMode = op.edgeMode ?? (op.wrap !== false ? \"wrap\" : \"transparent\");\n\tif (edgeMode === \"clamp\") edgeModeIndex = 1;\n\telse if (edgeMode === \"transparent\" || op.wrap === false) edgeModeIndex = 2;\n\telse if (edgeMode === \"mirror\") edgeModeIndex = 3;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getTileOffsetResources(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 offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\tuniformData[0] = offsetXRes.val;\n\tuniformData[1] = offsetYRes.val;\n\tuniformData[2] = offsetXRes.hasStaticSig ? 1 : 0;\n\tuniformData[3] = offsetYRes.hasStaticSig ? 1 : 0;\n\tuniformData[4] = width;\n\tuniformData[5] = height;\n\tuniformData[6] = edgeModeIndex;\n\tuniformData[7] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.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: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\nconst WebGPURenderer = TileOffsetWebGPURenderer;\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DQJJPfSd.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DJJXvO27.mjs","names":[],"sources":["../../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst TILE_OFFSET_SHADER = `\nstruct TileOffsetUniforms {\n offsetX : f32,\n offsetY : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n layerWidth : f32,\n layerHeight : f32,\n edgeMode : f32,\n pad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : TileOffsetUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : 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 var offX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n let sigX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offX = offX + sigX;\n }\n\n var offY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n let sigY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offY = offY + sigY;\n }\n\n let normOffset = vec2<f32>(\n offX / max(1.0, u.layerWidth),\n offY / max(1.0, u.layerHeight)\n );\n var uv = in.uv - normOffset;\n\n // Edge Modes:\n // 0.0 = wrap (seamless modulo)\n // 1.0 = clamp (edge smear)\n // 2.0 = transparent (clear bounds)\n // 3.0 = mirror (ping-pong reflection)\n if (u.edgeMode < 0.5) {\n uv = fract(uv);\n } else if (u.edgeMode < 1.5) {\n uv = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n } else if (u.edgeMode < 2.5) {\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n return vec4<f32>(0.0);\n }\n } else {\n uv = 1.0 - abs(fract(uv * 0.5) * 2.0 - 1.0);\n }\n\n let color = textureSampleLevel(tex, samp, uv, 0.0);\n return color;\n}\n`;\nconst uniformData = new Float32Array(8);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 2),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getTileOffsetResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `tile_offset_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `tile_offset_${format}.wgsl`,\n\t\t\tcode: TILE_OFFSET_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `TileOffsetPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst TileOffsetWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"TileOffset\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"tile_offset_node\";\n\tconst resolveBindable = (configKey, defaultValue) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Number(input.outputItem.data ?? defaultValue);\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = isNaN(numVal) ? defaultValue : numVal;\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Number(sd.offset ?? 0);\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst offsetXRes = resolveBindable(\"offsetX\", 0);\n\tconst offsetYRes = resolveBindable(\"offsetY\", 0);\n\tlet edgeModeIndex = 0;\n\tconst edgeMode = op.edgeMode ?? (op.wrap !== false ? \"wrap\" : \"transparent\");\n\tif (edgeMode === \"clamp\") edgeModeIndex = 1;\n\telse if (edgeMode === \"transparent\" || op.wrap === false) edgeModeIndex = 2;\n\telse if (edgeMode === \"mirror\") edgeModeIndex = 3;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getTileOffsetResources(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 offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\tuniformData[0] = offsetXRes.val;\n\tuniformData[1] = offsetYRes.val;\n\tuniformData[2] = offsetXRes.hasStaticSig ? 1 : 0;\n\tuniformData[3] = offsetYRes.hasStaticSig ? 1 : 0;\n\tuniformData[4] = width;\n\tuniformData[5] = height;\n\tuniformData[6] = edgeModeIndex;\n\tuniformData[7] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.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: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\nconst WebGPURenderer = TileOffsetWebGPURenderer;\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DQJJPfSd.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
- import "./dist-CDwWQYg3.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-Bb4WmYYH.mjs";
3
+ import "./dist-Wsjx_Rza.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-BvYDrqOC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs
7
7
  const HISTORY_FORMAT = "rgba16float";
@@ -212,4 +212,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer })
212
212
 
213
213
  //#endregion
214
214
  export { TrailsWebGPURenderer, renderers_default as default };
215
- //# sourceMappingURL=renderer-KppAWfmJ.mjs.map
215
+ //# sourceMappingURL=renderer-DJy8V_nb.mjs.map